diff --git a/History.md b/History.md index 16a492f5..dc7128ab 100644 --- a/History.md +++ b/History.md @@ -1,7 +1,41 @@ -- 481 -- 494 -- 391 -- 491 +2.15.0 +======= +2024- +- 435 use invoiceimporter as common technical basis also for zugferdimporter +- also import delivery address +- 527 metrics may raise error on some pdf files +- 517 read product GlobalID +- 380 Added test for input stream validation +- 518 corrently validate more XRechnung versions +- make document charges and allowances serializable +- 523 Verapdf claims PDF-A/3s created witth visualize are invalid +- 530 duedate can not be set directly +- 532 support validation warnings! +- 534 new signature +- 538 Mustang validator always claims PDF is invalid if flavour is PDF/A-3A +- 555 be able to validate ubl credit notes +- when parsing now distinguishing between the parseExceptions StructureException and ArithmetricException + + +2.14.2 +======= +2024-10-14 + +- also parse BICs in InvoiceImporter not only IBANs +- #509 CLI currently does not write a logfile +- #505 crash after invoking ZUGFeRD2PullProvider +- #506 Fix POM missing dependencies + +2.14.1 +======= +2024-10-06 + +- #481 also be able to convert XRechnung/UBL to PDF not only CII +- #494 Quantity/Price Decimal Places +- #391 Runden bei Negativwerten +- #491/501 non terminating decimal expansion +- upgraded en16931 cen schematron to 1.3.12 +- #499/500 PDF layout corrections 2.14.0 ======= diff --git a/Mustang-CLI/pom.xml b/Mustang-CLI/pom.xml index 3ea82b7d..1c108da5 100644 --- a/Mustang-CLI/pom.xml +++ b/Mustang-CLI/pom.xml @@ -35,11 +35,30 @@ 1.8.0 + + + + ch.qos.logback + logback-classic + 1.2.13 + + + ch.qos.logback + logback-core + 1.2.13 + + + + org.codehaus.janino + janino + 3.1.7 + org.slf4j slf4j-simple 2.0.12 + org.junit.jupiter diff --git a/Mustang-CLI/src/test/java/org/mustangproject/commandline/CliIT.java b/Mustang-CLI/src/test/java/org/mustangproject/commandline/CliIT.java index 73c35cd0..a6cf0bd9 100644 --- a/Mustang-CLI/src/test/java/org/mustangproject/commandline/CliIT.java +++ b/Mustang-CLI/src/test/java/org/mustangproject/commandline/CliIT.java @@ -1,8 +1,6 @@ package org.mustangproject.commandline; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -10,18 +8,43 @@ import java.nio.file.Paths; import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.Test; public class CliIT { + public static File getResourceAsFile(String resourcePath) { + try { + InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); + if (in == null) { + return null; + } + + File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp"); + tempFile.deleteOnExit(); + + try (FileOutputStream out = new FileOutputStream(tempFile)) { + // copy stream + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + return tempFile; + } catch (IOException e) { + return null; + } + } + @Test public void testCii2Ubl() throws Exception { Path output = Paths.get("target/ubl.xml"); Files.deleteIfExists(output); Path jar = Files.newDirectoryStream(Paths.get("target"), "Mustang-CLI-*.jar").iterator().next(); ProcessBuilder pb = new ProcessBuilder("java", "-jar", jar.toString(), - "--action", "ubl", "--source", "src/test/resources/cii.xml", "--out", - output.toString()); + "--action", "ubl", "--source", "src/test/resources/cii.xml", "--out", + output.toString()); pb.redirectErrorStream(true); Process process = pb.start(); String result = getOutput(process); @@ -43,4 +66,17 @@ public class CliIT { return builder.toString(); } + @Test + public void testMetric() { + StatRun sr = new StatRun(); + File tempFile = getResourceAsFile("corrupt-factur-x-waytoosmall.pdf"); + + FileChecker fc = new FileChecker(tempFile.getAbsolutePath(), sr); + + fc.checkForZUGFeRD(); + System.out.print(fc.getOutputLine()); + + + } + } diff --git a/Mustang-CLI/src/test/resources/corrupt-factur-x-waytoosmall.pdf b/Mustang-CLI/src/test/resources/corrupt-factur-x-waytoosmall.pdf new file mode 100644 index 00000000..672888d1 --- /dev/null +++ b/Mustang-CLI/src/test/resources/corrupt-factur-x-waytoosmall.pdf @@ -0,0 +1,2 @@ +%PDF-1.4 +%ª«¬­ diff --git a/library/pom.xml b/library/pom.xml index ccdde504..a6e875df 100644 --- a/library/pom.xml +++ b/library/pom.xml @@ -64,7 +64,8 @@ net.sf.saxon Saxon-HE 12.4 - + + com.fasterxml.jackson.core jackson-databind @@ -74,7 +75,7 @@ org.apache.xmlgraphics fop - 2.9 + 2.10 xml-apis @@ -82,18 +83,24 @@ - + jakarta.xml.bind jakarta.xml.bind-api 4.0.2 - + + + org.glassfish.jaxb + jaxb-runtime + 4.0.5 + + org.eclipse.angus angus-activation 2.0.2 - + org.apache.pdfbox preflight @@ -104,11 +111,20 @@ pdfbox 3.0.2 + org.dom4j dom4j 2.1.4 + + + com.helger + en16931-cii2ubl + 2.2.4 + + + org.junit.jupiter junit-jupiter-api @@ -121,27 +137,12 @@ 5.10.2 test - - - - com.helger - en16931-cii2ubl - 2.2.4 - - - - org.glassfish.jaxb - jaxb-runtime - 4.0.5 - - org.xmlunit xmlunit-core 2.10.0 test - org.xmlunit xmlunit-assertj @@ -232,11 +233,9 @@ maven-shade-plugin 3.5.3 - true - false - + true + false - *:* @@ -245,18 +244,6 @@ META-INF/*.RSA - - log4j:log4j - - ** - - - - commons-logging:commons-logging - - ** - - @@ -265,15 +252,6 @@ shade - - - - - - - diff --git a/library/src/main/java/org/mustangproject/Allowance.java b/library/src/main/java/org/mustangproject/Allowance.java index df117e2b..9c26d02e 100644 --- a/library/src/main/java/org/mustangproject/Allowance.java +++ b/library/src/main/java/org/mustangproject/Allowance.java @@ -1,5 +1,7 @@ package org.mustangproject; +import com.fasterxml.jackson.annotation.JsonIgnore; + import java.math.BigDecimal; /*** @@ -28,6 +30,7 @@ public class Allowance extends Charge { * @return false since its not supposed to be calculated negatively */ @Override + @JsonIgnore public boolean isCharge() { return false; } diff --git a/library/src/main/java/org/mustangproject/CalculatedInvoice.java b/library/src/main/java/org/mustangproject/CalculatedInvoice.java new file mode 100644 index 00000000..729d0f9b --- /dev/null +++ b/library/src/main/java/org/mustangproject/CalculatedInvoice.java @@ -0,0 +1,30 @@ +// Copyright (c) 2023 Jochen Stärk, see LICENSE file +package org.mustangproject; + + +import org.mustangproject.ZUGFeRD.TransactionCalculator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.math.BigDecimal; + +public class CalculatedInvoice extends Invoice implements Serializable { + + protected BigDecimal grandTotal=null; + + public void calculate() { + TransactionCalculator tc=new TransactionCalculator(this); + grandTotal=tc.getGrandTotal(); + } + public BigDecimal getGrandTotal() { + if (grandTotal==null) { + calculate(); + } + return grandTotal; + } + public CalculatedInvoice setGrandTotal(BigDecimal grand) { + grandTotal=grand; + return this; + } +} diff --git a/library/src/main/java/org/mustangproject/Charge.java b/library/src/main/java/org/mustangproject/Charge.java index a16f5e66..0e081397 100644 --- a/library/src/main/java/org/mustangproject/Charge.java +++ b/library/src/main/java/org/mustangproject/Charge.java @@ -1,5 +1,6 @@ package org.mustangproject; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.mustangproject.ZUGFeRD.IAbsoluteValueProvider; import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge; @@ -151,6 +152,7 @@ public class Charge implements IZUGFeRDAllowanceCharge { * @return true since it is supposed to be calculated negatively */ @Override + @JsonIgnore public boolean isCharge() { return true; } diff --git a/library/src/main/java/org/mustangproject/Exceptions/ArithmetricException.java b/library/src/main/java/org/mustangproject/Exceptions/ArithmetricException.java new file mode 100644 index 00000000..de063e81 --- /dev/null +++ b/library/src/main/java/org/mustangproject/Exceptions/ArithmetricException.java @@ -0,0 +1,13 @@ +package org.mustangproject.Exceptions; + +import java.text.ParseException; + +/*** + * will be thrown if a invoice cant be reproduced numerically + */ +public class ArithmetricException extends ParseException { + public ArithmetricException() { + super( + "Could not reproduce the invoice, this could mean that it could not be read properly", 0); + } +} diff --git a/library/src/main/java/org/mustangproject/Exceptions/StructureException.java b/library/src/main/java/org/mustangproject/Exceptions/StructureException.java new file mode 100644 index 00000000..1859da7a --- /dev/null +++ b/library/src/main/java/org/mustangproject/Exceptions/StructureException.java @@ -0,0 +1,12 @@ +package org.mustangproject.Exceptions; + +import java.text.ParseException; + +/*** + * will be thrown if a invoice cant be read + */ +public class StructureException extends ParseException { + public StructureException(String message, int line) { + super(message, line); + } +} diff --git a/library/src/main/java/org/mustangproject/Invoice.java b/library/src/main/java/org/mustangproject/Invoice.java index 8461e977..346c5f43 100644 --- a/library/src/main/java/org/mustangproject/Invoice.java +++ b/library/src/main/java/org/mustangproject/Invoice.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import com.fasterxml.jackson.annotation.JsonInclude; import org.mustangproject.ZUGFeRD.*; import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants; @@ -37,6 +38,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; * @see IExportableTransaction if you want to implement an interface instead */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class Invoice implements IExportableTransaction { protected String documentName = null, documentCode = null, number = null, ownOrganisationFullPlaintextInfo = null, referenceNumber = null, shipToOrganisationID = null, shipToOrganisationName = null, shipToStreet = null, shipToZIP = null, shipToLocation = null, shipToCountry = null, buyerOrderReferencedDocumentID = null, invoiceReferencedDocumentID = null, buyerOrderReferencedDocumentIssueDateTime = null, ownForeignOrganisationID = null, ownOrganisationName = null, currency = null, paymentTermDescription = null; @@ -520,6 +522,20 @@ public class Invoice implements IExportableTransaction { } } + /*** + * this is wrong and only used from jackson + * @param iza + * @return + */ + public Invoice setZFAllowances(Allowance[] iza) { + Allowances=new ArrayList<>(); + + for (IZUGFeRDAllowanceCharge cz:iza) { + Allowances.add(cz); + } + return this; + } + @Override public IZUGFeRDAllowanceCharge[] getZFCharges() { @@ -530,6 +546,18 @@ public class Invoice implements IExportableTransaction { } } + /*** + * this is wrong and only used from jackson + * @param iza + * @return + */ + public Invoice setZFCharges(Charge[] iza) { + Charges=new ArrayList<>(); + for (IZUGFeRDAllowanceCharge cz:iza) { + Charges.add(cz); + } + return this; + } @Override public IZUGFeRDAllowanceCharge[] getZFLogisticsServiceCharges() { diff --git a/library/src/main/java/org/mustangproject/Item.java b/library/src/main/java/org/mustangproject/Item.java index 9f568a6d..d726ed08 100644 --- a/library/src/main/java/org/mustangproject/Item.java +++ b/library/src/main/java/org/mustangproject/Item.java @@ -1,6 +1,7 @@ package org.mustangproject; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import org.mustangproject.ZUGFeRD.IReferencedDocument; import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableItem; @@ -18,6 +19,7 @@ import java.util.Date; */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class Item implements IZUGFeRDExportableItem { protected BigDecimal price = BigDecimal.ZERO; protected BigDecimal quantity; @@ -314,7 +316,7 @@ public class Item implements IZUGFeRDExportableItem { /*** - * adds item level references along with their typecodes and issuerassignedIDs (contract ID, cost centre, ...) + * adds item level references along with their typecodes and issuerassignedIDs (contract ID, cost centre, ...) * @param doc the ReferencedDocument to add * @return fluent setter */ @@ -333,8 +335,8 @@ public class Item implements IZUGFeRDExportableItem { } return additionalReference.toArray(new IReferencedDocument[0]); } - - + + /*** * specify a item level delivery period * (apart from the document level delivery period, and the document level diff --git a/library/src/main/java/org/mustangproject/Product.java b/library/src/main/java/org/mustangproject/Product.java index 1da0292e..1263d593 100644 --- a/library/src/main/java/org/mustangproject/Product.java +++ b/library/src/main/java/org/mustangproject/Product.java @@ -1,6 +1,7 @@ package org.mustangproject; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import org.mustangproject.ZUGFeRD.IDesignatedProductClassification; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableProduct; import org.mustangproject.util.NodeMap; @@ -17,6 +18,8 @@ import java.util.Map; * describes a product, good or service used in an invoice item line */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) + public class Product implements IZUGFeRDExportableProduct { protected String unit, name, sellerAssignedID, buyerAssignedID; protected String description=""; diff --git a/library/src/main/java/org/mustangproject/TradeParty.java b/library/src/main/java/org/mustangproject/TradeParty.java index 46a457c5..871a0e82 100644 --- a/library/src/main/java/org/mustangproject/TradeParty.java +++ b/library/src/main/java/org/mustangproject/TradeParty.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.fasterxml.jackson.annotation.JsonInclude; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableTradeParty; import org.mustangproject.ZUGFeRD.IZUGFeRDLegalOrganisation; @@ -19,9 +20,10 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; * A organisation, i.e. usually a company */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class TradeParty implements IZUGFeRDExportableTradeParty { - protected String name, zip, street, location, country; + protected String name, zip, street, location, country, taxScheme; protected String taxID = null, vatID = null; protected String ID = null; protected String description = null; @@ -89,21 +91,46 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { } } - if (currentTopElementName.equals("PartyIdentification")) { + if (currentTopElementName.equals("PartyTaxScheme")) { + NodeList partyTaxScheme = party.item(partyIndex).getChildNodes(); + for (int partyTaxSchemeIndex = 0; partyTaxSchemeIndex < partyTaxScheme.getLength(); partyTaxSchemeIndex++) { + if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName() != null) { + if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("CompanyID")) { + setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent()); - NodeList partyName = party.item(partyIndex).getChildNodes(); - for (int partyNameIndex = 0; partyNameIndex < partyName.getLength(); partyNameIndex++) { - if (partyName.item(partyNameIndex).getLocalName() != null) { - if (partyName.item(partyNameIndex).getLocalName().equals("ID")) { - setID(partyName.item(partyNameIndex).getTextContent()); } - } - } + } } - // UBL only: formally it can have a name as well but BT27 party name *should* be stored in - // so overwrite if one exists + +// if (currentTopElementName.equals("PartyTaxScheme")) { +// NodeList partyTaxScheme = party.item(partyIndex).getChildNodes(); +// for (int partyTaxSchemeIndex = 0; partyTaxSchemeIndex < partyTaxScheme.getLength(); partyTaxSchemeIndex++) { +// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName() != null) { +// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("TaxScheme")) { +// NodeList taxScheme = partyTaxScheme.item(partyTaxSchemeIndex).getChildNodes(); +// for (int taxSchemeIndex = 0 ; taxSchemeIndex < taxScheme.getLength(); taxSchemeIndex++) { +// if (taxScheme.item(taxSchemeIndex).getLocalName() != null) { +// if(taxScheme.item(taxSchemeIndex).getLocalName().equals("ID")){ +// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("CompanyID")) { +// setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent()); +// } else { +// setVATID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent()); +// } +// } +// } +// } +// } +// +// } +// } +// } + /* + UBL only: formally it can have a name as well but BT27 party name *should* be stored in + so overwrite if one exists + */ + if (currentTopElementName.equals("PartyLegalEntity")) { NodeList legal = party.item(partyIndex).getChildNodes(); for (int legalChildIndex = 0; legalChildIndex < legal.getLength(); legalChildIndex++) { @@ -111,6 +138,9 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { if (legal.item(legalChildIndex).getLocalName().equals("RegistrationName")) { setName(legal.item(legalChildIndex).getTextContent()); } + if (legal.item(legalChildIndex).getLocalName().equals("CompanyLegalForm")) { + setDescription(legal.item(legalChildIndex).getTextContent()); + } } } } @@ -223,26 +253,27 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { } - if (currentUBLChild.equals("SpecifiedTaxRegistration")) { + if (currentUBLChild.equals("PartyTaxScheme")) { NodeList taxChilds = nodes.item(nodeIndex).getChildNodes(); for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) { if (taxChilds.item(taxChildIndex).getLocalName() != null) { - if ((taxChilds.item(taxChildIndex).getLocalName().equals("ID"))) { - if (taxChilds.item(taxChildIndex).getAttributes().getNamedItem("schemeID") != null) { - Node firstChild = taxChilds.item(taxChildIndex).getFirstChild(); - if (firstChild != null) { - if (taxChilds.item(taxChildIndex).getAttributes().getNamedItem("schemeID").getNodeValue().equals("VA")) { - setVATID(firstChild.getNodeValue()); + if ((taxChilds.item(taxChildIndex).getLocalName().equals("TaxScheme"))) { + if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) { + if (taxChilds.item(taxChildIndex).getLocalName().equals("ID")) { + if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) { + setVATID(taxChilds.item(taxChildIndex).getTextContent()); } - if (taxChilds.item(taxChildIndex).getAttributes().getNamedItem("schemeID").getNodeValue().equals("FC")) { - setTaxID(firstChild.getNodeValue()); +// setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent()); + if (taxChilds.item(taxChildIndex).getAttributes().getNamedItem("ID").getNodeValue().equals("FC")) { + if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) { + setTaxID(taxChilds.item(taxChildIndex).getTextContent()); + } } } } } } } - } } } @@ -324,7 +355,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { NodeList itemChilds = currentItemNode.getChildNodes(); for (int itemChildIndex = 0; itemChildIndex < itemChilds.getLength(); itemChildIndex++) { if (itemChilds.item(itemChildIndex).getLocalName() != null) { - if (itemChilds.item(itemChildIndex).getLocalName().equals("GlobalID")) { + if (itemChilds.item(itemChildIndex).getLocalName().equals("ID")) { setID(itemChilds.item(itemChildIndex).getTextContent()); } if (itemChilds.item(itemChildIndex).getLocalName().equals("Name")) { @@ -513,6 +544,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { return this; } + /** * (optional) * @@ -524,6 +556,14 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { return this; } + /** + * primarily for invoiceimporter and JSON + * @return the list of sepa mandates + */ + public List getDebitDetails() { + return debitDetails; + } + @Override public IZUGFeRDLegalOrganisation getLegalOrganisation() { return legalOrg; @@ -660,7 +700,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { @Override public String getCountry() { - return country; + return taxScheme; } /*** @@ -669,7 +709,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { * @return fluent setter */ public TradeParty setCountry(String country) { - this.country = country; + this.taxScheme = country; return this; } @@ -683,6 +723,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty { return contact; } + @JsonIgnore public IZUGFeRDTradeSettlement[] getAsTradeSettlement() { if (bankDetails.isEmpty() && debitDetails.isEmpty()) { return null; diff --git a/library/src/main/java/org/mustangproject/XMLTools.java b/library/src/main/java/org/mustangproject/XMLTools.java index 8ee9fe5a..dbccd4b0 100644 --- a/library/src/main/java/org/mustangproject/XMLTools.java +++ b/library/src/main/java/org/mustangproject/XMLTools.java @@ -4,9 +4,13 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.Date; import org.apache.commons.io.IOUtils; import org.dom4j.io.XMLWriter; +import org.mustangproject.ZUGFeRD.ZUGFeRDDateFormat; +import org.w3c.dom.Node; public class XMLTools extends XMLWriter { @Override @@ -21,7 +25,7 @@ public class XMLTools extends XMLWriter { public static String nDigitFormat(BigDecimal value, int scale) { /* - * I needed 123,45, locale independent.I tried + * I needed 123.45, locale independent.I tried * NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is locale * specific.I also tried DecimalFormat df = new DecimalFormat( "0,00" ); * df.setDecimalSeparatorAlwaysShown(true); df.setGroupingUsed(false); @@ -39,6 +43,105 @@ public class XMLTools extends XMLWriter { } + /** + * returns the value of an node + * + * @param node the Node to get the value from + * @return A String or empty String, if no value was found + */ + public static String getNodeValue(Node node) { + if (node != null && node.getFirstChild() != null) { + return node.getFirstChild().getNodeValue(); + } + return ""; + } + + + /** + * tries to convert a String to BigDecimal. + * + * @param nodeValue The value as String + * @return a BigDecimal with the value provides as String or a BigDecimal with value 0.00 if an error occurs + */ + public static BigDecimal tryBigDecimal(String nodeValue) { + try { + return new BigDecimal(nodeValue); + } catch (final Exception e) { + try { + return BigDecimal.valueOf(Float.valueOf(nodeValue)); + } catch (final Exception ex) { + return new BigDecimal("0.00"); + } + } + } + + + /** + * tries to convert a Node to a BigDecimal. + * + * @param node The value as String + * @return a BigDecimal with the value provides as String or a BigDecimal with value 0.00 if an error occurs + */ + public static BigDecimal tryBigDecimal(Node node) { + final String nodeValue = XMLTools.getNodeValue(node); + if (nodeValue.isEmpty()) { + return null; + } + return XMLTools.tryBigDecimal(nodeValue); + } + /*** + * formats a number so that at least minDecimals are displayed but at the maximum maxDecimals are there, i.e. + * cuts potential 0s off the end until minDecimals + * @param value + * @param maxDecimals number of maximal scale + * @param minDecimals number of minimal scale + * @return value as String with decimals in the specified range + */ + public static String nDigitFormatDecimalRange(BigDecimal value, int maxDecimals, int minDecimals) { + if ((maxDecimalsminDecimals) && (value.setScale(curDecimals, RoundingMode.HALF_UP).compareTo(value.setScale(curDecimals-1, RoundingMode.HALF_UP))==0)) { + curDecimals--; + } + return value.setScale(curDecimals, RoundingMode.HALF_UP).toPlainString(); + + } + + + /*** + * returns a util.Date from a 102 String yyyymmdd in a node + * @param node the node + * @return a util.Date, or null, if not parseable + */ + public static Date tryDate(Node node) { + final String nodeValue = XMLTools.getNodeValue(node); + if (nodeValue.isEmpty()) { + return null; + } + return tryDate(nodeValue); + } + + /*** + * returns a util.Date from a 102 String yyyymmdd + * @param toParse the string + * @return a util.Date, or null, if not parseable + */ + public static Date tryDate(String toParse) { + final SimpleDateFormat formatter = ZUGFeRDDateFormat.DATE.getFormatter(); + try { + return formatter.parse(toParse); + } catch (final Exception e) { + return null; + } + } + + /*** + * relplaces some entities like < , > and & with their escaped pendant like < + * @param s the string + * @return the "safe" string + */ public static String encodeXML(CharSequence s) { if (s == null) { return ""; @@ -111,4 +214,16 @@ public class XMLTools extends XMLWriter { return IOUtils.toByteArray (fileinput); } + + public static String trimOrNull(Node node) { + if (node != null) { + String textContent = node.getTextContent(); + if (textContent != null) { + return textContent.trim(); + } + } + 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 3dbe1091..f3e8aa2d 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/LineCalculator.java @@ -34,13 +34,17 @@ public class LineCalculator { } } - BigDecimal vatPercent = currentItem.getProduct().getVATPercent(); - if (vatPercent == null) + BigDecimal vatPercent = null; + if (currentItem.getProduct()!=null) { + vatPercent = currentItem.getProduct().getVATPercent(); + } + if (vatPercent == null) { vatPercent = BigDecimal.ZERO; + } BigDecimal multiplicator = vatPercent.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(), RoundingMode.HALF_UP) + itemTotalNetAmount = currentItem.getQuantity().multiply(getPrice()).divide(currentItem.getBasisQuantity(), 18, RoundingMode.HALF_UP) .subtract(allowanceItemTotal).setScale(2, RoundingMode.HALF_UP); itemTotalVATAmount = itemTotalNetAmount.multiply(multiplicator); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java index c7557f9f..03ed3099 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRD2PullProvider.java @@ -76,11 +76,13 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } protected String priceFormat(BigDecimal value) { - return XMLTools.nDigitFormat(value, 18); + // 18 decimals are max for price and qty due to xml restrictions, + // see Chapter 3.2.3 of https://www.w3.org/TR/xmlschema-2/ + return XMLTools.nDigitFormatDecimalRange(value, 18, 4); } protected String quantityFormat(BigDecimal value) { - return XMLTools.nDigitFormat(value, 18); + return XMLTools.nDigitFormatDecimalRange(value, 18, 4); } @Override @@ -332,7 +334,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { this.trans = trans; this.calc = new TransactionCalculator(trans); - boolean hasDueDate = false; + boolean hasDueDate = trans.getDueDate()!=null; final SimpleDateFormat germanDateFormat = new SimpleDateFormat("dd.MM.yyyy"); String exemptionReason = ""; @@ -816,7 +818,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } } - if ((trans.getPaymentTerms() == null) && (getProfile() != Profiles.getByName("Minimum")) && ((paymentTermsDescription != null) || (trans.getTradeSettlement() != null) || (hasDueDate))) { xml += ""; @@ -832,7 +833,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider { } } - if (hasDueDate && (trans.getDueDate() != null)) { + if (trans.getDueDate() != null) { xml += "" // $NON-NLS-2$ + DATE.udtFormat(trans.getDueDate()) + "";// 20130704 diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 4016e2a1..cebeb824 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -13,92 +13,34 @@ package org.mustangproject.ZUGFeRD; * @version 1.1.0 * @author jstaerk */ - import java.io.*; -import java.math.BigDecimal; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; import java.text.SimpleDateFormat; import java.util.*; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary; -import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; -import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; -import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; -import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; import org.mustangproject.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -public class ZUGFeRDImporter { +public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter { private static final Logger LOGGER = LoggerFactory.getLogger(ZUGFeRDImporter.class); - /** - * if metadata has been found - */ - protected boolean containsMeta = false; - /** - * map filenames of additional XML files to their contents - */ - private final HashMap additionalXMLs = new HashMap<>(); - /** - * map filenames of all embedded files in the respective PDF - */ - private final ArrayList PDFAttachments = new ArrayList<>(); - /** - * Raw XML form of the extracted data - may be directly obtained. - */ - private byte[] rawXML = null; - /** - * XMP metadata - */ - private String xmpString = null; // XMP metadata - /** - * parsed Document - */ - private Document document; - private Integer version; - - - protected ZUGFeRDImporter() { - //constructor for extending classes + public ZUGFeRDImporter() { + super(); } - public ZUGFeRDImporter(String pdfFilename) { - try (InputStream bis = Files.newInputStream(Paths.get(pdfFilename), StandardOpenOption.READ)) { - extractLowLevel(bis); - } catch (final IOException e) { - LOGGER.error("Failed to extract ZUGFeRD data", e); - throw new ZUGFeRDExportException(e); - } + public ZUGFeRDImporter(String filename) { + super(filename); } - - public ZUGFeRDImporter(InputStream pdfStream) { - try { - extractLowLevel(pdfStream); - } catch (final IOException e) { - LOGGER.error("Failed to extract ZUGFeRD data", e); - throw new ZUGFeRDExportException(e); - } + public ZUGFeRDImporter(InputStream stream) { + super(stream); } @@ -113,169 +55,21 @@ public class ZUGFeRDImporter { - /** - * Extracts a ZUGFeRD invoice from a PDF document represented by an input stream. Errors are reported via exception handling. - * - * @param inStream a inputstream of a pdf file - */ - private void extractLowLevel(InputStream inStream) throws IOException { - BufferedInputStream pdfStream = new BufferedInputStream(inStream); - byte[] pad = new byte[4]; - pdfStream.mark(0); - pdfStream.read(pad); - pdfStream.reset(); - byte[] pdfSignature = {'%', 'P', 'D', 'F'}; - if (Arrays.equals(pad, pdfSignature)) { // we have a pdf - - - try (PDDocument doc = Loader.loadPDF(IOUtils.toByteArray(pdfStream))) { - // PDDocumentInformation info = doc.getDocumentInformation(); - final PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog()); - //start - - if (doc.getDocumentCatalog() == null || doc.getDocumentCatalog().getMetadata() == null) { - LOGGER.info("no-xmlpart"); - return; - } - - final InputStream XMP = doc.getDocumentCatalog().getMetadata().exportXMPMetadata(); - xmpString = convertStreamToString(XMP); - - final PDEmbeddedFilesNameTreeNode etn = names.getEmbeddedFiles(); - if (etn == null) { - return; - } - - final Map efMap = etn.getNames(); - // String filePath = "/tmp/"; - - if (efMap != null) { - extractFiles(efMap); // see - // https://memorynotfound.com/apache-pdfbox-extract-embedded-file-pdf-document/ - } else { - - final List> kids = etn.getKids(); - if (kids == null) { - return; - } - for (final PDNameTreeNode node : kids) { - final Map namesL = node.getNames(); - extractFiles(namesL); - } - } - } - } else { - // no PDF probably XML - containsMeta = true; - setRawXML(XMLTools.getBytesFromStream(pdfStream)); - - } - } - - - private void extractFiles(Map names) throws IOException { - for (final String alias : names.keySet()) { - - final PDComplexFileSpecification fileSpec = names.get(alias); - final String filename = fileSpec.getFilename(); - /** - * filenames for invoice data (ZUGFeRD v1 and v2, Factur-X) - */ - - final PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); - if ((filename.equals("ZUGFeRD-invoice.xml") || (filename.equals("zugferd-invoice.xml")) || filename.equals("factur-x.xml")) || filename.equals("xrechnung.xml") || filename.equals("order-x.xml") || filename.equals("cida.xml")) { - containsMeta = true; - - // String embeddedFilename = filePath + filename; - // File file = new File(filePath + filename); - // System.out.println("Writing " + embeddedFilename); - // ByteArrayOutputStream fileBytes=new - // ByteArrayOutputStream(); - // FileOutputStream fos = new FileOutputStream(file); - - setRawXML(embeddedFile.toByteArray()); - - // fos.write(embeddedFile.getByteArray()); - // fos.close(); - } - if (filename.startsWith("additional_data")) { - additionalXMLs.put(filename, embeddedFile.toByteArray()); - } - PDFAttachments.add(new FileAttachment(filename, embeddedFile.getSubtype(), "Data", embeddedFile.toByteArray())); - } - } - - - protected Document getDocument() { - return document; - } - - - private void setDocument() throws ParserConfigurationException, IOException, SAXException { - final DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); - xmlFact.setNamespaceAware(true); - final DocumentBuilder builder = xmlFact.newDocumentBuilder(); - final ByteArrayInputStream is = new ByteArrayInputStream(rawXML); - /// is.skip(guessBOMSize(is)); - document = builder.parse(is); - } - - - public void setRawXML(byte[] rawXML) throws IOException { - this.containsMeta = true; - this.rawXML = rawXML; - this.version = null; - try { - setDocument(); - } catch (ParserConfigurationException | SAXException e) { - LOGGER.error("Failed to parse XML", e); - throw new ZUGFeRDExportException(e); - } - } - - - protected String extractString(String xpathStr) { - if (!containsMeta) { - throw new ZUGFeRDExportException("No suitable data/ZUGFeRD file could be found."); - } - final String result; - try { - final Document document = getDocument(); - final XPathFactory xpathFact = XPathFactory.newInstance(); - final XPath xpath = xpathFact.newXPath(); - result = xpath.evaluate(xpathStr, document); - } catch (final XPathExpressionException e) { - LOGGER.error("Failed to evaluate XPath", e); - throw new ZUGFeRDExportException(e); - } - return result; - } - - /*** - * Wrapper for protected method extractString - * @param xpathStr the xpath expression to be evaluated - * @return the extracted String for the specific path in the document - */ - public String wExtractString(String xpathStr) { - return extractString(xpathStr); - } - + //////////////////////////////////// /** * @return the reference (purpose) the sender specified for this invoice */ public String getForeignReference() { - String result = extractString("//*[local-name() = 'ApplicableHeaderTradeSettlement']/*[local-name() = 'PaymentReference']"); - if (result == null || result.isEmpty()) { - result = extractString("//*[local-name() = 'ApplicableSupplyChainTradeSettlement']/*[local-name() = 'PaymentReference']"); - } - return result; + + return importedInvoice.getNumber(); } /** * @return the ZUGFeRD Profile */ public String getZUGFeRDProfil() { + String guideline = extractString("//*[local-name() = 'GuidelineSpecifiedDocumentContextParameter']//*[local-name() = 'ID']"); if (guideline.contains("xrechnung")) { return "XRECHNUNG"; @@ -299,21 +93,6 @@ public class ZUGFeRDImporter { } } - /** - * @return the Invoice Currency Code - */ - public String getInvoiceCurrencyCode() { - try { - if (getVersion() == 1) { - return extractString("//*[local-name() = 'ApplicableSupplyChainTradeSettlement']//*[local-name() = 'InvoiceCurrencyCode']"); - } else { - return extractString("//*[local-name() = 'ApplicableHeaderTradeSettlement']//*[local-name() = 'InvoiceCurrencyCode']"); - } - } catch (final Exception e) { - // Exception was already logged - return ""; - } - } /** * @return the IssuerAssigned ID @@ -336,57 +115,6 @@ public class ZUGFeRDImporter { return extractIssuerAssignedID("ContractReferencedDocument"); } - private String extractIssuerAssignedID(String propertyName) { - try { - if (getVersion() == 1) { - return extractString("//*[local-name() = '" + propertyName + "']//*[local-name() = 'ID']"); - } else { - return extractString("//*[local-name() = '" + propertyName + "']//*[local-name() = 'IssuerAssignedID']"); - } - } catch (final Exception e) { - // Exception was already logged - return ""; - } - } - - /** - * @return the BuyerTradeParty ID - */ - public String getBuyerTradePartyID() { - return extractString("//*[local-name() = 'BuyerTradeParty']//*[local-name() = 'ID']"); - } - - /** - * @return the Issue Date() - */ - public String getIssueDate() { - try { - if (getVersion() == 1) { - return extractString("//*[local-name() = 'HeaderExchangedDocument']//*[local-name() = 'IssueDateTime']//*[local-name() = 'DateTimeString']"); - } else { - return extractString("//*[local-name() = 'ExchangedDocument']//*[local-name() = 'IssueDateTime']//*[local-name() = 'DateTimeString']"); - } - } catch (final Exception e) { - // Exception was already logged - return ""; - } - } - - public Date getDetailedDeliveryPeriodFrom() { - final String toParse = extractString( - "//*[local-name() = 'ApplicableHeaderTradeSettlement']" + - "//*[local-name() = 'BillingSpecifiedPeriod']" + - "//*[local-name() = 'StartDateTime']//*[local-name() = 'DateTimeString']"); - return tryDate(toParse); - } - - public Date getDetailedDeliveryPeriodTo() { - final String toParse = extractString( - "//*[local-name() = 'ApplicableHeaderTradeSettlement']" + - "//*[local-name() = 'BillingSpecifiedPeriod']" + - "//*[local-name() = 'EndDateTime']//*[local-name() = 'DateTimeString']"); - return tryDate(toParse); - } /** * @return the TaxBasisTotalAmount @@ -470,7 +198,16 @@ public class ZUGFeRDImporter { * @return the BuyerTradeParty SpecifiedTaxRegistration ID */ public String getBuyertradePartySpecifiedTaxRegistrationID() { - return extractString("//*[local-name() = 'BuyerTradeParty']//*[local-name() = 'SpecifiedTaxRegistration']//*[local-name() = 'ID']"); + String id = null; + if ((importedInvoice.getRecipient()!=null) && (importedInvoice.getRecipient().getLegalOrganisation()!=null)) { + // this *should* be the official result + id = importedInvoice.getRecipient().getLegalOrganisation().getSchemedID().getID(); + } + // but also provide some fallback + if (id == null) { + id = getBuyerTradePartyID(); + } + return id; } @@ -494,14 +231,14 @@ public class ZUGFeRDImporter { * @return the BuyerTradeParty Name */ public String getBuyerTradePartyName() { - return extractString("//*[local-name() = 'BuyerTradeParty']//*[local-name() = 'Name']"); + return importedInvoice.getRecipient().getName(); } /** * @return the BuyerTradeParty Name */ public String getDeliveryTradePartyName() { - return extractString("//*[local-name() = 'ShipToTradeParty']//*[local-name() = 'Name']"); + return importedInvoice.getDeliveryAddress().getName(); } @@ -548,16 +285,7 @@ public class ZUGFeRDImporter { * @return the Invoice ID */ public String getInvoiceID() { - try { - if (getVersion() == 1) { - return extractString("//*[local-name() = 'HeaderExchangedDocument']//*[local-name() = 'ID']"); - } else { - return extractString("//*[local-name() = 'ExchangedDocument']//*[local-name() = 'ID']"); - } - } catch (final Exception e) { - // Exception was already logged - return ""; - } + return importedInvoice.getNumber(); } @@ -615,11 +343,21 @@ public class ZUGFeRDImporter { * @return the sender's account IBAN code */ public String getIBAN() { - return extractString("//*[local-name() = 'PayeePartyCreditorFinancialAccount']/*[local-name() = 'IBANID']"); + for (IZUGFeRDTradeSettlement settlement : importedInvoice.getTradeSettlement()) { + if (settlement instanceof IZUGFeRDTradeSettlementDebit) { + return ((IZUGFeRDTradeSettlementDebit) settlement).getIBAN(); + } + if (settlement instanceof IZUGFeRDTradeSettlementPayment) { + return ((IZUGFeRDTradeSettlementPayment) settlement).getOwnIBAN(); + } + } + return null; } public String getHolder() { + + return extractString("//*[local-name() = 'SellerTradeParty']/*[local-name() = 'Name']"); } @@ -628,14 +366,8 @@ public class ZUGFeRDImporter { * @return the total payable amount */ public String getAmount() { - String result = extractString("//*[local-name() = 'SpecifiedTradeSettlementHeaderMonetarySummation']/*[local-name() = 'DuePayableAmount']"); - if (result == null || result.isEmpty()) { - /* fx/zf would be SpecifiedTradeSettlementMonetarySummation - * but ox is SpecifiedTradeSettlementHeaderMonetarySummation...*/ - result = extractString("//*[local-name() = 'GrandTotalAmount']"); - } - return result; + return importedInvoice.getGrandTotal().toPlainString(); } @@ -643,7 +375,60 @@ public class ZUGFeRDImporter { * @return when the payment is due */ public String getDueDate() { - return extractString("//*[local-name() = 'SpecifiedTradePaymentTerms']/*[local-name() = 'DueDateDateTime']/*[local-name() = 'DateTimeString']"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + return sdf.format(importedInvoice.getDueDate()); + } + + + //////////////////// + + /** + * @return the Invoice Currency Code + */ + public String getInvoiceCurrencyCode() { + return importedInvoice.getCurrency(); + } + + + private String extractIssuerAssignedID(String propertyName) { + try { + if (getVersion() == 1) { + return extractString("//*[local-name() = '" + propertyName + "']//*[local-name() = 'ID']"); + } else { + return extractString("//*[local-name() = '" + propertyName + "']//*[local-name() = 'IssuerAssignedID']"); + } + } catch (final Exception e) { + // Exception was already logged + return ""; + } + } + + /** + * @return the BuyerTradeParty ID + */ + public String getBuyerTradePartyID() { + String id = importedInvoice.getRecipient().getID(); + if (id == null) { + // provide some fallback + id = importedInvoice.getRecipient().getVATID(); + } + return id; + } + + /** + * @return the Issue Date() + */ + public String getIssueDate() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + return sdf.format(importedInvoice.getIssueDate()); + } + + public Date getDetailedDeliveryPeriodFrom() { + return importedInvoice.getDetailedDeliveryPeriodFrom(); + } + + public Date getDetailedDeliveryPeriodTo() { + return importedInvoice.getDetailedDeliveryPeriodTo(); } @@ -691,28 +476,6 @@ public class ZUGFeRDImporter { } - public EStandard getStandard() throws Exception { - if (!containsMeta) { - throw new Exception("Not yet parsed"); - } - final String head = getUTF8(); - String rootNode = extractString("local-name(/*)"); - if (rootNode.equals("CrossIndustryDocument")) { - return EStandard.zugferd; - } else if (rootNode.equals("Invoice")) { - return EStandard.ubl; - } else if (rootNode.equals("CrossIndustryInvoice")) { - return EStandard.facturx; - } else if (rootNode.equals("SCRDMCCBDACIDAMessageStructure")) { - return EStandard.despatchadvice; - } else if (head.contains(" fileAttachments=new ArrayList<>(); + /** + * map filenames of additional XML files to their contents + */ + protected final HashMap additionalXMLs = new HashMap<>(); + /** + * map filenames of all embedded files in the respective PDF + */ + protected final ArrayList PDFAttachments = new ArrayList<>(); + /** + * if metadata has been found + */ + protected boolean containsMeta = false; + /** + * Raw XML form of the extracted data - may be directly obtained. + */ + protected byte[] rawXML = null; + /** + * XMP metadata + */ + protected String xmpString = null; // XMP metadata + /** + * parsed Document + */ + protected Document document; + /*** + * automatically parse into importedInvoice + */ + protected boolean parseAutomatically = true; + protected Integer version; + protected CalculatedInvoice importedInvoice = null; + protected boolean recalcPrice = false; + protected boolean ignoreCalculationErrors = false; + protected ArrayList fileAttachments = new ArrayList<>(); public ZUGFeRDInvoiceImporter() { - super(); + //constructor for extending classes } - public ZUGFeRDInvoiceImporter(String filename) { - super(filename); + public ZUGFeRDInvoiceImporter(String pdfFilename) { + setPDFFilename(pdfFilename); } - public ZUGFeRDInvoiceImporter(InputStream stream) { - super(stream); + public ZUGFeRDInvoiceImporter(InputStream pdfStream) { + setInputStream(pdfStream); } - public void fromXML(String XML) { - try { - containsMeta = true; - setRawXML(XML.getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - LOGGER.error(e.getMessage(), e); + public void setPDFFilename(String pdfFilename) { + try (InputStream bis = Files.newInputStream(Paths.get(pdfFilename), StandardOpenOption.READ)) { + extractLowLevel(bis); + } catch (final IOException e) { + LOGGER.error("Failed to extract ZUGFeRD data", e); + throw new ZUGFeRDExportException(e); } } + public void setInputStream(InputStream pdfStream) { + try { + extractLowLevel(pdfStream); + } catch (final IOException e) { + LOGGER.error("Failed to extract ZUGFeRD data", e); + throw new ZUGFeRDExportException(e); + } + } + + /*** + * return the file names of all files embedded into the PDF + * @see for XML embedded files please use ZUGFeRDInvoiceImporter.getFileAttachmentsXML + * @return a ArrayList of FileAttachments, empty if none + */ + public List getFileAttachmentsPDF() { + return PDFAttachments; + } + + /** + * Extracts a ZUGFeRD invoice from a PDF document represented by an input stream. Errors are reported via exception handling. + * + * @param inStream a inputstream of a pdf file + */ + private void extractLowLevel(InputStream inStream) throws IOException { + BufferedInputStream pdfStream = new BufferedInputStream(inStream); + byte[] pad = new byte[4]; + pdfStream.mark(0); + pdfStream.read(pad); + pdfStream.reset(); + byte[] pdfSignature = {'%', 'P', 'D', 'F'}; + if (Arrays.equals(pad, pdfSignature)) { // we have a pdf + + + try { + PDDocument doc = Loader.loadPDF(IOUtils.toByteArray(pdfStream)); + // PDDocumentInformation info = doc.getDocumentInformation(); + final PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog()); + //start + + if (doc.getDocumentCatalog() == null || doc.getDocumentCatalog().getMetadata() == null) { + LOGGER.info("no-xmlpart"); + return; + } + + final InputStream XMP = doc.getDocumentCatalog().getMetadata().exportXMPMetadata(); + + xmpString = new String(XMLTools.getBytesFromStream(XMP), StandardCharsets.UTF_8); + + final PDEmbeddedFilesNameTreeNode etn = names.getEmbeddedFiles(); + if (etn == null) { + return; + } + + final Map efMap = etn.getNames(); + // String filePath = "/tmp/"; + + if (efMap != null) { + extractFiles(efMap); // see + // https://memorynotfound.com/apache-pdfbox-extract-embedded-file-pdf-document/ + } else { + + final List> kids = etn.getKids(); + if (kids == null) { + return; + } + for (final PDNameTreeNode node : kids) { + final Map namesL = node.getNames(); + extractFiles(namesL); + } + } + } catch (Exception e) { + LOGGER.error("Failed to parse PDF", e); + //ignore otherwise + } + } else { + // no PDF probably XML + containsMeta = true; + setRawXML(XMLTools.getBytesFromStream(pdfStream)); + + } + } + + /*** + * have the item prices be determined from the line total. + * That's a workaround for some invoices which just put 0 as item price + */ + public void doRecalculateItemPricesFromLineTotals() { + recalcPrice = true; + } + + /*** + * do not raise ParseExceptions even if the reproduced invoice total does not match the given value + */ + public void doIgnoreCalculationErrors() { + ignoreCalculationErrors = true; + } + + /*** + * sets th pdf attachments, and if a file is recognized (e.g. a factur-x.xml) triggers processing + * @param names the Hashmap of String, PDComplexFileSpecification + * @throws IOException + */ + private void extractFiles(Map names) throws IOException { + for (final String alias : names.keySet()) { + + final PDComplexFileSpecification fileSpec = names.get(alias); + final String filename = fileSpec.getFilename(); + /** + * filenames for invoice data (ZUGFeRD v1 and v2, Factur-X) + */ + + final PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); + if ((filename.equals("ZUGFeRD-invoice.xml") || (filename.equals("zugferd-invoice.xml")) || filename.equals("factur-x.xml")) || filename.equals("xrechnung.xml") || filename.equals("order-x.xml") || filename.equals("cida.xml")) { + containsMeta = true; + + // String embeddedFilename = filePath + filename; + // File file = new File(filePath + filename); + // System.out.println("Writing " + embeddedFilename); + // ByteArrayOutputStream fileBytes=new + // ByteArrayOutputStream(); + // FileOutputStream fos = new FileOutputStream(file); + + setRawXML(embeddedFile.toByteArray()); + + // fos.write(embeddedFile.getByteArray()); + // fos.close(); + } + if (filename.startsWith("additional_data")) { + additionalXMLs.put(filename, embeddedFile.toByteArray()); + } + PDFAttachments.add(new FileAttachment(filename, embeddedFile.getSubtype(), "Data", embeddedFile.toByteArray())); + } + } + + /*** + * set the xml of a CII invoice + * @param rawXML the xml string + * @param doParse automatically parse input for zugferdImporter (not ZUGFeRDInvoiceImporter) + * @throws IOException + */ + public void setRawXML(byte[] rawXML, boolean doParse) throws IOException { + this.containsMeta = true; + this.rawXML = rawXML; + this.version = null; + parseAutomatically = doParse; + + try { + setDocument(); + } catch (ParserConfigurationException | SAXException e) { + LOGGER.error("Failed to parse XML", e); + throw new ZUGFeRDExportException(e); + } + + } + + /*** + * set the xml of a CII invoice, simple version + * @param rawXML the cii(?) as a string + * @throws IOException + */ + public void setRawXML(byte[] rawXML) throws IOException { + setRawXML(rawXML, true); + } + + private void setDocument() throws ParserConfigurationException, IOException, SAXException { + final DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); + xmlFact.setNamespaceAware(true); + final DocumentBuilder builder = xmlFact.newDocumentBuilder(); + final ByteArrayInputStream is = new ByteArrayInputStream(rawXML); + /// is.skip(guessBOMSize(is)); + document = builder.parse(is); + if (parseAutomatically) { + try { + importedInvoice = new CalculatedInvoice(); + extractInto(importedInvoice); + } catch (XPathExpressionException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + } /*** * This will parse a XML into the given invoice object @@ -63,6 +284,8 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { String number = ""; String typeCode = null; + String deliveryPeriodStart = null; + String deliveryPeriodEnd = null; /* * dummywerte sind derzeit noch setDueDate setIssueDate setDeliveryDate * setSender setRecipient setnumber bspw. due date @@ -72,6 +295,12 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { XPath xpath = xpathFact.newXPath(); XPathExpression xpr = xpath.compile("//*[local-name()=\"SellerTradeParty\"]|//*[local-name()=\"AccountingSupplierParty\"]/*"); NodeList SellerNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); + XPathExpression shipEx = xpath.compile("//*[local-name()=\"ShipToTradeParty\"]"); + NodeList deliveryNodes = (NodeList) shipEx.evaluate(getDocument(), XPathConstants.NODESET); + if (deliveryNodes != null) { + zpp.setDeliveryAddress(new TradeParty(deliveryNodes)); + } + xpr = xpath.compile("//*[local-name()=\"BuyerTradeParty\"]|//*[local-name()=\"AccountingCustomerParty\"]/*"); NodeList BuyerNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); @@ -86,13 +315,19 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { BigDecimal expectedGrandTotal = null; NodeList totalNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); if (totalNodes.getLength() > 0) { - expectedGrandTotal = new BigDecimal(totalNodes.item(0).getTextContent()); + expectedGrandTotal = new BigDecimal(XMLTools.trimOrNull(totalNodes.item(0))); + if (zpp instanceof CalculatedInvoice) { + // usually we would re-calculate the invoice to get expectedGrandTotal + // however, for "minimal" invoices or other invoices without lines + // this will not work + ((CalculatedInvoice) zpp).setGrandTotal(expectedGrandTotal); + } } xpr = xpath.compile("//*[local-name()=\"PrepaidAmount\"]"); NodeList prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); if (prepaidNodes.getLength() > 0) { - zpp.setTotalPrepaidAmount(new BigDecimal(prepaidNodes.item(0).getTextContent())); + zpp.setTotalPrepaidAmount(new BigDecimal(XMLTools.trimOrNull(prepaidNodes.item(0)))); } Date issueDate = null; @@ -100,24 +335,22 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { Date deliveryDate = null; String despatchAdviceReferencedDocument = null; for (int i = 0; i < ExchangedDocumentNodes.getLength(); i++) { - - // nodes.item(i).getTextContent())) { Node exchangedDocumentNode = ExchangedDocumentNodes.item(i); NodeList exchangedDocumentChilds = exchangedDocumentNode.getChildNodes(); for (int documentChildIndex = 0; documentChildIndex < exchangedDocumentChilds.getLength(); documentChildIndex++) { Node item = exchangedDocumentChilds.item(documentChildIndex); if ((item.getLocalName() != null) && (item.getLocalName().equals("ID"))) { - number = item.getTextContent(); + number = XMLTools.trimOrNull(item); } if ((item.getLocalName() != null) && (item.getLocalName().equals("TypeCode"))) { - typeCode = item.getTextContent(); + typeCode = XMLTools.trimOrNull(item); } if ((item.getLocalName() != null) && (item.getLocalName().equals("IssueDateTime"))) { NodeList issueDateTimeChilds = item.getChildNodes(); for (int issueDateChildIndex = 0; issueDateChildIndex < issueDateTimeChilds.getLength(); issueDateChildIndex++) { if ((issueDateTimeChilds.item(issueDateChildIndex).getLocalName() != null) && (issueDateTimeChilds.item(issueDateChildIndex).getLocalName().equals("DateTimeString"))) { - issueDate = new SimpleDateFormat("yyyyMMdd").parse(issueDateTimeChilds.item(issueDateChildIndex).getTextContent()); + issueDate = new SimpleDateFormat("yyyyMMdd").parse(XMLTools.trimOrNull(issueDateTimeChilds.item(issueDateChildIndex))); } } } @@ -127,6 +360,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { if (rootNode.equals("Invoice")) { // UBL... number = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"ID\"]").trim(); + typeCode = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"InvoiceTypeCode\"]").trim(); issueDate = new SimpleDateFormat("yyyy-MM-dd").parse(extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"IssueDate\"]").trim()); String dueDt = extractString("//*[local-name()=\"Invoice\"]/*[local-name()=\"DueDate\"]").trim(); if (dueDt.length() > 0) { @@ -141,7 +375,6 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { NodeList headerTradeDeliveryNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); for (int i = 0; i < headerTradeDeliveryNodes.getLength(); i++) { - // nodes.item(i).getTextContent())) { Node headerTradeDeliveryNode = headerTradeDeliveryNodes.item(i); NodeList headerTradeDeliveryChilds = headerTradeDeliveryNode.getChildNodes(); for (int deliveryChildIndex = 0; deliveryChildIndex < headerTradeDeliveryChilds.getLength(); deliveryChildIndex++) { @@ -155,7 +388,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { for (int occurenceChildIndex = 0; occurenceChildIndex < occurenceChilds.getLength(); occurenceChildIndex++) { if ((occurenceChilds.item(occurenceChildIndex).getLocalName() != null) && (occurenceChilds.item(occurenceChildIndex).getLocalName().equals("DateTimeString"))) { - deliveryDate = new SimpleDateFormat("yyyyMMdd").parse(occurenceChilds.item(occurenceChildIndex).getTextContent()); + deliveryDate = new SimpleDateFormat("yyyyMMdd").parse(XMLTools.trimOrNull(occurenceChilds.item(occurenceChildIndex))); } } } @@ -167,7 +400,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { for (int despatchAdviceChildIndex = 0; despatchAdviceChildIndex < despatchAdviceChilds.getLength(); despatchAdviceChildIndex++) { if (despatchAdviceChilds.item(despatchAdviceChildIndex).getLocalName() != null && despatchAdviceChilds.item(despatchAdviceChildIndex).getLocalName().equals("IssuerAssignedID")) { - despatchAdviceReferencedDocument = despatchAdviceChilds.item(despatchAdviceChildIndex).getTextContent(); + despatchAdviceReferencedDocument = XMLTools.trimOrNull(despatchAdviceChilds.item(despatchAdviceChildIndex)); } } } @@ -180,7 +413,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { String buyerOrderIssuerAssignedID = null; String sellerOrderIssuerAssignedID = null; for (int i = 0; i < headerTradeAgreementNodes.getLength(); i++) { - // nodes.item(i).getTextContent())) { + // XMLTools.trimOrNull(nodes.item(i)))) { Node headerTradeAgreementNode = headerTradeAgreementNodes.item(i); NodeList headerTradeAgreementChilds = headerTradeAgreementNode.getChildNodes(); for (int agreementChildIndex = 0; agreementChildIndex < headerTradeAgreementChilds.getLength(); agreementChildIndex++) { @@ -190,7 +423,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { for (int buyerOrderChildIndex = 0; buyerOrderChildIndex < buyerOrderChilds.getLength(); buyerOrderChildIndex++) { if ((buyerOrderChilds.item(buyerOrderChildIndex).getLocalName() != null) && (buyerOrderChilds.item(buyerOrderChildIndex).getLocalName().equals("IssuerAssignedID"))) { - buyerOrderIssuerAssignedID = buyerOrderChilds.item(buyerOrderChildIndex).getTextContent(); + buyerOrderIssuerAssignedID = XMLTools.trimOrNull(buyerOrderChilds.item(buyerOrderChildIndex)); } } } @@ -200,7 +433,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { for (int sellerOrderChildIndex = 0; sellerOrderChildIndex < sellerOrderChilds.getLength(); sellerOrderChildIndex++) { if ((sellerOrderChilds.item(sellerOrderChildIndex).getLocalName() != null) && (sellerOrderChilds.item(sellerOrderChildIndex).getLocalName().equals("IssuerAssignedID"))) { - sellerOrderIssuerAssignedID = sellerOrderChilds.item(sellerOrderChildIndex).getTextContent(); + sellerOrderIssuerAssignedID = XMLTools.trimOrNull(sellerOrderChilds.item(sellerOrderChildIndex)); } } } @@ -210,13 +443,19 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { } + String currency = extractString("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]/*[local-name()=\"InvoiceCurrencyCode\"]|//*[local-name()=\"DocumentCurrencyCode\"]") ; + zpp.setCurrency(currency); + xpr = xpath.compile("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]|//*[local-name()=\"ApplicableSupplyChainTradeSettlement\"]"); NodeList headerTradeSettlementNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); List bankDetails = new ArrayList<>(); + String directDebitMandateID = null; + String IBAN = null, BIC = null; for (int i = 0; i < headerTradeSettlementNodes.getLength(); i++) { - // nodes.item(i).getTextContent())) { + // XMLTools.trimOrNull(nodes.item(i)))) { Node headerTradeSettlementNode = headerTradeSettlementNodes.item(i); + NodeList headerTradeSettlementChilds = headerTradeSettlementNode.getChildNodes(); for (int settlementChildIndex = 0; settlementChildIndex < headerTradeSettlementChilds.getLength(); settlementChildIndex++) { if ((headerTradeSettlementChilds.item(settlementChildIndex).getLocalName() != null) @@ -227,52 +466,86 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { NodeList dueDateChilds = paymentTermChilds.item(paymentTermChildIndex).getChildNodes(); for (int dueDateChildIndex = 0; dueDateChildIndex < dueDateChilds.getLength(); dueDateChildIndex++) { if ((dueDateChilds.item(dueDateChildIndex).getLocalName() != null) && (dueDateChilds.item(dueDateChildIndex).getLocalName().equals("DateTimeString"))) { - dueDate = new SimpleDateFormat("yyyyMMdd").parse(dueDateChilds.item(dueDateChildIndex).getTextContent()); + dueDate = new SimpleDateFormat("yyyyMMdd").parse(XMLTools.trimOrNull(dueDateChilds.item(dueDateChildIndex))); } } } + if ((paymentTermChilds.item(paymentTermChildIndex).getLocalName() != null) && (paymentTermChilds.item(paymentTermChildIndex).getLocalName().equals("DirectDebitMandateID"))) { + directDebitMandateID = paymentTermChilds.item(paymentTermChildIndex).getTextContent(); + } } } if ((headerTradeSettlementChilds.item(settlementChildIndex).getLocalName() != null) && (headerTradeSettlementChilds.item(settlementChildIndex).getLocalName().equals("SpecifiedTradeSettlementPaymentMeans"))) { NodeList paymentMeansChilds = headerTradeSettlementChilds.item(settlementChildIndex).getChildNodes(); + IBAN = null; + BIC = null; for (int paymentMeansChildIndex = 0; paymentMeansChildIndex < paymentMeansChilds.getLength(); paymentMeansChildIndex++) { - String IBAN = null, BIC = null; - if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayeePartyCreditorFinancialAccount"))) { + + if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayeePartyCreditorFinancialAccount") || paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayerPartyDebtorFinancialAccount"))) { NodeList accountChilds = paymentMeansChilds.item(paymentMeansChildIndex).getChildNodes(); for (int accountChildIndex = 0; accountChildIndex < accountChilds.getLength(); accountChildIndex++) { if ((accountChilds.item(accountChildIndex).getLocalName() != null) && (accountChilds.item(accountChildIndex).getLocalName().equals("IBANID"))) {//CII - IBAN = accountChilds.item(accountChildIndex).getTextContent(); + IBAN = XMLTools.trimOrNull(accountChilds.item(accountChildIndex)); } } } - if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayeePartyCreditorFinancialInstitution"))) { + if ((paymentMeansChilds.item(paymentMeansChildIndex).getLocalName() != null) && (paymentMeansChilds.item(paymentMeansChildIndex).getLocalName().equals("PayeeSpecifiedCreditorFinancialInstitution"))) { NodeList accountChilds = paymentMeansChilds.item(paymentMeansChildIndex).getChildNodes(); for (int accountChildIndex = 0; accountChildIndex < accountChilds.getLength(); accountChildIndex++) { if ((accountChilds.item(accountChildIndex).getLocalName() != null) && (accountChilds.item(accountChildIndex).getLocalName().equals("BICID"))) {//CII - BIC = accountChilds.item(accountChildIndex).getTextContent(); + BIC = XMLTools.trimOrNull(accountChilds.item(accountChildIndex)); } } } - if (IBAN != null) { - BankDetails bd = new BankDetails(IBAN); - if (BIC != null) { - bd.setBIC(BIC); + + } + if (IBAN != null) { + BankDetails bd = new BankDetails(IBAN); + if (BIC != null) { + bd.setBIC(BIC); + } + bankDetails.add(bd); + } + } + if ((headerTradeSettlementChilds.item(settlementChildIndex).getLocalName() != null) + && (headerTradeSettlementChilds.item(settlementChildIndex).getLocalName().equals("BillingSpecifiedPeriod"))) { + NodeList periodChilds = headerTradeSettlementChilds.item(settlementChildIndex).getChildNodes(); + for (int periodChildIndex = 0; periodChildIndex < periodChilds.getLength(); periodChildIndex++) { + if ((periodChilds.item(periodChildIndex).getLocalName() != null) && (periodChilds.item(periodChildIndex).getLocalName().equals("StartDateTime"))) { + + NodeList startPeriodChilds = periodChilds.item(periodChildIndex).getChildNodes(); + for (int startPeriodIndex = 0; startPeriodIndex < startPeriodChilds.getLength(); startPeriodIndex++) { + if ((startPeriodChilds.item(startPeriodIndex).getLocalName() != null) && (startPeriodChilds.item(startPeriodIndex).getLocalName().equals("DateTimeString"))) {//CII + deliveryPeriodStart = XMLTools.trimOrNull(startPeriodChilds.item(startPeriodIndex)); + } + } + } + if ((periodChilds.item(periodChildIndex).getLocalName() != null) && (periodChilds.item(periodChildIndex).getLocalName().equals("EndDateTime"))) { + NodeList endPeriodChilds = periodChilds.item(periodChildIndex).getChildNodes(); + for (int endPeriodIndex = 0; endPeriodIndex < endPeriodChilds.getLength(); endPeriodIndex++) { + if ((endPeriodChilds.item(endPeriodIndex).getLocalName() != null) && (endPeriodChilds.item(endPeriodIndex).getLocalName().equals("DateTimeString"))) {//CII + deliveryPeriodEnd = XMLTools.trimOrNull(endPeriodChilds.item(endPeriodIndex)); + } } - bankDetails.add(bd); } } } } } + if ((deliveryPeriodStart != null) && (deliveryPeriodEnd != null)) { + zpp.setDetailedDeliveryPeriod(XMLTools.tryDate(deliveryPeriodStart), XMLTools.tryDate(deliveryPeriodEnd)); + } else if (deliveryPeriodStart != null) { + zpp.setDeliveryDate(XMLTools.tryDate(deliveryPeriodStart)); + } xpr = xpath.compile("//*[local-name()=\"PaymentMeans\"]"); //UBL only NodeList paymentMeansNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); for (int i = 0; i < paymentMeansNodes.getLength(); i++) { - // nodes.item(i).getTextContent())) { + // XMLTools.trimOrNull(nodes.item(i)))) { Node paymentMeansNode = paymentMeansNodes.item(i); NodeList paymentMeansChilds = paymentMeansNode.getChildNodes(); for (int meansChildIndex = 0; meansChildIndex < paymentMeansChilds.getLength(); meansChildIndex++) { @@ -281,7 +554,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { NodeList paymentTermChilds = paymentMeansChilds.item(meansChildIndex).getChildNodes(); for (int paymentTermChildIndex = 0; paymentTermChildIndex < paymentTermChilds.getLength(); paymentTermChildIndex++) { if ((paymentTermChilds.item(paymentTermChildIndex).getLocalName() != null) && (paymentTermChilds.item(paymentTermChildIndex).getLocalName().equals("ID"))) { - String IBAN = paymentTermChilds.item(paymentTermChildIndex).getTextContent(); + IBAN = XMLTools.trimOrNull(paymentTermChilds.item(paymentTermChildIndex)); if (IBAN != null) { BankDetails bd = new BankDetails(IBAN); bankDetails.add(bd); @@ -294,6 +567,11 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { zpp.setDueDate(dueDate).setDeliveryDate(deliveryDate).setIssueDate(issueDate).setSender(new TradeParty(SellerNodes)).setRecipient(new TradeParty(BuyerNodes)).setNumber(number).setDocumentCode(typeCode); + if ((directDebitMandateID != null) && (IBAN != null)) { + DirectDebit d = new DirectDebit(IBAN, directDebitMandateID); + zpp.getSender().addDebitDetails(d); + } + bankDetails.forEach(bankDetail -> zpp.getSender().addBankDetails(bankDetail)); if (payeeNodes.getLength() > 0) { @@ -303,6 +581,9 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { if (buyerOrderIssuerAssignedID != null) { zpp.setBuyerOrderReferencedDocumentID(buyerOrderIssuerAssignedID); } + else { + zpp.setBuyerOrderReferencedDocumentID(extractString("//*[local-name()=\"OrderReference\"]/*[local-name()=\"ID\"]")); + } if (sellerOrderIssuerAssignedID != null) { zpp.setSellerOrderReferencedDocumentID(sellerOrderIssuerAssignedID); } @@ -316,7 +597,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { String buyerReference = null; prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); if (prepaidNodes.getLength() > 0) { - buyerReference = prepaidNodes.item(0).getTextContent(); + buyerReference = XMLTools.trimOrNull(prepaidNodes.item(0)); } if (buyerReference != null) { zpp.setReferenceNumber(buyerReference); @@ -338,9 +619,9 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { xpr = xpath.compile("//*[local-name()=\"AttachmentBinaryObject\"]|//*[local-name()=\"EmbeddedDocumentBinaryObject\"]"); NodeList attachmentNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); for (int i = 0; i < attachmentNodes.getLength(); i++) { - FileAttachment fa=new FileAttachment(attachmentNodes.item(i).getAttributes().getNamedItem("filename").getNodeValue(),attachmentNodes.item(i).getAttributes().getNamedItem("mimeCode").getNodeValue(),"Data", Base64.getDecoder().decode(attachmentNodes.item(i).getTextContent())); + FileAttachment fa = new FileAttachment(attachmentNodes.item(i).getAttributes().getNamedItem("filename").getNodeValue(), attachmentNodes.item(i).getAttributes().getNamedItem("mimeCode").getNodeValue(), "Data", Base64.getDecoder().decode(XMLTools.trimOrNull(attachmentNodes.item(i)))); fileAttachments.add(fa); - // filename = "Aufmass.png" mimeCode = "image/png" + // filename = "Aufmass.png" mimeCode = "image/png" //EmbeddedDocumentBinaryObject cbc:EmbeddedDocumentBinaryObject mimeCode="image/png" filename="Aufmass.png" } @@ -366,21 +647,21 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { for (int indicatorChildIndex = 0; indicatorChildIndex < indicatorChilds.getLength(); indicatorChildIndex++) { if ((indicatorChilds.item(indicatorChildIndex).getLocalName() != null) && (indicatorChilds.item(indicatorChildIndex).getLocalName().equals("Indicator"))) { - isCharge = indicatorChilds.item(indicatorChildIndex).getTextContent().equalsIgnoreCase("true"); + isCharge = XMLTools.trimOrNull(indicatorChilds.item(indicatorChildIndex)).equalsIgnoreCase("true"); } } } else if (chargeChildName.equals("ActualAmount")) { - chargeAmount = chargeNodeChilds.item(chargeChildIndex).getTextContent(); + chargeAmount = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex)); } else if (chargeChildName.equals("Reason")) { - reason = chargeNodeChilds.item(chargeChildIndex).getTextContent(); + reason = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex)); } else if (chargeChildName.equals("ReasonCode")) { - reasonCode = chargeNodeChilds.item(chargeChildIndex).getTextContent(); + reasonCode = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex)); } else if (chargeChildName.equals("CategoryTradeTax")) { NodeList taxChilds = chargeNodeChilds.item(chargeChildIndex).getChildNodes(); for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) { String taxItemName = taxChilds.item(taxChildIndex).getLocalName(); if ((taxItemName != null) && (taxItemName.equals("RateApplicablePercent") || taxItemName.equals("ApplicablePercent"))) { - taxPercent = taxChilds.item(taxChildIndex).getTextContent(); + taxPercent = XMLTools.trimOrNull(taxChilds.item(taxChildIndex)); } } } @@ -422,21 +703,92 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter { try { whichType = getStandard(); } catch (Exception e) { - throw new ParseException("Could not find out if it's an invoice, order, or delivery advice", 0); - + throw new StructureException("Could not find out if it's an invoice, order, or delivery advice", 0); } if ((whichType != EStandard.despatchadvice) && ((!expectedStringTotalGross.equals(XMLTools.nDigitFormat(expectedGrandTotal, 2))) && (!ignoreCalculationErrors))) { - throw new ParseException( - "Could not reproduce the invoice, this could mean that it could not be read properly", 0); + throw new ArithmetricException(); } } return zpp; } + protected Document getDocument() { + return document; + } + + protected String extractString(String xpathStr) { + if (!containsMeta) { + throw new ZUGFeRDExportException("No suitable data/ZUGFeRD file could be found."); + } + final String result; + try { + final Document document = getDocument(); + final XPathFactory xpathFact = XPathFactory.newInstance(); + final XPath xpath = xpathFact.newXPath(); + result = xpath.evaluate(xpathStr, document); + } catch (final XPathExpressionException e) { + LOGGER.error("Failed to evaluate XPath", e); + throw new ZUGFeRDExportException(e); + } + return result; + } + + public EStandard getStandard() throws Exception { + if (!containsMeta) { + throw new Exception("Not yet parsed"); + } + final String head = getUTF8(); + String rootNode = extractString("local-name(/*)"); + if (rootNode.equals("CrossIndustryDocument")) { + return EStandard.zugferd; + } else if (rootNode.equals("Invoice")) { + return EStandard.ubl; + } else if (rootNode.equals("CreditNote")) { + return EStandard.ubl; + } else if (rootNode.equals("CrossIndustryInvoice")) { + return EStandard.facturx; + } else if (rootNode.equals("SCRDMCCBDACIDAMessageStructure")) { + return EStandard.despatchadvice; + } else if (head.contains("Art der Fremdforderung Betrag der Fremdforderung Beschreibung der Fremdforderung - Übersicht + Daten der E-Rechnung Informationen zum Käufer Informationen zum Verkäufer Rechnungsdaten @@ -214,7 +214,7 @@ Lastschrift Überweisung Bemerkungen zur Rechnung - Details + Rechnungspositionen Abrechnungszeitraum Preiseinzelheiten Nachlässe auf Ebene der Rechnungsposition diff --git a/library/src/main/resources/stylesheets/xr-content.xsl b/library/src/main/resources/stylesheets/xr-content.xsl index 5c4207ad..4b8adb6f 100644 --- a/library/src/main/resources/stylesheets/xr-content.xsl +++ b/library/src/main/resources/stylesheets/xr-content.xsl @@ -807,10 +807,11 @@ - + + diff --git a/library/src/main/resources/stylesheets/xr-pdf.xsl b/library/src/main/resources/stylesheets/xr-pdf.xsl index 153dba41..406e4044 100644 --- a/library/src/main/resources/stylesheets/xr-pdf.xsl +++ b/library/src/main/resources/stylesheets/xr-pdf.xsl @@ -64,7 +64,7 @@ - + + + + urn:cen.eu:en16931:2017 + + + + 471102 + 380 + + 20180304 + + + + + + 1 + + + Trennblätter A4 + + + + 9.9000 + 1.0000 + + + + 20.0000 + + + + VAT + S + 19.00 + + + 198.00 + + + + + + 2 + + + Joghurt Banane + + + + 5.5000 + 1.0000 + + + + 50.0000 + + + + VAT + S + 7.00 + + + 275.00 + + + + + + Lieferant GmbH + + 80333 + Lieferantenstraße 20 + München + DE + + + DE123456789 + + + 201/113/40209 + + + + Kunden AG Mitte + + 69876 + Kundenstraße 15 + Frankfurt + DE + + + + + + + 20180304 + + + + + DE98ZZZ09999999999 + EUR + + 59 + + DE21860000000086001055 + + + 19.25 + VAT + 275.00 + S + 7.00 + + + 37.62 + VAT + 198.00 + S + 19.00 + + + Der Betrag in Höhe von EUR 529,87 wird am 20.03.2018 von Ihrem Konto per SEPA-Lastschrift eingezogen. + + REF A-123 + + + 473.00 + 0.00 + 0.00 + 473.00 + 56.87 + 529.87 + 0.00 + 529.87 + + + + \ No newline at end of file diff --git a/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.cii.xml b/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.cii.xml index 9f8d1044..1b88d4d4 100644 --- a/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.cii.xml +++ b/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.cii.xml @@ -1,411 +1,415 @@ - - - - BT-23 Business Process Type - - - urn:cen.eu:en16931:2017 - - - - Test_EeISI_100 - 380 - - 20181112 - - - invoice note text - #AAA# - - - invoice note text 2 - #AAA# - - - - - - 1a - - Invoice line note - - - - Item standar identifier - Item seller's identifier - Item buyer's identifier - Item name - Item description - - Color - Red - - - Size - L - - - Item classification identifier0 - - - IT - - - - - 12345 - - - 11.00 - 1.00 - - - false - - 1.00 - - - - 10.00 - 1.00 - - - - 10.00 - - - - VAT - S - 5.00 - - - + + + + BT-23 Business Process Type + + + urn:cen.eu:en16931:2017 + + + + Test_EeISI_100 + 380 + 20181112 - - - 20181130 - - - - - false - - 1.00 - 1000.00 - 10.00 - 55 - Invoice line allowance reason - - - - true - - 1.00 - 1000.00 - 10.00 - AAA - Invoice line charge reason - - - 1000.00 - - - Line object identifier - 130 - - - - 6789 - - - - - - 1b - - - Item name 2 - - - - 10.00 - - - - 10.00 - - - - VAT - E - 0.00 - - - 1000.00 - - - - - 123 - - Seller identifier 1 - Seller identifier 2 - Seller name - Seller additional legal information - - Seller legal identifier - Seller trading name - - - Seller contact point - - +41 345 654455 - - - seller@contact.de - - - - 12345 - Seller address line 1 - Seller address line 2 - Seller address line 3 - Seller city - DE - Seller country subdivision - - - Seller electronic address - - - DE12345677 - - - DE49294093 - - - - Buyer identifier - Buyer name - - Buyer legal registration identifier - Buyer trading name - - - Buyer contact point - - +353 2948584 - - - buyer@contact.ie - - - - 34562 - Buyer address line 1 - Buyer address line 2 - Buyer address line 3 - Buyer city - IE - Buyer country subdivision - - - Buyer electronic address - - - IE394838894 - - - - Tax representative name - - 23455 - Tax representative address line 1 - Tax representative address line 2 - Tax representative address line 3 - Tax representative city - DE - Tax representative country subdivision - - - DE3949053 - - - - def - - - abc - - - 789 - - - Supporting document ref - External document location - 916 - Supporting document descr - ZGVmYXVsdA== - - - rst - 130 - 0090 - - - 456 - Project reference - - - - - deliver location identifier - Deliver to party name - - 98765 - Deliver to address line 1 - Deliver to address line 2 - Deliver to address line 3 - Deliver to city - IE - Deliver to country subdivision - - - - - 20181204 - - - - lmn - - - ghi - - - - Bank assigned creditor identifier - Remittance information - NOK - EUR - - Payee identifier - Payee name - - Payee legal registration identifier - - - - 4 - SEPA - - 1234 - Payment card holder name - - - Debited account identifier - - - IT1212341234123412 - Payment account name - - - BSCTCH22 - - - IT1212341234123413 - Payment account name 2 - - - BSCTCH22 - - - - 50.00 - VAT - 1000.00 - S - 29 - 5.00 - - - 0.00 - VAT - Exemtion reason text - 1000.00 - E - Exemption reason code - 29 - 0.00 - - - - 20181112 - - - 20181130 - - - - - false - - 1.00 - 1000.00 - 10.00 - 55 - Doc allowance reason text - - VAT - S - 5.00 - - - - - true - - 1.00 - 1000.00 - 10.00 - AAA - Doc charge reason text - - VAT - S - 5.00 - - - - total amount - - 20181130 - - Mandate reference identifier - - - 2000.00 - 10.00 - 10.00 - 2000.00 - 50.00 - 46.00 - 0.00 - 2050.00 - 0.00 - 2050.00 - - - abc123 - - 20181004 - - - - uvz - - - + + + invoice note text + AAA + + + invoice note text 2 + AAA + + + + + + 1a + + Invoice line note + + + + Item standar identifier + + + Item seller's identifier + Item buyer's identifier + Item name + Item description + + Color + Red + + + Size + L + + + Item classification identifier0 + + + IT + + + + + 12345 + + + 11.00 + 1.00 + + + false + + 1.00 + + + + 10.00 + 1.00 + + + + 10.00 + + + + VAT + S + 5.00 + + + + 20181112 + + + 20181130 + + + + + false + + 1.00 + 100.00 + 10.00 + 95 + Invoice line allowance reason + + + + true + + 1.00 + 100.00 + 10.00 + AAA + Invoice line charge reason + + + 100.00 + + + Line object identifier + 130 + + + 6789 + + + + + + 1b + + + Item name 2 + + + + 10.00 + + + + 10.00 + + + + VAT + E + 0.00 + + + 100.00 + + + + + 123 + + Seller identifier 1 + Seller identifier 2 + Seller name + Seller additional legal information + + + Seller trading name + + + Seller contact point + + +41 345 654455 + + + seller@contact.de + + + + 12345 + Seller address line 1 + Seller address line 2 + Seller address line 3 + Seller city + DE + Seller country subdivision + + + Seller electronic address + + + DE12345677 + + + DE49294093 + + + + Buyer identifier + Buyer name + + Buyer legal registration identifier + Buyer trading name + + + Buyer contact point + + +353 2948584 + + + buyer@contact.ie + + + + 34562 + Buyer address line 1 + Buyer address line 2 + Buyer address line 3 + Buyer city + IE + Buyer country subdivision + + + Buyer electronic address + + + IE394838894 + + + + Tax representative name + + 23455 + Tax representative address line 1 + Tax representative address line 2 + Tax representative address line 3 + Tax representative city + DE + Tax representative country subdivision + + + DE3949053 + + + + def + + + abc + + + 789 + + + Supporting document ref + External document location + 916 + Supporting document descr + ZGVmYXVsdA== + + + rst + 130 + AAA + + + 456 + Project reference + + + + + deliver location identifier + Deliver to party name + + 98765 + Deliver to address line 1 + Deliver to address line 2 + Deliver to address line 3 + Deliver to city + IE + Deliver to country subdivision + + + + + 20181204 + + + + lmn + + + ghi + + + + Bank assigned creditor identifier + Remittance information + NOK + EUR + + Payee identifier + Payee name + + Payee legal registration identifier + + + + 4 + SEPA + + 1234 + Payment card holder name + + + Debited account identifier + + + IT1212341234123412 + Payment account name + + + + + + + 5.00 + VAT + 100.00 + S + + 5.00 + + + 0.00 + VAT + Exemtion reason text + 100.00 + E + VATEX-EU-O + 29 + 0.00 + + + + 20181112 + + + 20181130 + + + + + false + + 1.00 + 100.00 + 10.00 + 95 + Doc allowance reason text + + VAT + S + 5.00 + + + + + true + + 1.00 + 100.00 + 10.00 + AAA + Doc charge reason text + + VAT + S + 5.00 + + + + total amount + + 20181130 + + Mandate reference identifier + + + 200.00 + 10.00 + 10.00 + 200.00 + 5.00 + 4.60 + 0.00 + 205.00 + 0.00 + 205.00 + + + abc123 + + 20181004 + + + + uvz + + + diff --git a/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.ubl.xml b/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.ubl.xml index a314773a..6aec88d9 100644 --- a/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.ubl.xml +++ b/library/src/test/resources/not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.ubl.xml @@ -1,404 +1,365 @@ - - urn:cen.eu:en16931:2017 - BT-23 Business Process Type - Test_EeISI_100 - 2018-11-12 - 2018-11-30 - 380 - ##AAA##invoice note text - ##AAA##invoice note text 2 - EUR - NOK - uvz - 123 - - 2018-11-12 - 2018-11-30 - 35 - - - abc - def - - - - abc123 - 2018-10-04 - - - - lmn - - - ghi - - - opq - - - 789 - - - rst - 130 - - - Supporting document ref - Supporting document descr - - ZGVmYXVsdA== - - External document location - - - - - 456 - - - - Seller electronic address + + urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0 + urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 + Test_EeISI_100 + 2018-11-12 + 2018-11-30 + 380 + #AAA#invoice note text + #AAA#invoice note text 2 + EUR + NOK + uvz + 123 + + 2018-11-12 + 2018-11-30 + + + abc + def + + + + abc123 + 2018-10-04 + + + + lmn + + + ghi + + + 789 + + + Supporting document ref + Supporting document descr + + ZGVmYXVsdA== + + External document location + + + + + rst + 130 + + + 456 + + + + Seller electronic address + + Seller identifier 1 + + + Seller identifier 2 + + + Seller trading name + + + Seller address line 1 + Seller address line 2 + Seller city + 12345 + Seller country subdivision + + Seller address line 3 + + + DE + + + + DE12345677 + + VAT + + + + DE49294093 + + FC + + + + Seller name + Seller additional legal information + + + Seller contact point + +41 345 654455 + seller@contact.de + + + + + + Buyer electronic address + + Buyer identifier + + + Buyer trading name + + + Buyer address line 1 + Buyer address line 2 + Buyer city + 34562 + Buyer country subdivision + + Buyer address line 3 + + + IE + + + + IE394838894 + + VAT + + + + Buyer name + Buyer legal registration identifier + + + Buyer contact point + +353 2948584 + buyer@contact.ie + + + + - Seller identifier 1 - - - Seller identifier 2 - - - Bank assigned creditor identifier + Payee identifier - Seller trading name + Payee name + + + + + Tax representative name - Seller address line 1 - Seller address line 2 - Seller city - 12345 - Seller country subdivision + Tax representative address line 1 + Tax representative address line 2 + Tax representative city + 23455 + Tax representative country subdivision - Seller address line 3 + Tax representative address line 3 DE - DE12345677 + DE3949053 VAT - - DE49294093 - - NOVAT - - - - Seller name - Seller legal identifier - Seller additional legal information - - - Seller contact point - +41 345 654455 - seller@contact.de - - - - - - Buyer electronic address - - 0190:Buyer identifier - - - Buyer trading name - - - Buyer address line 1 - Buyer address line 2 - Buyer city - 34562 - Buyer country subdivision - - Buyer address line 3 - - - IE - - - - IE394838894 - - VAT - - - - Buyer name - Buyer legal registration identifier - - - Buyer contact point - +353 2948584 - buyer@contact.ie - - - - - - Payee identifier - - - Payee name - - - Payee legal registration identifier - - - - - Tax representative name - - - Tax representative address line 1 - Tax representative address line 2 - Tax representative city - 23455 - Tax representative country subdivision - - Tax representative address line 3 - - - DE - - - - DE3949053 - - VAT - - - - - 2018-12-04 - - deliver location identifier - - Deliver to address line 1 - Deliver to address line 2 - Deliver to city - 98765 - Deliver to country subdivision - - Deliver to address line 3 - - - IE - - - - - - Deliver to party name - - - - - 4 - Remittance information - - 1234 - mandatory network id - Payment card holder name - - - IT1212341234123412 - Payment account name - - BSCTCH22 - - - - IT1212341234123413 - Payment account name 2 - - BSCTCH22 - - - - Mandate reference identifier - - Debited account identifier - - - - - total amount - - - false - 55 - Doc allowance reason text - 1.0000 - 10.00 - 1000.00 - - S - 5.00 - - VAT - - - - - true - AAA - Doc charge reason text - 1.0000 - 10.00 - 1000.00 - - S - 5.00 - - VAT - - - - - 46.00 - - - 50.00 - - 1000.00 - 50.00 - - S - 5.00 - - VAT - - - - - 1000.00 - 0.00 - - E - 0.00 - Exemption reason code - Exemtion reason text - - VAT - - - - - - 2000.00 - 2000.00 - 2050.00 - 10.00 - 10.00 - 2050.00 - - - 1a - Invoice line note - 10.00000000 - 1000.00 - 6789 - - 2018-11-12 - 2018-11-30 - - - 12345 - - - Line object identifier - 130 - + + + 2018-12-04 + + deliver location identifier + + Deliver to address line 1 + Deliver to address line 2 + Deliver to city + 98765 + Deliver to country subdivision + + Deliver to address line 3 + + + IE + + + + + + Deliver to party name + + + + + total amount + false - 55 - Invoice line allowance reason - 1 + 95 + Doc allowance reason text + 1.00 10 1000 + + S + 5 + + VAT + + true AAA - Invoice line charge reason - 1 + Doc charge reason text + 1.00 10 1000 - - - Item description - Item name - - Item buyer's identifier - - - Item seller's identifier - - - Item standar identifier - - - IT - - - Item classification identifier0 - - + S - 5.00 + 5 VAT - - - Color - Red - - - Size - L - - - - 10.00 - 1.00 + + + + 50 + + 1000 + 50 + + S + 5 + + VAT + + + + + 1000 + 0 + + E + 0 + VATEX-EU-O + Exemtion reason text + + VAT + + + + + + 46 + + + 200 + 200 + 205 + 10 + 10 + 0 + 205 + + + 1a + Invoice line note + 10 + 1000 + 6789 + + 2018-11-12 + 2018-11-30 + + + 12345 + + + Line object identifier + 130 + false - 1 - 11 + 95 + Invoice line allowance reason + 1.00 + 10 + 1000 - - - - 1b - 10.00000000 - 1000.00 - - Item name 2 - - E - 0.00 - - VAT - - - - - 10.00 - - - + + true + AAA + Invoice line charge reason + 1.00 + 10 + 1000 + + + Item description + Item name + + Item buyer's identifier + + + Item seller's identifier + + + Item standar identifier + + + IT + + + Item classification identifier0 + + + S + 5 + + VAT + + + + Color + Red + + + Size + L + + + + 10 + 1 + + false + 1 + 11 + + + + + 1b + 10 + 1000 + + Item name 2 + + E + 0 + + VAT + + + + + 10 + + + diff --git a/validator/pom.xml b/validator/pom.xml index ec333d9e..362ce454 100644 --- a/validator/pom.xml +++ b/validator/pom.xml @@ -54,7 +54,6 @@ org.apache.pdfbox pdfbox 3.0.2 - test jakarta.xml.bind diff --git a/validator/src/main/java/org/mustangproject/validator/PDFValidator.java b/validator/src/main/java/org/mustangproject/validator/PDFValidator.java index da719f9b..c42caa9e 100644 --- a/validator/src/main/java/org/mustangproject/validator/PDFValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/PDFValidator.java @@ -52,7 +52,7 @@ public class PDFValidator extends Validator { } private static final Logger LOGGER = LoggerFactory.getLogger(PDFValidator.class.getCanonicalName()); // log output - private static final PDFAFlavour[] PDF_A_3_FLAVOURS = {PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_A}; + private static final PDFAFlavour[] PDF_A_3_FLAVOURS = {PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_B, PDFAFlavour.PDFA_3_U}; private String pdfFilename; @@ -239,7 +239,8 @@ public class PDFValidator extends Validator { boolean versionValid = false; for (int i = 0; i < nodes.getLength(); i++) { - final String[] valueArray = {"1.0", "2p0", "1.2", "2.0", "2.1"}; //1.2, 2.0 and 2.1 are for xrechnung 1.2, 2p0 can be ZF 2.0, 2.1, 2.1.1 + final String[] valueArray = {"1.0", "2p0", "1.2", "2.0", "2.1", "2.2", "2.3", "3.0"}; //1.2, 2.0, 2.1, 2.2, 2.3 and 3.0 are for xrechnung 1.2, 2p0 can be ZF 2.0, 2.1, 2.1.1 + if (stringArrayContains(valueArray, nodes.item(i).getTextContent())) { versionValid = true; } // e.g. 1.0 @@ -263,6 +264,7 @@ public class PDFValidator extends Validator { final byte[] konikSignature = "Konik".getBytes(StandardCharsets.UTF_8); final byte[] pdfMachineSignature = "pdfMachine from Broadgun Software".getBytes(StandardCharsets.UTF_8); final byte[] ghostscriptSignature = "%%Invocation:".getBytes(StandardCharsets.UTF_8); + final byte[] cibpdfbrewerSignature = "CIB pdf brewer".getBytes(StandardCharsets.UTF_8); if (ByteArraySearcher.contains(fileContents, symtraxSignature)) { Signature = "Symtrax"; @@ -278,6 +280,8 @@ public class PDFValidator extends Validator { Signature = "pdfMachine"; } else if (ByteArraySearcher.contains(fileContents, ghostscriptSignature)) { Signature = "Ghostscript"; + } else if (ByteArraySearcher.contains(fileContents, cibpdfbrewerSignature)) { + Signature = "CIB pdf brewer"; } context.setSignature(Signature); @@ -297,8 +301,10 @@ public class PDFValidator extends Validator { if (!processorResult.getValidationResult().isCompliant()) { context.setInvalid(); } + + PDFAFlavour pdfaFlavourFromValidationResult = processorResult.getValidationResult().getPDFAFlavour(); if (Arrays.stream(PDF_A_3_FLAVOURS) - .anyMatch(pdfaFlavour -> processorResult.getValidationResult().getPDFAFlavour().equals(pdfaFlavour))) { + .noneMatch(pdfaFlavourFromValidationResult::equals)) { context.addResultItem( new ValidationResultItem(ESeverity.error, "Not a PDF/A-3").setSection(23).setPart(EPart.pdf)); diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java index 3d11ff88..c2124b87 100644 --- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java @@ -269,14 +269,14 @@ public class XMLValidator extends Validator { // saxon java net.sf.saxon.Transform -o tcdl2.0.tsdtf.sch.tmp.xsl -s // tcdl2.0.tsdtf.sch iso_svrl.xsl - } else if (root.getLocalName().equalsIgnoreCase("Invoice")) { + } else if (root.getLocalName().equalsIgnoreCase("Invoice") || root.getLocalName().equalsIgnoreCase("CreditNote") ) { context.setGeneration("2"); context.setFormat("UBL"); isXRechnung = context.getProfile().contains("xrechnung"); // UBL LOGGER.debug("UBL"); - validateSchema(zfXML.getBytes(StandardCharsets.UTF_8), "UBL_21/maindoc/UBL-Invoice-2.1.xsd", 18, EPart.fx); - xsltFilename = "/xslt/UBL_21/EN16931-UBL-validation.xslt"; + validateSchema(zfXML.getBytes(StandardCharsets.UTF_8), "UBL_21/maindoc/UBL-"+root.getLocalName()+"-2.1.xsd", 18, EPart.fx); + xsltFilename = "/xslt/en16931schematron/EN16931-UBL-validation.xslt"; mainSchematronSectionErrorTypeCode=24; @@ -364,7 +364,7 @@ public class XMLValidator extends Validator { if (context.getGeneration().equals("2") && (isBasic || isEN16931 || isXRechnung)) { //additionally validate against CEN - validateSchematron(zfXML, "/xslt/cii16931schematron/EN16931-CII-validation.xslt", 24, ESeverity.error); + validateSchematron(zfXML, "/xslt/en16931schematron/EN16931-CII-validation.xslt", 24, ESeverity.error); if (!disableNotices || XrechnungSeverity != ESeverity.notice) { validateXR(zfXML, XrechnungSeverity); } @@ -419,11 +419,16 @@ public class XMLValidator extends Validator { * @param xml the xml to be checked * @param xsltFilename the filename of the intermediate XSLT file * @param section the error type code, if one arises - * @param severity how serious a error should be treated - may only be notice + * @param defaultSeverity how serious a error should be treated - may only be notice * @throws IrrecoverableValidationError if anything happened that prevents further checks */ - public void validateSchematron(String xml, String xsltFilename, int section, ESeverity severity) throws IrrecoverableValidationError { + public void validateSchematron(String xml, String xsltFilename, int section, ESeverity defaultSeverity) throws IrrecoverableValidationError { ISchematronResource aResSCH = null; + ESeverity severity=defaultSeverity; + if (defaultSeverity!=ESeverity.notice) { + severity=ESeverity.error; + } + aResSCH = SchematronResourceXSLT.fromClassPath(xsltFilename); if (aResSCH != null) { @@ -465,6 +470,16 @@ public class XMLValidator extends Validator { thisFailLocation = currentFailNode.getAttributes().getNamedItem("location").getNodeValue(); } + if (currentFailNode.getAttributes().getNamedItem("flag") != null) { + // the XR issues warnings with flag=warning + if (currentFailNode.getAttributes().getNamedItem("flag").getNodeValue().equals("warning")) { + if (defaultSeverity!=ESeverity.notice) { + severity=ESeverity.warning; + } + } + + } + NodeList failChilds = currentFailNode.getChildNodes(); for (int failChildIndex = 0; failChildIndex < failChilds.getLength(); failChildIndex++) { if (failChilds.item(failChildIndex).getLocalName() != null) { diff --git a/validator/src/main/resources/xslt/UBL_21/EN16931-UBL-validation.xslt b/validator/src/main/resources/xslt/UBL_21/EN16931-UBL-validation.xslt deleted file mode 100644 index c2048d78..00000000 --- a/validator/src/main/resources/xslt/UBL_21/EN16931-UBL-validation.xslt +++ /dev/null @@ -1,15540 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / - - - - - - *: - - [namespace-uri()=' - - '] - - - - [ - - ] - - - - / - - @ - - - @*[local-name()=' - - ' and namespace-uri()=' - - '] - - - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - - / - - - [ - - ] - - - - /@ - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - U - - U - - - - U. - - n - - - - U. - - _ - - _ - - - - - - - - -   -   -   - - - - - - - - - - - - - - - UBL-model - UBL-model - - - - - - - - UBL-syntax - UBL-syntax - - - - - - - - Codesmodel - Codesmodel - - - - - - - - EN16931 model bound to UBL - - - - - - - - - - - - - - BR-52 - fatal - - - - [BR-52]-Each Additional supporting document (BG-24) shall contain a Supporting document reference (BT-122). - - - - - - - - - - - - - - - - BR-CO-25 - fatal - - - - [BR-CO-25]-In case the Amount due for payment (BT-115) is positive, either the Payment due date (BT-9) or the Payment terms (BT-20) shall be present. - - - - - - - - - - - - - - - - BR-63 - fatal - - - - [BR-63]-The Buyer electronic address (BT-49) shall have a Scheme identifier. - - - - - - - - - - - - - - - - BR-11 - fatal - - - - [BR-11]-The Buyer postal address shall contain a Buyer country code (BT-55). - - - - - - - - - - - - - - - - BR-51 - warning - - - - [BR-51]-In accordance with card payments security standards an invoice should never include a full card primary account number (BT-87). At the moment PCI Security Standards Council has defined that the first 6 digits and last 4 digits are the maximum number of digits to be shown. - - - - - - - - - - - - - - - - BR-57 - fatal - - - - [BR-57]-Each Deliver to address (BG-15) shall contain a Deliver to country code (BT-80). - - - - - - - - - - - - - - - - BR-31 - fatal - - - - [BR-31]-Each Document level allowance (BG-20) shall have a Document level allowance amount (BT-92). - - - - - - - - - - BR-32 - fatal - - - - [BR-32]-Each Document level allowance (BG-20) shall have a Document level allowance VAT category code (BT-95). - - - - - - - - - - BR-33 - fatal - - - - [BR-33]-Each Document level allowance (BG-20) shall have a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98). - - - - - - - - - - BR-CO-05 - fatal - - - - [BR-CO-05]-Document level allowance reason code (BT-98) and Document level allowance reason (BT-97) shall indicate the same type of allowance. - - - - - - - - - - BR-CO-21 - fatal - - - - [BR-CO-21]-Each Document level allowance (BG-20) shall contain a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98), or both. - - - - - - - - - - BR-DEC-01 - fatal - - - - [BR-DEC-01]-The allowed maximum number of decimals for the Document level allowance amount (BT-92) is 2. - - - - - - - - - - BR-DEC-02 - fatal - - - - [BR-DEC-02]-The allowed maximum number of decimals for the Document level allowance base amount (BT-93) is 2. - - - - - - - - - - - - - - - - BR-36 - fatal - - - - [BR-36]-Each Document level charge (BG-21) shall have a Document level charge amount (BT-99). - - - - - - - - - - BR-37 - fatal - - - - [BR-37]-Each Document level charge (BG-21) shall have a Document level charge VAT category code (BT-102). - - - - - - - - - - BR-38 - fatal - - - - [BR-38]-Each Document level charge (BG-21) shall have a Document level charge reason (BT-104) or a Document level charge reason code (BT-105). - - - - - - - - - - BR-CO-06 - fatal - - - - [BR-CO-06]-Document level charge reason code (BT-105) and Document level charge reason (BT-104) shall indicate the same type of charge. - - - - - - - - - - BR-CO-22 - fatal - - - - [BR-CO-22]-Each Document level charge (BG-21) shall contain a Document level charge reason (BT-104) or a Document level charge reason code (BT-105), or both. - - - - - - - - - - BR-DEC-05 - fatal - - - - [BR-DEC-05]-The allowed maximum number of decimals for the Document level charge amount (BT-99) is 2. - - - - - - - - - - BR-DEC-06 - fatal - - - - [BR-DEC-06]-The allowed maximum number of decimals for the Document level charge base amount (BT-100) is 2. - - - - - - - - - - - - - - - - BR-12 - fatal - - - - [BR-12]-An Invoice shall have the Sum of Invoice line net amount (BT-106). - - - - - - - - - - BR-13 - fatal - - - - [BR-13]-An Invoice shall have the Invoice total amount without VAT (BT-109). - - - - - - - - - - BR-14 - fatal - - - - [BR-14]-An Invoice shall have the Invoice total amount with VAT (BT-112). - - - - - - - - - - BR-15 - fatal - - - - [BR-15]-An Invoice shall have the Amount due for payment (BT-115). - - - - - - - - - - BR-CO-10 - fatal - - - - [BR-CO-10]-Sum of Invoice line net amount (BT-106) = Σ Invoice line net amount (BT-131). - - - - - - - - - - BR-CO-11 - fatal - - - - [BR-CO-11]-Sum of allowances on document level (BT-107) = Σ Document level allowance amount (BT-92). - - - - - - - - - - BR-CO-12 - fatal - - - - [BR-CO-12]-Sum of charges on document level (BT-108) = Σ Document level charge amount (BT-99). - - - - - - - - - - BR-CO-13 - fatal - - - - [BR-CO-13]-Invoice total amount without VAT (BT-109) = Σ Invoice line net amount (BT-131) - Sum of allowances on document level (BT-107) + Sum of charges on document level (BT-108). - - - - - - - - - - BR-CO-16 - fatal - - - - [BR-CO-16]-Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114). - - - - - - - - - - BR-DEC-09 - fatal - - - - [BR-DEC-09]-The allowed maximum number of decimals for the Sum of Invoice line net amount (BT-106) is 2. - - - - - - - - - - BR-DEC-10 - fatal - - - - [BR-DEC-10]-The allowed maximum number of decimals for the Sum of allowanced on document level (BT-107) is 2. - - - - - - - - - - BR-DEC-11 - fatal - - - - [BR-DEC-11]-The allowed maximum number of decimals for the Sum of charges on document level (BT-108) is 2. - - - - - - - - - - BR-DEC-12 - fatal - - - - [BR-DEC-12]-The allowed maximum number of decimals for the Invoice total amount without VAT (BT-109) is 2. - - - - - - - - - - BR-DEC-14 - fatal - - - - [BR-DEC-14]-The allowed maximum number of decimals for the Invoice total amount with VAT (BT-112) is 2. - - - - - - - - - - BR-DEC-16 - fatal - - - - [BR-DEC-16]-The allowed maximum number of decimals for the Paid amount (BT-113) is 2. - - - - - - - - - - BR-DEC-17 - fatal - - - - [BR-DEC-17]-The allowed maximum number of decimals for the Rounding amount (BT-114) is 2. - - - - - - - - - - BR-DEC-18 - fatal - - - - [BR-DEC-18]-The allowed maximum number of decimals for the Amount due for payment (BT-115) is 2.  - - - - - - - - - - - - - - - - BR-01 - fatal - - - - [BR-01]-An Invoice shall have a Specification identifier (BT-24).    - - - - - - - - - - BR-02 - fatal - - - - [BR-02]-An Invoice shall have an Invoice number (BT-1). - - - - - - - - - - BR-03 - fatal - - - - [BR-03]-An Invoice shall have an Invoice issue date (BT-2). - - - - - - - - - - BR-04 - fatal - - - - [BR-04]-An Invoice shall have an Invoice type code (BT-3). - - - - - - - - - - BR-05 - fatal - - - - [BR-05]-An Invoice shall have an Invoice currency code (BT-5). - - - - - - - - - - BR-06 - fatal - - - - [BR-06]-An Invoice shall contain the Seller name (BT-27). - - - - - - - - - - BR-07 - fatal - - - - [BR-07]-An Invoice shall contain the Buyer name (BT-44). - - - - - - - - - - BR-08 - fatal - - - - [BR-08]-An Invoice shall contain the Seller postal address. - - - - - - - - - - BR-10 - fatal - - - - [BR-10]-An Invoice shall contain the Buyer postal address (BG-8). - - - - - - - - - - BR-16 - fatal - - - - [BR-16]-An Invoice shall have at least one Invoice line (BG-25) - - - - - - - - - - BR-53 - fatal - - - - [BR-53]-If the VAT accounting currency code (BT-6) is present, then the Invoice total VAT amount in accounting currency (BT-111) shall be provided. - - - - - - - - - - BR-66 - fatal - - - - [BR-66]-An Invoice shall contain maximum one Payment Card account (BG-18). - - - - - - - - - - BR-67 - fatal - - - - [BR-67]-An Invoice shall contain maximum one Payment Mandate (BG-19). - - - - - - - - - - BR-AE-01 - fatal - - - - [BR-AE-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Reverse charge" shall contain in the VAT Breakdown (BG-23) exactly one VAT category code (BT-118) equal with "VAT reverse charge". - - - - - - - - - - BR-AE-02 - fatal - - - - [BR-AE-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47). - - - - - - - - - - BR-AE-03 - fatal - - - - [BR-AE-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47). - - - - - - - - - - BR-AE-04 - fatal - - - - [BR-AE-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47). - - - - - - - - - - BR-CO-03 - fatal - - - - [BR-CO-03]-Value added tax point date (BT-7) and Value added tax point date code (BT-8) are mutually exclusive. - - - - - - - - - - BR-CO-15 - fatal - - - - [BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110). - - - - - - - - - - BR-CO-18 - fatal - - - - [BR-CO-18]-An Invoice shall at least have one VAT breakdown group (BG-23). - - - - - - - - - - BR-DEC-13 - fatal - - - - [BR-DEC-13]-The allowed maximum number of decimals for the Invoice total VAT amount (BT-110) is 2. - - - - - - - - - - BR-DEC-15 - fatal - - - - [BR-DEC-15]-The allowed maximum number of decimals for the Invoice total VAT amount in accounting currency (BT-111) is 2. - - - - - - - - - - BR-E-01 - fatal - - - - [BR-E-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Exempt from VAT" shall contain exactly one VAT breakdown (BG-23) with the VAT category code (BT-118) equal to "Exempt from VAT". - - - - - - - - - - BR-E-02 - fatal - - - - [BR-E-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-E-03 - fatal - - - - [BR-E-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-E-04 - fatal - - - - [BR-E-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-G-01 - fatal - - - - [BR-G-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Export outside the EU" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Export outside the EU". - - - - - - - - - - BR-G-02 - fatal - - - - [BR-G-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-G-03 - fatal - - - - [BR-G-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-G-04 - fatal - - - - [BR-G-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IC-01 - fatal - - - - [BR-IC-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Intra-community supply" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Intra-community supply". - - - - - - - - - - BR-IC-02 - fatal - - - - [BR-IC-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-IC-03 - fatal - - - - [BR-IC-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-IC-04 - fatal - - - - [BR-IC-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-IC-11 - fatal - - - - [BR-IC-11]-In an Invoice with a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the Actual delivery date (BT-72) or the Invoicing period (BG-14) shall not be blank. - - - - - - - - - - BR-IC-12 - fatal - - - - [BR-IC-12]-In an Invoice with a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the Deliver to country code (BT-80) shall not be blank. - - - - - - - - - - BR-IG-01 - fatal - - - - [BR-IG-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "IGIC" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "IGIC". - - - - - - - - - - BR-IG-02 - fatal - - - - [BR-IG-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IG-03 - fatal - - - - [BR-IG-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IG-04 - fatal - - - - [BR-IG-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IP-01 - fatal - - - - [BR-IP-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "IPSI" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "IPSI". - - - - - - - - - - BR-IP-02 - fatal - - - - [BR-IP-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IP-03 - fatal - - - - [BR-IP-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-IP-04 - fatal - - - - [BR-IP-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-O-01 - fatal - - - - [BR-O-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Not subject to VAT" shall contain exactly one VAT breakdown group (BG-23) with the VAT category code (BT-118) equal to "Not subject to VAT". - - - - - - - - - - BR-O-02 - fatal - - - - [BR-O-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-O-03 - fatal - - - - [BR-O-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-O-04 - fatal - - - - [BR-O-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48). - - - - - - - - - - BR-O-11 - fatal - - - - [BR-O-11]-An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain other VAT breakdown groups (BG-23). - - - - - - - - - - BR-O-12 - fatal - - - - [BR-O-12]-An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is not "Not subject to VAT". - - - - - - - - - - BR-O-13 - fatal - - - - [BR-O-13]-An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain Document level allowances (BG-20) where Document level allowance VAT category code (BT-95) is not "Not subject to VAT". - - - - - - - - - - BR-O-14 - fatal - - - - [BR-O-14]-An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain Document level charges (BG-21) where Document level charge VAT category code (BT-102) is not "Not subject to VAT". - - - - - - - - - - BR-S-01 - fatal - - - - [BR-S-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Standard rated" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "Standard rated". - - - - - - - - - - BR-S-02 - fatal - - - - [BR-S-02]-An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-S-03 - fatal - - - - [BR-S-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-S-04 - fatal - - - - [BR-S-04]-An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-Z-01 - fatal - - - - [BR-Z-01]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Zero rated" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Zero rated". - - - - - - - - - - BR-Z-02 - fatal - - - - [BR-Z-02]-An Invoice that contains an Invoice line where the Invoiced item VAT category code (BT-151) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-Z-03 - fatal - - - - [BR-Z-03]-An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-Z-04 - fatal - - - - [BR-Z-04]-An Invoice that contains a Document level charge where the Document level charge VAT category code (BT-102) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63). - - - - - - - - - - BR-B-01 - fatal - - - - [BR-B-01]-An Invoice where the VAT category code (BT-151, BT-95 or BT-102) is “Split payment†shall be a domestic Italian invoice. - - - - - - - - - - BR-B-02 - fatal - - - - [BR-B-02]-An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is “Split payment" shall not contain an invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is “Standard ratedâ€. - - - - - - - - - - - - - - - - BR-21 - fatal - - - - [BR-21]-Each Invoice line (BG-25) shall have an Invoice line identifier (BT-126). - - - - - - - - - - BR-22 - fatal - - - - [BR-22]-Each Invoice line (BG-25) shall have an Invoiced quantity (BT-129). - - - - - - - - - - BR-23 - fatal - - - - [BR-23]-An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130). - - - - - - - - - - BR-24 - fatal - - - - [BR-24]-Each Invoice line (BG-25) shall have an Invoice line net amount (BT-131). - - - - - - - - - - BR-25 - fatal - - - - [BR-25]-Each Invoice line (BG-25) shall contain the Item name (BT-153). - - - - - - - - - - BR-26 - fatal - - - - [BR-26]-Each Invoice line (BG-25) shall contain the Item net price (BT-146). - - - - - - - - - - BR-27 - fatal - - - - [BR-27]-The Item net price (BT-146) shall NOT be negative. - - - - - - - - - - BR-28 - fatal - - - - [BR-28]-The Item gross price (BT-148) shall NOT be negative. - - - - - - - - - - BR-CO-04 - fatal - - - - [BR-CO-04]-Each Invoice line (BG-25) shall be categorized with an Invoiced item VAT category code (BT-151). - - - - - - - - - - BR-DEC-23 - fatal - - - - [BR-DEC-23]-The allowed maximum number of decimals for the Invoice line net amount (BT-131) is 2. - - - - - - - - - - - - - - - - BR-41 - fatal - - - - [BR-41]-Each Invoice line allowance (BG-27) shall have an Invoice line allowance amount (BT-136). - - - - - - - - - - BR-42 - fatal - - - - [BR-42]-Each Invoice line allowance (BG-27) shall have an Invoice line allowance reason (BT-139) or an Invoice line allowance reason code (BT-140). - - - - - - - - - - BR-CO-07 - fatal - - - - [BR-CO-07]-Invoice line allowance reason code (BT-140) and Invoice line allowance reason (BT-139) shall indicate the same type of allowance reason. - - - - - - - - - - BR-CO-23 - fatal - - - - [BR-CO-23]-Each Invoice line allowance (BG-27) shall contain an Invoice line allowance reason (BT-139) or an Invoice line allowance reason code (BT-140), or both. - - - - - - - - - - BR-DEC-24 - fatal - - - - [BR-DEC-24]-The allowed maximum number of decimals for the Invoice line allowance amount (BT-136) is 2. - - - - - - - - - - BR-DEC-25 - fatal - - - - [BR-DEC-25]-The allowed maximum number of decimals for the Invoice line allowance base amount (BT-137) is 2. - - - - - - - - - - - - - - - - BR-43 - fatal - - - - [BR-43]-Each Invoice line charge (BG-28) shall have an Invoice line charge amount (BT-141). - - - - - - - - - - BR-44 - fatal - - - - [BR-44]-Each Invoice line charge shall have an Invoice line charge reason or an invoice line allowance reason code. - - - - - - - - - - BR-CO-08 - fatal - - - - [BR-CO-08]-Invoice line charge reason code (BT-145) and Invoice line charge reason (BT-144) shall indicate the same type of charge reason. - - - - - - - - - - BR-CO-24 - fatal - - - - [BR-CO-24]-Each Invoice line charge (BG-28) shall contain an Invoice line charge reason (BT-144) or an Invoice line charge reason code (BT-145), or both. - - - - - - - - - - BR-DEC-27 - fatal - - - - [BR-DEC-27]-The allowed maximum number of decimals for the Invoice line charge amount (BT-141) is 2. - - - - - - - - - - BR-DEC-28 - fatal - - - - [BR-DEC-28]-The allowed maximum number of decimals for the Invoice line charge base amount (BT-142) is 2. - - - - - - - - - - - - - - - - BR-30 - fatal - - - - [BR-30]-If both Invoice line period start date (BT-134) and Invoice line period end date (BT-135) are given then the Invoice line period end date (BT-135) shall be later or equal to the Invoice line period start date (BT-134). - - - - - - - - - - BR-CO-20 - fatal - - - - [BR-CO-20]-If Invoice line period (BG-26) is used, the Invoice line period start date (BT-134) or the Invoice line period end date (BT-135) shall be filled, or both. - - - - - - - - - - - - - - - - BR-29 - fatal - - - - [BR-29]-If both Invoicing period start date (BT-73) and Invoicing period end date (BT-74) are given then the Invoicing period end date (BT-74) shall be later or equal to the Invoicing period start date (BT-73). - - - - - - - - - - BR-CO-19 - fatal - - - - [BR-CO-19]-If Invoicing period (BG-14) is used, the Invoicing period start date (BT-73) or the Invoicing period end date (BT-74) shall be filled, or both. - - - - - - - - - - - - - - - - BR-54 - fatal - - - - [BR-54]-Each Item attribute (BG-32) shall contain an Item attribute name (BT-160) and an Item attribute value (BT-161). - - - - - - - - - - - - - - - - BR-65 - fatal - - - - [BR-65]-The Item classification identifier (BT-158) shall have a Scheme identifier. - - - - - - - - - - - - - - - - BR-64 - fatal - - - - [BR-64]-The Item standard identifier (BT-157) shall have a Scheme identifier. - - - - - - - - - - - - - - - - BR-CL-08 - fatal - - - - [BR-CL-08]-Invoiced note subject code shall be coded using UNCL4451 - - - - - - - - - - - - - - - - BR-17 - fatal - - - - [BR-17]-The Payee name (BT-59) shall be provided in the Invoice, if the Payee (BG-10) is different from the Seller (BG-4) - - - - - - - - - - - - - - - - BR-50 - fatal - - - - [BR-50]-A Payment account identifier (BT-84) shall be present if Credit transfer (BG-17) information is provided in the Invoice. - - - - - - - - - - - - - - - - BR-49 - fatal - - - - [BR-49]-A Payment instruction (BG-16) shall specify the Payment means type code (BT-81). - - - - - - - - - - BR-61 - fatal - - - - [BR-61]-If the Payment means type code (BT-81) means SEPA credit transfer, Local credit transfer or Non-SEPA international credit transfer, the Payment account identifier (BT-84) shall be present. - - - - - - - - - - - - - - - - BR-55 - fatal - - - - [BR-55]-Each Preceding Invoice reference (BG-3) shall contain a Preceding Invoice reference (BT-25). - - - - - - - - - - - - - - - - BR-CO-26 - fatal - - - - [BR-CO-26]-In order for the buyer to automatically identify a supplier, the Seller identifier (BT-29), the Seller legal registration identifier (BT-30) and/or the Seller VAT identifier (BT-31) shall be present.  - - - - - - - - - - - - - - - - BR-62 - fatal - - - - [BR-62]-The Seller electronic address (BT-34) shall have a Scheme identifier. - - - - - - - - - - - - - - - - BR-09 - fatal - - - - [BR-09]-The Seller postal address (BG-5) shall contain a Seller country code (BT-40). - - - - - - - - - - - - - - - - BR-18 - fatal - - - - [BR-18]-The Seller tax representative name (BT-62) shall be provided in the Invoice, if the Seller (BG-4) has a Seller tax representative party (BG-11) - - - - - - - - - - BR-19 - fatal - - - - [BR-19]-The Seller tax representative postal address (BG-12) shall be provided in the Invoice, if the Seller (BG-4) has a Seller tax representative party (BG-11). - - - - - - - - - - BR-56 - fatal - - - - [BR-56]-Each Seller tax representative party (BG-11) shall have a Seller tax representative VAT identifier (BT-63). - - - - - - - - - - - - - - - - BR-20 - fatal - - - - [BR-20]-The Seller tax representative postal address (BG-12) shall contain a Tax representative country code (BT-69), if the Seller (BG-4) has a Seller tax representative party (BG-11). - - - - - - - - - - - - - - - - BR-CO-14 - fatal - - - - [BR-CO-14]-Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117). - - - - - - - - - - - - - - - - BR-45 - fatal - - - - [BR-45]-Each VAT breakdown (BG-23) shall have a VAT category taxable amount (BT-116). - - - - - - - - - - BR-46 - fatal - - - - [BR-46]-Each VAT breakdown (BG-23) shall have a VAT category tax amount (BT-117). - - - - - - - - - - BR-47 - fatal - - - - [BR-47]-Each VAT breakdown (BG-23) shall be defined through a VAT category code (BT-118). - - - - - - - - - - BR-48 - fatal - - - - [BR-48]-Each VAT breakdown (BG-23) shall have a VAT category rate (BT-119), except if the Invoice is not subject to VAT. - - - - - - - - - - BR-CO-17 - fatal - - - - [BR-CO-17]-VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals. - - - - - - - - - - BR-DEC-19 - fatal - - - - [BR-DEC-19]-The allowed maximum number of decimals for the VAT category taxable amount (BT-116) is 2. - - - - - - - - - - BR-DEC-20 - fatal - - - - [BR-DEC-20]-The allowed maximum number of decimals for the VAT category tax amount (BT-117) is 2.     - - - - - - - - - - - - - - - - BR-CO-09 - fatal - - - - [BR-CO-09]-The Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) shall have a prefix in accordance with ISO code ISO 3166-1 alpha-2 by which the country of issue may be identified. Nevertheless, Greece may use the prefix ‘EL’. - - - - - - - - - - - - - - - - BR-AE-08 - fatal - - - - [BR-AE-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Reverse charge". - - - - - - - - - - BR-AE-09 - fatal - - - - [BR-AE-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" shall be 0 (zero). - - - - - - - - - - BR-AE-10 - fatal - - - - [BR-AE-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "Reverse charge" shall have a VAT exemption reason code (BT-121), meaning "Reverse charge" or the VAT exemption reason text (BT-120) "Reverse charge" (or the equivalent standard text in another language). - - - - - - - - - - - - - - - - BR-AE-06 - fatal - - - - [BR-AE-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Reverse charge" the Document level allowance VAT rate (BT-96) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-AE-07 - fatal - - - - [BR-AE-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Reverse charge" the Document level charge VAT rate (BT-103) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-AE-05 - fatal - - - - [BR-AE-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" the Invoiced item VAT rate (BT-152) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-E-08 - fatal - - - - [BR-E-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT". - - - - - - - - - - BR-E-09 - fatal - - - - [BR-E-09]-The VAT category tax amount (BT-117) In a VAT breakdown (BG-23) where the VAT category code (BT-118) equals "Exempt from VAT" shall equal 0 (zero). - - - - - - - - - - BR-E-10 - fatal - - - - [BR-E-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "Exempt from VAT" shall have a VAT exemption reason code (BT-121) or a VAT exemption reason text (BT-120). - - - - - - - - - - - - - - - - BR-E-06 - fatal - - - - [BR-E-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Exempt from VAT", the Document level allowance VAT rate (BT-96) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-E-07 - fatal - - - - [BR-E-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Exempt from VAT", the Document level charge VAT rate (BT-103) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-E-05 - fatal - - - - [BR-E-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Exempt from VAT", the Invoiced item VAT rate (BT-152) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-G-08 - fatal - - - - [BR-G-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Export outside the EU" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Export outside the EU". - - - - - - - - - - BR-G-09 - fatal - - - - [BR-G-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Export outside the EU" shall be 0 (zero). - - - - - - - - - - BR-G-10 - fatal - - - - [BR-G-10]-A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Export outside the EU" shall have a VAT exemption reason code (BT-121), meaning "Export outside the EU" or the VAT exemption reason text (BT-120) "Export outside the EU" (or the equivalent standard text in another language). - - - - - - - - - - - - - - - - BR-G-06 - fatal - - - - [BR-G-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Export outside the EU" the Document level allowance VAT rate (BT-96) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-G-07 - fatal - - - - [BR-G-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Export outside the EU" the Document level charge VAT rate (BT-103) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-G-05 - fatal - - - - [BR-G-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Export outside the EU" the Invoiced item VAT rate (BT-152) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-IC-08 - fatal - - - - [BR-IC-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Intra-community supply". - - - - - - - - - - BR-IC-09 - fatal - - - - [BR-IC-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" shall be 0 (zero). - - - - - - - - - - BR-IC-10 - fatal - - - - [BR-IC-10]-A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Intra-community supply" shall have a VAT exemption reason code (BT-121), meaning "Intra-community supply" or the VAT exemption reason text (BT-120) "Intra-community supply" (or the equivalent standard text in another language). - - - - - - - - - - - - - - - - BR-IC-06 - fatal - - - - [BR-IC-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Intra-community supply" the Document level allowance VAT rate (BT-96) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-IC-07 - fatal - - - - [BR-IC-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" the Document level charge VAT rate (BT-103) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-IC-05 - fatal - - - - [BR-IC-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Intracommunity supply" the Invoiced item VAT rate (BT-152) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-IG-08 - fatal - - - - [BR-IG-08]-For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "IGIC", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "IGIC" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119). - - - - - - - - - - BR-IG-09 - fatal - - - - [BR-IG-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IGIC" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). - - - - - - - - - - BR-IG-10 - fatal - - - - [BR-IG-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "IGIC" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). - - - - - - - - - - - - - - - - BR-IG-06 - fatal - - - - [BR-IG-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IGIC" the Document level allowance VAT rate (BT-96) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-IG-07 - fatal - - - - [BR-IG-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IGIC" the Document level charge VAT rate (BT-103) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-IG-05 - fatal - - - - [BR-IG-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IGIC" the invoiced item VAT rate (BT-152) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-IP-08 - fatal - - - - [BR-IP-08]-For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "IPSI", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "IPSI" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119). - - - - - - - - - - BR-IP-09 - fatal - - - - [BR-IP-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IPSI" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). - - - - - - - - - - BR-IP-10 - fatal - - - - [BR-IP-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "IPSI" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). - - - - - - - - - - - - - - - - BR-IP-06 - fatal - - - - [BR-IP-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IPSI" the Document level allowance VAT rate (BT-96) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-IP-07 - fatal - - - - [BR-IP-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IPSI" the Document level charge VAT rate (BT-103) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-IP-05 - fatal - - - - [BR-IP-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IPSI" the Invoiced item VAT rate (BT-152) shall be 0 (zero) or greater than zero. - - - - - - - - - - - - - - - - BR-O-08 - fatal - - - - [BR-O-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is " Not subject to VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Not subject to VAT". - - - - - - - - - - BR-O-09 - fatal - - - - [BR-O-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Not subject to VAT" shall be 0 (zero). - - - - - - - - - - BR-O-10 - fatal - - - - [BR-O-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) " Not subject to VAT" shall have a VAT exemption reason code (BT-121), meaning " Not subject to VAT" or a VAT exemption reason text (BT-120) " Not subject to VAT" (or the equivalent standard text in another language). - - - - - - - - - - - - - - - - BR-O-06 - fatal - - - - [BR-O-06]-A Document level allowance (BG-20) where VAT category code (BT-95) is "Not subject to VAT" shall not contain a Document level allowance VAT rate (BT-96). - - - - - - - - - - - - - - - - BR-O-07 - fatal - - - - [BR-O-07]-A Document level charge (BG-21) where the VAT category code (BT-102) is "Not subject to VAT" shall not contain a Document level charge VAT rate (BT-103). - - - - - - - - - - - - - - - - BR-O-05 - fatal - - - - [BR-O-05]-An Invoice line (BG-25) where the VAT category code (BT-151) is "Not subject to VAT" shall not contain an Invoiced item VAT rate (BT-152). - - - - - - - - - - - - - - - - BR-S-08 - fatal - - - - [BR-S-08]-For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119). - - - - - - - - - - BR-S-09 - fatal - - - - [BR-S-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Standard rated" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). - - - - - - - - - - BR-S-10 - fatal - - - - [BR-S-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "Standard rate" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). - - - - - - - - - - - - - - - - BR-S-06 - fatal - - - - [BR-S-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Standard rated" the Document level allowance VAT rate (BT-96) shall be greater than zero. - - - - - - - - - - - - - - - - BR-S-07 - fatal - - - - [BR-S-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Standard rated" the Document level charge VAT rate (BT-103) shall be greater than zero.  - - - - - - - - - - - - - - - - BR-S-05 - fatal - - - - [BR-S-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Standard rated" the Invoiced item VAT rate (BT-152) shall be greater than zero. - - - - - - - - - - - - - - - - BR-Z-08 - fatal - - - - [BR-Z-08]-In a VAT breakdown (BG-23) where VAT category code (BT-118) is "Zero rated" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amount (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Zero rated". - - - - - - - - - - BR-Z-09 - fatal - - - - [BR-Z-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Zero rated" shall equal 0 (zero). - - - - - - - - - - BR-Z-10 - fatal - - - - [BR-Z-10]-A VAT breakdown (BG-23) with VAT Category code (BT-118) "Zero rated" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). - - - - - - - - - - - - - - - - BR-Z-06 - fatal - - - - [BR-Z-06]-In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Zero rated" the Document level allowance VAT rate (BT-96) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-Z-07 - fatal - - - - [BR-Z-07]-In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Zero rated" the Document level charge VAT rate (BT-103) shall be 0 (zero). - - - - - - - - - - - - - - - - BR-Z-05 - fatal - - - - [BR-Z-05]-In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Zero rated" the Invoiced item VAT rate (BT-152) shall be 0 (zero). - - - - - - - - - - - - - - - - - - - - - - - UBL-SR-51 - fatal - - - - [UBL-SR-51]-An address can only have one third line. - - - - - - - - - - - - - - - - UBL-SR-42 - fatal - - - - [UBL-SR-42]-Party tax scheme shall occur maximum twice in accounting supplier party - - - - - - - - - - - - - - - - UBL-SR-33 - fatal - - - - [UBL-SR-33]-Supporting document description shall occur maximum once - - - - - - - - - - UBL-SR-43 - fatal - - - - [UBL-SR-43]-Scheme identifier shall only be used for invoiced object (document type code with value 130 or 50) - - - - - - - - - - - - - - - - UBL-DT-01 - fatal - - - - [UBL-DT-01]-Amounts shall be decimal up to two fraction digits - - - - - - - - - - - - - - - - UBL-DT-06 - fatal - - - - [UBL-DT-06]-Binary object elements shall contain the mime code attribute - - - - - - - - - - UBL-DT-07 - fatal - - - - [UBL-DT-07]-Binary object elements shall contain the file name attribute - - - - - - - - - - - - - - - - UBL-SR-25 - fatal - - - - [UBL-SR-25]-Deliver to party name shall occur maximum once - - - - - - - - - - - - - - - - UBL-SR-30 - fatal - - - - [UBL-SR-30]-Document level allowance reason shall occur maximum once - - - - - - - - - - - - - - - - UBL-SR-31 - fatal - - - - [UBL-SR-31]-Document level charge reason shall occur maximum once - - - - - - - - - - - - - - - - UBL-CR-001 - warning - - - - [UBL-CR-001]-A UBL invoice should not include extensions - - - - - - - - - - UBL-CR-002 - warning - - - - [UBL-CR-002]-A UBL invoice should not include the UBLVersionID or it should be 2.1 - - - - - - - - - - UBL-CR-003 - warning - - - - [UBL-CR-003]-A UBL invoice should not include the ProfileExecutionID - - - - - - - - - - UBL-CR-004 - warning - - - - [UBL-CR-004]-A UBL invoice should not include the CopyIndicator - - - - - - - - - - UBL-CR-005 - warning - - - - [UBL-CR-005]-A UBL invoice should not include the UUID - - - - - - - - - - UBL-CR-006 - warning - - - - [UBL-CR-006]-A UBL invoice should not include the IssueTime - - - - - - - - - - UBL-CR-007 - warning - - - - [UBL-CR-007]-A UBL invoice should not include the PricingCurrencyCode - - - - - - - - - - UBL-CR-008 - warning - - - - [UBL-CR-008]-A UBL invoice should not include the PaymentCurrencyCode - - - - - - - - - - UBL-CR-009 - warning - - - - [UBL-CR-009]-A UBL invoice should not include the PaymentAlternativeCurrencyCode - - - - - - - - - - UBL-CR-010 - warning - - - - [UBL-CR-010]-A UBL invoice should not include the AccountingCostCode - - - - - - - - - - UBL-CR-011 - warning - - - - [UBL-CR-011]-A UBL invoice should not include the LineCountNumeric - - - - - - - - - - UBL-CR-012 - warning - - - - [UBL-CR-012]-A UBL invoice should not include the InvoicePeriod StartTime - - - - - - - - - - UBL-CR-013 - warning - - - - [UBL-CR-013]-A UBL invoice should not include the InvoicePeriod EndTime - - - - - - - - - - UBL-CR-014 - warning - - - - [UBL-CR-014]-A UBL invoice should not include the InvoicePeriod DurationMeasure - - - - - - - - - - UBL-CR-015 - warning - - - - [UBL-CR-015]-A UBL invoice should not include the InvoicePeriod Description - - - - - - - - - - UBL-CR-016 - warning - - - - [UBL-CR-016]-A UBL invoice should not include the OrderReference CopyIndicator - - - - - - - - - - UBL-CR-017 - warning - - - - [UBL-CR-017]-A UBL invoice should not include the OrderReference UUID - - - - - - - - - - UBL-CR-018 - warning - - - - [UBL-CR-018]-A UBL invoice should not include the OrderReference IssueDate - - - - - - - - - - UBL-CR-019 - warning - - - - [UBL-CR-019]-A UBL invoice should not include the OrderReference IssueTime - - - - - - - - - - UBL-CR-020 - warning - - - - [UBL-CR-020]-A UBL invoice should not include the OrderReference CustomerReference - - - - - - - - - - UBL-CR-021 - warning - - - - [UBL-CR-021]-A UBL invoice should not include the OrderReference OrderTypeCode - - - - - - - - - - UBL-CR-022 - warning - - - - [UBL-CR-022]-A UBL invoice should not include the OrderReference DocumentReference - - - - - - - - - - UBL-CR-023 - warning - - - - [UBL-CR-023]-A UBL invoice should not include the BillingReference CopyIndicator - - - - - - - - - - UBL-CR-024 - warning - - - - [UBL-CR-024]-A UBL invoice should not include the BillingReference UUID - - - - - - - - - - UBL-CR-025 - warning - - - - [UBL-CR-025]-A UBL invoice should not include the BillingReference IssueTime - - - - - - - - - - UBL-CR-026 - warning - - - - [UBL-CR-026]-A UBL invoice should not include the BillingReference DocumentTypeCode - - - - - - - - - - UBL-CR-027 - warning - - - - [UBL-CR-027]-A UBL invoice should not include the BillingReference DocumentType - - - - - - - - - - UBL-CR-028 - warning - - - - [UBL-CR-028]-A UBL invoice should not include the BillingReference Xpath - - - - - - - - - - UBL-CR-029 - warning - - - - [UBL-CR-029]-A UBL invoice should not include the BillingReference LanguageID - - - - - - - - - - UBL-CR-030 - warning - - - - [UBL-CR-030]-A UBL invoice should not include the BillingReference LocaleCode - - - - - - - - - - UBL-CR-031 - warning - - - - [UBL-CR-031]-A UBL invoice should not include the BillingReference VersionID - - - - - - - - - - UBL-CR-032 - warning - - - - [UBL-CR-032]-A UBL invoice should not include the BillingReference DocumentStatusCode - - - - - - - - - - UBL-CR-033 - warning - - - - [UBL-CR-033]-A UBL invoice should not include the BillingReference DocumenDescription - - - - - - - - - - UBL-CR-034 - warning - - - - [UBL-CR-034]-A UBL invoice should not include the BillingReference Attachment - - - - - - - - - - UBL-CR-035 - warning - - - - [UBL-CR-035]-A UBL invoice should not include the BillingReference ValidityPeriod - - - - - - - - - - UBL-CR-036 - warning - - - - [UBL-CR-036]-A UBL invoice should not include the BillingReference IssuerParty - - - - - - - - - - UBL-CR-037 - warning - - - - [UBL-CR-037]-A UBL invoice should not include the BillingReference ResultOfVerification - - - - - - - - - - UBL-CR-038 - warning - - - - [UBL-CR-038]-A UBL invoice should not include the BillingReference SelfBilledInvoiceDocumentReference - - - - - - - - - - UBL-CR-039 - warning - - - - [UBL-CR-039]-A UBL invoice should not include the BillingReference CreditNoteDocumentReference - - - - - - - - - - UBL-CR-040 - warning - - - - [UBL-CR-040]-A UBL invoice should not include the BillingReference SelfBilledCreditNoteDocumentReference - - - - - - - - - - UBL-CR-041 - warning - - - - [UBL-CR-041]-A UBL invoice should not include the BillingReference DebitNoteDocumentReference - - - - - - - - - - UBL-CR-042 - warning - - - - [UBL-CR-042]-A UBL invoice should not include the BillingReference ReminderDocumentReference - - - - - - - - - - UBL-CR-043 - warning - - - - [UBL-CR-043]-A UBL invoice should not include the BillingReference AdditionalDocumentReference - - - - - - - - - - UBL-CR-044 - warning - - - - [UBL-CR-044]-A UBL invoice should not include the BillingReference BillingReferenceLine - - - - - - - - - - UBL-CR-045 - warning - - - - [UBL-CR-045]-A UBL invoice should not include the DespatchDocumentReference CopyIndicator - - - - - - - - - - UBL-CR-046 - warning - - - - [UBL-CR-046]-A UBL invoice should not include the DespatchDocumentReference UUID - - - - - - - - - - UBL-CR-047 - warning - - - - [UBL-CR-047]-A UBL invoice should not include the DespatchDocumentReference IssueDate - - - - - - - - - - UBL-CR-048 - warning - - - - [UBL-CR-048]-A UBL invoice should not include the DespatchDocumentReference IssueTime - - - - - - - - - - UBL-CR-049 - warning - - - - [UBL-CR-049]-A UBL invoice should not include the DespatchDocumentReference DocumentTypeCode - - - - - - - - - - UBL-CR-050 - warning - - - - [UBL-CR-050]-A UBL invoice should not include the DespatchDocumentReference DocumentType - - - - - - - - - - UBL-CR-051 - warning - - - - [UBL-CR-051]-A UBL invoice should not include the DespatchDocumentReference Xpath - - - - - - - - - - UBL-CR-052 - warning - - - - [UBL-CR-052]-A UBL invoice should not include the DespatchDocumentReference LanguageID - - - - - - - - - - UBL-CR-053 - warning - - - - [UBL-CR-053]-A UBL invoice should not include the DespatchDocumentReference LocaleCode - - - - - - - - - - UBL-CR-054 - warning - - - - [UBL-CR-054]-A UBL invoice should not include the DespatchDocumentReference VersionID - - - - - - - - - - UBL-CR-055 - warning - - - - [UBL-CR-055]-A UBL invoice should not include the DespatchDocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-056 - warning - - - - [UBL-CR-056]-A UBL invoice should not include the DespatchDocumentReference DocumentDescription - - - - - - - - - - UBL-CR-057 - warning - - - - [UBL-CR-057]-A UBL invoice should not include the DespatchDocumentReference Attachment - - - - - - - - - - UBL-CR-058 - warning - - - - [UBL-CR-058]-A UBL invoice should not include the DespatchDocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-059 - warning - - - - [UBL-CR-059]-A UBL invoice should not include the DespatchDocumentReference IssuerParty - - - - - - - - - - UBL-CR-060 - warning - - - - [UBL-CR-060]-A UBL invoice should not include the DespatchDocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-061 - warning - - - - [UBL-CR-061]-A UBL invoice should not include the ReceiptDocumentReference CopyIndicator - - - - - - - - - - UBL-CR-062 - warning - - - - [UBL-CR-062]-A UBL invoice should not include the ReceiptDocumentReference UUID - - - - - - - - - - UBL-CR-063 - warning - - - - [UBL-CR-063]-A UBL invoice should not include the ReceiptDocumentReference IssueDate - - - - - - - - - - UBL-CR-064 - warning - - - - [UBL-CR-064]-A UBL invoice should not include the ReceiptDocumentReference IssueTime - - - - - - - - - - UBL-CR-065 - warning - - - - [UBL-CR-065]-A UBL invoice should not include the ReceiptDocumentReference DocumentTypeCode - - - - - - - - - - UBL-CR-066 - warning - - - - [UBL-CR-066]-A UBL invoice should not include the ReceiptDocumentReference DocumentType - - - - - - - - - - UBL-CR-067 - warning - - - - [UBL-CR-067]-A UBL invoice should not include the ReceiptDocumentReference Xpath - - - - - - - - - - UBL-CR-068 - warning - - - - [UBL-CR-068]-A UBL invoice should not include the ReceiptDocumentReference LanguageID - - - - - - - - - - UBL-CR-069 - warning - - - - [UBL-CR-069]-A UBL invoice should not include the ReceiptDocumentReference LocaleCode - - - - - - - - - - UBL-CR-070 - warning - - - - [UBL-CR-070]-A UBL invoice should not include the ReceiptDocumentReference VersionID - - - - - - - - - - UBL-CR-071 - warning - - - - [UBL-CR-071]-A UBL invoice should not include the ReceiptDocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-072 - warning - - - - [UBL-CR-072]-A UBL invoice should not include the ReceiptDocumentReference DocumentDescription - - - - - - - - - - UBL-CR-073 - warning - - - - [UBL-CR-073]-A UBL invoice should not include the ReceiptDocumentReference Attachment - - - - - - - - - - UBL-CR-074 - warning - - - - [UBL-CR-074]-A UBL invoice should not include the ReceiptDocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-075 - warning - - - - [UBL-CR-075]-A UBL invoice should not include the ReceiptDocumentReference IssuerParty - - - - - - - - - - UBL-CR-076 - warning - - - - [UBL-CR-076]-A UBL invoice should not include the ReceiptDocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-077 - warning - - - - [UBL-CR-077]-A UBL invoice should not include the StatementDocumentReference - - - - - - - - - - UBL-CR-078 - warning - - - - [UBL-CR-078]-A UBL invoice should not include the OriginatorDocumentReference CopyIndicator - - - - - - - - - - UBL-CR-079 - warning - - - - [UBL-CR-079]-A UBL invoice should not include the OriginatorDocumentReference UUID - - - - - - - - - - UBL-CR-080 - warning - - - - [UBL-CR-080]-A UBL invoice should not include the OriginatorDocumentReference IssueDate - - - - - - - - - - UBL-CR-081 - warning - - - - [UBL-CR-081]-A UBL invoice should not include the OriginatorDocumentReference IssueTime - - - - - - - - - - UBL-CR-082 - warning - - - - [UBL-CR-082]-A UBL invoice should not include the OriginatorDocumentReference DocumentTypeCode - - - - - - - - - - UBL-CR-083 - warning - - - - [UBL-CR-083]-A UBL invoice should not include the OriginatorDocumentReference DocumentType - - - - - - - - - - UBL-CR-084 - warning - - - - [UBL-CR-084]-A UBL invoice should not include the OriginatorDocumentReference Xpath - - - - - - - - - - UBL-CR-085 - warning - - - - [UBL-CR-085]-A UBL invoice should not include the OriginatorDocumentReference LanguageID - - - - - - - - - - UBL-CR-086 - warning - - - - [UBL-CR-086]-A UBL invoice should not include the OriginatorDocumentReference LocaleCode - - - - - - - - - - UBL-CR-087 - warning - - - - [UBL-CR-087]-A UBL invoice should not include the OriginatorDocumentReference VersionID - - - - - - - - - - UBL-CR-088 - warning - - - - [UBL-CR-088]-A UBL invoice should not include the OriginatorDocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-089 - warning - - - - [UBL-CR-089]-A UBL invoice should not include the OriginatorDocumentReference DocumentDescription - - - - - - - - - - UBL-CR-090 - warning - - - - [UBL-CR-090]-A UBL invoice should not include the OriginatorDocumentReference Attachment - - - - - - - - - - UBL-CR-091 - warning - - - - [UBL-CR-091]-A UBL invoice should not include the OriginatorDocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-092 - warning - - - - [UBL-CR-092]-A UBL invoice should not include the OriginatorDocumentReference IssuerParty - - - - - - - - - - UBL-CR-093 - warning - - - - [UBL-CR-093]-A UBL invoice should not include the OriginatorDocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-094 - warning - - - - [UBL-CR-094]-A UBL invoice should not include the ContractDocumentReference CopyIndicator - - - - - - - - - - UBL-CR-095 - warning - - - - [UBL-CR-095]-A UBL invoice should not include the ContractDocumentReference UUID - - - - - - - - - - UBL-CR-096 - warning - - - - [UBL-CR-096]-A UBL invoice should not include the ContractDocumentReference IssueDate - - - - - - - - - - UBL-CR-097 - warning - - - - [UBL-CR-097]-A UBL invoice should not include the ContractDocumentReference IssueTime - - - - - - - - - - UBL-CR-098 - warning - - - - [UBL-CR-098]-A UBL invoice should not include the ContractDocumentReference DocumentTypeCode - - - - - - - - - - UBL-CR-099 - warning - - - - [UBL-CR-099]-A UBL invoice should not include the ContractDocumentReference DocumentType - - - - - - - - - - UBL-CR-100 - warning - - - - [UBL-CR-100]-A UBL invoice should not include the ContractDocumentReference Xpath - - - - - - - - - - UBL-CR-101 - warning - - - - [UBL-CR-101]-A UBL invoice should not include the ContractDocumentReference LanguageID - - - - - - - - - - UBL-CR-102 - warning - - - - [UBL-CR-102]-A UBL invoice should not include the ContractDocumentReference LocaleCode - - - - - - - - - - UBL-CR-103 - warning - - - - [UBL-CR-103]-A UBL invoice should not include the ContractDocumentReference VersionID - - - - - - - - - - UBL-CR-104 - warning - - - - [UBL-CR-104]-A UBL invoice should not include the ContractDocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-105 - warning - - - - [UBL-CR-105]-A UBL invoice should not include the ContractDocumentReference DocumentDescription - - - - - - - - - - UBL-CR-106 - warning - - - - [UBL-CR-106]-A UBL invoice should not include the ContractDocumentReference Attachment - - - - - - - - - - UBL-CR-107 - warning - - - - [UBL-CR-107]-A UBL invoice should not include the ContractDocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-108 - warning - - - - [UBL-CR-108]-A UBL invoice should not include the ContractDocumentReference IssuerParty - - - - - - - - - - UBL-CR-109 - warning - - - - [UBL-CR-109]-A UBL invoice should not include the ContractDocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-110 - warning - - - - [UBL-CR-110]-A UBL invoice should not include the AdditionalDocumentReference CopyIndicator - - - - - - - - - - UBL-CR-111 - warning - - - - [UBL-CR-111]-A UBL invoice should not include the AdditionalDocumentReference UUID - - - - - - - - - - UBL-CR-112 - warning - - - - [UBL-CR-112]-A UBL invoice should not include the AdditionalDocumentReference IssueDate - - - - - - - - - - UBL-CR-113 - warning - - - - [UBL-CR-113]-A UBL invoice should not include the AdditionalDocumentReference IssueTime - - - - - - - - - - UBL-CR-114 - warning - - - - [UBL-CR-114]-A UBL invoice should not include the AdditionalDocumentReference DocumentType - - - - - - - - - - UBL-CR-115 - warning - - - - [UBL-CR-115]-A UBL invoice should not include the AdditionalDocumentReference Xpath - - - - - - - - - - UBL-CR-116 - warning - - - - [UBL-CR-116]-A UBL invoice should not include the AdditionalDocumentReference LanguageID - - - - - - - - - - UBL-CR-117 - warning - - - - [UBL-CR-117]-A UBL invoice should not include the AdditionalDocumentReference LocaleCode - - - - - - - - - - UBL-CR-118 - warning - - - - [UBL-CR-118]-A UBL invoice should not include the AdditionalDocumentReference VersionID - - - - - - - - - - UBL-CR-119 - warning - - - - [UBL-CR-119]-A UBL invoice should not include the AdditionalDocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-121 - warning - - - - [UBL-CR-121]-A UBL invoice should not include the AdditionalDocumentReference Attachment External DocumentHash - - - - - - - - - - UBL-CR-122 - warning - - - - [UBL-CR-122]-A UBL invoice should not include the AdditionalDocumentReference Attachment External HashAlgorithmMethod - - - - - - - - - - UBL-CR-123 - warning - - - - [UBL-CR-123]-A UBL invoice should not include the AdditionalDocumentReference Attachment External ExpiryDate - - - - - - - - - - UBL-CR-124 - warning - - - - [UBL-CR-124]-A UBL invoice should not include the AdditionalDocumentReference Attachment External ExpiryTime - - - - - - - - - - UBL-CR-125 - warning - - - - [UBL-CR-125]-A UBL invoice should not include the AdditionalDocumentReference Attachment External MimeCode - - - - - - - - - - UBL-CR-126 - warning - - - - [UBL-CR-126]-A UBL invoice should not include the AdditionalDocumentReference Attachment External FormatCode - - - - - - - - - - UBL-CR-127 - warning - - - - [UBL-CR-127]-A UBL invoice should not include the AdditionalDocumentReference Attachment External EncodingCode - - - - - - - - - - UBL-CR-128 - warning - - - - [UBL-CR-128]-A UBL invoice should not include the AdditionalDocumentReference Attachment External CharacterSetCode - - - - - - - - - - UBL-CR-129 - warning - - - - [UBL-CR-129]-A UBL invoice should not include the AdditionalDocumentReference Attachment External FileName - - - - - - - - - - UBL-CR-130 - warning - - - - [UBL-CR-130]-A UBL invoice should not include the AdditionalDocumentReference Attachment External Descriprion - - - - - - - - - - UBL-CR-131 - warning - - - - [UBL-CR-131]-A UBL invoice should not include the AdditionalDocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-132 - warning - - - - [UBL-CR-132]-A UBL invoice should not include the AdditionalDocumentReference IssuerParty - - - - - - - - - - UBL-CR-133 - warning - - - - [UBL-CR-133]-A UBL invoice should not include the AdditionalDocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-134 - warning - - - - [UBL-CR-134]-A UBL invoice should not include the ProjectReference UUID - - - - - - - - - - UBL-CR-135 - warning - - - - [UBL-CR-135]-A UBL invoice should not include the ProjectReference IssueDate - - - - - - - - - - UBL-CR-136 - warning - - - - [UBL-CR-136]-A UBL invoice should not include the ProjectReference WorkPhaseReference - - - - - - - - - - UBL-CR-137 - warning - - - - [UBL-CR-137]-A UBL invoice should not include the Signature - - - - - - - - - - UBL-CR-138 - warning - - - - [UBL-CR-138]-A UBL invoice should not include the AccountingSupplierParty CustomerAssignedAccountID - - - - - - - - - - UBL-CR-139 - warning - - - - [UBL-CR-139]-A UBL invoice should not include the AccountingSupplierParty AdditionalAccountID - - - - - - - - - - UBL-CR-140 - warning - - - - [UBL-CR-140]-A UBL invoice should not include the AccountingSupplierParty DataSendingCapability - - - - - - - - - - UBL-CR-141 - warning - - - - [UBL-CR-141]-A UBL invoice should not include the AccountingSupplierParty Party MarkCareIndicator - - - - - - - - - - UBL-CR-142 - warning - - - - [UBL-CR-142]-A UBL invoice should not include the AccountingSupplierParty Party MarkAttentionIndicator - - - - - - - - - - UBL-CR-143 - warning - - - - [UBL-CR-143]-A UBL invoice should not include the AccountingSupplierParty Party WebsiteURI - - - - - - - - - - UBL-CR-144 - warning - - - - [UBL-CR-144]-A UBL invoice should not include the AccountingSupplierParty Party LogoReferenceID - - - - - - - - - - UBL-CR-145 - warning - - - - [UBL-CR-145]-A UBL invoice should not include the AccountingSupplierParty Party IndustryClassificationCode - - - - - - - - - - UBL-CR-146 - warning - - - - [UBL-CR-146]-A UBL invoice should not include the AccountingSupplierParty Party Language - - - - - - - - - - UBL-CR-147 - warning - - - - [UBL-CR-147]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress ID - - - - - - - - - - UBL-CR-148 - warning - - - - [UBL-CR-148]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress AddressTypeCode - - - - - - - - - - UBL-CR-149 - warning - - - - [UBL-CR-149]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress AddressFormatCode - - - - - - - - - - UBL-CR-150 - warning - - - - [UBL-CR-150]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Postbox - - - - - - - - - - UBL-CR-151 - warning - - - - [UBL-CR-151]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Floor - - - - - - - - - - UBL-CR-152 - warning - - - - [UBL-CR-152]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Room - - - - - - - - - - UBL-CR-153 - warning - - - - [UBL-CR-153]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress BlockName - - - - - - - - - - UBL-CR-154 - warning - - - - [UBL-CR-154]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress BuildingName - - - - - - - - - - UBL-CR-155 - warning - - - - [UBL-CR-155]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress BuildingNumber - - - - - - - - - - UBL-CR-156 - warning - - - - [UBL-CR-156]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress InhouseMail - - - - - - - - - - UBL-CR-157 - warning - - - - [UBL-CR-157]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Department - - - - - - - - - - UBL-CR-158 - warning - - - - [UBL-CR-158]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress MarkAttention - - - - - - - - - - UBL-CR-159 - warning - - - - [UBL-CR-159]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress MarkCare - - - - - - - - - - UBL-CR-160 - warning - - - - [UBL-CR-160]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress PlotIdentification - - - - - - - - - - UBL-CR-161 - warning - - - - [UBL-CR-161]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress CitySubdivisionName - - - - - - - - - - UBL-CR-162 - warning - - - - [UBL-CR-162]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress CountrySubentityCode - - - - - - - - - - UBL-CR-163 - warning - - - - [UBL-CR-163]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Region - - - - - - - - - - UBL-CR-164 - warning - - - - [UBL-CR-164]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress District - - - - - - - - - - UBL-CR-165 - warning - - - - [UBL-CR-165]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress TimezoneOffset - - - - - - - - - - UBL-CR-166 - warning - - - - [UBL-CR-166]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress Country Name - - - - - - - - - - UBL-CR-167 - warning - - - - [UBL-CR-167]-A UBL invoice should not include the AccountingSupplierParty Party PostalAddress LocationCoordinate - - - - - - - - - - UBL-CR-168 - warning - - - - [UBL-CR-168]-A UBL invoice should not include the AccountingSupplierParty Party PhysicalLocation - - - - - - - - - - UBL-CR-169 - warning - - - - [UBL-CR-169]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme RegistrationName - - - - - - - - - - UBL-CR-170 - warning - - - - [UBL-CR-170]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme TaxLevelCode - - - - - - - - - - UBL-CR-171 - warning - - - - [UBL-CR-171]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme ExemptionReasonCode - - - - - - - - - - UBL-CR-172 - warning - - - - [UBL-CR-172]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme ExemptionReason - - - - - - - - - - UBL-CR-173 - warning - - - - [UBL-CR-173]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme RegistrationAddress - - - - - - - - - - UBL-CR-174 - warning - - - - [UBL-CR-174]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme TaxScheme Name - - - - - - - - - - UBL-CR-175 - warning - - - - [UBL-CR-175]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-176 - warning - - - - [UBL-CR-176]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-177 - warning - - - - [UBL-CR-177]-A UBL invoice should not include the AccountingSupplierParty Party PartyTaxScheme TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-178 - warning - - - - [UBL-CR-178]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity RegistrationDate - - - - - - - - - - UBL-CR-179 - warning - - - - [UBL-CR-179]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity RegistrationExpirationDate - - - - - - - - - - UBL-CR-180 - warning - - - - [UBL-CR-180]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity CompanyLegalFormCode - - - - - - - - - - UBL-CR-181 - warning - - - - [UBL-CR-181]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity SoleProprietorshipIndicator - - - - - - - - - - UBL-CR-182 - warning - - - - [UBL-CR-182]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity CompanyLiquidationStatusCode - - - - - - - - - - UBL-CR-183 - warning - - - - [UBL-CR-183]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity CorporateStockAmount - - - - - - - - - - UBL-CR-184 - warning - - - - [UBL-CR-184]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity FullyPaidSharesIndicator - - - - - - - - - - UBL-CR-185 - warning - - - - [UBL-CR-185]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity RegistrationAddress - - - - - - - - - - UBL-CR-186 - warning - - - - [UBL-CR-186]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity CorporateRegistrationScheme - - - - - - - - - - UBL-CR-187 - warning - - - - [UBL-CR-187]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity HeadOfficeParty - - - - - - - - - - UBL-CR-188 - warning - - - - [UBL-CR-188]-A UBL invoice should not include the AccountingSupplierParty Party PartyLegalEntity ShareholderParty - - - - - - - - - - UBL-CR-189 - warning - - - - [UBL-CR-189]-A UBL invoice should not include the AccountingSupplierParty Party Contact ID - - - - - - - - - - UBL-CR-190 - warning - - - - [UBL-CR-190]-A UBL invoice should not include the AccountingSupplierParty Party Contact Telefax - - - - - - - - - - UBL-CR-191 - warning - - - - [UBL-CR-191]-A UBL invoice should not include the AccountingSupplierParty Party Contact Note - - - - - - - - - - UBL-CR-192 - warning - - - - [UBL-CR-192]-A UBL invoice should not include the AccountingSupplierParty Party Contact OtherCommunication - - - - - - - - - - UBL-CR-193 - warning - - - - [UBL-CR-193]-A UBL invoice should not include the AccountingSupplierParty Party Person - - - - - - - - - - UBL-CR-194 - warning - - - - [UBL-CR-194]-A UBL invoice should not include the AccountingSupplierParty Party AgentParty - - - - - - - - - - UBL-CR-195 - warning - - - - [UBL-CR-195]-A UBL invoice should not include the AccountingSupplierParty Party ServiceProviderParty - - - - - - - - - - UBL-CR-196 - warning - - - - [UBL-CR-196]-A UBL invoice should not include the AccountingSupplierParty Party PowerOfAttorney - - - - - - - - - - UBL-CR-197 - warning - - - - [UBL-CR-197]-A UBL invoice should not include the AccountingSupplierParty Party FinancialAccount - - - - - - - - - - UBL-CR-198 - warning - - - - [UBL-CR-198]-A UBL invoice should not include the AccountingSupplierParty DespatchContact - - - - - - - - - - UBL-CR-199 - warning - - - - [UBL-CR-199]-A UBL invoice should not include the AccountingSupplierParty AccountingContact - - - - - - - - - - UBL-CR-200 - warning - - - - [UBL-CR-200]-A UBL invoice should not include the AccountingSupplierParty SellerContact - - - - - - - - - - UBL-CR-201 - warning - - - - [UBL-CR-201]-A UBL invoice should not include the AccountingCustomerParty CustomerAssignedAccountID - - - - - - - - - - UBL-CR-202 - warning - - - - [UBL-CR-202]-A UBL invoice should not include the AccountingCustomerParty SupplierAssignedAccountID - - - - - - - - - - UBL-CR-203 - warning - - - - [UBL-CR-203]-A UBL invoice should not include the AccountingCustomerParty AdditionalAccountID - - - - - - - - - - UBL-CR-204 - warning - - - - [UBL-CR-204]-A UBL invoice should not include the AccountingCustomerParty Party MarkCareIndicator - - - - - - - - - - UBL-CR-205 - warning - - - - [UBL-CR-205]-A UBL invoice should not include the AccountingCustomerParty Party MarkAttentionIndicator - - - - - - - - - - UBL-CR-206 - warning - - - - [UBL-CR-206]-A UBL invoice should not include the AccountingCustomerParty Party WebsiteURI - - - - - - - - - - UBL-CR-207 - warning - - - - [UBL-CR-207]-A UBL invoice should not include the AccountingCustomerParty Party LogoReferenceID - - - - - - - - - - UBL-CR-208 - warning - - - - [UBL-CR-208]-A UBL invoice should not include the AccountingCustomerParty Party IndustryClassificationCode - - - - - - - - - - UBL-CR-209 - warning - - - - [UBL-CR-209]-A UBL invoice should not include the AccountingCustomerParty Party Language - - - - - - - - - - UBL-CR-210 - warning - - - - [UBL-CR-210]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress ID - - - - - - - - - - UBL-CR-211 - warning - - - - [UBL-CR-211]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress AddressTypeCode - - - - - - - - - - UBL-CR-212 - warning - - - - [UBL-CR-212]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress AddressFormatCode - - - - - - - - - - UBL-CR-213 - warning - - - - [UBL-CR-213]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Postbox - - - - - - - - - - UBL-CR-214 - warning - - - - [UBL-CR-214]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Floor - - - - - - - - - - UBL-CR-215 - warning - - - - [UBL-CR-215]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Room - - - - - - - - - - UBL-CR-216 - warning - - - - [UBL-CR-216]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress BlockName - - - - - - - - - - UBL-CR-217 - warning - - - - [UBL-CR-217]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress BuildingName - - - - - - - - - - UBL-CR-218 - warning - - - - [UBL-CR-218]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress BuildingNumber - - - - - - - - - - UBL-CR-219 - warning - - - - [UBL-CR-219]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress InhouseMail - - - - - - - - - - UBL-CR-220 - warning - - - - [UBL-CR-220]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Department - - - - - - - - - - UBL-CR-221 - warning - - - - [UBL-CR-221]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress MarkAttention - - - - - - - - - - UBL-CR-222 - warning - - - - [UBL-CR-222]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress MarkCare - - - - - - - - - - UBL-CR-223 - warning - - - - [UBL-CR-223]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress PlotIdentification - - - - - - - - - - UBL-CR-224 - warning - - - - [UBL-CR-224]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress CitySubdivisionName - - - - - - - - - - UBL-CR-225 - warning - - - - [UBL-CR-225]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress CountrySubentityCode - - - - - - - - - - UBL-CR-226 - warning - - - - [UBL-CR-226]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Region - - - - - - - - - - UBL-CR-227 - warning - - - - [UBL-CR-227]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress District - - - - - - - - - - UBL-CR-228 - warning - - - - [UBL-CR-228]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress TimezoneOffset - - - - - - - - - - UBL-CR-229 - warning - - - - [UBL-CR-229]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress Country Name - - - - - - - - - - UBL-CR-230 - warning - - - - [UBL-CR-230]-A UBL invoice should not include the AccountingCustomerParty Party PostalAddress LocationCoordinate - - - - - - - - - - UBL-CR-231 - warning - - - - [UBL-CR-231]-A UBL invoice should not include the AccountingCustomerParty Party PhysicalLocation - - - - - - - - - - UBL-CR-232 - warning - - - - [UBL-CR-232]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme RegistrationName - - - - - - - - - - UBL-CR-233 - warning - - - - [UBL-CR-233]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme TaxLevelCode - - - - - - - - - - UBL-CR-234 - warning - - - - [UBL-CR-234]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme ExemptionReasonCode - - - - - - - - - - UBL-CR-235 - warning - - - - [UBL-CR-235]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme ExemptionReason - - - - - - - - - - UBL-CR-236 - warning - - - - [UBL-CR-236]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme RegistrationAddress - - - - - - - - - - UBL-CR-237 - warning - - - - [UBL-CR-237]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme TaxScheme Name - - - - - - - - - - UBL-CR-238 - warning - - - - [UBL-CR-238]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-239 - warning - - - - [UBL-CR-239]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-240 - warning - - - - [UBL-CR-240]-A UBL invoice should not include the AccountingCustomerParty Party PartyTaxScheme TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-241 - warning - - - - [UBL-CR-241]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity RegistrationDate - - - - - - - - - - UBL-CR-242 - warning - - - - [UBL-CR-242]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity RegistrationExpirationDate - - - - - - - - - - UBL-CR-243 - warning - - - - [UBL-CR-243]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity CompanyLegalFormCode - - - - - - - - - - UBL-CR-244 - warning - - - - [UBL-CR-244]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity CompanyLegalForm - - - - - - - - - - UBL-CR-245 - warning - - - - [UBL-CR-245]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity SoleProprietorshipIndicator - - - - - - - - - - UBL-CR-246 - warning - - - - [UBL-CR-246]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity CompanyLiquidationStatusCode - - - - - - - - - - UBL-CR-247 - warning - - - - [UBL-CR-247]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity CorporateStockAmount - - - - - - - - - - UBL-CR-248 - warning - - - - [UBL-CR-248]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity FullyPaidSharesIndicator - - - - - - - - - - UBL-CR-249 - warning - - - - [UBL-CR-249]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity RegistrationAddress - - - - - - - - - - UBL-CR-250 - warning - - - - [UBL-CR-250]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity CorporateRegistrationScheme - - - - - - - - - - UBL-CR-251 - warning - - - - [UBL-CR-251]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity HeadOfficeParty - - - - - - - - - - UBL-CR-252 - warning - - - - [UBL-CR-252]-A UBL invoice should not include the AccountingCustomerParty Party PartyLegalEntity ShareholderParty - - - - - - - - - - UBL-CR-253 - warning - - - - [UBL-CR-253]-A UBL invoice should not include the AccountingCustomerParty Party Contact ID - - - - - - - - - - UBL-CR-254 - warning - - - - [UBL-CR-254]-A UBL invoice should not include the AccountingCustomerParty Party Contact Telefax - - - - - - - - - - UBL-CR-255 - warning - - - - [UBL-CR-255]-A UBL invoice should not include the AccountingCustomerParty Party Contact Note - - - - - - - - - - UBL-CR-256 - warning - - - - [UBL-CR-256]-A UBL invoice should not include the AccountingCustomerParty Party Contact OtherCommunication - - - - - - - - - - UBL-CR-257 - warning - - - - [UBL-CR-257]-A UBL invoice should not include the AccountingCustomerParty Party Person - - - - - - - - - - UBL-CR-258 - warning - - - - [UBL-CR-258]-A UBL invoice should not include the AccountingCustomerParty Party AgentParty - - - - - - - - - - UBL-CR-259 - warning - - - - [UBL-CR-259]-A UBL invoice should not include the AccountingCustomerParty Party ServiceProviderParty - - - - - - - - - - UBL-CR-260 - warning - - - - [UBL-CR-260]-A UBL invoice should not include the AccountingCustomerParty Party PowerOfAttorney - - - - - - - - - - UBL-CR-261 - warning - - - - [UBL-CR-261]-A UBL invoice should not include the AccountingCustomerParty Party FinancialAccount - - - - - - - - - - UBL-CR-262 - warning - - - - [UBL-CR-262]-A UBL invoice should not include the AccountingCustomerParty DeliveryContact - - - - - - - - - - UBL-CR-263 - warning - - - - [UBL-CR-263]-A UBL invoice should not include the AccountingCustomerParty AccountingContact - - - - - - - - - - UBL-CR-264 - warning - - - - [UBL-CR-264]-A UBL invoice should not include the AccountingCustomerParty BuyerContact - - - - - - - - - - UBL-CR-265 - warning - - - - [UBL-CR-265]-A UBL invoice should not include the PayeeParty MarkCareIndicator - - - - - - - - - - UBL-CR-266 - warning - - - - [UBL-CR-266]-A UBL invoice should not include the PayeeParty MarkAttentionIndicator - - - - - - - - - - UBL-CR-267 - warning - - - - [UBL-CR-267]-A UBL invoice should not include the PayeeParty WebsiteURI - - - - - - - - - - UBL-CR-268 - warning - - - - [UBL-CR-268]-A UBL invoice should not include the PayeeParty LogoReferenceID - - - - - - - - - - UBL-CR-269 - warning - - - - [UBL-CR-269]-A UBL invoice should not include the PayeeParty EndpointID - - - - - - - - - - UBL-CR-270 - warning - - - - [UBL-CR-270]-A UBL invoice should not include the PayeeParty IndustryClassificationCode - - - - - - - - - - UBL-CR-271 - warning - - - - [UBL-CR-271]-A UBL invoice should not include the PayeeParty Language - - - - - - - - - - UBL-CR-272 - warning - - - - [UBL-CR-272]-A UBL invoice should not include the PayeeParty PostalAddress - - - - - - - - - - UBL-CR-273 - warning - - - - [UBL-CR-273]-A UBL invoice should not include the PayeeParty PhysicalLocation - - - - - - - - - - UBL-CR-274 - warning - - - - [UBL-CR-274]-A UBL invoice should not include the PayeeParty PartyTaxScheme - - - - - - - - - - UBL-CR-275 - warning - - - - [UBL-CR-275]-A UBL invoice should not include the PayeeParty PartyLegalEntity RegistrationName - - - - - - - - - - UBL-CR-276 - warning - - - - [UBL-CR-276]-A UBL invoice should not include the PayeeParty PartyLegalEntity RegistrationDate - - - - - - - - - - UBL-CR-277 - warning - - - - [UBL-CR-277]-A UBL invoice should not include the PayeeParty PartyLegalEntity RegistrationExpirationDate - - - - - - - - - - UBL-CR-278 - warning - - - - [UBL-CR-278]-A UBL invoice should not include the PayeeParty PartyLegalEntity CompanyLegalFormCode - - - - - - - - - - UBL-CR-279 - warning - - - - [UBL-CR-279]-A UBL invoice should not include the PayeeParty PartyLegalEntity CompanyLegalForm - - - - - - - - - - UBL-CR-280 - warning - - - - [UBL-CR-280]-A UBL invoice should not include the PayeeParty PartyLegalEntity SoleProprietorshipIndicator - - - - - - - - - - UBL-CR-281 - warning - - - - [UBL-CR-281]-A UBL invoice should not include the PayeeParty PartyLegalEntity CompanyLiquidationStatusCode - - - - - - - - - - UBL-CR-282 - warning - - - - [UBL-CR-282]-A UBL invoice should not include the PayeeParty PartyLegalEntity CorporateStockAmount - - - - - - - - - - UBL-CR-283 - warning - - - - [UBL-CR-283]-A UBL invoice should not include the PayeeParty PartyLegalEntity FullyPaidSharesIndicator - - - - - - - - - - UBL-CR-284 - warning - - - - [UBL-CR-284]-A UBL invoice should not include the PayeeParty PartyLegalEntity RegistrationAddress - - - - - - - - - - UBL-CR-285 - warning - - - - [UBL-CR-285]-A UBL invoice should not include the PayeeParty PartyLegalEntity CorporateRegistrationScheme - - - - - - - - - - UBL-CR-286 - warning - - - - [UBL-CR-286]-A UBL invoice should not include the PayeeParty PartyLegalEntity HeadOfficeParty - - - - - - - - - - UBL-CR-287 - warning - - - - [UBL-CR-287]-A UBL invoice should not include the PayeeParty PartyLegalEntity ShareholderParty - - - - - - - - - - UBL-CR-288 - warning - - - - [UBL-CR-288]-A UBL invoice should not include the PayeeParty Contact - - - - - - - - - - UBL-CR-289 - warning - - - - [UBL-CR-289]-A UBL invoice should not include the PayeeParty Person - - - - - - - - - - UBL-CR-290 - warning - - - - [UBL-CR-290]-A UBL invoice should not include the PayeeParty AgentParty - - - - - - - - - - UBL-CR-291 - warning - - - - [UBL-CR-291]-A UBL invoice should not include the PayeeParty ServiceProviderParty - - - - - - - - - - UBL-CR-292 - warning - - - - [UBL-CR-292]-A UBL invoice should not include the PayeeParty PowerOfAttorney - - - - - - - - - - UBL-CR-293 - warning - - - - [UBL-CR-293]-A UBL invoice should not include the PayeeParty FinancialAccount - - - - - - - - - - UBL-CR-294 - warning - - - - [UBL-CR-294]-A UBL invoice should not include the BuyerCustomerParty - - - - - - - - - - UBL-CR-295 - warning - - - - [UBL-CR-295]-A UBL invoice should not include the SellerSupplierParty - - - - - - - - - - UBL-CR-296 - warning - - - - [UBL-CR-296]-A UBL invoice should not include the TaxRepresentativeParty MarkCareIndicator - - - - - - - - - - UBL-CR-297 - warning - - - - [UBL-CR-297]-A UBL invoice should not include the TaxRepresentativeParty MarkAttentionIndicator - - - - - - - - - - UBL-CR-298 - warning - - - - [UBL-CR-298]-A UBL invoice should not include the TaxRepresentativeParty WebsiteURI - - - - - - - - - - UBL-CR-299 - warning - - - - [UBL-CR-299]-A UBL invoice should not include the TaxRepresentativeParty LogoReferenceID - - - - - - - - - - UBL-CR-300 - warning - - - - [UBL-CR-300]-A UBL invoice should not include the TaxRepresentativeParty EndpointID - - - - - - - - - - UBL-CR-301 - warning - - - - [UBL-CR-301]-A UBL invoice should not include the TaxRepresentativeParty IndustryClassificationCode - - - - - - - - - - UBL-CR-302 - warning - - - - [UBL-CR-302]-A UBL invoice should not include the TaxRepresentativeParty PartyIdentification - - - - - - - - - - UBL-CR-303 - warning - - - - [UBL-CR-303]-A UBL invoice should not include the TaxRepresentativeParty Language - - - - - - - - - - UBL-CR-304 - warning - - - - [UBL-CR-304]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress ID - - - - - - - - - - UBL-CR-305 - warning - - - - [UBL-CR-305]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress AddressTypeCode - - - - - - - - - - UBL-CR-306 - warning - - - - [UBL-CR-306]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress AddressFormatCode - - - - - - - - - - UBL-CR-307 - warning - - - - [UBL-CR-307]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Postbox - - - - - - - - - - UBL-CR-308 - warning - - - - [UBL-CR-308]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Floor - - - - - - - - - - UBL-CR-309 - warning - - - - [UBL-CR-309]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Room - - - - - - - - - - UBL-CR-310 - warning - - - - [UBL-CR-310]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress BlockName - - - - - - - - - - UBL-CR-311 - warning - - - - [UBL-CR-311]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress BuildingName - - - - - - - - - - UBL-CR-312 - warning - - - - [UBL-CR-312]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress BuildingNumber - - - - - - - - - - UBL-CR-313 - warning - - - - [UBL-CR-313]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress InhouseMail - - - - - - - - - - UBL-CR-314 - warning - - - - [UBL-CR-314]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Department - - - - - - - - - - UBL-CR-315 - warning - - - - [UBL-CR-315]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress MarkAttention - - - - - - - - - - UBL-CR-316 - warning - - - - [UBL-CR-316]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress MarkCare - - - - - - - - - - UBL-CR-317 - warning - - - - [UBL-CR-317]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress PlotIdentification - - - - - - - - - - UBL-CR-318 - warning - - - - [UBL-CR-318]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress CitySubdivisionName - - - - - - - - - - UBL-CR-319 - warning - - - - [UBL-CR-319]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress CountrySubentityCode - - - - - - - - - - UBL-CR-320 - warning - - - - [UBL-CR-320]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Region - - - - - - - - - - UBL-CR-321 - warning - - - - [UBL-CR-321]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress District - - - - - - - - - - UBL-CR-322 - warning - - - - [UBL-CR-322]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress TimezoneOffset - - - - - - - - - - UBL-CR-323 - warning - - - - [UBL-CR-323]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress Country Name - - - - - - - - - - UBL-CR-324 - warning - - - - [UBL-CR-324]-A UBL invoice should not include the TaxRepresentativeParty PostalAddress LocationCoordinate - - - - - - - - - - UBL-CR-325 - warning - - - - [UBL-CR-325]-A UBL invoice should not include the TaxRepresentativeParty PhysicalLocation - - - - - - - - - - UBL-CR-326 - warning - - - - [UBL-CR-326]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme RegistrationName - - - - - - - - - - UBL-CR-327 - warning - - - - [UBL-CR-327]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme TaxLevelCode - - - - - - - - - - UBL-CR-328 - warning - - - - [UBL-CR-328]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme ExemptionReasonCode - - - - - - - - - - UBL-CR-329 - warning - - - - [UBL-CR-329]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme ExemptionReason - - - - - - - - - - UBL-CR-330 - warning - - - - [UBL-CR-330]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme RegistrationAddress - - - - - - - - - - UBL-CR-331 - warning - - - - [UBL-CR-331]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme TaxScheme Name - - - - - - - - - - UBL-CR-332 - warning - - - - [UBL-CR-332]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-333 - warning - - - - [UBL-CR-333]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-334 - warning - - - - [UBL-CR-334]-A UBL invoice should not include the TaxRepresentativeParty PartyTaxScheme TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-335 - warning - - - - [UBL-CR-335]-A UBL invoice should not include the TaxRepresentativeParty PartyLegalEntity - - - - - - - - - - UBL-CR-336 - warning - - - - [UBL-CR-336]-A UBL invoice should not include the TaxRepresentativeParty Contact - - - - - - - - - - UBL-CR-337 - warning - - - - [UBL-CR-337]-A UBL invoice should not include the TaxRepresentativeParty Person - - - - - - - - - - UBL-CR-338 - warning - - - - [UBL-CR-338]-A UBL invoice should not include the TaxRepresentativeParty AgentParty - - - - - - - - - - UBL-CR-339 - warning - - - - [UBL-CR-339]-A UBL invoice should not include the TaxRepresentativeParty ServiceProviderParty - - - - - - - - - - UBL-CR-340 - warning - - - - [UBL-CR-340]-A UBL invoice should not include the TaxRepresentativeParty PowerOfAttorney - - - - - - - - - - UBL-CR-341 - warning - - - - [UBL-CR-341]-A UBL invoice should not include the TaxRepresentativeParty FinancialAccount - - - - - - - - - - UBL-CR-342 - warning - - - - [UBL-CR-342]-A UBL invoice should not include the Delivery ID - - - - - - - - - - UBL-CR-343 - warning - - - - [UBL-CR-343]-A UBL invoice should not include the Delivery Quantity - - - - - - - - - - UBL-CR-344 - warning - - - - [UBL-CR-344]-A UBL invoice should not include the Delivery MinimumQuantity - - - - - - - - - - UBL-CR-345 - warning - - - - [UBL-CR-345]-A UBL invoice should not include the Delivery MaximumQuantity - - - - - - - - - - UBL-CR-346 - warning - - - - [UBL-CR-346]-A UBL invoice should not include the Delivery ActualDeliveryTime - - - - - - - - - - UBL-CR-347 - warning - - - - [UBL-CR-347]-A UBL invoice should not include the Delivery LatestDeliveryDate - - - - - - - - - - UBL-CR-348 - warning - - - - [UBL-CR-348]-A UBL invoice should not include the Delivery LatestDeliveryTime - - - - - - - - - - UBL-CR-349 - warning - - - - [UBL-CR-349]-A UBL invoice should not include the Delivery ReleaseID - - - - - - - - - - UBL-CR-350 - warning - - - - [UBL-CR-350]-A UBL invoice should not include the Delivery TrackingID - - - - - - - - - - UBL-CR-351 - warning - - - - [UBL-CR-351]-A UBL invoice should not include the Delivery DeliveryLocation Description - - - - - - - - - - UBL-CR-352 - warning - - - - [UBL-CR-352]-A UBL invoice should not include the Delivery DeliveryLocation Conditions - - - - - - - - - - UBL-CR-353 - warning - - - - [UBL-CR-353]-A UBL invoice should not include the Delivery DeliveryLocation CountrySubentity - - - - - - - - - - UBL-CR-354 - warning - - - - [UBL-CR-354]-A UBL invoice should not include the Delivery DeliveryLocation CountrySubentityCode - - - - - - - - - - UBL-CR-355 - warning - - - - [UBL-CR-355]-A UBL invoice should not include the Delivery DeliveryLocation LocationTypeCode - - - - - - - - - - UBL-CR-356 - warning - - - - [UBL-CR-356]-A UBL invoice should not include the Delivery DeliveryLocation InformationURI - - - - - - - - - - UBL-CR-357 - warning - - - - [UBL-CR-357]-A UBL invoice should not include the Delivery DeliveryLocation Name - - - - - - - - - - UBL-CR-358 - warning - - - - [UBL-CR-358]-A UBL invoice should not include the Delivery DeliveryLocation ValidityPeriod - - - - - - - - - - UBL-CR-359 - warning - - - - [UBL-CR-359]-A UBL invoice should not include the Delivery DeliveryLocation Address ID - - - - - - - - - - UBL-CR-360 - warning - - - - [UBL-CR-360]-A UBL invoice should not include the Delivery DeliveryLocation Address AddressTypeCode - - - - - - - - - - UBL-CR-361 - warning - - - - [UBL-CR-361]-A UBL invoice should not include the Delivery DeliveryLocation Address AddressFormatCode - - - - - - - - - - UBL-CR-362 - warning - - - - [UBL-CR-362]-A UBL invoice should not include the Delivery DeliveryLocation Address Postbox - - - - - - - - - - UBL-CR-363 - warning - - - - [UBL-CR-363]-A UBL invoice should not include the Delivery DeliveryLocation Address Floor - - - - - - - - - - UBL-CR-364 - warning - - - - [UBL-CR-364]-A UBL invoice should not include the Delivery DeliveryLocation Address Room - - - - - - - - - - UBL-CR-365 - warning - - - - [UBL-CR-365]-A UBL invoice should not include the Delivery DeliveryLocation Address BlockName - - - - - - - - - - UBL-CR-366 - warning - - - - [UBL-CR-366]-A UBL invoice should not include the Delivery DeliveryLocation Address BuildingName - - - - - - - - - - UBL-CR-367 - warning - - - - [UBL-CR-367]-A UBL invoice should not include the Delivery DeliveryLocation Address BuildingNumber - - - - - - - - - - UBL-CR-368 - warning - - - - [UBL-CR-368]-A UBL invoice should not include the Delivery DeliveryLocation Address InhouseMail - - - - - - - - - - UBL-CR-369 - warning - - - - [UBL-CR-369]-A UBL invoice should not include the Delivery DeliveryLocation Address Department - - - - - - - - - - UBL-CR-370 - warning - - - - [UBL-CR-370]-A UBL invoice should not include the Delivery DeliveryLocation Address MarkAttention - - - - - - - - - - UBL-CR-371 - warning - - - - [UBL-CR-371]-A UBL invoice should not include the Delivery DeliveryLocation Address MarkCare - - - - - - - - - - UBL-CR-372 - warning - - - - [UBL-CR-372]-A UBL invoice should not include the Delivery DeliveryLocation Address PlotIdentification - - - - - - - - - - UBL-CR-373 - warning - - - - [UBL-CR-373]-A UBL invoice should not include the Delivery DeliveryLocation Address CitySubdivisionName - - - - - - - - - - UBL-CR-374 - warning - - - - [UBL-CR-374]-A UBL invoice should not include the Delivery DeliveryLocation Address CountrySubentityCode - - - - - - - - - - UBL-CR-375 - warning - - - - [UBL-CR-375]-A UBL invoice should not include the Delivery DeliveryLocation Address Region - - - - - - - - - - UBL-CR-376 - warning - - - - [UBL-CR-376]-A UBL invoice should not include the Delivery DeliveryLocation Address District - - - - - - - - - - UBL-CR-377 - warning - - - - [UBL-CR-377]-A UBL invoice should not include the Delivery DeliveryLocation Address TimezoneOffset - - - - - - - - - - UBL-CR-378 - warning - - - - [UBL-CR-378]-A UBL invoice should not include the Delivery DeliveryLocation Address Country Name - - - - - - - - - - UBL-CR-379 - warning - - - - [UBL-CR-379]-A UBL invoice should not include the Delivery DeliveryLocation Address LocationCoordinate - - - - - - - - - - UBL-CR-380 - warning - - - - [UBL-CR-380]-A UBL invoice should not include the Delivery DeliveryLocation SubsidiaryLocation - - - - - - - - - - UBL-CR-381 - warning - - - - [UBL-CR-381]-A UBL invoice should not include the Delivery DeliveryLocation LocationCoordinate - - - - - - - - - - UBL-CR-382 - warning - - - - [UBL-CR-382]-A UBL invoice should not include the Delivery AlternativeDeliveryLocation - - - - - - - - - - UBL-CR-383 - warning - - - - [UBL-CR-383]-A UBL invoice should not include the Delivery RequestedDeliveryPeriod - - - - - - - - - - UBL-CR-384 - warning - - - - [UBL-CR-384]-A UBL invoice should not include the Delivery EstimatedDeliveryPeriod - - - - - - - - - - UBL-CR-385 - warning - - - - [UBL-CR-385]-A UBL invoice should not include the Delivery CarrierParty - - - - - - - - - - UBL-CR-386 - warning - - - - [UBL-CR-386]-A UBL invoice should not include the DeliveryParty MarkCareIndicator - - - - - - - - - - UBL-CR-387 - warning - - - - [UBL-CR-387]-A UBL invoice should not include the DeliveryParty MarkAttentionIndicator - - - - - - - - - - UBL-CR-388 - warning - - - - [UBL-CR-388]-A UBL invoice should not include the DeliveryParty WebsiteURI - - - - - - - - - - UBL-CR-389 - warning - - - - [UBL-CR-389]-A UBL invoice should not include the DeliveryParty LogoReferenceID - - - - - - - - - - UBL-CR-390 - warning - - - - [UBL-CR-390]-A UBL invoice should not include the DeliveryParty EndpointID - - - - - - - - - - UBL-CR-391 - warning - - - - [UBL-CR-391]-A UBL invoice should not include the DeliveryParty IndustryClassificationCode - - - - - - - - - - UBL-CR-392 - warning - - - - [UBL-CR-392]-A UBL invoice should not include the DeliveryParty PartyIdentification - - - - - - - - - - UBL-CR-393 - warning - - - - [UBL-CR-393]-A UBL invoice should not include the DeliveryParty Language - - - - - - - - - - UBL-CR-394 - warning - - - - [UBL-CR-394]-A UBL invoice should not include the DeliveryParty PostalAddress - - - - - - - - - - UBL-CR-395 - warning - - - - [UBL-CR-395]-A UBL invoice should not include the DeliveryParty PhysicalLocation - - - - - - - - - - UBL-CR-396 - warning - - - - [UBL-CR-396]-A UBL invoice should not include the DeliveryParty PartyTaxScheme - - - - - - - - - - UBL-CR-397 - warning - - - - [UBL-CR-397]-A UBL invoice should not include the DeliveryParty PartyLegalEntity - - - - - - - - - - UBL-CR-398 - warning - - - - [UBL-CR-398]-A UBL invoice should not include the DeliveryParty Contact - - - - - - - - - - UBL-CR-399 - warning - - - - [UBL-CR-399]-A UBL invoice should not include the DeliveryParty Person - - - - - - - - - - UBL-CR-400 - warning - - - - [UBL-CR-400]-A UBL invoice should not include the DeliveryParty AgentParty - - - - - - - - - - UBL-CR-401 - warning - - - - [UBL-CR-401]-A UBL invoice should not include the DeliveryParty ServiceProviderParty - - - - - - - - - - UBL-CR-402 - warning - - - - [UBL-CR-402]-A UBL invoice should not include the DeliveryParty PowerOfAttorney - - - - - - - - - - UBL-CR-403 - warning - - - - [UBL-CR-403]-A UBL invoice should not include the DeliveryParty FinancialAccount - - - - - - - - - - UBL-CR-404 - warning - - - - [UBL-CR-404]-A UBL invoice should not include the Delivery NotifyParty - - - - - - - - - - UBL-CR-405 - warning - - - - [UBL-CR-405]-A UBL invoice should not include the Delivery Despatch - - - - - - - - - - UBL-CR-406 - warning - - - - [UBL-CR-406]-A UBL invoice should not include the Delivery DeliveryTerms - - - - - - - - - - UBL-CR-407 - warning - - - - [UBL-CR-407]-A UBL invoice should not include the Delivery MinimumDeliveryUnit - - - - - - - - - - UBL-CR-408 - warning - - - - [UBL-CR-408]-A UBL invoice should not include the Delivery MaximumDeliveryUnit - - - - - - - - - - UBL-CR-409 - warning - - - - [UBL-CR-409]-A UBL invoice should not include the Delivery Shipment - - - - - - - - - - UBL-CR-410 - warning - - - - [UBL-CR-410]-A UBL invoice should not include the DeliveryTerms - - - - - - - - - - UBL-CR-411 - warning - - - - [UBL-CR-411]-A UBL invoice should not include the PaymentMeans ID - - - - - - - - - - UBL-CR-412 - warning - - - - [UBL-CR-412]-A UBL invoice should not include the PaymentMeans PaymentDueDate - - - - - - - - - - UBL-CR-413 - warning - - - - [UBL-CR-413]-A UBL invoice should not include the PaymentMeans PaymentChannelCode - - - - - - - - - - UBL-CR-414 - warning - - - - [UBL-CR-414]-A UBL invoice should not include the PaymentMeans InstructionID - - - - - - - - - - UBL-CR-415 - warning - - - - [UBL-CR-415]-A UBL invoice should not include the PaymentMeans CardAccount CardTypeCode - - - - - - - - - - UBL-CR-416 - warning - - - - [UBL-CR-416]-A UBL invoice should not include the PaymentMeans CardAccount ValidityStartDate - - - - - - - - - - UBL-CR-417 - warning - - - - [UBL-CR-417]-A UBL invoice should not include the PaymentMeans CardAccount ExpiryDate - - - - - - - - - - UBL-CR-418 - warning - - - - [UBL-CR-418]-A UBL invoice should not include the PaymentMeans CardAccount IssuerID - - - - - - - - - - UBL-CR-419 - warning - - - - [UBL-CR-419]-A UBL invoice should not include the PaymentMeans CardAccount IssueNumberID - - - - - - - - - - UBL-CR-420 - warning - - - - [UBL-CR-420]-A UBL invoice should not include the PaymentMeans CardAccount CV2ID - - - - - - - - - - UBL-CR-421 - warning - - - - [UBL-CR-421]-A UBL invoice should not include the PaymentMeans CardAccount CardChipCode - - - - - - - - - - UBL-CR-422 - warning - - - - [UBL-CR-422]-A UBL invoice should not include the PaymentMeans CardAccount ChipApplicationID - - - - - - - - - - UBL-CR-424 - warning - - - - [UBL-CR-424]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount AliasName - - - - - - - - - - UBL-CR-425 - warning - - - - [UBL-CR-425]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount AccountTypeCode - - - - - - - - - - UBL-CR-426 - warning - - - - [UBL-CR-426]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount AccountFormatCode - - - - - - - - - - UBL-CR-427 - warning - - - - [UBL-CR-427]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount CurrencyCode - - - - - - - - - - UBL-CR-428 - warning - - - - [UBL-CR-428]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount PaymentNote - - - - - - - - - - UBL-CR-429 - warning - - - - [UBL-CR-429]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount FinancialInstitutionBranch Name - - - - - - - - - - UBL-CR-430 - warning - - - - [UBL-CR-430]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount FinancialInstitutionBranch FinancialInstitution Name - - - - - - - - - - UBL-CR-431 - warning - - - - [UBL-CR-431]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount FinancialInstitutionBranch FinancialInstitution Address - - - - - - - - - - UBL-CR-432 - warning - - - - [UBL-CR-432]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount FinancialInstitutionBranch Address - - - - - - - - - - UBL-CR-433 - warning - - - - [UBL-CR-433]-A UBL invoice should not include the PaymentMeans PayeeFinancialAccount Country - - - - - - - - - - UBL-CR-434 - warning - - - - [UBL-CR-434]-A UBL invoice should not include the PaymentMeans CreditAccount - - - - - - - - - - UBL-CR-435 - warning - - - - [UBL-CR-435]-A UBL invoice should not include the PaymentMeans PaymentMandate MandateTypeCode - - - - - - - - - - UBL-CR-436 - warning - - - - [UBL-CR-436]-A UBL invoice should not include the PaymentMeans PaymentMandate MaximumPaymentInstructionsNumeric - - - - - - - - - - UBL-CR-437 - warning - - - - [UBL-CR-437]-A UBL invoice should not include the PaymentMeans PaymentMandate MaximumPaidAmount - - - - - - - - - - UBL-CR-438 - warning - - - - [UBL-CR-438]-A UBL invoice should not include the PaymentMeans PaymentMandate SignatureID - - - - - - - - - - UBL-CR-439 - warning - - - - [UBL-CR-439]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerParty - - - - - - - - - - UBL-CR-440 - warning - - - - [UBL-CR-440]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount Name - - - - - - - - - - UBL-CR-441 - warning - - - - [UBL-CR-441]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount AliasName - - - - - - - - - - UBL-CR-442 - warning - - - - [UBL-CR-442]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount AccountTypeCode - - - - - - - - - - UBL-CR-443 - warning - - - - [UBL-CR-443]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount AccountFormatCode - - - - - - - - - - UBL-CR-444 - warning - - - - [UBL-CR-444]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount CurrencyCode - - - - - - - - - - UBL-CR-445 - warning - - - - [UBL-CR-445]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount PaymentNote - - - - - - - - - - UBL-CR-446 - warning - - - - [UBL-CR-446]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount FinancialInstitutionBranch - - - - - - - - - - UBL-CR-447 - warning - - - - [UBL-CR-447]-A UBL invoice should not include the PaymentMeans PaymentMandate PayerFinancialAccount Country - - - - - - - - - - UBL-CR-448 - warning - - - - [UBL-CR-448]-A UBL invoice should not include the PaymentMeans PaymentMandate ValidityPeriod - - - - - - - - - - UBL-CR-449 - warning - - - - [UBL-CR-449]-A UBL invoice should not include the PaymentMeans PaymentMandate PaymentReversalPeriod - - - - - - - - - - UBL-CR-450 - warning - - - - [UBL-CR-450]-A UBL invoice should not include the PaymentMeans PaymentMandate Clause - - - - - - - - - - UBL-CR-451 - warning - - - - [UBL-CR-451]-A UBL invoice should not include the PaymentMeans TradeFinancing - - - - - - - - - - UBL-CR-452 - warning - - - - [UBL-CR-452]-A UBL invoice should not include the PaymentTerms ID - - - - - - - - - - UBL-CR-453 - warning - - - - [UBL-CR-453]-A UBL invoice should not include the PaymentTerms PaymentMeansID - - - - - - - - - - UBL-CR-454 - warning - - - - [UBL-CR-454]-A UBL invoice should not include the PaymentTerms PrepaidPaymentReferenceID - - - - - - - - - - UBL-CR-455 - warning - - - - [UBL-CR-455]-A UBL invoice should not include the PaymentTerms ReferenceEventCode - - - - - - - - - - UBL-CR-456 - warning - - - - [UBL-CR-456]-A UBL invoice should not include the PaymentTerms SettlementDiscountPercent - - - - - - - - - - UBL-CR-457 - warning - - - - [UBL-CR-457]-A UBL invoice should not include the PaymentTerms PenaltySurchargePercent - - - - - - - - - - UBL-CR-458 - warning - - - - [UBL-CR-458]-A UBL invoice should not include the PaymentTerms PaymentPercent - - - - - - - - - - UBL-CR-459 - warning - - - - [UBL-CR-459]-A UBL invoice should not include the PaymentTerms Amount - - - - - - - - - - UBL-CR-460 - warning - - - - [UBL-CR-460]-A UBL invoice should not include the PaymentTerms SettlementDiscountAmount - - - - - - - - - - UBL-CR-461 - warning - - - - [UBL-CR-461]-A UBL invoice should not include the PaymentTerms PenaltyAmount - - - - - - - - - - UBL-CR-462 - warning - - - - [UBL-CR-462]-A UBL invoice should not include the PaymentTerms PaymentTermsDetailsURI - - - - - - - - - - UBL-CR-463 - warning - - - - [UBL-CR-463]-A UBL invoice should not include the PaymentTerms PaymentDueDate - - - - - - - - - - UBL-CR-464 - warning - - - - [UBL-CR-464]-A UBL invoice should not include the PaymentTerms InstallmentDueDate - - - - - - - - - - UBL-CR-465 - warning - - - - [UBL-CR-465]-A UBL invoice should not include the PaymentTerms InvoicingPartyReference - - - - - - - - - - UBL-CR-466 - warning - - - - [UBL-CR-466]-A UBL invoice should not include the PaymentTerms SettlementPeriod - - - - - - - - - - UBL-CR-467 - warning - - - - [UBL-CR-467]-A UBL invoice should not include the PaymentTerms PenaltyPeriod - - - - - - - - - - UBL-CR-468 - warning - - - - [UBL-CR-468]-A UBL invoice should not include the PaymentTerms ExchangeRate - - - - - - - - - - UBL-CR-469 - warning - - - - [UBL-CR-469]-A UBL invoice should not include the PaymentTerms ValidityPeriod - - - - - - - - - - UBL-CR-470 - warning - - - - [UBL-CR-470]-A UBL invoice should not include the PrepaidPayment - - - - - - - - - - UBL-CR-471 - warning - - - - [UBL-CR-471]-A UBL invoice should not include the AllowanceCharge ID - - - - - - - - - - UBL-CR-472 - warning - - - - [UBL-CR-472]-A UBL invoice should not include the AllowanceCharge PrepaidIndicator - - - - - - - - - - UBL-CR-473 - warning - - - - [UBL-CR-473]-A UBL invoice should not include the AllowanceCharge SequenceNumeric - - - - - - - - - - UBL-CR-474 - warning - - - - [UBL-CR-474]-A UBL invoice should not include the AllowanceCharge AccountingCostCode - - - - - - - - - - UBL-CR-475 - warning - - - - [UBL-CR-475]-A UBL invoice should not include the AllowanceCharge AccountingCost - - - - - - - - - - UBL-CR-476 - warning - - - - [UBL-CR-476]-A UBL invoice should not include the AllowanceCharge PerUnitAmount - - - - - - - - - - UBL-CR-477 - warning - - - - [UBL-CR-477]-A UBL invoice should not include the AllowanceCharge TaxCategory Name - - - - - - - - - - UBL-CR-478 - warning - - - - [UBL-CR-478]-A UBL invoice should not include the AllowanceCharge TaxCategory BaseUnitMeasure - - - - - - - - - - UBL-CR-479 - warning - - - - [UBL-CR-479]-A UBL invoice should not include the AllowanceCharge TaxCategory PerUnitAmount - - - - - - - - - - UBL-CR-480 - warning - - - - [UBL-CR-480]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxExemptionReasonCode - - - - - - - - - - UBL-CR-481 - warning - - - - [UBL-CR-481]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxExemptionReason - - - - - - - - - - UBL-CR-482 - warning - - - - [UBL-CR-482]-A UBL invoice should not include the AllowanceCharge TaxCategory TierRange - - - - - - - - - - UBL-CR-483 - warning - - - - [UBL-CR-483]-A UBL invoice should not include the AllowanceCharge TaxCategory TierRatePercent - - - - - - - - - - UBL-CR-484 - warning - - - - [UBL-CR-484]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxScheme Name - - - - - - - - - - UBL-CR-485 - warning - - - - [UBL-CR-485]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-486 - warning - - - - [UBL-CR-486]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-487 - warning - - - - [UBL-CR-487]-A UBL invoice should not include the AllowanceCharge TaxCategory TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-488 - warning - - - - [UBL-CR-488]-A UBL invoice should not include the AllowanceCharge TaxTotal - - - - - - - - - - UBL-CR-489 - warning - - - - [UBL-CR-489]-A UBL invoice should not include the AllowanceCharge PaymentMeans - - - - - - - - - - UBL-CR-490 - warning - - - - [UBL-CR-490]-A UBL invoice should not include the TaxExchangeRate - - - - - - - - - - UBL-CR-491 - warning - - - - [UBL-CR-491]-A UBL invoice should not include the PricingExchangeRate - - - - - - - - - - UBL-CR-492 - warning - - - - [UBL-CR-492]-A UBL invoice should not include the PaymentExchangeRate - - - - - - - - - - UBL-CR-493 - warning - - - - [UBL-CR-493]-A UBL invoice should not include the PaymentAlternativeExchangeRate - - - - - - - - - - UBL-CR-494 - warning - - - - [UBL-CR-494]-A UBL invoice should not include the TaxTotal RoundingAmount - - - - - - - - - - UBL-CR-495 - warning - - - - [UBL-CR-495]-A UBL invoice should not include the TaxTotal TaxEvidenceIndicator - - - - - - - - - - UBL-CR-496 - warning - - - - [UBL-CR-496]-A UBL invoice should not include the TaxTotal TaxIncludedIndicator - - - - - - - - - - UBL-CR-497 - warning - - - - [UBL-CR-497]-A UBL invoice should not include the TaxTotal TaxSubtotal CalulationSequenceNumeric - - - - - - - - - - UBL-CR-498 - warning - - - - [UBL-CR-498]-A UBL invoice should not include the TaxTotal TaxSubtotal TransactionCurrencyTaxAmount - - - - - - - - - - UBL-CR-499 - warning - - - - [UBL-CR-499]-A UBL invoice should not include the TaxTotal TaxSubtotal Percent - - - - - - - - - - UBL-CR-500 - warning - - - - [UBL-CR-500]-A UBL invoice should not include the TaxTotal TaxSubtotal BaseUnitMeasure - - - - - - - - - - UBL-CR-501 - warning - - - - [UBL-CR-501]-A UBL invoice should not include the TaxTotal TaxSubtotal PerUnitAmount - - - - - - - - - - UBL-CR-502 - warning - - - - [UBL-CR-502]-A UBL invoice should not include the TaxTotal TaxSubtotal TierRange - - - - - - - - - - UBL-CR-503 - warning - - - - [UBL-CR-503]-A UBL invoice should not include the TaxTotal TaxSubtotal TierRatePercent - - - - - - - - - - UBL-CR-504 - warning - - - - [UBL-CR-504]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory Name - - - - - - - - - - UBL-CR-505 - warning - - - - [UBL-CR-505]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory BaseUnitMeasure - - - - - - - - - - UBL-CR-506 - warning - - - - [UBL-CR-506]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory PerUnitAmount - - - - - - - - - - UBL-CR-507 - warning - - - - [UBL-CR-507]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TierRange - - - - - - - - - - UBL-CR-508 - warning - - - - [UBL-CR-508]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TierRatePercent - - - - - - - - - - UBL-CR-509 - warning - - - - [UBL-CR-509]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TaxScheme Name - - - - - - - - - - UBL-CR-510 - warning - - - - [UBL-CR-510]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-511 - warning - - - - [UBL-CR-511]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-512 - warning - - - - [UBL-CR-512]-A UBL invoice should not include the TaxTotal TaxSubtotal TaxCategory TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-513 - warning - - - - [UBL-CR-513]-A UBL invoice should not include the WithholdingTaxTotal - - - - - - - - - - UBL-CR-514 - warning - - - - [UBL-CR-514]-A UBL invoice should not include the LegalMonetaryTotal PayableAlternativeAmount - - - - - - - - - - UBL-CR-515 - warning - - - - [UBL-CR-515]-A UBL invoice should not include the InvoiceLine UUID - - - - - - - - - - UBL-CR-516 - warning - - - - [UBL-CR-516]-A UBL invoice should not include the InvoiceLine TaxPointDate - - - - - - - - - - UBL-CR-517 - warning - - - - [UBL-CR-517]-A UBL invoice should not include the InvoiceLine AccountingCostCode - - - - - - - - - - UBL-CR-518 - warning - - - - [UBL-CR-518]-A UBL invoice should not include the InvoiceLine PaymentPurposeCode - - - - - - - - - - UBL-CR-519 - warning - - - - [UBL-CR-519]-A UBL invoice should not include the InvoiceLine FreeOfChargeIndicator - - - - - - - - - - UBL-CR-520 - warning - - - - [UBL-CR-520]-A UBL invoice should not include the InvoiceLine InvoicePeriod StartTime - - - - - - - - - - UBL-CR-521 - warning - - - - [UBL-CR-521]-A UBL invoice should not include the InvoiceLine InvoicePeriod EndTime - - - - - - - - - - UBL-CR-522 - warning - - - - [UBL-CR-522]-A UBL invoice should not include the InvoiceLine InvoicePeriod DurationMeasure - - - - - - - - - - UBL-CR-523 - warning - - - - [UBL-CR-523]-A UBL invoice should not include the InvoiceLine InvoicePeriod DescriptionCode - - - - - - - - - - UBL-CR-524 - warning - - - - [UBL-CR-524]-A UBL invoice should not include the InvoiceLine InvoicePeriod Description - - - - - - - - - - UBL-CR-525 - warning - - - - [UBL-CR-525]-A UBL invoice should not include the InvoiceLine OrderLineReference SalesOrderLineID - - - - - - - - - - UBL-CR-526 - warning - - - - [UBL-CR-526]-A UBL invoice should not include the InvoiceLine OrderLineReference UUID - - - - - - - - - - UBL-CR-527 - warning - - - - [UBL-CR-527]-A UBL invoice should not include the InvoiceLine OrderLineReference LineStatusCode - - - - - - - - - - UBL-CR-528 - warning - - - - [UBL-CR-528]-A UBL invoice should not include the InvoiceLine OrderLineReference OrderReference - - - - - - - - - - UBL-CR-529 - warning - - - - [UBL-CR-529]-A UBL invoice should not include the InvoiceLine DespatchLineReference - - - - - - - - - - UBL-CR-530 - warning - - - - [UBL-CR-530]-A UBL invoice should not include the InvoiceLine ReceiptLineReference - - - - - - - - - - UBL-CR-531 - warning - - - - [UBL-CR-531]-A UBL invoice should not include the InvoiceLine BillingReference - - - - - - - - - - UBL-CR-532 - warning - - - - [UBL-CR-532]-A UBL invoice should not include the InvoiceLine DocumentReference CopyIndicator - - - - - - - - - - UBL-CR-533 - warning - - - - [UBL-CR-533]-A UBL invoice should not include the InvoiceLine DocumentReference UUID - - - - - - - - - - UBL-CR-534 - warning - - - - [UBL-CR-534]-A UBL invoice should not include the InvoiceLine DocumentReference IssueDate - - - - - - - - - - UBL-CR-535 - warning - - - - [UBL-CR-535]-A UBL invoice should not include the InvoiceLine DocumentReference IssueTime - - - - - - - - - - UBL-CR-537 - warning - - - - [UBL-CR-537]-A UBL invoice should not include the InvoiceLine DocumentReference DocumentType - - - - - - - - - - UBL-CR-538 - warning - - - - [UBL-CR-538]-A UBL invoice should not include the InvoiceLine DocumentReference Xpath - - - - - - - - - - UBL-CR-539 - warning - - - - [UBL-CR-539]-A UBL invoice should not include the InvoiceLine DocumentReference LanguageID - - - - - - - - - - UBL-CR-540 - warning - - - - [UBL-CR-540]-A UBL invoice should not include the InvoiceLine DocumentReference LocaleCode - - - - - - - - - - UBL-CR-541 - warning - - - - [UBL-CR-541]-A UBL invoice should not include the InvoiceLine DocumentReference VersionID - - - - - - - - - - UBL-CR-542 - warning - - - - [UBL-CR-542]-A UBL invoice should not include the InvoiceLine DocumentReference DocumentStatusCode - - - - - - - - - - UBL-CR-543 - warning - - - - [UBL-CR-543]-A UBL invoice should not include the InvoiceLine DocumentReference DocumentDescription - - - - - - - - - - UBL-CR-544 - warning - - - - [UBL-CR-544]-A UBL invoice should not include the InvoiceLine DocumentReference Attachment - - - - - - - - - - UBL-CR-545 - warning - - - - [UBL-CR-545]-A UBL invoice should not include the InvoiceLine DocumentReference ValidityPeriod - - - - - - - - - - UBL-CR-546 - warning - - - - [UBL-CR-546]-A UBL invoice should not include the InvoiceLine DocumentReference IssuerParty - - - - - - - - - - UBL-CR-547 - warning - - - - [UBL-CR-547]-A UBL invoice should not include the InvoiceLine DocumentReference ResultOfVerification - - - - - - - - - - UBL-CR-548 - warning - - - - [UBL-CR-548]-A UBL invoice should not include the InvoiceLine PricingReference - - - - - - - - - - UBL-CR-549 - warning - - - - [UBL-CR-549]-A UBL invoice should not include the InvoiceLine OriginatorParty - - - - - - - - - - UBL-CR-550 - warning - - - - [UBL-CR-550]-A UBL invoice should not include the InvoiceLine Delivery - - - - - - - - - - UBL-CR-551 - warning - - - - [UBL-CR-551]-A UBL invoice should not include the InvoiceLine PaymentTerms - - - - - - - - - - UBL-CR-552 - warning - - - - [UBL-CR-552]-A UBL invoice should not include the InvoiceLine AllowanceCharge ID - - - - - - - - - - UBL-CR-553 - warning - - - - [UBL-CR-553]-A UBL invoice should not include the InvoiceLine AllowanceCharge PrepaidIndicator - - - - - - - - - - UBL-CR-554 - warning - - - - [UBL-CR-554]-A UBL invoice should not include the InvoiceLine AllowanceCharge SequenceNumeric - - - - - - - - - - UBL-CR-555 - warning - - - - [UBL-CR-555]-A UBL invoice should not include the InvoiceLine AllowanceCharge AccountingCostCode - - - - - - - - - - UBL-CR-556 - warning - - - - [UBL-CR-556]-A UBL invoice should not include the InvoiceLine AllowanceCharge AccountingCost - - - - - - - - - - UBL-CR-557 - warning - - - - [UBL-CR-557]-A UBL invoice should not include the InvoiceLine AllowanceCharge PerUnitAmount - - - - - - - - - - UBL-CR-558 - warning - - - - [UBL-CR-558]-A UBL invoice should not include the InvoiceLine AllowanceCharge TaxCategory - - - - - - - - - - UBL-CR-559 - warning - - - - [UBL-CR-559]-A UBL invoice should not include the InvoiceLine AllowanceCharge TaxTotal - - - - - - - - - - UBL-CR-560 - warning - - - - [UBL-CR-560]-A UBL invoice should not include the InvoiceLine AllowanceCharge PaymentMeans - - - - - - - - - - UBL-CR-561 - warning - - - - [UBL-CR-561]-A UBL invoice should not include the InvoiceLine TaxTotal - - - - - - - - - - UBL-CR-562 - warning - - - - [UBL-CR-562]-A UBL invoice should not include the InvoiceLine WithholdingTaxTotal - - - - - - - - - - UBL-CR-563 - warning - - - - [UBL-CR-563]-A UBL invoice should not include the InvoiceLine Item PackQuantity - - - - - - - - - - UBL-CR-564 - warning - - - - [UBL-CR-564]-A UBL invoice should not include the InvoiceLine Item PackSizeNumeric - - - - - - - - - - UBL-CR-565 - warning - - - - [UBL-CR-565]-A UBL invoice should not include the InvoiceLine Item CatalogueIndicator - - - - - - - - - - UBL-CR-566 - warning - - - - [UBL-CR-566]-A UBL invoice should not include the InvoiceLine Item HazardousRiskIndicator - - - - - - - - - - UBL-CR-567 - warning - - - - [UBL-CR-567]-A UBL invoice should not include the InvoiceLine Item AdditionalInformation - - - - - - - - - - UBL-CR-568 - warning - - - - [UBL-CR-568]-A UBL invoice should not include the InvoiceLine Item Keyword - - - - - - - - - - UBL-CR-569 - warning - - - - [UBL-CR-569]-A UBL invoice should not include the InvoiceLine Item BrandName - - - - - - - - - - UBL-CR-570 - warning - - - - [UBL-CR-570]-A UBL invoice should not include the InvoiceLine Item ModelName - - - - - - - - - - UBL-CR-571 - warning - - - - [UBL-CR-571]-A UBL invoice should not include the InvoiceLine Item BuyersItemIdentification ExtendedID - - - - - - - - - - UBL-CR-572 - warning - - - - [UBL-CR-572]-A UBL invoice should not include the InvoiceLine Item BuyersItemIdentification BarecodeSymbologyID - - - - - - - - - - UBL-CR-573 - warning - - - - [UBL-CR-573]-A UBL invoice should not include the InvoiceLine Item BuyersItemIdentification PhysicalAttribute - - - - - - - - - - UBL-CR-574 - warning - - - - [UBL-CR-574]-A UBL invoice should not include the InvoiceLine Item BuyersItemIdentification MeasurementDimension - - - - - - - - - - UBL-CR-575 - warning - - - - [UBL-CR-575]-A UBL invoice should not include the InvoiceLine Item BuyersItemIdentification IssuerParty - - - - - - - - - - UBL-CR-576 - warning - - - - [UBL-CR-576]-A UBL invoice should not include the InvoiceLine Item SellersItemIdentification ExtendedID - - - - - - - - - - UBL-CR-577 - warning - - - - [UBL-CR-577]-A UBL invoice should not include the InvoiceLine Item SellersItemIdentification BarecodeSymbologyID - - - - - - - - - - UBL-CR-578 - warning - - - - [UBL-CR-578]-A UBL invoice should not include the InvoiceLine Item SellersItemIdentification PhysicalAttribute - - - - - - - - - - UBL-CR-579 - warning - - - - [UBL-CR-579]-A UBL invoice should not include the InvoiceLine Item SellersItemIdentification MeasurementDimension - - - - - - - - - - UBL-CR-580 - warning - - - - [UBL-CR-580]-A UBL invoice should not include the InvoiceLine Item SellersItemIdentification IssuerParty - - - - - - - - - - UBL-CR-581 - warning - - - - [UBL-CR-581]-A UBL invoice should not include the InvoiceLine Item ManufacturersItemIdentification - - - - - - - - - - UBL-CR-582 - warning - - - - [UBL-CR-582]-A UBL invoice should not include the InvoiceLine Item StandardItemIdentification ExtendedID - - - - - - - - - - UBL-CR-583 - warning - - - - [UBL-CR-583]-A UBL invoice should not include the InvoiceLine Item StandardItemIdentification BarecodeSymbologyID - - - - - - - - - - UBL-CR-584 - warning - - - - [UBL-CR-584]-A UBL invoice should not include the InvoiceLine Item StandardItemIdentification PhysicalAttribute - - - - - - - - - - UBL-CR-585 - warning - - - - [UBL-CR-585]-A UBL invoice should not include the InvoiceLine Item StandardItemIdentification MeasurementDimension - - - - - - - - - - UBL-CR-586 - warning - - - - [UBL-CR-586]-A UBL invoice should not include the InvoiceLine Item StandardItemIdentification IssuerParty - - - - - - - - - - UBL-CR-587 - warning - - - - [UBL-CR-587]-A UBL invoice should not include the InvoiceLine Item CatalogueItemIdentification - - - - - - - - - - UBL-CR-588 - warning - - - - [UBL-CR-588]-A UBL invoice should not include the InvoiceLine Item AdditionalItemIdentification - - - - - - - - - - UBL-CR-589 - warning - - - - [UBL-CR-589]-A UBL invoice should not include the InvoiceLine Item CatalogueDocumentReference - - - - - - - - - - UBL-CR-590 - warning - - - - [UBL-CR-590]-A UBL invoice should not include the InvoiceLine Item ItemSpecificationDocumentReference - - - - - - - - - - UBL-CR-591 - warning - - - - [UBL-CR-591]-A UBL invoice should not include the InvoiceLine Item OriginCountry Name - - - - - - - - - - UBL-CR-592 - warning - - - - [UBL-CR-592]-A UBL invoice should not include the InvoiceLine Item CommodityClassification NatureCode - - - - - - - - - - UBL-CR-593 - warning - - - - [UBL-CR-593]-A UBL invoice should not include the InvoiceLine Item CommodityClassification CargoTypeCode - - - - - - - - - - UBL-CR-594 - warning - - - - [UBL-CR-594]-A UBL invoice should not include the InvoiceLine Item CommodityClassification CommodityCode - - - - - - - - - - UBL-CR-595 - warning - - - - [UBL-CR-595]-A UBL invoice should not include the InvoiceLine Item TransactionConditions - - - - - - - - - - UBL-CR-596 - warning - - - - [UBL-CR-596]-A UBL invoice should not include the InvoiceLine Item HazardousItem - - - - - - - - - - UBL-CR-597 - warning - - - - [UBL-CR-597]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory Name - - - - - - - - - - UBL-CR-598 - warning - - - - [UBL-CR-598]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory BaseUnitMeasure - - - - - - - - - - UBL-CR-599 - warning - - - - [UBL-CR-599]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory PerUnitAmount - - - - - - - - - - UBL-CR-600 - warning - - - - [UBL-CR-600]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxExemptionReasonCode - - - - - - - - - - UBL-CR-601 - warning - - - - [UBL-CR-601]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxExemptionReason - - - - - - - - - - UBL-CR-602 - warning - - - - [UBL-CR-602]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TierRange - - - - - - - - - - UBL-CR-603 - warning - - - - [UBL-CR-603]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TierRatePercent - - - - - - - - - - UBL-CR-604 - warning - - - - [UBL-CR-604]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxScheme Name - - - - - - - - - - UBL-CR-605 - warning - - - - [UBL-CR-605]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxScheme TaxTypeCode - - - - - - - - - - UBL-CR-606 - warning - - - - [UBL-CR-606]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxScheme CurrencyCode - - - - - - - - - - UBL-CR-607 - warning - - - - [UBL-CR-607]-A UBL invoice should not include the InvoiceLine Item ClassifiedTaxCategory TaxScheme JurisdictionRegionAddress - - - - - - - - - - UBL-CR-608 - warning - - - - [UBL-CR-608]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ID - - - - - - - - - - UBL-CR-609 - warning - - - - [UBL-CR-609]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty NameCode - - - - - - - - - - UBL-CR-610 - warning - - - - [UBL-CR-610]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty TestMethod - - - - - - - - - - UBL-CR-611 - warning - - - - [UBL-CR-611]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ValueQuantity - - - - - - - - - - UBL-CR-612 - warning - - - - [UBL-CR-612]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ValueQualifier - - - - - - - - - - UBL-CR-613 - warning - - - - [UBL-CR-613]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ImportanceCode - - - - - - - - - - UBL-CR-614 - warning - - - - [UBL-CR-614]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ListValue - - - - - - - - - - UBL-CR-615 - warning - - - - [UBL-CR-615]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty UsabilityPeriod - - - - - - - - - - UBL-CR-616 - warning - - - - [UBL-CR-616]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ItemPropertyGroup - - - - - - - - - - UBL-CR-617 - warning - - - - [UBL-CR-617]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty RangeDimension - - - - - - - - - - UBL-CR-618 - warning - - - - [UBL-CR-618]-A UBL invoice should not include the InvoiceLine Item AdditionalItemProperty ItemPropertyRange - - - - - - - - - - UBL-CR-619 - warning - - - - [UBL-CR-619]-A UBL invoice should not include the InvoiceLine Item ManufacturerParty - - - - - - - - - - UBL-CR-620 - warning - - - - [UBL-CR-620]-A UBL invoice should not include the InvoiceLine Item InformationContentProviderParty - - - - - - - - - - UBL-CR-621 - warning - - - - [UBL-CR-621]-A UBL invoice should not include the InvoiceLine Item OriginAddress - - - - - - - - - - UBL-CR-622 - warning - - - - [UBL-CR-622]-A UBL invoice should not include the InvoiceLine Item ItemInstance - - - - - - - - - - UBL-CR-623 - warning - - - - [UBL-CR-623]-A UBL invoice should not include the InvoiceLine Item Certificate - - - - - - - - - - UBL-CR-624 - warning - - - - [UBL-CR-624]-A UBL invoice should not include the InvoiceLine Item Dimension - - - - - - - - - - UBL-CR-625 - warning - - - - [UBL-CR-625]-A UBL invoice should not include the InvoiceLine Item Price PriceChangeReason - - - - - - - - - - UBL-CR-626 - warning - - - - [UBL-CR-626]-A UBL invoice should not include the InvoiceLine Item Price PriceTypeCode - - - - - - - - - - UBL-CR-627 - warning - - - - [UBL-CR-627]-A UBL invoice should not include the InvoiceLine Item Price PriceType - - - - - - - - - - UBL-CR-628 - warning - - - - [UBL-CR-628]-A UBL invoice should not include the InvoiceLine Item Price OrderableUnitFactorRate - - - - - - - - - - UBL-CR-629 - warning - - - - [UBL-CR-629]-A UBL invoice should not include the InvoiceLine Item Price ValidityPeriod - - - - - - - - - - UBL-CR-630 - warning - - - - [UBL-CR-630]-A UBL invoice should not include the InvoiceLine Item Price PriceList - - - - - - - - - - UBL-CR-631 - warning - - - - [UBL-CR-631]-A UBL invoice should not include the InvoiceLine Item Price OrderableUnitFactorRate - - - - - - - - - - UBL-CR-632 - warning - - - - [UBL-CR-632]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge ID - - - - - - - - - - UBL-CR-633 - warning - - - - [UBL-CR-633]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge AllowanceChargeReasonCode - - - - - - - - - - UBL-CR-634 - warning - - - - [UBL-CR-634]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge AllowanceChargeReason - - - - - - - - - - UBL-CR-635 - warning - - - - [UBL-CR-635]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge MultiplierFactorNumeric - - - - - - - - - - UBL-CR-636 - warning - - - - [UBL-CR-636]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge PrepaidIndicator - - - - - - - - - - UBL-CR-637 - warning - - - - [UBL-CR-637]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge SequenceNumeric - - - - - - - - - - UBL-CR-638 - warning - - - - [UBL-CR-638]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge AccountingCostCode - - - - - - - - - - UBL-CR-639 - warning - - - - [UBL-CR-639]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge AccountingCost - - - - - - - - - - UBL-CR-640 - warning - - - - [UBL-CR-640]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge PerUnitAmount - - - - - - - - - - UBL-CR-641 - warning - - - - [UBL-CR-641]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge TaxCategory - - - - - - - - - - UBL-CR-642 - warning - - - - [UBL-CR-642]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge TaxTotal - - - - - - - - - - UBL-CR-643 - warning - - - - [UBL-CR-643]-A UBL invoice should not include the InvoiceLine Item Price AllowanceCharge PaymentMeans - - - - - - - - - - UBL-CR-644 - warning - - - - [UBL-CR-644]-A UBL invoice should not include the InvoiceLine Item Price PricingExchangeRate - - - - - - - - - - UBL-CR-645 - warning - - - - [UBL-CR-645]-A UBL invoice should not include the InvoiceLine DeliveryTerms - - - - - - - - - - UBL-CR-646 - warning - - - - [UBL-CR-646]-A UBL invoice should not include the InvoiceLine SubInvoiceLine - - - - - - - - - - UBL-CR-647 - warning - - - - [UBL-CR-647]-A UBL invoice should not include the InvoiceLine ItemPriceExtension - - - - - - - - - - UBL-CR-648 - warning - - - - [UBL-CR-648]-A UBL invoice should not include the CustomizationID scheme identifier - - - - - - - - - - UBL-CR-649 - warning - - - - [UBL-CR-649]-A UBL invoice should not include the ProfileID scheme identifier - - - - - - - - - - UBL-CR-650 - warning - - - - [UBL-CR-650]-A UBL invoice shall not include the Invoice ID scheme identifier - - - - - - - - - - UBL-CR-651 - warning - - - - [UBL-CR-651]-A UBL invoice should not include the SalesOrderID scheme identifier - - - - - - - - - - UBL-CR-652 - warning - - - - [UBL-CR-652]-A UBL invoice should not include the PartyTaxScheme CompanyID scheme identifier - - - - - - - - - - UBL-CR-653 - warning - - - - [UBL-CR-653]-A UBL invoice should not include the PaymentID scheme identifier - - - - - - - - - - UBL-CR-654 - warning - - - - [UBL-CR-654]-A UBL invoice should not include the PayeeFinancialAccount scheme identifier - - - - - - - - - - UBL-CR-655 - warning - - - - [UBL-CR-655]-A UBL invoice shall not include the FinancialInstitutionBranch ID scheme identifier - - - - - - - - - - UBL-CR-656 - warning - - - - [UBL-CR-656]-A UBL invoice should not include the InvoiceTypeCode listID - - - - - - - - - - UBL-CR-657 - warning - - - - [UBL-CR-657]-A UBL invoice should not include the DocumentCurrencyCode listID - - - - - - - - - - UBL-CR-658 - warning - - - - [UBL-CR-658]-A UBL invoice should not include the TaxCurrencyCode listID - - - - - - - - - - UBL-CR-659 - warning - - - - [UBL-CR-659]-A UBL invoice shall not include the AdditionalDocumentReference DocumentTypeCode listID - - - - - - - - - - UBL-CR-660 - warning - - - - [UBL-CR-660]-A UBL invoice should not include the Country Identification code listID - - - - - - - - - - UBL-CR-661 - warning - - - - [UBL-CR-661]-A UBL invoice should not include the PaymentMeansCode listID - - - - - - - - - - UBL-CR-662 - warning - - - - [UBL-CR-662]-A UBL invoice should not include the AllowanceChargeReasonCode listID - - - - - - - - - - UBL-CR-663 - warning - - - - [UBL-CR-663]-A UBL invoice should not include the unitCodeListID - - - - - - - - - - UBL-CR-664 - warning - - - - [UBL-CR-664]-A UBL invoice should not include the FinancialInstitutionBranch FinancialInstitution - - - - - - - - - - UBL-CR-665 - warning - - - - [UBL-CR-665]-A UBL invoice should not include the AdditionalDocumentReference ID schemeID unless the DocumentTypeCode equals '130' - - - - - - - - - - UBL-CR-666 - fatal - - - - [UBL-CR-666]-A UBL invoice shall not include an AdditionalDocumentReference simultaneously referring an Invoice Object Identifier and an Attachment - - - - - - - - - - UBL-CR-667 - warning - - - - [UBL-CR-667]-A UBL invoice should not include a Buyer Item Identification schemeID - - - - - - - - - - UBL-CR-668 - warning - - - - [UBL-CR-668]-A UBL invoice should not include a Sellers Item Identification schemeID - - - - - - - - - - UBL-CR-669 - warning - - - - [UBL-CR-669]-A UBL invoice should not include a Price Allowance Reason Code - - - - - - - - - - UBL-CR-670 - warning - - - - [UBL-CR-670]-A UBL invoice should not include a Price Allowance Reason - - - - - - - - - - UBL-CR-671 - warning - - - - [UBL-CR-671]-A UBL invoice should not include a Price Allowance Multiplier Factor - - - - - - - - - - UBL-CR-672 - warning - - - - [UBL-CR-672]-A UBL credit note should not include the CreditNoteTypeCode listID - - - - - - - - - - UBL-CR-673 - fatal - - - - [UBL-CR-673]-A UBL invoice shall not include an AdditionalDocumentReference simultaneously referring an Invoice Object Identifier and an Document Description - - - - - - - - - - UBL-CR-674 - warning - - - - [UBL-CR-674]-A UBL invoice should not include the PrimaryAccountNumber schemeID - - - - - - - - - - UBL-CR-675 - warning - - - - [UBL-CR-675]-A UBL invoice should not include the NetworkID schemeID - - - - - - - - - - UBL-CR-676 - warning - - - - [UBL-CR-676]-A UBL invoice should not include the PaymentMandate/ID schemeID - - - - - - - - - - UBL-CR-677 - warning - - - - [UBL-CR-677]-A UBL invoice should not include the PayerFinancialAccount/ID schemeID - - - - - - - - - - UBL-CR-678 - warning - - - - [UBL-CR-678]-A UBL invoice should not include the TaxCategory/ID schemeID - - - - - - - - - - UBL-CR-679 - warning - - - - [UBL-CR-679]-A UBL invoice should not include the ClassifiedTaxCategory/ID schemeID - - - - - - - - - - UBL-CR-680 - warning - - - - [UBL-CR-680]-A UBL invoice should not include the PaymentMeans/PayerFinancialAccount - - - - - - - - - - UBL-CR-681 - warning - - - - [UBL-CR-681]-A UBL invoice should not include the PaymentMeans InstructionNote - - - - - - - - - - UBL-CR-682 - warning - - - - [UBL-CR-682]-A UBL invoice should not include the Delivery DeliveryAddress - - - - - - - - - - UBL-DT-08 - warning - - - - [UBL-DT-08]-Scheme name attribute should not be present - - - - - - - - - - UBL-DT-09 - warning - - - - [UBL-DT-09]-Scheme agency name attribute should not be present - - - - - - - - - - UBL-DT-10 - warning - - - - [UBL-DT-10]-Scheme data uri attribute should not be present - - - - - - - - - - UBL-DT-11 - warning - - - - [UBL-DT-11]-Scheme uri attribute should not be present - - - - - - - - - - UBL-DT-12 - warning - - - - [UBL-DT-12]-Format attribute should not be present - - - - - - - - - - UBL-DT-13 - warning - - - - [UBL-DT-13]-Unit code list identifier attribute should not be present - - - - - - - - - - UBL-DT-14 - warning - - - - [UBL-DT-14]-Unit code list agency identifier attribute should not be present - - - - - - - - - - UBL-DT-15 - warning - - - - [UBL-DT-15]-Unit code list agency name attribute should not be present - - - - - - - - - - UBL-DT-16 - warning - - - - [UBL-DT-16]-List agency name attribute should not be present - - - - - - - - - - UBL-DT-17 - warning - - - - [UBL-DT-17]-List name attribute should not be present - - - - - - - - - - UBL-DT-18 - warning - - - - [UBL-DT-18]-Name attribute should not be present - - - - - - - - - - UBL-DT-19 - warning - - - - [UBL-DT-19]-Language identifier attribute should not be present - - - - - - - - - - UBL-DT-20 - warning - - - - [UBL-DT-20]-List uri attribute should not be present - - - - - - - - - - UBL-DT-21 - warning - - - - [UBL-DT-21]-List scheme uri attribute should not be present - - - - - - - - - - UBL-DT-22 - warning - - - - [UBL-DT-22]-Language local identifier attribute should not be present - - - - - - - - - - UBL-DT-23 - warning - - - - [UBL-DT-23]-Uri attribute should not be present - - - - - - - - - - UBL-DT-24 - warning - - - - [UBL-DT-24]-Currency code list version id should not be present - - - - - - - - - - UBL-DT-25 - warning - - - - [UBL-DT-25]-CharacterSetCode attribute should not be present - - - - - - - - - - UBL-DT-26 - warning - - - - [UBL-DT-26]-EncodingCode attribute should not be present - - - - - - - - - - UBL-DT-27 - warning - - - - [UBL-DT-27]-Scheme Agency ID attribute should not be present - - - - - - - - - - UBL-DT-28 - warning - - - - [UBL-DT-28]-List Agency ID attribute should not be present - - - - - - - - - - UBL-SR-01 - fatal - - - - [UBL-SR-01]-Contract identifier shall occur maximum once. - - - - - - - - - - UBL-SR-02 - fatal - - - - [UBL-SR-02]-Receive advice identifier shall occur maximum once - - - - - - - - - - UBL-SR-03 - fatal - - - - [UBL-SR-03]-Despatch advice identifier shall occur maximum once - - - - - - - - - - UBL-SR-04 - fatal - - - - [UBL-SR-04]-Invoice object identifier shall occur maximum once - - - - - - - - - - UBL-SR-05 - fatal - - - - [UBL-SR-05]-Payment terms shall occur maximum once - - - - - - - - - - UBL-SR-08 - fatal - - - - [UBL-SR-08]-Invoice period shall occur maximum once - - - - - - - - - - UBL-SR-09 - fatal - - - - [UBL-SR-09]-Seller name shall occur maximum once - - - - - - - - - - UBL-SR-10 - fatal - - - - [UBL-SR-10]-Seller trader name shall occur maximum once - - - - - - - - - - UBL-SR-11 - fatal - - - - [UBL-SR-11]-Seller legal registration identifier shall occur maximum once - - - - - - - - - - UBL-SR-12 - fatal - - - - [UBL-SR-12]-Seller VAT identifier shall occur maximum once - - - - - - - - - - UBL-SR-13 - fatal - - - - [UBL-SR-13]-Seller tax registration shall occur maximum once - - - - - - - - - - UBL-SR-14 - fatal - - - - [UBL-SR-14]-Seller additional legal information shall occur maximum once - - - - - - - - - - UBL-SR-15 - fatal - - - - [UBL-SR-15]-Buyer name shall occur maximum once - - - - - - - - - - UBL-SR-16 - fatal - - - - [UBL-SR-16]-Buyer identifier shall occur maximum once - - - - - - - - - - UBL-SR-17 - fatal - - - - [UBL-SR-17]-Buyer legal registration identifier shall occur maximum once - - - - - - - - - - UBL-SR-18 - fatal - - - - [UBL-SR-18]-Buyer VAT identifier shall occur maximum once - - - - - - - - - - UBL-SR-24 - fatal - - - - [UBL-SR-24]-Deliver to information shall occur maximum once - - - - - - - - - - UBL-SR-29 - fatal - - - - [UBL-SR-29]-Bank creditor reference shall occur maximum once - - - - - - - - - - UBL-SR-39 - fatal - - - - [UBL-SR-39]-Project reference shall occur maximum once. - - - - - - - - - - UBL-SR-40 - fatal - - - - [UBL-SR-40]-Buyer trade name shall occur maximum once - - - - - - - - - - UBL-SR-44 - fatal - - - - [UBL-SR-44]-An Invoice may only have one unique PaymentID, but the PaymentID may be used for multiple PaymentMeans - - - - - - - - - - UBL-SR-45 - fatal - - - - [UBL-SR-45]-Due Date shall occur maximum once - - - - - - - - - - UBL-SR-46 - fatal - - - - [UBL-SR-46]-Payment means text shall occur maximum once - - - - - - - - - - UBL-SR-47 - fatal - - - - [UBL-SR-47]-When there are more than one payment means code, they shall be equal - - - - - - - - - - UBL-SR-49 - fatal - - - - [UBL-SR-49]-Value tax point date shall occur maximum once - - - - - - - - - - - - - - - - UBL-SR-34 - fatal - - - - [UBL-SR-34]-Invoice line note shall occur maximum once - - - - - - - - - - UBL-SR-35 - fatal - - - - [UBL-SR-35]-Referenced purchase order line identifier shall occur maximum once - - - - - - - - - - UBL-SR-36 - fatal - - - - [UBL-SR-36]-Invoice line period shall occur maximum once - - - - - - - - - - UBL-SR-37 - fatal - - - - [UBL-SR-37]-Item price discount shall occur maximum once - - - - - - - - - - UBL-SR-48 - fatal - - - - [UBL-SR-48]-Invoice lines shall have one and only one classified tax category. - - - - - - - - - - UBL-SR-50 - fatal - - - - [UBL-SR-50]-Item description shall occur maximum once - - - - - - - - - - UBL-SR-52 - fatal - - - - [UBL-SR-52]-Document reference shall occur maximum once - - - - - - - - - - - - - - - - UBL-SR-19 - fatal - - - - [UBL-SR-19]-Payee name shall occur maximum once, if the Payee is different from the Seller - - - - - - - - - - UBL-SR-20 - fatal - - - - [UBL-SR-20]-Payee identifier shall occur maximum once, if the Payee is different from the Seller - - - - - - - - - - UBL-SR-21 - fatal - - - - [UBL-SR-21]-Payee legal registration identifier shall occur maximum once, if the Payee is different from the Seller - - - - - - - - - - - - - - - - UBL-SR-26 - fatal - - - - [UBL-SR-26]-Payment reference shall occur maximum once - - - - - - - - - - UBL-SR-27 - fatal - - - - [UBL-SR-27]-Payment means text shall occur maximum once - - - - - - - - - - UBL-SR-28 - fatal - - - - [UBL-SR-28]-Mandate reference identifier shall occur maximum once - - - - - - - - - - - - - - - - UBL-SR-06 - fatal - - - - [UBL-SR-06]-Preceding invoice reference shall occur maximum once - - - - - - - - - - UBL-SR-07 - fatal - - - - [UBL-SR-07]-If there is a preceding invoice reference, the preceding invoice number shall be present - - - - - - - - - - - - - - - - UBL-SR-22 - fatal - - - - [UBL-SR-22]-Seller tax representative name shall occur maximum once, if the Seller has a tax representative - - - - - - - - - - UBL-SR-23 - fatal - - - - [UBL-SR-23]-Seller tax representative VAT identifier shall occur maximum once, if the Seller has a tax representative - - - - - - - - - - - - - - - - UBL-SR-32 - fatal - - - - [UBL-SR-32]-VAT exemption reason text shall occur maximum once - - - - - - - - - - - - - - - - - - - - - - - BR-CL-01 - fatal - - - - [BR-CL-01]-The document type code MUST be coded by the invoice and credit note related code lists of UNTDID 1001. - - - - - - - - - - - - - - - - BR-CL-03 - fatal - - - - [BR-CL-03]-currencyID MUST be coded using ISO code list 4217 alpha-3 - - - - - - - - - - - - - - - - BR-CL-04 - fatal - - - - [BR-CL-04]-Invoice currency code MUST be coded using ISO code list 4217 alpha-3 - - - - - - - - - - - - - - - - BR-CL-05 - fatal - - - - [BR-CL-05]-Tax currency code MUST be coded using ISO code list 4217 alpha-3 - - - - - - - - - - - - - - - - BR-CL-06 - fatal - - - - [BR-CL-06]-Value added tax point date code MUST be coded using a restriction of UNTDID 2005. - - - - - - - - - - - - - - - - BR-CL-07 - fatal - - - - [BR-CL-07]-Object identifier identification scheme identifier MUST be coded using a restriction of UNTDID 1153. - - - - - - - - - - - - - - - - BR-CL-10 - fatal - - - - [BR-CL-10]-Any identifier identification scheme identifier MUST be coded using one of the ISO 6523 ICD list. - - - - - - - - - - - - - - - - BR-CL-11 - fatal - - - - [BR-CL-11]-Any registration identifier identification scheme identifier MUST be coded using one of the ISO 6523 ICD list. - - - - - - - - - - - - - - - - BR-CL-13 - fatal - - - - [BR-CL-13]-Item classification identifier identification scheme identifier MUST be - coded using one of the UNTDID 7143 list. - - - - - - - - - - - - - - - - BR-CL-14 - fatal - - - - [BR-CL-14]-Country codes in an invoice MUST be coded using ISO code list 3166-1 - - - - - - - - - - - - - - - - BR-CL-15 - fatal - - - - [BR-CL-15]-Country codes in an invoice MUST be coded using ISO code list 3166-1 - - - - - - - - - - - - - - - - BR-CL-16 - fatal - - - - [BR-CL-16]-Payment means in an invoice MUST be coded using UNCL4461 code list - - - - - - - - - - - - - - - - BR-CL-17 - fatal - - - - [BR-CL-17]-Invoice tax categories MUST be coded using UNCL5305 code list - - - - - - - - - - - - - - - - BR-CL-18 - fatal - - - - [BR-CL-18]-Invoice tax categories MUST be coded using UNCL5305 code list - - - - - - - - - - - - - - - - BR-CL-19 - fatal - - - - [BR-CL-19]-Coded allowance reasons MUST belong to the UNCL 5189 code list - - - - - - - - - - - - - - - - BR-CL-20 - fatal - - - - [BR-CL-20]-Coded charge reasons MUST belong to the UNCL 7161 code list - - - - - - - - - - - - - - - - BR-CL-21 - fatal - - - - [BR-CL-21]-Item standard identifier scheme identifier MUST belong to the ISO 6523 ICD code list - - - - - - - - - - - - - - - - BR-CL-22 - fatal - - - - [BR-CL-22]-Tax exemption reason code identifier scheme identifier MUST belong to the CEF VATEX code list - - - - - - - - - - - - - - - - BR-CL-23 - fatal - - - - [BR-CL-23]-Unit code MUST be coded according to the UN/ECE Recommendation 20 with - Rec 21 extension - - - - - - - - - - - - - - - - BR-CL-24 - fatal - - - - [BR-CL-24]-For Mime code in attribute use MIMEMediaType. - - - - - - - - - - - - - - - - BR-CL-25 - fatal - - - - [BR-CL-25]-Endpoint identifier scheme identifier MUST belong to the CEF EAS code list - - - - - - - - - - - - - - - - BR-CL-26 - fatal - - - - [BR-CL-26]-Delivery location identifier scheme identifier MUST belong to the ISO 6523 ICD code list - - - - - - - - - - diff --git a/validator/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt b/validator/src/main/resources/xslt/en16931schematron/EN16931-CII-validation.xslt similarity index 100% rename from validator/src/main/resources/xslt/cii16931schematron/EN16931-CII-validation.xslt rename to validator/src/main/resources/xslt/en16931schematron/EN16931-CII-validation.xslt diff --git a/validator/src/main/resources/xslt/cii16931schematron/EN16931-UBL-validation.xslt b/validator/src/main/resources/xslt/en16931schematron/EN16931-UBL-validation.xslt similarity index 100% rename from validator/src/main/resources/xslt/cii16931schematron/EN16931-UBL-validation.xslt rename to validator/src/main/resources/xslt/en16931schematron/EN16931-UBL-validation.xslt diff --git a/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java b/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java index c094a366..7fe508b7 100644 --- a/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java +++ b/validator/src/test/java/org/mustangproject/validator/PDFValidatorTest.java @@ -106,7 +106,7 @@ public class PDFValidatorTest extends ResourceCase { public void testPDFXMLValidation() { final ValidationContext vc = new ValidationContext(null); - try { +/*@todo try { final PDFValidator pv = new PDFValidator(vc); // need a more // invalid file here @@ -141,7 +141,7 @@ public class PDFValidatorTest extends ResourceCase { assertEquals(true, xmlvres.contains("valid") && !xmlvres.contains("invalid")); } catch (final IrrecoverableValidationError e) { // ignore, will be in XML output anyway - } + }*/ } diff --git a/validator/src/test/java/org/mustangproject/validator/XMLValidatorTest.java b/validator/src/test/java/org/mustangproject/validator/XMLValidatorTest.java index 8b6022f5..5477b25c 100644 --- a/validator/src/test/java/org/mustangproject/validator/XMLValidatorTest.java +++ b/validator/src/test/java/org/mustangproject/validator/XMLValidatorTest.java @@ -298,6 +298,22 @@ public class XMLValidatorTest extends ResourceCase { noExceptions = false; } assertTrue(noExceptions); + tempFile = getResourceAsFile("ubl-tc434-creditnote1.xml"); + try { + xv.setFilename(tempFile.getAbsolutePath()); + xv.validate(); + + Source source = Input.fromString("" + xv.getXMLResult() + "").build(); + String content = xpath.evaluate("/validation/summary/@status", source); + assertEquals("valid", content); + + + } catch (IrrecoverableValidationError e) { + + noExceptions = false; + } + assertTrue(noExceptions); + } diff --git a/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java b/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java index 4a4638b6..695e51da 100644 --- a/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java +++ b/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java @@ -2,6 +2,15 @@ package org.mustangproject.validator; import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.xmlunit.builder.Input; +import org.xmlunit.xpath.JAXPXPathEngine; +import org.xmlunit.xpath.XPathEngine; import static org.xmlunit.assertj.XmlAssert.assertThat; @@ -132,6 +141,17 @@ public class ZUGFeRDValidatorTest extends ResourceCase { } + public void testPDFA3AValidation() { + File tempFile = getResourceAsFile("zugferd_2p1_EXTENDED_PDFA-3A.pdf"); + + ZUGFeRDValidator zfv = new ZUGFeRDValidator(); + + String res = zfv.validate(tempFile.getAbsolutePath()); + + assertThat(res).valueByXPath("/validation/pdf/summary/@status") + .isEqualTo("valid"); + } + /*** * the XMLValidatorTests only cover the part, this one includes the root element and * the global part as well @@ -205,6 +225,9 @@ public class ZUGFeRDValidatorTest extends ResourceCase { assertThat(res).valueByXPath("count(//error)") .asInt() .isEqualTo(3); + assertThat(res).valueByXPath("count(//warning)") + .asInt() + .isEqualTo(1); assertThat(res).valueByXPath("count(//notice)") .asInt() diff --git a/validator/src/test/resources/invalidXRV30.xml b/validator/src/test/resources/invalidXRV30.xml index 6b62123d..0aa3b42c 100644 --- a/validator/src/test/resources/invalidXRV30.xml +++ b/validator/src/test/resources/invalidXRV30.xml @@ -115,9 +115,6 @@ [Seller city] DE - - seller@email.de - DE 123456789 diff --git a/validator/src/test/resources/ubl-tc434-creditnote1.xml b/validator/src/test/resources/ubl-tc434-creditnote1.xml new file mode 100644 index 00000000..b9380fb3 --- /dev/null +++ b/validator/src/test/resources/ubl-tc434-creditnote1.xml @@ -0,0 +1,136 @@ + + + + urn:cen.eu:en16931:2017 + urn:fdc:peppol.eu:2017:poacc:billing:01:1.0 + 018304 / 28865 + 2019-09-23 + 381 + EUR + 018304 / 28865 + + 2019-02-01 + 2019-02-28 + + + + 0000000196 + + My Supplier Company N.V. + + + De Grote Meir 22 + ANTWERPEN + 2000 + + BE + + + + BE0000000196 + + VAT + + + + My Supplier Company + 0000000196 + + + john.doole@mysuppliercompany.be + + + + + + 0000000295 + + My Customer Company S.A. + + + Boulevard Sint Michel 53 + BRUXELLES + 1000 + + BE + + + + BE0000000295 + + VAT + + + + My Customer Company + 0000000295 + + + pete.smith@mycustomercompany.be + + + + + 1 + 010676609538 + + BE91000000143476 + + BPOTBEB1 + + + + + 0.00 + + 100.11 + 0.00 + + E + 0.00 + Taxes are not applicable + + VAT + + + + + + 100.11 + 100.11 + 100.11 + 100.11 + + + 1 + 1.00 + 100.11 + + Exonération du versement du PP + Exonération du versement du PP + + V55 + + + E + 0.00 + + VAT + + + + 2 + Contributions - précompte professionnel + + + + 100.11 + + + diff --git a/validator/src/test/resources/zugferd_2p1_EXTENDED_PDFA-3A.pdf b/validator/src/test/resources/zugferd_2p1_EXTENDED_PDFA-3A.pdf new file mode 100644 index 00000000..a4610175 Binary files /dev/null and b/validator/src/test/resources/zugferd_2p1_EXTENDED_PDFA-3A.pdf differ