diff --git a/pom.xml b/pom.xml
index f2dd22af..872746e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,12 @@
4.11
test
+
+ com.helger
+ ph-schematron
+ 4.3.1
+ test
+
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
index 1d7485dc..5f85d52a 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
@@ -1,6 +1,6 @@
package org.mustangproject.ZUGFeRD;
-/**
+/*
* Mustangproject's ZUGFeRD implementation ZUGFeRD exporter Licensed under the
* APLv2
*
@@ -9,30 +9,6 @@ package org.mustangproject.ZUGFeRD;
* @author jstaerk
*
*/
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.transform.TransformerException;
-
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
@@ -44,54 +20,29 @@ import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
-import org.mustangproject.ZUGFeRD.model.AmountType;
-import org.mustangproject.ZUGFeRD.model.CodeType;
-import org.mustangproject.ZUGFeRD.model.CountryIDType;
-import org.mustangproject.ZUGFeRD.model.CreditorFinancialAccountType;
-import org.mustangproject.ZUGFeRD.model.CreditorFinancialInstitutionType;
import org.mustangproject.ZUGFeRD.model.CrossIndustryDocumentType;
-import org.mustangproject.ZUGFeRD.model.DateTimeType;
-import org.mustangproject.ZUGFeRD.model.DocumentCodeType;
-import org.mustangproject.ZUGFeRD.model.DocumentContextParameterType;
-import org.mustangproject.ZUGFeRD.model.DocumentLineDocumentType;
-import org.mustangproject.ZUGFeRD.model.ExchangedDocumentContextType;
-import org.mustangproject.ZUGFeRD.model.ExchangedDocumentType;
-import org.mustangproject.ZUGFeRD.model.IDType;
-import org.mustangproject.ZUGFeRD.model.IndicatorType;
-import org.mustangproject.ZUGFeRD.model.LogisticsServiceChargeType;
-import org.mustangproject.ZUGFeRD.model.NoteType;
-import org.mustangproject.ZUGFeRD.model.ObjectFactory;
-import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeType;
-import org.mustangproject.ZUGFeRD.model.PercentType;
-import org.mustangproject.ZUGFeRD.model.QuantityType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainEventType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainTradeAgreementType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainTradeDeliveryType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainTradeLineItemType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainTradeSettlementType;
-import org.mustangproject.ZUGFeRD.model.SupplyChainTradeTransactionType;
-import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeType;
-import org.mustangproject.ZUGFeRD.model.TaxRegistrationType;
-import org.mustangproject.ZUGFeRD.model.TaxTypeCodeType;
-import org.mustangproject.ZUGFeRD.model.TextType;
-import org.mustangproject.ZUGFeRD.model.TradeAddressType;
-import org.mustangproject.ZUGFeRD.model.TradeAllowanceChargeType;
-import org.mustangproject.ZUGFeRD.model.TradePartyType;
-import org.mustangproject.ZUGFeRD.model.TradePaymentTermsType;
-import org.mustangproject.ZUGFeRD.model.TradePriceType;
-import org.mustangproject.ZUGFeRD.model.TradeProductType;
-import org.mustangproject.ZUGFeRD.model.TradeSettlementMonetarySummationType;
-import org.mustangproject.ZUGFeRD.model.TradeSettlementPaymentMeansType;
-import org.mustangproject.ZUGFeRD.model.TradeTaxType;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.transform.TransformerException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Map;
public class ZUGFeRDExporter implements Closeable {
private void init() {
try {
- jaxbContext = JAXBContext
- .newInstance("org.mustangproject.ZUGFeRD.model");
- marshaller = jaxbContext.createMarshaller();
+ marshaller = JAXBContext.newInstance("org.mustangproject.ZUGFeRD.model").createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
} catch (JAXBException e) {
@@ -124,139 +75,6 @@ public class ZUGFeRDExporter implements Closeable {
public ZUGFeRDExporter(PDDocument doc2) {
init();
doc=doc2;
-
- }
-
- private class LineCalc {
-
- private BigDecimal totalGross;
- private BigDecimal itemTotalNetAmount;
- private BigDecimal itemTotalVATAmount;
- private BigDecimal itemNetAmount;
-
- public LineCalc(IZUGFeRDExportableItem currentItem) {
- BigDecimal totalAllowance = BigDecimal.ZERO;
- BigDecimal totalCharge = BigDecimal.ZERO;
-
- if (currentItem.getItemAllowances() != null) {
- for (IZUGFeRDAllowanceCharge itemAllowance : currentItem
- .getItemAllowances()) {
- totalAllowance = itemAllowance.getTotalAmount().add(
- totalAllowance);
- }
- }
-
- if (currentItem.getItemCharges() != null) {
- for (IZUGFeRDAllowanceCharge itemCharge : currentItem
- .getItemCharges()) {
- totalCharge = itemCharge.getTotalAmount().add(totalCharge);
- }
- }
-
- BigDecimal multiplicator = currentItem.getProduct().getVATPercent()
- .divide(new BigDecimal(100), 4, BigDecimal.ROUND_HALF_UP)
- .add(BigDecimal.ONE);
- // priceGross=currentItem.getPrice().multiply(multiplicator);
-
- totalGross = currentItem.getPrice()
- .multiply(currentItem.getQuantity())
- .subtract(totalAllowance).add(totalCharge)
- .multiply(multiplicator);
- itemTotalNetAmount = currentItem.getPrice()
- .multiply(currentItem.getQuantity())
- .subtract(totalAllowance).add(totalCharge)
- .setScale(2, BigDecimal.ROUND_HALF_UP);
- itemTotalVATAmount = totalGross.subtract(itemTotalNetAmount);
- itemNetAmount = currentItem
- .getPrice()
- .multiply(currentItem.getQuantity())
- .subtract(totalAllowance)
- .add(totalCharge)
- .divide(currentItem.getQuantity(), 4,
- BigDecimal.ROUND_HALF_UP);
- }
-
- public BigDecimal getItemTotalNetAmount() {
- return itemTotalNetAmount;
- }
-
- public BigDecimal getItemTotalVATAmount() {
- return itemTotalVATAmount;
- }
-
- public BigDecimal getItemNetAmount() {
- return itemNetAmount;
- }
-
- }
-
- private class Totals {
- private BigDecimal totalNetAmount;
- private BigDecimal totalGrossAmount;
- private BigDecimal lineTotalAmount;
- private BigDecimal totalTaxAmount;
-
- public Totals() {
- BigDecimal res = BigDecimal.ZERO;
- for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
- LineCalc lc = new LineCalc(currentItem);
- res = res.add(lc.getItemTotalNetAmount());
- }
- // Set line total
- this.lineTotalAmount = res;
-
- if (trans.getZFAllowances() != null) {
- for (IZUGFeRDAllowanceCharge headerAllowance : trans
- .getZFAllowances()) {
- res = res.subtract(headerAllowance.getTotalAmount());
- }
- }
-
- if (trans.getZFLogisticsServiceCharges() != null) {
- for (IZUGFeRDAllowanceCharge logisticsServiceCharge : trans
- .getZFLogisticsServiceCharges()) {
- res = res.add(logisticsServiceCharge.getTotalAmount());
- }
- }
-
- if (trans.getZFCharges() != null) {
- for (IZUGFeRDAllowanceCharge charge : trans.getZFCharges()) {
- res = res.add(charge.getTotalAmount());
- }
- }
-
- // Set total net amount
- this.totalNetAmount = res;
-
- HashMap VATPercentAmountMap = getVATPercentAmountMap();
- for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) {
- VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
- res = res.add(amount.getCalculated());
- }
-
- // Set total gross amount
- this.totalGrossAmount = res;
-
- this.totalTaxAmount = this.totalGrossAmount
- .subtract(this.totalNetAmount);
- }
-
- public BigDecimal getTotalNet() {
- return totalNetAmount;
- }
-
- public BigDecimal getTotalGross() {
- return totalGrossAmount;
- }
-
- public BigDecimal getLineTotal() {
- return lineTotalAmount;
- }
-
- public BigDecimal getTaxTotal() {
- return totalTaxAmount;
- }
-
}
// // MAIN CLASS
@@ -275,71 +93,9 @@ public class ZUGFeRDExporter implements Closeable {
*/
byte[] zugferdData = null;
private boolean isTest;
- IZUGFeRDExportableTransaction trans = null;
@Deprecated
private boolean ignoreA1Errors;
private PDDocument doc;
- private String currency = "EUR";
-
- private BigDecimal nDigitFormat(BigDecimal value, int scale) {
- /*
- * I needed 123,45, locale independent.I tried
- * NumberFormat.getCurrencyInstance().format( 12345.6789 ); but that is
- * locale specific.I also tried DecimalFormat df = new DecimalFormat(
- * "0,00" ); df.setDecimalSeparatorAlwaysShown(true);
- * df.setGroupingUsed(false); DecimalFormatSymbols symbols = new
- * DecimalFormatSymbols(); symbols.setDecimalSeparator(',');
- * symbols.setGroupingSeparator(' ');
- * df.setDecimalFormatSymbols(symbols);
- *
- * but that would not switch off grouping. Although I liked very much
- * the (incomplete) "BNF diagram" in
- * http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html
- * in the end I decided to calculate myself and take eur+sparator+cents
- *
- * This function will cut off, i.e. floor() subcent values Tests:
- * System.err.println(utils.currencyFormat(new BigDecimal(0),
- * ".")+"\n"+utils.currencyFormat(new BigDecimal("-1.10"),
- * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.1"),
- * ",")+"\n"+utils.currencyFormat(new BigDecimal("-1.01"),
- * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3489"),
- * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3419"),
- * ",")+"\n"+utils.currencyFormat(new BigDecimal("12"), ","));
- *
- * 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
- char[] repeat = new char[scale];
- Arrays.fill(repeat, '0');
-
- DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols();
- otherSymbols.setDecimalSeparator('.');
- DecimalFormat dec = new DecimalFormat("0." + new String(repeat),
- otherSymbols);
- return new BigDecimal(dec.format(value));
-
- }
-
- private BigDecimal vatFormat(BigDecimal value) {
- return nDigitFormat(value, 2);
- }
-
- private BigDecimal currencyFormat(BigDecimal value) {
- return nDigitFormat(value, 2);
- }
-
- private BigDecimal priceFormat(BigDecimal value) {
- return nDigitFormat(value, 4);
- }
-
- private BigDecimal quantityFormat(BigDecimal value) {
- return nDigitFormat(value, 4);
- }
/**
* All files are PDF/A-3, setConformance refers to the level conformance.
@@ -478,29 +234,12 @@ public class ZUGFeRDExporter implements Closeable {
}
}
- private static final ObjectFactory xmlFactory = new ObjectFactory();
- private JAXBContext jaxbContext;
private Marshaller marshaller;
- private static final SimpleDateFormat zugferdDateFormat = new SimpleDateFormat(
- "yyyyMMdd"); //$NON-NLS-1$
- private Totals totals;
+ private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans) {
- private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans1) {
- this.trans = trans1;
- this.totals = new Totals();
- currency = trans1.getCurrency();
-
- CrossIndustryDocumentType invoice = xmlFactory
- .createCrossIndustryDocumentType();
-
- invoice.setSpecifiedExchangedDocumentContext(this.getDocumentContext());
- invoice.setHeaderExchangedDocument(this.getDocument());
- invoice.setSpecifiedSupplyChainTradeTransaction(this
- .getTradeTransaction());
-
- JAXBElement jaxElement = xmlFactory
- .createCrossIndustryDocument(invoice);
+ JAXBElement jaxElement =
+ new ZUGFeRDTransactionModelConverter(trans).withTest(isTest).convertToModel();
try {
return marshalJaxToXMLString(jaxElement);
@@ -515,804 +254,6 @@ public class ZUGFeRDExporter implements Closeable {
return outputXml.toString();
}
- private ExchangedDocumentContextType getDocumentContext() {
-
- ExchangedDocumentContextType context = xmlFactory
- .createExchangedDocumentContextType();
- DocumentContextParameterType contextParameter = xmlFactory
- .createDocumentContextParameterType();
- IDType idType = xmlFactory.createIDType();
- idType.setValue(DocumentContextParameterTypeConstants.EXTENDED);
- contextParameter.setID(idType);
- context.getGuidelineSpecifiedDocumentContextParameter().add(
- contextParameter);
-
- IndicatorType testIndicator = xmlFactory.createIndicatorType();
- testIndicator.setIndicator(isTest);
- context.setTestIndicator(testIndicator);
-
- return context;
- }
-
- private ExchangedDocumentType getDocument() {
-
- ExchangedDocumentType document = xmlFactory
- .createExchangedDocumentType();
-
- IDType id = xmlFactory.createIDType();
- id.setValue(trans.getNumber());
- document.setID(id);
-
- DateTimeType issueDateTime = xmlFactory.createDateTimeType();
- DateTimeType.DateTimeString issueDateTimeString = xmlFactory
- .createDateTimeTypeDateTimeString();
- issueDateTimeString.setFormat(DateTimeTypeConstants.DATE);
- issueDateTimeString.setValue(zugferdDateFormat.format(trans
- .getIssueDate()));
- issueDateTime.setDateTimeString(issueDateTimeString);
- document.setIssueDateTime(issueDateTime);
-
- DocumentCodeType documentCodeType = xmlFactory.createDocumentCodeType();
- documentCodeType.setValue(DocumentCodeTypeConstants.INVOICE);
- document.setTypeCode(documentCodeType);
-
- TextType name = xmlFactory.createTextType();
- name.setValue("RECHNUNG");
- document.getName().add(name);
-
- if (trans.getOwnOrganisationFullPlaintextInfo() != null) {
- NoteType regularInfo = xmlFactory.createNoteType();
- CodeType regularInfoSubjectCode = xmlFactory.createCodeType();
- regularInfoSubjectCode.setValue(NoteTypeConstants.REGULARINFO);
- regularInfo.setSubjectCode(regularInfoSubjectCode);
- TextType regularInfoContent = xmlFactory.createTextType();
- regularInfoContent.setValue(trans
- .getOwnOrganisationFullPlaintextInfo());
- regularInfo.getContent().add(regularInfoContent);
- document.getIncludedNote().add(regularInfo);
- }
-
- if (trans.getReferenceNumber() != null && !new String().equals(trans.getReferenceNumber())){
- NoteType referenceInfo = xmlFactory.createNoteType();
- TextType referenceInfoContent = xmlFactory.createTextType();
- referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber());
- referenceInfo.getContent().add(referenceInfoContent);
- document.getIncludedNote().add(referenceInfo);
- }
-
- return document;
- }
-
- private SupplyChainTradeTransactionType getTradeTransaction() {
-
- SupplyChainTradeTransactionType transaction = xmlFactory
- .createSupplyChainTradeTransactionType();
- transaction.getApplicableSupplyChainTradeAgreement().add(
- this.getTradeAgreement());
- transaction.setApplicableSupplyChainTradeDelivery(this
- .getTradeDelivery());
- transaction.setApplicableSupplyChainTradeSettlement(this
- .getTradeSettlement());
- transaction.getIncludedSupplyChainTradeLineItem().addAll(
- this.getLineItems());
-
- return transaction;
- }
-
- private SupplyChainTradeAgreementType getTradeAgreement() {
-
- SupplyChainTradeAgreementType tradeAgreement = xmlFactory
- .createSupplyChainTradeAgreementType();
-
- tradeAgreement.setBuyerTradeParty(this.getBuyer());
- tradeAgreement.setSellerTradeParty(this.getSeller());
-
- return tradeAgreement;
- }
-
- private TradePartyType getBuyer() {
-
- TradePartyType buyerTradeParty = xmlFactory.createTradePartyType();
- TextType buyerName = xmlFactory.createTextType();
- buyerName.setValue(trans.getRecipient().getName());
- buyerTradeParty.setName(buyerName);
-
- TradeAddressType buyerAddressType = xmlFactory.createTradeAddressType();
- TextType buyerCityName = xmlFactory.createTextType();
- buyerCityName.setValue(trans.getRecipient().getLocation());
- buyerAddressType.setCityName(buyerCityName);
-
- CountryIDType buyerCountryId = xmlFactory.createCountryIDType();
- buyerCountryId.setValue(trans.getRecipient().getCountry());
- buyerAddressType.setCountryID(buyerCountryId);
-
- TextType buyerAddress = xmlFactory.createTextType();
- buyerAddress.setValue(trans.getRecipient().getStreet());
- buyerAddressType.setLineOne(buyerAddress);
-
- CodeType buyerPostcode = xmlFactory.createCodeType();
- buyerPostcode.setValue(trans.getRecipient().getZIP());
- buyerAddressType.getPostcodeCode().add(buyerPostcode);
-
- buyerTradeParty.setPostalTradeAddress(buyerAddressType);
-
- // Ust-ID
- TaxRegistrationType buyerTaxRegistration = xmlFactory
- .createTaxRegistrationType();
- IDType buyerUstId = xmlFactory.createIDType();
- buyerUstId.setValue(trans.getRecipient().getVATID());
- buyerUstId.setSchemeID(TaxRegistrationTypeConstants.USTID);
- buyerTaxRegistration.setID(buyerUstId);
- buyerTradeParty.getSpecifiedTaxRegistration().add(buyerTaxRegistration);
-
- return buyerTradeParty;
- }
-
- private TradePartyType getSeller() {
-
- TradePartyType sellerTradeParty = xmlFactory.createTradePartyType();
- TextType sellerName = xmlFactory.createTextType();
- sellerName.setValue(trans.getOwnOrganisationName());
- sellerTradeParty.setName(sellerName);
-
- TradeAddressType sellerAddressType = xmlFactory
- .createTradeAddressType();
- TextType sellerCityName = xmlFactory.createTextType();
- sellerCityName.setValue(trans.getOwnLocation());
- sellerAddressType.setCityName(sellerCityName);
-
- CountryIDType sellerCountryId = xmlFactory.createCountryIDType();
- sellerCountryId.setValue(trans.getOwnCountry());
- sellerAddressType.setCountryID(sellerCountryId);
-
- TextType sellerAddress = xmlFactory.createTextType();
- sellerAddress.setValue(trans.getOwnStreet());
- sellerAddressType.setLineOne(sellerAddress);
-
- CodeType sellerPostcode = xmlFactory.createCodeType();
- sellerPostcode.setValue(trans.getOwnZIP());
- sellerAddressType.getPostcodeCode().add(sellerPostcode);
-
- sellerTradeParty.setPostalTradeAddress(sellerAddressType);
-
- // Steuernummer
- TaxRegistrationType sellerTaxRegistration = xmlFactory
- .createTaxRegistrationType();
- IDType sellerTaxId = xmlFactory.createIDType();
- sellerTaxId.setValue(trans.getOwnTaxID());
- sellerTaxId.setSchemeID(TaxRegistrationTypeConstants.TAXID);
- sellerTaxRegistration.setID(sellerTaxId);
- sellerTradeParty.getSpecifiedTaxRegistration().add(
- sellerTaxRegistration);
-
- // Ust-ID
- sellerTaxRegistration = xmlFactory.createTaxRegistrationType();
- IDType sellerUstId = xmlFactory.createIDType();
- sellerUstId.setValue(trans.getOwnVATID());
- sellerUstId.setSchemeID(TaxRegistrationTypeConstants.USTID);
- sellerTaxRegistration.setID(sellerUstId);
- sellerTradeParty.getSpecifiedTaxRegistration().add(
- sellerTaxRegistration);
-
- return sellerTradeParty;
- }
-
- private SupplyChainTradeDeliveryType getTradeDelivery() {
-
- SupplyChainTradeDeliveryType tradeDelivery = xmlFactory
- .createSupplyChainTradeDeliveryType();
- SupplyChainEventType deliveryEvent = xmlFactory
- .createSupplyChainEventType();
- DateTimeType deliveryDate = xmlFactory.createDateTimeType();
- DateTimeType.DateTimeString deliveryDateString = xmlFactory
- .createDateTimeTypeDateTimeString();
- deliveryDateString.setFormat(DateTimeTypeConstants.DATE);
- deliveryDateString.setValue(zugferdDateFormat.format(trans
- .getDeliveryDate()));
- deliveryDate.setDateTimeString(deliveryDateString);
- deliveryEvent.getOccurrenceDateTime().add(deliveryDate);
- tradeDelivery.getActualDeliverySupplyChainEvent().add(deliveryEvent);
-
- return tradeDelivery;
- }
-
- private SupplyChainTradeSettlementType getTradeSettlement() {
- SupplyChainTradeSettlementType tradeSettlement = xmlFactory
- .createSupplyChainTradeSettlementType();
-
- TextType paymentReference = xmlFactory.createTextType();
- paymentReference.setValue(trans.getNumber());
- tradeSettlement.getPaymentReference().add(paymentReference);
-
- CodeType currencyCode = xmlFactory.createCodeType();
- currencyCode.setValue(currency);
- tradeSettlement.setInvoiceCurrencyCode(currencyCode);
-
- tradeSettlement.getSpecifiedTradeSettlementPaymentMeans().add(
- this.getPaymentData());
- tradeSettlement.getApplicableTradeTax().addAll(this.getTradeTax());
- tradeSettlement.getSpecifiedTradePaymentTerms().addAll(
- this.getPaymentTerms());
- if (trans.getZFAllowances() != null) {
- tradeSettlement.getSpecifiedTradeAllowanceCharge().addAll(
- this.getHeaderAllowances());
- }
- if (trans.getZFLogisticsServiceCharges() != null) {
- tradeSettlement.getSpecifiedLogisticsServiceCharge().addAll(
- this.getHeaderLogisticsServiceCharges());
- }
- if (trans.getZFCharges() != null) {
- tradeSettlement.getSpecifiedTradeAllowanceCharge().addAll(
- this.getHeaderCharges());
- }
-
- tradeSettlement.setSpecifiedTradeSettlementMonetarySummation(this
- .getMonetarySummation());
-
- return tradeSettlement;
- }
-
- private TradeSettlementPaymentMeansType getPaymentData() {
- TradeSettlementPaymentMeansType paymentData = xmlFactory
- .createTradeSettlementPaymentMeansType();
- PaymentMeansCodeType paymentDataType = xmlFactory
- .createPaymentMeansCodeType();
- paymentDataType.setValue(PaymentMeansCodeTypeConstants.BANKACCOUNT);
- paymentData.setTypeCode(paymentDataType);
-
- TextType paymentInfo = xmlFactory.createTextType();
- String paymentInfoText = trans.getOwnPaymentInfoText();
- if (paymentInfoText == null) {
- paymentInfoText = "";
- }
- paymentInfo.setValue(paymentInfoText);
- paymentData.getInformation().add(paymentInfo);
-
- CreditorFinancialAccountType bankAccount = xmlFactory
- .createCreditorFinancialAccountType();
- IDType iban = xmlFactory.createIDType();
- iban.setValue(trans.getOwnIBAN());
- bankAccount.setIBANID(iban);
- paymentData.setPayeePartyCreditorFinancialAccount(bankAccount);
-
- CreditorFinancialInstitutionType bankData = xmlFactory
- .createCreditorFinancialInstitutionType();
- IDType bicId = xmlFactory.createIDType();
- bicId.setValue(trans.getOwnBIC());
- bankData.setBICID(bicId);
- TextType bankName = xmlFactory.createTextType();
- bankName.setValue(trans.getOwnBankName());
- bankData.setName(bankName);
- paymentData.setPayeeSpecifiedCreditorFinancialInstitution(bankData);
- return paymentData;
- }
-
- private Collection getTradeTax() {
- List tradeTaxTypes = new ArrayList();
-
- HashMap VATPercentAmountMap = this
- .getVATPercentAmountMap();
- for (BigDecimal currentTaxPercent : VATPercentAmountMap.keySet()) {
-
- TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
- TaxTypeCodeType taxTypeCode = xmlFactory.createTaxTypeCodeType();
- taxTypeCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
- tradeTax.setTypeCode(taxTypeCode);
-
- TaxCategoryCodeType taxCategoryCode = xmlFactory
- .createTaxCategoryCodeType();
- taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
- tradeTax.setCategoryCode(taxCategoryCode);
-
- VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
-
- PercentType taxPercent = xmlFactory.createPercentType();
- taxPercent.setValue(vatFormat(currentTaxPercent));
- tradeTax.setApplicablePercent(taxPercent);
-
- AmountType calculatedTaxAmount = xmlFactory.createAmountType();
- calculatedTaxAmount.setCurrencyID(currency);
- calculatedTaxAmount
- .setValue(currencyFormat(amount.getCalculated()));
- tradeTax.getCalculatedAmount().add(calculatedTaxAmount);
-
- AmountType basisTaxAmount = xmlFactory.createAmountType();
- basisTaxAmount.setCurrencyID(currency);
- basisTaxAmount.setValue(currencyFormat(amount.getBasis()));
- tradeTax.getBasisAmount().add(basisTaxAmount);
-
- tradeTaxTypes.add(tradeTax);
- }
-
- return tradeTaxTypes;
- }
-
- private Collection getHeaderAllowances() {
- List headerAllowances = new ArrayList();
-
- for (IZUGFeRDAllowanceCharge iAllowance : trans.getZFAllowances()) {
-
- TradeAllowanceChargeType allowance = xmlFactory
- .createTradeAllowanceChargeType();
-
- IndicatorType chargeIndicator = xmlFactory.createIndicatorType();
- chargeIndicator.setIndicator(false);
- allowance.setChargeIndicator(chargeIndicator);
-
- AmountType actualAmount = xmlFactory.createAmountType();
- actualAmount.setCurrencyID(currency);
- actualAmount.setValue(currencyFormat(iAllowance.getTotalAmount()));
- allowance.getActualAmount().add(actualAmount);
-
- TextType reason = xmlFactory.createTextType();
- reason.setValue(iAllowance.getReason());
- allowance.setReason(reason);
-
- TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
-
- PercentType vatPercent = xmlFactory.createPercentType();
- vatPercent.setValue(currencyFormat(iAllowance.getTaxPercent()));
- tradeTax.setApplicablePercent(vatPercent);
-
- /*
- * Only in extended AmountType basisAmount =
- * xmlFactory.createAmountType();
- * basisAmount.setCurrencyID(trans.getInvoiceCurrency());
- * basisAmount.setValue(amount.getBasis());
- * allowance.setBasisAmount(basisAmount);
- */
- TaxCategoryCodeType taxType = xmlFactory
- .createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
- tradeTax.setCategoryCode(taxType);
-
- TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
- tradeTax.setTypeCode(taxCode);
-
- allowance.getCategoryTradeTax().add(tradeTax);
- headerAllowances.add(allowance);
-
- }
-
- return headerAllowances;
- }
-
- private Collection getHeaderCharges() {
- List headerCharges = new ArrayList();
-
- for (IZUGFeRDAllowanceCharge iCharge : trans.getZFCharges()) {
-
- TradeAllowanceChargeType charge = xmlFactory
- .createTradeAllowanceChargeType();
-
- IndicatorType chargeIndicator = xmlFactory.createIndicatorType();
- chargeIndicator.setIndicator(true);
- charge.setChargeIndicator(chargeIndicator);
-
- AmountType actualAmount = xmlFactory.createAmountType();
- actualAmount.setCurrencyID(currency);
- actualAmount.setValue(currencyFormat(iCharge.getTotalAmount()));
- charge.getActualAmount().add(actualAmount);
-
- TextType reason = xmlFactory.createTextType();
- reason.setValue(iCharge.getReason());
- charge.setReason(reason);
-
- TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
-
- PercentType vatPercent = xmlFactory.createPercentType();
- vatPercent.setValue(currencyFormat(iCharge.getTaxPercent()));
- tradeTax.setApplicablePercent(vatPercent);
-
- /*
- * Only in extended AmountType basisAmount =
- * xmlFactory.createAmountType();
- * basisAmount.setCurrencyID(trans.getInvoiceCurrency());
- * basisAmount.setValue(amount.getBasis());
- * allowance.setBasisAmount(basisAmount);
- */
- TaxCategoryCodeType taxType = xmlFactory
- .createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
- tradeTax.setCategoryCode(taxType);
-
- TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
- tradeTax.setTypeCode(taxCode);
-
- charge.getCategoryTradeTax().add(tradeTax);
- headerCharges.add(charge);
-
- }
-
- return headerCharges;
- }
-
- private Collection getHeaderLogisticsServiceCharges() {
- List headerServiceCharge = new ArrayList();
-
- for (IZUGFeRDAllowanceCharge iServiceCharge : trans
- .getZFLogisticsServiceCharges()) {
-
- LogisticsServiceChargeType serviceCharge = xmlFactory
- .createLogisticsServiceChargeType();
-
- AmountType actualAmount = xmlFactory.createAmountType();
- actualAmount.setCurrencyID(currency);
- actualAmount.setValue(currencyFormat(iServiceCharge
- .getTotalAmount()));
- serviceCharge.getAppliedAmount().add(actualAmount);
-
- TextType reason = xmlFactory.createTextType();
- reason.setValue(iServiceCharge.getReason());
- serviceCharge.getDescription().add(reason);
-
- TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
-
- PercentType vatPercent = xmlFactory.createPercentType();
- vatPercent.setValue(currencyFormat(iServiceCharge.getTaxPercent()));
- tradeTax.setApplicablePercent(vatPercent);
-
- /*
- * Only in extended AmountType basisAmount =
- * xmlFactory.createAmountType();
- * basisAmount.setCurrencyID(trans.getInvoiceCurrency());
- * basisAmount.setValue(amount.getBasis());
- * allowance.setBasisAmount(basisAmount);
- */
- TaxCategoryCodeType taxType = xmlFactory
- .createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
- tradeTax.setCategoryCode(taxType);
-
- TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
- tradeTax.setTypeCode(taxCode);
-
- serviceCharge.getAppliedTradeTax().add(tradeTax);
- headerServiceCharge.add(serviceCharge);
-
- }
-
- return headerServiceCharge;
- }
-
- private Collection getPaymentTerms() {
- List paymentTerms = new ArrayList();
-
- TradePaymentTermsType paymentTerm = xmlFactory
- .createTradePaymentTermsType();
- DateTimeType dueDate = xmlFactory.createDateTimeType();
- DateTimeType.DateTimeString dueDateString = xmlFactory
- .createDateTimeTypeDateTimeString();
- dueDateString.setFormat(DateTimeTypeConstants.DATE);
- dueDateString.setValue(zugferdDateFormat.format(trans.getDueDate()));
- dueDate.setDateTimeString(dueDateString);
- paymentTerm.setDueDateDateTime(dueDate);
-
- TextType paymentTermDescr = xmlFactory.createTextType();
-
- String paymentTermDescription = trans.getPaymentTermDescription();
- if (paymentTermDescription == null) {
- paymentTermDescription = "";
- }
- paymentTermDescr.setValue(paymentTermDescription);
- paymentTerm.getDescription().add(paymentTermDescr);
-
- paymentTerms.add(paymentTerm);
-
- return paymentTerms;
- }
-
- private TradeSettlementMonetarySummationType getMonetarySummation() {
- TradeSettlementMonetarySummationType monetarySummation = xmlFactory
- .createTradeSettlementMonetarySummationType();
-
- // AllowanceTotalAmount = sum of all allowances
- AmountType allowanceTotalAmount = xmlFactory.createAmountType();
- allowanceTotalAmount.setCurrencyID(currency);
- if (trans.getZFAllowances() != null) {
- BigDecimal totalHeaderAllowance = BigDecimal.ZERO;
- for (IZUGFeRDAllowanceCharge headerAllowance : trans
- .getZFAllowances()) {
- totalHeaderAllowance = headerAllowance.getTotalAmount().add(
- totalHeaderAllowance);
- }
- allowanceTotalAmount.setValue(currencyFormat(totalHeaderAllowance));
- } else {
- allowanceTotalAmount.setValue(currencyFormat(BigDecimal.ZERO));
- }
- monetarySummation.getAllowanceTotalAmount().add(allowanceTotalAmount);
-
- // ChargeTotalAmount = sum of all Logistic service charges + normal
- // charges
- BigDecimal totalCharge = BigDecimal.ZERO;
- AmountType totalChargeAmount = xmlFactory.createAmountType();
- totalChargeAmount.setCurrencyID(currency);
- if (trans.getZFLogisticsServiceCharges() != null) {
- for (IZUGFeRDAllowanceCharge logisticsServiceCharge : trans
- .getZFLogisticsServiceCharges()) {
- totalCharge = logisticsServiceCharge.getTotalAmount().add(
- totalCharge);
- }
- }
- if (trans.getZFCharges() != null) {
- for (IZUGFeRDAllowanceCharge charge : trans.getZFCharges()) {
- totalCharge = charge.getTotalAmount().add(totalCharge);
- }
- }
-
- totalChargeAmount.setValue(currencyFormat(totalCharge));
-
- monetarySummation.getChargeTotalAmount().add(totalChargeAmount);
-
- /*
- * AmountType chargeTotalAmount = xmlFactory.createAmountType();
- * chargeTotalAmount.setCurrencyID(trans.getInvoiceCurrency());
- * chargeTotalAmount.setValue(currencyFormat(BigDecimal.ZERO));
- * monetarySummation.getChargeTotalAmount().add(chargeTotalAmount);
- */
-
- AmountType lineTotalAmount = xmlFactory.createAmountType();
- lineTotalAmount.setCurrencyID(currency);
- lineTotalAmount.setValue(currencyFormat(totals.getLineTotal()));
- monetarySummation.getLineTotalAmount().add(lineTotalAmount);
-
- AmountType taxBasisTotalAmount = xmlFactory.createAmountType();
- taxBasisTotalAmount.setCurrencyID(currency);
- taxBasisTotalAmount.setValue(currencyFormat(totals.getTotalNet()));
- monetarySummation.getTaxBasisTotalAmount().add(taxBasisTotalAmount);
-
- AmountType taxTotalAmount = xmlFactory.createAmountType();
- taxTotalAmount.setCurrencyID(currency);
- taxTotalAmount.setValue(currencyFormat(totals.getTaxTotal()));
- monetarySummation.getTaxTotalAmount().add(taxTotalAmount);
-
- AmountType grandTotalAmount = xmlFactory.createAmountType();
- grandTotalAmount.setCurrencyID(currency);
- grandTotalAmount.setValue(currencyFormat(totals.getTotalGross()));
- monetarySummation.getGrandTotalAmount().add(grandTotalAmount);
-
- AmountType duePayableAmount = xmlFactory.createAmountType();
- duePayableAmount.setCurrencyID(currency);
- duePayableAmount.setValue(currencyFormat(totals.getTotalGross()));
- monetarySummation.getDuePayableAmount().add(duePayableAmount);
-
- return monetarySummation;
- }
-
- private Collection getLineItems() {
-
- ArrayList lineItems = new ArrayList();
- int lineID = 0;
- for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
- lineID++;
- LineCalc lc = new LineCalc(currentItem);
- SupplyChainTradeLineItemType lineItem = xmlFactory
- .createSupplyChainTradeLineItemType();
-
- DocumentLineDocumentType lineDocument = xmlFactory
- .createDocumentLineDocumentType();
- IDType lineNumber = xmlFactory.createIDType();
- lineNumber.setValue(Integer.toString(lineID));
- lineDocument.setLineID(lineNumber);
- lineItem.setAssociatedDocumentLineDocument(lineDocument);
-
- SupplyChainTradeAgreementType tradeAgreement = xmlFactory
- .createSupplyChainTradeAgreementType();
- TradePriceType grossTradePrice = xmlFactory.createTradePriceType();
- QuantityType grossQuantity = xmlFactory.createQuantityType();
- grossQuantity.setUnitCode(currentItem.getProduct().getUnit());
- grossQuantity.setValue(quantityFormat(BigDecimal.ONE));
- grossTradePrice.setBasisQuantity(grossQuantity);
-
- AmountType grossChargeAmount = xmlFactory.createAmountType();
- grossChargeAmount.setCurrencyID(currency);
- grossChargeAmount.setValue(priceFormat(currentItem.getPrice()));
- grossTradePrice.getChargeAmount().add(grossChargeAmount);
- tradeAgreement.getGrossPriceProductTradePrice()
- .add(grossTradePrice);
-
- if (currentItem.getItemAllowances() != null) {
- for (IZUGFeRDAllowanceCharge itemAllowance : currentItem
- .getItemAllowances()) {
- TradeAllowanceChargeType eItemAllowance = xmlFactory
- .createTradeAllowanceChargeType();
- IndicatorType chargeIndicator = xmlFactory
- .createIndicatorType();
- chargeIndicator.setIndicator(false);
- eItemAllowance.setChargeIndicator(chargeIndicator);
- AmountType actualAmount = xmlFactory.createAmountType();
- actualAmount.setCurrencyID(currency);
- actualAmount.setValue(priceFormat(itemAllowance
- .getTotalAmount().divide(currentItem.getQuantity(),
- 4, BigDecimal.ROUND_HALF_UP)));
- eItemAllowance.getActualAmount().add(actualAmount);
- TextType reason = xmlFactory.createTextType();
- reason.setValue(itemAllowance.getReason());
- eItemAllowance.setReason(reason);
- grossTradePrice.getAppliedTradeAllowanceCharge().add(
- eItemAllowance);
- }
- }
-
- if (currentItem.getItemCharges() != null) {
- for (IZUGFeRDAllowanceCharge itemCharge : currentItem
- .getItemCharges()) {
- TradeAllowanceChargeType eItemCharge = xmlFactory
- .createTradeAllowanceChargeType();
- AmountType actualAmount = xmlFactory.createAmountType();
- actualAmount.setCurrencyID(currency);
- actualAmount.setValue(priceFormat(itemCharge
- .getTotalAmount().divide(currentItem.getQuantity(),
- 4, BigDecimal.ROUND_HALF_UP)));
- eItemCharge.getActualAmount().add(actualAmount);
- TextType reason = xmlFactory.createTextType();
- reason.setValue(itemCharge.getReason());
- eItemCharge.setReason(reason);
- IndicatorType chargeIndicator = xmlFactory
- .createIndicatorType();
- chargeIndicator.setIndicator(true);
- eItemCharge.setChargeIndicator(chargeIndicator);
- grossTradePrice.getAppliedTradeAllowanceCharge().add(
- eItemCharge);
- }
- }
-
- TradePriceType netTradePrice = xmlFactory.createTradePriceType();
- QuantityType netQuantity = xmlFactory.createQuantityType();
- netQuantity.setUnitCode(currentItem.getProduct().getUnit());
- netQuantity.setValue(quantityFormat(BigDecimal.ONE));
- netTradePrice.setBasisQuantity(netQuantity);
-
- AmountType netChargeAmount = xmlFactory.createAmountType();
- netChargeAmount.setCurrencyID(currency);
- netChargeAmount.setValue(priceFormat(lc.getItemNetAmount()));
- netTradePrice.getChargeAmount().add(netChargeAmount);
- tradeAgreement.getNetPriceProductTradePrice().add(netTradePrice);
-
- lineItem.setSpecifiedSupplyChainTradeAgreement(tradeAgreement);
-
- SupplyChainTradeDeliveryType tradeDelivery = xmlFactory
- .createSupplyChainTradeDeliveryType();
- QuantityType billedQuantity = xmlFactory.createQuantityType();
- billedQuantity.setUnitCode(currentItem.getProduct().getUnit());
- billedQuantity.setValue(quantityFormat(currentItem.getQuantity()));
- tradeDelivery.setBilledQuantity(billedQuantity);
- lineItem.setSpecifiedSupplyChainTradeDelivery(tradeDelivery);
-
- SupplyChainTradeSettlementType tradeSettlement = xmlFactory
- .createSupplyChainTradeSettlementType();
- TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
-
- TaxCategoryCodeType taxCategoryCode = xmlFactory
- .createTaxCategoryCodeType();
- taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
- tradeTax.setCategoryCode(taxCategoryCode);
-
- TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
- tradeTax.setTypeCode(taxCode);
-
- PercentType taxPercent = xmlFactory.createPercentType();
- taxPercent.setValue(vatFormat(currentItem.getProduct()
- .getVATPercent()));
- tradeTax.setApplicablePercent(taxPercent);
- tradeSettlement.getApplicableTradeTax().add(tradeTax);
-
- TradeSettlementMonetarySummationType monetarySummation = xmlFactory
- .createTradeSettlementMonetarySummationType();
- AmountType itemAmount = xmlFactory.createAmountType();
- itemAmount.setCurrencyID(currency);
- itemAmount.setValue(currencyFormat(lc.getItemTotalNetAmount()));
- monetarySummation.getLineTotalAmount().add(itemAmount);
- tradeSettlement
- .setSpecifiedTradeSettlementMonetarySummation(monetarySummation);
-
- lineItem.setSpecifiedSupplyChainTradeSettlement(tradeSettlement);
-
- TradeProductType tradeProduct = xmlFactory.createTradeProductType();
- TextType productName = xmlFactory.createTextType();
- productName.setValue(currentItem.getProduct().getName());
- tradeProduct.getName().add(productName);
-
- TextType productDescription = xmlFactory.createTextType();
- productDescription.setValue(currentItem.getProduct()
- .getDescription());
- tradeProduct.getDescription().add(productDescription);
- lineItem.setSpecifiedTradeProduct(tradeProduct);
-
- lineItems.add(lineItem);
- }
-
- return lineItems;
-
- }
-
- /**
- * 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 (=>190 EUR VAT) and 200 EUR were applicable to 7% (=>14 EUR VAT)
- * 190 Eur
- *
- * @return HashMap
- *
- */
- private HashMap getVATPercentAmountMap() {
- return getVATPercentAmountMap(false);
- }
-
- private HashMap getVATPercentAmountMap(
- Boolean itemOnly) {
- HashMap hm = new HashMap();
-
- for (IZUGFeRDExportableItem currentItem : trans.getZFItems()) {
- BigDecimal percent = currentItem.getProduct().getVATPercent();
- LineCalc lc = new LineCalc(currentItem);
- VATAmount itemVATAmount = new VATAmount(lc.getItemTotalNetAmount(),
- lc.getItemTotalVATAmount());
- VATAmount current = hm.get(percent);
- if (current == null) {
- hm.put(percent, itemVATAmount);
- } else {
- hm.put(percent, current.add(itemVATAmount));
- }
- }
- if (itemOnly) {
- return hm;
- }
- if (trans.getZFAllowances() != null) {
- for (IZUGFeRDAllowanceCharge headerAllowance : trans
- .getZFAllowances()) {
- BigDecimal percent = headerAllowance.getTaxPercent();
- VATAmount itemVATAmount = new VATAmount(
- headerAllowance.getTotalAmount(), headerAllowance
- .getTotalAmount().multiply(percent)
- .divide(new BigDecimal(100)));
- VATAmount current = hm.get(percent);
- if (current == null) {
- hm.put(percent, itemVATAmount);
- } else {
- hm.put(percent, current.subtract(itemVATAmount));
- }
- }
- }
-
- if (trans.getZFLogisticsServiceCharges() != null) {
- for (IZUGFeRDAllowanceCharge logisticsServiceCharge : trans
- .getZFLogisticsServiceCharges()) {
- BigDecimal percent = logisticsServiceCharge.getTaxPercent();
- VATAmount itemVATAmount = new VATAmount(
- logisticsServiceCharge.getTotalAmount(),
- logisticsServiceCharge.getTotalAmount()
- .multiply(percent).divide(new BigDecimal(100)));
- VATAmount current = hm.get(percent);
- if (current == null) {
- hm.put(percent, itemVATAmount);
- } else {
- hm.put(percent, current.add(itemVATAmount));
- }
- }
- }
-
- if (trans.getZFCharges() != null) {
- for (IZUGFeRDAllowanceCharge charge : trans.getZFCharges()) {
- BigDecimal percent = charge.getTaxPercent();
- VATAmount itemVATAmount = new VATAmount(
- charge.getTotalAmount(), charge.getTotalAmount()
- .multiply(percent).divide(new BigDecimal(100)));
- VATAmount current = hm.get(percent);
- if (current == null) {
- hm.put(percent, itemVATAmount);
- } else {
- hm.put(percent, current.add(itemVATAmount));
- }
- }
- }
-
- return hm;
- }
/**
* Embeds the Zugferd XML structure in a file named ZUGFeRD-invoice.xml.
@@ -1323,7 +264,7 @@ public class ZUGFeRDExporter implements Closeable {
* data should hav ebeen set via
* setZUGFeRDXMLData(byte[] zugferdData)
*/
- public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans1)
+ public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans)
throws IOException {
if (zugferdData == null) // XML ZUGFeRD data not set externally, needs
@@ -1332,7 +273,7 @@ public class ZUGFeRDExporter implements Closeable {
// create a dummy file stream, this would probably normally be a
// FileInputStream
- byte[] zugferdRaw = createZugferdXMLForTransaction(trans1).getBytes(); //$NON-NLS-1$
+ byte[] zugferdRaw = createZugferdXMLForTransaction(trans).getBytes(); //$NON-NLS-1$
if ((zugferdRaw[0] == (byte) 0xEF)
&& (zugferdRaw[1] == (byte) 0xBB)
@@ -1373,9 +314,9 @@ public class ZUGFeRDExporter implements Closeable {
* type of the data e.g. could be "text/xml" - mime like
* @param data
* the binary data of the file/attachment
- * @throws java.io.IOException
+ * @throws java.io.IOException
*/
- public void PDFAttachGenericFile(PDDocument doc1, String filename,
+ public void PDFAttachGenericFile(PDDocument doc, String filename,
String relationship, String description, String subType, byte[] data)
throws IOException {
PDComplexFileSpecification fs = new PDComplexFileSpecification();
@@ -1388,7 +329,7 @@ public class ZUGFeRDExporter implements Closeable {
dict.setString("Desc", description);
ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);
- PDEmbeddedFile ef = new PDEmbeddedFile(doc1, fakeFile);
+ PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile);
ef.setSubtype(subType);
ef.setSize(data.length);
ef.setCreationDate(new GregorianCalendar());
@@ -1406,13 +347,13 @@ public class ZUGFeRDExporter implements Closeable {
// now add the entry to the embedded file tree and set in the document.
PDDocumentNameDictionary names = new PDDocumentNameDictionary(
- doc1.getDocumentCatalog());
+ doc.getDocumentCatalog());
PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles();
if (efTree == null) {
efTree = new PDEmbeddedFilesNameTreeNode();
}
- Map namesMap = new HashMap();
+ Map namesMap = new HashMap<>();
Map oldNamesMap = efTree.getNames();
if (oldNamesMap != null) {
@@ -1424,20 +365,20 @@ public class ZUGFeRDExporter implements Closeable {
efTree.setNames(namesMap);
names.setEmbeddedFiles(efTree);
- doc1.getDocumentCatalog().setNames(names);
+ doc.getDocumentCatalog().setNames(names);
// AF entry (Array) in catalog with the FileSpec
- COSArray cosArray = (COSArray) doc1.getDocumentCatalog()
+ COSArray cosArray = (COSArray) doc.getDocumentCatalog()
.getCOSObject().getItem("AF");
if (cosArray == null) {
cosArray = new COSArray();
}
cosArray.add(fs);
- COSDictionary dict2 = doc1.getDocumentCatalog().getCOSObject();
+ COSDictionary dict2 = doc.getDocumentCatalog().getCOSObject();
COSArray array = new COSArray();
array.add(fs.getCOSObject()); // see below
dict2.setItem("AF",array);
- doc1.getDocumentCatalog().getCOSObject().setItem("AF", cosArray);
+ doc.getDocumentCatalog().getCOSObject().setItem("AF", cosArray);
}
/**
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java
index 107e28b4..9261d84f 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java
@@ -44,14 +44,9 @@ public class ZUGFeRDExporterFromA1Factory {
*/
public ZUGFeRDExporter loadFromPDFA1(String pdfFilename) throws IOException {
ensurePDFIsValidA1(new FileDataSource(pdfFilename));
-
- ZUGFeRDExporter zugFeRDExporter = null;
- try(PDDocument doc = PDDocument.load(new File(pdfFilename))) {
- makePDFA3compliant(doc);
- zugFeRDExporter = new ZUGFeRDExporter(doc);
- }
-
- return zugFeRDExporter;
+ PDDocument doc = PDDocument.load(new File(pdfFilename));
+ makePDFA3compliant(doc);
+ return new ZUGFeRDExporter(doc);
}
/**
@@ -62,12 +57,10 @@ public class ZUGFeRDExporterFromA1Factory {
*/
public ZUGFeRDExporter loadFromPDFA1(byte[] pdfBinary) throws IOException {
ensurePDFIsValidA1(new ByteArrayDataSource(new ByteArrayInputStream(pdfBinary)));
-
ZUGFeRDExporter zugFeRDExporter;
- try (PDDocument doc = PDDocument.load(pdfBinary)) {
- makePDFA3compliant(doc);
- zugFeRDExporter = new ZUGFeRDExporter(doc);
- }
+ PDDocument doc = PDDocument.load(pdfBinary);
+ makePDFA3compliant(doc);
+ zugFeRDExporter = new ZUGFeRDExporter(doc);
return zugFeRDExporter;
}
diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
index 187ea121..ac31953f 100644
--- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
+++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDTransactionModelConverter.java
@@ -7,8 +7,11 @@ import org.mustangproject.ZUGFeRD.model.CreditorFinancialAccountType;
import org.mustangproject.ZUGFeRD.model.CreditorFinancialInstitutionType;
import org.mustangproject.ZUGFeRD.model.CrossIndustryDocumentType;
import org.mustangproject.ZUGFeRD.model.DateTimeType;
+import org.mustangproject.ZUGFeRD.model.DateTimeTypeConstants;
import org.mustangproject.ZUGFeRD.model.DocumentCodeType;
+import org.mustangproject.ZUGFeRD.model.DocumentCodeTypeConstants;
import org.mustangproject.ZUGFeRD.model.DocumentContextParameterType;
+import org.mustangproject.ZUGFeRD.model.DocumentContextParameterTypeConstants;
import org.mustangproject.ZUGFeRD.model.DocumentLineDocumentType;
import org.mustangproject.ZUGFeRD.model.ExchangedDocumentContextType;
import org.mustangproject.ZUGFeRD.model.ExchangedDocumentType;
@@ -16,8 +19,10 @@ import org.mustangproject.ZUGFeRD.model.IDType;
import org.mustangproject.ZUGFeRD.model.IndicatorType;
import org.mustangproject.ZUGFeRD.model.LogisticsServiceChargeType;
import org.mustangproject.ZUGFeRD.model.NoteType;
+import org.mustangproject.ZUGFeRD.model.NoteTypeConstants;
import org.mustangproject.ZUGFeRD.model.ObjectFactory;
import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeType;
+import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeTypeConstants;
import org.mustangproject.ZUGFeRD.model.PercentType;
import org.mustangproject.ZUGFeRD.model.QuantityType;
import org.mustangproject.ZUGFeRD.model.SupplyChainEventType;
@@ -27,8 +32,11 @@ import org.mustangproject.ZUGFeRD.model.SupplyChainTradeLineItemType;
import org.mustangproject.ZUGFeRD.model.SupplyChainTradeSettlementType;
import org.mustangproject.ZUGFeRD.model.SupplyChainTradeTransactionType;
import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeType;
+import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeTypeConstants;
import org.mustangproject.ZUGFeRD.model.TaxRegistrationType;
+import org.mustangproject.ZUGFeRD.model.TaxRegistrationTypeConstants;
import org.mustangproject.ZUGFeRD.model.TaxTypeCodeType;
+import org.mustangproject.ZUGFeRD.model.TaxTypeCodeTypeConstants;
import org.mustangproject.ZUGFeRD.model.TextType;
import org.mustangproject.ZUGFeRD.model.TradeAddressType;
import org.mustangproject.ZUGFeRD.model.TradeAllowanceChargeType;
@@ -86,7 +94,7 @@ class ZUGFeRDTransactionModelConverter {
DocumentContextParameterType contextParameter = xmlFactory
.createDocumentContextParameterType();
IDType idType = xmlFactory.createIDType();
- idType.setValue(DocumentContextParameterType.EXTENDED);
+ idType.setValue(DocumentContextParameterTypeConstants.EXTENDED);
contextParameter.setID(idType);
context.getGuidelineSpecifiedDocumentContextParameter().add(
contextParameter);
@@ -110,14 +118,14 @@ class ZUGFeRDTransactionModelConverter {
DateTimeType issueDateTime = xmlFactory.createDateTimeType();
DateTimeType.DateTimeString issueDateTimeString = xmlFactory
.createDateTimeTypeDateTimeString();
- issueDateTimeString.setFormat(DateTimeType.DateTimeString.DATE);
+ issueDateTimeString.setFormat(DateTimeTypeConstants.DATE);
issueDateTimeString.setValue(zugferdDateFormat.format(trans
.getIssueDate()));
issueDateTime.setDateTimeString(issueDateTimeString);
document.setIssueDateTime(issueDateTime);
DocumentCodeType documentCodeType = xmlFactory.createDocumentCodeType();
- documentCodeType.setValue(DocumentCodeType.INVOICE);
+ documentCodeType.setValue(DocumentCodeTypeConstants.INVOICE);
document.setTypeCode(documentCodeType);
TextType name = xmlFactory.createTextType();
@@ -127,7 +135,7 @@ class ZUGFeRDTransactionModelConverter {
if (trans.getOwnOrganisationFullPlaintextInfo() != null) {
NoteType regularInfo = xmlFactory.createNoteType();
CodeType regularInfoSubjectCode = xmlFactory.createCodeType();
- regularInfoSubjectCode.setValue(NoteType.REGULARINFO);
+ regularInfoSubjectCode.setValue(NoteTypeConstants.REGULARINFO);
regularInfo.setSubjectCode(regularInfoSubjectCode);
TextType regularInfoContent = xmlFactory.createTextType();
regularInfoContent.setValue(trans
@@ -205,7 +213,7 @@ class ZUGFeRDTransactionModelConverter {
.createTaxRegistrationType();
IDType buyerUstId = xmlFactory.createIDType();
buyerUstId.setValue(trans.getRecipient().getVATID());
- buyerUstId.setSchemeID(TaxRegistrationType.USTID);
+ buyerUstId.setSchemeID(TaxRegistrationTypeConstants.USTID);
buyerTaxRegistration.setID(buyerUstId);
buyerTradeParty.getSpecifiedTaxRegistration().add(buyerTaxRegistration);
@@ -244,7 +252,7 @@ class ZUGFeRDTransactionModelConverter {
.createTaxRegistrationType();
IDType sellerTaxId = xmlFactory.createIDType();
sellerTaxId.setValue(trans.getOwnTaxID());
- sellerTaxId.setSchemeID(TaxRegistrationType.TAXID);
+ sellerTaxId.setSchemeID(TaxRegistrationTypeConstants.TAXID);
sellerTaxRegistration.setID(sellerTaxId);
sellerTradeParty.getSpecifiedTaxRegistration().add(
sellerTaxRegistration);
@@ -253,7 +261,7 @@ class ZUGFeRDTransactionModelConverter {
sellerTaxRegistration = xmlFactory.createTaxRegistrationType();
IDType sellerUstId = xmlFactory.createIDType();
sellerUstId.setValue(trans.getOwnVATID());
- sellerUstId.setSchemeID(TaxRegistrationType.USTID);
+ sellerUstId.setSchemeID(TaxRegistrationTypeConstants.USTID);
sellerTaxRegistration.setID(sellerUstId);
sellerTradeParty.getSpecifiedTaxRegistration().add(
sellerTaxRegistration);
@@ -270,7 +278,7 @@ class ZUGFeRDTransactionModelConverter {
DateTimeType deliveryDate = xmlFactory.createDateTimeType();
DateTimeType.DateTimeString deliveryDateString = xmlFactory
.createDateTimeTypeDateTimeString();
- deliveryDateString.setFormat(DateTimeType.DateTimeString.DATE);
+ deliveryDateString.setFormat(DateTimeTypeConstants.DATE);
deliveryDateString.setValue(zugferdDateFormat.format(trans
.getDeliveryDate()));
deliveryDate.setDateTimeString(deliveryDateString);
@@ -321,7 +329,7 @@ class ZUGFeRDTransactionModelConverter {
.createTradeSettlementPaymentMeansType();
PaymentMeansCodeType paymentDataType = xmlFactory
.createPaymentMeansCodeType();
- paymentDataType.setValue(PaymentMeansCodeType.BANKACCOUNT);
+ paymentDataType.setValue(PaymentMeansCodeTypeConstants.BANKACCOUNT);
paymentData.setTypeCode(paymentDataType);
TextType paymentInfo = xmlFactory.createTextType();
@@ -360,12 +368,12 @@ class ZUGFeRDTransactionModelConverter {
TradeTaxType tradeTax = xmlFactory.createTradeTaxType();
TaxTypeCodeType taxTypeCode = xmlFactory.createTaxTypeCodeType();
- taxTypeCode.setValue(TaxTypeCodeType.SALESTAX);
+ taxTypeCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxTypeCode);
TaxCategoryCodeType taxCategoryCode = xmlFactory
.createTaxCategoryCodeType();
- taxCategoryCode.setValue(TaxCategoryCodeType.STANDARDRATE);
+ taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxCategoryCode);
VATAmount amount = VATPercentAmountMap.get(currentTaxPercent);
@@ -427,11 +435,11 @@ class ZUGFeRDTransactionModelConverter {
*/
TaxCategoryCodeType taxType = xmlFactory
.createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeType.STANDARDRATE);
+ taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeType.SALESTAX);
+ taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxCode);
allowance.getCategoryTradeTax().add(tradeTax);
@@ -478,11 +486,11 @@ class ZUGFeRDTransactionModelConverter {
*/
TaxCategoryCodeType taxType = xmlFactory
.createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeType.STANDARDRATE);
+ taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeType.SALESTAX);
+ taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxCode);
charge.getCategoryTradeTax().add(tradeTax);
@@ -527,11 +535,11 @@ class ZUGFeRDTransactionModelConverter {
*/
TaxCategoryCodeType taxType = xmlFactory
.createTaxCategoryCodeType();
- taxType.setValue(TaxCategoryCodeType.STANDARDRATE);
+ taxType.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxType);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeType.SALESTAX);
+ taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxCode);
serviceCharge.getAppliedTradeTax().add(tradeTax);
@@ -550,7 +558,7 @@ class ZUGFeRDTransactionModelConverter {
DateTimeType dueDate = xmlFactory.createDateTimeType();
DateTimeType.DateTimeString dueDateString = xmlFactory
.createDateTimeTypeDateTimeString();
- dueDateString.setFormat(DateTimeType.DateTimeString.DATE);
+ dueDateString.setFormat(DateTimeTypeConstants.DATE);
dueDateString.setValue(zugferdDateFormat.format(trans.getDueDate()));
dueDate.setDateTimeString(dueDateString);
paymentTerm.setDueDateDateTime(dueDate);
@@ -752,11 +760,11 @@ class ZUGFeRDTransactionModelConverter {
TaxCategoryCodeType taxCategoryCode = xmlFactory
.createTaxCategoryCodeType();
- taxCategoryCode.setValue(TaxCategoryCodeType.STANDARDRATE);
+ taxCategoryCode.setValue(TaxCategoryCodeTypeConstants.STANDARDRATE);
tradeTax.setCategoryCode(taxCategoryCode);
TaxTypeCodeType taxCode = xmlFactory.createTaxTypeCodeType();
- taxCode.setValue(TaxTypeCodeType.SALESTAX);
+ taxCode.setValue(TaxTypeCodeTypeConstants.SALESTAX);
tradeTax.setTypeCode(taxCode);
PercentType taxPercent = xmlFactory.createPercentType();
diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java
index 0394aca3..998a9be2 100644
--- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java
+++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java
@@ -401,22 +401,19 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp
public void testZExport() throws Exception
{
- final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf";
+ final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf";
+ // the writing part
- ZUGFeRDExporter ze = null;
- try {
- // automatically add Zugferd to all outgoing invoices
- ze = new ZUGFeRDExporterFromA1Factory()
+ try(InputStream SOURCE_PDF =
+ this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
+
+ ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory()
.setProducer("My Application")
.setCreator(System.getProperty("user.name"))
- .loadFromPDFA1(SOURCE_PDF);
-
+ .loadFromPDFA1(SOURCE_PDF)) {
+
ze.PDFattachZugferdFile(this);
ze.export(TARGET_PDF);
- } finally {
- if (ze != null) {
- ze.close();
- }
}
// now check the contents (like MustangReaderTest)
diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java
index 8077291b..bf7b7d44 100644
--- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java
+++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java
@@ -402,23 +402,19 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
public void testZExport() throws Exception
{
- final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505new.pdf";
+ final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505new.pdf";
// the writing part
- ZUGFeRDExporter ze = null;
- try {
- // automatically add Zugferd to all outgoing invoices
- ze = new ZUGFeRDExporterFromA1Factory()
+ try(InputStream SOURCE_PDF =
+ this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
+
+ ZUGFeRDExporter ze = new ZUGFeRDExporterFromA1Factory()
.setProducer("My Application")
.setCreator(System.getProperty("user.name"))
- .loadFromPDFA1(SOURCE_PDF);
+ .loadFromPDFA1(SOURCE_PDF)) {
ze.PDFattachZugferdFile(this);
ze.export(TARGET_PDF);
- } finally {
- if (ze != null) {
- ze.close();
- }
}
// now check the contents (like MustangReaderTest)