adding bank details

This commit is contained in:
Jochen Stärk
2020-09-30 23:18:40 +02:00
parent 7dde7e7180
commit 0776960e24
12 changed files with 190 additions and 55 deletions

View File

@@ -36,9 +36,11 @@ switch
- new invoicecorrection class - new invoicecorrection class
- order-x read support - order-x read support
- automated tests zuv/verapdf validate created library test files - automated tests zuv/verapdf validate created library test files
- trans.getTradeSettlementPayment() removed in favor of trans.getTradeSettlement()
### 2.0 still todo ### 2.0 still todo
- dont show empty tax number field
- be able to specify iban via tradeparty object
- verapdf as prevalidation? - verapdf as prevalidation?
- visualization? zugferdvisualizer? - visualization? zugferdvisualizer?
- new sample invoice - new sample invoice
@@ -50,7 +52,6 @@ switch
- *from A3 does not seem tow ork see mustangreaderwriteredgetest:testedgeexport - *from A3 does not seem tow ork see mustangreaderwriteredgetest:testedgeexport
- xmp errors may not show correctly in log - xmp errors may not show correctly in log
- switch for no log and no notices - switch for no log and no notices
- homepage to be updated accordingly
- confirm correct generation from pdf/a3 files zf2edgetest - confirm correct generation from pdf/a3 files zf2edgetest
- *correctiontest exports zf1+zf2? - *correctiontest exports zf1+zf2?
- *USt 0% wird aus invoice-klasse noch nicht sauber abgefangen - *USt 0% wird aus invoice-klasse noch nicht sauber abgefangen

View File

@@ -0,0 +1,44 @@
package org.mustangproject;
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementPayment;
public class BankDetails implements IZUGFeRDTradeSettlementPayment {
protected String IBAN, BIC;
public BankDetails(String IBAN, String BIC) {
this.IBAN = IBAN;
this.BIC = BIC;
}
public String getIBAN() {
return IBAN;
}
public BankDetails setIBAN(String IBAN) {
this.IBAN = IBAN;
return this;
}
public String getBIC() {
return BIC;
}
public BankDetails setBIC(String BIC) {
this.BIC = BIC;
return this;
}
@Override
public String getOwnBIC() {
return getBIC();
}
@Override
public String getOwnIBAN() {
return getIBAN();
}
}

View File

@@ -41,7 +41,6 @@ public class Invoice implements IExportableTransaction {
protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<IZUGFeRDAllowanceCharge>(), protected ArrayList<IZUGFeRDAllowanceCharge> Allowances = new ArrayList<IZUGFeRDAllowanceCharge>(),
Charges = new ArrayList<IZUGFeRDAllowanceCharge>(), LogisticsServiceCharges = new ArrayList<IZUGFeRDAllowanceCharge>(); Charges = new ArrayList<IZUGFeRDAllowanceCharge>(), LogisticsServiceCharges = new ArrayList<IZUGFeRDAllowanceCharge>();
protected IZUGFeRDTradeSettlement[] getTradeSettlement = null;
protected IZUGFeRDPaymentTerms paymentTerms = null; protected IZUGFeRDPaymentTerms paymentTerms = null;
@@ -139,6 +138,8 @@ public class Invoice implements IExportableTransaction {
return shipToStreet; return shipToStreet;
} }
public Invoice setShipToStreet(String shipToStreet) { public Invoice setShipToStreet(String shipToStreet) {
this.shipToStreet = shipToStreet; this.shipToStreet = shipToStreet;
return this; return this;
@@ -346,6 +347,10 @@ public class Invoice implements IExportableTransaction {
public Invoice setSender(TradeParty sender) { public Invoice setSender(TradeParty sender) {
this.sender = sender; this.sender = sender;
if ((sender.getBankDetails()!=null)&&(sender.getBankDetails().size()>0)) {
// convert bankdetails
}
return this; return this;
} }
@@ -376,15 +381,18 @@ public class Invoice implements IExportableTransaction {
} }
public IZUGFeRDTradeSettlement[] getGetTradeSettlement() { @Override
return getTradeSettlement; public IZUGFeRDTradeSettlement[] getTradeSettlement() {
if (getSender()==null) {
return null;
} }
public Invoice setGetTradeSettlement(IZUGFeRDTradeSettlement[] getTradeSettlement) { return ((TradeParty)getSender()).getAsTradeSettlement();
this.getTradeSettlement = getTradeSettlement;
return this;
} }
@Override @Override
public IZUGFeRDPaymentTerms getPaymentTerms() { public IZUGFeRDPaymentTerms getPaymentTerms() {
return paymentTerms; return paymentTerms;

View File

@@ -2,11 +2,15 @@ package org.mustangproject;
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact;
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableTradeParty; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableTradeParty;
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlement;
import java.util.ArrayList;
public class TradeParty implements IZUGFeRDExportableTradeParty { public class TradeParty implements IZUGFeRDExportableTradeParty {
protected String name, zip, street, location, country; protected String name, zip, street, location, country;
protected String taxID = null, vatID = null; protected String taxID = null, vatID = null;
protected ArrayList<BankDetails> bankDetails = new ArrayList<BankDetails>();
protected Contact contact = null; protected Contact contact = null;
public TradeParty(String name, String street, String zip, String location, String country) { public TradeParty(String name, String street, String zip, String location, String country) {
@@ -22,7 +26,13 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
this.contact = c; this.contact = c;
return this; return this;
} }
public TradeParty addBankDetails(BankDetails s) {
bankDetails.add(s);
return this;
}
public ArrayList<BankDetails> getBankDetails() {
return bankDetails;
}
public TradeParty addTaxID(String taxID) { public TradeParty addTaxID(String taxID) {
this.taxID = taxID; this.taxID = taxID;
return this; return this;
@@ -105,4 +115,11 @@ public class TradeParty implements IZUGFeRDExportableTradeParty {
public IZUGFeRDExportableContact getContact() { public IZUGFeRDExportableContact getContact() {
return contact; return contact;
} }
public IZUGFeRDTradeSettlement[] getAsTradeSettlement() {
if (bankDetails.size()==0) {
return null;
}
return bankDetails.toArray(new IZUGFeRDTradeSettlement[0]);
}
} }

View File

@@ -116,6 +116,30 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
return res; return res;
} }
private BigDecimal getCharges() {
BigDecimal res = new BigDecimal(0);
IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges();
if ((charges!=null) && (charges.length>0)) {
for (IZUGFeRDAllowanceCharge currentCharge:charges) {
res=res.add(currentCharge.getTotalAmount(trans));
}
}
return res;
}
private BigDecimal getAllowances() {
BigDecimal res = new BigDecimal(0);
IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances();
if ((allowances!=null) && (allowances.length>0)) {
for (IZUGFeRDAllowanceCharge currentAllowance:allowances) {
res=res.add(currentAllowance.getTotalAmount(trans));
}
}
return res;
}
private BigDecimal getTotal() { private BigDecimal getTotal() {
BigDecimal res = new BigDecimal(0); BigDecimal res = new BigDecimal(0);
for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
@@ -125,6 +149,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
return res; return res;
} }
private BigDecimal getTaxBasis() {
BigDecimal res = getTotal().add(getCharges()).subtract(getAllowances());
return res;
}
/** /**
* which taxes have been used with which amounts in this transaction, empty for * which taxes have been used with which amounts in this transaction, empty for
* no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable to 19% VAT * no taxes, or e.g. 19=>190 and 7=>14 if 1000 Eur were applicable to 19% VAT
@@ -147,6 +176,31 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
hm.put(percent, current.add(itemVATAmount)); hm.put(percent, current.add(itemVATAmount));
} }
} }
IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges();
if ((charges!=null) && (charges.length>0)) {
for (IZUGFeRDAllowanceCharge currentCharge:charges) {
VATAmount theAmount=hm.get(currentCharge.getTaxPercent());
if (theAmount==null) {
theAmount=new VATAmount(new BigDecimal(0),new BigDecimal(0),"S");
}
theAmount.setCalculated(theAmount.getCalculated().add(currentCharge.getTotalAmount(trans)));
}
}
IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances();
if ((allowances!=null) && (allowances.length>0)) {
for (IZUGFeRDAllowanceCharge currentAllowance:allowances) {
VATAmount theAmount=hm.get(currentAllowance.getTaxPercent());
if (theAmount==null) {
theAmount=new VATAmount(new BigDecimal(0),new BigDecimal(0),"S");
}
theAmount.setCalculated(theAmount.getCalculated().subtract(currentAllowance.getTotalAmount(trans)));
}
}
return hm; return hm;
} }
@@ -461,6 +515,40 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
} }
if ((trans.getZFCharges()!=null)&&(trans.getZFCharges().length>0)) {
xml = xml + " <ram:SpecifiedTradeAllowanceCharge>\n" +
" <ram:ChargeIndicator>\n" +
" <udt:Indicator>true</udt:Indicator>\n" +
" </ram:ChargeIndicator>\n" +
" <ram:ActualAmount>"+currencyFormat(getCharges())+"</ram:ActualAmount>\n" +
" <ram:Reason>Charge</ram:Reason>\n" +
" <ram:CategoryTradeTax>\n" +
" <ram:TypeCode>VAT</ram:TypeCode>\n" +
" <ram:CategoryCode>S</ram:CategoryCode>\n" +
" <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>\n" +
" </ram:CategoryTradeTax>\n" +
" </ram:SpecifiedTradeAllowanceCharge> \n";
}
if ((trans.getZFAllowances()!=null)&&(trans.getZFAllowances().length>0)) {
xml = xml + " <ram:SpecifiedTradeAllowanceCharge>\n" +
" <ram:ChargeIndicator>\n" +
" <udt:Indicator>false</udt:Indicator>\n" +
" </ram:ChargeIndicator>\n" +
" <ram:ActualAmount>"+currencyFormat(getAllowances())+"</ram:ActualAmount>\n" +
" <ram:Reason>Allowance</ram:Reason>\n" +
" <ram:CategoryTradeTax>\n" +
" <ram:TypeCode>VAT</ram:TypeCode>\n" +
" <ram:CategoryCode>S</ram:CategoryCode>\n" +
" <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>\n" +
" </ram:CategoryTradeTax>\n" +
" </ram:SpecifiedTradeAllowanceCharge> \n";
}
if (trans.getPaymentTerms() == null) { if (trans.getPaymentTerms() == null) {
xml = xml + " <ram:SpecifiedTradePaymentTerms>\n" xml = xml + " <ram:SpecifiedTradePaymentTerms>\n"
+ " <ram:Description>" + paymentTermsDescription + "</ram:Description>\n"; + " <ram:Description>" + paymentTermsDescription + "</ram:Description>\n";
@@ -485,31 +573,16 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
String chargeTotalLine="";
IZUGFeRDAllowanceCharge[] allowances= trans.getZFAllowances(); String allowanceTotalLine="<ram:AllowanceTotalAmount>"+currencyFormat(getAllowances())+"</ram:AllowanceTotalAmount>";
BigDecimal allowanceTotal=new BigDecimal(0);
if ((allowances!=null) && (allowances.length>0)) {
for (IZUGFeRDAllowanceCharge currentAllowance:allowances) {
allowanceTotal=allowanceTotal.add(currentAllowance.getTotalAmount(trans));
}
}
String allowanceTotalLine="<ram:AllowanceTotalAmount currencyID=\"+trans.getCurrency()+\">"+currencyFormat(allowanceTotal)+"</ram:AllowanceTotalAmount>";
IZUGFeRDAllowanceCharge[] charges= trans.getZFCharges(); String chargesTotalLine="<ram:ChargeTotalAmount>"+currencyFormat(getCharges())+"</ram:ChargeTotalAmount>";
BigDecimal chargesTotal=new BigDecimal(0);
if ((charges!=null) && (charges.length>0)) {
for (IZUGFeRDAllowanceCharge currentCharge:charges) {
chargesTotal=chargesTotal.add(currentCharge.getTotalAmount(trans));
}
}
String chargesTotalLine="<ram:ChargeTotalAmount currencyID=\""+trans.getCurrency()+"\">"+currencyFormat(chargesTotal)+"</ram:ChargeTotalAmount>";
xml = xml + " <ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n" xml = xml + " <ram:SpecifiedTradeSettlementHeaderMonetarySummation>\n"
+ " <ram:LineTotalAmount>" + currencyFormat(getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-2$ + " <ram:LineTotalAmount>" + currencyFormat(getTotal()) + "</ram:LineTotalAmount>\n" //$NON-NLS-2$
+ chargesTotalLine + chargesTotalLine
+ allowanceTotalLine + allowanceTotalLine
+ " <ram:TaxBasisTotalAmount>" + currencyFormat(getTotal()) + "</ram:TaxBasisTotalAmount>\n" //$NON-NLS-2$ + " <ram:TaxBasisTotalAmount>" + currencyFormat(getTaxBasis()) + "</ram:TaxBasisTotalAmount>\n" //$NON-NLS-2$
// // // //
// currencyID=\"EUR\" // currencyID=\"EUR\"
+ " <ram:TaxTotalAmount currencyID=\"" + trans.getCurrency() + "\">" + " <ram:TaxTotalAmount currencyID=\"" + trans.getCurrency() + "\">"

View File

@@ -90,11 +90,6 @@ public class IExportableTransactionImpl implements IExportableTransaction {
return recipient; return recipient;
} }
@Override
public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() {
return settlementPayments;
}
@Override @Override
public String getOwnTaxID() { public String getOwnTaxID() {
return ownTaxID; return ownTaxID;

View File

@@ -30,7 +30,7 @@ public abstract class MustangReaderTestCase extends TestCase implements IExporta
@Override @Override
public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() { public IZUGFeRDTradeSettlement[] getTradeSettlement() {
Payment[] payments = new Payment[1]; Payment[] payments = new Payment[1];
payments[0] = new Payment(); payments[0] = new Payment();
return payments; return payments;

View File

@@ -181,8 +181,8 @@ public class MustangReaderWriterEdgeTest 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(), "COBADEFFXXX");
assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());
assertEquals(zi.getDueDate(), "20170530"); assertEquals(zi.getDueDate(), "20170530");
assertEquals(zi.getForeignReference(), getNumber()); assertEquals(zi.getForeignReference(), getNumber());
@@ -223,8 +223,8 @@ public class MustangReaderWriterEdgeTest extends MustangReaderTestCase {
// Reading ZUGFeRD // Reading ZUGFeRD
assertEquals("571.04", zi.getAmount()); assertEquals("571.04", zi.getAmount());
assertEquals(getTradeSettlementPayment()[0].getOwnBIC(), zi.getBIC()); assertEquals("COBADEFFXXX", zi.getBIC());
assertEquals(getTradeSettlementPayment()[0].getOwnIBAN(), zi.getIBAN()); assertEquals("DE88 2008 0000 0970 3757 00", zi.getIBAN());
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());
assertEquals(zi.getForeignReference(), getNumber()); assertEquals(zi.getForeignReference(), getNumber());
try { try {

View File

@@ -196,8 +196,8 @@ 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(), "COBADEFFXXX");
assertEquals(zi.getIBAN(),getTradeSettlementPayment()[0].getOwnIBAN()); assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());
assertEquals(zi.getForeignReference(), "RE-20170509/505"); assertEquals(zi.getForeignReference(), "RE-20170509/505");
assertEquals(zi.getBankName(), "Commerzbank"); assertEquals(zi.getBankName(), "Commerzbank");
@@ -383,9 +383,9 @@ 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(), "COBADEFFXXX");
assertEquals(zi.getReference(), getReferenceNumber()); assertEquals(zi.getReference(), getReferenceNumber());
assertEquals(zi.getIBAN(), getTradeSettlementPayment()[0].getOwnIBAN()); assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());
assertEquals(zi.getForeignReference(), getNumber()); assertEquals(zi.getForeignReference(), getNumber());
} }
@@ -460,8 +460,8 @@ public class MustangReaderWriterTest extends MustangReaderTestCase {
// Reading ZUGFeRD // Reading ZUGFeRD
assertEquals("571.04", zi.getAmount()); assertEquals("571.04", zi.getAmount());
assertEquals(getTradeSettlementPayment()[0].getOwnBIC(), zi.getBIC()); assertEquals("COBADEFFXXX", zi.getBIC());
assertEquals(getTradeSettlementPayment()[0].getOwnIBAN(), zi.getIBAN()); assertEquals("DE88 2008 0000 0970 3757 00", zi.getIBAN());
assertEquals(getOwnOrganisationName(), zi.getHolder()); assertEquals(getOwnOrganisationName(), zi.getHolder());
assertEquals(getNumber(), zi.getForeignReference()); assertEquals(getNumber(), zi.getForeignReference());
} }

View File

@@ -100,11 +100,6 @@ public class ZF2EdgeTest extends MustangReaderTestCase implements IExportableTra
} }
@Override
public IZUGFeRDTradeSettlementPayment[] getTradeSettlementPayment() {
return null;
}
@Override @Override
public IZUGFeRDTradeSettlement[] getTradeSettlement() { public IZUGFeRDTradeSettlement[] getTradeSettlement() {
IZUGFeRDTradeSettlement[] payments = new DebitPayment[1]; IZUGFeRDTradeSettlement[] payments = new DebitPayment[1];

View File

@@ -54,9 +54,10 @@ public class ZF2PushTest extends TestCase {
.setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors() .setCreator(System.getProperty("user.name")).setZUGFeRDVersion(2).ignorePDFAErrors()
.load(SOURCE_PDF)) { .load(SOURCE_PDF)) {
ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setContractReferencedDocument("0815").setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE")).setOwnTaxID("4711").setOwnVATID("DE19990815").setRecipient(new TradeParty("Franz Müller","teststr.12", "55232", "Entenhausen", "DE").setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0)))); ze.setTransaction(new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date()).setContractReferencedDocument("0815").setSender(new TradeParty(orgname,"teststr", "55232","teststadt","DE").addBankDetails(new BankDetails("777666555","DE4321"))).setOwnTaxID("4711").setOwnVATID("DE19990815").setRecipient(new TradeParty("Franz Müller","teststr.12", "55232", "Entenhausen", "DE").setContact(new Contact("nameRep", "phoneRep", "emailRep@test.com"))).setNumber(number).addItem(new Item(new Product("Testprodukt", "", "C62", new BigDecimal(19)), amount, new BigDecimal(1.0))));
String theXML = new String(ze.getProvider().getXML()); String theXML = new String(ze.getProvider().getXML());
assertTrue(theXML.contains("<rsm:CrossIndustryInvoice")); // assertTrue(theXML.contains("777666555")); //the iban
// assertTrue(theXML.contains("<rsm:CrossIndustryInvoice"));
ze.export(TARGET_PDF); ze.export(TARGET_PDF);
} catch (IOException e) { } catch (IOException e) {
fail("IOException should not be raised in testEdgeExport"); fail("IOException should not be raised in testEdgeExport");
@@ -207,7 +208,8 @@ public class ZF2PushTest extends TestCase {
assertFalse(zi.getUTF8().contains("EUR")); assertFalse(zi.getUTF8().contains("EUR"));
// Reading ZUGFeRD // Reading ZUGFeRD
assertEquals("11.07", zi.getAmount()); // assertEquals("11.07", zi.getAmount());
assertEquals("10.71", zi.getAmount());
assertEquals(zi.getHolder(), orgname); assertEquals(zi.getHolder(), orgname);
assertEquals(zi.getForeignReference(), number); assertEquals(zi.getForeignReference(), number);
try { try {

View File

@@ -208,8 +208,8 @@ public class ZF2Test extends MustangReaderTestCase {
assertEquals(zi.getDocumentCode(),"380"); assertEquals(zi.getDocumentCode(),"380");
assertEquals(zi.getReference(),"AB321"); assertEquals(zi.getReference(),"AB321");
assertEquals(zi.getAmount(), "571.04"); assertEquals(zi.getAmount(), "571.04");
assertEquals(zi.getBIC(), getTradeSettlementPayment()[0].getOwnBIC()); assertEquals(zi.getBIC(), "COBADEFFXXX");
assertEquals(zi.getIBAN(),getTradeSettlementPayment()[0].getOwnIBAN()); assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
assertEquals(zi.getHolder(), getOwnOrganisationName()); assertEquals(zi.getHolder(), getOwnOrganisationName());
assertEquals(zi.getForeignReference(), getNumber()); assertEquals(zi.getForeignReference(), getNumber());
assertEquals(zi.getBuyerTradePartyAddress().getPostcodeCode(), "88802"); assertEquals(zi.getBuyerTradePartyAddress().getPostcodeCode(), "88802");