Merge branch 'master' into includedNotes-items
This commit is contained in:
18
History.md
18
History.md
@@ -1,15 +1,17 @@
|
||||
2.15.1
|
||||
=======
|
||||
- #566
|
||||
- have a bean contructor for direct debit
|
||||
-? lineTotalAmount is null
|
||||
- #566 Failed to parse PDF - Could not reproduce the invoice
|
||||
? be able to access ID in error message
|
||||
? log error IDs
|
||||
- closes #579
|
||||
- #581
|
||||
- #576
|
||||
- #578
|
||||
- closes #579 prepaidamount is only read in UBL
|
||||
- #581 parse lineTotalAmount
|
||||
- also parse TaxBasisAmount
|
||||
- #576 read lineid, #578 set lineid
|
||||
- log error ids
|
||||
- #503 import more ubl
|
||||
- allow jackson to run over more classes, e.g., DirectDebit, bean contructor for direct debit
|
||||
- allow json includedNotes
|
||||
- support importing duePayableAmount
|
||||
|
||||
|
||||
2.15.0
|
||||
=======
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/***
|
||||
* (absolute) allowances on item and document level
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class Allowance extends Charge {
|
||||
|
||||
/***
|
||||
|
||||
@@ -2,11 +2,14 @@ package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementPayment;
|
||||
|
||||
/**
|
||||
* provides e.g. the IBAN to transfer money to :-)
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
/**
|
||||
* the bank account number
|
||||
@@ -15,15 +18,17 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
/**
|
||||
* BIC, I believe it's optional
|
||||
*/
|
||||
protected String BIC=null;
|
||||
protected String BIC = null;
|
||||
/**
|
||||
* the "name" of the bank account (holder)
|
||||
*/
|
||||
protected String accountName=null;
|
||||
protected String accountName = null;
|
||||
|
||||
/***
|
||||
* bean constructor
|
||||
*/
|
||||
public BankDetails() { }
|
||||
public BankDetails() {
|
||||
}
|
||||
|
||||
/***
|
||||
* constructor for IBAN only :-)
|
||||
@@ -32,6 +37,7 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
public BankDetails(String IBAN) {
|
||||
this.IBAN = IBAN;
|
||||
}
|
||||
|
||||
/***
|
||||
* constructor for normal use :-)
|
||||
* @param IBAN the IBAN as string
|
||||
@@ -55,6 +61,7 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
* identify the IBAN. Of course you will specify your own IBAN in full length but
|
||||
* if you deduct from a customer's account you may e.g. leave out the first or last
|
||||
* digits so that nobody spying on the invoice gets to know the complete number
|
||||
*
|
||||
* @param IBAN the "IBAN ID", i.e. the IBAN or parts of it
|
||||
* @return fluent setter
|
||||
*/
|
||||
@@ -81,9 +88,10 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
return this;
|
||||
}
|
||||
|
||||
/***
|
||||
* getOwn... methods will be removed in the future in favor of Tradeparty (e.g. Sender) class
|
||||
* */
|
||||
|
||||
/*
|
||||
I'd really like to get rid of all those getOwn... methods some time but in this case they are in the interface :-(
|
||||
*/
|
||||
@Override
|
||||
@Deprecated
|
||||
@JsonIgnore
|
||||
@@ -101,11 +109,12 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
|
||||
/**
|
||||
* set Holder
|
||||
*
|
||||
* @param name account name (usually account holder if != sender)
|
||||
* @return fluent setter
|
||||
*/
|
||||
public BankDetails setAccountName(String name) {
|
||||
accountName=name;
|
||||
accountName = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -115,5 +124,4 @@ public class BankDetails implements IZUGFeRDTradeSettlementPayment {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
package org.mustangproject;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.TransactionCalculator;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -9,15 +11,21 @@ import org.slf4j.LoggerFactory;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class CalculatedInvoice extends Invoice implements Serializable {
|
||||
|
||||
protected BigDecimal grandTotal=null;
|
||||
protected BigDecimal lineTotalAmount=null;
|
||||
protected BigDecimal duePayable=null;
|
||||
protected BigDecimal grandTotal=null;
|
||||
protected BigDecimal taxBasis=null;
|
||||
|
||||
public void calculate() {
|
||||
TransactionCalculator tc=new TransactionCalculator(this);
|
||||
grandTotal=tc.getGrandTotal();
|
||||
lineTotalAmount=tc.getValue();
|
||||
duePayable=tc.getDuePayable();
|
||||
taxBasis= tc.getTaxBasis();
|
||||
}
|
||||
public BigDecimal getGrandTotal() {
|
||||
if (grandTotal==null) {
|
||||
@@ -29,6 +37,28 @@ public class CalculatedInvoice extends Invoice implements Serializable {
|
||||
grandTotal=grand;
|
||||
return this;
|
||||
}
|
||||
public BigDecimal getTaxBasis() {
|
||||
if (taxBasis==null) {
|
||||
calculate();
|
||||
}
|
||||
return taxBasis;
|
||||
}
|
||||
public CalculatedInvoice setTaxBasis(BigDecimal basis) {
|
||||
taxBasis=basis;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BigDecimal getDuePayable() {
|
||||
if (duePayable==null) {
|
||||
calculate();
|
||||
}
|
||||
return duePayable;
|
||||
}
|
||||
public CalculatedInvoice setDuePayable(BigDecimal due) {
|
||||
duePayable=due;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BigDecimal getLineTotalAmount() {
|
||||
if (lineTotalAmount==null) {
|
||||
calculate();
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDCashDiscount;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@@ -7,6 +9,8 @@ import java.math.BigDecimal;
|
||||
/***
|
||||
* A class to represent discounts for early payments ("Skonto")
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class CashDiscount implements IZUGFeRDCashDiscount {
|
||||
|
||||
/***
|
||||
@@ -31,6 +35,31 @@ public class CashDiscount implements IZUGFeRDCashDiscount {
|
||||
this.days = days;
|
||||
}
|
||||
|
||||
/***
|
||||
* bean contructor
|
||||
*/
|
||||
public CashDiscount() {
|
||||
|
||||
}
|
||||
|
||||
public BigDecimal getPercent() {
|
||||
return percent;
|
||||
}
|
||||
|
||||
public CashDiscount setPercent(BigDecimal percent) {
|
||||
this.percent = percent;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer getDays() {
|
||||
return days;
|
||||
}
|
||||
|
||||
public CashDiscount setDays(Integer days) {
|
||||
this.days = days;
|
||||
return this;
|
||||
}
|
||||
|
||||
/***
|
||||
* @return this particular cash discount as cross industry invoice XML
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IAbsoluteValueProvider;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge;
|
||||
|
||||
@@ -9,6 +11,8 @@ import java.math.BigDecimal;
|
||||
/***
|
||||
* Absolute and relative charges for document and item level
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class Charge implements IZUGFeRDAllowanceCharge {
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,12 +20,16 @@
|
||||
*/
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* A schemed classification for products. The scheme can be anything defined in UNTDID 7143.
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class ClassCode {
|
||||
private final String listID;
|
||||
private final String code;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
@@ -11,6 +12,7 @@ import org.w3c.dom.NodeList;
|
||||
* @see TradeParty
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class Contact implements IZUGFeRDExportableContact {
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,12 +20,16 @@
|
||||
*/
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
|
||||
|
||||
/**
|
||||
* An implementation of {@link IDesignatedProductClassification} for describing a {@link org.mustangproject.Product}
|
||||
*
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class DesignatedProductClassification implements IDesignatedProductClassification {
|
||||
private final ClassCode classCode;
|
||||
private String className;
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementDebit;
|
||||
|
||||
/**
|
||||
* provides e.g. the IBAN to transfer money to :-)
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class DirectDebit implements IZUGFeRDTradeSettlementDebit {
|
||||
/**
|
||||
* Debited account identifier (BT-91)
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class FileAttachment {
|
||||
|
||||
protected String filename;
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
/**
|
||||
* A grouping of business terms to indicate accounting-relevant free texts including a qualification of these.
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class IncludedNote {
|
||||
private String content;
|
||||
|
||||
private SubjectCode subjectCode;
|
||||
|
||||
private static final String INCLUDE_START = "<ram:IncludedNote>";
|
||||
@@ -29,24 +35,31 @@ public class IncludedNote {
|
||||
public static IncludedNote generalNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.AAI);
|
||||
}
|
||||
|
||||
public static IncludedNote regulatoryNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.REG);
|
||||
}
|
||||
|
||||
public static IncludedNote legalNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.ABL);
|
||||
}
|
||||
|
||||
public static IncludedNote customsNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.CUS);
|
||||
}
|
||||
|
||||
public static IncludedNote sellerNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.SUR);
|
||||
}
|
||||
|
||||
public static IncludedNote taxNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.TXD);
|
||||
}
|
||||
|
||||
public static IncludedNote introductionNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.ACY);
|
||||
}
|
||||
|
||||
public static IncludedNote discountBonusNote(String content) {
|
||||
return new IncludedNote(content, SubjectCode.AAK);
|
||||
}
|
||||
@@ -63,6 +76,18 @@ public class IncludedNote {
|
||||
return subjectCode;
|
||||
}
|
||||
|
||||
|
||||
public IncludedNote setSubjectCode(SubjectCode subjectCode) {
|
||||
this.subjectCode = subjectCode;
|
||||
return this;
|
||||
}
|
||||
|
||||
public IncludedNote setContent(String content) {
|
||||
this.content = content;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public String toCiiXml(){
|
||||
String result = INCLUDE_START + CONTENT_START +
|
||||
XMLTools.encodeXML(getContent() )+ CONTENT_END;
|
||||
|
||||
@@ -413,6 +413,11 @@ public class Invoice implements IExportableTransaction {
|
||||
return includedNotes;
|
||||
}
|
||||
|
||||
public Invoice setNotesWithSubjectCode(List<IncludedNote> theList) {
|
||||
includedNotes=theList;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCurrency() {
|
||||
return currency;
|
||||
|
||||
@@ -15,6 +15,8 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/***
|
||||
* describes any invoice line
|
||||
@@ -40,6 +42,7 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<>();
|
||||
protected ArrayList<IZUGFeRDAllowanceCharge> Charges = new ArrayList<>();
|
||||
protected List<IncludedNote> includedNotes = null;
|
||||
//protected HashMap<String, String> attributes = new HashMap<>();
|
||||
|
||||
/***
|
||||
* default constructor
|
||||
@@ -67,8 +70,33 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
// ubl
|
||||
//we need: name description unitcode
|
||||
//and we additionally have vat%
|
||||
setProduct(new Product());
|
||||
|
||||
// Bharti's homework 20241126:Streams https://www.youtube.com/watch?v=Lf01cBzmuXw
|
||||
// and Lambdas https://www.youtube.com/watch?v=HCyx31NW8xg
|
||||
setProduct(new Product(itemMap.getNode("Item").get()));
|
||||
icnm.getAsString("Name").ifPresent(product::setName);
|
||||
icnm.getAsString("Description").ifPresent(product::setDescription);
|
||||
|
||||
icnm.getAsNodeMap("SellersItemIdentification").ifPresent(SellersItemIdentification -> {
|
||||
SellersItemIdentification.getAsString("ID").ifPresent(product::setSellerAssignedID);
|
||||
});
|
||||
|
||||
icnm.getAsNodeMap("BuyersItemIdentification").ifPresent(BuyersItemIdentification -> {
|
||||
BuyersItemIdentification.getAsString("ID").ifPresent(product::setBuyerAssignedID);
|
||||
});
|
||||
|
||||
// String name = icnm.getAsStringOrNull("Name");
|
||||
// String val = icnm.getAsStringOrNull("Value");
|
||||
// if (name != null && val != null) {
|
||||
// if (attributes == null) {
|
||||
// attributes = new HashMap<>();
|
||||
// }
|
||||
// product.attributes.put(name, val);
|
||||
// }
|
||||
//icnm.getNode("AdditionalItemProperty").flatMap(n ->n.getAttributes()).ifPresent(product::setAttributes);
|
||||
|
||||
|
||||
|
||||
icnm.getAsNodeMap("ClassifiedTaxCategory").flatMap(m -> m.getAsBigDecimal("Percent"))
|
||||
.ifPresent(product::setVATPercent);
|
||||
});
|
||||
@@ -89,21 +117,37 @@ public class Item implements IZUGFeRDExportableItem {
|
||||
product.setUnit(icn.getAttributes().getNamedItem("unitCode").getNodeValue());
|
||||
});
|
||||
|
||||
itemMap.getAllNodes("DocumentReference").map(ReferencedDocument::fromNode)
|
||||
.forEach(this::addAdditionalReference);
|
||||
|
||||
// ubl
|
||||
|
||||
itemMap.getAsNodeMap("OrderLineReference")
|
||||
// ubl
|
||||
.flatMap(bordNodes -> bordNodes.getAsString("LineID"))
|
||||
.ifPresent(this::addReferencedLineID);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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);
|
||||
icnm.getAllNodes("AdditionalReferencedDocument").map(ReferencedDocument::fromNode).
|
||||
forEach(this::addReferencedDocument);
|
||||
});
|
||||
|
||||
itemMap.getNode("SpecifiedTradeProduct").map(Product::new).ifPresent(this::setProduct);
|
||||
itemMap.getNode("SpecifiedTradeProduct").map(Product::new).ifPresent(this::setProduct);//CII
|
||||
itemMap.getNode("SpecifiedTradeProduct").map(Product::new).ifPresent(this::setProduct);//UBL
|
||||
|
||||
// RequestedQuantity is for Order-X, BilledQuantity for FX and ZF
|
||||
itemMap.getAsNodeMap("SpecifiedLineTradeDelivery", "SpecifiedSupplyChainTradeDelivery")
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.*;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
@@ -9,6 +10,7 @@ import org.w3c.dom.NodeList;
|
||||
* A organisation, i.e. usually a company
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class LegalOrganisation implements IZUGFeRDLegalOrganisation {
|
||||
|
||||
protected SchemedID schemedID = null;
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
|
||||
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableProduct;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
@@ -59,11 +60,15 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
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");
|
||||
@@ -75,6 +80,26 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//UBL
|
||||
nodeMap.getAsNodeMap("AdditionalItemProperty").ifPresent(aipNodes -> {
|
||||
String name = aipNodes.getAsStringOrNull("Name");
|
||||
String val = aipNodes.getAsStringOrNull("Value");
|
||||
if (name != null && val != null) {
|
||||
if (attributes == null) {
|
||||
attributes = new HashMap<>();
|
||||
}
|
||||
attributes.put(name, val);
|
||||
}
|
||||
});
|
||||
|
||||
nodeMap.getAsNodeMap("CommodityClassification").ifPresent(dpcNodes -> {
|
||||
String className = dpcNodes.getAsStringOrNull("ClassName");
|
||||
dpcNodes.getNode("ItemClassificationCode").map(ClassCode::fromNode).ifPresent(classCode ->
|
||||
classifications.add(new DesignatedProductClassification(classCode, className)));
|
||||
});
|
||||
|
||||
//UBL
|
||||
nodeMap.getAsNodeMap("DesignatedProductClassification").ifPresent(dpcNodes -> {
|
||||
String className = dpcNodes.getAsStringOrNull("ClassName");
|
||||
dpcNodes.getNode("ClassCode").map(ClassCode::fromNode).ifPresent(classCode ->
|
||||
@@ -115,6 +140,7 @@ public class Product implements IZUGFeRDExportableProduct {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
*
|
||||
* @return e.g. intra-commnunity supply or small business
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package org.mustangproject;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.mustangproject.ZUGFeRD.IReferencedDocument;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class ReferencedDocument implements IReferencedDocument {
|
||||
|
||||
String issuerAssignedID;
|
||||
@@ -66,8 +70,8 @@ public class ReferencedDocument implements IReferencedDocument {
|
||||
return null;
|
||||
}
|
||||
NodeMap nodes = new NodeMap(node);
|
||||
return new ReferencedDocument(nodes.getAsStringOrNull("IssuerAssignedID"),
|
||||
nodes.getAsStringOrNull("TypeCode"),
|
||||
return new ReferencedDocument(nodes.getAsStringOrNull("IssuerAssignedID", "ID"),
|
||||
nodes.getAsStringOrNull("TypeCode", "DocumentTypeCode"),
|
||||
nodes.getAsStringOrNull("ReferenceTypeCode"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
package org.mustangproject;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||
public class SchemedID {
|
||||
protected String scheme;
|
||||
protected String id;
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.mustangproject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -16,6 +17,7 @@ import org.w3c.dom.NodeList;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
|
||||
|
||||
/***
|
||||
* A organisation, i.e. usually a company
|
||||
*/
|
||||
@@ -62,6 +64,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected void parseFromUBL(NodeList nodes) {
|
||||
if (nodes.getLength() > 0) {
|
||||
|
||||
@@ -71,8 +74,34 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
if (currentItemNode.getLocalName() != null) {
|
||||
String currentUBLChild = currentItemNode.getLocalName();
|
||||
if (currentUBLChild.equals("Party")) {
|
||||
// if (currentUBLChild.equals("Delivery")) {
|
||||
// NodeList delivery = currentItemNode.getChildNodes();
|
||||
// for (int deliveryIndex = 0; deliveryIndex < delivery.getLength(); deliveryIndex++) {
|
||||
// if (delivery.item(deliveryIndex).getLocalName() != null) {
|
||||
// Node currentNode = delivery.item(deliveryIndex);
|
||||
// if (currentNode.getLocalName().equals("DeliveryLocation")) {
|
||||
// NodeList deliveryLocation = currentNode.getChildNodes();
|
||||
// for (int deliveryLocationIndex = 0; deliveryLocationIndex < deliveryLocation.getLength(); deliveryLocationIndex++) {
|
||||
// if (deliveryLocation.item(deliveryLocationIndex).getLocalName() != null) {
|
||||
// if (deliveryLocation.item(deliveryLocationIndex).getLocalName().equals("ID")) {
|
||||
// //Node currentNode = partyID.item(partyIDIndex);
|
||||
// setID(deliveryLocation.item(deliveryLocationIndex).getTextContent());
|
||||
// if ((deliveryLocation.item(deliveryLocationIndex).getAttributes() != null &&
|
||||
// (deliveryLocation.item(deliveryLocationIndex).getAttributes().getNamedItem("schemeID") != null))
|
||||
// ) {
|
||||
// SchemedID sID = new SchemedID().setScheme(deliveryLocation.item(deliveryLocationIndex).getAttributes().getNamedItem("schemeID").getTextContent());
|
||||
// addGlobalID(sID);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
if (currentUBLChild.equals("Party")) {
|
||||
NodeList party = currentItemNode.getChildNodes();
|
||||
for (int partyIndex = 0; partyIndex < party.getLength(); partyIndex++) {
|
||||
if (party.item(partyIndex).getLocalName() != null) {
|
||||
@@ -90,42 +119,64 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (party.item(partyIndex).getLocalName().equals("EndpointID")) {
|
||||
Node currentNode = party.item(partyIndex);
|
||||
if ((currentNode.getAttributes() != null &&
|
||||
(currentNode.getAttributes().getNamedItem("schemeID") != null))
|
||||
&& (party.item(partyIndex).getAttributes().getNamedItem("schemeID").getNodeValue().equals("EM"))
|
||||
) {
|
||||
setEmail(currentNode.getTextContent());
|
||||
}
|
||||
|
||||
}
|
||||
if (currentTopElementName.equals("PartyIdentification")) {
|
||||
NodeList partyID = party.item(partyIndex).getChildNodes();
|
||||
for (int partyIDIndex = 0; partyIDIndex < partyID.getLength(); partyIDIndex++) {
|
||||
if (partyID.item(partyIDIndex).getLocalName() != null) {
|
||||
if (partyID.item(partyIDIndex).getLocalName().equals("ID")) {
|
||||
Node currentNode = partyID.item(partyIDIndex);
|
||||
if ((currentNode.getAttributes() != null &&
|
||||
(currentNode.getAttributes().getNamedItem("schemeID") != null))
|
||||
) {
|
||||
SchemedID sID = new SchemedID().setScheme(currentNode.getAttributes().getNamedItem("schemeID").getTextContent()).setId(currentNode.getTextContent());
|
||||
addGlobalID(sID);
|
||||
|
||||
}
|
||||
else {
|
||||
setID(currentNode.getTextContent());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTopElementName.equals("PartyTaxScheme")) {
|
||||
NodeList partyTaxScheme = party.item(partyIndex).getChildNodes();
|
||||
String CompanyId = null;
|
||||
for (int partyTaxSchemeIndex = 0; partyTaxSchemeIndex < partyTaxScheme.getLength(); partyTaxSchemeIndex++) {
|
||||
if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName() != null) {
|
||||
if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("CompanyID")) {
|
||||
setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent());
|
||||
|
||||
CompanyId = (partyTaxScheme.item(partyTaxSchemeIndex).getTextContent());
|
||||
}
|
||||
if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("TaxScheme")) {
|
||||
NodeList taxSchemechilds = partyTaxScheme.item(partyTaxSchemeIndex).getChildNodes();
|
||||
for (int taxSchemechildsIndex = 0; taxSchemechildsIndex < taxSchemechilds.getLength(); taxSchemechildsIndex++) {
|
||||
if (taxSchemechilds.item(taxSchemechildsIndex).getLocalName() != null) {
|
||||
if (taxSchemechilds.item(taxSchemechildsIndex).getTextContent().equals("FC") || (taxSchemechilds.item(taxSchemechildsIndex).getTextContent().equals("NOVAT"))) {
|
||||
setTaxID(CompanyId);
|
||||
} else {
|
||||
setVATID(CompanyId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if (currentTopElementName.equals("PartyTaxScheme")) {
|
||||
// NodeList partyTaxScheme = party.item(partyIndex).getChildNodes();
|
||||
// for (int partyTaxSchemeIndex = 0; partyTaxSchemeIndex < partyTaxScheme.getLength(); partyTaxSchemeIndex++) {
|
||||
// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName() != null) {
|
||||
// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("TaxScheme")) {
|
||||
// NodeList taxScheme = partyTaxScheme.item(partyTaxSchemeIndex).getChildNodes();
|
||||
// for (int taxSchemeIndex = 0 ; taxSchemeIndex < taxScheme.getLength(); taxSchemeIndex++) {
|
||||
// if (taxScheme.item(taxSchemeIndex).getLocalName() != null) {
|
||||
// if(taxScheme.item(taxSchemeIndex).getLocalName().equals("ID")){
|
||||
// if (partyTaxScheme.item(partyTaxSchemeIndex).getLocalName().equals("CompanyID")) {
|
||||
// setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent());
|
||||
// } else {
|
||||
// setVATID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
/*
|
||||
UBL only: formally it can have a name as well but BT27 party name *should* be stored in
|
||||
so overwrite if one exists
|
||||
@@ -133,17 +184,37 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
if (currentTopElementName.equals("PartyLegalEntity")) {
|
||||
NodeList legal = party.item(partyIndex).getChildNodes();
|
||||
LegalOrganisation lo = null;
|
||||
for (int legalChildIndex = 0; legalChildIndex < legal.getLength(); legalChildIndex++) {
|
||||
if (legal.item(legalChildIndex).getLocalName() != null) {
|
||||
|
||||
if (legal.item(legalChildIndex).getLocalName().equals("RegistrationName")) {
|
||||
setName(legal.item(legalChildIndex).getTextContent());
|
||||
if (lo == null) {
|
||||
lo = new LegalOrganisation();
|
||||
}
|
||||
lo.setTradingBusinessName(legal.item(legalChildIndex).getTextContent());
|
||||
}
|
||||
if (legal.item(legalChildIndex).getLocalName().equals("CompanyLegalForm")) {
|
||||
setDescription(legal.item(legalChildIndex).getTextContent());
|
||||
}
|
||||
if (legal.item(legalChildIndex).getLocalName().equals("CompanyID")) {
|
||||
if (lo == null) {
|
||||
lo = new LegalOrganisation();
|
||||
}
|
||||
if (legal.item(legalChildIndex).getAttributes().getNamedItem("schemeID")!=null) {
|
||||
SchemedID sid = new SchemedID(legal.item(legalChildIndex).getAttributes().getNamedItem("schemeID").getNodeValue(), legal.item(legalChildIndex).getTextContent());
|
||||
lo.setSchemedID(sid);
|
||||
}
|
||||
}
|
||||
// we dont have that attribute yet in the legalorganisation: CompanyLegalForm
|
||||
if (lo != null) {
|
||||
setLegalOrganisation(lo);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTopElementName.equals("PostalAddress")) {
|
||||
|
||||
NodeList postal = party.item(partyIndex).getChildNodes();
|
||||
@@ -191,8 +262,6 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("Name")) {
|
||||
setName(postal.item(postalChildIndex).getTextContent());
|
||||
@@ -210,7 +279,6 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (currentUBLChild.equals("GlobalID")) {
|
||||
@@ -224,57 +292,6 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
NodeList contact = nodes.item(nodeIndex).getChildNodes();
|
||||
setContact(new Contact(contact));
|
||||
}
|
||||
|
||||
if (currentUBLChild.equals("PostalTradeAddress")) {
|
||||
NodeList postal = nodes.item(nodeIndex).getChildNodes();
|
||||
for (int postalChildIndex = 0; postalChildIndex < postal.getLength(); postalChildIndex++) {
|
||||
if (postal.item(postalChildIndex).getLocalName() != null) {
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("LineOne")) {
|
||||
setStreet(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("LineTwo")) {
|
||||
setAdditionalAddress(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("LineThree")) {
|
||||
setAdditionalAddressExtension(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("CityName")) {
|
||||
setLocation(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("PostcodeCode")) {
|
||||
setZIP(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
if (postal.item(postalChildIndex).getLocalName().equals("CountryID")) {
|
||||
setCountry(postal.item(postalChildIndex).getTextContent());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (currentUBLChild.equals("PartyTaxScheme")) {
|
||||
NodeList taxChilds = nodes.item(nodeIndex).getChildNodes();
|
||||
for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) {
|
||||
if (taxChilds.item(taxChildIndex).getLocalName() != null) {
|
||||
if ((taxChilds.item(taxChildIndex).getLocalName().equals("TaxScheme"))) {
|
||||
if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) {
|
||||
if (taxChilds.item(taxChildIndex).getLocalName().equals("ID")) {
|
||||
if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) {
|
||||
setVATID(taxChilds.item(taxChildIndex).getTextContent());
|
||||
}
|
||||
// setTaxID(partyTaxScheme.item(partyTaxSchemeIndex).getTextContent());
|
||||
if (taxChilds.item(taxChildIndex).getAttributes().getNamedItem("ID").getNodeValue().equals("FC")) {
|
||||
if (taxChilds.item(taxChildIndex).getLocalName().equals("CompanyID")) {
|
||||
setTaxID(taxChilds.item(taxChildIndex).getTextContent());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -558,6 +575,7 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
|
||||
|
||||
/**
|
||||
* primarily for invoiceimporter and JSON
|
||||
*
|
||||
* @return the list of sepa mandates
|
||||
*/
|
||||
public List<DirectDebit> getDebitDetails() {
|
||||
|
||||
@@ -149,7 +149,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider {
|
||||
*
|
||||
* @return item sum +- charges/allowances
|
||||
*/
|
||||
protected BigDecimal getTaxBasis() {
|
||||
public BigDecimal getTaxBasis() {
|
||||
return getTotal().add(getChargesForPercent(null).setScale(2, RoundingMode.HALF_UP))
|
||||
.subtract(getAllowancesForPercent(null).setScale(2, RoundingMode.HALF_UP))
|
||||
.setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
@@ -343,6 +343,9 @@ public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter {
|
||||
* @return the sender's account IBAN code
|
||||
*/
|
||||
public String getIBAN() {
|
||||
if ((importedInvoice==null)||(importedInvoice.getTradeSettlement()==null)) {
|
||||
return null;
|
||||
}
|
||||
for (IZUGFeRDTradeSettlement settlement : importedInvoice.getTradeSettlement()) {
|
||||
if (settlement instanceof IZUGFeRDTradeSettlementDebit) {
|
||||
return ((IZUGFeRDTradeSettlementDebit) settlement).getIBAN();
|
||||
@@ -356,8 +359,6 @@ public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter {
|
||||
|
||||
|
||||
public String getHolder() {
|
||||
|
||||
|
||||
return extractString("//*[local-name() = 'SellerTradeParty']/*[local-name() = 'Name']");
|
||||
}
|
||||
|
||||
@@ -366,7 +367,6 @@ public class ZUGFeRDImporter extends ZUGFeRDInvoiceImporter {
|
||||
* @return the total payable amount
|
||||
*/
|
||||
public String getAmount() {
|
||||
|
||||
return importedInvoice.getGrandTotal().toPlainString();
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
|
||||
import org.mustangproject.*;
|
||||
import org.mustangproject.Exceptions.ArithmetricException;
|
||||
import org.mustangproject.Exceptions.StructureException;
|
||||
import org.mustangproject.util.NodeMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.w3c.dom.Document;
|
||||
@@ -273,6 +274,10 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
}
|
||||
|
||||
public void setID(String id) {
|
||||
String ud = id;
|
||||
}
|
||||
|
||||
/***
|
||||
* This will parse a XML into the given invoice object
|
||||
* @param zpp the invoice to be altered
|
||||
@@ -302,12 +307,116 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
|
||||
|
||||
//UBL...
|
||||
XPathExpression shipExUBL = xpath.compile("//*[local-name()=\"Delivery\"]");
|
||||
Node deliveryNode = (Node) shipExUBL.evaluate(getDocument(), XPathConstants.NODE);
|
||||
|
||||
if (deliveryNode != null) {
|
||||
TradeParty delivery = new TradeParty();
|
||||
new NodeMap(deliveryNode).getAsNodeMap("DeliveryLocation").ifPresent(
|
||||
deliveryLocationNodeMap -> {
|
||||
|
||||
deliveryLocationNodeMap.getNode("ID").ifPresent(s -> {
|
||||
SchemedID sID = new SchemedID().setScheme(s.getAttributes().getNamedItem("schemeID").getTextContent()).setId(s.getTextContent());
|
||||
delivery.addGlobalID(sID);
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("StreetName").ifPresent(t -> delivery.setStreet(t));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("AdditionalStreetName").ifPresent(t -> delivery.setAdditionalAddress(t));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("CityName").ifPresent(t -> delivery.setLocation(t));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("PostalZone").ifPresent(t -> delivery.setZIP(t));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsNodeMap("Country").ifPresent(t -> t.getAsString("IdentificationCode").ifPresent(u -> delivery.setCountry(u)));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsNodeMap("AddressLine").ifPresent(t -> t.getAsString("Line").ifPresent(u -> delivery.setAdditionalAddressExtension(u)));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("AdditionalStreetName").ifPresent(t -> delivery.setAdditionalAddress(t));
|
||||
});
|
||||
deliveryLocationNodeMap.getAsNodeMap("Address").ifPresent(s -> {
|
||||
s.getAsString("AdditionalStreetName").ifPresent(t -> delivery.setAdditionalAddress(t));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
new NodeMap(deliveryNode).getAsNodeMap("DeliveryParty").ifPresent(partyMap -> {
|
||||
partyMap.getAsNodeMap("PartyName").ifPresent(s -> {
|
||||
s.getAsString("Name").ifPresent(t -> delivery.setName(t));
|
||||
});
|
||||
});
|
||||
String street, name, additionalStreet, city, postal, countrySubentity, line, country = null;
|
||||
/*
|
||||
String idx = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"ID\"]");
|
||||
street = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name()=\"Address\"]/*[local-name()=\"StreetName\"]");
|
||||
additionalStreet = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]/*[local-name() = \"AdditionalStreetName\"]");
|
||||
city = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]/*[local-name() = \"CityName\"]");
|
||||
postal = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]/*[local-name() = \"PostalZone\"]");
|
||||
countrySubentity = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]/*[local-name() = \"CountrySubentity\"]");
|
||||
line = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]//*[local-name() = \"AddressLine\"]/*[local-name() = \"Line\"]");
|
||||
country = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"Address\"]//*[local-name() = \"Country\"]/*[local-name() = \"IdentificationCode\"]");
|
||||
name = extractString("//*[local-name()=\"DeliveryLocation\"]/*[local-name() = \"DeliveryParty\"]//*[local-name() = \"PartyName\"]/*[local-name() = \"Name\"]");
|
||||
*/
|
||||
zpp.setDeliveryAddress(delivery);
|
||||
/*
|
||||
zpp.setDeliveryAddress(new TradeParty()
|
||||
.setStreet(street)
|
||||
.setAdditionalAddress(additionalStreet)
|
||||
.setLocation(city)
|
||||
.setZIP(postal)
|
||||
.setAdditionalAddressExtension(line)
|
||||
.setCountry(country)
|
||||
.setName(name)
|
||||
);
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
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\"]/*");
|
||||
xpr = xpath.compile("//*[local-name()=\"PayeeTradeParty\"]");
|
||||
NodeList payeeNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
// UBL
|
||||
XPathExpression shipPayee = xpath.compile("//*[local-name()=\"PayeeParty\"]/*");
|
||||
NodeList ublPayeeNodes = (NodeList) shipPayee.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
// if(ublPayeeNodes != null) {
|
||||
// TradeParty payee = new TradeParty();
|
||||
// NodeMap nodeMap = new NodeMap(ublPayeeNodes).getAsNodeMap("PayeeParty").get();
|
||||
// nodeMap.getNode("ID").ifPresent(s -> {
|
||||
// SchemedID sID = new SchemedID().setScheme(s.getAttributes().getNamedItem("schemeID").getTextContent()).setId(s.getTextContent());
|
||||
// payee.addGlobalID(sID);
|
||||
// });
|
||||
// }
|
||||
//NodeList UBLpayeeNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
zpp.setPayee(new TradeParty(ublPayeeNodes));
|
||||
// TradeParty payee =new TradeParty();
|
||||
// NodeMap payeeID = new NodeMap(UBLpayeeNodes).getAsNodeMap("PartyIdentification").get();
|
||||
// if (payeeID !=null) {
|
||||
// payeeID.getAsString("Name").ifPresent(t->payee.setName(t));
|
||||
// }
|
||||
// if (payeeNodes != null) {
|
||||
// TradeParty payee =new TradeParty();
|
||||
// NodeMap nodeMap = new NodeMap(payeeNodes).getAsNodeMap("PartyIdentification").get();
|
||||
// if (nodeMap != null) {
|
||||
// nodeMap.getNode("ID").ifPresent(s -> {
|
||||
// SchemedID sID = new SchemedID().setScheme(s.getAttributes().getNamedItem("schemeID").getTextContent()).setId(s.getTextContent());
|
||||
// payee.addGlobalID(sID);
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"ExchangedDocument\"]|//*[local-name()=\"HeaderExchangedDocument\"]");
|
||||
NodeList ExchangedDocumentNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
@@ -324,6 +433,19 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
}
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"TaxBasisTotalAmount\"]|//*[local-name()=\"TaxExclusiveAmount\"]");
|
||||
BigDecimal expectedTaxBasis = null;
|
||||
NodeList basisNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
if (basisNodes.getLength() > 0) {
|
||||
expectedTaxBasis = new BigDecimal(XMLTools.trimOrNull(basisNodes.item(0)));
|
||||
if (zpp instanceof CalculatedInvoice) {
|
||||
// usually we would re-calculate the invoice to get expectedGrandTotal
|
||||
// however, for "minimal" invoices or other invoices without lines
|
||||
// this will not work
|
||||
((CalculatedInvoice) zpp).setTaxBasis(expectedTaxBasis);
|
||||
}
|
||||
}
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"TotalPrepaidAmount\"]|//*[local-name()=\"PrepaidAmount\"]");
|
||||
NodeList prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
if (prepaidNodes.getLength() > 0) {
|
||||
@@ -339,6 +461,14 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
}
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"SpecifiedTradeSettlementHeaderMonetarySummation\"]/*[local-name()=\"DuePayableAmount\"]|//*[local-name()=\"LegalMonetaryTotal\"]/*[local-name()=\"PayableAmount\"]");
|
||||
NodeList lineDueNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
if (lineDueNodes.getLength() > 0) {
|
||||
if (zpp instanceof CalculatedInvoice) {
|
||||
((CalculatedInvoice) zpp).setDuePayable(new BigDecimal(XMLTools.trimOrNull(lineDueNodes.item(0))));
|
||||
}
|
||||
}
|
||||
|
||||
Date issueDate = null;
|
||||
Date dueDate = null;
|
||||
Date deliveryDate = null;
|
||||
@@ -378,16 +508,34 @@ public class ZUGFeRDInvoiceImporter {
|
||||
subjectCode = XMLTools.trimOrNull(includedNodeChilds.item(issueDateChildIndex));
|
||||
}
|
||||
}
|
||||
switch (subjectCode){
|
||||
case "AAI": includedNotes.add(IncludedNote.generalNote(content)); break;
|
||||
case "REG": includedNotes.add(IncludedNote.regulatoryNote(content)); break;
|
||||
case "ABL": includedNotes.add(IncludedNote.legalNote(content)); break;
|
||||
case "CUS": includedNotes.add(IncludedNote.customsNote(content)); break;
|
||||
case "SUR": includedNotes.add(IncludedNote.sellerNote(content)); break;
|
||||
case "TXD": includedNotes.add(IncludedNote.taxNote(content)); break;
|
||||
case "ACY": includedNotes.add(IncludedNote.introductionNote(content)); break;
|
||||
case "AAK": includedNotes.add(IncludedNote.discountBonusNote(content)); break;
|
||||
default: includedNotes.add(IncludedNote.unspecifiedNote(content)); break;
|
||||
switch (subjectCode) {
|
||||
case "AAI":
|
||||
includedNotes.add(IncludedNote.generalNote(content));
|
||||
break;
|
||||
case "REG":
|
||||
includedNotes.add(IncludedNote.regulatoryNote(content));
|
||||
break;
|
||||
case "ABL":
|
||||
includedNotes.add(IncludedNote.legalNote(content));
|
||||
break;
|
||||
case "CUS":
|
||||
includedNotes.add(IncludedNote.customsNote(content));
|
||||
break;
|
||||
case "SUR":
|
||||
includedNotes.add(IncludedNote.sellerNote(content));
|
||||
break;
|
||||
case "TXD":
|
||||
includedNotes.add(IncludedNote.taxNote(content));
|
||||
break;
|
||||
case "ACY":
|
||||
includedNotes.add(IncludedNote.introductionNote(content));
|
||||
break;
|
||||
case "AAK":
|
||||
includedNotes.add(IncludedNote.discountBonusNote(content));
|
||||
break;
|
||||
default:
|
||||
includedNotes.add(IncludedNote.unspecifiedNote(content));
|
||||
break;
|
||||
}
|
||||
}
|
||||
zpp.addNotes(includedNotes);
|
||||
@@ -408,7 +556,8 @@ public class ZUGFeRDInvoiceImporter {
|
||||
deliveryDate = new SimpleDateFormat("yyyy-MM-dd").parse(deliveryDt);
|
||||
}
|
||||
}
|
||||
xpr = xpath.compile("//*[local-name()=\"ApplicableHeaderTradeDelivery\"]");
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"ApplicableHeaderTradeDelivery\"]|//*[local-name()=\"Delivery\"]");
|
||||
NodeList headerTradeDeliveryNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
|
||||
for (int i = 0; i < headerTradeDeliveryNodes.getLength(); i++) {
|
||||
@@ -480,7 +629,7 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
|
||||
|
||||
String currency = extractString("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]/*[local-name()=\"InvoiceCurrencyCode\"]|//*[local-name()=\"DocumentCurrencyCode\"]") ;
|
||||
String currency = extractString("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]/*[local-name()=\"InvoiceCurrencyCode\"]|//*[local-name()=\"DocumentCurrencyCode\"]");
|
||||
zpp.setCurrency(currency);
|
||||
|
||||
xpr = xpath.compile("//*[local-name()=\"ApplicableHeaderTradeSettlement\"]|//*[local-name()=\"ApplicableSupplyChainTradeSettlement\"]");
|
||||
@@ -599,9 +748,23 @@ public class ZUGFeRDInvoiceImporter {
|
||||
}
|
||||
}
|
||||
}
|
||||
// if ((paymentMeansChilds.item(paymentTermChildIndex).getLocalName() != null) && (paymentTermChilds.item(paymentTermChildIndex).getLocalName().equals("DirectDebitMandateID"))) {
|
||||
// directDebitMandateID = paymentTermChilds.item(paymentTermChildIndex).getTextContent();
|
||||
// }
|
||||
if ((paymentMeansChilds.item(meansChildIndex).getLocalName() != null)
|
||||
&& (paymentMeansChilds.item(meansChildIndex).getLocalName().equals("PaymentMandate"))) {
|
||||
NodeList paymentMandateChilds = paymentMeansChilds.item(meansChildIndex).getChildNodes();
|
||||
for (int paymentMandateChildIndex = 0; paymentMandateChildIndex < paymentMandateChilds.getLength(); paymentMandateChildIndex++) {
|
||||
if ((paymentMandateChilds.item(paymentMandateChildIndex).getLocalName() != null) && (paymentMandateChilds.item(paymentMandateChildIndex).getLocalName().equals("ID"))) {
|
||||
directDebitMandateID = paymentMandateChilds.item(paymentMandateChildIndex).getTextContent();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
zpp.setDueDate(dueDate).setDeliveryDate(deliveryDate).setIssueDate(issueDate).setSender(new TradeParty(SellerNodes)).setRecipient(new TradeParty(BuyerNodes)).setNumber(number).setDocumentCode(typeCode);
|
||||
|
||||
if ((directDebitMandateID != null) && (IBAN != null)) {
|
||||
@@ -617,21 +780,24 @@ public class ZUGFeRDInvoiceImporter {
|
||||
|
||||
if (buyerOrderIssuerAssignedID != null) {
|
||||
zpp.setBuyerOrderReferencedDocumentID(buyerOrderIssuerAssignedID);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
zpp.setBuyerOrderReferencedDocumentID(extractString("//*[local-name()=\"OrderReference\"]/*[local-name()=\"ID\"]"));
|
||||
}
|
||||
if (sellerOrderIssuerAssignedID != null) {
|
||||
zpp.setSellerOrderReferencedDocumentID(sellerOrderIssuerAssignedID);
|
||||
} else {
|
||||
zpp.setSellerOrderReferencedDocumentID(extractString("//*[local-name()=\"OrderReference\"]/*[local-name()=\"SalesOrderID\"]"));
|
||||
}
|
||||
if (despatchAdviceReferencedDocument != null) {
|
||||
zpp.setDespatchAdviceReferencedDocumentID(despatchAdviceReferencedDocument);
|
||||
} else {
|
||||
zpp.setDespatchAdviceReferencedDocumentID(extractString("//*[local-name()=\"DespatchDocumentReference\"]/*[local-name()=\"ID\"]"));
|
||||
}
|
||||
|
||||
zpp.setOwnOrganisationName(extractString("//*[local-name()=\"SellerTradeParty\"]/*[local-name()=\"Name\"]|//*[local-name()=\"AccountingSupplierParty\"]/*[local-name()=\"Party\"]/*[local-name()=\"PartyName\"]").trim());
|
||||
|
||||
String rounding=extractString("//*[local-name()=\"SpecifiedTradeSettlementHeaderMonetarySummation\"]/*[local-name()=\"RoundingAmount\"]|//*[local-name()=\"LegalMonetaryTotal\"]/*[local-name()=\"Party\"]/*[local-name()=\"PayableRoundingAmount\"]");
|
||||
if ((rounding!=null)&&(!rounding.isEmpty())) {
|
||||
String rounding = extractString("//*[local-name()=\"SpecifiedTradeSettlementHeaderMonetarySummation\"]/*[local-name()=\"RoundingAmount\"]|//*[local-name()=\"LegalMonetaryTotal\"]/*[local-name()=\"Party\"]/*[local-name()=\"PayableRoundingAmount\"]");
|
||||
if ((rounding != null) && (!rounding.isEmpty())) {
|
||||
zpp.setRoundingAmount(new BigDecimal(rounding.trim()));
|
||||
}
|
||||
|
||||
@@ -671,7 +837,7 @@ public class ZUGFeRDInvoiceImporter {
|
||||
// be read,
|
||||
// so the invoice remains arithmetically correct
|
||||
// -> parse document level charges+allowances
|
||||
xpr = xpath.compile("//*[local-name()=\"SpecifiedTradeAllowanceCharge\"]");
|
||||
xpr = xpath.compile("//*[local-name()=\"SpecifiedTradeAllowanceCharge\"]|//*[local-name()=\"AllowanceCharge\"]");//CII and UBL
|
||||
NodeList chargeNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
|
||||
for (int i = 0; i < chargeNodes.getLength(); i++) {
|
||||
NodeList chargeNodeChilds = chargeNodes.item(i).getChildNodes();
|
||||
@@ -685,6 +851,14 @@ public class ZUGFeRDInvoiceImporter {
|
||||
if (chargeChildName != null) {
|
||||
|
||||
if (chargeChildName.equals("ChargeIndicator")) {
|
||||
if (chargeNodeChilds.item(chargeChildIndex).getTextContent().trim().equalsIgnoreCase("false")) {
|
||||
// UBL
|
||||
isCharge = false;
|
||||
} else if (chargeNodeChilds.item(chargeChildIndex).getTextContent().trim().equalsIgnoreCase("true")) {
|
||||
// still UBL
|
||||
isCharge = true;
|
||||
} else {
|
||||
//CII
|
||||
NodeList indicatorChilds = chargeNodeChilds.item(chargeChildIndex).getChildNodes();
|
||||
for (int indicatorChildIndex = 0; indicatorChildIndex < indicatorChilds.getLength(); indicatorChildIndex++) {
|
||||
if ((indicatorChilds.item(indicatorChildIndex).getLocalName() != null)
|
||||
@@ -692,17 +866,19 @@ public class ZUGFeRDInvoiceImporter {
|
||||
isCharge = XMLTools.trimOrNull(indicatorChilds.item(indicatorChildIndex)).equalsIgnoreCase("true");
|
||||
}
|
||||
}
|
||||
} else if (chargeChildName.equals("ActualAmount")) {
|
||||
}
|
||||
|
||||
} else if (chargeChildName.equals("ActualAmount") || chargeChildName.equals("Amount")) {
|
||||
chargeAmount = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex));
|
||||
} else if (chargeChildName.equals("Reason")) {
|
||||
} else if (chargeChildName.equals("Reason") || chargeChildName.equals("AllowanceChargeReason")) {
|
||||
reason = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex));
|
||||
} else if (chargeChildName.equals("ReasonCode")) {
|
||||
} else if (chargeChildName.equals("ReasonCode") || chargeChildName.equals("AllowanceChargeReasonCode")) {
|
||||
reasonCode = XMLTools.trimOrNull(chargeNodeChilds.item(chargeChildIndex));
|
||||
} else if (chargeChildName.equals("CategoryTradeTax")) {
|
||||
} else if (chargeChildName.equals("CategoryTradeTax") || chargeChildName.equals("TaxCategory")) {
|
||||
NodeList taxChilds = chargeNodeChilds.item(chargeChildIndex).getChildNodes();
|
||||
for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) {
|
||||
String taxItemName = taxChilds.item(taxChildIndex).getLocalName();
|
||||
if ((taxItemName != null) && (taxItemName.equals("RateApplicablePercent") || taxItemName.equals("ApplicablePercent"))) {
|
||||
if ((taxItemName != null) && (taxItemName.equals("RateApplicablePercent") || taxItemName.equals("ApplicablePercent") || taxItemName.equals("Percent"))) {
|
||||
taxPercent = XMLTools.trimOrNull(taxChilds.item(taxChildIndex));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,21 @@ package org.mustangproject.ZUGFeRD;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import junit.framework.TestCase;
|
||||
import org.junit.Assert;
|
||||
import org.junit.FixMethodOrder;
|
||||
import org.junit.runners.MethodSorters;
|
||||
import org.mustangproject.*;
|
||||
import org.mustangproject.ZUGFeRD.model.EventTimeCodeTypeConstants;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||
@@ -68,7 +72,7 @@ public class DeSerializationTest extends ResourceCase {
|
||||
hasExceptions = true;
|
||||
}
|
||||
|
||||
CalculatedInvoice ci=new CalculatedInvoice();
|
||||
CalculatedInvoice ci = new CalculatedInvoice();
|
||||
try {
|
||||
zii.extractInto(ci);
|
||||
} catch (XPathExpressionException e) {
|
||||
@@ -154,14 +158,57 @@ public class DeSerializationTest extends ResourceCase {
|
||||
" }\n" +
|
||||
" ]\n" +
|
||||
"}", Invoice.class);
|
||||
TransactionCalculator tc=new TransactionCalculator(fromJSON);
|
||||
assertEquals(tc.getGrandTotal(),new BigDecimal("234.43"));
|
||||
TransactionCalculator tc = new TransactionCalculator(fromJSON);
|
||||
assertEquals(tc.getGrandTotal(), new BigDecimal("234.43"));
|
||||
assertEquals(fromJSON.getNumber(), fromJSON.getNumber());
|
||||
assertEquals(fromJSON.getZFItems().length, fromJSON.getZFItems().length);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void testIssuerAssignedIDRoundtrip() {
|
||||
String occurrenceFrom = "20201001";
|
||||
String occurrenceTo = "20201005";
|
||||
String contractID = "376zreurzu0983";
|
||||
|
||||
String orgID = "0009845";
|
||||
String orgname = "Test company";
|
||||
String number = "123";
|
||||
String priceStr = "1.00";
|
||||
String taxID = "9990815";
|
||||
BigDecimal price = new BigDecimal(priceStr);
|
||||
Invoice newInvoiceFromJSON = null;
|
||||
boolean hasExceptions = false;
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
||||
try {
|
||||
SchemedID gtin = new SchemedID("0160", "2001015001325");
|
||||
SchemedID gln = new SchemedID("0088", "4304171000002");
|
||||
Invoice i = new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
|
||||
.setSellerOrderReferencedDocumentID("9384").setBuyerOrderReferencedDocumentID("28934")
|
||||
.setDetailedDeliveryPeriod(new SimpleDateFormat("yyyyMMdd").parse(occurrenceFrom), new SimpleDateFormat("yyyyMMdd").parse(occurrenceTo))
|
||||
.setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID).setEmail("sender@test.org").setID(orgID).addVATID("DE0815"))
|
||||
.setDeliveryAddress(new TradeParty("just the other side of the street", "teststr.12a", "55232", "Entenhausen", "DE").addVATID("DE47110"))
|
||||
.setContractReferencedDocument(contractID)
|
||||
.setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").addGlobalID(gln).setEmail("recipient@test.org").addVATID("DE4711")
|
||||
.setContact(new Contact("Franz Müller", "01779999999", "franz@mueller.de", "teststr. 12", "55232", "Entenhausen", "DE").setFax("++49555123456")).setAdditionalAddress("Hinterhaus 3"))
|
||||
.addItem(new Item(new Product("Testprodukt", "", "H87", new BigDecimal(16)).addGlobalID(gtin).setSellerAssignedID("4711"), price, new BigDecimal(1.0)).setId("a123").addReferencedLineID("xxx").addNote("item level 1/1").addAllowance(new Allowance(new BigDecimal(0.02)).setReason("item discount").setTaxPercent(new BigDecimal(16))).setDetailedDeliveryPeriod(sdf.parse("2020-01-13"), sdf.parse("2020-01-15")))
|
||||
.addCharge(new Charge(new BigDecimal(0.5)).setReason("quick delivery charge").setTaxPercent(new BigDecimal(16)))
|
||||
.addAllowance(new Allowance(new BigDecimal(0.2)).setReason("discount").setTaxPercent(new BigDecimal(16)))
|
||||
.addCashDiscount(new CashDiscount(new BigDecimal(2), 14))
|
||||
.setDeliveryDate(sdf.parse("2020-11-02")).setNumber(number).setVATDueDateTypeCode(EventTimeCodeTypeConstants.PAYMENT_DATE);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
String json = mapper.writeValueAsString(i);
|
||||
newInvoiceFromJSON = mapper.readValue(json, Invoice.class);
|
||||
} catch (ParseException e) {
|
||||
hasExceptions = true;
|
||||
} catch (JsonProcessingException e) {
|
||||
hasExceptions = true;
|
||||
}
|
||||
assertEquals(newInvoiceFromJSON.getBuyerOrderReferencedDocumentID(), "28934");
|
||||
assertFalse(hasExceptions);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void testDueDateRoundtrip() throws JsonProcessingException {
|
||||
|
||||
@@ -219,4 +266,389 @@ public class DeSerializationTest extends ResourceCase {
|
||||
}
|
||||
|
||||
|
||||
public void testDirectDebit() throws JsonProcessingException {
|
||||
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
// [{"stringValue":"a","intValue":1,"booleanValue":true},
|
||||
// {"stringValue":"bc","intValue":3,"booleanValue":false}]
|
||||
|
||||
boolean exceptions = false;
|
||||
String theXML = "";
|
||||
try {
|
||||
Invoice fromJSON = mapper.readValue("\n" +
|
||||
"\t{\n" +
|
||||
"\t\t\"documentCode\": \"380\",\n" +
|
||||
"\t\t\"number\": \"F20220031\",\n" +
|
||||
"\t\t\"referenceNumber\": \"SERVEXEC\",\n" +
|
||||
"\t\t\"buyerOrderReferencedDocumentID\": \"PO201925478\",\n" +
|
||||
"\t\t\"ownOrganisationName\": \"LE FOURNISSEUR\",\n" +
|
||||
"\t\t\"currency\": \"EUR\",\n" +
|
||||
"\t\t\"issueDate\": \"2022-01-30T23:00:00.000+00:00\",\n" +
|
||||
"\t\t\"dueDate\": \"2022-03-01T23:00:00.000+00:00\",\n" +
|
||||
"\t\t\"deliveryDate\": \"2022-01-27T23:00:00.000+00:00\",\n" +
|
||||
"\t\t\"sender\": {\n" +
|
||||
"\t\t\"name\": \"LE FOURNISSEUR\",\n" +
|
||||
"\t\t\t\"zip\": \"75018\",\n" +
|
||||
"\t\t\t\"street\": \"35 rue d'ici\",\n" +
|
||||
"\t\t\t\"location\": \"PARIS\",\n" +
|
||||
"\t\t\t\"country\": \"FR\",\n" +
|
||||
"\t\t\t\"vatID\": \"FR11123456782\",\n" +
|
||||
"\t\t\t\"additionalAddress\": \"Seller line 2\",\n" +
|
||||
"\t\t\t\"additionalAddressExtension\": \"Seller line 3\",\n" +
|
||||
"\t\t\t\"bankDetails\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"accountName\": null,\n" +
|
||||
"\t\t\t\"iban\": \"FR20 1254 2547 2569 8542 5874 698\",\n" +
|
||||
"\t\t\t\"bic\": \"BIC_MONCOMPTE\"\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"debitDetails\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"mandate\": \"MANDATE PT\",\n" +
|
||||
"\t\t\t\"iban\": \"FR20 1254 2547 2569 8542 5874 698\"\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"contact\": {\n" +
|
||||
"\t\t\t\"name\": \"M. CONTACT\",\n" +
|
||||
"\t\t\t\t\"phone\": \"01 02 03 54 87\",\n" +
|
||||
"\t\t\t\t\"email\": \"seller@seller.com\",\n" +
|
||||
"\t\t\t\t\"zip\": null,\n" +
|
||||
"\t\t\t\t\"street\": null,\n" +
|
||||
"\t\t\t\t\"location\": null,\n" +
|
||||
"\t\t\t\t\"country\": null,\n" +
|
||||
"\t\t\t\t\"fax\": null,\n" +
|
||||
"\t\t\t\t\"vatid\": null,\n" +
|
||||
"\t\t\t\t\"id\": null,\n" +
|
||||
"\t\t\t\t\"additionalAddress\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\"email\": \"moi@seller.com\",\n" +
|
||||
"\t\t\t\"vatid\": \"FR11123456782\",\n" +
|
||||
"\t\t\t\"id\": \"123\",\n" +
|
||||
"\t\t\t\"legalOrganisation\": {\n" +
|
||||
"\t\t\t\"schemedID\": null,\n" +
|
||||
"\t\t\t\t\"tradingBusinessName\": \"SELLER TRADE NAME\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\"globalID\": \"587451236587\",\n" +
|
||||
"\t\t\t\"globalIDScheme\": \"0088\"\n" +
|
||||
"\t},\n" +
|
||||
"\t\t\"recipient\": {\n" +
|
||||
"\t\t\"name\": \"LE CLIENT\",\n" +
|
||||
"\t\t\t\"zip\": \"06000\",\n" +
|
||||
"\t\t\t\"street\": \"MON ADRESSE LIGNE 1\",\n" +
|
||||
"\t\t\t\"location\": \"MA VILLE\",\n" +
|
||||
"\t\t\t\"country\": \"FR\",\n" +
|
||||
"\t\t\t\"vatID\": \"FR 05 987 654 321\",\n" +
|
||||
"\t\t\t\"additionalAddress\": \"Buyer line 2\",\n" +
|
||||
"\t\t\t\"additionalAddressExtension\": \"Buyer line 3\",\n" +
|
||||
"\t\t\t\"contact\": {\n" +
|
||||
"\t\t\t\"name\": \"Buyer contact name\",\n" +
|
||||
"\t\t\t\t\"phone\": \"01 01 25 45 87\",\n" +
|
||||
"\t\t\t\t\"email\": \"buyer@buyer.com\",\n" +
|
||||
"\t\t\t\t\"zip\": null,\n" +
|
||||
"\t\t\t\t\"street\": null,\n" +
|
||||
"\t\t\t\t\"location\": null,\n" +
|
||||
"\t\t\t\t\"country\": null,\n" +
|
||||
"\t\t\t\t\"fax\": null,\n" +
|
||||
"\t\t\t\t\"vatid\": null,\n" +
|
||||
"\t\t\t\t\"id\": null,\n" +
|
||||
"\t\t\t\t\"additionalAddress\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\"email\": \"me@buyer.com\",\n" +
|
||||
"\t\t\t\"vatid\": \"FR 05 987 654 321\",\n" +
|
||||
"\t\t\t\"legalOrganisation\": {\n" +
|
||||
"\t\t\t\"schemedID\": null,\n" +
|
||||
"\t\t\t\t\"tradingBusinessName\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\"globalID\": \"3654789851\",\n" +
|
||||
"\t\t\t\"globalIDScheme\": \"0088\"\n" +
|
||||
"\t},\n" +
|
||||
"\t\t\"deliveryAddress\": {\n" +
|
||||
"\t\t\"name\": \"DEL Name\",\n" +
|
||||
"\t\t\t\"zip\": \"06000\",\n" +
|
||||
"\t\t\t\"street\": \"DEL ADRESSE LIGNE 1\",\n" +
|
||||
"\t\t\t\"location\": \"NICE\",\n" +
|
||||
"\t\t\t\"country\": \"FR\",\n" +
|
||||
"\t\t\t\"additionalAddress\": \"DEL line 2\",\n" +
|
||||
"\t\t\t\"id\": \"PRIVATE_ID_DEL\"\n" +
|
||||
"\t},\n" +
|
||||
"\t\t\"payee\": {\n" +
|
||||
"\t\t\"name\": \"PAYEE NAME\",\n" +
|
||||
"\t\t\t\"legalOrganisation\": {\n" +
|
||||
"\t\t\t\"schemedID\": null,\n" +
|
||||
"\t\t\t\t\"tradingBusinessName\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\"globalID\": \"587451236586\",\n" +
|
||||
"\t\t\t\"globalIDScheme\": \"0088\"\n" +
|
||||
"\t},\n" +
|
||||
"\t\t\"sellerOrderReferencedDocumentID\": \"SALES REF 2547\",\n" +
|
||||
"\t\t\"despatchAdviceReferencedDocumentID\": \"DESPADV002\",\n" +
|
||||
"\t\t\"grandTotal\": 107.82,\n" +
|
||||
"\t\t\"detailedDeliveryPeriodFrom\": \"2021-12-31T23:00:00.000+00:00\",\n" +
|
||||
"\t\t\"detailedDeliveryPeriodTo\": \"2022-12-30T23:00:00.000+00:00\",\n" +
|
||||
"\t\t\"notesWithSubjectCode\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"FOURNISSEUR F SARL au capital de 50 000 EUR\",\n" +
|
||||
"\t\t\t\"subjectCode\": \"REG\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"RCS MAVILLE 123 456 782\",\n" +
|
||||
"\t\t\t\"subjectCode\": \"ABL\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"35 ma rue a moi, code postal Ville Pays – contact@masociete.fr - www.masociete.fr – N° TVA : FR32 123 456 789\",\n" +
|
||||
"\t\t\t\"subjectCode\": \"AAI\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"Tout retard de paiement engendre une pénalité exigible à compter de la date d'échéance, calculée sur la base de trois fois le taux d'intérêt légal.\",\n" +
|
||||
"\t\t\t\"subjectCode\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"Indemnité forfaitaire pour frais de recouvrement en cas de retard de paiement : 40 €.\",\n" +
|
||||
"\t\t\t\"subjectCode\": null\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"content\": \"Les réglements reçus avant la date d'échéance ne donneront pas lieu à escompte.\",\n" +
|
||||
"\t\t\t\"subjectCode\": null\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"zfallowances\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": null,\n" +
|
||||
"\t\t\t\"reasonCode\": \"100\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 2,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE VOLUME\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"71\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": null,\n" +
|
||||
"\t\t\t\"reasonCode\": \"100\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1.4,\n" +
|
||||
"\t\t\t\"taxPercent\": 20,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE COMMERCIALE\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"100\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1.2,\n" +
|
||||
"\t\t\t\"taxPercent\": 10,\n" +
|
||||
"\t\t\t\"reason\": \"REMISE COMMERCIALE\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"100\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"zfcharges\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": null,\n" +
|
||||
"\t\t\t\"reasonCode\": \"ADL\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 1,\n" +
|
||||
"\t\t\t\"taxPercent\": null,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS PALETTE\",\n" +
|
||||
"\t\t\t\"reasonCode\": null,\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 2.8,\n" +
|
||||
"\t\t\t\"taxPercent\": 20,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS DEPLACEMENT\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"FC\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"percent\": null,\n" +
|
||||
"\t\t\t\"totalAmount\": 0.6,\n" +
|
||||
"\t\t\t\"taxPercent\": 10,\n" +
|
||||
"\t\t\t\"reason\": \"FRAIS DEPLACEMENT\",\n" +
|
||||
"\t\t\t\"reasonCode\": \"ADR\",\n" +
|
||||
"\t\t\t\"categoryCode\": \"S\"\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"tradeSettlement\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"accountName\": null,\n" +
|
||||
"\t\t\t\"iban\": \"FR20 1254 2547 2569 8542 5874 698\",\n" +
|
||||
"\t\t\t\"bic\": \"BIC_MONCOMPTE\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"mandate\": \"MANDATE PT\",\n" +
|
||||
"\t\t\t\"iban\": \"FR20 1254 2547 2569 8542 5874 698\"\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"zfitems\": [\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"price\": 60,\n" +
|
||||
"\t\t\t\"quantity\": 1,\n" +
|
||||
"\t\t\t\"basisQuantity\": 1,\n" +
|
||||
"\t\t\t\"product\": {\n" +
|
||||
"\t\t\t\"unit\": \"C62\",\n" +
|
||||
"\t\t\t\t\"name\": \"REMBOURSEMENT AFFRANCHISSEMENT\",\n" +
|
||||
"\t\t\t\t\"description\": \"Description\",\n" +
|
||||
"\t\t\t\t\"taxCategoryCode\": \"Z\",\n" +
|
||||
"\t\t\t\t\"vatpercent\": 0,\n" +
|
||||
"\t\t\t\t\"reverseCharge\": false,\n" +
|
||||
"\t\t\t\t\"intraCommunitySupply\": false,\n" +
|
||||
"\t\t\t\t\"globalID\": \"598785412598745\",\n" +
|
||||
"\t\t\t\t\"globalIDScheme\": \"0160\"\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\t\"buyerOrderReferencedDocumentLineID\": \"1\",\n" +
|
||||
"\t\t\t\"value\": 60\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"price\": 30,\n" +
|
||||
"\t\t\t\"quantity\": 3,\n" +
|
||||
"\t\t\t\"basisQuantity\": 3,\n" +
|
||||
"\t\t\t\"product\": {\n" +
|
||||
"\t\t\t\"unit\": \"C62\",\n" +
|
||||
"\t\t\t\t\"name\": \"FOURNITURES DIVERSES\",\n" +
|
||||
"\t\t\t\t\"description\": \"Description\",\n" +
|
||||
"\t\t\t\t\"taxCategoryCode\": \"S\",\n" +
|
||||
"\t\t\t\t\"vatpercent\": 20,\n" +
|
||||
"\t\t\t\t\"reverseCharge\": false,\n" +
|
||||
"\t\t\t\t\"intraCommunitySupply\": false\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\t\"buyerOrderReferencedDocumentLineID\": \"3\",\n" +
|
||||
"\t\t\t\"value\": 30\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t{\n" +
|
||||
"\t\t\t\"price\": 12,\n" +
|
||||
"\t\t\t\"quantity\": 1,\n" +
|
||||
"\t\t\t\"basisQuantity\": 1,\n" +
|
||||
"\t\t\t\"product\": {\n" +
|
||||
"\t\t\t\"unit\": \"C62\",\n" +
|
||||
"\t\t\t\t\"name\": \"APPEL\",\n" +
|
||||
"\t\t\t\t\"description\": \"Description\",\n" +
|
||||
"\t\t\t\t\"taxCategoryCode\": \"S\",\n" +
|
||||
"\t\t\t\t\"vatpercent\": 10,\n" +
|
||||
"\t\t\t\t\"reverseCharge\": false,\n" +
|
||||
"\t\t\t\t\"intraCommunitySupply\": false\n" +
|
||||
"\t\t},\n" +
|
||||
"\t\t\t\"buyerOrderReferencedDocumentLineID\": \"2\",\n" +
|
||||
"\t\t\t\"value\": 12\n" +
|
||||
"\t\t}\n" +
|
||||
" ],\n" +
|
||||
"\t\t\"ownStreet\": \"35 rue d'ici\",\n" +
|
||||
"\t\t\"ownCountry\": \"FR\",\n" +
|
||||
"\t\t\"ownZIP\": \"75018\",\n" +
|
||||
"\t\t\"ownLocation\": \"PARIS\",\n" +
|
||||
"\t\t\"ownVATID\": \"FR11123456782\",\n" +
|
||||
"\t\t\"valid\": false\n" +
|
||||
"\t}\n", Invoice.class);
|
||||
ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
|
||||
zf2p.setProfile(Profiles.getByName("XRechnung"));
|
||||
zf2p.generateXML(fromJSON);
|
||||
theXML = new String(zf2p.getXML());
|
||||
} catch (Exception e) {
|
||||
exceptions = true;
|
||||
}
|
||||
assertTrue(theXML.contains("pour frais de recouvrement en cas de retard de paiement"));
|
||||
assertFalse(exceptions);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -281,12 +281,16 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
public void testXRImport() {
|
||||
boolean hasExceptions = false;
|
||||
|
||||
ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter();
|
||||
ZUGFeRDImporter zii = new ZUGFeRDImporter();
|
||||
|
||||
int version=-1;
|
||||
try {
|
||||
zii.fromXML(new String(Files.readAllBytes(Paths.get("./target/testout-XR-Edge.xml")), StandardCharsets.UTF_8));
|
||||
|
||||
version=zii.getVersion();
|
||||
} catch (IOException e) {
|
||||
hasExceptions = true;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Invoice invoice = null;
|
||||
@@ -296,8 +300,17 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
hasExceptions = true;
|
||||
}
|
||||
assertFalse(hasExceptions);
|
||||
|
||||
|
||||
|
||||
TransactionCalculator tc = new TransactionCalculator(invoice);
|
||||
assertEquals(new BigDecimal("1.00"), tc.getGrandTotal());
|
||||
|
||||
assertEquals(version,2);
|
||||
assertTrue(new BigDecimal("1").compareTo(invoice.getZFItems()[0].getQuantity()) == 0);
|
||||
LineCalculator lc=new LineCalculator(invoice.getZFItems()[0]);
|
||||
assertTrue(new BigDecimal("1").compareTo(lc.getItemTotalNetAmount()) == 0);
|
||||
|
||||
assertTrue(invoice.getTradeSettlement().length == 1);
|
||||
assertTrue(invoice.getTradeSettlement()[0] instanceof IZUGFeRDTradeSettlementPayment);
|
||||
IZUGFeRDTradeSettlementPayment paym = (IZUGFeRDTradeSettlementPayment) invoice.getTradeSettlement()[0];
|
||||
@@ -380,6 +393,62 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
this would test if for all elements/attributes
|
||||
*
|
||||
|
||||
public void testEEISI_300_cii_Import() throws XPathExpressionException, ParseException {
|
||||
boolean hasExceptions = false;
|
||||
File inputCII = getResourceAsFile("not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.cii.xml");
|
||||
File inputUBL = getResourceAsFile("not_validating_full_invoice_based_onTest_EeISI_300_CENfullmodel.ubl.xml");
|
||||
|
||||
|
||||
ZUGFeRDInvoiceImporter zii = new ZUGFeRDInvoiceImporter();
|
||||
zii.doIgnoreCalculationErrors();
|
||||
try {
|
||||
zii.fromXML(new String(Files.readAllBytes(inputCII.toPath()), StandardCharsets.UTF_8));
|
||||
|
||||
} catch (IOException e) {
|
||||
hasExceptions = true;
|
||||
}
|
||||
|
||||
Invoice invoiceUBL = null;
|
||||
invoiceUBL = zii.extractInvoice();
|
||||
|
||||
try {
|
||||
zii.ignoreCalculationErrors=true;
|
||||
zii.fromXML(new String(Files.readAllBytes(inputUBL.toPath()), StandardCharsets.UTF_8));
|
||||
|
||||
} catch (IOException e) {
|
||||
hasExceptions = true;
|
||||
}
|
||||
|
||||
Invoice invoiceCII = null;
|
||||
try {
|
||||
invoiceCII = zii.extractInvoice();
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
String ubl=mapper.writeValueAsString(invoiceUBL).replace("," ,"\n");
|
||||
String cii=mapper.writeValueAsString(invoiceCII).replace("," ,"\n");
|
||||
|
||||
assertEquals(cii,ubl);
|
||||
|
||||
|
||||
/*
|
||||
<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;
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
assertFalse(hasExceptions);
|
||||
|
||||
// TransactionCalculator tc = new TransactionCalculator(invoiceCII);
|
||||
// assertEquals(new BigDecimal("205.00"), tc.getGrandTotal());
|
||||
|
||||
}
|
||||
*/
|
||||
@Test
|
||||
public void testImportPrepaid() throws XPathExpressionException, ParseException {
|
||||
InputStream inputStream = this.getClass()
|
||||
@@ -395,11 +464,14 @@ public class ZF2ZInvoiceImporterTest extends ResourceCase {
|
||||
assertTrue(isBD);
|
||||
BigDecimal expectedPrepaid=new BigDecimal(50);
|
||||
BigDecimal expectedLineTotal=new BigDecimal("180.76");
|
||||
BigDecimal expectedDue=new BigDecimal("147.65");
|
||||
if (isBD) {
|
||||
BigDecimal amread=invoice.getTotalPrepaidAmount();
|
||||
BigDecimal amline=invoice.getLineTotalAmount();
|
||||
BigDecimal importedLineTotal=invoice.getLineTotalAmount();
|
||||
BigDecimal importedDuePayable=invoice.getDuePayable();
|
||||
assertTrue(amread.compareTo(expectedPrepaid) == 0);
|
||||
assertTrue(amline.compareTo(expectedLineTotal) == 0);
|
||||
assertTrue(importedLineTotal.compareTo(expectedLineTotal) == 0);
|
||||
assertTrue(importedDuePayable.compareTo(expectedDue) == 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
<?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: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>
|
||||
@@ -19,11 +16,11 @@
|
||||
</ram:IssueDateTime>
|
||||
<ram:IncludedNote>
|
||||
<ram:Content>invoice note text</ram:Content>
|
||||
<ram:SubjectCode>AAA</ram:SubjectCode>
|
||||
<ram:SubjectCode>#AAA#</ram:SubjectCode>
|
||||
</ram:IncludedNote>
|
||||
<ram:IncludedNote>
|
||||
<ram:Content>invoice note text 2</ram:Content>
|
||||
<ram:SubjectCode>AAA</ram:SubjectCode>
|
||||
<ram:SubjectCode>#AAA#</ram:SubjectCode>
|
||||
</ram:IncludedNote>
|
||||
</rsm:ExchangedDocument>
|
||||
<rsm:SupplyChainTradeTransaction>
|
||||
@@ -35,9 +32,7 @@
|
||||
</ram:IncludedNote>
|
||||
</ram:AssociatedDocumentLineDocument>
|
||||
<ram:SpecifiedTradeProduct>
|
||||
<ram:GlobalID schemeID="0060">Item standar identifier
|
||||
</ram:GlobalID>
|
||||
|
||||
<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>
|
||||
@@ -98,9 +93,9 @@
|
||||
<udt:Indicator>false</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>100.00</ram:BasisAmount>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>95</ram:ReasonCode>
|
||||
<ram:ReasonCode>55</ram:ReasonCode>
|
||||
<ram:Reason>Invoice line allowance reason</ram:Reason>
|
||||
</ram:SpecifiedTradeAllowanceCharge>
|
||||
<ram:SpecifiedTradeAllowanceCharge>
|
||||
@@ -108,17 +103,18 @@
|
||||
<udt:Indicator>true</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>100.00</ram:BasisAmount>
|
||||
<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>100.00</ram:LineTotalAmount>
|
||||
<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>
|
||||
@@ -147,7 +143,7 @@
|
||||
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
<ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
<ram:LineTotalAmount>100.00</ram:LineTotalAmount>
|
||||
<ram:LineTotalAmount>1000.00</ram:LineTotalAmount>
|
||||
</ram:SpecifiedTradeSettlementLineMonetarySummation>
|
||||
</ram:SpecifiedLineTradeSettlement>
|
||||
</ram:IncludedSupplyChainTradeLineItem>
|
||||
@@ -159,7 +155,7 @@
|
||||
<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:ID schemeID="0310">Seller legal identifier</ram:ID>
|
||||
<ram:TradingBusinessName>Seller trading name</ram:TradingBusinessName>
|
||||
</ram:SpecifiedLegalOrganization>
|
||||
<ram:DefinedTradeContact>
|
||||
@@ -181,7 +177,7 @@
|
||||
<ram:CountrySubDivisionName>Seller country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
<ram:URIUniversalCommunication>
|
||||
<ram:URIID schemeID="EM">Seller electronic address</ram:URIID>
|
||||
<ram:URIID schemeID="SMTP">Seller electronic address</ram:URIID>
|
||||
</ram:URIUniversalCommunication>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="VA">DE12345677</ram:ID>
|
||||
@@ -216,7 +212,7 @@
|
||||
<ram:CountrySubDivisionName>Buyer country subdivision</ram:CountrySubDivisionName>
|
||||
</ram:PostalTradeAddress>
|
||||
<ram:URIUniversalCommunication>
|
||||
<ram:URIID schemeID="EM">Buyer electronic address</ram:URIID>
|
||||
<ram:URIID schemeID="DE:SMTP">Buyer electronic address</ram:URIID>
|
||||
</ram:URIUniversalCommunication>
|
||||
<ram:SpecifiedTaxRegistration>
|
||||
<ram:ID schemeID="VA">IE394838894</ram:ID>
|
||||
@@ -256,7 +252,7 @@
|
||||
<ram:AdditionalReferencedDocument>
|
||||
<ram:IssuerAssignedID>rst</ram:IssuerAssignedID>
|
||||
<ram:TypeCode>130</ram:TypeCode>
|
||||
<ram:ReferenceTypeCode>AAA</ram:ReferenceTypeCode>
|
||||
<ram:ReferenceTypeCode>0090</ram:ReferenceTypeCode>
|
||||
</ram:AdditionalReferencedDocument>
|
||||
<ram:SpecifiedProcuringProject>
|
||||
<ram:ID>456</ram:ID>
|
||||
@@ -315,32 +311,32 @@
|
||||
<ram:IBANID>IT1212341234123412</ram:IBANID>
|
||||
<ram:AccountName>Payment account name</ram:AccountName>
|
||||
</ram:PayeePartyCreditorFinancialAccount>
|
||||
<!-- <ram:BICID>BSCTCH22</ram:BICID> -->
|
||||
<!-- <ram:PayerSpecifiedDebtorFinancialInstitution>
|
||||
</ram:PayerSpecifiedDebtorFinancialInstitution> -->
|
||||
<!-- <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:PayerSpecifiedDebtorFinancialInstitution>
|
||||
</ram:SpecifiedTradeSettlementPaymentMeans>
|
||||
<ram:ApplicableTradeTax>
|
||||
<ram:CalculatedAmount>5.00</ram:CalculatedAmount>
|
||||
<ram:CalculatedAmount>50.00</ram:CalculatedAmount>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
<ram:BasisAmount>100.00</ram:BasisAmount>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:CategoryCode>S</ram:CategoryCode>
|
||||
<!-- <ram:DueDateTypeCode>29</ram:DueDateTypeCode> -->
|
||||
<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>100.00</ram:BasisAmount>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:CategoryCode>E</ram:CategoryCode>
|
||||
<ram:ExemptionReasonCode>VATEX-EU-O</ram:ExemptionReasonCode>
|
||||
<ram:ExemptionReasonCode>Exemption reason code</ram:ExemptionReasonCode>
|
||||
<ram:DueDateTypeCode>29</ram:DueDateTypeCode>
|
||||
<ram:RateApplicablePercent>0.00</ram:RateApplicablePercent>
|
||||
</ram:ApplicableTradeTax>
|
||||
@@ -357,9 +353,9 @@
|
||||
<udt:Indicator>false</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>100.00</ram:BasisAmount>
|
||||
<ram:BasisAmount>1000.00</ram:BasisAmount>
|
||||
<ram:ActualAmount>10.00</ram:ActualAmount>
|
||||
<ram:ReasonCode>95</ram:ReasonCode>
|
||||
<ram:ReasonCode>55</ram:ReasonCode>
|
||||
<ram:Reason>Doc allowance reason text</ram:Reason>
|
||||
<ram:CategoryTradeTax>
|
||||
<ram:TypeCode>VAT</ram:TypeCode>
|
||||
@@ -372,7 +368,7 @@
|
||||
<udt:Indicator>true</udt:Indicator>
|
||||
</ram:ChargeIndicator>
|
||||
<ram:CalculationPercent>1.00</ram:CalculationPercent>
|
||||
<ram:BasisAmount>100.00</ram:BasisAmount>
|
||||
<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>
|
||||
@@ -390,16 +386,16 @@
|
||||
<ram:DirectDebitMandateID>Mandate reference identifier</ram:DirectDebitMandateID>
|
||||
</ram:SpecifiedTradePaymentTerms>
|
||||
<ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||
<ram:LineTotalAmount>200.00</ram:LineTotalAmount>
|
||||
<ram:LineTotalAmount>2000.00</ram:LineTotalAmount>
|
||||
<ram:ChargeTotalAmount>10.00</ram:ChargeTotalAmount>
|
||||
<ram:AllowanceTotalAmount>10.00</ram:AllowanceTotalAmount>
|
||||
<ram:TaxBasisTotalAmount>200.00</ram:TaxBasisTotalAmount>
|
||||
<ram:TaxTotalAmount currencyID="EUR">5.00</ram:TaxTotalAmount>
|
||||
<ram:TaxTotalAmount currencyID="NOK">4.60</ram:TaxTotalAmount>
|
||||
<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>205.00</ram:GrandTotalAmount>
|
||||
<ram:GrandTotalAmount>2050.00</ram:GrandTotalAmount>
|
||||
<ram:TotalPrepaidAmount>0.00</ram:TotalPrepaidAmount>
|
||||
<ram:DuePayableAmount>205.00</ram:DuePayableAmount>
|
||||
<ram:DuePayableAmount>2050.00</ram:DuePayableAmount>
|
||||
</ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
||||
<ram:InvoiceReferencedDocument>
|
||||
<ram:IssuerAssignedID>abc123</ram:IssuerAssignedID>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?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:cec="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
|
||||
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
|
||||
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
|
||||
<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: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>
|
||||
@@ -15,6 +15,7 @@
|
||||
<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>
|
||||
@@ -32,9 +33,16 @@
|
||||
<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>
|
||||
@@ -45,16 +53,12 @@
|
||||
</cac:ExternalReference>
|
||||
</cac:Attachment>
|
||||
</cac:AdditionalDocumentReference>
|
||||
<cac:AdditionalDocumentReference>
|
||||
<cbc:ID schemeID="AAA">rst</cbc:ID>
|
||||
<cbc:DocumentTypeCode>130</cbc:DocumentTypeCode>
|
||||
</cac:AdditionalDocumentReference>
|
||||
<cac:ProjectReference>
|
||||
<cbc:ID>456</cbc:ID>
|
||||
</cac:ProjectReference>
|
||||
<cac:AccountingSupplierParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="EM">Seller electronic address</cbc:EndpointID>
|
||||
<cbc:EndpointID schemeID="SMTP">Seller electronic address</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0100">Seller identifier 1</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
@@ -86,11 +90,12 @@
|
||||
<cac:PartyTaxScheme>
|
||||
<cbc:CompanyID>DE49294093</cbc:CompanyID>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>FC</cbc:ID>
|
||||
<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>
|
||||
@@ -102,9 +107,9 @@
|
||||
</cac:AccountingSupplierParty>
|
||||
<cac:AccountingCustomerParty>
|
||||
<cac:Party>
|
||||
<cbc:EndpointID schemeID="EM">Buyer electronic address</cbc:EndpointID>
|
||||
<cbc:EndpointID schemeID="DE:SMTP">Buyer electronic address</cbc:EndpointID>
|
||||
<cac:PartyIdentification>
|
||||
<cbc:ID schemeID="0190">Buyer identifier</cbc:ID>
|
||||
<cbc:ID>0190:Buyer identifier</cbc:ID>
|
||||
</cac:PartyIdentification>
|
||||
<cac:PartyName>
|
||||
<cbc:Name>Buyer trading name</cbc:Name>
|
||||
@@ -130,7 +135,7 @@
|
||||
</cac:PartyTaxScheme>
|
||||
<cac:PartyLegalEntity>
|
||||
<cbc:RegistrationName>Buyer name</cbc:RegistrationName>
|
||||
<cbc:CompanyID schemeID="0089">Buyer legal registration identifier</cbc:CompanyID>
|
||||
<cbc:CompanyID>Buyer legal registration identifier</cbc:CompanyID>
|
||||
</cac:PartyLegalEntity>
|
||||
<cac:Contact>
|
||||
<cbc:Name>Buyer contact point</cbc:Name>
|
||||
@@ -146,6 +151,9 @@
|
||||
<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>
|
||||
@@ -195,19 +203,48 @@
|
||||
</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>95</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReasonCode>55</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Doc allowance reason text</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.00</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
<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</cbc:Percent>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
@@ -217,37 +254,40 @@
|
||||
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>AAA</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Doc charge reason text</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.00</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
<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</cbc:Percent>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
</cac:TaxCategory>
|
||||
</cac:AllowanceCharge>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="EUR">50</cbc:TaxAmount>
|
||||
<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</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">50</cbc:TaxAmount>
|
||||
<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</cbc:Percent>
|
||||
<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</cbc:TaxableAmount>
|
||||
<cbc:TaxAmount currencyID="EUR">0</cbc:TaxAmount>
|
||||
<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</cbc:Percent>
|
||||
<cbc:TaxExemptionReasonCode>VATEX-EU-O</cbc:TaxExemptionReasonCode>
|
||||
<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>
|
||||
@@ -255,23 +295,19 @@
|
||||
</cac:TaxCategory>
|
||||
</cac:TaxSubtotal>
|
||||
</cac:TaxTotal>
|
||||
<cac:TaxTotal>
|
||||
<cbc:TaxAmount currencyID="NOK">46</cbc:TaxAmount>
|
||||
</cac:TaxTotal>
|
||||
<cac:LegalMonetaryTotal>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">200</cbc:LineExtensionAmount>
|
||||
<cbc:TaxExclusiveAmount currencyID="EUR">200</cbc:TaxExclusiveAmount>
|
||||
<cbc:TaxInclusiveAmount currencyID="EUR">205</cbc:TaxInclusiveAmount>
|
||||
<cbc:AllowanceTotalAmount currencyID="EUR">10</cbc:AllowanceTotalAmount>
|
||||
<cbc:ChargeTotalAmount currencyID="EUR">10</cbc:ChargeTotalAmount>
|
||||
<cbc:PrepaidAmount currencyID="EUR">0</cbc:PrepaidAmount>
|
||||
<cbc:PayableAmount currencyID="EUR">205</cbc:PayableAmount>
|
||||
<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</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1000</cbc:LineExtensionAmount>
|
||||
<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>
|
||||
@@ -281,14 +317,14 @@
|
||||
<cbc:LineID>12345</cbc:LineID>
|
||||
</cac:OrderLineReference>
|
||||
<cac:DocumentReference>
|
||||
<cbc:ID>Line object identifier</cbc:ID>
|
||||
<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>95</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReasonCode>55</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Invoice line allowance reason</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.00</cbc:MultiplierFactorNumeric>
|
||||
<cbc:MultiplierFactorNumeric>1</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
</cac:AllowanceCharge>
|
||||
@@ -296,7 +332,7 @@
|
||||
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
|
||||
<cbc:AllowanceChargeReasonCode>AAA</cbc:AllowanceChargeReasonCode>
|
||||
<cbc:AllowanceChargeReason>Invoice line charge reason</cbc:AllowanceChargeReason>
|
||||
<cbc:MultiplierFactorNumeric>1.00</cbc:MultiplierFactorNumeric>
|
||||
<cbc:MultiplierFactorNumeric>1</cbc:MultiplierFactorNumeric>
|
||||
<cbc:Amount currencyID="EUR">10</cbc:Amount>
|
||||
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
|
||||
</cac:AllowanceCharge>
|
||||
@@ -310,7 +346,7 @@
|
||||
<cbc:ID>Item seller's identifier</cbc:ID>
|
||||
</cac:SellersItemIdentification>
|
||||
<cac:StandardItemIdentification>
|
||||
<cbc:ID schemeID="0060">Item standar identifier</cbc:ID>
|
||||
<cbc:ID>Item standar identifier</cbc:ID>
|
||||
</cac:StandardItemIdentification>
|
||||
<cac:OriginCountry>
|
||||
<cbc:IdentificationCode>IT</cbc:IdentificationCode>
|
||||
@@ -320,7 +356,7 @@
|
||||
</cac:CommodityClassification>
|
||||
<cac:ClassifiedTaxCategory>
|
||||
<cbc:ID>S</cbc:ID>
|
||||
<cbc:Percent>5</cbc:Percent>
|
||||
<cbc:Percent>5.00</cbc:Percent>
|
||||
<cac:TaxScheme>
|
||||
<cbc:ID>VAT</cbc:ID>
|
||||
</cac:TaxScheme>
|
||||
@@ -335,8 +371,8 @@
|
||||
</cac:AdditionalItemProperty>
|
||||
</cac:Item>
|
||||
<cac:Price>
|
||||
<cbc:PriceAmount currencyID="EUR">10</cbc:PriceAmount>
|
||||
<cbc:BaseQuantity unitCode="EA">1</cbc:BaseQuantity>
|
||||
<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>
|
||||
@@ -346,20 +382,20 @@
|
||||
</cac:InvoiceLine>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1b</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">1000</cbc:LineExtensionAmount>
|
||||
<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</cbc:Percent>
|
||||
<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</cbc:PriceAmount>
|
||||
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
|
||||
</cac:Price>
|
||||
</cac:InvoiceLine>
|
||||
</Invoice>
|
||||
</Invoice>
|
||||
|
||||
@@ -1,349 +0,0 @@
|
||||
<?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: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">200.00</cbc:LineExtensionAmount>
|
||||
<cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
|
||||
<cbc:TaxInclusiveAmount currencyID="EUR">205.00</cbc:TaxInclusiveAmount>
|
||||
<cbc:PayableAmount currencyID="EUR">205.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: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:Price>
|
||||
</cac:InvoiceLine>
|
||||
<cac:InvoiceLine>
|
||||
<cbc:ID>1b</cbc:ID>
|
||||
<cbc:InvoicedQuantity unitCode="EA">10.00000000</cbc:InvoicedQuantity>
|
||||
<cbc:LineExtensionAmount currencyID="EUR">100.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>
|
||||
Reference in New Issue
Block a user