Merge branch 'master' into POM-Cleanup
This commit is contained in:
103
library/src/main/java/org/mustangproject/ClassCode.java
Normal file
103
library/src/main/java/org/mustangproject/ClassCode.java
Normal file
@@ -0,0 +1,103 @@
|
||||
/**
|
||||
* *********************************************************************
|
||||
* <p>
|
||||
* Copyright (c) 2024 Jan N. Klug
|
||||
* <p>
|
||||
* Use is subject to license terms.
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
* <p>
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* <p>
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* <p>
|
||||
* **********************************************************************
|
||||
*/
|
||||
package org.mustangproject;
|
||||
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* A schemed classification for products. The scheme can be anything defined in UNTDID 7143.
|
||||
*/
|
||||
public class ClassCode {
|
||||
private final String listID;
|
||||
private final String code;
|
||||
private String listVersionID;
|
||||
|
||||
/**
|
||||
* A UNTDID 7143 schemed classification code
|
||||
*
|
||||
* @param listID the scheme from UNTDID 7143
|
||||
* @param code the classification code
|
||||
* @param listVersionID an (optional) version of the scheme
|
||||
*/
|
||||
public ClassCode(String listID, String code, String listVersionID) {
|
||||
this.listID = listID;
|
||||
this.code = code;
|
||||
this.listVersionID = listVersionID;
|
||||
}
|
||||
|
||||
/**
|
||||
* A UNTDID 7143 schemed classification code
|
||||
*
|
||||
* @param listID the scheme from UNTDID 7143
|
||||
* @param code the classification code
|
||||
*/
|
||||
public ClassCode(String listID, String code) {
|
||||
this(listID, code, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the version for the scheme returned by {@link #getListID()}
|
||||
*/
|
||||
public void setListVersionID(String listVersionID) {
|
||||
this.listVersionID = listVersionID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the scheme (according to UNTDID 7143) that describes the value returned by {@link #getCode()},
|
||||
* potentially versioned by {@link #getListVersionID()}
|
||||
*
|
||||
* @return the scheme
|
||||
*/
|
||||
public String getListID() {
|
||||
return listID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the code that (following the scheme returned by {@link #getListID()}) describes the product
|
||||
*
|
||||
* @return the classification code itself
|
||||
*/
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the (optional) version for the scheme returned by {@link #getListID()}
|
||||
*
|
||||
* @return the version or {@code null} if not set
|
||||
*/
|
||||
public String getListVersionID() {
|
||||
return listVersionID;
|
||||
}
|
||||
|
||||
public static ClassCode fromNode(Node node) {
|
||||
NamedNodeMap attrs = node.getAttributes();
|
||||
if (attrs != null && attrs.getNamedItem("listID") != null) {
|
||||
ClassCode classCode = new ClassCode(attrs.getNamedItem("listID").getNodeValue(), node.getTextContent());
|
||||
if (attrs.getNamedItem("listVersionID") != null) {
|
||||
classCode.setListVersionID(attrs.getNamedItem("listVersionID").getNodeValue());
|
||||
}
|
||||
return classCode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* *********************************************************************
|
||||
* <p>
|
||||
* Copyright (c) 2024 Jan N. Klug
|
||||
* <p>
|
||||
* Use is subject to license terms.
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
* <p>
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* <p>
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* <p>
|
||||
* **********************************************************************
|
||||
*/
|
||||
package org.mustangproject;
|
||||
|
||||
import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
|
||||
|
||||
/**
|
||||
* An implementation of {@link IDesignatedProductClassification} for describing a {@link org.mustangproject.Product}
|
||||
*
|
||||
*/
|
||||
public class DesignatedProductClassification implements IDesignatedProductClassification {
|
||||
private final ClassCode classCode;
|
||||
private String className;
|
||||
|
||||
/**
|
||||
* A schemed product descriptor
|
||||
*
|
||||
* @param classCode an UNTDID 7143 schemed class code
|
||||
* @param className a verbal description of the class code
|
||||
*/
|
||||
public DesignatedProductClassification(ClassCode classCode, String className) {
|
||||
this.classCode = classCode;
|
||||
this.className = className;
|
||||
}
|
||||
|
||||
/**
|
||||
* A schemed product descriptor
|
||||
*
|
||||
* @param classCode an UNTDID 7143 schemed class code
|
||||
*/
|
||||
public DesignatedProductClassification(ClassCode classCode) {
|
||||
this(classCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassCode getClassCode() {
|
||||
return classCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getClassName() {
|
||||
return className;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the human-readable name of the class code
|
||||
*
|
||||
* @param className the name of the class code (can be {@code null})
|
||||
*/
|
||||
public void setClassName(String className) {
|
||||
this.className = className;
|
||||
}
|
||||
}
|
||||
@@ -41,7 +41,7 @@ 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;
|
||||
protected Date issueDate = null, dueDate = null, deliveryDate = null;
|
||||
protected TradeParty sender = null, recipient = null, deliveryAddress = null;
|
||||
protected TradeParty sender = null, recipient = null, deliveryAddress = null, payee = null;
|
||||
protected ArrayList<CashDiscount> cashDiscounts = null;
|
||||
@JsonDeserialize(contentAs = Item.class)
|
||||
protected ArrayList<IZUGFeRDExportableItem> ZFItems = null;
|
||||
@@ -577,6 +577,22 @@ public class Invoice implements IExportableTransaction {
|
||||
this.deliveryAddress = deliveryAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TradeParty getPayee() {
|
||||
return this.payee;
|
||||
}
|
||||
|
||||
/***
|
||||
* if the payee is not the seller, it can be specified here
|
||||
* @param payee the payment receiving organisation
|
||||
* @return fluent setter
|
||||
*/
|
||||
public Invoice setPayee(TradeParty payee) {
|
||||
this.payee = payee;
|
||||
return this;
|
||||
}
|
||||
|
||||
/***
|
||||
* Adds a cash discount (skonto)
|
||||
* @param c the CashDiscount percent/period combination
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import org.mustangproject.ZUGFeRD.IReferencedDocument;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableItem;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
@@ -18,17 +19,22 @@ import java.util.Date;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class Item implements IZUGFeRDExportableItem {
|
||||
protected BigDecimal price, quantity, tax, grossPrice, lineTotalAmount;
|
||||
protected BigDecimal price = BigDecimal.ZERO;
|
||||
protected BigDecimal quantity;
|
||||
protected BigDecimal tax;
|
||||
protected BigDecimal grossPrice;
|
||||
protected BigDecimal lineTotalAmount;
|
||||
protected BigDecimal basisQuantity = BigDecimal.ONE;
|
||||
protected Date detailedDeliveryPeriodFrom = null, detailedDeliveryPeriodTo = null;
|
||||
protected Date detailedDeliveryPeriodFrom = null;
|
||||
protected Date detailedDeliveryPeriodTo = null;
|
||||
protected String id;
|
||||
protected String referencedLineID = null;
|
||||
protected Product product;
|
||||
protected ArrayList<String> notes = null;
|
||||
protected ArrayList<ReferencedDocument> referencedDocuments = null;
|
||||
protected ArrayList<ReferencedDocument> additionalReference = null;
|
||||
protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<>(),
|
||||
Charges = new ArrayList<>();
|
||||
protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<>();
|
||||
protected ArrayList<IZUGFeRDAllowanceCharge> Charges = new ArrayList<>();
|
||||
|
||||
/***
|
||||
* default constructor
|
||||
@@ -42,7 +48,6 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
this.product = product;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* empty constructor
|
||||
* do not use, but might be used e.g. by jackson
|
||||
@@ -51,269 +56,75 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
}
|
||||
|
||||
public Item(NodeList itemChilds, boolean recalcPrice) {
|
||||
String price = "0";
|
||||
String basisQuantity = "1";
|
||||
String name = "";
|
||||
String sellerAssignedID = null;
|
||||
String description = "";
|
||||
SchemedID gid = null;
|
||||
String quantity = "0";
|
||||
String vatPercent = null;
|
||||
String lineTotal = "0";
|
||||
String unitCode = "0";
|
||||
String referencedLineID = null;
|
||||
NodeMap itemMap = new NodeMap(itemChilds);
|
||||
|
||||
ArrayList<ReferencedDocument> rdocs = null;
|
||||
ArrayList<ReferencedDocument> addRefs = null;
|
||||
itemMap.getAsNodeMap("Item").ifPresent(icnm -> {
|
||||
// ubl
|
||||
//we need: name description unitcode
|
||||
//and we additionally have vat%
|
||||
setProduct(new Product());
|
||||
icnm.getAsString("Name").ifPresent(product::setName);
|
||||
icnm.getAsNodeMap("ClassifiedTaxCategory").flatMap(m -> m.getAsBigDecimal("Percent"))
|
||||
.ifPresent(product::setVATPercent);
|
||||
});
|
||||
|
||||
// nodes.item(i).getTextContent())) {
|
||||
itemMap.getAsNodeMap("Price").ifPresent(icnm -> {
|
||||
// ubl
|
||||
// PriceAmount with currencyID and BaseQuantity with unitCode
|
||||
icnm.getAsBigDecimal("PriceAmount").ifPresent(this::setPrice);
|
||||
icnm.getAsBigDecimal("BaseQuantity").ifPresent(this::setBasisQuantity);
|
||||
});
|
||||
|
||||
for (int itemChildIndex = 0; itemChildIndex < itemChilds.getLength(); itemChildIndex++) {
|
||||
String lineTrade = itemChilds.item(itemChildIndex).getLocalName();
|
||||
if ((lineTrade != null) && (lineTrade.equals("Item"))) {
|
||||
// ubl
|
||||
//we need: name description unitcode
|
||||
//and we additionally have vat%
|
||||
NodeList UBLitemChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (Node currentUBLItemChildNode : XMLTools.asList(UBLitemChilds)) {
|
||||
itemMap.getNode("InvoicedQuantity").ifPresent(icn -> {
|
||||
// ubl
|
||||
setQuantity(new BigDecimal(icn.getTextContent().trim()));
|
||||
product.setUnit(icn.getAttributes().getNamedItem("unitCode").getNodeValue());
|
||||
});
|
||||
|
||||
if ((currentUBLItemChildNode.getLocalName() != null) && (currentUBLItemChildNode.getLocalName().equals("Name"))) {
|
||||
name = currentUBLItemChildNode.getTextContent();
|
||||
}
|
||||
if ((currentUBLItemChildNode.getLocalName() != null) && (currentUBLItemChildNode.getLocalName().equals("ClassifiedTaxCategory"))) {
|
||||
for (Node currentUBLTaxChildNode : XMLTools.asList(currentUBLItemChildNode.getChildNodes())) {
|
||||
if ((currentUBLTaxChildNode.getLocalName() != null) && (currentUBLTaxChildNode.getLocalName().equals("Percent"))) {
|
||||
vatPercent = currentUBLTaxChildNode.getTextContent();
|
||||
}
|
||||
}
|
||||
itemMap.getAsNodeMap("SpecifiedLineTradeAgreement", "SpecifiedSupplyChainTradeAgreement").ifPresent(icnm -> {
|
||||
icnm.getAsNodeMap("BuyerOrderReferencedDocument")
|
||||
.flatMap(bordNodes -> bordNodes.getAsString("LineID"))
|
||||
.ifPresent(this::addReferencedLineID);
|
||||
|
||||
icnm.getAsNodeMap("NetPriceProductTradePrice").ifPresent(npptpNodes -> {
|
||||
npptpNodes.getAsBigDecimal("ChargeAmount").ifPresent(this::setPrice);
|
||||
npptpNodes.getAsBigDecimal("BasisQuantity").ifPresent(this::setBasisQuantity);
|
||||
});
|
||||
|
||||
icnm.getAllNodes("AdditionalReferencedDocument").map(ReferencedDocument::fromNode)
|
||||
.forEach(this::addReferencedDocument);
|
||||
});
|
||||
|
||||
itemMap.getNode("SpecifiedTradeProduct").map(Product::new).ifPresent(this::setProduct);
|
||||
|
||||
// RequestedQuantity is for Order-X, BilledQuantity for FX and ZF
|
||||
itemMap.getAsNodeMap("SpecifiedLineTradeDelivery", "SpecifiedSupplyChainTradeDelivery")
|
||||
.flatMap(icnm -> icnm.getNode("BilledQuantity", "RequestedQuantity", "DespatchedQuantity"))
|
||||
.ifPresent(bq -> {
|
||||
setQuantity(new BigDecimal(bq.getTextContent().trim()));
|
||||
if (bq.hasAttributes()) {
|
||||
Node unitAttr = bq.getAttributes().getNamedItem("unitCode");
|
||||
if (unitAttr != null) {
|
||||
product.setUnit(unitAttr.getNodeValue());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
itemMap.getAsNodeMap("SpecifiedLineTradeSettlement", "SpecifiedSupplyChainTradeSettlement").ifPresent(icnm -> {
|
||||
icnm.getAsNodeMap("ApplicableTradeTax")
|
||||
.flatMap(cnm -> cnm.getAsBigDecimal("RateApplicablePercent", "ApplicablePercent"))
|
||||
.ifPresent(product::setVATPercent);
|
||||
|
||||
if (recalcPrice && !BigDecimal.ZERO.equals(quantity)) {
|
||||
icnm.getAsNodeMap("SpecifiedTradeSettlementLineMonetarySummation")
|
||||
.flatMap(cnm -> cnm.getAsBigDecimal("LineTotalAmount"))
|
||||
.ifPresent(lineTotal -> setPrice(lineTotal.divide(quantity, 4, RoundingMode.HALF_UP)));
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("Price"))) {
|
||||
// ubl
|
||||
// PriceAmount with currencyID and BaseQuantity with unitCode
|
||||
NodeList UBLpriceChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (Node currentUBLPriceChildNode : XMLTools.asList(UBLpriceChilds)) {
|
||||
|
||||
if ((currentUBLPriceChildNode.getLocalName() != null) && (currentUBLPriceChildNode.getLocalName().equals("PriceAmount"))) {
|
||||
price = currentUBLPriceChildNode.getTextContent();
|
||||
}
|
||||
if ((currentUBLPriceChildNode.getLocalName() != null) && (currentUBLPriceChildNode.getLocalName().equals("BaseQuantity"))) {
|
||||
basisQuantity = currentUBLPriceChildNode.getTextContent();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("InvoicedQuantity"))) {
|
||||
// ubl
|
||||
quantity = itemChilds.item(itemChildIndex).getTextContent();
|
||||
unitCode = itemChilds.item(itemChildIndex).getAttributes()
|
||||
.getNamedItem("unitCode").getNodeValue();
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("SpecifiedLineTradeAgreement")
|
||||
|| lineTrade.equals("SpecifiedSupplyChainTradeAgreement"))) {
|
||||
NodeList tradeLineChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (int tradeLineChildIndex = 0; tradeLineChildIndex < tradeLineChilds
|
||||
.getLength(); tradeLineChildIndex++) {
|
||||
|
||||
if ((tradeLineChilds.item(tradeLineChildIndex).getLocalName() != null) && tradeLineChilds
|
||||
.item(tradeLineChildIndex).getLocalName().equals("AdditionalReferencedDocument")) {
|
||||
String IssuerAssignedID = "";
|
||||
String TypeCode = "";
|
||||
String ReferenceTypeCode = "";
|
||||
|
||||
NodeList refDocChilds = tradeLineChilds.item(tradeLineChildIndex).getChildNodes();
|
||||
for (int refDocIndex = 0; refDocIndex < refDocChilds.getLength(); refDocIndex++) {
|
||||
String localName = refDocChilds.item(refDocIndex).getLocalName();
|
||||
if ((localName != null) && (localName.equals("IssuerAssignedID"))) {
|
||||
IssuerAssignedID = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
if ((localName != null) && (localName.equals("TypeCode"))) {
|
||||
TypeCode = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
if ((localName != null) && (localName.equals("ReferenceTypeCode"))) {
|
||||
ReferenceTypeCode = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
|
||||
ReferencedDocument rd = new ReferencedDocument(IssuerAssignedID, TypeCode,
|
||||
ReferenceTypeCode);
|
||||
if (rdocs == null) {
|
||||
rdocs = new ArrayList<>();
|
||||
}
|
||||
rdocs.add(rd);
|
||||
|
||||
}
|
||||
|
||||
if ((tradeLineChilds.item(tradeLineChildIndex).getLocalName() != null) && tradeLineChilds.item(tradeLineChildIndex).getLocalName().equals("BuyerOrderReferencedDocument")) {
|
||||
NodeList docChilds = tradeLineChilds.item(tradeLineChildIndex).getChildNodes();
|
||||
for (int docIndex = 0; docIndex < docChilds.getLength(); docIndex++) {
|
||||
String localName = docChilds.item(docIndex).getLocalName();
|
||||
if ((localName != null) && (localName.equals("LineID"))) {
|
||||
referencedLineID = docChilds.item(docIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((tradeLineChilds.item(tradeLineChildIndex).getLocalName() != null) && tradeLineChilds
|
||||
.item(tradeLineChildIndex).getLocalName().equals("NetPriceProductTradePrice")) {
|
||||
NodeList netChilds = tradeLineChilds.item(tradeLineChildIndex).getChildNodes();
|
||||
for (int netIndex = 0; netIndex < netChilds.getLength(); netIndex++) {
|
||||
if ((netChilds.item(netIndex).getLocalName() != null)
|
||||
&& (netChilds.item(netIndex).getLocalName().equals("ChargeAmount"))) {
|
||||
price = netChilds.item(netIndex).getTextContent();// ChargeAmount
|
||||
|
||||
}
|
||||
if ((netChilds.item(netIndex).getLocalName() != null)
|
||||
&& ((netChilds.item(netIndex).getLocalName().equals("BasisQuantity")) || (netChilds.item(netIndex).getLocalName().equals("InvoicedQuantity")))) {
|
||||
basisQuantity = netChilds.item(netIndex).getTextContent();// ChargeAmount
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("SpecifiedLineTradeDelivery")
|
||||
|| lineTrade.equals("SpecifiedSupplyChainTradeDelivery"))) {
|
||||
NodeList tradeLineChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (int tradeLineChildIndex = 0; tradeLineChildIndex < tradeLineChilds
|
||||
.getLength(); tradeLineChildIndex++) {
|
||||
String tradeName = tradeLineChilds.item(tradeLineChildIndex).getLocalName();
|
||||
if ((tradeName != null)
|
||||
&& (tradeName.equals("BilledQuantity") || tradeName.equals("RequestedQuantity")
|
||||
|| tradeName.equals("DespatchedQuantity"))) {
|
||||
// RequestedQuantity is for Order-X, BilledQuantity for FX and ZF
|
||||
quantity = tradeLineChilds.item(tradeLineChildIndex).getTextContent();
|
||||
unitCode = tradeLineChilds.item(tradeLineChildIndex).getAttributes()
|
||||
.getNamedItem("unitCode").getNodeValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("SpecifiedTradeProduct"))) {
|
||||
NodeList tradeProductChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (int tradeProductChildIndex = 0; tradeProductChildIndex < tradeProductChilds
|
||||
.getLength(); tradeProductChildIndex++) {
|
||||
if ((tradeProductChilds.item(tradeProductChildIndex).getLocalName() != null)
|
||||
&& (tradeProductChilds.item(tradeProductChildIndex).getLocalName()
|
||||
.equals("Name"))) {
|
||||
name = tradeProductChilds.item(tradeProductChildIndex).getTextContent();
|
||||
}
|
||||
if ((tradeProductChilds.item(tradeProductChildIndex).getLocalName() != null)
|
||||
&& (tradeProductChilds.item(tradeProductChildIndex).getLocalName()
|
||||
.equals("SellerAssignedID"))) {
|
||||
sellerAssignedID = tradeProductChilds.item(tradeProductChildIndex).getTextContent();
|
||||
}
|
||||
if ((tradeProductChilds.item(tradeProductChildIndex).getLocalName() != null)
|
||||
&& (tradeProductChilds.item(tradeProductChildIndex).getLocalName()
|
||||
.equals("GlobalID"))) {
|
||||
if (tradeProductChilds.item(tradeProductChildIndex).getAttributes()
|
||||
.getNamedItem("schemeID") != null) {
|
||||
gid = new SchemedID()
|
||||
.setScheme(tradeProductChilds.item(tradeProductChildIndex).getAttributes()
|
||||
.getNamedItem("schemeID").getNodeValue())
|
||||
.setId(tradeProductChilds.item(tradeProductChildIndex).getTextContent());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((lineTrade != null) && (lineTrade.equals("SpecifiedLineTradeSettlement")
|
||||
|| lineTrade.equals("SpecifiedSupplyChainTradeSettlement"))) {
|
||||
NodeList tradeSettlementChilds = itemChilds.item(itemChildIndex).getChildNodes();
|
||||
for (int tradeSettlementChildIndex = 0; tradeSettlementChildIndex < tradeSettlementChilds
|
||||
.getLength(); tradeSettlementChildIndex++) {
|
||||
|
||||
String tradeSettlementName = tradeSettlementChilds.item(tradeSettlementChildIndex)
|
||||
.getLocalName();
|
||||
if (tradeSettlementName != null) {
|
||||
if (tradeSettlementName.equals("ApplicableTradeTax")) {
|
||||
NodeList taxChilds = tradeSettlementChilds.item(tradeSettlementChildIndex)
|
||||
.getChildNodes();
|
||||
for (int taxChildIndex = 0; taxChildIndex < taxChilds
|
||||
.getLength(); taxChildIndex++) {
|
||||
String taxChildName = taxChilds.item(taxChildIndex).getLocalName();
|
||||
if ((taxChildName != null) && (taxChildName.equals("RateApplicablePercent")
|
||||
|| taxChildName.equals("ApplicablePercent"))) {
|
||||
vatPercent = taxChilds.item(taxChildIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tradeSettlementName.equals("SpecifiedTradeSettlementLineMonetarySummation")) {
|
||||
NodeList totalChilds = tradeSettlementChilds.item(tradeSettlementChildIndex)
|
||||
.getChildNodes();
|
||||
for (int totalChildIndex = 0; totalChildIndex < totalChilds
|
||||
.getLength(); totalChildIndex++) {
|
||||
if ((totalChilds.item(totalChildIndex).getLocalName() != null) && (totalChilds
|
||||
.item(totalChildIndex).getLocalName().equals("LineTotalAmount"))) {
|
||||
lineTotal = totalChilds.item(totalChildIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tradeSettlementName.equals("AdditionalReferencedDocument")) {
|
||||
String IssuerAssignedID = "";
|
||||
String TypeCode = "";
|
||||
String ReferenceTypeCode = "";
|
||||
|
||||
NodeList refDocChilds = tradeSettlementChilds.item(tradeSettlementChildIndex).getChildNodes();
|
||||
for (int refDocIndex = 0; refDocIndex < refDocChilds.getLength(); refDocIndex++) {
|
||||
String localName = refDocChilds.item(refDocIndex).getLocalName();
|
||||
if ((localName != null) && (localName.equals("IssuerAssignedID"))) {
|
||||
IssuerAssignedID = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
if ((localName != null) && (localName.equals("TypeCode"))) {
|
||||
TypeCode = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
if ((localName != null) && (localName.equals("ReferenceTypeCode"))) {
|
||||
ReferenceTypeCode = refDocChilds.item(refDocIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
|
||||
ReferencedDocument rd = new ReferencedDocument(IssuerAssignedID, TypeCode,
|
||||
ReferenceTypeCode);
|
||||
if (addRefs == null) {
|
||||
addRefs = new ArrayList<>();
|
||||
}
|
||||
addRefs.add(rd);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BigDecimal prc = new BigDecimal(price.trim());
|
||||
BigDecimal qty = new BigDecimal(quantity.trim());
|
||||
if ((recalcPrice) && (!qty.equals(BigDecimal.ZERO))) {
|
||||
prc = new BigDecimal(lineTotal.trim()).divide(qty, 4, RoundingMode.HALF_UP);
|
||||
}
|
||||
Product p = new Product(name, description, unitCode,
|
||||
vatPercent == null ? null : new BigDecimal(vatPercent.trim()));
|
||||
if (gid != null) {
|
||||
p.addGlobalID(gid);
|
||||
}
|
||||
if (sellerAssignedID != null) {
|
||||
p.setSellerAssignedID(sellerAssignedID);
|
||||
}
|
||||
setProduct(p);
|
||||
setPrice(prc);
|
||||
setQuantity(qty);
|
||||
setBasisQuantity(new BigDecimal(basisQuantity));
|
||||
if (rdocs != null) {
|
||||
for (ReferencedDocument rdoc : rdocs) {
|
||||
addReferencedDocument(rdoc);
|
||||
}
|
||||
}
|
||||
if (addRefs != null) {
|
||||
for (ReferencedDocument rdoc : addRefs) {
|
||||
addAdditionalReference(rdoc);
|
||||
}
|
||||
}
|
||||
addReferencedLineID( referencedLineID );
|
||||
icnm.getAllNodes("AdditionalReferencedDocument").map(ReferencedDocument::fromNode).forEach(this::addAdditionalReference);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public Item addReferencedLineID(String s) {
|
||||
referencedLineID = s;
|
||||
return this;
|
||||
@@ -544,6 +355,7 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
* this will be included in a BillingSpecifiedPeriod element
|
||||
* @return the beginning of the delivery period
|
||||
*/
|
||||
@Override
|
||||
public Date getDetailedDeliveryPeriodFrom() {
|
||||
return detailedDeliveryPeriodFrom;
|
||||
}
|
||||
@@ -553,6 +365,7 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
* this will be included in a BillingSpecifiedPeriod element
|
||||
* @return the end of the delivery period
|
||||
*/
|
||||
@Override
|
||||
public Date getDetailedDeliveryPeriodTo() {
|
||||
return detailedDeliveryPeriodTo;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public class LegalOrganisation implements IZUGFeRDLegalOrganisation {
|
||||
}
|
||||
|
||||
public LegalOrganisation(String ID, String scheme) {
|
||||
this.schemedID = new SchemedID(ID, scheme);
|
||||
this.schemedID = new SchemedID(scheme, ID);
|
||||
}
|
||||
|
||||
public LegalOrganisation(SchemedID schemedID, String tradingBusinessName) {
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableProduct;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/***
|
||||
* describes a product, good or service used in an invoice item line
|
||||
@@ -20,7 +27,8 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
protected boolean isIntraCommunitySupply = false;
|
||||
protected SchemedID globalId = null;
|
||||
protected String countryOfOrigin = null;
|
||||
protected HashMap<String, String> attributes = null;
|
||||
protected HashMap<String, String> attributes = new HashMap<>();
|
||||
protected List<IDesignatedProductClassification> classifications = new ArrayList<>();
|
||||
|
||||
/***
|
||||
* default constructor
|
||||
@@ -36,6 +44,42 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
this.VATPercent = VATPercent;
|
||||
}
|
||||
|
||||
public Product(Node node) {
|
||||
NodeMap nodeMap = new NodeMap(node);
|
||||
|
||||
nodeMap.getNode("GlobalID").ifPresent(idNode -> {
|
||||
if (idNode.hasAttributes()
|
||||
&& idNode.getAttributes().getNamedItem("schemeID") != null) {
|
||||
globalId = new SchemedID()
|
||||
.setScheme(idNode.getAttributes().getNamedItem("schemeID").getNodeValue())
|
||||
.setId(idNode.getTextContent());
|
||||
}
|
||||
});
|
||||
|
||||
nodeMap.getAsString("SellerAssignedID").ifPresent(this::setSellerAssignedID);
|
||||
nodeMap.getAsString("BuyerAssignedID").ifPresent(this::setBuyerAssignedID);
|
||||
nodeMap.getAsString("Name").ifPresent(this::setName);
|
||||
nodeMap.getAsString("Description").ifPresent(this::setDescription);
|
||||
|
||||
nodeMap.getAsNodeMap("ApplicableProductCharacteristic").ifPresent(apcNodes -> {
|
||||
String key = apcNodes.getAsStringOrNull("Description");
|
||||
String value = apcNodes.getAsStringOrNull("Value");
|
||||
if (key != null && value != null) {
|
||||
if (attributes == null) {
|
||||
attributes = new HashMap<>();
|
||||
}
|
||||
attributes.put(key, value);
|
||||
}
|
||||
});
|
||||
|
||||
nodeMap.getAsNodeMap("DesignatedProductClassification").ifPresent(dpcNodes -> {
|
||||
String className = dpcNodes.getAsStringOrNull("ClassName");
|
||||
dpcNodes.getNode("ClassCode").map(ClassCode::fromNode).ifPresent(classCode ->
|
||||
classifications.add(new DesignatedProductClassification(classCode, className)));
|
||||
});
|
||||
|
||||
nodeMap.getAsString("OriginTradeCounty").ifPresent(this::setCountryOfOrigin);
|
||||
}
|
||||
|
||||
/***
|
||||
* empty constructor
|
||||
@@ -93,6 +137,9 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
*/
|
||||
@Override
|
||||
public String getTaxCategoryCode() {
|
||||
if (taxCategoryCode == null) {
|
||||
return IZUGFeRDExportableProduct.super.getTaxCategoryCode();
|
||||
}
|
||||
return taxCategoryCode;
|
||||
}
|
||||
|
||||
@@ -165,6 +212,8 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
public Product setIntraCommunitySupply() {
|
||||
isIntraCommunitySupply = true;
|
||||
setVATPercent(BigDecimal.ZERO);
|
||||
setTaxExemptionReason("Intra-community supply");
|
||||
setTaxCategoryCode("K");
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -242,19 +291,57 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
|
||||
@Override
|
||||
public HashMap<String, String> getAttributes() {
|
||||
return this.attributes;
|
||||
if (attributes.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return this.attributes;
|
||||
}
|
||||
}
|
||||
|
||||
public Product setAttributes(HashMap<String, String> attributes) {
|
||||
this.attributes = attributes;
|
||||
public Product setAttributes(Map<String, String> attributes) {
|
||||
this.attributes.clear();
|
||||
if (attributes != null) {
|
||||
this.attributes.putAll(attributes);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Product addAttribute(String name, String value ) {
|
||||
if ( this.attributes == null ) {
|
||||
this.attributes = new HashMap<>();
|
||||
}
|
||||
this.attributes.put(name, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IDesignatedProductClassification[] getClassifications() {
|
||||
if (classifications.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return classifications.toArray(new IDesignatedProductClassification[0]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the current set of {@link IDesignatedProductClassification}s with a new set
|
||||
*
|
||||
* @param classifications the new set of classifications
|
||||
* @return the modified object
|
||||
*/
|
||||
public Product setClassifications(IDesignatedProductClassification[] classifications) {
|
||||
this.classifications.clear();
|
||||
if (classifications != null) {
|
||||
this.classifications.addAll(Arrays.asList(classifications));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a {@link IDesignatedProductClassification} classification
|
||||
*
|
||||
* @param classification the classification
|
||||
* @return the modified object
|
||||
*/
|
||||
public Product addClassification(IDesignatedProductClassification classification) {
|
||||
this.classifications.add(classification);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import org.mustangproject.ZUGFeRD.IReferencedDocument;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
public class ReferencedDocument implements IReferencedDocument {
|
||||
|
||||
@@ -58,4 +60,14 @@ public class ReferencedDocument implements IReferencedDocument {
|
||||
public String getReferenceTypeCode() {
|
||||
return referenceTypeCode;
|
||||
}
|
||||
|
||||
public static ReferencedDocument fromNode(Node node) {
|
||||
if (!node.hasChildNodes()) {
|
||||
return null;
|
||||
}
|
||||
NodeMap nodes = new NodeMap(node);
|
||||
return new ReferencedDocument(nodes.getAsStringOrNull("IssuerAssignedID"),
|
||||
nodes.getAsStringOrNull("TypeCode"),
|
||||
nodes.getAsStringOrNull("ReferenceTypeCode"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,4 +31,9 @@ public class SchemedID {
|
||||
setId(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SchemedID{scheme='" + scheme + "', id='" + id + "'}";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlement;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
|
||||
/***
|
||||
@@ -424,6 +425,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
|
||||
@Override
|
||||
@JsonIgnore
|
||||
public String getUriUniversalCommunicationID() {
|
||||
if (uriUniversalCommunicationId != null) {
|
||||
return uriUniversalCommunicationId.getID();
|
||||
@@ -433,6 +435,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
|
||||
@Override
|
||||
@JsonIgnore
|
||||
public String getUriUniversalCommunicationIDScheme() {
|
||||
if (uriUniversalCommunicationId != null) {
|
||||
return uriUniversalCommunicationId.getScheme();
|
||||
|
||||
@@ -4,15 +4,9 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.AbstractList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.RandomAccess;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.dom4j.io.XMLWriter;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
public class XMLTools extends XMLWriter {
|
||||
@Override
|
||||
@@ -23,31 +17,6 @@ public class XMLTools extends XMLWriter {
|
||||
@Override
|
||||
public String escapeElementEntities(String s) {
|
||||
return super.escapeElementEntities(s);
|
||||
|
||||
}
|
||||
|
||||
public static List<Node> asList(NodeList n) {
|
||||
return n.getLength() == 0 ?
|
||||
Collections.<Node>emptyList() : new NodeListWrapper(n);
|
||||
}
|
||||
|
||||
static final class NodeListWrapper extends AbstractList<Node>
|
||||
implements RandomAccess {
|
||||
private final NodeList list;
|
||||
|
||||
NodeListWrapper(NodeList l) {
|
||||
list = l;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node get(int index) {
|
||||
return list.item(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return list.getLength();
|
||||
}
|
||||
}
|
||||
|
||||
public static String nDigitFormat(BigDecimal value, int scale) {
|
||||
@@ -70,7 +39,6 @@ public class XMLTools extends XMLWriter {
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static String encodeXML(CharSequence s) {
|
||||
if (s == null) {
|
||||
return "";
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* *********************************************************************
|
||||
* <p>
|
||||
* Copyright (c) 2024 Jan N. Klug
|
||||
* <p>
|
||||
* Use is subject to license terms.
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
* <p>
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* <p>
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* <p>
|
||||
* **********************************************************************
|
||||
*/
|
||||
package org.mustangproject.ZUGFeRD;
|
||||
|
||||
import org.mustangproject.ClassCode;
|
||||
|
||||
/**
|
||||
* A product classification that allows to describe a product. Classification codes are schemed by the available systems in UNTDID 7143.
|
||||
*/
|
||||
public interface IDesignatedProductClassification {
|
||||
/**
|
||||
* Classification code
|
||||
*
|
||||
* @return the classification code
|
||||
*/
|
||||
ClassCode getClassCode();
|
||||
|
||||
/**
|
||||
* an optional, human-readable description of the classifcation code
|
||||
*
|
||||
* @return the name or {@code null} if not set
|
||||
*/
|
||||
default String getClassName() { return null; }
|
||||
}
|
||||
@@ -450,11 +450,19 @@ public interface IExportableTransaction {
|
||||
*
|
||||
* @return the IZUGFeRDExportableTradeParty delivery address
|
||||
*/
|
||||
|
||||
default IZUGFeRDExportableTradeParty getDeliveryAddress() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/***
|
||||
* payee / payment receiver, if different from seller, ram:Payee (only supported for zf2)
|
||||
*
|
||||
* @return the IZUGFeRDExportableTradeParty payment receiver, if different from sellver
|
||||
*/
|
||||
default IZUGFeRDExportableTradeParty getPayee() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/***
|
||||
* specifies the document level delivery period, will be included in a
|
||||
* BillingSpecifiedPeriod element
|
||||
|
||||
@@ -165,4 +165,11 @@ public interface IZUGFeRDExportableProduct {
|
||||
default HashMap<String, String> getAttributes() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detailed information about the product
|
||||
*
|
||||
* @return an array containing the product classifications or {@code null} if not set
|
||||
*/
|
||||
default IDesignatedProductClassification[] getClassifications() { return null; }
|
||||
}
|
||||
|
||||
@@ -39,8 +39,8 @@ public class TransactionCalculator implements IAbsoluteValueProvider {
|
||||
}
|
||||
|
||||
/***
|
||||
* the invoice total with VAT, corrected by prepaid amount, allowances and
|
||||
* charges
|
||||
* the invoice total with VAT, allowances and
|
||||
* charges, WITHOUT considering prepaid amount
|
||||
*
|
||||
* @return the invoice total including taxes
|
||||
*/
|
||||
|
||||
@@ -134,11 +134,11 @@ public class VATAmount {
|
||||
}
|
||||
|
||||
public VATAmount add(VATAmount v) {
|
||||
return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.categoryCode, this.dueDateTypeCode);
|
||||
return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.categoryCode, this.dueDateTypeCode).setVatExemptionReasonText(v.getVatExemptionReasonText());
|
||||
}
|
||||
|
||||
public VATAmount subtract(VATAmount v) {
|
||||
return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.categoryCode, this.dueDateTypeCode);
|
||||
return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.categoryCode, this.dueDateTypeCode).setVatExemptionReasonText(v.getVatExemptionReasonText());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -144,7 +144,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
if (party.getLegalOrganisation() != null) {
|
||||
xml += "<ram:SpecifiedLegalOrganization> ";
|
||||
if (party.getLegalOrganisation().getSchemedID() != null) {
|
||||
xml += "<ram:ID schemeID=\"" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getScheme()) + "\">" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getID()) + "</ram:ID>";
|
||||
if (profile == Profiles.getByName("Minimum")) {
|
||||
xml += "<ram:ID>" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getID()) + "</ram:ID>";
|
||||
} else {
|
||||
xml += "<ram:ID schemeID=\"" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getScheme()) + "\">" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getID()) + "</ram:ID>";
|
||||
}
|
||||
}
|
||||
if (party.getLegalOrganisation().getTradingBusinessName() != null) {
|
||||
xml += "<ram:TradingBusinessName>" + XMLTools.encodeXML(party.getLegalOrganisation().getTradingBusinessName()) + "</ram:TradingBusinessName>";
|
||||
@@ -155,11 +159,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
if ((party.getContact() != null) && (isSender || profile == Profiles.getByName("EN16931") || profile == Profiles.getByName("Extended") || profile == Profiles.getByName("XRechnung"))) {
|
||||
xml += "<ram:DefinedTradeContact>";
|
||||
if (party.getContact().getName() != null) {
|
||||
xml += "<ram:PersonName>" + XMLTools.encodeXML(party.getContact().getName())
|
||||
xml += "<ram:PersonName>"
|
||||
+ XMLTools.encodeXML(party.getContact().getName())
|
||||
+ "</ram:PersonName>";
|
||||
}
|
||||
if (party.getContact().getPhone() != null) {
|
||||
|
||||
xml += "<ram:TelephoneUniversalCommunication><ram:CompleteNumber>"
|
||||
+ XMLTools.encodeXML(party.getContact().getPhone()) + "</ram:CompleteNumber>"
|
||||
+ "</ram:TelephoneUniversalCommunication>";
|
||||
@@ -200,7 +204,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
+ "</ram:CityName>";
|
||||
}
|
||||
|
||||
//country IS mandatory
|
||||
//country IS mandatory
|
||||
xml += "<ram:CountryID>" + XMLTools.encodeXML(party.getCountry())
|
||||
+ "</ram:CountryID>"
|
||||
+ "</ram:PostalTradeAddress>";
|
||||
@@ -228,6 +232,30 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
|
||||
}
|
||||
|
||||
protected String getTradePartyPayeeAsXML(IZUGFeRDExportableTradeParty party) {
|
||||
String xml = "";
|
||||
// According EN16931 either GlobalID or seller assigned ID might be present for a Payee
|
||||
if (party.getID() != null) {
|
||||
xml += "<ram:ID>" + XMLTools.encodeXML(party.getID()) + "</ram:ID>";
|
||||
}
|
||||
if ((party.getGlobalIDScheme() != null) && (party.getGlobalID() != null)) {
|
||||
xml += "<ram:GlobalID schemeID=\"" + XMLTools.encodeXML(party.getGlobalIDScheme()) + "\">"
|
||||
+ XMLTools.encodeXML(party.getGlobalID())
|
||||
+ "</ram:GlobalID>";
|
||||
}
|
||||
xml += "<ram:Name>" + XMLTools.encodeXML(party.getName()) + "</ram:Name>";
|
||||
|
||||
if (party.getLegalOrganisation() != null) {
|
||||
xml += "<ram:SpecifiedLegalOrganization> ";
|
||||
if (party.getLegalOrganisation().getSchemedID() != null) {
|
||||
xml += "<ram:ID schemeID=\"" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getScheme()) + "\">" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemedID().getID()) + "</ram:ID>";
|
||||
}
|
||||
xml += "</ram:SpecifiedLegalOrganization>";
|
||||
}
|
||||
|
||||
return xml;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* returns the XML for a charge or allowance on item level
|
||||
@@ -247,8 +275,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
}
|
||||
|
||||
String reason = "";
|
||||
if ((allowance.getReason() != null) && (profile == Profiles.getByName("Extended"))) {
|
||||
// only in extended profile
|
||||
if ((allowance.getReason() != null) && (profile == Profiles.getByName("Extended") || profile == Profiles.getByName("XRechnung"))) {
|
||||
reason = "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>";
|
||||
}
|
||||
String reasonCode = "";
|
||||
@@ -283,8 +310,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
}
|
||||
|
||||
String reason = "";
|
||||
if ((allowance.getReason() != null) && (profile == Profiles.getByName("Extended"))) {
|
||||
// only in extended profile
|
||||
if ((allowance.getReason() != null) && (profile == Profiles.getByName("Extended") || profile == Profiles.getByName("XRechnung"))) {
|
||||
reason = "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>";
|
||||
}
|
||||
String reasonCode = "";
|
||||
@@ -423,6 +449,20 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
XMLTools.encodeXML(currentItem.getProduct().getDescription()) +
|
||||
"</ram:Description>";
|
||||
}
|
||||
if (currentItem.getProduct().getClassifications() != null && currentItem.getProduct().getClassifications().length > 0) {
|
||||
for (IDesignatedProductClassification classification : currentItem.getProduct().getClassifications()) {
|
||||
xml += "<ram:DesignatedProductClassification>"
|
||||
+ "<ram:ClassCode listId=\"" + XMLTools.encodeXML(classification.getClassCode().getListID()) + "\"";
|
||||
if (classification.getClassCode().getListVersionID() != null) {
|
||||
xml += " listVersionID=\"" + XMLTools.encodeXML(classification.getClassCode().getListVersionID()) + "\"";
|
||||
}
|
||||
xml += ">" + classification.getClassCode().getCode() + "</ram:ClassCode>";
|
||||
if (classification.getClassName() != null) {
|
||||
xml += "<ram:ClassName>" + XMLTools.encodeXML(classification.getClassName()) + "</ram:ClassName>";
|
||||
}
|
||||
xml += "</ram:DesignatedProductClassification>";
|
||||
}
|
||||
}
|
||||
if (currentItem.getProduct().getAttributes() != null) {
|
||||
for (Entry<String, String> entry : currentItem.getProduct().getAttributes().entrySet()) {
|
||||
xml += "<ram:ApplicableProductCharacteristic>" +
|
||||
@@ -612,6 +652,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
|
||||
xml += "</ram:ApplicableHeaderTradeDelivery>";
|
||||
xml += "<ram:ApplicableHeaderTradeSettlement>";
|
||||
|
||||
if ((trans.getCreditorReferenceID() != null) && (getProfile() != Profiles.getByName("Minimum"))) {
|
||||
xml += "<ram:CreditorReferenceID>" + XMLTools.encodeXML(trans.getCreditorReferenceID()) + "</ram:CreditorReferenceID>";
|
||||
}
|
||||
@@ -619,6 +660,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
xml += "<ram:PaymentReference>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:PaymentReference>";
|
||||
}
|
||||
xml += "<ram:InvoiceCurrencyCode>" + trans.getCurrency() + "</ram:InvoiceCurrencyCode>";
|
||||
if (this.trans.getPayee() != null) {
|
||||
xml += "<ram:PayeeTradeParty>" +
|
||||
getTradePartyPayeeAsXML(this.trans.getPayee()) +
|
||||
"</ram:PayeeTradeParty>";
|
||||
}
|
||||
|
||||
if (trans.getTradeSettlementPayment() != null) {
|
||||
for (final IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) {
|
||||
@@ -869,8 +915,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
||||
}
|
||||
|
||||
protected String buildNotes(IExportableTransaction exportableTransaction) {
|
||||
final List<IncludedNote> includedNotes = Optional.ofNullable(exportableTransaction.getNotesWithSubjectCode())
|
||||
.orElse(new ArrayList<>());
|
||||
final List<IncludedNote> includedNotes = new ArrayList<>();
|
||||
Optional.ofNullable(exportableTransaction.getNotesWithSubjectCode()).ifPresent(includedNotes::addAll);
|
||||
|
||||
if (exportableTransaction.getNotes() != null) {
|
||||
for (final String currentNote : exportableTransaction.getNotes()) {
|
||||
includedNotes.add(IncludedNote.unspecifiedNote(currentNote));
|
||||
|
||||
@@ -10,6 +10,7 @@ import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
@@ -74,6 +75,10 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"BuyerTradeParty\"]|//*[local-name()=\"AccountingCustomerParty\"]/*");
|
||||
NodeList BuyerNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"PayeeTradeParty\"]|//*[local-name()=\"PayeeParty\"]/*");
|
||||
NodeList payeeNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"ExchangedDocument\"]|//*[local-name()=\"HeaderExchangedDocument\"]");
|
||||
NodeList ExchangedDocumentNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
@@ -84,6 +89,12 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
|
||||
expectedGrandTotal = new BigDecimal(totalNodes.item(0).getTextContent());
|
||||
}
|
||||
|
||||
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()));
|
||||
}
|
||||
|
||||
Date issueDate = null;
|
||||
Date dueDate = null;
|
||||
Date deliveryDate = null;
|
||||
@@ -282,8 +293,13 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
|
||||
}
|
||||
|
||||
zpp.setDueDate(dueDate).setDeliveryDate(deliveryDate).setIssueDate(issueDate).setSender(new TradeParty(SellerNodes)).setRecipient(new TradeParty(BuyerNodes)).setNumber(number).setDocumentCode(typeCode);
|
||||
|
||||
bankDetails.forEach(bankDetail -> zpp.getSender().addBankDetails(bankDetail));
|
||||
|
||||
if (payeeNodes.getLength() > 0) {
|
||||
zpp.setPayee(new TradeParty(payeeNodes));
|
||||
}
|
||||
|
||||
if (buyerOrderIssuerAssignedID != null) {
|
||||
zpp.setBuyerOrderReferencedDocumentID(buyerOrderIssuerAssignedID);
|
||||
}
|
||||
@@ -298,9 +314,9 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"BuyerReference\"]");
|
||||
String buyerReference = null;
|
||||
totalNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
if (totalNodes.getLength() > 0) {
|
||||
buyerReference = totalNodes.item(0).getTextContent();
|
||||
prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
if (prepaidNodes.getLength() > 0) {
|
||||
buyerReference = prepaidNodes.item(0).getTextContent();
|
||||
}
|
||||
if (buyerReference != null) {
|
||||
zpp.setReferenceNumber(buyerReference);
|
||||
@@ -400,7 +416,8 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
|
||||
}
|
||||
|
||||
TransactionCalculator tc = new TransactionCalculator(zpp);
|
||||
String expectedStringTotalGross = tc.getGrandTotal().toPlainString();
|
||||
String expectedStringTotalGross = tc.getGrandTotal()
|
||||
.subtract(Objects.requireNonNullElse(zpp.getTotalPrepaidAmount(), BigDecimal.ZERO)).toPlainString();
|
||||
EStandard whichType;
|
||||
try {
|
||||
whichType = getStandard();
|
||||
|
||||
151
library/src/main/java/org/mustangproject/util/NodeMap.java
Normal file
151
library/src/main/java/org/mustangproject/util/NodeMap.java
Normal file
@@ -0,0 +1,151 @@
|
||||
/**
|
||||
* *********************************************************************
|
||||
* <p>
|
||||
* Copyright (c) 2024 Jan N. Klug
|
||||
* <p>
|
||||
* Use is subject to license terms.
|
||||
* <p>
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
* <p>
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* <p>
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* <p>
|
||||
* **********************************************************************
|
||||
*/
|
||||
package org.mustangproject.util;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* The {@link NodeMap} contains a {@link Map} representation of DOM object
|
||||
* <p />
|
||||
* It can be constructed either from the children of a single {@link Node} or a {@link NodeList}.
|
||||
*/
|
||||
public class NodeMap {
|
||||
private final Map<String, List<Node>> map = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Create a new {@link NodeMap}
|
||||
* <p />
|
||||
* The {@link Node} that is passed to the constructor must not be null.
|
||||
* The {@link NodeMap} will be empty when no child nodes are present.
|
||||
*
|
||||
* @param node the node that shall be represented by this {@link NodeMap}
|
||||
* @throws IllegalArgumentException when argument is null
|
||||
*/
|
||||
public NodeMap(Node node) {
|
||||
if (node == null) {
|
||||
throw new IllegalArgumentException("node cannot be null");
|
||||
}
|
||||
if (node.hasChildNodes()) {
|
||||
mapNodeList(node.getChildNodes());
|
||||
}
|
||||
}
|
||||
|
||||
public NodeMap(NodeList nodeList) {
|
||||
if (nodeList == null) {
|
||||
throw new IllegalArgumentException("nodeList cannot be null");
|
||||
}
|
||||
mapNodeList(nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get matching node by {@code LocalName}
|
||||
* <p />
|
||||
* In case more than one node matches, it is not guaranteed that the first match is selected
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return the matching node
|
||||
*/
|
||||
public Optional<Node> getNode(String... localNames) {
|
||||
return getAllNodes(localNames).findAny();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a {@link NodeMap} of the child of a matching node by {@code LocalName}
|
||||
* <p />
|
||||
* In case more than one node matches, it is not guaranteed that the first match is selected
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return the {@link NodeMap} representation of the matching node
|
||||
*/
|
||||
public Optional<NodeMap> getAsNodeMap(String... localNames) {
|
||||
return getNode(localNames).filter(Node::hasChildNodes).map(NodeMap::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the text content of a matching node
|
||||
* <p>
|
||||
* In case more than one node matches, it is not guaranteed that the first match is selected
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return the text content of the matching node
|
||||
*/
|
||||
public Optional<String> getAsString(String... localNames) {
|
||||
return getNode(localNames).map(Node::getTextContent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the text content of a matching node
|
||||
* <p>
|
||||
* In case more than one node matches, it is not guaranteed that the first match is selected
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return the text content of the matching node, converted to BigDecimal
|
||||
*/
|
||||
public Optional<BigDecimal> getAsBigDecimal(String... localNames) {
|
||||
return getNode(localNames).map(Node::getTextContent).map(s->new BigDecimal(s.trim()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the text content of a matching node
|
||||
* <p>
|
||||
* In case more than one node matches, it is not guaranteed that the first match is selected
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return the text content of the matching node or {@code null} when no matching node could be found
|
||||
*/
|
||||
public String getAsStringOrNull(String... localNames) {
|
||||
return getAsString(localNames).orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all matching nodes
|
||||
*
|
||||
* @param localNames one or more {@code LocalName}s
|
||||
* @return a {@code Stream} that contains all matching nodes (can be empty if nothing matches)
|
||||
*/
|
||||
public Stream<Node> getAllNodes(String... localNames) {
|
||||
List<String> localNamesList = Arrays.asList(localNames);
|
||||
return map.entrySet().stream().filter(e -> localNamesList.contains(e.getKey())).flatMap(e -> e.getValue().stream());
|
||||
}
|
||||
|
||||
private void mapNodeList(NodeList nodeList) {
|
||||
IntStream.range(0, nodeList.getLength()).mapToObj(nodeList::item)
|
||||
.filter(node -> node != null && node.getLocalName() != null)
|
||||
.forEach(node -> map.computeIfAbsent(node.getLocalName(), k -> new ArrayList<>()).add(node));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return map.toString();
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ public class DeSerializationTest extends TestCase {
|
||||
public void testJackson() throws JsonProcessingException {
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty("some org", "teststr", "55232", "teststadt", "DE").addTaxID("taxID").addBankDetails(new BankDetails("DE3600000123456", "ABCDEFG1001").setAccountName("Donald Duck"))).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber("0185").addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), new BigDecimal("1"), new BigDecimal(1.0)));
|
||||
Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setSender(new TradeParty("some org", "teststr", "55232", "teststadt", "DE").addTaxID("taxID").addBankDetails(new BankDetails("DE3600000123456", "ABCDEFG1001").setAccountName("Donald Duck")).setEmail("info@company.com")).setOwnVATID("DE0815").setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addVATID("DE4711").setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE"))).setNumber("0185").addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), new BigDecimal("1"), new BigDecimal(1.0)));
|
||||
String jsonArray = mapper.writeValueAsString(i);
|
||||
|
||||
// [{"stringValue":"a","intValue":1,"booleanValue":true},
|
||||
@@ -45,6 +45,8 @@ public class DeSerializationTest extends TestCase {
|
||||
Invoice fromJSON = mapper.readValue(jsonArray, Invoice.class);
|
||||
assertEquals(fromJSON.getNumber(), i.getNumber());
|
||||
assertEquals(fromJSON.getZFItems().length, i.getZFItems().length);
|
||||
assertEquals("info@company.com", fromJSON.getSender().getEmail());
|
||||
assertEquals("info@company.com", fromJSON.getSender().getUriUniversalCommunicationID());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ public class ProfilesMinimumBasicWLTest extends TestCase {
|
||||
Invoice i = new Invoice()
|
||||
.setIssueDate(new Date())
|
||||
.setSender(
|
||||
new TradeParty().setName(ownOrgName).setCountry("FR")
|
||||
new TradeParty().setName(ownOrgName).setCountry("FR").setVATID("FR555444333222111")
|
||||
.addBankDetails(new BankDetails(ownIBAN, ownBIC)))
|
||||
.setRecipient(recipient)
|
||||
.setNumber(ownNumber)
|
||||
@@ -116,7 +116,7 @@ public class ProfilesMinimumBasicWLTest extends TestCase {
|
||||
.setIssueDate(new Date())
|
||||
.setDueDate(new Date())
|
||||
.setSender(
|
||||
new TradeParty().setName(ownOrgName).setCountry("FR")
|
||||
new TradeParty().setName(ownOrgName).setCountry("FR").setVATID("FR555444333222111")
|
||||
.addBankDetails(new BankDetails(ownIBAN)))
|
||||
.setRecipient(recipient)
|
||||
.setNumber(ownNumber).setTotalPrepaidAmount(new BigDecimal("1"))
|
||||
|
||||
@@ -123,6 +123,23 @@ public class UBLTest extends ResourceCase {
|
||||
|
||||
}
|
||||
|
||||
public void testEdgeInvoiceImportUBL2() {
|
||||
File UBLinputFile = getResourceAsFile("ubl/04.01a-INVOICE_ubl.xml");
|
||||
boolean hasExceptions = false;
|
||||
|
||||
ZUGFeRDInvoiceImporter zii = null;
|
||||
Invoice invoice = null;
|
||||
try {
|
||||
zii = new ZUGFeRDInvoiceImporter(new FileInputStream(UBLinputFile));
|
||||
invoice = zii.extractInvoice();
|
||||
} catch (XPathExpressionException | ParseException | FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
hasExceptions = true;
|
||||
}
|
||||
assertFalse(hasExceptions);
|
||||
|
||||
assertEquals(new BigDecimal("10000.0"), invoice.getTotalPrepaidAmount());
|
||||
}
|
||||
|
||||
/* public void testInvoiceImportOtherUBL() {
|
||||
|
||||
|
||||
@@ -95,6 +95,7 @@ public class XRTest extends TestCase {
|
||||
.setReferenceNumber("991-01484-64")//leitweg-id
|
||||
// not using any VAT, this is also a test of zero-rated goods:
|
||||
.setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", BigDecimal.ZERO), amount, new BigDecimal(1.0)))
|
||||
.setPayee( new TradeParty().setName("VR Factoring GmbH").setID("DE813838785").setLegalOrganisation(new LegalOrganisation("391200LDDFJDMIPPMZ54", "0199")))
|
||||
.embedFileInXML(fe1);
|
||||
|
||||
|
||||
@@ -109,6 +110,9 @@ public class XRTest extends TestCase {
|
||||
.asInt()
|
||||
.isEqualTo(1); //2 errors are OK because there is a known bug
|
||||
|
||||
assertThat(theXML).valueByXPath("count(//*[local-name()='PayeeTradeParty'])")
|
||||
.asInt()
|
||||
.isEqualTo(1);
|
||||
|
||||
assertThat(theXML).valueByXPath("//*[local-name()='DuePayableAmount']")
|
||||
.asDouble()
|
||||
|
||||
@@ -56,6 +56,7 @@ public class ZF2PushTest extends TestCase {
|
||||
final String TARGET_ATTACHMENTSPDF = "./target/testout-ZF2PushAttachments.pdf";
|
||||
final String TARGET_BANKPDF = "./target/testout-ZF2PushBank.pdf";
|
||||
final String TARGET_PUSHEDGE = "./target/testout-ZF2PushEdge.pdf";
|
||||
final String TARGET_INTRACOMMUNITYSUPPLYMANUALPDF = "./target/testout-ZF2PushIntraCommunitySupplyManual.pdf";
|
||||
final String TARGET_INTRACOMMUNITYSUPPLYPDF = "./target/testout-ZF2PushIntraCommunitySupply.pdf";
|
||||
final String TARGET_REVERSECHARGEPDF = "./target/testout-ZF2PushReverseCharge.pdf";
|
||||
|
||||
@@ -272,7 +273,10 @@ public class ZF2PushTest extends TestCase {
|
||||
}
|
||||
|
||||
|
||||
public void testIntraCommunitySupplyExport() {
|
||||
/***
|
||||
* you can activate intra community suppliy on item level
|
||||
*/
|
||||
public void testIntraCommunitySupplyItemExport() {
|
||||
|
||||
String orgname = "Test company";
|
||||
String number = "123";
|
||||
@@ -323,6 +327,68 @@ public class ZF2PushTest extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* or manually, in which case the transaction needs a delivery address outside DE, and the items a 0 tax with reason K and reason code
|
||||
*/
|
||||
|
||||
public void testIntraCommunitySupplyManualExport() {
|
||||
|
||||
String orgname = "Test company";
|
||||
String number = "123";
|
||||
String priceStr = "1.00";
|
||||
|
||||
String taxID = "9990815";
|
||||
BigDecimal price = new BigDecimal(priceStr);
|
||||
try {
|
||||
InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
||||
|
||||
ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1();
|
||||
ze.ignorePDFAErrors();
|
||||
ze.load(SOURCE_PDF);
|
||||
ze.setProducer("My Application").setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2);
|
||||
|
||||
ze.setTransaction(new Invoice().setDeliveryAddress(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "FR")).setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
|
||||
.setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID).addVATID("DE0815"))
|
||||
.setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "FR").addVATID("DE4711")
|
||||
|
||||
.setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE")))
|
||||
.setNumber(number)
|
||||
.addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(0)).setTaxExemptionReason("Kein Ausweis der Umsatzsteuer bei innergemeinschaftlichen Lieferungen").setTaxCategoryCode("K"), price, new BigDecimal(1.0)))
|
||||
);
|
||||
String theXML = new String(ze.getProvider().getXML());
|
||||
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
|
||||
ze.export(TARGET_INTRACOMMUNITYSUPPLYMANUALPDF);
|
||||
} catch (IOException e) {
|
||||
fail("IOException should not be raised");
|
||||
}
|
||||
ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter(TARGET_INTRACOMMUNITYSUPPLYMANUALPDF);
|
||||
Invoice i= null;
|
||||
try {
|
||||
i = zii.extractInvoice();
|
||||
} catch (XPathExpressionException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (ParseException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_INTRACOMMUNITYSUPPLYMANUALPDF);
|
||||
|
||||
assertEquals("EUR", zi.getInvoiceCurrencyCode());
|
||||
assertTrue(zi.getUTF8().contains(taxID));
|
||||
|
||||
// Reading ZUGFeRD
|
||||
assertEquals("1.00", zi.getAmount());
|
||||
assertEquals(orgname, zi.getHolder());
|
||||
assertEquals(number, zi.getForeignReference());
|
||||
try {
|
||||
assertEquals(zi.getVersion(), 2);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void testReverseChargeExport() {
|
||||
|
||||
String orgname = "Test company";
|
||||
|
||||
@@ -139,6 +139,9 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
assertEquals("DE", invoice.getSender().getCountry());
|
||||
assertEquals("Stadthausen", invoice.getSender().getLocation());
|
||||
|
||||
assertTrue(invoice.getPayee() != null);
|
||||
assertEquals("VR Factoring GmbH", invoice.getPayee().getName());
|
||||
|
||||
TransactionCalculator tc = new TransactionCalculator(invoice);
|
||||
assertEquals(new BigDecimal("571.04"), tc.getGrandTotal());
|
||||
|
||||
@@ -285,6 +288,8 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
TransactionCalculator tc = new TransactionCalculator(invoice);
|
||||
assertEquals(new BigDecimal("1.00"), tc.getGrandTotal());
|
||||
|
||||
assertTrue(invoice.getPayee() != null);
|
||||
assertEquals("VR Factoring GmbH", invoice.getPayee().getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -313,4 +318,36 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
public void testEEISI_300_cii_Import() {
|
||||
boolean hasExceptions = false;
|
||||
File input = getResourceAsFile("not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel2.ubl.xml");
|
||||
|
||||
|
||||
ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter();
|
||||
try {
|
||||
zii.fromXML(new String(Files.readAllBytes(input.toPath()), StandardCharsets.UTF_8));
|
||||
|
||||
} catch (IOException e) {
|
||||
hasExceptions = true;
|
||||
}
|
||||
|
||||
Invoice invoice = null;
|
||||
try {
|
||||
invoice = zii.extractInvoice();
|
||||
assertEquals("Seller contact point",invoice.getSender().getName());
|
||||
/*
|
||||
<cbc:Name>Seller contact point</cbc:Name>
|
||||
<cbc:Telephone>+41 345 654455</cbc:Telephone>
|
||||
<cbc:ElectronicMail>seller@contact.de);*
|
||||
} catch (XPathExpressionException | ParseException e) {
|
||||
hasExceptions = true;
|
||||
}
|
||||
assertFalse(hasExceptions);
|
||||
TransactionCalculator tc = new TransactionCalculator(invoice);
|
||||
assertEquals(new BigDecimal("205.00"), tc.getGrandTotal());
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -0,0 +1,411 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
||||
<rsm:ExchangedDocumentContext>
|
||||
<ram:BusinessProcessSpecifiedDocumentContextParameter>
|
||||
<ram:ID>BT-23 Business Process Type</ram:ID>
|
||||
</ram:BusinessProcessSpecifiedDocumentContextParameter>
|
||||
<ram:GuidelineSpecifiedDocumentContextParameter>
|
||||
<ram:ID>urn:cen.eu:en16931:2017</ram:ID>
|
||||
</ram:GuidelineSpecifiedDocumentContextParameter>
|
||||
</rsm:ExchangedDocumentContext>
|
||||
<rsm:ExchangedDocument>
|
||||
<ram:ID>Test_EeISI_100</ram:ID>
|
||||
<ram:TypeCode>380</ram:TypeCode>
|
||||
<ram:IssueDateTime>
|
||||
<udt:DateTimeString format="102">20181112</udt:DateTimeString>
|
||||
</ram:IssueDateTime>
|
||||
<ram:IncludedNote>
|
||||
<ram:Content>invoice note text</ram:Content>
|
||||
<ram:SubjectCode>#AAA#</ram:SubjectCode>
|
||||
</ram:IncludedNote>
|
||||
<ram:IncludedNote>
|
||||
<ram:Content>invoice note text 2</ram:Content>
|
||||
<ram:SubjectCode>#AAA#</ram:SubjectCode>
|
||||
</ram:IncludedNote>
|
||||
</rsm:ExchangedDocument>
|
||||
<rsm:SupplyChainTradeTransaction>
|
||||
<ram:IncludedSupplyChainTradeLineItem>
|
||||
<ram:AssociatedDocumentLineDocument>
|
||||
<ram:LineID>1a</ram:LineID>
|
||||
<ram:IncludedNote>
|
||||
<ram:Content>Invoice line note</ram:Content>
|
||||
</ram:IncludedNote>
|
||||
</ram:AssociatedDocumentLineDocument>
|
||||
<ram:SpecifiedTradeProduct>
|
||||
<ram:GlobalID>Item standar identifier</ram:GlobalID>
|
||||
<ram:SellerAssignedID>Item seller's identifier</ram:SellerAssignedID>
|
||||
<ram:BuyerAssignedID>Item buyer's identifier</ram:BuyerAssignedID>
|
||||
<ram:Name>Item name</ram:Name>
|
||||
<ram:Description>Item description</ram:Description>
|
||||
<ram:ApplicableProductCharacteristic>
|
||||
<ram:Description>Color</ram:Description>
|
||||
<ram:Value>Red</ram:Value>
|
||||
</ram:ApplicableProductCharacteristic>
|
||||
<ram:ApplicableProductCharacteristic>
|
||||
<ram:Description>Size</ram:Description>
|
||||
<ram:Value>L</ram:Value>
|
||||
</ram:ApplicableProductCharacteristic>
|
||||
<ram:DesignatedProductClassification>
|
||||
<ram:ClassCode listID="ZZZ" listVersionID="version0">Item classification identifier0</ram:ClassCode>
|
||||
</ram:DesignatedProductClassification>
|
||||
<ram:OriginTradeCountry>
|
||||
<ram:ID>IT</ram:ID>
|
||||
</ram:OriginTradeCountry>
|
||||
</ram:SpecifiedTradeProduct>
|
||||
<ram:SpecifiedLineTradeAgreement>
|
||||
<ram:BuyerOrderReferencedDocument>
|
||||
<ram:LineID>12345</ram:LineID>
|
||||
</ram:BuyerOrderReferencedDocument>
|
||||
<ram:GrossPriceProductTradePrice>
|
||||
<ram:ChargeAmount>11.00</ram:ChargeAmount>
|
||||
<ram:BasisQuantity unitCode="EA">1.00</ram:BasisQuantity>
|
||||
<ram:AppliedTradeAllowanceCharge>
|
||||
<ram:ChargeIndicator>
|
||||
<udt:Indicator>false</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:ActualAmount>1.00</ram:ActualAmount>
|
||||
</ram:AppliedTradeAllowanceCharge>
|
||||
</ram:GrossPriceProductTradePrice>
|
||||
<ram:NetPriceProductTradePrice>
|
||||
<ram:ChargeAmount>10.00</ram:ChargeAmount>
|
||||
<ram:BasisQuantity unitCode="EA">1.00</ram:BasisQuantity>
|
||||
</ram:NetPriceProductTradePrice>
|
||||
</ram:SpecifiedLineTradeAgreement>
|
||||
<ram:SpecifiedLineTradeDelivery>
|
||||
<ram:BilledQuantity unitCode="EA">10.00</ram:BilledQuantity>
|
||||
</ram:SpecifiedLineTradeDelivery>
|
||||
<ram:SpecifiedLineTradeSettlement>
|
||||
<ram:ApplicableTradeTax>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:CategoryCode>S</ram:CategoryCode>
|
||||
<ram:RateApplicablePercent>5.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
<ram:BillingSpecifiedPeriod>
|
||||
<ram:StartDateTime>
|
||||
<udt:DateTimeString format="102">20181112</udt:DateTimeString>
|
||||
</ram:StartDateTime>
|
||||
<ram:EndDateTime>
|
||||
<udt:DateTimeString format="102">20181130</udt:DateTimeString>
|
||||
</ram:EndDateTime>
|
||||
</ram:BillingSpecifiedPeriod>
|
||||
<ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:ChargeIndicator>
|
||||
<udt:Indicator>false</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>55</ram:ReasonCode>
|
||||
<ram:Reason>Invoice line allowance reason</ram:Reason>
|
||||
</ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:ChargeIndicator>
|
||||
<udt:Indicator>true</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>AAA</ram:ReasonCode>
|
||||
<ram:Reason>Invoice line charge reason</ram:Reason>
|
||||
</ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
<ram:LineTotalAmount>1000.00</ram:LineTotalAmount>
|
||||
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
<ram:AdditionalReferencedDocument>
|
||||
<ram:IssuerAssignedID>Line object identifier</ram:IssuerAssignedID>
|
||||
<ram:TypeCode>130</ram:TypeCode>
|
||||
<ram:ReferenceTypeCode />
|
||||
</ram:AdditionalReferencedDocument>
|
||||
<ram:ReceivableSpecifiedTradeAccountingAccount>
|
||||
<ram:ID>6789</ram:ID>
|
||||
</ram:ReceivableSpecifiedTradeAccountingAccount>
|
||||
</ram:SpecifiedLineTradeSettlement>
|
||||
</ram:IncludedSupplyChainTradeLineItem>
|
||||
<ram:IncludedSupplyChainTradeLineItem>
|
||||
<ram:AssociatedDocumentLineDocument>
|
||||
<ram:LineID>1b</ram:LineID>
|
||||
</ram:AssociatedDocumentLineDocument>
|
||||
<ram:SpecifiedTradeProduct>
|
||||
<ram:Name>Item name 2</ram:Name>
|
||||
</ram:SpecifiedTradeProduct>
|
||||
<ram:SpecifiedLineTradeAgreement>
|
||||
<ram:NetPriceProductTradePrice>
|
||||
<ram:ChargeAmount>10.00</ram:ChargeAmount>
|
||||
</ram:NetPriceProductTradePrice>
|
||||
</ram:SpecifiedLineTradeAgreement>
|
||||
<ram:SpecifiedLineTradeDelivery>
|
||||
<ram:BilledQuantity unitCode="EA">10.00</ram:BilledQuantity>
|
||||
</ram:SpecifiedLineTradeDelivery>
|
||||
<ram:SpecifiedLineTradeSettlement>
|
||||
<ram:ApplicableTradeTax>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:CategoryCode>E</ram:CategoryCode>
|
||||
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
<ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
<ram:LineTotalAmount>1000.00</ram:LineTotalAmount>
|
||||
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
</ram:SpecifiedLineTradeSettlement>
|
||||
</ram:IncludedSupplyChainTradeLineItem>
|
||||
<ram:ApplicableHeaderTradeAgreement>
|
||||
<ram:BuyerReference>123</ram:BuyerReference>
|
||||
<ram:SellerTradeParty>
|
||||
<ram:GlobalID schemeID="0100">Seller identifier 1</ram:GlobalID>
|
||||
<ram:GlobalID schemeID="0110">Seller identifier 2</ram:GlobalID>
|
||||
<ram:Name>Seller name</ram:Name>
|
||||
<ram:Description>Seller additional legal information</ram:Description>
|
||||
<ram:SpecifiedLegalOrganization>
|
||||
<ram:ID schemeID="0310">Seller legal identifier</ram:ID>
|
||||
<ram:TradingBusinessName>Seller trading name</ram:TradingBusinessName>
|
||||
</ram:SpecifiedLegalOrganization>
|
||||
<ram:DefinedTradeContact>
|
||||
<ram:PersonName>Seller contact point</ram:PersonName>
|
||||
<ram:TelephoneUniversalCommunication>
|
||||
<ram:CompleteNumber>+41 345 654455</ram:CompleteNumber>
|
||||
</ram:TelephoneUniversalCommunication>
|
||||
<ram:EmailURIUniversalCommunication>
|
||||
<ram:URIID>seller@contact.de</ram:URIID>
|
||||
</ram:EmailURIUniversalCommunication>
|
||||
</ram:DefinedTradeContact>
|
||||
<ram:PostalTradeAddress>
|
||||
<ram:PostcodeCode>12345</ram:PostcodeCode>
|
||||
<ram:LineOne>Seller address line 1</ram:LineOne>
|
||||
<ram:LineTwo>Seller address line 2</ram:LineTwo>
|
||||
<ram:LineThree>Seller address line 3</ram:LineThree>
|
||||
<ram:CityName>Seller city</ram:CityName>
|
||||
<ram:CountryID>DE</ram:CountryID>
|
||||
<ram:CountrySubDivisionName>Seller country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
<ram:URIUniversalCommunication>
|
||||
<ram:URIID schemeID="SMTP">Seller electronic address</ram:URIID>
|
||||
</ram:URIUniversalCommunication>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="VA">DE12345677</ram:ID>
|
||||
</ram:SpecifiedTaxRegistration>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="FC">DE49294093</ram:ID>
|
||||
</ram:SpecifiedTaxRegistration>
|
||||
</ram:SellerTradeParty>
|
||||
<ram:BuyerTradeParty>
|
||||
<ram:GlobalID schemeID="0190">Buyer identifier</ram:GlobalID>
|
||||
<ram:Name>Buyer name</ram:Name>
|
||||
<ram:SpecifiedLegalOrganization>
|
||||
<ram:ID schemeID="0089">Buyer legal registration identifier</ram:ID>
|
||||
<ram:TradingBusinessName>Buyer trading name</ram:TradingBusinessName>
|
||||
</ram:SpecifiedLegalOrganization>
|
||||
<ram:DefinedTradeContact>
|
||||
<ram:PersonName>Buyer contact point</ram:PersonName>
|
||||
<ram:TelephoneUniversalCommunication>
|
||||
<ram:CompleteNumber>+353 2948584</ram:CompleteNumber>
|
||||
</ram:TelephoneUniversalCommunication>
|
||||
<ram:EmailURIUniversalCommunication>
|
||||
<ram:URIID>buyer@contact.ie</ram:URIID>
|
||||
</ram:EmailURIUniversalCommunication>
|
||||
</ram:DefinedTradeContact>
|
||||
<ram:PostalTradeAddress>
|
||||
<ram:PostcodeCode>34562</ram:PostcodeCode>
|
||||
<ram:LineOne>Buyer address line 1</ram:LineOne>
|
||||
<ram:LineTwo>Buyer address line 2</ram:LineTwo>
|
||||
<ram:LineThree>Buyer address line 3</ram:LineThree>
|
||||
<ram:CityName>Buyer city</ram:CityName>
|
||||
<ram:CountryID>IE</ram:CountryID>
|
||||
<ram:CountrySubDivisionName>Buyer country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
<ram:URIUniversalCommunication>
|
||||
<ram:URIID schemeID="DE:SMTP">Buyer electronic address</ram:URIID>
|
||||
</ram:URIUniversalCommunication>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="VA">IE394838894</ram:ID>
|
||||
</ram:SpecifiedTaxRegistration>
|
||||
</ram:BuyerTradeParty>
|
||||
<ram:SellerTaxRepresentativeTradeParty>
|
||||
<ram:Name>Tax representative name</ram:Name>
|
||||
<ram:PostalTradeAddress>
|
||||
<ram:PostcodeCode>23455</ram:PostcodeCode>
|
||||
<ram:LineOne>Tax representative address line 1</ram:LineOne>
|
||||
<ram:LineTwo>Tax representative address line 2</ram:LineTwo>
|
||||
<ram:LineThree>Tax representative address line 3</ram:LineThree>
|
||||
<ram:CityName>Tax representative city</ram:CityName>
|
||||
<ram:CountryID>DE</ram:CountryID>
|
||||
<ram:CountrySubDivisionName>Tax representative country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="VA">DE3949053</ram:ID>
|
||||
</ram:SpecifiedTaxRegistration>
|
||||
</ram:SellerTaxRepresentativeTradeParty>
|
||||
<ram:SellerOrderReferencedDocument>
|
||||
<ram:IssuerAssignedID>def</ram:IssuerAssignedID>
|
||||
</ram:SellerOrderReferencedDocument>
|
||||
<ram:BuyerOrderReferencedDocument>
|
||||
<ram:IssuerAssignedID>abc</ram:IssuerAssignedID>
|
||||
</ram:BuyerOrderReferencedDocument>
|
||||
<ram:ContractReferencedDocument>
|
||||
<ram:IssuerAssignedID>789</ram:IssuerAssignedID>
|
||||
</ram:ContractReferencedDocument>
|
||||
<ram:AdditionalReferencedDocument>
|
||||
<ram:IssuerAssignedID>Supporting document ref</ram:IssuerAssignedID>
|
||||
<ram:URIID>External document location</ram:URIID>
|
||||
<ram:TypeCode>916</ram:TypeCode>
|
||||
<ram:Name>Supporting document descr</ram:Name>
|
||||
<ram:AttachmentBinaryObject mimeCode="application/pdf" filename="filename0">ZGVmYXVsdA==</ram:AttachmentBinaryObject>
|
||||
</ram:AdditionalReferencedDocument>
|
||||
<ram:AdditionalReferencedDocument>
|
||||
<ram:IssuerAssignedID>rst</ram:IssuerAssignedID>
|
||||
<ram:TypeCode>130</ram:TypeCode>
|
||||
<ram:ReferenceTypeCode>0090</ram:ReferenceTypeCode>
|
||||
</ram:AdditionalReferencedDocument>
|
||||
<ram:SpecifiedProcuringProject>
|
||||
<ram:ID>456</ram:ID>
|
||||
<ram:Name>Project reference</ram:Name>
|
||||
</ram:SpecifiedProcuringProject>
|
||||
</ram:ApplicableHeaderTradeAgreement>
|
||||
<ram:ApplicableHeaderTradeDelivery>
|
||||
<ram:ShipToTradeParty>
|
||||
<ram:GlobalID schemeID="0045">deliver location identifier</ram:GlobalID>
|
||||
<ram:Name>Deliver to party name</ram:Name>
|
||||
<ram:PostalTradeAddress>
|
||||
<ram:PostcodeCode>98765</ram:PostcodeCode>
|
||||
<ram:LineOne>Deliver to address line 1</ram:LineOne>
|
||||
<ram:LineTwo>Deliver to address line 2</ram:LineTwo>
|
||||
<ram:LineThree>Deliver to address line 3</ram:LineThree>
|
||||
<ram:CityName>Deliver to city</ram:CityName>
|
||||
<ram:CountryID>IE</ram:CountryID>
|
||||
<ram:CountrySubDivisionName>Deliver to country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
</ram:ShipToTradeParty>
|
||||
<ram:ActualDeliverySupplyChainEvent>
|
||||
<ram:OccurrenceDateTime>
|
||||
<udt:DateTimeString format="102">20181204</udt:DateTimeString>
|
||||
</ram:OccurrenceDateTime>
|
||||
</ram:ActualDeliverySupplyChainEvent>
|
||||
<ram:DespatchAdviceReferencedDocument>
|
||||
<ram:IssuerAssignedID>lmn</ram:IssuerAssignedID>
|
||||
</ram:DespatchAdviceReferencedDocument>
|
||||
<ram:ReceivingAdviceReferencedDocument>
|
||||
<ram:IssuerAssignedID>ghi</ram:IssuerAssignedID>
|
||||
</ram:ReceivingAdviceReferencedDocument>
|
||||
</ram:ApplicableHeaderTradeDelivery>
|
||||
<ram:ApplicableHeaderTradeSettlement>
|
||||
<ram:CreditorReferenceID>Bank assigned creditor identifier</ram:CreditorReferenceID>
|
||||
<ram:PaymentReference>Remittance information</ram:PaymentReference>
|
||||
<ram:TaxCurrencyCode>NOK</ram:TaxCurrencyCode>
|
||||
<ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>
|
||||
<ram:PayeeTradeParty>
|
||||
<ram:GlobalID schemeID="0098">Payee identifier</ram:GlobalID>
|
||||
<ram:Name>Payee name</ram:Name>
|
||||
<ram:SpecifiedLegalOrganization>
|
||||
<ram:ID schemeID="0099">Payee legal registration identifier</ram:ID>
|
||||
</ram:SpecifiedLegalOrganization>
|
||||
</ram:PayeeTradeParty>
|
||||
<ram:SpecifiedTradeSettlementPaymentMeans>
|
||||
<ram:TypeCode>4</ram:TypeCode>
|
||||
<ram:Information>SEPA</ram:Information>
|
||||
<ram:ApplicableTradeSettlementFinancialCard>
|
||||
<ram:ID>1234</ram:ID>
|
||||
<ram:CardholderName>Payment card holder name</ram:CardholderName>
|
||||
</ram:ApplicableTradeSettlementFinancialCard>
|
||||
<ram:PayerPartyDebtorFinancialAccount>
|
||||
<ram:IBANID>Debited account identifier</ram:IBANID>
|
||||
</ram:PayerPartyDebtorFinancialAccount>
|
||||
<ram:PayeePartyCreditorFinancialAccount>
|
||||
<ram:IBANID>IT1212341234123412</ram:IBANID>
|
||||
<ram:AccountName>Payment account name</ram:AccountName>
|
||||
</ram:PayeePartyCreditorFinancialAccount>
|
||||
<ram:PayerSpecifiedDebtorFinancialInstitution>
|
||||
<ram:BICID>BSCTCH22</ram:BICID>
|
||||
</ram:PayerSpecifiedDebtorFinancialInstitution>
|
||||
<ram:PayeePartyCreditorFinancialAccount>
|
||||
<ram:IBANID>IT1212341234123413</ram:IBANID>
|
||||
<ram:AccountName>Payment account name 2</ram:AccountName>
|
||||
</ram:PayeePartyCreditorFinancialAccount>
|
||||
<ram:PayerSpecifiedDebtorFinancialInstitution>
|
||||
<ram:BICID>BSCTCH22</ram:BICID>
|
||||
</ram:PayerSpecifiedDebtorFinancialInstitution>
|
||||
</ram:SpecifiedTradeSettlementPaymentMeans>
|
||||
<ram:ApplicableTradeTax>
|
||||
<ram:CalculatedAmount>50.00</ram:CalculatedAmount>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:CategoryCode>S</ram:CategoryCode>
|
||||
<ram:DueDateTypeCode>29</ram:DueDateTypeCode>
|
||||
<ram:RateApplicablePercent>5.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
<ram:ApplicableTradeTax>
|
||||
<ram:CalculatedAmount>0.00</ram:CalculatedAmount>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:ExemptionReason>Exemtion reason text</ram:ExemptionReason>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:CategoryCode>E</ram:CategoryCode>
|
||||
<ram:ExemptionReasonCode>Exemption reason code</ram:ExemptionReasonCode>
|
||||
<ram:DueDateTypeCode>29</ram:DueDateTypeCode>
|
||||
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
<ram:BillingSpecifiedPeriod>
|
||||
<ram:StartDateTime>
|
||||
<udt:DateTimeString format="102">20181112</udt:DateTimeString>
|
||||
</ram:StartDateTime>
|
||||
<ram:EndDateTime>
|
||||
<udt:DateTimeString format="102">20181130</udt:DateTimeString>
|
||||
</ram:EndDateTime>
|
||||
</ram:BillingSpecifiedPeriod>
|
||||
<ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:ChargeIndicator>
|
||||
<udt:Indicator>false</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>55</ram:ReasonCode>
|
||||
<ram:Reason>Doc allowance reason text</ram:Reason>
|
||||
<ram:CategoryTradeTax>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:CategoryCode>S</ram:CategoryCode>
|
||||
<ram:RateApplicablePercent>5.00</ram:RateApplicablePercent>
|
||||
</ram:CategoryTradeTax>
|
||||
</ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:ChargeIndicator>
|
||||
<udt:Indicator>true</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>AAA</ram:ReasonCode>
|
||||
<ram:Reason>Doc charge reason text</ram:Reason>
|
||||
<ram:CategoryTradeTax>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:CategoryCode>S</ram:CategoryCode>
|
||||
<ram:RateApplicablePercent>5.00</ram:RateApplicablePercent>
|
||||
</ram:CategoryTradeTax>
|
||||
</ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:SpecifiedTradePaymentTerms>
|
||||
<ram:Description>total amount</ram:Description>
|
||||
<ram:DueDateDateTime>
|
||||
<udt:DateTimeString format="102">20181130</udt:DateTimeString>
|
||||
</ram:DueDateDateTime>
|
||||
<ram:DirectDebitMandateID>Mandate reference identifier</ram:DirectDebitMandateID>
|
||||
</ram:SpecifiedTradePaymentTerms>
|
||||
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||
<ram:LineTotalAmount>2000.00</ram:LineTotalAmount>
|
||||
<ram:ChargeTotalAmount>10.00</ram:ChargeTotalAmount>
|
||||
<ram:AllowanceTotalAmount>10.00</ram:AllowanceTotalAmount>
|
||||
<ram:TaxBasisTotalAmount>2000.00</ram:TaxBasisTotalAmount>
|
||||
<ram:TaxTotalAmount currencyID="EUR">50.00</ram:TaxTotalAmount>
|
||||
<ram:TaxTotalAmount currencyID="NOK">46.00</ram:TaxTotalAmount>
|
||||
<ram:RoundingAmount>0.00</ram:RoundingAmount>
|
||||
<ram:GrandTotalAmount>2050.00</ram:GrandTotalAmount>
|
||||
<ram:TotalPrepaidAmount>0.00</ram:TotalPrepaidAmount>
|
||||
<ram:DuePayableAmount>2050.00</ram:DuePayableAmount>
|
||||
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||
<ram:InvoiceReferencedDocument>
|
||||
<ram:IssuerAssignedID>abc123</ram:IssuerAssignedID>
|
||||
<ram:FormattedIssueDateTime>
|
||||
<qdt:DateTimeString format="102">20181004</qdt:DateTimeString>
|
||||
</ram:FormattedIssueDateTime>
|
||||
</ram:InvoiceReferencedDocument>
|
||||
<ram:ReceivableSpecifiedTradeAccountingAccount>
|
||||
<ram:ID>uvz</ram:ID>
|
||||
</ram:ReceivableSpecifiedTradeAccountingAccount>
|
||||
</ram:ApplicableHeaderTradeSettlement>
|
||||
</rsm:SupplyChainTradeTransaction>
|
||||
</rsm:CrossIndustryInvoice>
|
||||
@@ -0,0 +1,404 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDataTypes-2" xmlns:udt="urn:oasis:names:specification:ubl:schema:xsd:UnqualifiedDataTypes-2">
|
||||
<cbc:CustomizationID>urn:cen.eu:en16931:2017</cbc:CustomizationID>
|
||||
<cbc:ProfileID>BT-23 Business Process Type</cbc:ProfileID>
|
||||
<cbc:ID>Test_EeISI_100</cbc:ID>
|
||||
<cbc:IssueDate>2018-11-12</cbc:IssueDate>
|
||||
<cbc:DueDate>2018-11-30</cbc:DueDate>
|
||||
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
|
||||
<cbc:Note>##AAA##invoice note text</cbc:Note>
|
||||
<cbc:Note>##AAA##invoice note text 2</cbc:Note>
|
||||
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
|
||||
<cbc:TaxCurrencyCode>NOK</cbc:TaxCurrencyCode>
|
||||
<cbc:AccountingCost>uvz</cbc:AccountingCost>
|
||||
<cbc:BuyerReference>123</cbc:BuyerReference>
|
||||
<cac:InvoicePeriod>
|
||||
<cbc:StartDate>2018-11-12</cbc:StartDate>
|
||||
<cbc:EndDate>2018-11-30</cbc:EndDate>
|
||||
<cbc:DescriptionCode>35</cbc:DescriptionCode>
|
||||
</cac:InvoicePeriod>
|
||||
<cac:OrderReference>
|
||||
<cbc:ID>abc</cbc:ID>
|
||||
<cbc:SalesOrderID>def</cbc:SalesOrderID>
|
||||
</cac:OrderReference>
|
||||
<cac:BillingReference>
|
||||
<cac:InvoiceDocumentReference>
|
||||
<cbc:ID>abc123</cbc:ID>
|
||||
<cbc:IssueDate>2018-10-04</cbc:IssueDate>
|
||||
</cac:InvoiceDocumentReference>
|
||||
</cac:BillingReference>
|
||||
<cac:DespatchDocumentReference>
|
||||
<cbc:ID>lmn</cbc:ID>
|
||||
</cac:DespatchDocumentReference>
|
||||
<cac:ReceiptDocumentReference>
|
||||
<cbc:ID>ghi</cbc:ID>
|
||||
</cac:ReceiptDocumentReference>
|
||||
<cac:OriginatorDocumentReference>
|
||||
<cbc:ID>opq</cbc:ID>
|
||||
</cac:OriginatorDocumentReference>
|
||||
<cac:ContractDocumentReference>
|
||||
<cbc:ID>789</cbc:ID>
|
||||
</cac:ContractDocumentReference>
|
||||
<cac:AdditionalDocumentReference>
|
||||
<cbc:ID schemeID="0090">rst</cbc:ID>
|
||||
<cbc:DocumentTypeCode>130</cbc:DocumentTypeCode>
|
||||
</cac:AdditionalDocumentReference>
|
||||
<cac:AdditionalDocumentReference>
|
||||
<cbc:ID>Supporting document ref</cbc:ID>
|
||||
<cbc:DocumentDescription>Supporting document descr</cbc:DocumentDescription>
|
||||
<cac:Attachment>
|
||||
<cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="filename0">ZGVmYXVsdA==</cbc:EmbeddedDocumentBinaryObject>
|
||||
<cac:ExternalReference>
|
||||
<cbc:URI>External document location</cbc:URI>
|
||||
</cac:ExternalReference>
|
||||
</cac:Attachment>
|
||||
</cac:AdditionalDocumentReference>
|
||||
<cac:ProjectReference>
|
||||
<cbc:ID>456</cbc:ID>
|
||||
</cac:ProjectReference>
|
||||
<cac:AccountingSupplierParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="SMTP">Seller electronic address</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0100">Seller identifier 1</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0110">Seller identifier 2</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="SEPA">Bank assigned creditor identifier</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Seller trading name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Seller address line 1</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Seller address line 2</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Seller city</cbc:CityName>
|
||||
<cbc:PostalZone>12345</cbc:PostalZone>
|
||||
<cbc:CountrySubentity>Seller country subdivision</cbc:CountrySubentity>
|
||||
<cac:AddressLine>
|
||||
<cbc:Line>Seller address line 3</cbc:Line>
|
||||
</cac:AddressLine>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>DE12345677</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>DE49294093</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>NOVAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>Seller name</cbc:RegistrationName>
|
||||
<cbc:CompanyID schemeID="0310">Seller legal identifier</cbc:CompanyID>
|
||||
<cbc:CompanyLegalForm>Seller additional legal information</cbc:CompanyLegalForm>
|
||||
</cac:PartyLegalEntity>
|
||||
<cac:Contact>
|
||||
<cbc:Name>Seller contact point</cbc:Name>
|
||||
<cbc:Telephone>+41 345 654455</cbc:Telephone>
|
||||
<cbc:ElectronicMail>seller@contact.de</cbc:ElectronicMail>
|
||||
</cac:Contact>
|
||||
</cac:Party>
|
||||
</cac:AccountingSupplierParty>
|
||||
<cac:AccountingCustomerParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="DE:SMTP">Buyer electronic address</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID>0190:Buyer identifier</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Buyer trading name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Buyer address line 1</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Buyer address line 2</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Buyer city</cbc:CityName>
|
||||
<cbc:PostalZone>34562</cbc:PostalZone>
|
||||
<cbc:CountrySubentity>Buyer country subdivision</cbc:CountrySubentity>
|
||||
<cac:AddressLine>
|
||||
<cbc:Line>Buyer address line 3</cbc:Line>
|
||||
</cac:AddressLine>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>IE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>IE394838894</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>Buyer name</cbc:RegistrationName>
|
||||
<cbc:CompanyID>Buyer legal registration identifier</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
<cac:Contact>
|
||||
<cbc:Name>Buyer contact point</cbc:Name>
|
||||
<cbc:Telephone>+353 2948584</cbc:Telephone>
|
||||
<cbc:ElectronicMail>buyer@contact.ie</cbc:ElectronicMail>
|
||||
</cac:Contact>
|
||||
</cac:Party>
|
||||
</cac:AccountingCustomerParty>
|
||||
<cac:PayeeParty>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0098">Payee identifier</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Payee name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:CompanyID schemeID="0099">Payee legal registration identifier</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
</cac:PayeeParty>
|
||||
<cac:TaxRepresentativeParty>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Tax representative name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Tax representative address line 1</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Tax representative address line 2</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Tax representative city</cbc:CityName>
|
||||
<cbc:PostalZone>23455</cbc:PostalZone>
|
||||
<cbc:CountrySubentity>Tax representative country subdivision</cbc:CountrySubentity>
|
||||
<cac:AddressLine>
|
||||
<cbc:Line>Tax representative address line 3</cbc:Line>
|
||||
</cac:AddressLine>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>DE3949053</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
</cac:TaxRepresentativeParty>
|
||||
<cac:Delivery>
|
||||
<cbc:ActualDeliveryDate>2018-12-04</cbc:ActualDeliveryDate>
|
||||
<cac:DeliveryLocation>
|
||||
<cbc:ID schemeID="0045">deliver location identifier</cbc:ID>
|
||||
<cac:Address>
|
||||
<cbc:StreetName>Deliver to address line 1</cbc:StreetName>
|
||||
<cbc:AdditionalStreetName>Deliver to address line 2</cbc:AdditionalStreetName>
|
||||
<cbc:CityName>Deliver to city</cbc:CityName>
|
||||
<cbc:PostalZone>98765</cbc:PostalZone>
|
||||
<cbc:CountrySubentity>Deliver to country subdivision</cbc:CountrySubentity>
|
||||
<cac:AddressLine>
|
||||
<cbc:Line>Deliver to address line 3</cbc:Line>
|
||||
</cac:AddressLine>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>IE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:Address>
|
||||
</cac:DeliveryLocation>
|
||||
<cac:DeliveryParty>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Deliver to party name</cbc:Name>
|
||||
</cac:PartyName>
|
||||
</cac:DeliveryParty>
|
||||
</cac:Delivery>
|
||||
<cac:PaymentMeans>
|
||||
<cbc:PaymentMeansCode name="SEPA">4</cbc:PaymentMeansCode>
|
||||
<cbc:PaymentID>Remittance information</cbc:PaymentID>
|
||||
<cac:CardAccount>
|
||||
<cbc:PrimaryAccountNumberID>1234</cbc:PrimaryAccountNumberID>
|
||||
<cbc:NetworkID>mandatory network id</cbc:NetworkID>
|
||||
<cbc:HolderName>Payment card holder name</cbc:HolderName>
|
||||
</cac:CardAccount>
|
||||
<cac:PayeeFinancialAccount>
|
||||
<cbc:ID>IT1212341234123412</cbc:ID>
|
||||
<cbc:Name>Payment account name</cbc:Name>
|
||||
<cac:FinancialInstitutionBranch>
|
||||
<cbc:ID>BSCTCH22</cbc:ID>
|
||||
</cac:FinancialInstitutionBranch>
|
||||
</cac:PayeeFinancialAccount>
|
||||
<cac:PayeeFinancialAccount>
|
||||
<cbc:ID>IT1212341234123413</cbc:ID>
|
||||
<cbc:Name>Payment account name 2</cbc:Name>
|
||||
<cac:FinancialInstitutionBranch>
|
||||
<cbc:ID>BSCTCH22</cbc:ID>
|
||||
</cac:FinancialInstitutionBranch>
|
||||
</cac:PayeeFinancialAccount>
|
||||
<cac:PaymentMandate>
|
||||
<cbc:ID>Mandate reference identifier</cbc:ID>
|
||||
<cac:PayerFinancialAccount>
|
||||
<cbc:ID>Debited account identifier</cbc:ID>
|
||||
</cac:PayerFinancialAccount>
|
||||
</cac:PaymentMandate>
|
||||
</cac:PaymentMeans>
|
||||
<cac:PaymentTerms>
|
||||
<cbc:Note>total amount</cbc:Note>
|
||||
</cac:PaymentTerms>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>55</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Doc allowance reason text</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.0000</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10.00</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000.00</cbc:BaseAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>AAA</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Doc charge reason text</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.0000</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10.00</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000.00</cbc:BaseAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="NOK">46.00</cbc:TaxAmount>
|
||||
</cac:TaxTotal>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="EUR">50.00</cbc:TaxAmount>
|
||||
<cac:TaxSubtotal>
|
||||
<cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">50.00</cbc:TaxAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:TaxSubtotal>
|
||||
<cac:TaxSubtotal>
|
||||
<cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">0.00</cbc:TaxAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>E</cbc:ID>
|
||||
<cbc:Percent>0.00</cbc:Percent>
|
||||
<cbc:TaxExemptionReasonCode>Exemption reason code</cbc:TaxExemptionReasonCode>
|
||||
<cbc:TaxExemptionReason>Exemtion reason text</cbc:TaxExemptionReason>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:TaxSubtotal>
|
||||
</cac:TaxTotal>
|
||||
<cac:LegalMonetaryTotal>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">2000.00</cbc:LineExtensionAmount>
|
||||
<cbc:TaxExclusiveAmount currencyID="EUR">2000.00</cbc:TaxExclusiveAmount>
|
||||
<cbc:TaxInclusiveAmount currencyID="EUR">2050.00</cbc:TaxInclusiveAmount>
|
||||
<cbc:AllowanceTotalAmount currencyID="EUR">10.00</cbc:AllowanceTotalAmount>
|
||||
<cbc:ChargeTotalAmount currencyID="EUR">10.00</cbc:ChargeTotalAmount>
|
||||
<cbc:PayableAmount currencyID="EUR">2050.00</cbc:PayableAmount>
|
||||
</cac:LegalMonetaryTotal>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1a</cbc:ID>
|
||||
<cbc:Note>Invoice line note</cbc:Note>
|
||||
<cbc:InvoicedQuantity unitCode="EA">10.00000000</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
|
||||
<cbc:AccountingCost>6789</cbc:AccountingCost>
|
||||
<cac:InvoicePeriod>
|
||||
<cbc:StartDate>2018-11-12</cbc:StartDate>
|
||||
<cbc:EndDate>2018-11-30</cbc:EndDate>
|
||||
</cac:InvoicePeriod>
|
||||
<cac:OrderLineReference>
|
||||
<cbc:LineID>12345</cbc:LineID>
|
||||
</cac:OrderLineReference>
|
||||
<cac:DocumentReference>
|
||||
<cbc:ID schemeID="ZZZ">Line object identifier</cbc:ID>
|
||||
<cbc:DocumentTypeCode>130</cbc:DocumentTypeCode>
|
||||
</cac:DocumentReference>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>55</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Invoice line allowance reason</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>AAA</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Invoice line charge reason</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:Item>
|
||||
<cbc:Description>Item description</cbc:Description>
|
||||
<cbc:Name>Item name</cbc:Name>
|
||||
<cac:BuyersItemIdentification>
|
||||
<cbc:ID>Item buyer's identifier</cbc:ID>
|
||||
</cac:BuyersItemIdentification>
|
||||
<cac:SellersItemIdentification>
|
||||
<cbc:ID>Item seller's identifier</cbc:ID>
|
||||
</cac:SellersItemIdentification>
|
||||
<cac:StandardItemIdentification>
|
||||
<cbc:ID>Item standar identifier</cbc:ID>
|
||||
</cac:StandardItemIdentification>
|
||||
<cac:OriginCountry>
|
||||
<cbc:IdentificationCode>IT</cbc:IdentificationCode>
|
||||
</cac:OriginCountry>
|
||||
<cac:CommodityClassification>
|
||||
<cbc:ItemClassificationCode listID="ZZZ" listVersionID="version0">Item classification identifier0</cbc:ItemClassificationCode>
|
||||
</cac:CommodityClassification>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
<cac:AdditionalItemProperty>
|
||||
<cbc:Name>Color</cbc:Name>
|
||||
<cbc:Value>Red</cbc:Value>
|
||||
</cac:AdditionalItemProperty>
|
||||
<cac:AdditionalItemProperty>
|
||||
<cbc:Name>Size</cbc:Name>
|
||||
<cbc:Value>L</cbc:Value>
|
||||
</cac:AdditionalItemProperty>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="EA">1.00</cbc:BaseQuantity>
|
||||
<cac:AllowanceCharge>
|
||||
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
|
||||
<cbc:Amount currencyID="EUR">1</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">11</cbc:BaseAmount>
|
||||
</cac:AllowanceCharge>
|
||||
</cac:Price>
|
||||
</cac:InvoiceLine>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1b</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="EA">10.00000000</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Item name 2</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>E</cbc:ID>
|
||||
<cbc:Percent>0.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
|
||||
</cac:Price>
|
||||
</cac:InvoiceLine>
|
||||
</Invoice>
|
||||
@@ -66,6 +66,11 @@
|
||||
</cac:PartyLegalEntity>
|
||||
</cac:Party>
|
||||
</cac:AccountingCustomerParty>
|
||||
<cac:PayeeParty>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>VR Factoring GmbH</cbc:Name>
|
||||
</cac:PartyName>
|
||||
</cac:PayeeParty>
|
||||
<cac:Delivery>
|
||||
<cbc:ActualDeliveryDate>2017-05-07</cbc:ActualDeliveryDate>
|
||||
</cac:Delivery>
|
||||
|
||||
388
library/src/test/resources/ubl/04.01a-INVOICE_ubl.xml
Normal file
388
library/src/test/resources/ubl/04.01a-INVOICE_ubl.xml
Normal file
@@ -0,0 +1,388 @@
|
||||
<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
|
||||
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
||||
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
|
||||
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.2#conformant#urn:xoev-de:kosit:extension:xrechnung_2.2</cbc:CustomizationID>
|
||||
<cbc:ID>12345</cbc:ID>
|
||||
<cbc:IssueDate>2019-05-15</cbc:IssueDate>
|
||||
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
|
||||
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
|
||||
<cbc:BuyerReference>12345678-12345-83</cbc:BuyerReference>
|
||||
<cac:InvoicePeriod>
|
||||
<cbc:StartDate>2019-02-01</cbc:StartDate>
|
||||
<cbc:EndDate>2019-05-07</cbc:EndDate>
|
||||
</cac:InvoicePeriod>
|
||||
<cac:OrderReference>
|
||||
<cbc:ID>123</cbc:ID>
|
||||
</cac:OrderReference>
|
||||
<cac:AccountingSupplierParty>
|
||||
<cac:Party>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>M. Meier Handwerk GbR</cbc:Name>
|
||||
</cac:PartyName>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Hauptstraße 2</cbc:StreetName>
|
||||
<cbc:CityName>Musterstadt</cbc:CityName>
|
||||
<cbc:PostalZone>12345</cbc:PostalZone>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>DE/12/345/67890</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>M. Meier Handwerk GbR</cbc:RegistrationName>
|
||||
<cbc:CompanyID>1122334455</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
<cac:Contact>
|
||||
<cbc:Name>M. Meier Handwerk GbR</cbc:Name>
|
||||
<cbc:Telephone>010/12345</cbc:Telephone>
|
||||
<cbc:ElectronicMail>info@m-meier.de</cbc:ElectronicMail>
|
||||
</cac:Contact>
|
||||
</cac:Party>
|
||||
</cac:AccountingSupplierParty>
|
||||
<cac:AccountingCustomerParty>
|
||||
<cac:Party>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID>345LA5324</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PostalAddress>
|
||||
<cbc:StreetName>Dorfplatz 3</cbc:StreetName>
|
||||
<cbc:CityName>Musterort</cbc:CityName>
|
||||
<cbc:PostalZone>54321</cbc:PostalZone>
|
||||
<cac:Country>
|
||||
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
|
||||
</cac:Country>
|
||||
</cac:PostalAddress>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>Beispielkunde</cbc:RegistrationName>
|
||||
</cac:PartyLegalEntity>
|
||||
</cac:Party>
|
||||
</cac:AccountingCustomerParty>
|
||||
<cac:PaymentMeans>
|
||||
<cbc:PaymentMeansCode>31</cbc:PaymentMeansCode>
|
||||
<cac:PayeeFinancialAccount>
|
||||
<cbc:ID>DE091111222233334444</cbc:ID>
|
||||
</cac:PayeeFinancialAccount>
|
||||
</cac:PaymentMeans>
|
||||
<cac:PaymentTerms>
|
||||
<cbc:Note>Zahlbar innerhalb 14 Tagen nach Erhalt der Rechnung.</cbc:Note>
|
||||
</cac:PaymentTerms>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="EUR">2382</cbc:TaxAmount>
|
||||
<cac:TaxSubtotal>
|
||||
<cbc:TaxableAmount currencyID="EUR">12536.84</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">2382</cbc:TaxAmount>
|
||||
<cac:TaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:TaxSubtotal>
|
||||
</cac:TaxTotal>
|
||||
<cac:LegalMonetaryTotal>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">12536.84</cbc:LineExtensionAmount>
|
||||
<cbc:TaxExclusiveAmount currencyID="EUR">12536.84</cbc:TaxExclusiveAmount>
|
||||
<cbc:TaxInclusiveAmount currencyID="EUR">14918.84</cbc:TaxInclusiveAmount>
|
||||
<cbc:PrepaidAmount currencyID="EUR">10000.0</cbc:PrepaidAmount>
|
||||
<cbc:PayableAmount currencyID="EUR">4918.84</cbc:PayableAmount>
|
||||
</cac:LegalMonetaryTotal>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">818.04</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Sanitär und Zubehör</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">818.04</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">335.79</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage Sanitär</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">335.79</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 1 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="MTR">149</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>193.70</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage TW-Rohrleitung DN 12-25</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">1.30</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 1 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="MTR">32.50</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>48.75</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage SML DN 100</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">1.50</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 1 3</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="MTR">71.80</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>93.34</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage AW-Rohrleitungen Kunststoff PP bis DN100</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">1.30</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">482.25</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Abwasserleitungen und Zubehör</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">482.25</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 2 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="MTR">9.5</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>99.75</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Abwasserleitung HT-PP DN 100</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">10.50</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>1 2 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="MTR">45.0</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>382.50</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Abwasserleitung HT-PP DN 50</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:InvoiceLine>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">11718.8</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Heizung und Zubehör</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">11718.8</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1324</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage Heizung</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">1324</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 1 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="C62">20</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">700</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Entleeren der Heizungsanlage, teilnetz</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">35</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 1 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="C62">52</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">624</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Demontage Flachheizkörpers</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">12</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="XPP">1</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>10394.8</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Heizflächen und Zubehör</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">10394.8</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 2 1</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="C62">52</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>10202.4</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Flachheizkörper Stahl profiliert Seitent. H 300mm L -500mm Typ22</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">196.20</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
<cac:SubInvoiceLine>
|
||||
<cbc:ID>2 2 2</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="C62">104</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR"
|
||||
>192.4</cbc:LineExtensionAmount>
|
||||
<cac:Item>
|
||||
<cbc:Name>Einzelrosette aus Kunststoff, weiß</cbc:Name>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>19</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:ClassifiedTaxCategory>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">1.85</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="MTR">1</cbc:BaseQuantity>
|
||||
</cac:Price>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:SubInvoiceLine>
|
||||
</cac:InvoiceLine>
|
||||
</ubl:Invoice>
|
||||
Reference in New Issue
Block a user