diff --git a/library/src/main/java/org/mustangproject/Product.java b/library/src/main/java/org/mustangproject/Product.java index 83cf4543..cc19932d 100644 --- a/library/src/main/java/org/mustangproject/Product.java +++ b/library/src/main/java/org/mustangproject/Product.java @@ -23,9 +23,9 @@ import java.util.Map; public class Product implements IZUGFeRDExportableProduct { protected String unit, name, sellerAssignedID, buyerAssignedID; - protected String description=""; - protected String taxExemptionReason=null; - protected String taxCategoryCode=null; + protected String description = ""; + protected String taxExemptionReason = null; + protected String taxCategoryCode = null; protected BigDecimal VATPercent; protected boolean isReverseCharge = false; protected boolean isIntraCommunitySupply = false; @@ -61,8 +61,6 @@ public class Product implements IZUGFeRDExportableProduct { }); - - nodeMap.getAsString("SellerAssignedID").ifPresent(this::setSellerAssignedID); nodeMap.getAsString("BuyerAssignedID").ifPresent(this::setBuyerAssignedID); nodeMap.getAsString("Name").ifPresent(this::setName); @@ -155,7 +153,7 @@ public class Product implements IZUGFeRDExportableProduct { * @param taxExemptionReasonText String e.g. Kleinunternehmer gemäß §19 UStG https://github.com/ZUGFeRD/mustangproject/issues/463 * @return fluent setter */ - public Product setTaxExemptionReason(String taxExemptionReasonText) { + public Product setTaxExemptionReason(String taxExemptionReasonText) { taxExemptionReason = taxExemptionReasonText; return this; } @@ -177,7 +175,7 @@ public class Product implements IZUGFeRDExportableProduct { * @param code e.g. S (normal tax), Z=zero rated, E (e.g. small business) or K (intrra community supply) see also https://github.com/ZUGFeRD/mustangproject/issues/463 * @return fluent setter */ - public Product setTaxCategoryCode(String code) { + public Product setTaxCategoryCode(String code) { taxCategoryCode = code; return this; } @@ -304,18 +302,22 @@ public class Product implements IZUGFeRDExportableProduct { * @return fluent setter */ public Product setVATPercent(BigDecimal VATPercent) { - this.VATPercent = VATPercent; + if (VATPercent == null) { + this.VATPercent = BigDecimal.ZERO; + } else { + this.VATPercent = VATPercent; + } return this; } @Override public String getCountryOfOrigin() { - return this.countryOfOrigin; + return this.countryOfOrigin; } public Product setCountryOfOrigin(String countryOfOrigin) { - this.countryOfOrigin = countryOfOrigin; - return this; + this.countryOfOrigin = countryOfOrigin; + return this; } @Override @@ -328,16 +330,16 @@ public class Product implements IZUGFeRDExportableProduct { } public Product setAttributes(Map attributes) { - this.attributes.clear(); + this.attributes.clear(); if (attributes != null) { this.attributes.putAll(attributes); } - return this; + return this; } - public Product addAttribute(String name, String value ) { - this.attributes.put(name, value); - return this; + public Product addAttribute(String name, String value) { + this.attributes.put(name, value); + return this; } @Override diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java index f3e8aa2d..c44f29ee 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -44,7 +44,13 @@ public class LineCalculator { BigDecimal multiplicator = vatPercent.divide(BigDecimal.valueOf(100)); priceGross = currentItem.getPrice(); // see https://github.com/ZUGFeRD/mustangproject/issues/159 price = priceGross.subtract(allowance).add(charge); - itemTotalNetAmount = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity(), 18, RoundingMode.HALF_UP) + + BigDecimal quantity=BigDecimal.ZERO; + if ((currentItem!=null)&&(currentItem.getQuantity()!=null)) { + quantity=currentItem.getQuantity(); + } + + itemTotalNetAmount = quantity.multiply(getPrice()).divide(currentItem.getBasisQuantity(), 18, RoundingMode.HALF_UP) .subtract(allowanceItemTotal).setScale(2, RoundingMode.HALF_UP); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java index 0b7ca5e3..8740e157 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java @@ -167,7 +167,11 @@ public class TransactionCalculator implements IAbsoluteValueProvider { final String vatDueDateTypeCode = trans.getVATDueDateTypeCode(); for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { - BigDecimal percent = currentItem.getProduct().getVATPercent(); + BigDecimal percent = null; + if (currentItem.getProduct()!=null) + { + percent=currentItem.getProduct().getVATPercent(); + } if (percent != null) { LineCalculator lc = new LineCalculator(currentItem); VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index 99a7ba9e..5f49b6dc 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -556,7 +556,10 @@ public class ZUGFeRDInvoiceImporter { // UBL... number = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"ID\"]").trim(); typeCode = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"InvoiceTypeCode\"]").trim(); - issueDate = new SimpleDateFormat("yyyy-MM-dd").parse(extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"IssueDate\"]").trim()); + String issueDateStr = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"IssueDate\"]").trim(); + if (issueDateStr.length()>0) { + issueDate = new SimpleDateFormat("yyyy-MM-dd").parse(issueDateStr); + } String dueDt = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"DueDate\"]").trim(); if (dueDt.length() > 0) { dueDate = new SimpleDateFormat("yyyy-MM-dd").parse(dueDt); @@ -775,7 +778,7 @@ public class ZUGFeRDInvoiceImporter { } - zpp.setDueDate(dueDate).setDeliveryDate(deliveryDate).setIssueDate(issueDate).setSender(new TradeParty(SellerNodes)).setRecipient(new TradeParty(BuyerNodes)).setNumber(number).setDocumentCode(typeCode); + zpp.setIssueDate(issueDate).setDueDate(dueDate).setDeliveryDate(deliveryDate).setSender(new TradeParty(SellerNodes)).setRecipient(new TradeParty(BuyerNodes)).setNumber(number).setDocumentCode(typeCode); if ((directDebitMandateID != null) && (IBAN != null)) { DirectDebit d = new DirectDebit(IBAN, directDebitMandateID);