Merge pull request #432 from langfr/feature/430

Enhance Charges/Allowances with reasonCode.
This commit is contained in:
Jochen Staerk
2024-08-02 15:52:41 +02:00
committed by GitHub
5 changed files with 178 additions and 69 deletions

View File

@@ -26,6 +26,10 @@ public class Charge implements IZUGFeRDAllowanceCharge {
* a simple human readable description * a simple human readable description
*/ */
protected String reason; protected String reason;
/**
* Code from list UNTDID 5189
*/
protected String reasonCode;
/** /**
* the category ID why this charge has been applied * the category ID why this charge has been applied
*/ */
@@ -94,6 +98,22 @@ public class Charge implements IZUGFeRDAllowanceCharge {
} }
@Override
public String getReasonCode() {
return reasonCode;
}
/***
* Reason code for the charge
* @param reasonCode from list UNTDID 5189
* @return fluid setter
*/
public Charge setReasonCode(String reasonCode) {
this.reasonCode = reasonCode;
return this;
}
@Override @Override
public BigDecimal getTotalAmount(IAbsoluteValueProvider currentItem) { public BigDecimal getTotalAmount(IAbsoluteValueProvider currentItem) {
if (totalAmount!=null) { if (totalAmount!=null) {
@@ -137,7 +157,7 @@ public class Charge implements IZUGFeRDAllowanceCharge {
/*** /***
* machine readable reason for this allowance/charge * the category ID why this has been applied
* @param categoryCode usually S * @param categoryCode usually S
* @return fluid setter * @return fluid setter
*/ */

View File

@@ -44,6 +44,12 @@ public interface IZUGFeRDAllowanceCharge {
*/ */
String getReason(); String getReason();
/***
* get the code for the allowance/charge
* @return the code
*/
String getReasonCode();
/*** /***
* get the applicable tax percentage for the allowance/charge * get the applicable tax percentage for the allowance/charge
* @return the percentage * @return the percentage

View File

@@ -141,7 +141,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
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>";
} }
@@ -244,10 +244,16 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
// only in extended profile // only in extended profile
reason = "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>"; reason = "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>";
} }
String reasonCode = "";
if ((allowance.getReasonCode() != null) && (profile == Profiles.getByName("XRechnung"))) {
// only in XRechnung profile
reasonCode = "<ram:ReasonCode>" + allowance.getReasonCode() + "</ram:ReasonCode>";
}
final String allowanceChargeStr = "<ram:AppliedTradeAllowanceCharge><ram:ChargeIndicator><udt:Indicator>" + final String allowanceChargeStr = "<ram:AppliedTradeAllowanceCharge><ram:ChargeIndicator><udt:Indicator>" +
chargeIndicator + "</udt:Indicator></ram:ChargeIndicator>" + percentage + chargeIndicator + "</udt:Indicator></ram:ChargeIndicator>" + percentage +
"<ram:ActualAmount>" + priceFormat(allowance.getTotalAmount(item)) + "</ram:ActualAmount>" + "<ram:ActualAmount>" + priceFormat(allowance.getTotalAmount(item)) + "</ram:ActualAmount>" +
reason + reason +
reasonCode +
"</ram:AppliedTradeAllowanceCharge>"; "</ram:AppliedTradeAllowanceCharge>";
return allowanceChargeStr; return allowanceChargeStr;
} }
@@ -269,10 +275,21 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
chargeIndicator = "true"; chargeIndicator = "true";
} }
String reason = "";
if ((allowance.getReason() != null) && (profile == Profiles.getByName("Extended"))) {
// only in extended profile
reason = "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>";
}
String reasonCode = "";
if ((allowance.getReasonCode() != null) && (profile == Profiles.getByName("XRechnung"))) {
// only in XRechnung profile
reasonCode = "<ram:ReasonCode>" + allowance.getReasonCode() + "</ram:ReasonCode>";
}
final String itemTotalAllowanceChargeStr = "<ram:SpecifiedTradeAllowanceCharge><ram:ChargeIndicator><udt:Indicator>" + final String itemTotalAllowanceChargeStr = "<ram:SpecifiedTradeAllowanceCharge><ram:ChargeIndicator><udt:Indicator>" +
chargeIndicator + "</udt:Indicator></ram:ChargeIndicator>" + percentage + chargeIndicator + "</udt:Indicator></ram:ChargeIndicator>" + percentage +
"<ram:ActualAmount>" + currencyFormat(allowance.getTotalAmount(item)) + "</ram:ActualAmount>" + "<ram:ActualAmount>" + currencyFormat(allowance.getTotalAmount(item)) + "</ram:ActualAmount>" +
"<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>" + reason +
reasonCode +
"</ram:SpecifiedTradeAllowanceCharge>"; "</ram:SpecifiedTradeAllowanceCharge>";
return itemTotalAllowanceChargeStr; return itemTotalAllowanceChargeStr;
} }
@@ -325,9 +342,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
// //
if (getProfile() == Profiles.getByName("XRechnung")) { if (getProfile() == Profiles.getByName("XRechnung")) {
xml += " <ram:BusinessProcessSpecifiedDocumentContextParameter>\n" xml += "<ram:BusinessProcessSpecifiedDocumentContextParameter>\n"
+ " <ram:ID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</ram:ID>\n" + "<ram:ID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</ram:ID>\n"
+ " </ram:BusinessProcessSpecifiedDocumentContextParameter>\n"; + "</ram:BusinessProcessSpecifiedDocumentContextParameter>\n";
} }
xml += xml +=
"<ram:GuidelineSpecifiedDocumentContextParameter>" "<ram:GuidelineSpecifiedDocumentContextParameter>"
@@ -336,7 +353,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ "</rsm:ExchangedDocumentContext>" + "</rsm:ExchangedDocumentContext>"
+ "<rsm:ExchangedDocument>" + "<rsm:ExchangedDocument>"
+ "<ram:ID>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:ID>" + "<ram:ID>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:ID>"
// + " <ram:Name>RECHNUNG</ram:Name>" // + "<ram:Name>RECHNUNG</ram:Name>"
// + "<ram:TypeCode>380</ram:TypeCode>" // + "<ram:TypeCode>380</ram:TypeCode>"
+ "<ram:TypeCode>" + typecode + "</ram:TypeCode>" + "<ram:TypeCode>" + typecode + "</ram:TypeCode>"
+ "<ram:IssueDateTime>" + "<ram:IssueDateTime>"
@@ -436,11 +453,11 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ "<ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit()) + "<ram:BasisQuantity unitCode=\"" + XMLTools.encodeXML(currentItem.getProduct().getUnit())
+ "\">" + quantityFormat(currentItem.getBasisQuantity()) + "</ram:BasisQuantity>" + "\">" + quantityFormat(currentItem.getBasisQuantity()) + "</ram:BasisQuantity>"
+ allowanceChargeStr + allowanceChargeStr
// + " <AppliedTradeAllowanceCharge>" // + "<AppliedTradeAllowanceCharge>"
// + " <ChargeIndicator>false</ChargeIndicator>" // + "<ChargeIndicator>false</ChargeIndicator>"
// + " <ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>" // + "<ActualAmount currencyID=\"EUR\">0.6667</ActualAmount>"
// + " <Reason>Rabatt</Reason>" // + "<Reason>Rabatt</Reason>"
// + " </AppliedTradeAllowanceCharge>" // + "</AppliedTradeAllowanceCharge>"
+ "</ram:GrossPriceProductTradePrice>"; + "</ram:GrossPriceProductTradePrice>";
} }
@@ -499,53 +516,53 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ getTradePartyAsXML(trans.getSender(), true, false) + getTradePartyAsXML(trans.getSender(), true, false)
+ "</ram:SellerTradeParty>" + "</ram:SellerTradeParty>"
+ "<ram:BuyerTradeParty>"; + "<ram:BuyerTradeParty>";
// + " <ID>GE2020211</ID>" // + "<ID>GE2020211</ID>"
// + " <GlobalID schemeID=\"0088\">4000001987658</GlobalID>" // + "<GlobalID schemeID=\"0088\">4000001987658</GlobalID>"
xml += getTradePartyAsXML(trans.getRecipient(), false, false); xml += getTradePartyAsXML(trans.getRecipient(), false, false);
xml += "</ram:BuyerTradeParty>"; xml += "</ram:BuyerTradeParty>";
if (trans.getSellerOrderReferencedDocumentID() != null) { if (trans.getSellerOrderReferencedDocumentID() != null) {
xml += " <ram:SellerOrderReferencedDocument>" xml += "<ram:SellerOrderReferencedDocument>"
+ " <ram:IssuerAssignedID>" + "<ram:IssuerAssignedID>"
+ XMLTools.encodeXML(trans.getSellerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>" + XMLTools.encodeXML(trans.getSellerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>"
+ " </ram:SellerOrderReferencedDocument>"; + "</ram:SellerOrderReferencedDocument>";
} }
if (trans.getBuyerOrderReferencedDocumentID() != null) { if (trans.getBuyerOrderReferencedDocumentID() != null) {
xml += " <ram:BuyerOrderReferencedDocument>" xml += "<ram:BuyerOrderReferencedDocument>"
+ " <ram:IssuerAssignedID>" + "<ram:IssuerAssignedID>"
+ XMLTools.encodeXML(trans.getBuyerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>" + XMLTools.encodeXML(trans.getBuyerOrderReferencedDocumentID()) + "</ram:IssuerAssignedID>"
+ " </ram:BuyerOrderReferencedDocument>"; + "</ram:BuyerOrderReferencedDocument>";
} }
if (trans.getContractReferencedDocument() != null) { if (trans.getContractReferencedDocument() != null) {
xml += " <ram:ContractReferencedDocument>" xml += "<ram:ContractReferencedDocument>"
+ " <ram:IssuerAssignedID>" + "<ram:IssuerAssignedID>"
+ XMLTools.encodeXML(trans.getContractReferencedDocument()) + "</ram:IssuerAssignedID>" + XMLTools.encodeXML(trans.getContractReferencedDocument()) + "</ram:IssuerAssignedID>"
+ " </ram:ContractReferencedDocument>"; + "</ram:ContractReferencedDocument>";
} }
// Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung) // Additional Documents of XRechnung (Rechnungsbegruendende Unterlagen - BG-24 XRechnung)
if (trans.getAdditionalReferencedDocuments() != null) { if (trans.getAdditionalReferencedDocuments() != null) {
for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) { for (final FileAttachment f : trans.getAdditionalReferencedDocuments()) {
final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData())); final String documentContent = new String(Base64.getEncoder().encodeToString(f.getData()));
xml += " <ram:AdditionalReferencedDocument>" xml += "<ram:AdditionalReferencedDocument>"
+ " <ram:IssuerAssignedID>" + f.getFilename() + "</ram:IssuerAssignedID>" + "<ram:IssuerAssignedID>" + f.getFilename() + "</ram:IssuerAssignedID>"
+ " <ram:TypeCode>916</ram:TypeCode>" + "<ram:TypeCode>916</ram:TypeCode>"
+ " <ram:Name>" + f.getDescription() + "</ram:Name>" + "<ram:Name>" + f.getDescription() + "</ram:Name>"
+ " <ram:AttachmentBinaryObject mimeCode=\"" + f.getMimetype() + "\"\n" + "<ram:AttachmentBinaryObject mimeCode=\"" + f.getMimetype() + "\"\n"
+ " filename=\"" + f.getFilename() + "\">" + documentContent + "</ram:AttachmentBinaryObject>" + "filename=\"" + f.getFilename() + "\">" + documentContent + "</ram:AttachmentBinaryObject>"
+ " </ram:AdditionalReferencedDocument>"; + "</ram:AdditionalReferencedDocument>";
} }
} }
if (trans.getSpecifiedProcuringProjectID() != null) { if (trans.getSpecifiedProcuringProjectID() != null) {
xml += " <ram:SpecifiedProcuringProject>" xml += "<ram:SpecifiedProcuringProject>"
+ " <ram:ID>" + "<ram:ID>"
+ XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "</ram:ID>"; + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectID()) + "</ram:ID>";
if (trans.getSpecifiedProcuringProjectName() != null) { if (trans.getSpecifiedProcuringProjectName() != null) {
xml += " <ram:Name >" + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectName()) + "</ram:Name>"; xml += "<ram:Name>" + XMLTools.encodeXML(trans.getSpecifiedProcuringProjectName()) + "</ram:Name>";
} }
xml += " </ram:SpecifiedProcuringProject>"; xml += "</ram:SpecifiedProcuringProject>";
} }
xml += "</ram:ApplicableHeaderTradeAgreement>"; xml += "</ram:ApplicableHeaderTradeAgreement>";
xml += "<ram:ApplicableHeaderTradeDelivery>"; xml += "<ram:ApplicableHeaderTradeDelivery>";
@@ -562,7 +579,7 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
+ "<ram:OccurrenceDateTime>"; + "<ram:OccurrenceDateTime>";
xml += DATE.udtFormat(trans.getDeliveryDate()); xml += DATE.udtFormat(trans.getDeliveryDate());
xml += "</ram:OccurrenceDateTime>"; xml += "</ram:OccurrenceDateTime>";
xml += " </ram:ActualDeliverySupplyChainEvent>"; xml += "</ram:ActualDeliverySupplyChainEvent>";
} }
/* /*
@@ -581,9 +598,9 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
xml += "</ram:ApplicableHeaderTradeDelivery>"; xml += "</ram:ApplicableHeaderTradeDelivery>";
xml += "<ram:ApplicableHeaderTradeSettlement>"; xml += "<ram:ApplicableHeaderTradeSettlement>";
if ((trans.getNumber() != null) && (getProfile() != Profiles.getByName("Minimum"))) { if ((trans.getNumber() != null) && (getProfile() != Profiles.getByName("Minimum"))) {
xml += " <ram:PaymentReference>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:PaymentReference>"; xml += "<ram:PaymentReference>" + XMLTools.encodeXML(trans.getNumber()) + "</ram:PaymentReference>";
} }
xml += " <ram:InvoiceCurrencyCode>" + trans.getCurrency() + "</ram:InvoiceCurrencyCode>"; xml += "<ram:InvoiceCurrencyCode>" + trans.getCurrency() + "</ram:InvoiceCurrencyCode>";
if (trans.getTradeSettlementPayment() != null) { if (trans.getTradeSettlementPayment() != null) {
for (final IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) { for (final IZUGFeRDTradeSettlementPayment payment : trans.getTradeSettlementPayment()) {
@@ -645,10 +662,32 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
} }
if ((trans.getZFCharges() != null) && (trans.getZFCharges().length > 0)) { if ((trans.getZFCharges() != null) && (trans.getZFCharges().length > 0)) {
if (profile == Profiles.getByName("XRechnung")) {
for(IZUGFeRDAllowanceCharge charge : trans.getZFCharges()) {
xml += "<ram:SpecifiedTradeAllowanceCharge>" +
"<ram:ChargeIndicator>" +
"<udt:Indicator>true</udt:Indicator>" +
"</ram:ChargeIndicator>" +
"<ram:ActualAmount>" + currencyFormat(charge.getTotalAmount(calc)) + "</ram:ActualAmount>";
if (charge.getReason() != null) {
xml += "<ram:Reason>" + XMLTools.encodeXML(charge.getReason()) + "</ram:Reason>";
}
if (charge.getReasonCode() != null) {
xml += "<ram:ReasonCode>" + charge.getReasonCode() + "</ram:ReasonCode>";
}
xml += "<ram:CategoryTradeTax>" +
"<ram:TypeCode>VAT</ram:TypeCode>" +
"<ram:CategoryCode>" + charge.getCategoryCode() + "</ram:CategoryCode>";
if (charge.getTaxPercent() != null) {
xml += "<ram:RateApplicablePercent>" + vatFormat(charge.getTaxPercent()) + "</ram:RateApplicablePercent>";
}
xml += "</ram:CategoryTradeTax>" +
"</ram:SpecifiedTradeAllowanceCharge>";
}
} else {
for (final BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { for (final BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) {
if (calc.getChargesForPercent(currentTaxPercent).compareTo(BigDecimal.ZERO) != 0) { if (calc.getChargesForPercent(currentTaxPercent).compareTo(BigDecimal.ZERO) != 0) {
xml += " <ram:SpecifiedTradeAllowanceCharge>" + xml += "<ram:SpecifiedTradeAllowanceCharge>" +
"<ram:ChargeIndicator>" + "<ram:ChargeIndicator>" +
"<udt:Indicator>true</udt:Indicator>" + "<udt:Indicator>true</udt:Indicator>" +
"</ram:ChargeIndicator>" + "</ram:ChargeIndicator>" +
@@ -659,12 +698,36 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
"<ram:CategoryCode>" + VATPercentAmountMap.get(currentTaxPercent).getCategoryCode() + "</ram:CategoryCode>" + "<ram:CategoryCode>" + VATPercentAmountMap.get(currentTaxPercent).getCategoryCode() + "</ram:CategoryCode>" +
"<ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) + "</ram:RateApplicablePercent>" + "<ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) + "</ram:RateApplicablePercent>" +
"</ram:CategoryTradeTax>" + "</ram:CategoryTradeTax>" +
"</ram:SpecifiedTradeAllowanceCharge> "; "</ram:SpecifiedTradeAllowanceCharge>";
}
} }
} }
} }
if ((trans.getZFAllowances() != null) && (trans.getZFAllowances().length > 0)) { if ((trans.getZFAllowances() != null) && (trans.getZFAllowances().length > 0)) {
if (profile == Profiles.getByName("XRechnung")) {
for(IZUGFeRDAllowanceCharge allowance : trans.getZFAllowances()) {
xml += "<ram:SpecifiedTradeAllowanceCharge>" +
"<ram:ChargeIndicator>" +
"<udt:Indicator>false</udt:Indicator>" +
"</ram:ChargeIndicator>" +
"<ram:ActualAmount>" + currencyFormat(allowance.getTotalAmount(calc)) + "</ram:ActualAmount>";
if (allowance.getReason() != null) {
xml += "<ram:Reason>" + XMLTools.encodeXML(allowance.getReason()) + "</ram:Reason>";
}
if (allowance.getReasonCode() != null) {
xml += "<ram:ReasonCode>" + allowance.getReasonCode() + "</ram:ReasonCode>";
}
xml += "<ram:CategoryTradeTax>" +
"<ram:TypeCode>VAT</ram:TypeCode>" +
"<ram:CategoryCode>" + allowance.getCategoryCode() + "</ram:CategoryCode>";
if (allowance.getTaxPercent() != null) {
xml += "<ram:RateApplicablePercent>" + vatFormat(allowance.getTaxPercent()) + "</ram:RateApplicablePercent>";
}
xml += "</ram:CategoryTradeTax>" +
"</ram:SpecifiedTradeAllowanceCharge>";
}
} else {
for (final BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { for (final BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) {
if (calc.getAllowancesForPercent(currentTaxPercent).compareTo(BigDecimal.ZERO) != 0) { if (calc.getAllowancesForPercent(currentTaxPercent).compareTo(BigDecimal.ZERO) != 0) {
xml += "<ram:SpecifiedTradeAllowanceCharge>" + xml += "<ram:SpecifiedTradeAllowanceCharge>" +
@@ -678,7 +741,8 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
"<ram:CategoryCode>" + VATPercentAmountMap.get(currentTaxPercent).getCategoryCode() + "</ram:CategoryCode>" + "<ram:CategoryCode>" + VATPercentAmountMap.get(currentTaxPercent).getCategoryCode() + "</ram:CategoryCode>" +
"<ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) + "</ram:RateApplicablePercent>" + "<ram:RateApplicablePercent>" + vatFormat(currentTaxPercent) + "</ram:RateApplicablePercent>" +
"</ram:CategoryTradeTax>" + "</ram:CategoryTradeTax>" +
"</ram:SpecifiedTradeAllowanceCharge> "; "</ram:SpecifiedTradeAllowanceCharge>";
}
} }
} }
} }
@@ -736,31 +800,31 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
// // // //
// currencyID=\"EUR\" // currencyID=\"EUR\"
if (getProfile() != Profiles.getByName("Minimum")) { if (getProfile() != Profiles.getByName("Minimum")) {
xml += " <ram:TotalPrepaidAmount>" + currencyFormat(calc.getTotalPrepaid()) + "</ram:TotalPrepaidAmount>"; xml += "<ram:TotalPrepaidAmount>" + currencyFormat(calc.getTotalPrepaid()) + "</ram:TotalPrepaidAmount>";
} }
xml += "<ram:DuePayableAmount>" + currencyFormat(calc.getGrandTotal().subtract(calc.getTotalPrepaid())) + "</ram:DuePayableAmount>" xml += "<ram:DuePayableAmount>" + currencyFormat(calc.getGrandTotal().subtract(calc.getTotalPrepaid())) + "</ram:DuePayableAmount>"
+ "</ram:SpecifiedTradeSettlementHeaderMonetarySummation>"; + "</ram:SpecifiedTradeSettlementHeaderMonetarySummation>";
if (trans.getInvoiceReferencedDocumentID() != null) { if (trans.getInvoiceReferencedDocumentID() != null) {
xml += " <ram:InvoiceReferencedDocument>" xml += "<ram:InvoiceReferencedDocument>"
+ " <ram:IssuerAssignedID>" + "<ram:IssuerAssignedID>"
+ XMLTools.encodeXML(trans.getInvoiceReferencedDocumentID()) + "</ram:IssuerAssignedID>"; + XMLTools.encodeXML(trans.getInvoiceReferencedDocumentID()) + "</ram:IssuerAssignedID>";
if (trans.getInvoiceReferencedIssueDate() != null) { if (trans.getInvoiceReferencedIssueDate() != null) {
xml += "<ram:FormattedIssueDateTime>" xml += "<ram:FormattedIssueDateTime>"
+ DATE.qdtFormat(trans.getInvoiceReferencedIssueDate()) + DATE.qdtFormat(trans.getInvoiceReferencedIssueDate())
+ "</ram:FormattedIssueDateTime>"; + "</ram:FormattedIssueDateTime>";
} }
xml += " </ram:InvoiceReferencedDocument>"; xml += "</ram:InvoiceReferencedDocument>";
} }
xml += "</ram:ApplicableHeaderTradeSettlement>"; xml += "</ram:ApplicableHeaderTradeSettlement>";
// + " <IncludedSupplyChainTradeLineItem>\n" // + "<IncludedSupplyChainTradeLineItem>\n"
// + " <AssociatedDocumentLineDocument>\n" // + "<AssociatedDocumentLineDocument>\n"
// + " <IncludedNote>\n" // + "<IncludedNote>\n"
// + " <Content>Wir erlauben uns Ihnen folgende Positionen aus der Lieferung Nr. // + "<Content>Wir erlauben uns Ihnen folgende Positionen aus der Lieferung Nr.
// 2013-51112 in Rechnung zu stellen:</Content>\n" // 2013-51112 in Rechnung zu stellen:</Content>\n"
// + " </IncludedNote>\n" // + "</IncludedNote>\n"
// + " </AssociatedDocumentLineDocument>\n" // + "</AssociatedDocumentLineDocument>\n"
// + " </IncludedSupplyChainTradeLineItem>\n"; // + "</IncludedSupplyChainTradeLineItem>\n";
xml += "</rsm:SupplyChainTradeTransaction>" xml += "</rsm:SupplyChainTradeTransaction>"
+ "</rsm:CrossIndustryInvoice>"; + "</rsm:CrossIndustryInvoice>";

View File

@@ -357,6 +357,7 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
boolean isCharge = true; boolean isCharge = true;
String chargeAmount = null; String chargeAmount = null;
String reason = null; String reason = null;
String reasonCode = null;
String taxPercent = null; String taxPercent = null;
for (int chargeChildIndex = 0; chargeChildIndex < chargeNodeChilds.getLength(); chargeChildIndex++) { for (int chargeChildIndex = 0; chargeChildIndex < chargeNodeChilds.getLength(); chargeChildIndex++) {
String chargeChildName = chargeNodeChilds.item(chargeChildIndex).getLocalName(); String chargeChildName = chargeNodeChilds.item(chargeChildIndex).getLocalName();
@@ -377,6 +378,8 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
chargeAmount = chargeNodeChilds.item(chargeChildIndex).getTextContent(); chargeAmount = chargeNodeChilds.item(chargeChildIndex).getTextContent();
} else if (chargeChildName.equals("Reason")) { } else if (chargeChildName.equals("Reason")) {
reason = chargeNodeChilds.item(chargeChildIndex).getTextContent(); reason = chargeNodeChilds.item(chargeChildIndex).getTextContent();
} else if (chargeChildName.equals("ReasonCode")) {
reasonCode = chargeNodeChilds.item(chargeChildIndex).getTextContent();
} else if (chargeChildName.equals("CategoryTradeTax")) { } else if (chargeChildName.equals("CategoryTradeTax")) {
NodeList taxChilds = chargeNodeChilds.item(chargeChildIndex).getChildNodes(); NodeList taxChilds = chargeNodeChilds.item(chargeChildIndex).getChildNodes();
for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) { for (int taxChildIndex = 0; taxChildIndex < taxChilds.getLength(); taxChildIndex++) {
@@ -395,16 +398,21 @@ public class ZUGFeRDInvoiceImporter extends ZUGFeRDImporter {
if (reason != null) { if (reason != null) {
c.setReason(reason); c.setReason(reason);
} }
if (reasonCode != null) {
c.setReasonCode(reasonCode);
}
if (taxPercent != null) { if (taxPercent != null) {
c.setTaxPercent(new BigDecimal(taxPercent)); c.setTaxPercent(new BigDecimal(taxPercent));
} }
zpp.addCharge(c); zpp.addCharge(c);
} else { } else {
Allowance a = new Allowance(new BigDecimal(chargeAmount)); Allowance a = new Allowance(new BigDecimal(chargeAmount));
if (reason != null) { if (reason != null) {
a.setReason(reason); a.setReason(reason);
} }
if (reasonCode != null) {
a.setReasonCode(reasonCode);
}
if (taxPercent != null) { if (taxPercent != null) {
a.setTaxPercent(new BigDecimal(taxPercent)); a.setTaxPercent(new BigDecimal(taxPercent));
} }

View File

@@ -23,6 +23,7 @@ import java.math.BigDecimal;
public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge { public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge {
private BigDecimal totalAmount; private BigDecimal totalAmount;
private String reason; private String reason;
private String reasonCode;
private BigDecimal taxPercent; private BigDecimal taxPercent;
boolean isCharge=true; boolean isCharge=true;
@@ -36,6 +37,11 @@ public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge {
return reason; return reason;
} }
@Override
public String getReasonCode() {
return reasonCode;
}
@Override @Override
public BigDecimal getTaxPercent() { public BigDecimal getTaxPercent() {
return taxPercent; return taxPercent;
@@ -61,6 +67,11 @@ public class IZUGFeRDAllowanceChargeImpl implements IZUGFeRDAllowanceCharge {
return this; return this;
} }
public IZUGFeRDAllowanceChargeImpl setReasonCode(String reasonCode) {
this.reasonCode = reasonCode;
return this;
}
public IZUGFeRDAllowanceChargeImpl setTaxPercent(BigDecimal taxPercent) { public IZUGFeRDAllowanceChargeImpl setTaxPercent(BigDecimal taxPercent) {
this.taxPercent = taxPercent; this.taxPercent = taxPercent;
return this; return this;