diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 9730df2c..cca1eee4 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -132,5 +132,14 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ default Date getDetailedDeliveryPeriodTo() { return null; } + + /*** + * specify allowances amount for the line item total, i.e. after item price is multiplied + * by amount + * @return + */ + default IZUGFeRDAllowanceCharge[] getItemTotalAllowances() { + return null; + }; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java index 5346d408..fd9f3a4d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -13,6 +13,7 @@ public class LineCalculator { private BigDecimal itemTotalVATAmount; private BigDecimal allowance = BigDecimal.ZERO; private BigDecimal charge = BigDecimal.ZERO; + private BigDecimal allowanceItemTotal = BigDecimal.ZERO; public LineCalculator(IZUGFeRDExportableItem currentItem) { @@ -26,11 +27,17 @@ public class LineCalculator { addCharge(charge.getTotalAmount(currentItem)); } } + if (currentItem.getItemTotalAllowances() != null && currentItem.getItemTotalAllowances().length > 0) { + for (final IZUGFeRDAllowanceCharge itemTotalAllowance : currentItem.getItemTotalAllowances()) { + addAllowanceItemTotal(itemTotalAllowance.getTotalAmount(currentItem)); + } + } + BigDecimal multiplicator = currentItem.getProduct().getVATPercent().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()) - .setScale(2, BigDecimal.ROUND_HALF_UP); + .subtract(allowanceItemTotal).setScale(2, BigDecimal.ROUND_HALF_UP); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); } @@ -63,5 +70,8 @@ public class LineCalculator { charge = charge.add(b); } + public void addAllowanceItemTotal(BigDecimal b) { + allowanceItemTotal = allowanceItemTotal.add(b); + } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 63718561..7a2ada17 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -228,6 +228,31 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { ""; return allowanceChargeStr; } + + /*** + * returns the XML for a charge or allowance on item total level + * @param allowance + * @param item + * @return + */ + protected String getItemTotalAllowanceChargeStr(IZUGFeRDAllowanceCharge allowance, IAbsoluteValueProvider item) { + String percentage = ""; + String chargeIndicator = "false"; + if ((allowance.getPercent() != null) && (profile == Profiles.getByName("Extended"))) { + percentage = "" + vatFormat(allowance.getPercent()) + ""; + percentage += "" + item.getValue() + ""; + } + if (allowance.isCharge()) { + chargeIndicator = "true"; + } + + final String itemTotalAllowanceChargeStr = "" + + chargeIndicator + "" + percentage + + "" + currencyFormat(allowance.getTotalAmount(item)) + "" + + "" + XMLTools.encodeXML(allowance.getReason()) + "" + + ""; + return itemTotalAllowanceChargeStr; + } @Override public void generateXML(IExportableTransaction trans) { @@ -356,7 +381,13 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } } - + String itemTotalAllowanceChargeStr = ""; + if (currentItem.getItemTotalAllowances() != null && currentItem.getItemTotalAllowances().length > 0) { + for (final IZUGFeRDAllowanceCharge itemTotalAllowance : currentItem.getItemTotalAllowances()) { + itemTotalAllowanceChargeStr += getItemTotalAllowanceChargeStr(itemTotalAllowance, currentItem); + } + } + xml += "" + XMLTools.encodeXML(currentItem.getProduct().getName()) + "" + "" + XMLTools.encodeXML(currentItem.getProduct().getDescription()) + "" @@ -422,7 +453,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } xml += ""; } - + + xml += itemTotalAllowanceChargeStr; + xml += "" + "" + currencyFormat(lc.getItemTotalNetAmount()) + "" // currencyID=\"EUR\"