closes #190
This commit is contained in:
@@ -51,6 +51,7 @@ switch
|
|||||||
- contacts also for recipients
|
- contacts also for recipients
|
||||||
- absolute and relative allowances and charges on item and document level #135,
|
- absolute and relative allowances and charges on item and document level #135,
|
||||||
- support contact fax numbers
|
- support contact fax numbers
|
||||||
|
- closes #190 BOM not treated correctly on XML input file
|
||||||
|
|
||||||
### 2.0 still todo
|
### 2.0 still todo
|
||||||
- dont show empty tax number field
|
- dont show empty tax number field
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
package org.mustangproject;
|
package org.mustangproject;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
public class XMLTools {
|
import org.dom4j.io.XMLWriter;
|
||||||
|
import org.mustangproject.ZUGFeRD.ZUGFeRD2PullProvider;
|
||||||
|
|
||||||
|
public class XMLTools extends XMLWriter {
|
||||||
|
public String escapeAttributeEntities(String s) {
|
||||||
|
return super.escapeAttributeEntities(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String escapeElementEntities(String s) {
|
||||||
|
return super.escapeElementEntities(s);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String nDigitFormat(BigDecimal value, int scale) {
|
public static String nDigitFormat(BigDecimal value, int scale) {
|
||||||
@@ -28,42 +44,98 @@ public class XMLTools {
|
|||||||
|
|
||||||
|
|
||||||
public static String encodeXML(CharSequence s) {
|
public static String encodeXML(CharSequence s) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
int len = s.length();
|
int len = s.length();
|
||||||
for (int i=0;i<len;i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
int c = s.charAt(i);
|
int c = s.charAt(i);
|
||||||
if (c >= 0xd800 && c <= 0xdbff && i + 1 < len) {
|
if (c >= 0xd800 && c <= 0xdbff && i + 1 < len) {
|
||||||
c = ((c-0xd7c0)<<10) | (s.charAt(++i)&0x3ff); // UTF16 decode
|
c = ((c - 0xd7c0) << 10) | (s.charAt(++i) & 0x3ff); // UTF16 decode
|
||||||
}
|
}
|
||||||
if (c < 0x80) { // ASCII range: test most common case first
|
if (c < 0x80) { // ASCII range: test most common case first
|
||||||
if (c < 0x20 && (c != '\t' && c != '\r' && c != '\n')) {
|
if (c < 0x20 && (c != '\t' && c != '\r' && c != '\n')) {
|
||||||
// Illegal XML character, even encoded. Skip or substitute
|
// Illegal XML character, even encoded. Skip or substitute
|
||||||
sb.append("�"); // Unicode replacement character
|
sb.append("�"); // Unicode replacement character
|
||||||
} else {
|
} else {
|
||||||
switch(c) {
|
switch (c) {
|
||||||
case '&': sb.append("&"); break;
|
case '&':
|
||||||
case '>': sb.append(">"); break;
|
sb.append("&");
|
||||||
case '<': sb.append("<"); break;
|
break;
|
||||||
// Uncomment next two if encoding for an XML attribute
|
case '>':
|
||||||
|
sb.append(">");
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
sb.append("<");
|
||||||
|
break;
|
||||||
|
// Uncomment next two if encoding for an XML attribute
|
||||||
// case '\'' sb.append("'"); break;
|
// case '\'' sb.append("'"); break;
|
||||||
// case '\"' sb.append("""); break;
|
// case '\"' sb.append("""); break;
|
||||||
// Uncomment next three if you prefer, but not required
|
// Uncomment next three if you prefer, but not required
|
||||||
// case '\n' sb.append(" "); break;
|
// case '\n' sb.append(" "); break;
|
||||||
// case '\r' sb.append(" "); break;
|
// case '\r' sb.append(" "); break;
|
||||||
// case '\t' sb.append("	"); break;
|
// case '\t' sb.append("	"); break;
|
||||||
|
|
||||||
default: sb.append((char)c);
|
default:
|
||||||
}
|
sb.append((char) c);
|
||||||
}
|
}
|
||||||
} else if ((c >= 0xd800 && c <= 0xdfff) || c == 0xfffe || c == 0xffff) {
|
}
|
||||||
// Illegal XML character, even encoded. Skip or substitute
|
} else if ((c >= 0xd800 && c <= 0xdfff) || c == 0xfffe || c == 0xffff) {
|
||||||
sb.append("�"); // Unicode replacement character
|
// Illegal XML character, even encoded. Skip or substitute
|
||||||
} else {
|
sb.append("�"); // Unicode replacement character
|
||||||
sb.append("&#x");
|
} else {
|
||||||
sb.append(Integer.toHexString(c));
|
sb.append("&#x");
|
||||||
sb.append(';');
|
sb.append(Integer.toHexString(c));
|
||||||
}
|
sb.append(';');
|
||||||
}
|
}
|
||||||
return sb.toString();
|
}
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Byte Order Mark size and thus allows to skips over a BOM
|
||||||
|
* at the beginning of the given ByteArrayInputStream, if one exists.
|
||||||
|
*
|
||||||
|
* @param is the ByteArrayInputStream used
|
||||||
|
* @throws IOException if can not be read from is
|
||||||
|
* @see <a href="https://www.w3.org/TR/xml/#sec-guessing">Autodetection of Character Encodings</a>
|
||||||
|
*/
|
||||||
|
public static int guessBOMSize(ByteArrayInputStream is) throws IOException {
|
||||||
|
byte[] pad = new byte[4];
|
||||||
|
is.read(pad);
|
||||||
|
is.reset();
|
||||||
|
int test2 = ((pad[0] & 0xFF) << 8) | (pad[1] & 0xFF);
|
||||||
|
int test3 = ((test2 & 0xFFFF) << 8) | (pad[2] & 0xFF);
|
||||||
|
int test4 = ((test3 & 0xFFFFFF) << 8) | (pad[3] & 0xFF);
|
||||||
|
//
|
||||||
|
if (test4 == 0x0000FEFF || test4 == 0xFFFE0000 || test4 == 0x0000FFFE || test4 == 0xFEFF0000) {
|
||||||
|
// UCS-4: BOM takes 4 bytes
|
||||||
|
return 4;
|
||||||
|
} else if (test3 == 0xEFBBFF) {
|
||||||
|
// UTF-8: BOM takes 3 bytes
|
||||||
|
return 3;
|
||||||
|
} else if (test2 == 0xFEFF || test2 == 0xFFFE) {
|
||||||
|
// UTF-16: BOM takes 2 bytes
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* removes utf8 byte order marks from byte arrays, in case one is there
|
||||||
|
* @param zugferdRaw
|
||||||
|
* @return the byte array without bom
|
||||||
|
*/
|
||||||
|
public static byte[] removeBOM(byte[] zugferdRaw) {
|
||||||
|
byte[] zugferdData;
|
||||||
|
if ((zugferdRaw[0] == (byte) 0xEF) && (zugferdRaw[1] == (byte) 0xBB) && (zugferdRaw[2] == (byte) 0xBF)) {
|
||||||
|
// I don't like BOMs, lets remove it
|
||||||
|
zugferdData = new byte[zugferdRaw.length - 3];
|
||||||
|
System.arraycopy(zugferdRaw, 3, zugferdData, 0, zugferdRaw.length - 3);
|
||||||
|
} else {
|
||||||
|
zugferdData = zugferdRaw;
|
||||||
|
}
|
||||||
|
return zugferdData;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
/** **********************************************************************
|
/**
|
||||||
*
|
* *********************************************************************
|
||||||
|
* <p>
|
||||||
* Copyright 2018 Jochen Staerk
|
* Copyright 2018 Jochen Staerk
|
||||||
*
|
* <p>
|
||||||
* Use is subject to license terms.
|
* Use is subject to license terms.
|
||||||
*
|
* <p>
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
* use this file except in compliance with the License. You may obtain a copy
|
* use this file except in compliance with the License. You may obtain a copy
|
||||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
*
|
* <p>
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*
|
* <p>
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*
|
* <p>
|
||||||
*********************************************************************** */
|
* **********************************************************************
|
||||||
|
*/
|
||||||
package org.mustangproject.ZUGFeRD;
|
package org.mustangproject.ZUGFeRD;
|
||||||
|
|
||||||
import org.dom4j.Document;
|
import org.dom4j.Document;
|
||||||
@@ -43,7 +45,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
protected byte[] zugferdData;
|
protected byte[] zugferdData;
|
||||||
private String paymentTermsDescription;
|
private String paymentTermsDescription;
|
||||||
SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd");
|
SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd");
|
||||||
protected Profile profile=Profiles.getByName("COMFORT",1);
|
protected Profile profile = Profiles.getByName("COMFORT", 1);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -52,6 +54,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
@Override
|
@Override
|
||||||
public void setTest() {
|
public void setTest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String vatFormat(BigDecimal value) {
|
private String vatFormat(BigDecimal value) {
|
||||||
return XMLTools.nDigitFormat(value, 2);
|
return XMLTools.nDigitFormat(value, 2);
|
||||||
}
|
}
|
||||||
@@ -104,19 +107,19 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
@Override
|
@Override
|
||||||
public void generateXML(IExportableTransaction trans) {
|
public void generateXML(IExportableTransaction trans) {
|
||||||
this.trans = trans;
|
this.trans = trans;
|
||||||
this.calc=new TransactionCalculator(trans);
|
this.calc = new TransactionCalculator(trans);
|
||||||
|
|
||||||
boolean hasDueDate=false;
|
boolean hasDueDate = false;
|
||||||
SimpleDateFormat germanDateFormat = new SimpleDateFormat("dd.MM.yyyy");
|
SimpleDateFormat germanDateFormat = new SimpleDateFormat("dd.MM.yyyy");
|
||||||
String exemptionReason="";
|
String exemptionReason = "";
|
||||||
|
|
||||||
if (trans.getPaymentTermDescription()!=null) {
|
if (trans.getPaymentTermDescription() != null) {
|
||||||
paymentTermsDescription=trans.getPaymentTermDescription();
|
paymentTermsDescription = trans.getPaymentTermDescription();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paymentTermsDescription==null) {
|
if (paymentTermsDescription == null) {
|
||||||
paymentTermsDescription= "Zahlbar ohne Abzug bis " + germanDateFormat.format(trans.getDueDate());
|
paymentTermsDescription = "Zahlbar ohne Abzug bis " + germanDateFormat.format(trans.getDueDate());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String senderReg = "";
|
String senderReg = "";
|
||||||
@@ -135,14 +138,14 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
}
|
}
|
||||||
|
|
||||||
String subjectNote = "";
|
String subjectNote = "";
|
||||||
if (trans.getSubjectNote()!=null) {
|
if (trans.getSubjectNote() != null) {
|
||||||
subjectNote = "<ram:IncludedNote>\n" + " <ram:Content>"
|
subjectNote = "<ram:IncludedNote>\n" + " <ram:Content>"
|
||||||
+ XMLTools.encodeXML(trans.getSubjectNote())+ "</ram:Content>\n"
|
+ XMLTools.encodeXML(trans.getSubjectNote()) + "</ram:Content>\n"
|
||||||
+ "</ram:IncludedNote>\n";
|
+ "</ram:IncludedNote>\n";
|
||||||
}
|
}
|
||||||
String typecode="380";
|
String typecode = "380";
|
||||||
if (trans.getDocumentCode()!=null) {
|
if (trans.getDocumentCode() != null) {
|
||||||
typecode=trans.getDocumentCode();
|
typecode = trans.getDocumentCode();
|
||||||
}
|
}
|
||||||
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||||
|
|
||||||
@@ -163,12 +166,12 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
+ " <rsm:HeaderExchangedDocument>\n"
|
+ " <rsm:HeaderExchangedDocument>\n"
|
||||||
+ " <ram:ID>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:ID>\n" //$NON-NLS-2$
|
+ " <ram:ID>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:ID>\n" //$NON-NLS-2$
|
||||||
+ " <ram:Name>RECHNUNG</ram:Name>\n"
|
+ " <ram:Name>RECHNUNG</ram:Name>\n"
|
||||||
+ " <ram:TypeCode>"+typecode+"</ram:TypeCode>\n"
|
+ " <ram:TypeCode>" + typecode + "</ram:TypeCode>\n"
|
||||||
+ " <ram:IssueDateTime><udt:DateTimeString format=\"102\">"
|
+ " <ram:IssueDateTime><udt:DateTimeString format=\"102\">"
|
||||||
+ zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" // date
|
+ zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" // date
|
||||||
// format
|
// format
|
||||||
// was
|
// was
|
||||||
// 20130605
|
// 20130605
|
||||||
+ subjectNote
|
+ subjectNote
|
||||||
+ rebateAgreement
|
+ rebateAgreement
|
||||||
+ senderReg
|
+ senderReg
|
||||||
@@ -181,14 +184,14 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
|
|
||||||
}
|
}
|
||||||
xml = xml + " <ram:SellerTradeParty>\n";
|
xml = xml + " <ram:SellerTradeParty>\n";
|
||||||
xml+= getTradePartyAsXML(trans.getSender(), true);
|
xml += getTradePartyAsXML(trans.getSender(), true);
|
||||||
xml+= " </ram:SellerTradeParty>\n"
|
xml += " </ram:SellerTradeParty>\n"
|
||||||
+ " <ram:BuyerTradeParty>\n";
|
+ " <ram:BuyerTradeParty>\n";
|
||||||
// + " <ID>GE2020211</ID>\n"
|
// + " <ID>GE2020211</ID>\n"
|
||||||
// + " <GlobalID schemeID=\"0088\">4000001987658</GlobalID>\n"
|
// + " <GlobalID schemeID=\"0088\">4000001987658</GlobalID>\n"
|
||||||
|
|
||||||
xml+= getTradePartyAsXML(trans.getRecipient(), false);
|
xml += getTradePartyAsXML(trans.getRecipient(), false);
|
||||||
if ((trans.getOwnVATID()!=null)&&(trans.getOwnOrganisationName()!=null)) {
|
if ((trans.getOwnVATID() != null) && (trans.getOwnOrganisationName() != null)) {
|
||||||
xml = xml + " <ram:SpecifiedTaxRegistration>\n" + " <ram:ID schemeID=\"VA\">"
|
xml = xml + " <ram:SpecifiedTaxRegistration>\n" + " <ram:ID schemeID=\"VA\">"
|
||||||
+ XMLTools.encodeXML(trans.getOwnVATID()) + "</ram:ID>\n"
|
+ XMLTools.encodeXML(trans.getOwnVATID()) + "</ram:ID>\n"
|
||||||
+ " </ram:SpecifiedTaxRegistration>";
|
+ " </ram:SpecifiedTaxRegistration>";
|
||||||
@@ -196,21 +199,21 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
|
|
||||||
xml += " </ram:BuyerTradeParty>\n";
|
xml += " </ram:BuyerTradeParty>\n";
|
||||||
|
|
||||||
if (trans.getBuyerOrderReferencedDocumentID()!=null) {
|
if (trans.getBuyerOrderReferencedDocumentID() != null) {
|
||||||
xml = xml + " <ram:BuyerOrderReferencedDocument>\n"
|
xml = xml + " <ram:BuyerOrderReferencedDocument>\n"
|
||||||
+ " <ram:IssuerAssignedID>"
|
+ " <ram:IssuerAssignedID>"
|
||||||
+ XMLTools.encodeXML(trans.getBuyerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>\n"
|
+ XMLTools.encodeXML(trans.getBuyerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>\n"
|
||||||
+ " </ram:BuyerOrderReferencedDocument>\n";
|
+ " </ram:BuyerOrderReferencedDocument>\n";
|
||||||
}
|
}
|
||||||
xml = xml + " </ram:ApplicableSupplyChainTradeAgreement>\n"
|
xml = xml + " </ram:ApplicableSupplyChainTradeAgreement>\n"
|
||||||
+ " <ram:ApplicableSupplyChainTradeDelivery>\n" ;
|
+ " <ram:ApplicableSupplyChainTradeDelivery>\n";
|
||||||
if (this.trans.getDeliveryAddress()!=null) {
|
if (this.trans.getDeliveryAddress() != null) {
|
||||||
xml += "<ram:ShipToTradeParty>"+
|
xml += "<ram:ShipToTradeParty>" +
|
||||||
getTradePartyAsXML(this.trans.getDeliveryAddress(), false)+
|
getTradePartyAsXML(this.trans.getDeliveryAddress(), false) +
|
||||||
"</ram:ShipToTradeParty>";
|
"</ram:ShipToTradeParty>";
|
||||||
}
|
}
|
||||||
|
|
||||||
xml+= " <ram:ActualDeliverySupplyChainEvent>\n"
|
xml += " <ram:ActualDeliverySupplyChainEvent>\n"
|
||||||
+ " <ram:OccurrenceDateTime>";
|
+ " <ram:OccurrenceDateTime>";
|
||||||
|
|
||||||
if (trans.getDeliveryDate() != null) {
|
if (trans.getDeliveryDate() != null) {
|
||||||
@@ -231,21 +234,21 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
+ " <ram:PaymentReference>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:PaymentReference>\n" //$NON-NLS-2$
|
+ " <ram:PaymentReference>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:PaymentReference>\n" //$NON-NLS-2$
|
||||||
+ " <ram:InvoiceCurrencyCode>" + trans.getCurrency() + "</ram:InvoiceCurrencyCode>\n";
|
+ " <ram:InvoiceCurrencyCode>" + trans.getCurrency() + "</ram:InvoiceCurrencyCode>\n";
|
||||||
|
|
||||||
if (trans.getTradeSettlementPayment()!=null) {
|
if (trans.getTradeSettlementPayment() != null) {
|
||||||
for (IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) {
|
for (IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) {
|
||||||
if(payment!=null) {
|
if (payment != null) {
|
||||||
hasDueDate=true;
|
hasDueDate = true;
|
||||||
xml+=payment.getSettlementXML();
|
xml += payment.getSettlementXML();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (trans.getTradeSettlement()!=null) {
|
if (trans.getTradeSettlement() != null) {
|
||||||
for (IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
|
for (IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
|
||||||
if(payment!=null) {
|
if (payment != null) {
|
||||||
if (payment instanceof IZUGFeRDTradeSettlementPayment) {
|
if (payment instanceof IZUGFeRDTradeSettlementPayment) {
|
||||||
hasDueDate=true;
|
hasDueDate = true;
|
||||||
}
|
}
|
||||||
xml+=payment.getSettlementXML();
|
xml += payment.getSettlementXML();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,7 +263,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
+ " <ram:TypeCode>VAT</ram:TypeCode>\n"
|
+ " <ram:TypeCode>VAT</ram:TypeCode>\n"
|
||||||
+ exemptionReason
|
+ exemptionReason
|
||||||
+ " <ram:BasisAmount currencyID=\"" + trans.getCurrency() + "\">" + currencyFormat(amount.getBasis()) + "</ram:BasisAmount>\n" // currencyID=\"EUR\"
|
+ " <ram:BasisAmount currencyID=\"" + trans.getCurrency() + "\">" + currencyFormat(amount.getBasis()) + "</ram:BasisAmount>\n" // currencyID=\"EUR\"
|
||||||
+ " <ram:CategoryCode>"+amount.getCategoryCode()+"</ram:CategoryCode>\n"
|
+ " <ram:CategoryCode>" + amount.getCategoryCode() + "</ram:CategoryCode>\n"
|
||||||
+ " <ram:ApplicablePercent>" + vatFormat(currentTaxPercent)
|
+ " <ram:ApplicablePercent>" + vatFormat(currentTaxPercent)
|
||||||
+ "</ram:ApplicablePercent>\n" + " </ram:ApplicableTradeTax>\n"; //$NON-NLS-2$
|
+ "</ram:ApplicablePercent>\n" + " </ram:ApplicableTradeTax>\n"; //$NON-NLS-2$
|
||||||
|
|
||||||
@@ -279,7 +282,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasDueDate && (trans.getDueDate()!=null)) {
|
if (hasDueDate && (trans.getDueDate() != null)) {
|
||||||
xml = xml + " <ram:DueDateDateTime><udt:DateTimeString format=\"102\">" // $NON-NLS-2$
|
xml = xml + " <ram:DueDateDateTime><udt:DateTimeString format=\"102\">" // $NON-NLS-2$
|
||||||
+ zugferdDateFormat.format(trans.getDueDate())
|
+ zugferdDateFormat.format(trans.getDueDate())
|
||||||
+ "</udt:DateTimeString></ram:DueDateDateTime>\n";// 20130704
|
+ "</udt:DateTimeString></ram:DueDateDateTime>\n";// 20130704
|
||||||
@@ -291,7 +294,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
}
|
}
|
||||||
|
|
||||||
xml = xml + " <ram:SpecifiedTradeSettlementMonetarySummation>\n"
|
xml = xml + " <ram:SpecifiedTradeSettlementMonetarySummation>\n"
|
||||||
+ " <ram:LineTotalAmount currencyID=\""+trans.getCurrency()+"\">" + currencyFormat(calc.getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-2$
|
+ " <ram:LineTotalAmount currencyID=\"" + trans.getCurrency() + "\">" + currencyFormat(calc.getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-2$
|
||||||
// currencyID=\"EUR\"
|
// currencyID=\"EUR\"
|
||||||
+ " <ram:ChargeTotalAmount currencyID=\"" + trans.getCurrency() + "\">0.00</ram:ChargeTotalAmount>\n" // currencyID=\"EUR\"
|
+ " <ram:ChargeTotalAmount currencyID=\"" + trans.getCurrency() + "\">0.00</ram:ChargeTotalAmount>\n" // currencyID=\"EUR\"
|
||||||
+ " <ram:AllowanceTotalAmount currencyID=\"" + trans.getCurrency() + "\">0.00</ram:AllowanceTotalAmount>\n" //
|
+ " <ram:AllowanceTotalAmount currencyID=\"" + trans.getCurrency() + "\">0.00</ram:AllowanceTotalAmount>\n" //
|
||||||
@@ -317,8 +320,8 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
int lineID = 0;
|
int lineID = 0;
|
||||||
for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
|
for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
|
||||||
lineID++;
|
lineID++;
|
||||||
if (currentItem.getProduct().getTaxExemptionReason() != null) {
|
if (currentItem.getProduct().getTaxExemptionReason() != null) {
|
||||||
exemptionReason="<ram:ExemptionReason>" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + "</ram:ExemptionReason>";
|
exemptionReason = "<ram:ExemptionReason>" + XMLTools.encodeXML(currentItem.getProduct().getTaxExemptionReason()) + "</ram:ExemptionReason>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -329,10 +332,10 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
+ " </ram:AssociatedDocumentLineDocument>\n"
|
+ " </ram:AssociatedDocumentLineDocument>\n"
|
||||||
+ " <ram:SpecifiedSupplyChainTradeAgreement>\n"
|
+ " <ram:SpecifiedSupplyChainTradeAgreement>\n"
|
||||||
+ " <ram:GrossPriceProductTradePrice>\n"
|
+ " <ram:GrossPriceProductTradePrice>\n"
|
||||||
+ " <ram:ChargeAmount currencyID=\""+trans.getCurrency()+"\">" + priceFormat(lc.getPriceGross())
|
+ " <ram:ChargeAmount currencyID=\"" + trans.getCurrency() + "\">" + priceFormat(lc.getPriceGross())
|
||||||
+ "</ram:ChargeAmount>\n"
|
+ "</ram:ChargeAmount>\n"
|
||||||
+ " <ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit())
|
+ " <ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit())
|
||||||
+ "\">" + quantityFormat(currentItem.getBasisQuantity()) +"</ram:BasisQuantity>\n"
|
+ "\">" + quantityFormat(currentItem.getBasisQuantity()) + "</ram:BasisQuantity>\n"
|
||||||
// + " <AppliedTradeAllowanceCharge>\n"
|
// + " <AppliedTradeAllowanceCharge>\n"
|
||||||
// + " <ChargeIndicator>false</ChargeIndicator>\n"
|
// + " <ChargeIndicator>false</ChargeIndicator>\n"
|
||||||
// + " <ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>\n"
|
// + " <ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>\n"
|
||||||
@@ -340,10 +343,10 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
// + " </AppliedTradeAllowanceCharge>\n"
|
// + " </AppliedTradeAllowanceCharge>\n"
|
||||||
+ " </ram:GrossPriceProductTradePrice>\n"
|
+ " </ram:GrossPriceProductTradePrice>\n"
|
||||||
+ " <ram:NetPriceProductTradePrice>\n"
|
+ " <ram:NetPriceProductTradePrice>\n"
|
||||||
+ " <ram:ChargeAmount currencyID=\""+trans.getCurrency()+"\">" + priceFormat(currentItem.getPrice())
|
+ " <ram:ChargeAmount currencyID=\"" + trans.getCurrency() + "\">" + priceFormat(currentItem.getPrice())
|
||||||
+ "</ram:ChargeAmount>\n"
|
+ "</ram:ChargeAmount>\n"
|
||||||
+ " <ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit())
|
+ " <ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit())
|
||||||
+ "\">" + quantityFormat(currentItem.getBasisQuantity()) +"</ram:BasisQuantity>\n"
|
+ "\">" + quantityFormat(currentItem.getBasisQuantity()) + "</ram:BasisQuantity>\n"
|
||||||
+ " </ram:NetPriceProductTradePrice>\n"
|
+ " </ram:NetPriceProductTradePrice>\n"
|
||||||
+ " </ram:SpecifiedSupplyChainTradeAgreement>\n"
|
+ " </ram:SpecifiedSupplyChainTradeAgreement>\n"
|
||||||
|
|
||||||
@@ -356,21 +359,21 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
+ " <ram:ApplicableTradeTax>\n"
|
+ " <ram:ApplicableTradeTax>\n"
|
||||||
+ " <ram:TypeCode>VAT</ram:TypeCode>\n"
|
+ " <ram:TypeCode>VAT</ram:TypeCode>\n"
|
||||||
+ exemptionReason
|
+ exemptionReason
|
||||||
+ " <ram:CategoryCode>"+currentItem.getProduct().getTaxCategoryCode()+"</ram:CategoryCode>\n"
|
+ " <ram:CategoryCode>" + currentItem.getProduct().getTaxCategoryCode() + "</ram:CategoryCode>\n"
|
||||||
|
|
||||||
+ " <ram:ApplicablePercent>"
|
+ " <ram:ApplicablePercent>"
|
||||||
+ vatFormat(currentItem.getProduct().getVATPercent()) + "</ram:ApplicablePercent>\n"
|
+ vatFormat(currentItem.getProduct().getVATPercent()) + "</ram:ApplicablePercent>\n"
|
||||||
+ " </ram:ApplicableTradeTax>\n"
|
+ " </ram:ApplicableTradeTax>\n"
|
||||||
+ " <ram:SpecifiedTradeSettlementMonetarySummation>\n"
|
+ " <ram:SpecifiedTradeSettlementMonetarySummation>\n"
|
||||||
+ " <ram:LineTotalAmount currencyID=\""+trans.getCurrency()+"\">" + currencyFormat(lc.getItemTotalNetAmount())
|
+ " <ram:LineTotalAmount currencyID=\"" + trans.getCurrency() + "\">" + currencyFormat(lc.getItemTotalNetAmount())
|
||||||
+ "</ram:LineTotalAmount>\n"
|
+ "</ram:LineTotalAmount>\n"
|
||||||
+ " </ram:SpecifiedTradeSettlementMonetarySummation>\n";
|
+ " </ram:SpecifiedTradeSettlementMonetarySummation>\n";
|
||||||
if (currentItem.getAdditionalReferencedDocumentID()!=null) {
|
if (currentItem.getAdditionalReferencedDocumentID() != null) {
|
||||||
xml=xml + " <ram:AdditionalReferencedDocument><ram:ID>"+currentItem.getAdditionalReferencedDocumentID()+"</ram:ID><ram:TypeCode>130</ram:TypeCode></ram:AdditionalReferencedDocument>\n";
|
xml = xml + " <ram:AdditionalReferencedDocument><ram:ID>" + currentItem.getAdditionalReferencedDocumentID() + "</ram:ID><ram:TypeCode>130</ram:TypeCode></ram:AdditionalReferencedDocument>\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
xml=xml + " </ram:SpecifiedSupplyChainTradeSettlement>\n"
|
xml = xml + " </ram:SpecifiedSupplyChainTradeSettlement>\n"
|
||||||
+ " <ram:SpecifiedTradeProduct>\n";
|
+ " <ram:SpecifiedTradeProduct>\n";
|
||||||
// + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n"
|
// + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n"
|
||||||
if (currentItem.getProduct().getSellerAssignedID() != null) {
|
if (currentItem.getProduct().getSellerAssignedID() != null) {
|
||||||
xml = xml + " <ram:SellerAssignedID>"
|
xml = xml + " <ram:SellerAssignedID>"
|
||||||
@@ -404,14 +407,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
byte[] zugferdRaw;
|
byte[] zugferdRaw;
|
||||||
try {
|
try {
|
||||||
zugferdRaw = xml.getBytes("UTF-8");
|
zugferdRaw = xml.getBytes("UTF-8");
|
||||||
|
zugferdData = XMLTools.removeBOM(zugferdRaw);
|
||||||
if ((zugferdRaw[0] == (byte) 0xEF) && (zugferdRaw[1] == (byte) 0xBB) && (zugferdRaw[2] == (byte) 0xBF)) {
|
|
||||||
// I don't like BOMs, lets remove it
|
|
||||||
zugferdData = new byte[zugferdRaw.length - 3];
|
|
||||||
System.arraycopy(zugferdRaw, 3, zugferdData, 0, zugferdRaw.length - 3);
|
|
||||||
} else {
|
|
||||||
zugferdData = zugferdRaw;
|
|
||||||
}
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
Logger.getLogger(ZUGFeRD1PullProvider.class.getName()).log(Level.SEVERE, null, e);
|
Logger.getLogger(ZUGFeRD1PullProvider.class.getName()).log(Level.SEVERE, null, e);
|
||||||
}
|
}
|
||||||
@@ -419,7 +415,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setProfile(Profile p) {
|
public void setProfile(Profile p) {
|
||||||
profile=p;
|
profile = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String buildPaymentTermsXml() {
|
private String buildPaymentTermsXml() {
|
||||||
@@ -453,7 +449,7 @@ public class ZUGFeRD1PullProvider extends ZUGFeRD2PullProvider implements IXMLPr
|
|||||||
paymentTermsXml += "<ram:BasisDateTime>";
|
paymentTermsXml += "<ram:BasisDateTime>";
|
||||||
paymentTermsXml += "<udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(baseDate) + "</udt:DateTimeString>";
|
paymentTermsXml += "<udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(baseDate) + "</udt:DateTimeString>";
|
||||||
paymentTermsXml += "</ram:BasisDateTime>";
|
paymentTermsXml += "</ram:BasisDateTime>";
|
||||||
|
|
||||||
paymentTermsXml += "<ram:BasisPeriodMeasure unitCode=\"" + discountTerms.getBasePeriodUnitCode() + "\">"
|
paymentTermsXml += "<ram:BasisPeriodMeasure unitCode=\"" + discountTerms.getBasePeriodUnitCode() + "\">"
|
||||||
+ discountTerms.getBasePeriodMeasure() + "</ram:BasisPeriodMeasure>";
|
+ discountTerms.getBasePeriodMeasure() + "</ram:BasisPeriodMeasure>";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -615,13 +615,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
|
|||||||
try {
|
try {
|
||||||
zugferdRaw = xml.getBytes("UTF-8");
|
zugferdRaw = xml.getBytes("UTF-8");
|
||||||
|
|
||||||
if ((zugferdRaw[0] == (byte) 0xEF) && (zugferdRaw[1] == (byte) 0xBB) && (zugferdRaw[2] == (byte) 0xBF)) {
|
zugferdData=XMLTools.removeBOM(zugferdRaw);
|
||||||
// I don't like BOMs, lets remove it
|
|
||||||
zugferdData = new byte[zugferdRaw.length - 3];
|
|
||||||
System.arraycopy(zugferdRaw, 3, zugferdData, 0, zugferdRaw.length - 3);
|
|
||||||
} else {
|
|
||||||
zugferdData = zugferdRaw;
|
|
||||||
}
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
Logger.getLogger(ZUGFeRD2PullProvider.class.getName()).log(Level.SEVERE, null, e);
|
Logger.getLogger(ZUGFeRD2PullProvider.class.getName()).log(Level.SEVERE, null, e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -161,8 +161,8 @@
|
|||||||
<!-- http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven
|
<!-- http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven
|
||||||
mvn clean compile assembly:single -->
|
mvn clean compile assembly:single -->
|
||||||
<!-- or whatever version you use -->
|
<!-- or whatever version you use -->
|
||||||
<source>1.7</source>
|
<source>8</source>
|
||||||
<target>1.7</target>
|
<target>8</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- /ZUV -->
|
<!-- /ZUV -->
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.mustangproject.validator;
|
package org.mustangproject.validator;
|
||||||
|
|
||||||
|
import org.mustangproject.XMLTools;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
package org.mustangproject.validator;
|
|
||||||
|
|
||||||
import org.dom4j.io.XMLWriter;
|
|
||||||
|
|
||||||
public class XMLTools extends XMLWriter {
|
|
||||||
public String escapeAttributeEntities(String s) {
|
|
||||||
return super.escapeAttributeEntities(s);
|
|
||||||
}
|
|
||||||
public String escapeElementEntities(String s) {
|
|
||||||
return super.escapeElementEntities(s);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -18,6 +18,7 @@ import javax.xml.xpath.XPathConstants;
|
|||||||
import javax.xml.xpath.XPathExpression;
|
import javax.xml.xpath.XPathExpression;
|
||||||
import javax.xml.xpath.XPathFactory;
|
import javax.xml.xpath.XPathFactory;
|
||||||
|
|
||||||
|
import org.mustangproject.XMLTools;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
@@ -61,7 +62,7 @@ public class XMLValidator extends Validator {
|
|||||||
// file existence must have been checked before
|
// file existence must have been checked before
|
||||||
|
|
||||||
try {
|
try {
|
||||||
zfXML = new String(Files.readAllBytes(Paths.get(name)));
|
zfXML = new String(XMLTools.removeBOM(Files.readAllBytes(Paths.get(name))));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|
||||||
ValidationResultItem vri = new ValidationResultItem(ESeverity.exception, e.getMessage()).setSection(9)
|
ValidationResultItem vri = new ValidationResultItem(ESeverity.exception, e.getMessage()).setSection(9)
|
||||||
@@ -112,8 +113,6 @@ public class XMLValidator extends Validator {
|
|||||||
failedRules = 0;
|
failedRules = 0;
|
||||||
|
|
||||||
|
|
||||||
ByteArrayInputStream xmlByteInputStream = new ByteArrayInputStream(zfXML.getBytes(StandardCharsets.UTF_8));
|
|
||||||
|
|
||||||
if (zfXML.isEmpty()) {
|
if (zfXML.isEmpty()) {
|
||||||
ValidationResultItem res = new ValidationResultItem(ESeverity.exception,
|
ValidationResultItem res = new ValidationResultItem(ESeverity.exception,
|
||||||
"XML data not found in " + filename
|
"XML data not found in " + filename
|
||||||
@@ -145,8 +144,8 @@ public class XMLValidator extends Validator {
|
|||||||
// document.getElementsByTagNameNS("*",...
|
// document.getElementsByTagNameNS("*",...
|
||||||
|
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
InputSource is = new InputSource(new StringReader(zfXML));
|
||||||
Document doc = db.parse(xmlByteInputStream);
|
Document doc = db.parse(is);
|
||||||
|
|
||||||
Element root = doc.getDocumentElement();
|
Element root = doc.getDocumentElement();
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
package org.mustangproject.validator;
|
package org.mustangproject.validator;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileInputStream;
|
import java.nio.file.Files;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
@@ -22,11 +18,13 @@ import org.dom4j.DocumentException;
|
|||||||
import org.dom4j.DocumentHelper;
|
import org.dom4j.DocumentHelper;
|
||||||
import org.dom4j.io.OutputFormat;
|
import org.dom4j.io.OutputFormat;
|
||||||
import org.dom4j.io.XMLWriter;
|
import org.dom4j.io.XMLWriter;
|
||||||
|
import org.mustangproject.XMLTools;
|
||||||
import org.riversun.bigdoc.bin.BigFileSearcher;
|
import org.riversun.bigdoc.bin.BigFileSearcher;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXParseException;
|
import org.xml.sax.SAXParseException;
|
||||||
|
|
||||||
//abstract class
|
//abstract class
|
||||||
@@ -165,8 +163,12 @@ public class ZUGFeRDValidator {
|
|||||||
|
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
|
||||||
Document doc = db.parse(file);
|
byte[] content=Files.readAllBytes(file.toPath());
|
||||||
|
content= XMLTools.removeBOM(content);
|
||||||
|
String s=new String(content);
|
||||||
|
InputSource is = new InputSource(new StringReader(s));
|
||||||
|
Document doc = db.parse(is);
|
||||||
|
|
||||||
Element root = doc.getDocumentElement();
|
Element root = doc.getDocumentElement();
|
||||||
isXML=true;//no exception so far
|
isXML=true;//no exception so far
|
||||||
@@ -176,6 +178,8 @@ public class ZUGFeRDValidator {
|
|||||||
// probably no xml file, sth like SAXParseException content not allowed in prolog
|
// probably no xml file, sth like SAXParseException content not allowed in prolog
|
||||||
// ignore isXML is already false
|
// ignore isXML is already false
|
||||||
// in the tests, this may error-out anyway
|
// in the tests, this may error-out anyway
|
||||||
|
//ex.printStackTrace();
|
||||||
|
|
||||||
}
|
}
|
||||||
if (isXML) {
|
if (isXML) {
|
||||||
pdfValidity = true;
|
pdfValidity = true;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?><!-- the document starts with an invisible utf8 byte order mark, which is valid-->
|
||||||
<rsm:CrossIndustryInvoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
<rsm:CrossIndustryInvoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100">
|
||||||
<rsm:ExchangedDocumentContext>
|
<rsm:ExchangedDocumentContext>
|
||||||
<ram:GuidelineSpecifiedDocumentContextParameter>
|
<ram:GuidelineSpecifiedDocumentContextParameter>
|
||||||
|
|||||||
Reference in New Issue
Block a user