no message

This commit is contained in:
jstaerk
2024-11-28 23:53:48 +01:00
parent 8932646b59
commit 4cf72bea37
17 changed files with 57 additions and 2 deletions

View File

@@ -4,6 +4,7 @@
? be able to access ID in error message ? be able to access ID in error message
- closes #579 prepaidamount is only read in UBL - closes #579 prepaidamount is only read in UBL
- #581 parse lineTotalAmount - #581 parse lineTotalAmount
- also parse TaxBasisAmount
- #576 read lineid, #578 set lineid - #576 read lineid, #578 set lineid
- log error ids - log error ids
- #503 import more ubl - #503 import more ubl
@@ -11,6 +12,7 @@
- allow json includedNotes - allow json includedNotes
- support importing duePayableAmount - support importing duePayableAmount
2.15.0 2.15.0
======= =======
2024-11-18 2024-11-18

View File

@@ -2,6 +2,7 @@ package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -9,6 +10,7 @@ import java.math.BigDecimal;
* (absolute) allowances on item and document level * (absolute) allowances on item and document level
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Allowance extends Charge { public class Allowance extends Charge {
/*** /***

View File

@@ -2,12 +2,14 @@ package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementPayment; import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementPayment;
/** /**
* provides e.g. the IBAN to transfer money to :-) * provides e.g. the IBAN to transfer money to :-)
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class BankDetails implements IZUGFeRDTradeSettlementPayment { public class BankDetails implements IZUGFeRDTradeSettlementPayment {
/** /**
* the bank account number * the bank account number

View File

@@ -3,6 +3,7 @@ package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.TransactionCalculator; import org.mustangproject.ZUGFeRD.TransactionCalculator;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -11,17 +12,20 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class CalculatedInvoice extends Invoice implements Serializable { public class CalculatedInvoice extends Invoice implements Serializable {
protected BigDecimal lineTotalAmount=null;
protected BigDecimal duePayable=null; protected BigDecimal duePayable=null;
protected BigDecimal grandTotal=null; protected BigDecimal grandTotal=null;
protected BigDecimal lineTotalAmount=null; protected BigDecimal taxBasis=null;
public void calculate() { public void calculate() {
TransactionCalculator tc=new TransactionCalculator(this); TransactionCalculator tc=new TransactionCalculator(this);
grandTotal=tc.getGrandTotal(); grandTotal=tc.getGrandTotal();
lineTotalAmount=tc.getValue(); lineTotalAmount=tc.getValue();
duePayable=tc.getDuePayable(); duePayable=tc.getDuePayable();
taxBasis= tc.getTaxBasis();
} }
public BigDecimal getGrandTotal() { public BigDecimal getGrandTotal() {
if (grandTotal==null) { if (grandTotal==null) {
@@ -33,6 +37,16 @@ public class CalculatedInvoice extends Invoice implements Serializable {
grandTotal=grand; grandTotal=grand;
return this; return this;
} }
public BigDecimal getTaxBasis() {
if (taxBasis==null) {
calculate();
}
return taxBasis;
}
public CalculatedInvoice setTaxBasis(BigDecimal basis) {
taxBasis=basis;
return this;
}
public BigDecimal getDuePayable() { public BigDecimal getDuePayable() {
if (duePayable==null) { if (duePayable==null) {

View File

@@ -1,6 +1,7 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IZUGFeRDCashDiscount; import org.mustangproject.ZUGFeRD.IZUGFeRDCashDiscount;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -9,6 +10,7 @@ import java.math.BigDecimal;
* A class to represent discounts for early payments ("Skonto") * A class to represent discounts for early payments ("Skonto")
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class CashDiscount implements IZUGFeRDCashDiscount { public class CashDiscount implements IZUGFeRDCashDiscount {
/*** /***

View File

@@ -2,6 +2,7 @@ package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IAbsoluteValueProvider; import org.mustangproject.ZUGFeRD.IAbsoluteValueProvider;
import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge; import org.mustangproject.ZUGFeRD.IZUGFeRDAllowanceCharge;
@@ -11,6 +12,7 @@ import java.math.BigDecimal;
* Absolute and relative charges for document and item level * Absolute and relative charges for document and item level
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Charge implements IZUGFeRDAllowanceCharge { public class Charge implements IZUGFeRDAllowanceCharge {
/** /**

View File

@@ -21,6 +21,7 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@@ -28,6 +29,7 @@ import org.w3c.dom.Node;
* A schemed classification for products. The scheme can be anything defined in UNTDID 7143. * A schemed classification for products. The scheme can be anything defined in UNTDID 7143.
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ClassCode { public class ClassCode {
private final String listID; private final String listID;
private final String code; private final String code;

View File

@@ -1,6 +1,7 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact; import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@@ -11,6 +12,7 @@ import org.w3c.dom.NodeList;
* @see TradeParty * @see TradeParty
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Contact implements IZUGFeRDExportableContact { public class Contact implements IZUGFeRDExportableContact {
/** /**

View File

@@ -21,6 +21,7 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IDesignatedProductClassification; import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
/** /**
@@ -28,6 +29,7 @@ import org.mustangproject.ZUGFeRD.IDesignatedProductClassification;
* *
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class DesignatedProductClassification implements IDesignatedProductClassification { public class DesignatedProductClassification implements IDesignatedProductClassification {
private final ClassCode classCode; private final ClassCode classCode;
private String className; private String className;

View File

@@ -1,12 +1,14 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementDebit; import org.mustangproject.ZUGFeRD.IZUGFeRDTradeSettlementDebit;
/** /**
* provides e.g. the IBAN to transfer money to :-) * provides e.g. the IBAN to transfer money to :-)
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class DirectDebit implements IZUGFeRDTradeSettlementDebit { public class DirectDebit implements IZUGFeRDTradeSettlementDebit {
/** /**
* Debited account identifier (BT-91) * Debited account identifier (BT-91)

View File

@@ -1,8 +1,10 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FileAttachment { public class FileAttachment {
protected String filename; protected String filename;

View File

@@ -1,11 +1,13 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
/** /**
* A grouping of business terms to indicate accounting-relevant free texts including a qualification of these. * A grouping of business terms to indicate accounting-relevant free texts including a qualification of these.
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class IncludedNote { public class IncludedNote {
private String content; private String content;

View File

@@ -1,6 +1,7 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.*; import org.mustangproject.ZUGFeRD.*;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@@ -9,6 +10,7 @@ import org.w3c.dom.NodeList;
* A organisation, i.e. usually a company * A organisation, i.e. usually a company
*/ */
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class LegalOrganisation implements IZUGFeRDLegalOrganisation { public class LegalOrganisation implements IZUGFeRDLegalOrganisation {
protected SchemedID schemedID = null; protected SchemedID schemedID = null;

View File

@@ -1,11 +1,13 @@
package org.mustangproject; package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.mustangproject.ZUGFeRD.IReferencedDocument; import org.mustangproject.ZUGFeRD.IReferencedDocument;
import org.mustangproject.util.NodeMap; import org.mustangproject.util.NodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ReferencedDocument implements IReferencedDocument { public class ReferencedDocument implements IReferencedDocument {
String issuerAssignedID; String issuerAssignedID;

View File

@@ -2,8 +2,10 @@ package org.mustangproject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class SchemedID { public class SchemedID {
protected String scheme; protected String scheme;
protected String id; protected String id;

View File

@@ -149,7 +149,7 @@ public class TransactionCalculator implements IAbsoluteValueProvider {
* *
* @return item sum +- charges/allowances * @return item sum +- charges/allowances
*/ */
protected BigDecimal getTaxBasis() { public BigDecimal getTaxBasis() {
return getTotal().add(getChargesForPercent(null).setScale(2, RoundingMode.HALF_UP)) return getTotal().add(getChargesForPercent(null).setScale(2, RoundingMode.HALF_UP))
.subtract(getAllowancesForPercent(null).setScale(2, RoundingMode.HALF_UP)) .subtract(getAllowancesForPercent(null).setScale(2, RoundingMode.HALF_UP))
.setScale(2, RoundingMode.HALF_UP); .setScale(2, RoundingMode.HALF_UP);

View File

@@ -400,6 +400,19 @@ public class ZUGFeRDInvoiceImporter {
} }
} }
xpr = xpath.compile("//*[local-name()=\"TaxBasisTotalAmount\"]|//*[local-name()=\"TaxExclusiveAmount\"]");
BigDecimal expectedTaxBasis = null;
NodeList basisNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
if (basisNodes.getLength() > 0) {
expectedTaxBasis = new BigDecimal(XMLTools.trimOrNull(basisNodes.item(0)));
if (zpp instanceof CalculatedInvoice) {
// usually we would re-calculate the invoice to get expectedGrandTotal
// however, for "minimal" invoices or other invoices without lines
// this will not work
((CalculatedInvoice) zpp).setTaxBasis(expectedTaxBasis);
}
}
xpr = xpath.compile("//*[local-name()=\"TotalPrepaidAmount\"]|//*[local-name()=\"PrepaidAmount\"]"); xpr = xpath.compile("//*[local-name()=\"TotalPrepaidAmount\"]|//*[local-name()=\"PrepaidAmount\"]");
NodeList prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET); NodeList prepaidNodes = (NodeList) xpr.evaluate(getDocument(), XPathConstants.NODESET);
if (prepaidNodes.getLength() > 0) { if (prepaidNodes.getLength() > 0) {