support reference, seller DefinedTradeContact attributes

This commit is contained in:
Jochen Stärk
2019-06-09 15:51:51 +02:00
parent f5cabc5eae
commit d5122364dc
8 changed files with 318 additions and 177 deletions

View File

@@ -0,0 +1,25 @@
/** **********************************************************************
*
* Copyright 2018 Jochen Staerk
*
* Use is subject to license terms.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*
*********************************************************************** */
package org.mustangproject.ZUGFeRD;
public interface IProfileProvider {
public String getProfile();
}

View File

@@ -46,13 +46,23 @@ public interface IZUGFeRDExportableContact {
*/ */
String getName(); String getName();
default String getPhone() {
return null;
}
default String getEMail() {
return null;
}
/** /**
* Postal code of the recipient * Postal code of the recipient
* *
* @return Postal code of the recipient * @return Postal code of the recipient
*/ */
String getZIP(); default String getZIP() {
return null;
}
/** /**
@@ -60,7 +70,9 @@ public interface IZUGFeRDExportableContact {
* *
* @return VAT ID (Umsatzsteueridentifikationsnummer) of the contact * @return VAT ID (Umsatzsteueridentifikationsnummer) of the contact
*/ */
String getVATID(); default String getVATID() {
return null;
}
/** /**
@@ -68,7 +80,9 @@ public interface IZUGFeRDExportableContact {
* *
* @return two-letter iso country code of the contact * @return two-letter iso country code of the contact
*/ */
String getCountry(); default String getCountry() {
return null;
}
/** /**
@@ -76,7 +90,9 @@ public interface IZUGFeRDExportableContact {
* *
* @return Returns the city of the recipient * @return Returns the city of the recipient
*/ */
String getLocation(); default String getLocation() {
return null;
}
/** /**
@@ -84,6 +100,8 @@ public interface IZUGFeRDExportableContact {
* *
* @return street address (street+number) of the contact * @return street address (street+number) of the contact
*/ */
String getStreet(); default String getStreet() {
return null;
}
} }

View File

@@ -83,6 +83,15 @@ public interface IZUGFeRDExportableTransaction {
return null; return null;
} }
/**
* who processed the order
*
* @return the contact person at the supplier side
*/
default IZUGFeRDExportableContact getOwnContact() {
return null;
}
IZUGFeRDAllowanceCharge[] getZFAllowances(); IZUGFeRDAllowanceCharge[] getZFAllowances();

View File

@@ -26,7 +26,7 @@ import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
public class ZUGFeRD2PullProvider implements IXMLProvider { public class ZUGFeRD2PullProvider implements IXMLProvider, IProfileProvider {
private class LineCalc { private class LineCalc {
private BigDecimal totalGross; private BigDecimal totalGross;
@@ -34,10 +34,12 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
private BigDecimal itemTotalVATAmount; private BigDecimal itemTotalVATAmount;
public LineCalc(IZUGFeRDExportableItem currentItem) { public LineCalc(IZUGFeRDExportableItem currentItem) {
BigDecimal multiplicator = currentItem.getProduct().getVATPercent().divide(new BigDecimal(100)).add(new BigDecimal(1)); BigDecimal multiplicator = currentItem.getProduct().getVATPercent().divide(new BigDecimal(100))
// priceGross=currentItem.getPrice().multiply(multiplicator); .add(new BigDecimal(1));
// priceGross=currentItem.getPrice().multiply(multiplicator);
totalGross = currentItem.getPrice().multiply(multiplicator).multiply(currentItem.getQuantity()); totalGross = currentItem.getPrice().multiply(multiplicator).multiply(currentItem.getQuantity());
itemTotalNetAmount = currentItem.getQuantity().multiply(currentItem.getPrice()).setScale(2, BigDecimal.ROUND_HALF_UP); itemTotalNetAmount = currentItem.getQuantity().multiply(currentItem.getPrice()).setScale(2,
BigDecimal.ROUND_HALF_UP);
itemTotalVATAmount = totalGross.subtract(itemTotalNetAmount); itemTotalVATAmount = totalGross.subtract(itemTotalNetAmount);
} }
@@ -51,7 +53,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
//// MAIN CLASS //// MAIN CLASS
protected byte[] zugferdData; protected byte[] zugferdData;
@@ -60,23 +61,23 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
/** /**
* enables the flag to indicate a test invoice in the XML structure * enables the flag to indicate a test invoice in the XML structure
*/ */
public void setTest() {} public void setTest() {
}
private String nDigitFormat(BigDecimal value, int scale) { private String nDigitFormat(BigDecimal value, int scale) {
/* /*
* I needed 123,45, locale independent.I tried * I needed 123,45, locale independent.I tried
* NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is * NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is locale
* locale specific.I also tried DecimalFormat df = new DecimalFormat( * specific.I also tried DecimalFormat df = new DecimalFormat( "0,00" );
* "0,00" ); df.setDecimalSeparatorAlwaysShown(true); * df.setDecimalSeparatorAlwaysShown(true); df.setGroupingUsed(false);
* df.setGroupingUsed(false); DecimalFormatSymbols symbols = new * DecimalFormatSymbols symbols = new DecimalFormatSymbols();
* DecimalFormatSymbols(); symbols.setDecimalSeparator(','); * symbols.setDecimalSeparator(','); symbols.setGroupingSeparator(' ');
* symbols.setGroupingSeparator(' ');
* df.setDecimalFormatSymbols(symbols); * df.setDecimalFormatSymbols(symbols);
* *
* but that would not switch off grouping. Although I liked very much * but that would not switch off grouping. Although I liked very much the
* the (incomplete) "BNF diagram" in * (incomplete) "BNF diagram" in
* http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html * http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html in the
* in the end I decided to calculate myself and take eur+sparator+cents * end I decided to calculate myself and take eur+sparator+cents
* *
* This function will cut off, i.e. floor() subcent values Tests: * This function will cut off, i.e. floor() subcent values Tests:
* System.err.println(utils.currencyFormat(new BigDecimal(0), * System.err.println(utils.currencyFormat(new BigDecimal(0),
@@ -89,7 +90,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
* *
* results 0.00 -1,10 -1,10 -1,01 20000123,34 20000123,34 12,00 * results 0.00 -1,10 -1,10 -1,01 20000123,34 20000123,34 12,00
*/ */
value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round so that e.g. 1.189999999999999946709294817992486059665679931640625 becomes 1.19 value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round so that e.g.
// 1.189999999999999946709294817992486059665679931640625
// becomes 1.19
char[] repeat = new char[scale]; char[] repeat = new char[scale];
Arrays.fill(repeat, '0'); Arrays.fill(repeat, '0');
@@ -142,10 +145,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
/** /**
* which taxes have been used with which amounts in this transaction, * which taxes have been used with which amounts in this transaction, empty for
* empty for no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable * no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable to 19% VAT
* to 19% VAT (=>190 EUR VAT) and 200 EUR were applicable to 7% (=>14 EUR VAT) * (=>190 EUR VAT) and 200 EUR were applicable to 7% (=>14 EUR VAT) 190 Eur
* 190 Eur
* *
* @return which taxes have been used with which amounts in this invoice * @return which taxes have been used with which amounts in this invoice
*/ */
@@ -155,7 +157,8 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
BigDecimal percent = currentItem.getProduct().getVATPercent(); BigDecimal percent = currentItem.getProduct().getVATPercent();
LineCalc lc = new LineCalc(currentItem); LineCalc lc = new LineCalc(currentItem);
VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), trans.getDocumentCode()); VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(),
trans.getDocumentCode());
VATAmount current = hm.get(percent); VATAmount current = hm.get(percent);
if (current == null) { if (current == null) {
hm.put(percent, itemVATAmount); hm.put(percent, itemVATAmount);
@@ -166,6 +169,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
return hm; return hm;
} }
public String getProfile() {
return "urn:cen.eu:en16931:2017";
}
@Override @Override
public void generateXML(IZUGFeRDExportableTransaction trans) { public void generateXML(IZUGFeRDExportableTransaction trans) {
@@ -174,47 +180,50 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); //$NON-NLS-1$ SimpleDateFormat zugferdDateFormat = new SimpleDateFormat("yyyyMMdd"); //$NON-NLS-1$
String senderReg = ""; String senderReg = "";
if (trans.getOwnOrganisationFullPlaintextInfo() != null) { if (trans.getOwnOrganisationFullPlaintextInfo() != null) {
senderReg = "" senderReg = "" + "<ram:IncludedCINote>\n" + " <ram:Content>\n"
+ "<ram:IncludedCINote>\n" + trans.getOwnOrganisationFullPlaintextInfo() + " </ram:Content>\n"
+ " <ram:Content>\n" + "<ram:SubjectCode>REG</ram:SubjectCode>\n" + "</ram:IncludedCINote>\n";
+ trans.getOwnOrganisationFullPlaintextInfo()
+ " </ram:Content>\n"
+ "<ram:SubjectCode>REG</ram:SubjectCode>\n"
+ "</ram:IncludedCINote>\n";
} }
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //$NON-NLS-1$ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //$NON-NLS-1$
+ "<rsm:CrossIndustryInvoice xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\"" + "<rsm:CrossIndustryInvoice xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:rsm=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100\""
// + " xsi:schemaLocation=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100 ../Schema/ZUGFeRD1p0.xsd\"" // + "
// xsi:schemaLocation=\"urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100
// ../Schema/ZUGFeRD1p0.xsd\""
+ " xmlns:ram=\"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100\"" + " xmlns:ram=\"urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100\""
+ " xmlns:udt=\"urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100\">\n" //$NON-NLS-1$ + " xmlns:udt=\"urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100\">\n" //$NON-NLS-1$
+ " <rsm:ExchangedDocumentContext>\n" //$NON-NLS-1$ + " <rsm:ExchangedDocumentContext>\n" //$NON-NLS-1$
// + " <ram:TestIndicator><udt:Indicator>"+testBooleanStr+"</udt:Indicator></ram:TestIndicator>\n" //$NON-NLS-1$ // + "
// <ram:TestIndicator><udt:Indicator>"+testBooleanStr+"</udt:Indicator></ram:TestIndicator>\n"
// //$NON-NLS-1$
+ " <ram:GuidelineSpecifiedDocumentContextParameter>\n" //$NON-NLS-1$ + " <ram:GuidelineSpecifiedDocumentContextParameter>\n" //$NON-NLS-1$
+ " <ram:ID>urn:cen.eu:en16931:2017</ram:ID>\n" //$NON-NLS-1$ + " <ram:ID>" + getProfile() + "</ram:ID>\n" //$NON-NLS-1$
+ " </ram:GuidelineSpecifiedDocumentContextParameter>\n" //$NON-NLS-1$ + " </ram:GuidelineSpecifiedDocumentContextParameter>\n" //$NON-NLS-1$
+ " </rsm:ExchangedDocumentContext>\n" //$NON-NLS-1$ + " </rsm:ExchangedDocumentContext>\n" //$NON-NLS-1$
+ " <rsm:ExchangedDocument>\n" //$NON-NLS-1$ + " <rsm:ExchangedDocument>\n" //$NON-NLS-1$
+ " <ram:ID>" + trans.getNumber() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:ID>" + trans.getNumber() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$
// + " <ram:Name>RECHNUNG</ram:Name>\n" //$NON-NLS-1$ // + " <ram:Name>RECHNUNG</ram:Name>\n" //$NON-NLS-1$
+ " <ram:TypeCode>380</ram:TypeCode>\n" //$NON-NLS-1$ + " <ram:TypeCode>380</ram:TypeCode>\n" //$NON-NLS-1$
+ " <ram:IssueDateTime><udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" //date format was 20130605 //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:IssueDateTime><udt:DateTimeString format=\"102\">" //$NON-NLS-1$
+ zugferdDateFormat.format(trans.getIssueDate()) + "</udt:DateTimeString></ram:IssueDateTime>\n" // date //$NON-NLS-1$
// format
// was
// 20130605
+ senderReg + senderReg
// + " <IncludedNote>\n" // + " <IncludedNote>\n"
// + " <Content>\n" // + " <Content>\n"
// + "Rechnung gemäß Bestellung Nr. 2013-471331 vom 01.03.2013.\n" // + "Rechnung gemäß Bestellung Nr. 2013-471331 vom 01.03.2013.\n"
// + "\n" // + "\n"
// + " </Content>\n" // + " </Content>\n"
// + " </IncludedNote>\n" // + " </IncludedNote>\n"
// + " <IncludedNote>\n" // + " <IncludedNote>\n"
// + " <Content>\n" // + " <Content>\n"
// + "Es bestehen Rabatt- und Bonusvereinbarungen.\n" // + "Es bestehen Rabatt- und Bonusvereinbarungen.\n"
// + " </Content>\n" // + " </Content>\n"
// + " <SubjectCode>AAK</SubjectCode>\n" // + " <SubjectCode>AAK</SubjectCode>\n"
// + " </IncludedNote>\n" // + " </IncludedNote>\n"
+ " </rsm:ExchangedDocument>\n" //$NON-NLS-1$ + " </rsm:ExchangedDocument>\n" //$NON-NLS-1$
+ " <rsm:SupplyChainTradeTransaction>\n"; //$NON-NLS-1$ + " <rsm:SupplyChainTradeTransaction>\n"; //$NON-NLS-1$
int lineID = 0; int lineID = 0;
@@ -227,58 +236,86 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " <ram:LineID>" + lineID + "</ram:LineID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:LineID>" + lineID + "</ram:LineID>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " </ram:AssociatedDocumentLineDocument>\n" //$NON-NLS-1$ + " </ram:AssociatedDocumentLineDocument>\n" //$NON-NLS-1$
+ " <ram:SpecifiedTradeProduct>\n" //$NON-NLS-1$ + " <ram:SpecifiedTradeProduct>\n" //$NON-NLS-1$
// + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n" // + " <GlobalID schemeID=\"0160\">4012345001235</GlobalID>\n"
// + " <SellerAssignedID>KR3M</SellerAssignedID>\n" // + " <SellerAssignedID>KR3M</SellerAssignedID>\n"
// + " <BuyerAssignedID>55T01</BuyerAssignedID>\n" // + " <BuyerAssignedID>55T01</BuyerAssignedID>\n"
+ " <ram:Name>" + currentItem.getProduct().getName() + "</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:Name>" + currentItem.getProduct().getName() + "</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:Description>" + currentItem.getProduct().getDescription() + "</ram:Description>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:Description>" + currentItem.getProduct().getDescription() //$NON-NLS-1$
+ "</ram:Description>\n" //$NON-NLS-1$
+ " </ram:SpecifiedTradeProduct>\n" //$NON-NLS-1$ + " </ram:SpecifiedTradeProduct>\n" //$NON-NLS-1$
+ " <ram:SpecifiedLineTradeAgreement>\n" //$NON-NLS-1$ + " <ram:SpecifiedLineTradeAgreement>\n" //$NON-NLS-1$
+ " <ram:GrossPriceProductTradePrice>\n" //$NON-NLS-1$ + " <ram:GrossPriceProductTradePrice>\n" //$NON-NLS-1$
+ " <ram:ChargeAmount>" + priceFormat(currentItem.getPrice()) + "</ram:ChargeAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ //currencyID=\"EUR\" + " <ram:ChargeAmount>" + priceFormat(currentItem.getPrice()) //$NON-NLS-1$
+ " <ram:BasisQuantity unitCode=\"" + currentItem.getProduct().getUnit() + "\">1.0000</ram:BasisQuantity>\n" //$NON-NLS-1$ //$NON-NLS-2$ + "</ram:ChargeAmount>\n" //$NON-NLS-1$ //currencyID=\"EUR\"
// + " <AppliedTradeAllowanceCharge>\n" + " <ram:BasisQuantity unitCode=\"" + currentItem.getProduct().getUnit() //$NON-NLS-1$
// + " <ChargeIndicator>false</ChargeIndicator>\n" + "\">1.0000</ram:BasisQuantity>\n" //$NON-NLS-1$
// + " <ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>\n" // + " <AppliedTradeAllowanceCharge>\n"
// + " <Reason>Rabatt</Reason>\n" // + " <ChargeIndicator>false</ChargeIndicator>\n"
// + " </AppliedTradeAllowanceCharge>\n" // + " <ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>\n"
// + " <Reason>Rabatt</Reason>\n"
// + " </AppliedTradeAllowanceCharge>\n"
+ " </ram:GrossPriceProductTradePrice>\n" //$NON-NLS-1$ + " </ram:GrossPriceProductTradePrice>\n" //$NON-NLS-1$
+ " <ram:NetPriceProductTradePrice>\n" //$NON-NLS-1$ + " <ram:NetPriceProductTradePrice>\n" //$NON-NLS-1$
+ " <ram:ChargeAmount>" + priceFormat(currentItem.getPrice()) + "</ram:ChargeAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ // currencyID=\"EUR\" + " <ram:ChargeAmount>" + priceFormat(currentItem.getPrice()) //$NON-NLS-1$
+ " <ram:BasisQuantity unitCode=\"" + currentItem.getProduct().getUnit() + "\">1.0000</ram:BasisQuantity>\n" //$NON-NLS-1$ //$NON-NLS-2$ + "</ram:ChargeAmount>\n" //$NON-NLS-1$ // currencyID=\"EUR\"
+ " <ram:BasisQuantity unitCode=\"" + currentItem.getProduct().getUnit() //$NON-NLS-1$
+ "\">1.0000</ram:BasisQuantity>\n" //$NON-NLS-1$
+ " </ram:NetPriceProductTradePrice>\n" //$NON-NLS-1$ + " </ram:NetPriceProductTradePrice>\n" //$NON-NLS-1$
+ " </ram:SpecifiedLineTradeAgreement>\n" //$NON-NLS-1$ + " </ram:SpecifiedLineTradeAgreement>\n" //$NON-NLS-1$
+ " <ram:SpecifiedLineTradeDelivery>\n" //$NON-NLS-1$ + " <ram:SpecifiedLineTradeDelivery>\n" //$NON-NLS-1$
+ " <ram:BilledQuantity unitCode=\"" + currentItem.getProduct().getUnit() + "\">" + quantityFormat(currentItem.getQuantity()) + "</ram:BilledQuantity>\n" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + " <ram:BilledQuantity unitCode=\"" + currentItem.getProduct().getUnit() + "\">" //$NON-NLS-1$ //$NON-NLS-2$
+ quantityFormat(currentItem.getQuantity()) + "</ram:BilledQuantity>\n" //$NON-NLS-1$
+ " </ram:SpecifiedLineTradeDelivery>\n" //$NON-NLS-1$ + " </ram:SpecifiedLineTradeDelivery>\n" //$NON-NLS-1$
+ " <ram:SpecifiedLineTradeSettlement>\n" //$NON-NLS-1$ + " <ram:SpecifiedLineTradeSettlement>\n" //$NON-NLS-1$
+ " <ram:ApplicableTradeTax>\n" //$NON-NLS-1$ + " <ram:ApplicableTradeTax>\n" //$NON-NLS-1$
+ " <ram:TypeCode>VAT</ram:TypeCode>\n" //$NON-NLS-1$ + " <ram:TypeCode>VAT</ram:TypeCode>\n" //$NON-NLS-1$
+ " <ram:CategoryCode>S</ram:CategoryCode>\n" //$NON-NLS-1$ + " <ram:CategoryCode>S</ram:CategoryCode>\n" //$NON-NLS-1$
+ " <ram:RateApplicablePercent>" + vatFormat(currentItem.getProduct().getVATPercent()) + "</ram:RateApplicablePercent>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:RateApplicablePercent>" //$NON-NLS-1$
+ vatFormat(currentItem.getProduct().getVATPercent()) + "</ram:RateApplicablePercent>\n" //$NON-NLS-1$
+ " </ram:ApplicableTradeTax>\n" //$NON-NLS-1$ + " </ram:ApplicableTradeTax>\n" //$NON-NLS-1$
+ " <ram:SpecifiedTradeSettlementLineMonetarySummation>\n" //$NON-NLS-1$ + " <ram:SpecifiedTradeSettlementLineMonetarySummation>\n" //$NON-NLS-1$
+ " <ram:LineTotalAmount>" + currencyFormat(lc.getItemTotalNetAmount()) + "</ram:LineTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ // currencyID=\"EUR\" + " <ram:LineTotalAmount>" + currencyFormat(lc.getItemTotalNetAmount()) //$NON-NLS-1$
+ "</ram:LineTotalAmount>\n" //$NON-NLS-1$ // currencyID=\"EUR\"
+ " </ram:SpecifiedTradeSettlementLineMonetarySummation>\n" //$NON-NLS-1$ + " </ram:SpecifiedTradeSettlementLineMonetarySummation>\n" //$NON-NLS-1$
+ " </ram:SpecifiedLineTradeSettlement>\n" //$NON-NLS-1$ + " </ram:SpecifiedLineTradeSettlement>\n" //$NON-NLS-1$
+ " </ram:IncludedSupplyChainTradeLineItem>\n"; //$NON-NLS-1$ + " </ram:IncludedSupplyChainTradeLineItem>\n"; //$NON-NLS-1$
}
xml = xml + " <ram:ApplicableHeaderTradeAgreement>\n"; //$NON-NLS-1$
if (trans.getReferenceNumber() != null) {
xml = xml + " <BuyerReference>" + trans.getReferenceNumber() + "</BuyerReference>\n";
}
xml = xml + " <ram:SellerTradeParty>\n" //$NON-NLS-1$
// + " <GlobalID schemeID=\"0088\">4000001123452</GlobalID>\n"
+ " <ram:Name>" + trans.getOwnOrganisationName() + "</ram:Name>\n"; //$NON-NLS-1$ //$NON-NLS-2$
if (trans.getOwnContact() != null) {
xml = xml + "<ram:DefinedTradeContact>\n" + " <ram:PersonName>" + trans.getOwnContact().getName()
+ "</ram:PersonName>\n";
if (trans.getOwnContact().getPhone() != null) {
xml = xml + " <ram:TelephoneUniversalCommunication>\n" + " <ram:CompleteNumber>"
+ trans.getOwnContact().getPhone() + "</ram:CompleteNumber>\n"
+ " </ram:TelephoneUniversalCommunication>\n";
}
if (trans.getOwnContact().getEMail() != null) {
xml = xml + " <ram:EmailURIUniversalCommunication>\n" + " <ram:URIID>"
+ trans.getOwnContact().getEMail() + "</ram:URIID>\n"
+ " </ram:EmailURIUniversalCommunication>\n";
}
xml = xml + " </ram:DefinedTradeContact>";
} }
xml = xml + " <ram:ApplicableHeaderTradeAgreement>\n" //$NON-NLS-1$ xml = xml + " <ram:PostalTradeAddress>\n" + " <ram:PostcodeCode>"
// + " <BuyerReference>AB-312</BuyerReference>\n" + trans.getOwnZIP() + "</ram:PostcodeCode>\n" + " <ram:LineOne>"
+ " <ram:SellerTradeParty>\n" //$NON-NLS-1$ + trans.getOwnStreet() + "</ram:LineOne>\n" + " <ram:CityName>" + trans.getOwnLocation()
// + " <GlobalID schemeID=\"0088\">4000001123452</GlobalID>\n" + "</ram:CityName>\n" + " <ram:CountryID>" + trans.getOwnCountry()
+ " <ram:Name>" + trans.getOwnOrganisationName() + "</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$ + "</ram:CountryID>\n" + " </ram:PostalTradeAddress>\n"
+ " <ram:PostalTradeAddress>\n"
+ " <ram:PostcodeCode>" + trans.getOwnZIP() + "</ram:PostcodeCode>\n"
+ " <ram:LineOne>" + trans.getOwnStreet() + "</ram:LineOne>\n"
+ " <ram:CityName>" + trans.getOwnLocation() + "</ram:CityName>\n"
+ " <ram:CountryID>" + trans.getOwnCountry() + "</ram:CountryID>\n"
+ " </ram:PostalTradeAddress>\n"
+ " <ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$ + " <ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$
+ " <ram:ID schemeID=\"FC\">" + trans.getOwnTaxID() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:ID schemeID=\"FC\">" + trans.getOwnTaxID() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$ + " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$
@@ -287,12 +324,12 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$ + " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$
+ " </ram:SellerTradeParty>\n" //$NON-NLS-1$ + " </ram:SellerTradeParty>\n" //$NON-NLS-1$
+ " <ram:BuyerTradeParty>\n" //$NON-NLS-1$ + " <ram:BuyerTradeParty>\n" //$NON-NLS-1$
// + " <ID>GE2020211</ID>\n" // + " <ID>GE2020211</ID>\n"
// + " <GlobalID schemeID=\"0088\">4000001987658</GlobalID>\n" // + " <GlobalID schemeID=\"0088\">4000001987658</GlobalID>\n"
+ " <ram:Name>" + trans.getRecipient().getName() + "</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:Name>" + trans.getRecipient().getName() + "</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$
// + " <DefinedTradeContact>\n" // + " <DefinedTradeContact>\n"
// + " <PersonName>xxx</PersonName>\n" // + " <PersonName>xxx</PersonName>\n"
// + " </DefinedTradeContact>\n" // + " </DefinedTradeContact>\n"
+ " <ram:PostalTradeAddress>\n" //$NON-NLS-1$ + " <ram:PostalTradeAddress>\n" //$NON-NLS-1$
+ " <ram:PostcodeCode>" + trans.getRecipient().getZIP() + "</ram:PostcodeCode>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:PostcodeCode>" + trans.getRecipient().getZIP() + "</ram:PostcodeCode>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:LineOne>" + trans.getRecipient().getStreet() + "</ram:LineOne>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:LineOne>" + trans.getRecipient().getStreet() + "</ram:LineOne>\n" //$NON-NLS-1$ //$NON-NLS-2$
@@ -303,26 +340,26 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " <ram:ID schemeID=\"VA\">" + trans.getRecipient().getVATID() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:ID schemeID=\"VA\">" + trans.getRecipient().getVATID() + "</ram:ID>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$ + " </ram:SpecifiedTaxRegistration>\n" //$NON-NLS-1$
+ " </ram:BuyerTradeParty>\n" //$NON-NLS-1$ + " </ram:BuyerTradeParty>\n" //$NON-NLS-1$
// + " <BuyerOrderReferencedDocument>\n" // + " <BuyerOrderReferencedDocument>\n"
// + " <IssueDateTime format=\"102\">20130301</IssueDateTime>\n" // + " <IssueDateTime format=\"102\">20130301</IssueDateTime>\n"
// + " <ID>2013-471331</ID>\n" // + " <ID>2013-471331</ID>\n"
// + " </BuyerOrderReferencedDocument>\n" // + " </BuyerOrderReferencedDocument>\n"
+ " </ram:ApplicableHeaderTradeAgreement>\n" //$NON-NLS-1$ + " </ram:ApplicableHeaderTradeAgreement>\n" //$NON-NLS-1$
+ " <ram:ApplicableHeaderTradeDelivery>\n" + " <ram:ApplicableHeaderTradeDelivery>\n" + " <ram:ActualDeliverySupplyChainEvent>\n"
+ " <ram:ActualDeliverySupplyChainEvent>\n" + " <ram:OccurrenceDateTime><udt:DateTimeString format=\"102\">"
+ " <ram:OccurrenceDateTime><udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(trans.getDeliveryDate()) + "</udt:DateTimeString></ram:OccurrenceDateTime>\n" + zugferdDateFormat.format(trans.getDeliveryDate()) + "</udt:DateTimeString></ram:OccurrenceDateTime>\n"
+ " </ram:ActualDeliverySupplyChainEvent>\n" + " </ram:ActualDeliverySupplyChainEvent>\n"
/* /*
+ " <DeliveryNoteReferencedDocument>\n" * + " <DeliveryNoteReferencedDocument>\n" +
+ " <IssueDateTime format=\"102\">20130603</IssueDateTime>\n" * " <IssueDateTime format=\"102\">20130603</IssueDateTime>\n" +
+ " <ID>2013-51112</ID>\n" * " <ID>2013-51112</ID>\n" +
+ " </DeliveryNoteReferencedDocument>\n" */ * " </DeliveryNoteReferencedDocument>\n"
+ " </ram:ApplicableHeaderTradeDelivery>\n" */
+ " <ram:ApplicableHeaderTradeSettlement>\n" //$NON-NLS-1$ + " </ram:ApplicableHeaderTradeDelivery>\n" + " <ram:ApplicableHeaderTradeSettlement>\n" //$NON-NLS-2$
+ " <ram:PaymentReference>" + trans.getNumber() + "</ram:PaymentReference>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:PaymentReference>" + trans.getNumber() + "</ram:PaymentReference>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>\n"; //$NON-NLS-1$ + " <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode>\n"; //$NON-NLS-1$
for(IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) { for (IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) {
xml += " <ram:SpecifiedTradeSettlementPaymentMeans>\n" //$NON-NLS-1$ xml += " <ram:SpecifiedTradeSettlementPaymentMeans>\n" //$NON-NLS-1$
+ " <ram:TypeCode>42</ram:TypeCode>\n" //$NON-NLS-1$ + " <ram:TypeCode>42</ram:TypeCode>\n" //$NON-NLS-1$
+ " <ram:Information>Überweisung</ram:Information>\n" //$NON-NLS-1$ + " <ram:Information>Überweisung</ram:Information>\n" //$NON-NLS-1$
@@ -332,8 +369,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " </ram:PayeePartyCreditorFinancialAccount>\n" //$NON-NLS-1$ + " </ram:PayeePartyCreditorFinancialAccount>\n" //$NON-NLS-1$
+ " <ram:PayeeSpecifiedCreditorFinancialInstitution>\n" //$NON-NLS-1$ + " <ram:PayeeSpecifiedCreditorFinancialInstitution>\n" //$NON-NLS-1$
+ " <ram:BICID>" + payment.getOwnBIC() + "</ram:BICID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:BICID>" + payment.getOwnBIC() + "</ram:BICID>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:GermanBankleitzahlID>" + payment.getOwnBLZ() + "</ram:GermanBankleitzahlID>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:GermanBankleitzahlID>" + payment.getOwnBLZ() //$NON-NLS-1$
// + " <ram:Name>"+trans.getOwnBankName()+"</ram:Name>\n" //$NON-NLS-1$ //$NON-NLS-2$ + "</ram:GermanBankleitzahlID>\n" //$NON-NLS-1$
// + " <ram:Name>"+trans.getOwnBankName()+"</ram:Name>\n" //$NON-NLS-1$
// //$NON-NLS-2$
+ " </ram:PayeeSpecifiedCreditorFinancialInstitution>\n" //$NON-NLS-1$ + " </ram:PayeeSpecifiedCreditorFinancialInstitution>\n" //$NON-NLS-1$
+ " </ram:SpecifiedTradeSettlementPaymentMeans>\n"; //$NON-NLS-1$ + " </ram:SpecifiedTradeSettlementPaymentMeans>\n"; //$NON-NLS-1$
} }
@@ -343,74 +382,85 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
if (amount != null) { if (amount != null) {
xml += " <ram:ApplicableTradeTax>\n" //$NON-NLS-1$ xml += " <ram:ApplicableTradeTax>\n" //$NON-NLS-1$
+ " <ram:CalculatedAmount>" + currencyFormat(amount.getCalculated()) + "</ram:CalculatedAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ //currencyID=\"EUR\" + " <ram:CalculatedAmount>" + currencyFormat(amount.getCalculated()) //$NON-NLS-1$
+ "</ram:CalculatedAmount>\n" //$NON-NLS-1$ //currencyID=\"EUR\"
+ " <ram:TypeCode>VAT</ram:TypeCode>\n" //$NON-NLS-1$ + " <ram:TypeCode>VAT</ram:TypeCode>\n" //$NON-NLS-1$
+ " <ram:BasisAmount>" + currencyFormat(amount.getBasis()) + "</ram:BasisAmount>\n" // currencyID=\"EUR\" + " <ram:BasisAmount>" + currencyFormat(amount.getBasis()) + "</ram:BasisAmount>\n" // currencyID=\"EUR\"
+ " <ram:CategoryCode>S</ram:CategoryCode>\n" //$NON-NLS-1$ + " <ram:CategoryCode>S</ram:CategoryCode>\n" //$NON-NLS-1$
+ " <ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) + "</ram:RateApplicablePercent>\n" //$NON-NLS-1$ + " <ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) //$NON-NLS-1$
+ " </ram:ApplicableTradeTax>\n"; //$NON-NLS-1$ + "</ram:RateApplicablePercent>\n" + " </ram:ApplicableTradeTax>\n"; //$NON-NLS-2$
} }
} }
/* xml+= " /*
+ " <SpecifiedTradeAllowanceCharge>\n" * xml+= " + " <SpecifiedTradeAllowanceCharge>\n" +
+ " <ChargeIndicator>false</ChargeIndicator>\n" * " <ChargeIndicator>false</ChargeIndicator>\n" +
+ " <BasisAmount currencyID=\"EUR\">10</BasisAmount>\n" * " <BasisAmount currencyID=\"EUR\">10</BasisAmount>\n" +
+ " <ActualAmount>1.00</ActualAmount>\n" * " <ActualAmount>1.00</ActualAmount>\n" +
+ " <Reason>Sondernachlass</Reason>\n" * " <Reason>Sondernachlass</Reason>\n" +
+ " <CategoryTradeTax>\n" * " <CategoryTradeTax>\n" +
+ " <TypeCode>VAT</TypeCode>\n" * " <TypeCode>VAT</TypeCode>\n" +
+ " <CategoryCode>S</CategoryCode>\n" * " <CategoryCode>S</CategoryCode>\n" +
+ " <ApplicablePercent>19</ApplicablePercent>\n" * " <ApplicablePercent>19</ApplicablePercent>\n" +
+ " </CategoryTradeTax>\n" * " </CategoryTradeTax>\n" +
+ " </SpecifiedTradeAllowanceCharge>\n" * " </SpecifiedTradeAllowanceCharge>\n" +
+ " <SpecifiedTradeAllowanceCharge>\n" * " <SpecifiedTradeAllowanceCharge>\n" +
+ " <ChargeIndicator>false</ChargeIndicator>\n" * " <ChargeIndicator>false</ChargeIndicator>\n" +
+ " <BasisAmount currencyID=\"EUR\">137.30</BasisAmount>\n" * " <BasisAmount currencyID=\"EUR\">137.30</BasisAmount>\n" +
+ " <ActualAmount>13.73</ActualAmount>\n" * " <ActualAmount>13.73</ActualAmount>\n" +
+ " <Reason>Sondernachlass</Reason>\n" * " <Reason>Sondernachlass</Reason>\n" +
+ " <CategoryTradeTax>\n" * " <CategoryTradeTax>\n" +
+ " <TypeCode>VAT</TypeCode>\n" * " <TypeCode>VAT</TypeCode>\n" +
+ " <CategoryCode>S</CategoryCode>\n" * " <CategoryCode>S</CategoryCode>\n" +
+ " <ApplicablePercent>7</ApplicablePercent>\n" * " <ApplicablePercent>7</ApplicablePercent>\n" +
+ " </CategoryTradeTax>\n" * " </CategoryTradeTax>\n" +
+ " </SpecifiedTradeAllowanceCharge>\n" * " </SpecifiedTradeAllowanceCharge>\n" +
+ " <SpecifiedLogisticsServiceCharge>\n" * " <SpecifiedLogisticsServiceCharge>\n" +
+ " <Description>Versandkosten</Description>\n" * " <Description>Versandkosten</Description>\n" +
+ " <AppliedAmount>5.80</AppliedAmount>\n" * " <AppliedAmount>5.80</AppliedAmount>\n" +
+ " <AppliedTradeTax>\n" * " <AppliedTradeTax>\n" +
+ " <TypeCode>VAT</TypeCode>\n" * " <TypeCode>VAT</TypeCode>\n" +
+ " <CategoryCode>S</CategoryCode>\n" * " <CategoryCode>S</CategoryCode>\n" +
+ " <ApplicablePercent>7</ApplicablePercent>\n" * " <ApplicablePercent>7</ApplicablePercent>\n" +
+ " </AppliedTradeTax>\n" * " </AppliedTradeTax>\n" +
+ " </SpecifiedLogisticsServiceCharge>\n"*/ * " </SpecifiedLogisticsServiceCharge>\n"
*/
xml = xml + " <ram:SpecifiedTradePaymentTerms>\n" //$NON-NLS-1$ xml = xml + " <ram:SpecifiedTradePaymentTerms>\n" //$NON-NLS-1$
+ " <ram:Description>Zahlbar ohne Abzug bis " + germanDateFormat.format(trans.getDueDate()) + "</ram:Description>\n" + " <ram:Description>Zahlbar ohne Abzug bis " + germanDateFormat.format(trans.getDueDate())
+ " <ram:DueDateDateTime><udt:DateTimeString format=\"102\">" + zugferdDateFormat.format(trans.getDueDate()) + "</udt:DateTimeString></ram:DueDateDateTime>\n"//20130704 //$NON-NLS-1$ //$NON-NLS-2$ + "</ram:Description>\n" + " <ram:DueDateDateTime><udt:DateTimeString format=\"102\">" //$NON-NLS-2$
+ zugferdDateFormat.format(trans.getDueDate()) + "</udt:DateTimeString></ram:DueDateDateTime>\n"// 20130704 //$NON-NLS-1$
+ " </ram:SpecifiedTradePaymentTerms>\n" //$NON-NLS-1$ + " </ram:SpecifiedTradePaymentTerms>\n" //$NON-NLS-1$
+ " <ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n" //$NON-NLS-1$ + " <ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n" //$NON-NLS-1$
+ " <ram:LineTotalAmount>" + currencyFormat(getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ currencyID=\"EUR\" + " <ram:LineTotalAmount>" + currencyFormat(getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$
// currencyID=\"EUR\"
+ " <ram:ChargeTotalAmount>0.00</ram:ChargeTotalAmount>\n" //$NON-NLS-1$ currencyID=\"EUR\" + " <ram:ChargeTotalAmount>0.00</ram:ChargeTotalAmount>\n" //$NON-NLS-1$ currencyID=\"EUR\"
+ " <ram:AllowanceTotalAmount>0.00</ram:AllowanceTotalAmount>\n" //$NON-NLS-1$ // currencyID=\"EUR\" + " <ram:AllowanceTotalAmount>0.00</ram:AllowanceTotalAmount>\n" //$NON-NLS-1$ //
// + " <ChargeTotalAmount currencyID=\"EUR\">5.80</ChargeTotalAmount>\n" // currencyID=\"EUR\"
// + " <AllowanceTotalAmount currencyID=\"EUR\">14.73</AllowanceTotalAmount>\n" // + " <ChargeTotalAmount currencyID=\"EUR\">5.80</ChargeTotalAmount>\n"
+ " <ram:TaxBasisTotalAmount>" + currencyFormat(getTotal()) + "</ram:TaxBasisTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ // currencyID=\"EUR\" // + " <AllowanceTotalAmount currencyID=\"EUR\">14.73</AllowanceTotalAmount>\n"
+ " <ram:TaxTotalAmount currencyID=\"EUR\">" + currencyFormat(getTotalGross().subtract(getTotal())) + "</ram:TaxTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ + " <ram:TaxBasisTotalAmount>" + currencyFormat(getTotal()) + "</ram:TaxBasisTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$
+ " <ram:GrandTotalAmount>" + currencyFormat(getTotalGross()) + "</ram:GrandTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ // currencyID=\"EUR\" // //
// + " <TotalPrepaidAmount currencyID=\"EUR\">0.00</TotalPrepaidAmount>\n" // currencyID=\"EUR\"
+ " <ram:DuePayableAmount>" + currencyFormat(getTotalGross()) + "</ram:DuePayableAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$ // currencyID=\"EUR\" + " <ram:TaxTotalAmount currencyID=\"EUR\">" //$NON-NLS-1$
+ currencyFormat(getTotalGross().subtract(getTotal())) + "</ram:TaxTotalAmount>\n" //$NON-NLS-1$
+ " <ram:GrandTotalAmount>" + currencyFormat(getTotalGross()) + "</ram:GrandTotalAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$
// //
// currencyID=\"EUR\"
// + " <TotalPrepaidAmount currencyID=\"EUR\">0.00</TotalPrepaidAmount>\n"
+ " <ram:DuePayableAmount>" + currencyFormat(getTotalGross()) + "</ram:DuePayableAmount>\n" //$NON-NLS-1$ //$NON-NLS-2$
// //
// currencyID=\"EUR\"
+ " </ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n" //$NON-NLS-1$ + " </ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n" //$NON-NLS-1$
+ " </ram:ApplicableHeaderTradeSettlement>\n"; //$NON-NLS-1$ + " </ram:ApplicableHeaderTradeSettlement>\n"; //$NON-NLS-1$
// + " <IncludedSupplyChainTradeLineItem>\n" // + " <IncludedSupplyChainTradeLineItem>\n"
// + " <AssociatedDocumentLineDocument>\n" // + " <AssociatedDocumentLineDocument>\n"
// + " <IncludedNote>\n" // + " <IncludedNote>\n"
// + " <Content>Wir erlauben uns Ihnen folgende Positionen aus der Lieferung Nr. 2013-51112 in Rechnung zu stellen:</Content>\n" // + " <Content>Wir erlauben uns Ihnen folgende Positionen aus der Lieferung Nr.
// + " </IncludedNote>\n" // 2013-51112 in Rechnung zu stellen:</Content>\n"
// + " </AssociatedDocumentLineDocument>\n" // + " </IncludedNote>\n"
// + " </IncludedSupplyChainTradeLineItem>\n"; // + " </AssociatedDocumentLineDocument>\n"
// + " </IncludedSupplyChainTradeLineItem>\n";
xml = xml + " </rsm:SupplyChainTradeTransaction>\n" //$NON-NLS-1$ xml = xml + " </rsm:SupplyChainTradeTransaction>\n" //$NON-NLS-1$
+ "</rsm:CrossIndustryInvoice>"; //$NON-NLS-1$ + "</rsm:CrossIndustryInvoice>"; //$NON-NLS-1$
@@ -429,7 +479,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} //$NON-NLS-1$ } // $NON-NLS-1$
} }
} }

View File

@@ -216,6 +216,13 @@ public class ZUGFeRDImporter {
return extractString("//HeaderExchangedDocument/TypeCode"); return extractString("//HeaderExchangedDocument/TypeCode");
} }
/**
* @return the referred document
*/
public String getReference() {
return extractString("//ApplicableHeaderTradeAgreement/BuyerReference");
}
/** /**
* @return the sender's bank's BLZ code * @return the sender's bank's BLZ code
*/ */

View File

@@ -68,7 +68,7 @@ public abstract class MustangReaderTestCase extends TestCase implements IZUGFeRD
} }
} }
protected class Contact implements IZUGFeRDExportableContact { protected class RecipientContact implements IZUGFeRDExportableContact {
@Override @Override
public String getCountry() { public String getCountry() {
@@ -101,6 +101,27 @@ public abstract class MustangReaderTestCase extends TestCase implements IZUGFeRD
} }
} }
protected class SenderContact implements IZUGFeRDExportableContact {
@Override
public String getName() {
return "Dieter Mara";
}
@Override
public String getPhone() {
return "++49(0)1771234567";
}
@Override
public String getEMail() {
return "Dieter@Mara.de";
}
}
protected class Item implements IZUGFeRDExportableItem { protected class Item implements IZUGFeRDExportableItem {
public Item(BigDecimal price, BigDecimal quantity, Product product) { public Item(BigDecimal price, BigDecimal quantity, Product product) {

View File

@@ -19,7 +19,6 @@
package org.mustangproject.ZUGFeRD; package org.mustangproject.ZUGFeRD;
import junit.framework.Test; import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters; import org.junit.runners.MethodSorters;
@@ -75,6 +74,13 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase {
return "Ecke 12"; return "Ecke 12";
} }
@Override
public IZUGFeRDExportableContact getOwnContact() {
return new SenderContact();
}
@Override @Override
public String getOwnTaxID() { public String getOwnTaxID() {
return "22/815/0815/4"; return "22/815/0815/4";
@@ -92,7 +98,7 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase {
@Override @Override
public IZUGFeRDExportableContact getRecipient() { public IZUGFeRDExportableContact getRecipient() {
return new Contact(); return new RecipientContact();
} }
@Override @Override
@@ -141,7 +147,7 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase {
@Override @Override
public String getReferenceNumber() { public String getReferenceNumber() {
return null; return "AB321";
} }
/** /**

View File

@@ -19,7 +19,6 @@
package org.mustangproject.ZUGFeRD; package org.mustangproject.ZUGFeRD;
import junit.framework.Test; import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters; import org.junit.runners.MethodSorters;
@@ -92,7 +91,12 @@ public class MustangReaderWriterTest extends MustangReaderTestCase {
@Override @Override
public IZUGFeRDExportableContact getRecipient() { public IZUGFeRDExportableContact getRecipient() {
return new Contact(); return new RecipientContact();
}
@Override
public IZUGFeRDExportableContact getOwnContact() {
return new SenderContact();
} }
@Override @Override
@@ -148,7 +152,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase {
@Override @Override
public String getReferenceNumber() { public String getReferenceNumber() {
return null; return "AB32";
} }
/** /**
@@ -334,6 +338,7 @@ public class MustangReaderWriterTest extends MustangReaderTestCase {
// Reading ZUGFeRD // Reading ZUGFeRD
assertEquals(zi.getAmount(), "571.04"); assertEquals(zi.getAmount(), "571.04");
assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC());
assertEquals(zi.getReference(), getReferenceNumber());
assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN());
assertEquals(zi.getKTO(), getTradeSettlementPayment()[0].getOwnKto()); assertEquals(zi.getKTO(), getTradeSettlementPayment()[0].getOwnKto());
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());