From ec5bbfdc5c47727706392707f4e14498b12a8e62 Mon Sep 17 00:00:00 2001 From: jstaerk Date: Tue, 30 Sep 2025 19:44:02 +0200 Subject: [PATCH] - make Line Calculation, e.g. total line net amount, accessible via JSON using getCalculation --- History.md | 1 + .../main/java/org/mustangproject/Item.java | 1 + .../ZUGFeRD/DAPullProvider.java | 2 +- .../ZUGFeRD/IZUGFeRDExportableItem.java | 2 + .../ZUGFeRD/OXPullProvider.java | 2 +- .../ZUGFeRD/TransactionCalculator.java | 4 +- .../ZUGFeRD/ZUGFeRD1PullProvider.java | 2 +- .../ZUGFeRD/ZUGFeRD2PullProvider.java | 2 +- .../ZUGFeRD/ZUGFeRDInvoiceImporter.java | 2 +- .../ZUGFeRD/CalculationTest.java | 12 +- .../ZUGFeRD/DeSerializationTest.java | 14 ++ .../ZUGFeRD/ZF2ZInvoiceImporterTest.java | 150 +++++++++++++++++- 12 files changed, 179 insertions(+), 15 deletions(-) diff --git a/History.md b/History.md index 39907279..4f0f485e 100644 --- a/History.md +++ b/History.md @@ -7,6 +7,7 @@ - #931 - #932 - #933, #413, #557, #765 +- make Line Calculation, e.g. total line net amount, accessible via JSON using getCalculation 2.19.0 ======= diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index fabc88de..5a3853a0 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import org.mustangproject.ZUGFeRD.IReferencedDocument; import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableItem; +import org.mustangproject.ZUGFeRD.LineCalculator; import org.mustangproject.util.NodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java index 9bac1b07..7caa3e52 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/DAPullProvider.java @@ -79,7 +79,7 @@ public class DAPullProvider extends ZUGFeRD2PullProvider { if (currentItem.getProduct().getTaxExemptionReason() != null) { // exemptionReason = "" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + ""; } - final LineCalculator lc = new LineCalculator(currentItem); + final LineCalculator lc = currentItem.getCalculation(); xml += "" + "" + "" + lineID + "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 04cadc22..05d86170 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -205,4 +205,6 @@ public interface IZUGFeRDExportableItem extends IAbsoluteValueProvider{ default String getAccountingReference() { return null; } + + default LineCalculator getCalculation() {return new LineCalculator(this); }; } diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java index f2a032f2..7659b526 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXPullProvider.java @@ -107,7 +107,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider { // exemptionReason = "" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + ""; } - final LineCalculator lc = new LineCalculator(currentItem); + final LineCalculator lc = currentItem.getCalculation(); xml += "" + "" + "" + lineID + "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java index 02ae965d..f8c80127 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/TransactionCalculator.java @@ -195,7 +195,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider { percent = currentItem.getProduct().getVATPercent(); } if (percent != null) { - LineCalculator lc = new LineCalculator(currentItem); + LineCalculator lc = currentItem.getCalculation(); VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), currentItem.getProduct().getTaxCategoryCode(), vatDueDateTypeCode); String reasonText = currentItem.getProduct().getTaxExemptionReason(); @@ -265,7 +265,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider { } if (percent != null) { - final LineCalculator lc = new LineCalculator(currentItem); + final LineCalculator lc = currentItem.getCalculation(); final VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), currentItem.getProduct().getTaxCategoryCode(), vatDueDateTypeCode, percent); final String reasonText = currentItem.getProduct().getTaxExemptionReason(); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java index 87e6f479..8c74e361 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD1PullProvider.java @@ -344,7 +344,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider { } - final LineCalculator lc = new LineCalculator(currentItem); + final LineCalculator lc = currentItem.getCalculation(); xml += "" + "" + "" + lineID + "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index 87ffb274..c51cb60c 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -415,7 +415,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { if (currentItem.getId() != null) { lineIDStr = currentItem.getId(); } - final LineCalculator lc = new LineCalculator(currentItem); + final LineCalculator lc = currentItem.getCalculation(); if ((getProfile() != Profiles.getByName("Minimum")) && (getProfile() != Profiles.getByName("BasicWL"))) { xml += "" + "" diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java index cdfe1d29..2e105fc1 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDInvoiceImporter.java @@ -1146,7 +1146,7 @@ public class ZUGFeRDInvoiceImporter { try { moreDetails = " with tax basis " + tc.getTaxBasis() + " and with positions " + tc.getTotal() + " = " + Stream.of(tc.trans.getZFItems()) - .map(item -> new LineCalculator(item).getItemTotalNetAmount().toPlainString()) + .map(item -> item.getCalculation().getItemTotalNetAmount().toPlainString()) .collect(Collectors.joining(" + ")); } catch (Exception ignored) { } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java index 680b312e..30448728 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/CalculationTest.java @@ -35,7 +35,7 @@ public class CalculationTest extends ResourceCase { .setQuantity(TEN) .setProduct(product); - final LineCalculator calculator = new LineCalculator(currentItem); + final LineCalculator calculator = currentItem.getCalculation(); assertEquals(valueOf(100).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); assertEquals(valueOf(1000).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); @@ -54,7 +54,7 @@ public class CalculationTest extends ResourceCase { .setItemAllowances(new IZUGFeRDAllowanceCharge[]{allowance}) .setProduct(product); - final LineCalculator calculator = new LineCalculator(currentItem); + final LineCalculator calculator = currentItem.getCalculation(); assertEquals(valueOf(148.73).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); assertEquals(valueOf(1769.89).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); @@ -74,7 +74,7 @@ public class CalculationTest extends ResourceCase { .setItemCharges(new IZUGFeRDAllowanceCharge[]{charge}) .setProduct(product); - final LineCalculator calculator = new LineCalculator(currentItem); + final LineCalculator calculator = currentItem.getCalculation(); assertEquals(valueOf(148.73).stripTrailingZeros(), calculator.getPrice().stripTrailingZeros()); assertEquals(valueOf(1799.63).stripTrailingZeros(), calculator.getItemTotalNetAmount().stripTrailingZeros()); @@ -113,13 +113,13 @@ public class CalculationTest extends ResourceCase { product.addAllowance(new Allowance(new BigDecimal(1))); item = new Item(product, new BigDecimal("9.50"), new BigDecimal(25)); item.addCharge(new Charge(new BigDecimal(10)).setReasonCode("ZZZ").setReason("Zuschlag")); - LineCalculator lc = new LineCalculator(item); + LineCalculator lc = item.getCalculation(); assertEquals(new BigDecimal("222.50"), lc.getItemTotalNetAmount()); invoice.addItem(item); product = new Product("Paper", "", "H87", new BigDecimal(25)); item = new Item(product, new BigDecimal("4.50"), new BigDecimal(15)); item.addAllowance(new Allowance().setPercent(new BigDecimal(5)).setReasonCode("ZZZ").setReason("Zuschlag")); - lc = new LineCalculator(item); + lc = item.getCalculation(); assertEquals(new BigDecimal("64.12"), lc.getItemTotalNetAmount()); invoice.addItem(item); invoice.addAllowance(new Allowance().setPercent(new BigDecimal(10)).setTaxPercent(new BigDecimal(25)).setReasonCode("ZZZ").setReason("Mengenrabatt")); @@ -459,7 +459,7 @@ public class CalculationTest extends ResourceCase { .setQuantity(BigDecimal.valueOf(31)) .setBasisQuantity(BigDecimal.valueOf(366)) .setProduct(product); - final LineCalculator calculator = new LineCalculator(currentItem); + final LineCalculator calculator = currentItem.getCalculation(); assertEquals(BigDecimal.valueOf(32.74), calculator.getItemTotalNetAmount()); } diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java index 6f0a910c..8c8dbd7d 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/DeSerializationTest.java @@ -479,6 +479,20 @@ public class DeSerializationTest extends ResourceCase { assertEquals("sender@test.org", fromJSON.getSender().getEmail()); } + public void testItemAbsoluteChargeFromJSON() throws JsonProcessingException { + String globalID = "4000001123452"; + String globalIDScheme = "0088"; + + String json="{\"number\":\"471102\",\"currency\":\"EUR\",\"issueDate\":\"2018-03-04T00:00:00.000+01:00\",\"dueDate\":\"2018-03-04T00:00:00.000+01:00\",\"deliveryDate\":\"2018-03-04T00:00:00.000+01:00\",\"sender\":{\"name\":\"Lieferant GmbH\",\"zip\":\"80333\",\"street\":\"Lieferantenstraße 20\",\"location\":\"München\",\"country\":\"DE\",\"taxID\":\"201/113/40209\",\"vatID\":\"DE123456789\",\"globalID\":\"4000001123452\",\"globalIDScheme\":\"0088\"},\"recipient\":{\"name\":\"Kunden AG Mitte\",\"zip\":\"69876\",\"street\":\"Kundenstraße 15\",\"location\":\"Frankfurt\",\"country\":\"DE\"},\"zfitems\":[{\"price\":9.9,\"quantity\":20,\"product\":{\"unit\":\"H87\",\"name\":\"Trennblätter A4\",\"description\":\"\",\"vatpercent\":19,\"taxCategoryCode\":\"S\"},\"itemCharges\":[{\"totalAmount\":1,\"taxPercent\":19,\"reason\":\"Invoice line charge reason\",\"categoryCode\":\"S\"}]},{\"price\":5.5,\"quantity\":50,\"product\":{\"unit\":\"H87\",\"name\":\"Joghurt Banane\",\"description\":\"\",\"vatpercent\":7,\"taxCategoryCode\":\"S\"}}]}"; + + ObjectMapper mapper = new ObjectMapper(); + Invoice fromJSON = mapper.readValue(json, Invoice.class); + assertEquals(globalID, fromJSON.getSender().getGlobalID()); + assertEquals(globalIDScheme, fromJSON.getSender().getGlobalIDScheme()); + TransactionCalculator tc=new TransactionCalculator(fromJSON); + assertEquals(new BigDecimal("531.06"), tc.getDuePayable()); + } + public void testGrossFromJSON() throws JsonProcessingException { String json="{ \"documentCode\": \"380\", \"number\": \"123\", \"currency\": \"EUR\", \"paymentTermDescription\": \"Please remit until 28.07.2025\", \"issueDate\": 1753653600000, \"dueDate\": 1753653600000, \"sender\": { \"name\": \"Test company\", \"zip\": \"55232\", \"street\": \"teststr\", \"location\": \"teststadt\", \"country\": \"DE\", \"taxID\": \"4711\", \"vatID\": \"DE0815\", \"vatid\": \"DE0815\" }, \"recipient\": { \"name\": \"Franz Müller\", \"zip\": \"55232\", \"street\": \"teststr.12\", \"location\": \"Entenhausen\", \"country\": \"DE\", \"contact\": { \"name\": \"contact testname\", \"phone\": \"123456\", \"email\": \"contact.testemail@example.org\", \"fax\": \"0911623562\" } }, \"totalPrepaidAmount\": 0.00, \"lineTotalAmount\": 29.00, \"duePayable\": 34.51, \"grandTotal\": 34.51, \"taxBasis\": 29.00, \"valid\": true, \"zfitems\": [ { \"price\": 3.0000, \"quantity\": 10.0000, \"basisQuantity\": 1.0000, \"id\": \"1\", \"product\": { \"unit\": \"H87\", \"name\": \"Testprodukt\", \"taxCategoryCode\": \"S\", \"allowances\": [ { \"totalAmount\": 0.1000, \"categoryCode\": \"S\" } ], \"vatpercent\": 19.00, \"intraCommunitySupply\": false, \"reverseCharge\": false }, \"value\": 3.0000 } ], \"ownVATID\": \"DE0815\", \"ownTaxID\": \"4711\", \"ownLocation\": \"teststadt\", \"ownZIP\": \"55232\", \"ownCountry\": \"DE\", \"ownStreet\": \"teststr\"}"; diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java index ad1998d7..b793184d 100644 --- a/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java +++ b/library/src/test/java/org/mustangproject/ZUGFeRD/ZF2ZInvoiceImporterTest.java @@ -350,7 +350,7 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { assertEquals(version,2); assertTrue(new BigDecimal("1").compareTo(invoice.getZFItems()[0].getQuantity()) == 0); - LineCalculator lc=new LineCalculator(invoice.getZFItems()[0]); + LineCalculator lc=invoice.getZFItems()[0].getCalculation(); assertTrue(new BigDecimal("1").compareTo(lc.getItemTotalNetAmount()) == 0); assertEquals("Z", invoice.getZFItems()[0].getProduct().getTaxCategoryCode()); @@ -439,7 +439,153 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase { String expectedIssueDate= String.valueOf(morning.toInstant().getEpochSecond() *1000); String expectedPaymentTermDesciption="Please remit until "+german.format(now); - JSONAssert.assertEquals("{ \"documentCode\": \"380\", \"number\": \"123\", \"currency\": \"EUR\", \"paymentTermDescription\": \""+expectedPaymentTermDesciption+"\", \"issueDate\": "+expectedIssueDate+", \"dueDate\": "+expectedDueDate+", \"sender\": { \"name\": \"Test company\", \"zip\": \"55232\", \"street\": \"teststr\", \"location\": \"teststadt\", \"country\": \"DE\", \"taxID\": \"4711\", \"vatID\": \"DE0815\", \"vatid\": \"DE0815\" }, \"recipient\": { \"name\": \"Franz Müller\", \"zip\": \"55232\", \"street\": \"teststr.12\", \"location\": \"Entenhausen\", \"country\": \"DE\", \"contact\": { \"name\": \"contact testname\", \"phone\": \"123456\", \"email\": \"contact.testemail@example.org\", \"fax\": \"0911623562\" } }, \"totalPrepaidAmount\": 0.00, \"zfitems\": [ { \"price\": 3.0000, \"quantity\": 1.0000, \"basisQuantity\": 1.0000, \"id\": \"1\", \"product\": { \"unit\": \"H87\", \"name\": \"Testprodukt\", \"taxCategoryCode\": \"S\", \"vatpercent\": 19.00, }, \"itemAllowances\": [ { \"totalAmount\": 0.10, \"taxPercent\": 0, \"categoryCode\": \"S\" } ], \"value\": 3.0000 }, { \"price\": 3.0000, \"quantity\": 1.0000, \"basisQuantity\": 1.0000, \"id\": \"2\", \"product\": { \"unit\": \"H87\", \"name\": \"Testprodukt\", \"taxCategoryCode\": \"S\", \"vatpercent\": 19.00,}, \"itemAllowances\": [ { \"percent\": 50.00, \"totalAmount\": 1.5, \"basisAmount\": 3.00, \"taxPercent\": 0, \"reason\": \"In love with salesperson\", \"categoryCode\": \"S\" } ], \"value\": 3.0000 }, { \"price\": 3.0000, \"quantity\": 2.0000, \"basisQuantity\": 1.0000, \"id\": \"3\", \"product\": { \"unit\": \"H87\", \"name\": \"Testprodukt\", \"taxCategoryCode\": \"S\", \"vatpercent\": 19.00}, \"itemCharges\": [ { \"totalAmount\": 1.00, \"taxPercent\": 0, \"reason\": \"AnotherReason\", \"categoryCode\": \"S\" } ], \"value\": 3.0000 }, { \"price\": 3.0000, \"quantity\": 1.0000, \"basisQuantity\": 1.0000, \"id\": \"4\", \"product\": { \"unit\": \"H87\", \"name\": \"Testprodukt\", \"taxCategoryCode\": \"S\", \"vatpercent\": 19.00 }, \"itemCharges\": [ { \"totalAmount\": 1.00, \"taxPercent\": 0, \"reason\": \"Yet another reason\", \"categoryCode\": \"S\" } ], \"itemAllowances\": [ { \"totalAmount\": 1.00, \"taxPercent\": 0, \"reason\": \"Something completely strange\", \"categoryCode\": \"S\" } ], \"value\": 3.0000 } ], \"zfcharges\": [ { \"totalAmount\": 1.00, \"taxPercent\": 19.00, \"reason\": \"AReason\", \"reasonCode\": \"ABK\", \"categoryCode\": \"S\" } ]}",jsonArray,true); + JSONAssert.assertEquals("{\n" + + " \"documentCode\" : \"380\",\n" + + " \"number\" : \"123\",\n" + + " \"currency\" : \"EUR\",\n" + + " \"paymentTermDescription\" : \"Please remit until 30.09.2025\",\n" + + " \"issueDate\" : 1759190400000,\n" + + " \"dueDate\" : 1759190400000,\n" + + " \"sender\" : {\n" + + " \"name\" : \"Test company\",\n" + + " \"zip\" : \"55232\",\n" + + " \"street\" : \"teststr\",\n" + + " \"location\" : \"teststadt\",\n" + + " \"country\" : \"DE\",\n" + + " \"taxID\" : \"4711\",\n" + + " \"vatID\" : \"DE0815\",\n" + + " \"vatid\" : \"DE0815\"\n" + + " },\n" + + " \"recipient\" : {\n" + + " \"name\" : \"Franz Müller\",\n" + + " \"zip\" : \"55232\",\n" + + " \"street\" : \"teststr.12\",\n" + + " \"location\" : \"Entenhausen\",\n" + + " \"country\" : \"DE\",\n" + + " \"contact\" : {\n" + + " \"name\" : \"contact testname\",\n" + + " \"phone\" : \"123456\",\n" + + " \"email\" : \"contact.testemail@example.org\",\n" + + " \"fax\" : \"0911623562\"\n" + + " }\n" + + " },\n" + + " \"totalPrepaidAmount\" : 0.0,\n" + + " \"zfitems\" : [ {\n" + + " \"price\" : 3.0,\n" + + " \"quantity\" : 1.0,\n" + + " \"basisQuantity\" : 1.0,\n" + + " \"id\" : \"1\",\n" + + " \"product\" : {\n" + + " \"unit\" : \"H87\",\n" + + " \"name\" : \"Testprodukt\",\n" + + " \"taxCategoryCode\" : \"S\",\n" + + " \"vatpercent\" : 19.0\n" + + " },\n" + + " \"itemAllowances\" : [ {\n" + + " \"totalAmount\" : 0.1,\n" + + " \"taxPercent\" : 0,\n" + + " \"categoryCode\" : \"S\"\n" + + " } ],\n" + + " \"value\" : 3.0,\n" + + " \"calculation\" : {\n" + + " \"price\" : 3.0,\n" + + " \"priceGross\" : 3.0,\n" + + " \"itemTotalNetAmount\" : 2.9,\n" + + " \"itemTotalVATAmount\" : 0.551,\n" + + " \"itemTotalGrossAmount\" : 2.9\n" + + " }\n" + + " }, {\n" + + " \"price\" : 3.0,\n" + + " \"quantity\" : 1.0,\n" + + " \"basisQuantity\" : 1.0,\n" + + " \"id\" : \"2\",\n" + + " \"product\" : {\n" + + " \"unit\" : \"H87\",\n" + + " \"name\" : \"Testprodukt\",\n" + + " \"taxCategoryCode\" : \"S\",\n" + + " \"vatpercent\" : 19.0\n" + + " },\n" + + " \"itemAllowances\" : [ {\n" + + " \"percent\" : 50.0,\n" + + " \"totalAmount\" : 1.5,\n" + + " \"basisAmount\" : 3.0,\n" + + " \"taxPercent\" : 0,\n" + + " \"reason\" : \"In love with salesperson\",\n" + + " \"categoryCode\" : \"S\"\n" + + " } ],\n" + + " \"value\" : 3.0,\n" + + " \"calculation\" : {\n" + + " \"price\" : 3.0,\n" + + " \"priceGross\" : 3.0,\n" + + " \"itemTotalNetAmount\" : 1.5,\n" + + " \"itemTotalVATAmount\" : 0.285,\n" + + " \"itemTotalGrossAmount\" : 1.5\n" + + " }\n" + + " }, {\n" + + " \"price\" : 3.0,\n" + + " \"quantity\" : 2.0,\n" + + " \"basisQuantity\" : 1.0,\n" + + " \"id\" : \"3\",\n" + + " \"product\" : {\n" + + " \"unit\" : \"H87\",\n" + + " \"name\" : \"Testprodukt\",\n" + + " \"taxCategoryCode\" : \"S\",\n" + + " \"vatpercent\" : 19.0\n" + + " },\n" + + " \"itemCharges\" : [ {\n" + + " \"totalAmount\" : 1.0,\n" + + " \"taxPercent\" : 0,\n" + + " \"reason\" : \"AnotherReason\",\n" + + " \"categoryCode\" : \"S\"\n" + + " } ],\n" + + " \"value\" : 3.0,\n" + + " \"calculation\" : {\n" + + " \"price\" : 3.0,\n" + + " \"priceGross\" : 3.0,\n" + + " \"itemTotalNetAmount\" : 7.0,\n" + + " \"itemTotalVATAmount\" : 1.33,\n" + + " \"itemTotalGrossAmount\" : 7.0\n" + + " }\n" + + " }, {\n" + + " \"price\" : 3.0,\n" + + " \"quantity\" : 1.0,\n" + + " \"basisQuantity\" : 1.0,\n" + + " \"id\" : \"4\",\n" + + " \"product\" : {\n" + + " \"unit\" : \"H87\",\n" + + " \"name\" : \"Testprodukt\",\n" + + " \"taxCategoryCode\" : \"S\",\n" + + " \"vatpercent\" : 19.0\n" + + " },\n" + + " \"itemAllowances\" : [ {\n" + + " \"totalAmount\" : 1.0,\n" + + " \"taxPercent\" : 0,\n" + + " \"reason\" : \"Something completely strange\",\n" + + " \"categoryCode\" : \"S\"\n" + + " } ],\n" + + " \"itemCharges\" : [ {\n" + + " \"totalAmount\" : 1.0,\n" + + " \"taxPercent\" : 0,\n" + + " \"reason\" : \"Yet another reason\",\n" + + " \"categoryCode\" : \"S\"\n" + + " } ],\n" + + " \"value\" : 3.0,\n" + + " \"calculation\" : {\n" + + " \"price\" : 3.0,\n" + + " \"priceGross\" : 3.0,\n" + + " \"itemTotalNetAmount\" : 3.0,\n" + + " \"itemTotalVATAmount\" : 0.57,\n" + + " \"itemTotalGrossAmount\" : 3.0\n" + + " }\n" + + " } ],\n" + + " \"zfcharges\" : [ {\n" + + " \"totalAmount\" : 1.0,\n" + + " \"taxPercent\" : 19.0,\n" + + " \"reason\" : \"AReason\",\n" + + " \"reasonCode\" : \"ABK\",\n" + + " \"categoryCode\" : \"S\"\n" + + " } ]\n" + + "}",jsonArray,true); } catch (IOException e) { fail("IOException not expected"); } catch (XPathExpressionException e) {