diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 07067e94..247f2e3b 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -295,6 +295,16 @@ public class Item implements IZUGFeRDExportableItem { return this; } + @Override public IZUGFeRDAllowanceCharge[] getAllowances() { + IZUGFeRDAllowanceCharge[] izac=new IZUGFeRDAllowanceCharge[Allowances.size()]; + return Allowances.toArray(izac); + } + + @Override public IZUGFeRDAllowanceCharge[] getCharges() { + IZUGFeRDAllowanceCharge[] izac=new IZUGFeRDAllowanceCharge[Charges.size()]; + return Charges.toArray(izac); + } + /*** * BT 132 (issue https://github.com/ZUGFeRD/mustangproject/issues/247) * @return the line ID of the order (BT132) @@ -468,6 +478,7 @@ public class Item implements IZUGFeRDExportableItem { * @return fluent setter */ public Item addAllowance(IZUGFeRDAllowanceCharge izac) { + Allowances.add(izac); return this; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java index f6a9ebea..08702773 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -31,7 +31,7 @@ public class LineCalculator { if ((allowance.getPercent()!=null)&&(allowance.getPercent().compareTo(BigDecimal.ZERO)!=0)) { factor=currentItem.getQuantity(); } - addLineAllowance(singleAllowance.multiply(factor)); + addAllowanceItemTotal(singleAllowance.multiply(factor)); } } @@ -43,7 +43,7 @@ public class LineCalculator { if ((charge.getPercent()!=null)&&(charge.getPercent().compareTo(BigDecimal.ZERO)!=0)) { factor=currentItem.getQuantity(); } - addLineCharge(singleCharge.multiply(factor)); + subtractAllowanceItemTotal(singleCharge.multiply(factor)); } } @@ -69,7 +69,7 @@ public class LineCalculator { price=currentItem.getPrice(); priceGross=price; - price=price.subtract(itemAllowance).add(itemCharge); +// price=price.subtract(itemAllowance).add(itemCharge); // BigDecimal delta=charge.subtract(allowanceItemTotal).subtract(allowance); // delta=delta.divide(currentItem.getQuantity(), 18, RoundingMode.HALF_UP); @@ -91,8 +91,8 @@ public class LineCalculator { BigDecimal basisQuantity = currentItem.getBasisQuantity().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE.setScale(4) : currentItem.getBasisQuantity(); - itemTotalNetAmount = quantity.multiply(priceGross).divide(basisQuantity, 18, RoundingMode.HALF_UP) - .add(lineCharge).subtract(lineAllowance).setScale(2, RoundingMode.HALF_UP); + itemTotalNetAmount = quantity.multiply(price).divide(basisQuantity, 18, RoundingMode.HALF_UP) + .add(lineCharge).subtract(lineAllowance).subtract(allowanceItemTotal).setScale(2, RoundingMode.HALF_UP); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); } @@ -135,5 +135,8 @@ public class LineCalculator { public void addAllowanceItemTotal(BigDecimal b) { allowanceItemTotal = allowanceItemTotal.add(b); } + public void subtractAllowanceItemTotal(BigDecimal b) { + allowanceItemTotal = allowanceItemTotal.subtract(b); + } } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 8fe07564..75356d86 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -432,24 +432,29 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + XMLTools.encodeXML(currentItem.getProduct().getBuyerAssignedID()) + ""; } String allowanceChargeStr = ""; - if (currentItem.getItemAllowances() != null && currentItem.getItemAllowances().length > 0) { - for (final IZUGFeRDAllowanceCharge allowance : currentItem.getItemAllowances()) { + if (currentItem.getProduct().getAllowances() != null && currentItem.getProduct().getAllowances().length > 0) { + for (final IZUGFeRDAllowanceCharge allowance : currentItem.getProduct().getAllowances()) { allowanceChargeStr += getAllowanceChargeStr(allowance, currentItem); } } - if (currentItem.getItemCharges() != null && currentItem.getItemCharges().length > 0) { - for (final IZUGFeRDAllowanceCharge charge : currentItem.getItemCharges()) { + if (currentItem.getProduct().getCharges() != null && currentItem.getProduct().getCharges().length > 0) { + for (final IZUGFeRDAllowanceCharge charge : currentItem.getProduct().getCharges()) { allowanceChargeStr += getAllowanceChargeStr(charge, currentItem); } } String itemTotalAllowanceChargeStr = ""; - if (currentItem.getItemTotalAllowances() != null && currentItem.getItemTotalAllowances().length > 0) { - for (final IZUGFeRDAllowanceCharge itemTotalAllowance : currentItem.getItemTotalAllowances()) { + if (currentItem.getAllowances() != null && currentItem.getAllowances().length > 0) { + for (final IZUGFeRDAllowanceCharge itemTotalAllowance : currentItem.getAllowances()) { itemTotalAllowanceChargeStr += getItemTotalAllowanceChargeStr(itemTotalAllowance, currentItem); } } + if (currentItem.getCharges() != null && currentItem.getCharges().length > 0) { + for (final IZUGFeRDAllowanceCharge itemTotalCharges : currentItem.getCharges()) { + itemTotalAllowanceChargeStr += getItemTotalAllowanceChargeStr(itemTotalCharges, currentItem); + } + } xml += "" + XMLTools.encodeXML(currentItem.getProduct().getName()) + ""; if (currentItem.getProduct().getDescription() != null && currentItem.getProduct().getDescription().length() > 0) { @@ -540,6 +545,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { + "" + vatFormat(currentItem.getProduct().getVATPercent()) + "" + ""; + // item charges/allowances + if (!itemTotalAllowanceChargeStr.isEmpty()) { + xml += ""+ itemTotalAllowanceChargeStr +""; + } + if ((currentItem.getDetailedDeliveryPeriodFrom() != null) || (currentItem.getDetailedDeliveryPeriodTo() != null)) { xml += ""; if (currentItem.getDetailedDeliveryPeriodFrom() != null) { @@ -551,7 +561,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { xml += ""; } - xml += itemTotalAllowanceChargeStr; xml += "" + "" + currencyFormat(lc.getItemTotalNetAmount())