edge test cash discount

This commit is contained in:
jstaerk
2022-03-10 18:29:02 +01:00
parent 15ba24e6a7
commit 58b13598b3
5 changed files with 135 additions and 34 deletions

View File

@@ -461,7 +461,7 @@ public class OXPullProvider extends ZUGFeRD2PullProvider implements IXMLProvider
if (trans.getTradeSettlement() != null) { if (trans.getTradeSettlement() != null) {
for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) { for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) { if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) {
// xml += payment.getPaymentXML(); //not in order-x xml += payment.getPaymentXML();
} }
} }
} }

View File

@@ -45,7 +45,7 @@ import org.mustangproject.XMLTools;
public class ZUGFeRD2PullProvider implements IXMLProvider { public class ZUGFeRD2PullProvider implements IXMLProvider {
protected byte[] zugferdData; protected byte[] zugferdData;
protected IExportableTransaction trans; protected IExportableTransaction trans;
protected TransactionCalculator calc; protected TransactionCalculator calc;
private String paymentTermsDescription; private String paymentTermsDescription;
@@ -130,10 +130,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
xml += " <ram:Name>" + XMLTools.encodeXML(party.getName()) + "</ram:Name>\n"; xml += " <ram:Name>" + XMLTools.encodeXML(party.getName()) + "</ram:Name>\n";
if (party.getLegalOrganisation()!=null) { if (party.getLegalOrganisation() != null) {
xml += "<ram:SpecifiedLegalOrganization> "; xml += "<ram:SpecifiedLegalOrganization> ";
xml += " <ram:ID schemeID=\""+XMLTools.encodeXML(party.getLegalOrganisation().getSchemeID())+"\">"+XMLTools.encodeXML(party.getLegalOrganisation().getID())+"</ram:ID>"; xml += " <ram:ID schemeID=\"" + XMLTools.encodeXML(party.getLegalOrganisation().getSchemeID()) + "\">" + XMLTools.encodeXML(party.getLegalOrganisation().getID()) + "</ram:ID>";
xml += "</ram:SpecifiedLegalOrganization>"; xml += "</ram:SpecifiedLegalOrganization>";
} }
if ((party.getContact() != null) && (isSender || profile == Profiles.getByName("Extended") || profile == Profiles.getByName("XRechnung"))) { if ((party.getContact() != null) && (isSender || profile == Profiles.getByName("Extended") || profile == Profiles.getByName("XRechnung"))) {
@@ -488,9 +488,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
if (trans.getSpecifiedProcuringProjectID() != null) { if (trans.getSpecifiedProcuringProjectID() != null) {
xml = xml + " <ram:SpecifiedProcuringProject>\n" xml = xml + " <ram:SpecifiedProcuringProject>\n"
+ " <ram:ID>" + " <ram:ID>"
+ XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "</ram:ID>\n"; + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "</ram:ID>\n";
if(trans.getSpecifiedProcuringProjectName()!= null) { if (trans.getSpecifiedProcuringProjectName() != null) {
xml += " <ram:Name >" + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectName()) + "</ram:Name>\n"; xml += " <ram:Name >" + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectName()) + "</ram:Name>\n";
} }
xml += " </ram:SpecifiedProcuringProject>\n"; xml += " </ram:SpecifiedProcuringProject>\n";
@@ -507,7 +507,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ " <ram:OccurrenceDateTime>"; + " <ram:OccurrenceDateTime>";
if (trans.getDeliveryDate() != null) { if (trans.getDeliveryDate() != null) {
xml += DATE.udtFormat(trans.getDeliveryDate()); xml += DATE.udtFormat(trans.getDeliveryDate());
} else { } else {
throw new IllegalStateException("No delivery date provided"); throw new IllegalStateException("No delivery date provided");
} }
@@ -669,10 +669,10 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
xml = xml + " <ram:InvoiceReferencedDocument>\n" xml = xml + " <ram:InvoiceReferencedDocument>\n"
+ " <ram:IssuerAssignedID>" + " <ram:IssuerAssignedID>"
+ XMLTools.encodeXML(trans.getInvoiceReferencedDocumentID()) + "</ram:IssuerAssignedID>\n"; + XMLTools.encodeXML(trans.getInvoiceReferencedDocumentID()) + "</ram:IssuerAssignedID>\n";
if(trans.getInvoiceReferencedIssueDate()!= null){ if (trans.getInvoiceReferencedIssueDate() != null) {
xml += "<ram:FormattedIssueDateTime>" xml += "<ram:FormattedIssueDateTime>"
+ DATE.qdtFormat(trans.getInvoiceReferencedIssueDate()) + DATE.qdtFormat(trans.getInvoiceReferencedIssueDate())
+ "</ram:FormattedIssueDateTime>\n"; + "</ram:FormattedIssueDateTime>\n";
} }
xml += " </ram:InvoiceReferencedDocument>\n"; xml += " </ram:InvoiceReferencedDocument>\n";
} }
@@ -706,7 +706,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
private String buildPaymentTermsXml() { private String buildPaymentTermsXml() {
final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms(); final IZUGFeRDPaymentTerms paymentTerms = trans.getPaymentTerms();
if (paymentTerms == null) { if (paymentTerms == null) {
return ""; return "";
@@ -714,18 +713,27 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
String paymentTermsXml = "<ram:SpecifiedTradePaymentTerms>"; String paymentTermsXml = "<ram:SpecifiedTradePaymentTerms>";
final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms(); final IZUGFeRDPaymentDiscountTerms discountTerms = paymentTerms.getDiscountTerms();
final Date dueDate = paymentTerms.getDueDate(); Date dueDate = paymentTerms.getDueDate();
if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) { if (dueDate != null && discountTerms != null && discountTerms.getBaseDate() != null) {
throw new IllegalStateException( throw new IllegalStateException(
"if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified"); "if paymentTerms.dueDate is specified, paymentTerms.discountTerms.baseDate has not to be specified");
} }
paymentTermsXml += "<ram:Description>" + paymentTerms.getDescription() + "</ram:Description>"; paymentTermsXml += "<ram:Description>" + paymentTerms.getDescription() + "</ram:Description>";
if (dueDate != null) { if (dueDate != null) {
paymentTermsXml += "<ram:DueDateDateTime>"; paymentTermsXml += "<ram:DueDateDateTime>";
paymentTermsXml += DATE.udtFormat(dueDate) ; paymentTermsXml += DATE.udtFormat(dueDate);
paymentTermsXml += "</ram:DueDateDateTime>"; paymentTermsXml += "</ram:DueDateDateTime>";
} }
if (trans.getTradeSettlement() != null) {
for (final IZUGFeRDTradeSettlement payment : trans.getTradeSettlement()) {
if ((payment != null) && (payment instanceof IZUGFeRDTradeSettlementDebit)) {
paymentTermsXml += payment.getPaymentXML();
}
}
}
if (discountTerms != null) { if (discountTerms != null) {
paymentTermsXml += "<ram:ApplicableTradePaymentDiscountTerms>"; paymentTermsXml += "<ram:ApplicableTradePaymentDiscountTerms>";
final String currency = trans.getCurrency(); final String currency = trans.getCurrency();
@@ -737,7 +745,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
if (discountTerms.getBaseDate() != null) { if (discountTerms.getBaseDate() != null) {
final Date baseDate = discountTerms.getBaseDate(); final Date baseDate = discountTerms.getBaseDate();
paymentTermsXml += "<ram:BasisDateTime>"; paymentTermsXml += "<ram:BasisDateTime>";
paymentTermsXml += DATE.udtFormat(baseDate); paymentTermsXml += DATE.udtFormat(baseDate);
paymentTermsXml += "</ram:BasisDateTime>"; paymentTermsXml += "</ram:BasisDateTime>";
paymentTermsXml += "<ram:BasisPeriodMeasure unitCode=\"" + discountTerms.getBasePeriodUnitCode() + "\">" paymentTermsXml += "<ram:BasisPeriodMeasure unitCode=\"" + discountTerms.getBasePeriodUnitCode() + "\">"

View File

@@ -24,6 +24,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
@@ -172,7 +173,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
public IZUGFeRDExportableTradeParty getRecipient() { public IZUGFeRDExportableTradeParty getRecipient() {
return new RecipientTradeParty(); return new RecipientTradeParty();
} }
@Override @Override
public IZUGFeRDExportableTradeParty getDeliveryAddress() { public IZUGFeRDExportableTradeParty getDeliveryAddress() {
return new RecipientTradeParty(); return new RecipientTradeParty();
@@ -194,7 +195,7 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
EdgeProduct designProduct = new EdgeProduct("", "Künstlerische Gestaltung (Stunde): Einer Beispielrechnung", EdgeProduct designProduct = new EdgeProduct("", "Künstlerische Gestaltung (Stunde): Einer Beispielrechnung",
"HUR"); "HUR");
EdgeProduct balloonProduct = new EdgeProduct("", "Bestellerweiterung für E&F Umbau", "C62");// test for issue EdgeProduct balloonProduct = new EdgeProduct("", "Bestellerweiterung für E&F Umbau", "C62");// test for issue
// 103 // 103
EdgeProduct airProduct = new EdgeProduct("", "Heiße Luft pro Liter", "LTR"); EdgeProduct airProduct = new EdgeProduct("", "Heiße Luft pro Liter", "LTR");
Item design=new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct); Item design=new Item(new BigDecimal("160"), new BigDecimal("1"), designProduct);
@@ -211,6 +212,31 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
return "Zahlbar ohne Abzug bis zum " + germanDateFormat.format(getDueDate()); return "Zahlbar ohne Abzug bis zum " + germanDateFormat.format(getDueDate());
} }
@Override
public IZUGFeRDPaymentTerms getPaymentTerms() {
PaymentDiscountTerms paymentDiscountTerms =
new PaymentDiscountTerms(
new BigDecimal(2), // skonto prozent
null, // kein basedate
14, // anzahl tage
"DAYS");
Date due = null;
try {
due = new SimpleDateFormat("yyyyMMdd").parse("20220228");
} catch (ParseException e) {
e.printStackTrace();
}
return
new PaymentTerms(
"14 Tage 2% Skonto, 30 Tage rein netto",
due,// fälligkeitsdatum
paymentDiscountTerms //PaymentDiscountTerms
);
}
@Override @Override
public IZUGFeRDAllowanceCharge[] getZFAllowances() { public IZUGFeRDAllowanceCharge[] getZFAllowances() {
return null; return null;
@@ -264,8 +290,8 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); .getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application") ZUGFeRDExporterFromA1 ze = new ZUGFeRDExporterFromA1().setProducer("My Application")
.setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors() .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).setProfile(Profiles.getByName("Extended")).ignorePDFAErrors()
.load(SOURCE_PDF)) { .load(SOURCE_PDF)) {
ze.setTransaction(this); ze.setTransaction(this);
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8); String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice")); assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
@@ -276,14 +302,15 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
// now check the contents (like MustangReaderTest) // now check the contents (like MustangReaderTest)
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF); ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
String resultXML=zi.getUTF8();
assertTrue(zi.getUTF8().contains("<ram:TypeCode>59</ram:TypeCode>")); assertTrue(resultXML.contains("<ram:TypeCode>59</ram:TypeCode>"));
assertTrue(zi.getUTF8().contains("<ram:ShipToTradeParty>")); assertTrue(resultXML.contains("<ram:ShipToTradeParty>"));
assertTrue(zi.getUTF8().contains("<ram:IBANID>DE540815</ram:IBANID>")); assertTrue(resultXML.contains("<ram:IBANID>DE540815</ram:IBANID>"));
assertTrue(zi.getUTF8().contains("<ram:DirectDebitMandateID>DE99XX12345</ram:DirectDebitMandateID>")); assertTrue(resultXML.contains("<ram:ApplicableTradePaymentDiscountTerms"));
assertFalse(zi.getUTF8().contains("<ram:DueDateDateTime>")); assertTrue(resultXML.contains("<ram:DirectDebitMandateID>DE99XX12345</ram:DirectDebitMandateID>"));
assertFalse(zi.getUTF8().contains("EUR")); assertTrue(resultXML.contains("<ram:DueDateDateTime>"));
assertTrue(zi.getUTF8().contains("USD"));//currency should be USD, test for #150 assertFalse(resultXML.contains("EUR"));
assertTrue(resultXML.contains("USD"));//currency should be USD, test for #150
// Reading ZUGFeRD // Reading ZUGFeRD
assertEquals("496.00", zi.getAmount()); assertEquals("496.00", zi.getAmount());
@@ -311,9 +338,9 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
try (InputStream SOURCE_PDF = this.getClass() try (InputStream SOURCE_PDF = this.getClass()
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf"); .getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf");
IZUGFeRDExporter ze = new ZUGFeRDExporterFromA3().setProducer("My Application") IZUGFeRDExporter ze = new ZUGFeRDExporterFromA3().setProducer("My Application")
.setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).disableFacturX() .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).disableFacturX()
.load(SOURCE_PDF)) { .load(SOURCE_PDF)) {
ze.setTransaction(this); ze.setTransaction(this);
String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8); String theXML = new String(ze.getProvider().getXML(), StandardCharsets.UTF_8);
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice")); assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
@@ -324,4 +351,67 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
} }
private class PaymentDiscountTerms implements IZUGFeRDPaymentDiscountTerms {
protected BigDecimal percent;
protected Date baseDate;
protected int periodMeasure;
protected String periodCode;
public PaymentDiscountTerms(BigDecimal percent, Date baseDate, int periodMeasure, String periodCode) {
this.percent = percent;
this.baseDate = baseDate;
this.periodMeasure = periodMeasure;
this.periodCode = periodCode;
}
@Override
public BigDecimal getCalculationPercentage() {
return percent;
}
@Override
public Date getBaseDate() {
return baseDate;
}
@Override
public int getBasePeriodMeasure() {
return periodMeasure;
}
@Override
public String getBasePeriodUnitCode() {
return periodCode;
}
}
private class PaymentTerms implements IZUGFeRDPaymentTerms {
protected String description;
protected Date duedate;
protected IZUGFeRDPaymentDiscountTerms disco;
public PaymentTerms(String description, Date duedate, IZUGFeRDPaymentDiscountTerms disco) {
this.description = description;
this.duedate = duedate;
this.disco = disco;
}
@Override
public String getDescription() {
return description;
}
@Override
public Date getDueDate() {
return duedate;
}
@Override
public IZUGFeRDPaymentDiscountTerms getDiscountTerms() {
return disco;
}
}
} }

View File

@@ -371,6 +371,7 @@ public class ZF2PushTest extends TestCase {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try { try {
ze.setTransaction(new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()) ze.setTransaction(new Invoice().setCurrency("CHF").addNote("document level 1/2").addNote("document level 2/2").setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
.setDetailedDeliveryPeriod(new SimpleDateFormat("yyyyMMdd").parse(occurrenceFrom), new SimpleDateFormat("yyyyMMdd").parse(occurrenceTo)) .setDetailedDeliveryPeriod(new SimpleDateFormat("yyyyMMdd").parse(occurrenceFrom), new SimpleDateFormat("yyyyMMdd").parse(occurrenceTo))
.setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID).setID("0009845")) .setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").addTaxID(taxID).setID("0009845"))
@@ -396,6 +397,7 @@ public class ZF2PushTest extends TestCase {
// now check the contents (like MustangReaderTest) // now check the contents (like MustangReaderTest)
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PUSHEDGE); ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PUSHEDGE);
assertFalse(zi.getUTF8().contains("<ram:IBANID>")); // maybe add a direct debit mandate to the class in the future then this would fail
assertTrue(zi.getUTF8().contains("Hinterhaus")); assertTrue(zi.getUTF8().contains("Hinterhaus"));
assertTrue(zi.getUTF8().contains("0009845")); assertTrue(zi.getUTF8().contains("0009845"));
assertTrue(zi.getUTF8().contains("0008734")); assertTrue(zi.getUTF8().contains("0008734"));

View File

@@ -122,7 +122,7 @@
</plugins> </plugins>
</pluginManagement> </pluginManagement>
<plugins> <plugins>
<!-- be able to generate XSLT from XRechnung Schematron: uncomment this and "mvn generate-resources" if you have 20min to spare--> <!-- be able to generate XSLT from XRechnung Schematron: uncomment this and "mvn generate-resources" if you have 20min to spare
<plugin> <plugin>
<groupId>com.helger.maven</groupId> <groupId>com.helger.maven</groupId>
<artifactId>ph-schematron-maven-plugin</artifactId> <artifactId>ph-schematron-maven-plugin</artifactId>
@@ -139,6 +139,7 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
-->
<!-- allow getImplementationVersion for the pom.xml --> <!-- allow getImplementationVersion for the pom.xml -->
<plugin> <plugin>