use DocumentCode

This commit is contained in:
Andre Kemper
2019-04-11 07:44:09 +02:00
parent 5ddd6f745e
commit 11bc7680fc
5 changed files with 62 additions and 65 deletions

View File

@@ -15,16 +15,23 @@
*/ */
package org.mustangproject.ZUGFeRD; package org.mustangproject.ZUGFeRD;
import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants;
import java.math.BigDecimal; import java.math.BigDecimal;
/** /**
* @author AlexanderSchmidt * @author AlexanderSchmidt
*/ */
public interface IZUGFeRDAllowanceCharge { public interface IZUGFeRDAllowanceCharge {
BigDecimal getTotalAmount(); BigDecimal getTotalAmount();
String getReason(); String getReason();
BigDecimal getTaxPercent(); BigDecimal getTaxPercent();
default String getCategoryCode() {
return TaxCategoryCodeTypeConstants.STANDARDRATE;
}
} }

View File

@@ -26,6 +26,8 @@ package org.mustangproject.ZUGFeRD;
* @author jstaerk * @author jstaerk
* */ * */
import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants;
import java.math.BigDecimal; import java.math.BigDecimal;
public interface IZUGFeRDExportableItem { public interface IZUGFeRDExportableItem {
@@ -51,5 +53,8 @@ public interface IZUGFeRDExportableItem {
*/ */
BigDecimal getQuantity(); BigDecimal getQuantity();
default String getCategoryCode() {
return TaxCategoryCodeTypeConstants.STANDARDRATE;
}
} }

View File

@@ -31,14 +31,17 @@ import java.math.BigDecimal;
*/ */
public class VATAmount { public class VATAmount {
public VATAmount(BigDecimal basis, BigDecimal calculated) { public VATAmount(BigDecimal basis, BigDecimal calculated, String documentCode) {
super(); super();
this.basis = basis; this.basis = basis;
this.calculated = calculated; this.calculated = calculated;
this.documentCode = documentCode;
} }
BigDecimal basis, calculated; BigDecimal basis, calculated;
String documentCode;
public BigDecimal getBasis() { public BigDecimal getBasis() {
return basis; return basis;
} }
@@ -55,12 +58,20 @@ public class VATAmount {
this.calculated = calculated; this.calculated = calculated;
} }
public String getDocumentCode() {
return documentCode;
}
public void setDocumentCode(String documentCode) {
this.documentCode = documentCode;
}
public VATAmount add(VATAmount v) { public VATAmount add(VATAmount v) {
return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated())); return new VATAmount(basis.add(v.getBasis()), calculated.add(v.getCalculated()), this.documentCode);
} }
public VATAmount subtract(VATAmount v) { public VATAmount subtract(VATAmount v) {
return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated())); return new VATAmount(basis.subtract(v.getBasis()), calculated.subtract(v.getCalculated()), this.documentCode);
} }
} }

View File

@@ -134,8 +134,6 @@ public class ZUGFeRD2PullProvider implements IXMLProvider {
VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
res = res.add(amount.getCalculated()); res = res.add(amount.getCalculated());
} }
return res; return res;
} }
@@ -162,16 +160,14 @@ 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()); 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);
} else { } else {
hm.put(percent, current.add(itemVATAmount)); hm.put(percent, current.add(itemVATAmount));
} }
} }
return hm; return hm;
} }

View File

@@ -113,7 +113,7 @@ class ZUGFeRDTransactionModelConverter {
document.getIncludedNote().add(regularInfo); document.getIncludedNote().add(regularInfo);
} }
if (trans.getReferenceNumber() != null && !new String().equals(trans.getReferenceNumber())) { if (trans.getReferenceNumber() != null && !"".equals(trans.getReferenceNumber())) {
NoteType referenceInfo = xmlFactory.createNoteType(); NoteType referenceInfo = xmlFactory.createNoteType();
TextType referenceInfoContent = xmlFactory.createTextType(); TextType referenceInfoContent = xmlFactory.createTextType();
referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber()); referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber());
@@ -336,10 +336,9 @@ class ZUGFeRDTransactionModelConverter {
} }
private Collection<TradeTaxType> getTradeTax() { private Collection<TradeTaxType> getTradeTax() {
List<TradeTaxType> tradeTaxTypes = new ArrayList<TradeTaxType>(); List<TradeTaxType> tradeTaxTypes = new ArrayList<>();
HashMap<BigDecimal, VATAmount> VATPercentAmountMap = this HashMap<BigDecimal, VATAmount> VATPercentAmountMap = this.getVATPercentAmountMap();
.getVATPercentAmountMap();
for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) {
TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
@@ -347,9 +346,9 @@ class ZUGFeRDTransactionModelConverter {
taxTypeCode.setValue(TaxTypeCodeTypeConstants.SALESTAX); taxTypeCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxTypeCode); tradeTax.setTypeCode(taxTypeCode);
TaxCategoryCodeType taxCategoryCode = xmlFactory TaxCategoryCodeType taxCategoryCode = xmlFactory.createTaxCategoryCodeType();
.createTaxCategoryCodeType(); VATAmount vatAmount = VATPercentAmountMap.get(currentTaxPercent);
taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE); taxCategoryCode.setValue(vatAmount.getDocumentCode());
tradeTax.setCategoryCode(taxCategoryCode); tradeTax.setCategoryCode(taxCategoryCode);
VATAmount amount = VATPercentAmountMap.get(currentTaxPercent); VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
@@ -360,8 +359,7 @@ class ZUGFeRDTransactionModelConverter {
AmountType calculatedTaxAmount = xmlFactory.createAmountType(); AmountType calculatedTaxAmount = xmlFactory.createAmountType();
calculatedTaxAmount.setCurrencyID(currency); calculatedTaxAmount.setCurrencyID(currency);
calculatedTaxAmount calculatedTaxAmount.setValue(currencyFormat(amount.getCalculated()));
.setValue(currencyFormat(amount.getCalculated()));
tradeTax.getCalculatedAmount().add(calculatedTaxAmount); tradeTax.getCalculatedAmount().add(calculatedTaxAmount);
AmountType basisTaxAmount = xmlFactory.createAmountType(); AmountType basisTaxAmount = xmlFactory.createAmountType();
@@ -376,13 +374,11 @@ class ZUGFeRDTransactionModelConverter {
} }
private Collection<TradeAllowanceChargeType> getHeaderAllowances() { private Collection<TradeAllowanceChargeType> getHeaderAllowances() {
List<TradeAllowanceChargeType> headerAllowances = new ArrayList<TradeAllowanceChargeType>(); List<TradeAllowanceChargeType> headerAllowances = new ArrayList<>();
for (IZUGFeRDAllowanceCharge iAllowance : trans.getZFAllowances()) { for (IZUGFeRDAllowanceCharge iAllowance : trans.getZFAllowances()) {
TradeAllowanceChargeType allowance = xmlFactory TradeAllowanceChargeType allowance = xmlFactory.createTradeAllowanceChargeType();
.createTradeAllowanceChargeType();
IndicatorType chargeIndicator = xmlFactory.createIndicatorType(); IndicatorType chargeIndicator = xmlFactory.createIndicatorType();
chargeIndicator.setIndicator(false); chargeIndicator.setIndicator(false);
allowance.setChargeIndicator(chargeIndicator); allowance.setChargeIndicator(chargeIndicator);
@@ -397,7 +393,6 @@ class ZUGFeRDTransactionModelConverter {
allowance.setReason(reason); allowance.setReason(reason);
TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
PercentType vatPercent = xmlFactory.createPercentType(); PercentType vatPercent = xmlFactory.createPercentType();
vatPercent.setValue(currencyFormat(iAllowance.getTaxPercent())); vatPercent.setValue(currencyFormat(iAllowance.getTaxPercent()));
tradeTax.setApplicablePercent(vatPercent); tradeTax.setApplicablePercent(vatPercent);
@@ -409,9 +404,8 @@ class ZUGFeRDTransactionModelConverter {
* basisAmount.setValue(amount.getBasis()); * basisAmount.setValue(amount.getBasis());
* allowance.setBasisAmount(basisAmount); * allowance.setBasisAmount(basisAmount);
*/ */
TaxCategoryCodeType taxType = xmlFactory TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType();
.createTaxCategoryCodeType(); taxType.setValue(iAllowance.getCategoryCode());
taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType); tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
@@ -420,20 +414,17 @@ class ZUGFeRDTransactionModelConverter {
allowance.getCategoryTradeTax().add(tradeTax); allowance.getCategoryTradeTax().add(tradeTax);
headerAllowances.add(allowance); headerAllowances.add(allowance);
} }
return headerAllowances; return headerAllowances;
} }
private Collection<TradeAllowanceChargeType> getHeaderCharges() { private Collection<TradeAllowanceChargeType> getHeaderCharges() {
List<TradeAllowanceChargeType> headerCharges = new ArrayList<TradeAllowanceChargeType>(); List<TradeAllowanceChargeType> headerCharges = new ArrayList<>();
for (IZUGFeRDAllowanceCharge iCharge : trans.getZFCharges()) { for (IZUGFeRDAllowanceCharge iCharge : trans.getZFCharges()) {
TradeAllowanceChargeType charge = xmlFactory TradeAllowanceChargeType charge = xmlFactory.createTradeAllowanceChargeType();
.createTradeAllowanceChargeType();
IndicatorType chargeIndicator = xmlFactory.createIndicatorType(); IndicatorType chargeIndicator = xmlFactory.createIndicatorType();
chargeIndicator.setIndicator(true); chargeIndicator.setIndicator(true);
charge.setChargeIndicator(chargeIndicator); charge.setChargeIndicator(chargeIndicator);
@@ -448,7 +439,6 @@ class ZUGFeRDTransactionModelConverter {
charge.setReason(reason); charge.setReason(reason);
TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
PercentType vatPercent = xmlFactory.createPercentType(); PercentType vatPercent = xmlFactory.createPercentType();
vatPercent.setValue(currencyFormat(iCharge.getTaxPercent())); vatPercent.setValue(currencyFormat(iCharge.getTaxPercent()));
tradeTax.setApplicablePercent(vatPercent); tradeTax.setApplicablePercent(vatPercent);
@@ -460,9 +450,8 @@ class ZUGFeRDTransactionModelConverter {
* basisAmount.setValue(amount.getBasis()); * basisAmount.setValue(amount.getBasis());
* allowance.setBasisAmount(basisAmount); * allowance.setBasisAmount(basisAmount);
*/ */
TaxCategoryCodeType taxType = xmlFactory TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType();
.createTaxCategoryCodeType(); taxType.setValue(iCharge.getCategoryCode());
taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType); tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
@@ -478,18 +467,15 @@ class ZUGFeRDTransactionModelConverter {
} }
private Collection<LogisticsServiceChargeType> getHeaderLogisticsServiceCharges() { private Collection<LogisticsServiceChargeType> getHeaderLogisticsServiceCharges() {
List<LogisticsServiceChargeType> headerServiceCharge = new ArrayList<LogisticsServiceChargeType>(); List<LogisticsServiceChargeType> headerServiceCharge = new ArrayList<>();
for (IZUGFeRDAllowanceCharge iServiceCharge : trans for (IZUGFeRDAllowanceCharge iServiceCharge : trans.getZFLogisticsServiceCharges()) {
.getZFLogisticsServiceCharges()) {
LogisticsServiceChargeType serviceCharge = xmlFactory LogisticsServiceChargeType serviceCharge = xmlFactory.createLogisticsServiceChargeType();
.createLogisticsServiceChargeType();
AmountType actualAmount = xmlFactory.createAmountType(); AmountType actualAmount = xmlFactory.createAmountType();
actualAmount.setCurrencyID(currency); actualAmount.setCurrencyID(currency);
actualAmount.setValue(currencyFormat(iServiceCharge actualAmount.setValue(currencyFormat(iServiceCharge.getTotalAmount()));
.getTotalAmount()));
serviceCharge.getAppliedAmount().add(actualAmount); serviceCharge.getAppliedAmount().add(actualAmount);
TextType reason = xmlFactory.createTextType(); TextType reason = xmlFactory.createTextType();
@@ -509,9 +495,8 @@ class ZUGFeRDTransactionModelConverter {
* basisAmount.setValue(amount.getBasis()); * basisAmount.setValue(amount.getBasis());
* allowance.setBasisAmount(basisAmount); * allowance.setBasisAmount(basisAmount);
*/ */
TaxCategoryCodeType taxType = xmlFactory TaxCategoryCodeType taxType = xmlFactory.createTaxCategoryCodeType();
.createTaxCategoryCodeType(); taxType.setValue(iServiceCharge.getCategoryCode());
taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType); tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
@@ -527,7 +512,7 @@ class ZUGFeRDTransactionModelConverter {
} }
private Collection<TradePaymentTermsType> getPaymentTerms() { private Collection<TradePaymentTermsType> getPaymentTerms() {
List<TradePaymentTermsType> paymentTerms = new ArrayList<TradePaymentTermsType>(); List<TradePaymentTermsType> paymentTerms = new ArrayList<>();
TradePaymentTermsType paymentTerm = xmlFactory TradePaymentTermsType paymentTerm = xmlFactory
.createTradePaymentTermsType(); .createTradePaymentTermsType();
@@ -632,7 +617,7 @@ class ZUGFeRDTransactionModelConverter {
private Collection<SupplyChainTradeLineItemType> getLineItems() { private Collection<SupplyChainTradeLineItemType> getLineItems() {
ArrayList<SupplyChainTradeLineItemType> lineItems = new ArrayList<SupplyChainTradeLineItemType>(); ArrayList<SupplyChainTradeLineItemType> lineItems = new ArrayList<>();
int lineID = 0; int lineID = 0;
for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) { for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
lineID++; lineID++;
@@ -734,9 +719,8 @@ class ZUGFeRDTransactionModelConverter {
.createSupplyChainTradeSettlementType(); .createSupplyChainTradeSettlementType();
TradeTaxType tradeTax = xmlFactory.createTradeTaxType(); TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
TaxCategoryCodeType taxCategoryCode = xmlFactory TaxCategoryCodeType taxCategoryCode = xmlFactory.createTaxCategoryCodeType();
.createTaxCategoryCodeType(); taxCategoryCode.setValue(currentItem.getCategoryCode());
taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxCategoryCode); tradeTax.setCategoryCode(taxCategoryCode);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType(); TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
@@ -849,15 +833,13 @@ class ZUGFeRDTransactionModelConverter {
return getVATPercentAmountMap(false); return getVATPercentAmountMap(false);
} }
private HashMap<BigDecimal, VATAmount> getVATPercentAmountMap( private HashMap<BigDecimal, VATAmount> getVATPercentAmountMap(Boolean itemOnly) {
Boolean itemOnly) { HashMap<BigDecimal, VATAmount> hm = new HashMap<>();
HashMap<BigDecimal, VATAmount> hm = new HashMap<BigDecimal, VATAmount>();
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(), VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(), lc.getItemTotalVATAmount(), trans.getDocumentCode());
lc.getItemTotalVATAmount());
VATAmount current = hm.get(percent); VATAmount current = hm.get(percent);
if (current == null) { if (current == null) {
hm.put(percent, itemVATAmount); hm.put(percent, itemVATAmount);
@@ -869,13 +851,12 @@ class ZUGFeRDTransactionModelConverter {
return hm; return hm;
} }
if (trans.getZFAllowances() != null) { if (trans.getZFAllowances() != null) {
for (IZUGFeRDAllowanceCharge headerAllowance : trans for (IZUGFeRDAllowanceCharge headerAllowance : trans.getZFAllowances()) {
.getZFAllowances()) {
BigDecimal percent = headerAllowance.getTaxPercent(); BigDecimal percent = headerAllowance.getTaxPercent();
VATAmount itemVATAmount = new VATAmount( VATAmount itemVATAmount = new VATAmount(
headerAllowance.getTotalAmount(), headerAllowance headerAllowance.getTotalAmount(), headerAllowance
.getTotalAmount().multiply(percent) .getTotalAmount().multiply(percent)
.divide(new BigDecimal(100))); .divide(new BigDecimal(100)), 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);
@@ -892,7 +873,7 @@ class ZUGFeRDTransactionModelConverter {
VATAmount itemVATAmount = new VATAmount( VATAmount itemVATAmount = new VATAmount(
logisticsServiceCharge.getTotalAmount(), logisticsServiceCharge.getTotalAmount(),
logisticsServiceCharge.getTotalAmount() logisticsServiceCharge.getTotalAmount()
.multiply(percent).divide(new BigDecimal(100))); .multiply(percent).divide(new BigDecimal(100)), 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);
@@ -907,7 +888,7 @@ class ZUGFeRDTransactionModelConverter {
BigDecimal percent = charge.getTaxPercent(); BigDecimal percent = charge.getTaxPercent();
VATAmount itemVATAmount = new VATAmount( VATAmount itemVATAmount = new VATAmount(
charge.getTotalAmount(), charge.getTotalAmount() charge.getTotalAmount(), charge.getTotalAmount()
.multiply(percent).divide(new BigDecimal(100))); .multiply(percent).divide(new BigDecimal(100)), 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);
@@ -1026,17 +1007,14 @@ class ZUGFeRDTransactionModelConverter {
// Set total net amount // Set total net amount
this.totalNetAmount = res; this.totalNetAmount = res;
HashMap<BigDecimal, VATAmount> VATPercentAmountMap = getVATPercentAmountMap(); HashMap<BigDecimal, VATAmount> vatAmountHashMap = getVATPercentAmountMap();
for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) { for (VATAmount amount : vatAmountHashMap.values()) {
VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
res = res.add(amount.getCalculated()); res = res.add(amount.getCalculated());
} }
// Set total gross amount // Set total gross amount
this.totalGrossAmount = res; this.totalGrossAmount = res;
this.totalTaxAmount = this.totalGrossAmount.subtract(this.totalNetAmount);
this.totalTaxAmount = this.totalGrossAmount
.subtract(this.totalNetAmount);
} }
public BigDecimal getTotalNet() { public BigDecimal getTotalNet() {