support included notes

This commit is contained in:
jstaerk
2020-11-04 20:51:22 +01:00
parent 9efb2204d5
commit 1243863368
7 changed files with 144 additions and 5 deletions

View File

@@ -38,6 +38,8 @@ switch
- new tradeparty class, Contact getOwnContact superseded by TradeParty getSender - new tradeparty class, Contact getOwnContact superseded by TradeParty getSender
- new invoicecorrection class - new invoicecorrection class
- order-x xml read support - order-x xml read support
- support included notes on document and item level
- occurence periods setOccurrencePeriod(Date start, Date end)
- automated tests zuv/verapdf validate created library test files - automated tests zuv/verapdf validate created library test files
- trans.getTradeSettlementPayment() removed in favor of trans.getTradeSettlement() - trans.getTradeSettlementPayment() removed in favor of trans.getTradeSettlement()
- commandline option for no notices - commandline option for no notices

View File

@@ -27,6 +27,10 @@ import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
/***
* An invoice, with fluent setters
* @see IExportableTransaction if you want to implement an interface instead
*/
public class Invoice implements IExportableTransaction { public class Invoice implements IExportableTransaction {
protected String documentName = null, documentCode = null, number = null, ownOrganisationFullPlaintextInfo = null, referenceNumber = null, shipToOrganisationID = null, shipToOrganisationName = null, shipToStreet = null, shipToZIP = null, shipToLocation = null, shipToCountry = null, buyerOrderReferencedDocumentID = null, buyerOrderReferencedDocumentIssueDateTime = null, ownForeignOrganisationID = null, ownOrganisationName = null, currency = null, paymentTermDescription = null; protected String documentName = null, documentCode = null, number = null, ownOrganisationFullPlaintextInfo = null, referenceNumber = null, shipToOrganisationID = null, shipToOrganisationName = null, shipToStreet = null, shipToZIP = null, shipToLocation = null, shipToCountry = null, buyerOrderReferencedDocumentID = null, buyerOrderReferencedDocumentIssueDateTime = null, ownForeignOrganisationID = null, ownOrganisationName = null, currency = null, paymentTermDescription = null;
@@ -34,6 +38,7 @@ public class Invoice implements IExportableTransaction {
protected BigDecimal totalPrepaidAmount = null; protected BigDecimal totalPrepaidAmount = null;
protected TradeParty sender=null, recipient = null, deliveryAddress = null; protected TradeParty sender=null, recipient = null, deliveryAddress = null;
protected ArrayList<IZUGFeRDExportableItem> ZFItems = null; protected ArrayList<IZUGFeRDExportableItem> ZFItems = null;
protected ArrayList<String> notes = null;
protected String contractReferencedDocument = null; protected String contractReferencedDocument = null;
protected Date occurrenceDateFrom = null; protected Date occurrenceDateFrom = null;
@@ -266,6 +271,14 @@ public class Invoice implements IExportableTransaction {
} }
@Override
public String[] getNotes() {
if (notes==null) {
return null;
}
return notes.toArray(new String[0]);
}
@Override @Override
public String getCurrency() { public String getCurrency() {
return currency; return currency;
@@ -492,4 +505,13 @@ public class Invoice implements IExportableTransaction {
} }
} }
public Invoice addNote(String text) {
if (notes==null) {
notes=new ArrayList<String>();
}
notes.add(text);
return this;
}
} }

View File

@@ -10,6 +10,7 @@ public class Item implements IZUGFeRDExportableItem {
protected BigDecimal price, quantity, tax, grossPrice, lineTotalAmount; protected BigDecimal price, quantity, tax, grossPrice, lineTotalAmount;
protected String id; protected String id;
protected Product product; protected Product product;
protected ArrayList<String> notes = null;
protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<IZUGFeRDAllowanceCharge>(), protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<IZUGFeRDAllowanceCharge>(),
Charges = new ArrayList<IZUGFeRDAllowanceCharge>(); Charges = new ArrayList<IZUGFeRDAllowanceCharge>();
@@ -98,6 +99,16 @@ public class Item implements IZUGFeRDExportableItem {
return Charges.toArray(new IZUGFeRDAllowanceCharge[0]); return Charges.toArray(new IZUGFeRDAllowanceCharge[0]);
} }
@Override
public String[] getNotes() {
if (notes==null) {
return null;
}
return notes.toArray(new String[0]);
}
public Item setProduct(Product product) { public Item setProduct(Product product) {
this.product = product; this.product = product;
return this; return this;
@@ -108,8 +119,19 @@ public class Item implements IZUGFeRDExportableItem {
Charges.add(izac); Charges.add(izac);
return this; return this;
} }
public Item addAllowance(IZUGFeRDAllowanceCharge izac) { public Item addAllowance(IZUGFeRDAllowanceCharge izac) {
Allowances.add(izac); Allowances.add(izac);
return this; return this;
} }
public Item addNote(String text) {
if (notes==null) {
notes=new ArrayList<String>();
}
notes.add(text);
return this;
}
} }

View File

@@ -33,6 +33,11 @@ import java.util.Date;
import org.mustangproject.FileAttachment; import org.mustangproject.FileAttachment;
import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants; import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants;
/***
* the interface of an transaction, e.g. an invoice, you want to create xml (potentially to be added to a PDF)
* for
* @see Invoice if you want to use an object rather than an interface
*/
public interface IExportableTransaction { public interface IExportableTransaction {
/** /**
@@ -426,13 +431,26 @@ public interface IExportableTransaction {
return null; return null;
} }
/***
* specify delivery date
* @return the delivery date
*/
default Date getOccurrenceDate() { default Date getOccurrenceDate() {
return null; return null;
} }
/***
* specify delivery period
* @return the beginning of the delivery period
*/
default Date getOccurrencePeriodFrom() { default Date getOccurrencePeriodFrom() {
return null; return null;
} }
/***
* specify delivery period
* @return the end of the delivery period
*/
default Date getOccurrencePeriodTo() { default Date getOccurrencePeriodTo() {
return null; return null;
} }
@@ -446,4 +464,13 @@ public interface IExportableTransaction {
default FileAttachment[] getAdditionalReferencedDocuments() { default FileAttachment[] getAdditionalReferencedDocuments() {
return null; return null;
} }
/***
* additional text description
* @return an array of strings of document wide "includedNotes" (descriptive text values)
*/
default String[] getNotes() {
return null;
}
} }

View File

@@ -34,8 +34,16 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{
IZUGFeRDExportableProduct getProduct(); IZUGFeRDExportableProduct getProduct();
/**
* item level discounts
* @return array of the discounts on a single item
*/
IZUGFeRDAllowanceCharge[] getItemAllowances(); IZUGFeRDAllowanceCharge[] getItemAllowances();
/**
* item level price additions
* @return array of the additional charges on the item
*/
IZUGFeRDAllowanceCharge[] getItemCharges(); IZUGFeRDAllowanceCharge[] getItemCharges();
@@ -70,8 +78,20 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{
return TaxCategoryCodeTypeConstants.STANDARDRATE; return TaxCategoryCodeTypeConstants.STANDARDRATE;
} }
/***
* the ID of an additionally referenced document for this item
* @return the id as string
*/
default String getAdditionalReferencedDocumentID() { default String getAdditionalReferencedDocumentID() {
return null; return null;
} }
/***
* descriptive texts
* @return an array of strings of item specific "includedNotes", text values
*/
default String[] getNotes() {
return null;
}
} }

View File

@@ -236,6 +236,13 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
if (trans.getDocumentCode() != null) { if (trans.getDocumentCode() != null) {
typecode = trans.getDocumentCode(); typecode = trans.getDocumentCode();
} }
String notes="";
if (trans.getNotes()!=null) {
for (String currentNote:trans.getNotes()) {
notes=notes+"<ram:IncludedNote><ram:Content>" + XMLTools.encodeXML(currentNote) + "</ram:Content></ram:IncludedNote>";
}
}
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<rsm:CrossIndustryInvoice xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\"" + "<rsm:CrossIndustryInvoice xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\""
@@ -259,9 +266,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " <ram:TypeCode>" + typecode + "</ram:TypeCode>\n" + " <ram:TypeCode>" + typecode + "</ram:TypeCode>\n"
+ " <ram:IssueDateTime><udt:DateTimeString format=\"102\">" + " <ram:IssueDateTime><udt:DateTimeString format=\"102\">"
+ zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" // date + zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" // date
// format + notes
// was
// 20130605
+ subjectNote + subjectNote
+ rebateAgreement + rebateAgreement
+ senderReg + senderReg
@@ -275,13 +280,21 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
if (currentItem.getProduct().getTaxExemptionReason() != null) { if (currentItem.getProduct().getTaxExemptionReason() != null) {
exemptionReason = "<ram:ExemptionReason>" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + "</ram:ExemptionReason>"; exemptionReason = "<ram:ExemptionReason>" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + "</ram:ExemptionReason>";
} }
notes="";
if (currentItem.getNotes()!=null) {
for (String currentNote:currentItem.getNotes()) {
notes=notes+"<ram:IncludedNote><ram:Content>" + XMLTools.encodeXML(currentNote) + "</ram:Content></ram:IncludedNote>";
}
}
LineCalculator lc = new LineCalculator(currentItem); LineCalculator lc = new LineCalculator(currentItem);
xml = xml + " <ram:IncludedSupplyChainTradeLineItem>\n" + xml = xml + " <ram:IncludedSupplyChainTradeLineItem>\n" +
" <ram:AssociatedDocumentLineDocument>\n" " <ram:AssociatedDocumentLineDocument>\n"
+ " <ram:LineID>" + lineID + "</ram:LineID>\n" //$NON-NLS-2$ + " <ram:LineID>" + lineID + "</ram:LineID>\n" //$NON-NLS-2$
+ notes
+ " </ram:AssociatedDocumentLineDocument>\n" + " </ram:AssociatedDocumentLineDocument>\n"
+ " <ram:SpecifiedTradeProduct>\n";
+ " <ram:SpecifiedTradeProduct>\n";
// + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n" // + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n"
if (currentItem.getProduct().getSellerAssignedID() != null) { if (currentItem.getProduct().getSellerAssignedID() != null) {
xml = xml + " <ram:SellerAssignedID>" xml = xml + " <ram:SellerAssignedID>"

View File

@@ -44,6 +44,7 @@ public class ZF2PushTest extends TestCase {
final String TARGET_CHARGESALLOWANCESPDF = "./target/testout-ZF2PushChargesAllowances.pdf"; final String TARGET_CHARGESALLOWANCESPDF = "./target/testout-ZF2PushChargesAllowances.pdf";
final String TARGET_RELATIVECHARGESALLOWANCESPDF = "./target/testout-ZF2PushRelativeChargesAllowances.pdf"; final String TARGET_RELATIVECHARGESALLOWANCESPDF = "./target/testout-ZF2PushRelativeChargesAllowances.pdf";
final String TARGET_ATTACHMENTSPDF = "./target/testout-ZF2PushAttachments.pdf"; final String TARGET_ATTACHMENTSPDF = "./target/testout-ZF2PushAttachments.pdf";
final String TARGET_PUSHEDGE = "./target/testout-ZF2PushEdge.pdf";
public void testPushExport() { public void testPushExport() {
@@ -241,6 +242,38 @@ public class ZF2PushTest extends TestCase {
} }
public void testPushEdge() {
String orgname = "Test company";
String number = "123";
String priceStr = "1.00";
String taxID = "9990815";
BigDecimal price = new BigDecimal(priceStr);
try (InputStream SOURCE_PDF = this.getClass()
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application")
.setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors()
.load(SOURCE_PDF)) {
ze.setTransaction(new Invoice().addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID)).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), price, new BigDecimal(1.0)).addNote("item level 1/1"))
);
String theXML = new String(ze.getProvider().getXML());
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_PUSHEDGE);
} catch (IOException e) {
fail("IOException should not be raised in testEdgeExport");
}
// now check the contents (like MustangReaderTest)
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PUSHEDGE);
assertTrue(zi.getUTF8().contains("item level 1/1"));
assertTrue(zi.getUTF8().contains("document level 2/2"));
}
public void testAllowancesExport() { public void testAllowancesExport() {
String orgname = "Test company"; String orgname = "Test company";