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\"