Open mrgreywater opened 12 hours ago
Simple Repro:
public static void main(String[] args) throws Exception {
Invoice invoice = new Invoice();
invoice.setIssueDate(new Date());
invoice.setSender(new TradeParty());
invoice.setRecipient(new TradeParty());
invoice.addItem(new IZUGFeRDExportableItem() {
@Override
public IZUGFeRDExportableProduct getProduct() {
return new IZUGFeRDExportableProduct() {
@Override
public String getUnit() {
return "EA";
}
@Override
public String getName() {
return "Product";
}
@Override
public String getDescription() {
return "";
}
@Override
public BigDecimal getVATPercent() {
return BigDecimal.ZERO;
}
};
}
@Override
public IZUGFeRDAllowanceCharge[] getItemCharges() {
return List.of(new IZUGFeRDAllowanceCharge() {
@Override
public BigDecimal getTotalAmount(IAbsoluteValueProvider iAbsoluteValueProvider) {
return BigDecimal.ONE;
}
@Override
public String getReason() {
return null;
}
@Override
public String getReasonCode() {
return null;
}
@Override
public BigDecimal getTaxPercent() {
return BigDecimal.ZERO;
}
@Override
public boolean isCharge() {
return false;
}
}, new IZUGFeRDAllowanceCharge() {
@Override
public BigDecimal getTotalAmount(IAbsoluteValueProvider iAbsoluteValueProvider) {
return BigDecimal.valueOf(2);
}
@Override
public String getReason() {
return null;
}
@Override
public String getReasonCode() {
return null;
}
@Override
public BigDecimal getTaxPercent() {
return BigDecimal.ZERO;
}
@Override
public boolean isCharge() {
return false;
}
}).toArray(new IZUGFeRDAllowanceCharge[0]);
}
@Override
public BigDecimal getPrice() {
return BigDecimal.TEN;
}
@Override
public BigDecimal getQuantity() {
return BigDecimal.ONE;
}
});
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
zf2p.setTest();
zf2p.setProfile(Profiles.getByName("XRechnung"));
zf2p.generateXML(invoice);
ZUGFeRDVisualizer zvi = new ZUGFeRDVisualizer();
Path tempFilePath = Files.createTempFile("xrechnung", ".xml");
Files.write(tempFilePath, zf2p.getXML());
zvi.visualize(tempFilePath.toString(), ZUGFeRDVisualizer.Language.EN);
Files.deleteIfExists(tempFilePath);
}
When exporting an invoice with multiple IZUGFeRDAllowanceCharges in an item as xml using the ZUGFeRD2PullProvider "XRechnung" profile it leads to a xml like this:
The resulting xml cannot be loaded using the ZUGFeRDVisualizer, and instead throws this exception.
If XRechnung doesn't permit multiple Allowances per Item, then the exporter should probably combine their amount and not create multiple entries.