diff --git a/History.md b/History.md index 4250424e..a4718970 100644 --- a/History.md +++ b/History.md @@ -36,9 +36,11 @@ switch - new invoicecorrection class - order-x read support - automated tests zuv/verapdf validate created library test files - +- trans.getTradeSettlementPayment() removed in favor of trans.getTradeSettlement() ### 2.0 still todo +- dont show empty tax number field +- be able to specify iban via tradeparty object - verapdf as prevalidation? - visualization? zugferdvisualizer? - new sample invoice @@ -50,7 +52,6 @@ switch - *from A3 does not seem tow ork see mustangreaderwriteredgetest:testedgeexport - xmp errors may not show correctly in log - switch for no log and no notices -- homepage to be updated accordingly - confirm correct generation from pdf/a3 files zf2edgetest - *correctiontest exports zf1+zf2? - *USt 0% wird aus invoice-klasse noch nicht sauber abgefangen diff --git a/library/src/main/java/org/mustangproject/BankDetails.java b/library/src/main/java/org/mustangproject/BankDetails.java new file mode 100644 index 00000000..24e4274c --- /dev/null +++ b/library/src/main/java/org/mustangproject/BankDetails.java @@ -0,0 +1,44 @@ +package org.mustangproject; + +import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementPayment; + +public class BankDetails implements IZUGFeRDTradeSettlementPayment { + protected String IBAN, BIC; + + public BankDetails(String IBAN, String BIC) { + this.IBAN = IBAN; + this.BIC = BIC; + } + + public String getIBAN() { + return IBAN; + } + + public BankDetails setIBAN(String IBAN) { + this.IBAN = IBAN; + return this; + } + + public String getBIC() { + return BIC; + } + + public BankDetails setBIC(String BIC) { + this.BIC = BIC; + return this; + } + + @Override + public String getOwnBIC() { + return getBIC(); + } + + @Override + public String getOwnIBAN() { + return getIBAN(); + } + + + + +} diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index 988ebf4c..b9c9ef81 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -41,7 +41,6 @@ public class Invoice implements IExportableTransaction { protected ArrayList Allowances = new ArrayList(), Charges = new ArrayList(), LogisticsServiceCharges = new ArrayList(); - protected IZUGFeRDTradeSettlement[] getTradeSettlement = null; protected IZUGFeRDPaymentTerms paymentTerms = null; @@ -139,6 +138,8 @@ public class Invoice implements IExportableTransaction { return shipToStreet; } + + public Invoice setShipToStreet(String shipToStreet) { this.shipToStreet = shipToStreet; return this; @@ -346,6 +347,10 @@ public class Invoice implements IExportableTransaction { public Invoice setSender(TradeParty sender) { this.sender = sender; + if ((sender.getBankDetails()!=null)&&(sender.getBankDetails().size()>0)) { + // convert bankdetails + + } return this; } @@ -376,14 +381,17 @@ public class Invoice implements IExportableTransaction { } - public IZUGFeRDTradeSettlement[] getGetTradeSettlement() { - return getTradeSettlement; + @Override + public IZUGFeRDTradeSettlement[] getTradeSettlement() { + + if (getSender()==null) { + return null; + } + + return ((TradeParty)getSender()).getAsTradeSettlement(); + } - public Invoice setGetTradeSettlement(IZUGFeRDTradeSettlement[] getTradeSettlement) { - this.getTradeSettlement = getTradeSettlement; - return this; - } @Override public IZUGFeRDPaymentTerms getPaymentTerms() { diff --git a/library/src/main/java/org/mustangproject/TradeParty.java b/library/src/main/java/org/mustangproject/TradeParty.java index e1069e4d..dc536e60 100644 --- a/library/src/main/java/org/mustangproject/TradeParty.java +++ b/library/src/main/java/org/mustangproject/TradeParty.java @@ -2,11 +2,15 @@ package org.mustangproject; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableTradeParty; +import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlement; + +import java.util.ArrayList; public class TradeParty implements IZUGFeRDExportableTradeParty { protected String name, zip, street, location, country; protected String taxID = null, vatID = null; + protected ArrayList bankDetails = new ArrayList(); protected Contact contact = null; public TradeParty(String name, String street, String zip, String location, String country) { @@ -22,7 +26,13 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { this.contact = c; return this; } - + public TradeParty addBankDetails(BankDetails s) { + bankDetails.add(s); + return this; + } + public ArrayList getBankDetails() { + return bankDetails; + } public TradeParty addTaxID(String taxID) { this.taxID = taxID; return this; @@ -105,4 +115,11 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { public IZUGFeRDExportableContact getContact() { return contact; } + + public IZUGFeRDTradeSettlement[] getAsTradeSettlement() { + if (bankDetails.size()==0) { + return null; + } + return bankDetails.toArray(new IZUGFeRDTradeSettlement[0]); + } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 8837a22f..280fa4ea 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -116,6 +116,30 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { return res; } + private BigDecimal getCharges() { + BigDecimal res = new BigDecimal(0); + IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges(); + if ((charges!=null) && (charges.length>0)) { + for (IZUGFeRDAllowanceCharge currentCharge:charges) { + + res=res.add(currentCharge.getTotalAmount(trans)); + } + } + + return res; + } + private BigDecimal getAllowances() { + BigDecimal res = new BigDecimal(0); + IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances(); + if ((allowances!=null) && (allowances.length>0)) { + for (IZUGFeRDAllowanceCharge currentAllowance:allowances) { + res=res.add(currentAllowance.getTotalAmount(trans)); + } + } + + + return res; + } private BigDecimal getTotal() { BigDecimal res = new BigDecimal(0); for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { @@ -125,6 +149,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { return res; } + private BigDecimal getTaxBasis() { + BigDecimal res = getTotal().add(getCharges()).subtract(getAllowances()); + return res; + } + /** * which taxes have been used with which amounts in this transaction, empty for * no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable to 19% VAT @@ -147,6 +176,31 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { hm.put(percent, current.add(itemVATAmount)); } } + + + IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges(); + if ((charges!=null) && (charges.length>0)) { + for (IZUGFeRDAllowanceCharge currentCharge:charges) { + VATAmount theAmount=hm.get(currentCharge.getTaxPercent()); + if (theAmount==null) { + theAmount=new VATAmount(new BigDecimal(0),new BigDecimal(0),"S"); + } + theAmount.setCalculated(theAmount.getCalculated().add(currentCharge.getTotalAmount(trans))); + } + } + IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances(); + if ((allowances!=null) && (allowances.length>0)) { + for (IZUGFeRDAllowanceCharge currentAllowance:allowances) { + VATAmount theAmount=hm.get(currentAllowance.getTaxPercent()); + if (theAmount==null) { + theAmount=new VATAmount(new BigDecimal(0),new BigDecimal(0),"S"); + } + theAmount.setCalculated(theAmount.getCalculated().subtract(currentAllowance.getTotalAmount(trans))); + } + } + + + return hm; } @@ -461,7 +515,41 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } } - if (trans.getPaymentTerms() == null) { + if ((trans.getZFCharges()!=null)&&(trans.getZFCharges().length>0)) { + xml = xml + " \n" + + " \n" + + " true\n" + + " \n" + + " "+currencyFormat(getCharges())+"\n" + + " Charge\n" + + " \n" + + " VAT\n" + + " S\n" + + " 19.00\n" + + " \n" + + " \n"; + + + } + + if ((trans.getZFAllowances()!=null)&&(trans.getZFAllowances().length>0)) { + xml = xml + " \n" + + " \n" + + " false\n" + + " \n" + + " "+currencyFormat(getAllowances())+"\n" + + " Allowance\n" + + " \n" + + " VAT\n" + + " S\n" + + " 19.00\n" + + " \n" + + " \n"; + + } + + + if (trans.getPaymentTerms() == null) { xml = xml + " \n" + " " + paymentTermsDescription + "\n"; @@ -485,31 +573,16 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } - String chargeTotalLine=""; - IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances(); - BigDecimal allowanceTotal=new BigDecimal(0); - if ((allowances!=null) && (allowances.length>0)) { - for (IZUGFeRDAllowanceCharge currentAllowance:allowances) { - allowanceTotal=allowanceTotal.add(currentAllowance.getTotalAmount(trans)); - } - } - String allowanceTotalLine=""+currencyFormat(allowanceTotal)+""; + String allowanceTotalLine=""+currencyFormat(getAllowances())+""; - IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges(); - BigDecimal chargesTotal=new BigDecimal(0); - if ((charges!=null) && (charges.length>0)) { - for (IZUGFeRDAllowanceCharge currentCharge:charges) { - chargesTotal=chargesTotal.add(currentCharge.getTotalAmount(trans)); - } - } - String chargesTotalLine=""+currencyFormat(chargesTotal)+""; + String chargesTotalLine=""+currencyFormat(getCharges())+""; xml = xml + " \n" + " " + currencyFormat(getTotal()) + "\n" //$NON-NLS-2$ + chargesTotalLine + allowanceTotalLine - + " " + currencyFormat(getTotal()) + "\n" //$NON-NLS-2$ + + " " + currencyFormat(getTaxBasis()) + "\n" //$NON-NLS-2$ // // // currencyID=\"EUR\" + " " diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java b/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java index d2ba8e6c..f9f56ffc 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/IExportableTransactionImpl.java @@ -90,11 +90,6 @@ public class IExportableTransactionImpl implements IExportableTransaction { return recipient; } - @Override - public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() { - return settlementPayments; - } - @Override public String getOwnTaxID() { return ownTaxID; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java index 437d0883..30d92d78 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderTestCase.java @@ -30,7 +30,7 @@ public abstract class MustangReaderTestCase extends TestCase implements IExporta @Override - public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() { + public IZUGFeRDTradeSettlement[] getTradeSettlement() { Payment[] payments = new Payment[1]; payments[0] = new Payment(); return payments; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java index ee622a06..6b6dd7ed 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java @@ -181,8 +181,8 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { // Reading ZUGFeRD assertEquals(zi.getAmount(), "571.04"); - assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); - assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); + assertEquals(zi.getBIC(), "COBADEFFXXX"); + assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00"); assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getDueDate(), "20170530"); assertEquals(zi.getForeignReference(), getNumber()); @@ -223,8 +223,8 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase { // Reading ZUGFeRD assertEquals("571.04", zi.getAmount()); - assertEquals(getTradeSettlementPayment()[0].getOwnBIC(), zi.getBIC()); - assertEquals(getTradeSettlementPayment()[0].getOwnIBAN(), zi.getIBAN()); + assertEquals("COBADEFFXXX", zi.getBIC()); + assertEquals("DE88 2008 0000 0970 3757 00", zi.getIBAN()); assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getForeignReference(), getNumber()); try { diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 8268d296..52cf151a 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -196,8 +196,8 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // Reading ZUGFeRD assertEquals(zi.getAmount(), "571.04"); - assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); - assertEquals(zi.getIBAN(),getTradeSettlementPayment()[0].getOwnIBAN()); + assertEquals(zi.getBIC(), "COBADEFFXXX"); + assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00"); assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getForeignReference(), "RE-20170509/505"); assertEquals(zi.getBankName(), "Commerzbank"); @@ -383,9 +383,9 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // Reading ZUGFeRD assertEquals(zi.getAmount(), "571.04"); - assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); + assertEquals(zi.getBIC(), "COBADEFFXXX"); assertEquals(zi.getReference(), getReferenceNumber()); - assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); + assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00"); assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getForeignReference(), getNumber()); } @@ -460,8 +460,8 @@ public class MustangReaderWriterTest extends MustangReaderTestCase { // Reading ZUGFeRD assertEquals("571.04", zi.getAmount()); - assertEquals(getTradeSettlementPayment()[0].getOwnBIC(), zi.getBIC()); - assertEquals(getTradeSettlementPayment()[0].getOwnIBAN(), zi.getIBAN()); + assertEquals("COBADEFFXXX", zi.getBIC()); + assertEquals("DE88 2008 0000 0970 3757 00", zi.getIBAN()); assertEquals(getOwnOrganisationName(), zi.getHolder()); assertEquals(getNumber(), zi.getForeignReference()); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java index 1a37ae02..9de700a3 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2EdgeTest.java @@ -100,11 +100,6 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra } - @Override - public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() { - return null; - } - @Override public IZUGFeRDTradeSettlement[] getTradeSettlement() { IZUGFeRDTradeSettlement[] payments = new DebitPayment[1]; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java index 4cca0639..71ba4626 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java @@ -54,9 +54,10 @@ public class ZF2PushTest extends TestCase { .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors() .load(SOURCE_PDF)) { - ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setContractReferencedDocument("0815").setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE")).setOwnTaxID("4711").setOwnVATID("DE19990815").setRecipient(new TradeParty("Franz Müller","teststr.12", "55232", "Entenhausen", "DE").setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)))); + ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setContractReferencedDocument("0815").setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE").addBankDetails(new BankDetails("777666555","DE4321"))).setOwnTaxID("4711").setOwnVATID("DE19990815").setRecipient(new TradeParty("Franz Müller","teststr.12", "55232", "Entenhausen", "DE").setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)))); String theXML = new String(ze.getProvider().getXML()); - assertTrue(theXML.contains("