diff --git a/pom.xml b/pom.xml index e3773f75..650c1728 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ github -Xdoclint:none - 1.7 + 1.8 1.8 1.8 @@ -134,8 +134,8 @@ - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java index 36f0d428..667a4c78 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDAllowanceCharge.java @@ -15,16 +15,23 @@ */ package org.mustangproject.ZUGFeRD; +import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants; + import java.math.BigDecimal; /** * @author AlexanderSchmidt */ public interface IZUGFeRDAllowanceCharge { + BigDecimal getTotalAmount(); String getReason(); BigDecimal getTaxPercent(); + default String getCategoryCode() { + return TaxCategoryCodeTypeConstants.STANDARDRATE; + } + } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index d1b30732..85b0577d 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -26,6 +26,8 @@ package org.mustangproject.ZUGFeRD; * @author jstaerk * */ +import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants; + import java.math.BigDecimal; public interface IZUGFeRDExportableItem { @@ -51,5 +53,8 @@ public interface IZUGFeRDExportableItem { */ BigDecimal getQuantity(); + default String getCategoryCode() { + return TaxCategoryCodeTypeConstants.STANDARDRATE; + } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 19bf8d98..21b55190 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -27,10 +27,21 @@ package org.mustangproject.ZUGFeRD; * */ +import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants; + import java.util.Date; public interface IZUGFeRDExportableTransaction { + /** + * + * + * @return Code of Document + */ + default String getDocumentCode() { + return DocumentCodeTypeConstants.INVOICE; + } + /** * Number, typically invoice number of the invoice * diff --git a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java index 32d180ca..408ea69f 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java @@ -31,14 +31,17 @@ import java.math.BigDecimal; */ public class VATAmount { - public VATAmount(BigDecimal basis, BigDecimal calculated) { + public VATAmount(BigDecimal basis, BigDecimal calculated, String documentCode) { super(); this.basis = basis; this.calculated = calculated; + this.documentCode = documentCode; } BigDecimal basis, calculated; + String documentCode; + public BigDecimal getBasis() { return basis; } @@ -55,12 +58,20 @@ public class VATAmount { this.calculated = calculated; } + public String getDocumentCode() { + return documentCode; + } + + public void setDocumentCode(String documentCode) { + this.documentCode = documentCode; + } + public VATAmount add(VATAmount v) { - return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated())); + return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.documentCode); } public VATAmount subtract(VATAmount v) { - return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated())); + return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.documentCode); } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 2fb91343..52a77fe5 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -134,8 +134,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); res = res.add(amount.getCalculated()); } - - return res; } @@ -162,16 +160,14 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { BigDecimal percent = currentItem.getProduct().getVATPercent(); LineCalc lc = new LineCalc(currentItem); - VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount()); + VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), trans.getDocumentCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); } else { hm.put(percent, current.add(itemVATAmount)); - } } - return hm; } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 9ea0b067..6b2a1acb 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -209,6 +209,13 @@ public class ZUGFeRDImporter { return result; } + /** + * @return the document code + */ + public String getDocumentCode() { + return extractString("//HeaderExchangedDocument/TypeCode"); + } + /** * @return the sender's bank's BLZ code */ diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java index 8fbc9b10..d7434eee 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java @@ -147,7 +147,7 @@ class ZUGFeRDTransactionModelConverter { document.setIssueDateTime(issueDateTime); DocumentCodeType documentCodeType = xmlFactory.createDocumentCodeType(); - documentCodeType.setValue(DocumentCodeTypeConstants.INVOICE); + documentCodeType.setValue(trans.getDocumentCode()); document.setTypeCode(documentCodeType); TextType name = xmlFactory.createTextType(); @@ -166,7 +166,7 @@ class ZUGFeRDTransactionModelConverter { document.getIncludedNote().add(regularInfo); } - if (trans.getReferenceNumber() != null && !new String().equals(trans.getReferenceNumber())) { + if (trans.getReferenceNumber() != null && !"".equals(trans.getReferenceNumber())) { NoteType referenceInfo = xmlFactory.createNoteType(); TextType referenceInfoContent = xmlFactory.createTextType(); referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber()); @@ -410,8 +410,7 @@ class ZUGFeRDTransactionModelConverter { private Collection getTradeTax() { List tradeTaxTypes = new ArrayList<>(); - HashMap VATPercentAmountMap = this - .getVATPercentAmountMap(); + HashMap VATPercentAmountMap = this.getVATPercentAmountMap(); for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); @@ -419,9 +418,9 @@ class ZUGFeRDTransactionModelConverter { taxTypeCode.setValue(TaxTypeCodeTypeConstants.SALESTAX); tradeTax.setTypeCode(taxTypeCode); - TaxCategoryCodeType taxCategoryCode = xmlFactory - .createTaxCategoryCodeType(); - taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); + TaxCategoryCodeType taxCategoryCode = xmlFactory.createTaxCategoryCodeType(); + VATAmount vatAmount = VATPercentAmountMap.get(currentTaxPercent); + taxCategoryCode.setValue(vatAmount.getDocumentCode()); tradeTax.setCategoryCode(taxCategoryCode); VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); @@ -432,8 +431,7 @@ class ZUGFeRDTransactionModelConverter { AmountType calculatedTaxAmount = xmlFactory.createAmountType(); calculatedTaxAmount.setCurrencyID(currency); - calculatedTaxAmount - .setValue(currencyFormat(amount.getCalculated())); + calculatedTaxAmount.setValue(currencyFormat(amount.getCalculated())); tradeTax.getCalculatedAmount().add(calculatedTaxAmount); AmountType basisTaxAmount = xmlFactory.createAmountType(); @@ -453,9 +451,7 @@ class ZUGFeRDTransactionModelConverter { for (IZUGFeRDAllowanceCharge iAllowance : trans.getZFAllowances()) { - TradeAllowanceChargeType allowance = xmlFactory - .createTradeAllowanceChargeType(); - + TradeAllowanceChargeType allowance = xmlFactory.createTradeAllowanceChargeType(); IndicatorType chargeIndicator = xmlFactory.createIndicatorType(); chargeIndicator.setIndicator(false); allowance.setChargeIndicator(chargeIndicator); @@ -470,7 +466,6 @@ class ZUGFeRDTransactionModelConverter { allowance.setReason(reason); TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); - PercentType vatPercent = xmlFactory.createPercentType(); vatPercent.setValue(currencyFormat(iAllowance.getTaxPercent())); tradeTax.setApplicablePercent(vatPercent); @@ -482,9 +477,8 @@ class ZUGFeRDTransactionModelConverter { * basisAmount.setValue(amount.getBasis()); * allowance.setBasisAmount(basisAmount); */ - TaxCategoryCodeType taxType = xmlFactory - .createTaxCategoryCodeType(); - taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); + TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType(); + taxType.setValue(iAllowance.getCategoryCode()); tradeTax.setCategoryCode(taxType); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); @@ -493,7 +487,6 @@ class ZUGFeRDTransactionModelConverter { allowance.getCategoryTradeTax().add(tradeTax); headerAllowances.add(allowance); - } return headerAllowances; @@ -505,9 +498,7 @@ class ZUGFeRDTransactionModelConverter { for (IZUGFeRDAllowanceCharge iCharge : trans.getZFCharges()) { - TradeAllowanceChargeType charge = xmlFactory - .createTradeAllowanceChargeType(); - + TradeAllowanceChargeType charge = xmlFactory.createTradeAllowanceChargeType(); IndicatorType chargeIndicator = xmlFactory.createIndicatorType(); chargeIndicator.setIndicator(true); charge.setChargeIndicator(chargeIndicator); @@ -522,7 +513,6 @@ class ZUGFeRDTransactionModelConverter { charge.setReason(reason); TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); - PercentType vatPercent = xmlFactory.createPercentType(); vatPercent.setValue(currencyFormat(iCharge.getTaxPercent())); tradeTax.setApplicablePercent(vatPercent); @@ -534,9 +524,8 @@ class ZUGFeRDTransactionModelConverter { * basisAmount.setValue(amount.getBasis()); * allowance.setBasisAmount(basisAmount); */ - TaxCategoryCodeType taxType = xmlFactory - .createTaxCategoryCodeType(); - taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); + TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType(); + taxType.setValue(iCharge.getCategoryCode()); tradeTax.setCategoryCode(taxType); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); @@ -555,16 +544,13 @@ class ZUGFeRDTransactionModelConverter { private Collection getHeaderLogisticsServiceCharges() { List headerServiceCharge = new ArrayList<>(); - for (IZUGFeRDAllowanceCharge iServiceCharge : trans - .getZFLogisticsServiceCharges()) { + for (IZUGFeRDAllowanceCharge iServiceCharge : trans.getZFLogisticsServiceCharges()) { - LogisticsServiceChargeType serviceCharge = xmlFactory - .createLogisticsServiceChargeType(); + LogisticsServiceChargeType serviceCharge = xmlFactory.createLogisticsServiceChargeType(); AmountType actualAmount = xmlFactory.createAmountType(); actualAmount.setCurrencyID(currency); - actualAmount.setValue(currencyFormat(iServiceCharge - .getTotalAmount())); + actualAmount.setValue(currencyFormat(iServiceCharge.getTotalAmount())); serviceCharge.getAppliedAmount().add(actualAmount); TextType reason = xmlFactory.createTextType(); @@ -584,9 +570,8 @@ class ZUGFeRDTransactionModelConverter { * basisAmount.setValue(amount.getBasis()); * allowance.setBasisAmount(basisAmount); */ - TaxCategoryCodeType taxType = xmlFactory - .createTaxCategoryCodeType(); - taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); + TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType(); + taxType.setValue(iServiceCharge.getCategoryCode()); tradeTax.setCategoryCode(taxType); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); @@ -812,9 +797,8 @@ class ZUGFeRDTransactionModelConverter { .createSupplyChainTradeSettlementType(); TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); - TaxCategoryCodeType taxCategoryCode = xmlFactory - .createTaxCategoryCodeType(); - taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); + TaxCategoryCodeType taxCategoryCode = xmlFactory.createTaxCategoryCodeType(); + taxCategoryCode.setValue(currentItem.getCategoryCode()); tradeTax.setCategoryCode(taxCategoryCode); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); @@ -932,15 +916,13 @@ class ZUGFeRDTransactionModelConverter { } - private HashMap getVATPercentAmountMap( - Boolean itemOnly) { + private HashMap getVATPercentAmountMap(Boolean itemOnly) { HashMap hm = new HashMap<>(); for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { BigDecimal percent = currentItem.getProduct().getVATPercent(); LineCalc lc = new LineCalc(currentItem); - VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), - lc.getItemTotalVATAmount()); + VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), trans.getDocumentCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -952,13 +934,12 @@ class ZUGFeRDTransactionModelConverter { return hm; } if (trans.getZFAllowances() != null) { - for (IZUGFeRDAllowanceCharge headerAllowance : trans - .getZFAllowances()) { + for (IZUGFeRDAllowanceCharge headerAllowance : trans.getZFAllowances()) { BigDecimal percent = headerAllowance.getTaxPercent(); VATAmount itemVATAmount = new VATAmount( headerAllowance.getTotalAmount(), headerAllowance - .getTotalAmount().multiply(percent) - .divide(new BigDecimal(100))); + .getTotalAmount().multiply(percent) + .divide(new BigDecimal(100)), trans.getDocumentCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -975,7 +956,7 @@ class ZUGFeRDTransactionModelConverter { VATAmount itemVATAmount = new VATAmount( logisticsServiceCharge.getTotalAmount(), logisticsServiceCharge.getTotalAmount() - .multiply(percent).divide(new BigDecimal(100))); + .multiply(percent).divide(new BigDecimal(100)), trans.getDocumentCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -990,7 +971,7 @@ class ZUGFeRDTransactionModelConverter { BigDecimal percent = charge.getTaxPercent(); VATAmount itemVATAmount = new VATAmount( charge.getTotalAmount(), charge.getTotalAmount() - .multiply(percent).divide(new BigDecimal(100))); + .multiply(percent).divide(new BigDecimal(100)), trans.getDocumentCode()); VATAmount current = hm.get(percent); if (current == null) { hm.put(percent, itemVATAmount); @@ -1115,9 +1096,8 @@ class ZUGFeRDTransactionModelConverter { // Set total net amount totalNetAmount = res; - HashMap VATPercentAmountMap = getVATPercentAmountMap(); - for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { - VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); + HashMap vatAmountHashMap = getVATPercentAmountMap(); + for (VATAmount amount : vatAmountHashMap.values()) { res = res.add(amount.getCalculated()); } diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java index 01b99312..84fd2fa3 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java @@ -348,6 +348,7 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getDueDate(), "20170530"); assertEquals(zi.getForeignReference(), getNumber()); + assertEquals(zi.getDocumentCode(), "380"); } diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 066863c3..a041a7e8 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -350,32 +350,13 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream); // Reading ZUGFeRD - String amount = null; - String blz = null; - String bic = null; - String iban = null; - String kto = null; - String holder = null; - String ref = null; - - if (zi.canParse()) { - amount = zi.getAmount(); - blz = zi.getBLZ(); - bic = zi.getBIC(); - iban = zi.getIBAN(); - kto = zi.getKTO(); - holder = zi.getHolder(); - ref = zi.getForeignReference(); - } - // this resembles the data written in MustangReaderWriterCustomXMLTest - assertEquals(amount, "571.04"); - assertEquals(blz, "41441604"); - assertEquals(bic, "COBADEFFXXX"); - assertEquals(iban, "DE88 2008 0000 0970 3757 00"); - assertEquals(kto, "44421800"); - assertEquals(holder, "Bei Spiel GmbH"); - assertEquals(ref, "RE-20170509/505"); - + assertEquals(zi.getAmount(), "571.04"); + assertEquals(zi.getBLZ(), getOwnBLZ()); + assertEquals(zi.getBIC(), getOwnBIC()); + assertEquals(zi.getIBAN(), getOwnIBAN()); + assertEquals(zi.getKTO(), getOwnKto()); + assertEquals(zi.getHolder(), getOwnOrganisationName()); + assertEquals(zi.getForeignReference(), "RE-20170509/505"); } public void testForeignImport() throws IOException {