@fin.cx/einvoice 8.2.3 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/formats/cii/cii.encoder.d.ts +10 -0
  3. package/dist_ts/formats/cii/cii.encoder.js +39 -2
  4. package/dist_ts/formats/cii/cii.types.d.ts +11 -0
  5. package/dist_ts/formats/cii/cii.types.js +41 -1
  6. package/dist_ts/formats/cii/facturx/facturx.decoder.js +7 -8
  7. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +1 -0
  8. package/dist_ts/formats/cii/facturx/facturx.encoder.js +23 -6
  9. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +7 -8
  10. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +1 -0
  11. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +51 -33
  12. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +8 -8
  13. package/dist_ts/formats/ubl/generic/ubl.encoder.js +16 -3
  14. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +19 -5
  15. package/dist_ts/formats/ubl/xrechnung.validator.js +14 -11
  16. package/dist_ts/formats/utils/document.totals.js +5 -2
  17. package/dist_ts/formats/utils/eu.memberstates.d.ts +11 -0
  18. package/dist_ts/formats/utils/eu.memberstates.js +16 -0
  19. package/dist_ts/formats/utils/number.text.d.ts +9 -0
  20. package/dist_ts/formats/utils/number.text.js +26 -0
  21. package/dist_ts/formats/utils/vat.category.d.ts +13 -8
  22. package/dist_ts/formats/utils/vat.category.js +16 -11
  23. package/dist_ts/formats/validation/vat-categories.validator.js +3 -7
  24. package/package.json +3 -3
  25. package/readme.md +14 -6
  26. package/ts/00_commitinfo_data.ts +1 -1
  27. package/ts/formats/cii/cii.encoder.ts +39 -1
  28. package/ts/formats/cii/cii.types.ts +41 -0
  29. package/ts/formats/cii/facturx/facturx.decoder.ts +7 -8
  30. package/ts/formats/cii/facturx/facturx.encoder.ts +25 -5
  31. package/ts/formats/cii/zugferd/zugferd.decoder.ts +7 -8
  32. package/ts/formats/cii/zugferd/zugferd.encoder.ts +57 -36
  33. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +7 -8
  34. package/ts/formats/ubl/generic/ubl.encoder.ts +18 -2
  35. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +17 -4
  36. package/ts/formats/ubl/xrechnung.validator.ts +21 -17
  37. package/ts/formats/utils/document.totals.ts +7 -1
  38. package/ts/formats/utils/eu.memberstates.ts +16 -0
  39. package/ts/formats/utils/number.text.ts +25 -0
  40. package/ts/formats/utils/vat.category.ts +15 -10
  41. package/ts/formats/validation/vat-categories.validator.ts +2 -6
@@ -36,14 +36,19 @@ export declare const getVatExemption: (category: TVatCategoryCode, language: str
36
36
  * - BR-AE-05: every line of a reverse charge document has the VAT rate 0; the
37
37
  * recipient owes the tax, and the invoice states none (§ 14a Abs. 5 Satz 2
38
38
  * UStG; a stated amount would be owed under § 14c Abs. 1 UStG).
39
- * - BR-AE-02: the seller states a VAT identifier (BT-31) and the buyer a VAT
40
- * identifier (BT-48) or a legal registration identifier (BT-47). The rule
41
- * also accepts the seller's tax registration identifier (BT-32, e.g. the
42
- * Steuernummer) or a tax representative's VAT identifier (BT-63) instead of
43
- * BT-31; the envelope can state neither, so a seller without a VAT
44
- * identifier is refused. A domestic § 13b issuer that states only a
45
- * Steuernummer, which § 14 Abs. 4 Satz 1 Nr. 2 UStG allows, is therefore
46
- * refused until the envelope carries a tax number.
39
+ * - BR-AE-02: the seller states a VAT identifier (BT-31) or a tax
40
+ * registration identifier (BT-32, `registrationDetails.taxNumber`, the
41
+ * Steuernummer, which § 14 Abs. 4 Satz 1 Nr. 2 UStG allows instead), and the
42
+ * buyer a VAT identifier (BT-48) or a legal registration identifier (BT-47).
43
+ * The rule also accepts a tax representative's VAT identifier (BT-63) for
44
+ * the seller; the envelope cannot state one, so a seller with neither BT-31
45
+ * nor BT-32 is refused.
46
+ * The envelope has no place of supply, so whether a document is one for a
47
+ * supply in another member state, whose invoice states the VAT identification
48
+ * numbers of both parties (§ 14a Abs. 1 Satz 3 UStG), cannot be told here: a
49
+ * domestic § 13b supply to a buyer based in another member state is taxed in
50
+ * Germany and may state a tax number. Only what BR-AE-02 requires is checked;
51
+ * the issuing application enforces § 14a Abs. 1.
47
52
  * @param accountingDoc The document
48
53
  * @param targetFormat The format being written
49
54
  */
@@ -29,14 +29,19 @@ export const getVatExemption = (category, language) => category === 'AE'
29
29
  * - BR-AE-05: every line of a reverse charge document has the VAT rate 0; the
30
30
  * recipient owes the tax, and the invoice states none (§ 14a Abs. 5 Satz 2
31
31
  * UStG; a stated amount would be owed under § 14c Abs. 1 UStG).
32
- * - BR-AE-02: the seller states a VAT identifier (BT-31) and the buyer a VAT
33
- * identifier (BT-48) or a legal registration identifier (BT-47). The rule
34
- * also accepts the seller's tax registration identifier (BT-32, e.g. the
35
- * Steuernummer) or a tax representative's VAT identifier (BT-63) instead of
36
- * BT-31; the envelope can state neither, so a seller without a VAT
37
- * identifier is refused. A domestic § 13b issuer that states only a
38
- * Steuernummer, which § 14 Abs. 4 Satz 1 Nr. 2 UStG allows, is therefore
39
- * refused until the envelope carries a tax number.
32
+ * - BR-AE-02: the seller states a VAT identifier (BT-31) or a tax
33
+ * registration identifier (BT-32, `registrationDetails.taxNumber`, the
34
+ * Steuernummer, which § 14 Abs. 4 Satz 1 Nr. 2 UStG allows instead), and the
35
+ * buyer a VAT identifier (BT-48) or a legal registration identifier (BT-47).
36
+ * The rule also accepts a tax representative's VAT identifier (BT-63) for
37
+ * the seller; the envelope cannot state one, so a seller with neither BT-31
38
+ * nor BT-32 is refused.
39
+ * The envelope has no place of supply, so whether a document is one for a
40
+ * supply in another member state, whose invoice states the VAT identification
41
+ * numbers of both parties (§ 14a Abs. 1 Satz 3 UStG), cannot be told here: a
42
+ * domestic § 13b supply to a buyer based in another member state is taxed in
43
+ * Germany and may state a tax number. Only what BR-AE-02 requires is checked;
44
+ * the issuing application enforces § 14a Abs. 1.
40
45
  * @param accountingDoc The document
41
46
  * @param targetFormat The format being written
42
47
  */
@@ -53,12 +58,12 @@ export const assertVatCategoryWritable = (accountingDoc, targetFormat) => {
53
58
  }
54
59
  }
55
60
  const seller = accountingDoc.from?.registrationDetails;
56
- if (!seller?.vatId) {
57
- refuse('BR-AE-02', 'a reverse charge document states the seller VAT identifier (BT-31), from.registrationDetails.vatId is missing; the rule would also accept a tax registration identifier (BT-32) or a tax representative (BT-63), which the envelope cannot state');
61
+ if (!seller?.vatId && !seller?.taxNumber) {
62
+ refuse('BR-AE-02', 'a reverse charge document states the seller VAT identifier (BT-31) or tax registration identifier (BT-32), from.registrationDetails.vatId and .taxNumber are missing; the rule would also accept a tax representative (BT-63), which the envelope cannot state');
58
63
  }
59
64
  const buyer = accountingDoc.to?.registrationDetails;
60
65
  if (!buyer?.vatId && !buyer?.registrationId) {
61
66
  refuse('BR-AE-02', 'a reverse charge document states the buyer VAT identifier (BT-48) or legal registration identifier (BT-47), to.registrationDetails.vatId and .registrationId are missing');
62
67
  }
63
68
  };
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LmNhdGVnb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy92YXQuY2F0ZWdvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFnQnREOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxhQUEwQyxFQUFvQixFQUFFLENBQzdGLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQTBCLEVBQUUsUUFBNEIsRUFBNkIsRUFBRSxDQUNySCxRQUFRLEtBQUssSUFBSTtJQUNmLENBQUMsQ0FBQztRQUNFLElBQUksRUFBRSxhQUFhO1FBQ25CLE1BQU0sRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3JELENBQUMsQ0FBQywrQ0FBK0M7WUFDakQsQ0FBQyxDQUFDLGdCQUFnQjtLQUNyQjtJQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFaEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLGFBQTZCLEVBQUUsWUFBb0IsRUFBUSxFQUFFO0lBQ3JHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQVMsRUFBRTtRQUN0RCxNQUFNLElBQUksbUJBQW1CLENBQUMsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLENBQUMsVUFBVSxFQUFFLG1EQUFtRCxLQUFLLHNCQUFzQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqSSxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUM7SUFDdkQsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQ0osVUFBVSxFQUNWLGtQQUFrUCxDQUNuUCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLENBQUM7SUFDcEQsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUNKLFVBQVUsRUFDViwwS0FBMEssQ0FDM0ssQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LmNhdGVnb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy92YXQuY2F0ZWdvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFnQnREOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxhQUEwQyxFQUFvQixFQUFFLENBQzdGLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQTBCLEVBQUUsUUFBNEIsRUFBNkIsRUFBRSxDQUNySCxRQUFRLEtBQUssSUFBSTtJQUNmLENBQUMsQ0FBQztRQUNFLElBQUksRUFBRSxhQUFhO1FBQ25CLE1BQU0sRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3JELENBQUMsQ0FBQywrQ0FBK0M7WUFDakQsQ0FBQyxDQUFDLGdCQUFnQjtLQUNyQjtJQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsYUFBNkIsRUFBRSxZQUFvQixFQUFRLEVBQUU7SUFDckcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBUyxFQUFFO1FBQ3RELE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RyxDQUFDLENBQUM7SUFDRixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsbURBQW1ELEtBQUssc0JBQXNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pJLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQztJQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQ0osVUFBVSxFQUNWLGdRQUFnUSxDQUNqUSxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLENBQUM7SUFDcEQsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUNKLFVBQVUsRUFDViwwS0FBMEssQ0FDM0ssQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
@@ -1,6 +1,7 @@
1
1
  import * as plugins from '../../plugins.js';
2
2
  import { findInvalidItemAmounts, getTotalsSkippedResult } from '../utils/document.totals.js';
3
3
  import { CurrencyCalculator } from '../utils/currency.utils.js';
4
+ import { isEuMemberState } from '../utils/eu.memberstates.js';
4
5
  /**
5
6
  * VAT Category codes according to UNCL5305
6
7
  */
@@ -419,12 +420,7 @@ export class VATCategoriesValidator {
419
420
  return Math.abs(value1 - value2) < 0.01;
420
421
  }
421
422
  isEUCountry(countryCode) {
422
- const euCountries = [
423
- 'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR',
424
- 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL',
425
- 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE'
426
- ];
427
- return euCountries.includes(countryCode);
423
+ return isEuMemberState(countryCode);
428
424
  }
429
425
  isReverseChargeService(item) {
430
426
  // Check if item qualifies for reverse charge
@@ -501,4 +497,4 @@ export function getVATCategoryName(category) {
501
497
  };
502
498
  return names[category] || 'Unknown';
503
499
  }
504
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LWNhdGVnb3JpZXMudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL3ZhdC1jYXRlZ29yaWVzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR2hFOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQixzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCx3QkFBUyxDQUFBO0lBQ1Qsc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUEsQ0FBSSxvRUFBb0U7QUFDakYsQ0FBQyxFQVZXLFdBQVcsS0FBWCxXQUFXLFFBVXRCO0FBY0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixPQUFPLEdBQXVCLEVBQUUsQ0FBQztJQUNqQyxrQkFBa0IsQ0FBc0I7SUFFaEQ7O09BRUc7SUFDSSxRQUFRLENBQUMsT0FBaUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFbEIsMERBQTBEO1FBQzFELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsd0ZBQXdGO1FBQ3hGLDBGQUEwRjtRQUMxRixNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxD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
500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LWNhdGVnb3JpZXMudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL3ZhdC1jYXRlZ29yaWVzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBVVg7QUFWRCxXQUFZLFdBQVc7SUFDckIsc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asd0JBQVMsQ0FBQTtJQUNULHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBLENBQUksb0VBQW9FO0FBQ2pGLENBQUMsRUFWVyxXQUFXLEtBQVgsV0FBVyxRQVV0QjtBQWNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDekIsT0FBTyxHQUF1QixFQUFFLENBQUM7SUFDakMsa0JBQWtCLENBQXNCO0lBRWhEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLE9BQWlCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWxCLDBEQUEwRDtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELHdGQUF3RjtRQUN4RiwwRkFBMEY7UUFDMUYs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fin.cx/einvoice",
3
- "version": "8.2.3",
3
+ "version": "8.3.0",
4
4
  "private": false,
5
5
  "description": "A TypeScript module for creating, manipulating, and embedding XML data within PDF files specifically tailored for electronic invoice (einvoice) packages.",
6
6
  "main": "dist_ts/index.js",
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@push.rocks/smartxml": "^2.1.0",
25
- "@tsclass/tsclass": "^9.8.0",
25
+ "@tsclass/tsclass": "^9.10.0",
26
26
  "@xmldom/xmldom": "^0.9.10",
27
27
  "pako": "^2.1.0",
28
28
  "pdf-lib": "^1.17.1",
@@ -67,7 +67,7 @@
67
67
  ],
68
68
  "scripts": {
69
69
  "test": "pnpm run test:unit",
70
- "test:unit": "tstest test/test.cii-xrechnung.node.ts --verbose --logfile --timeout 60 && tstest test/test.einvoice.ts --verbose --logfile --timeout 60 && tstest test/test.decimal.ts --verbose --logfile --timeout 60 && tstest test/test.decimal-currency-calculator.ts --verbose --logfile --timeout 60 && tstest test/test.currency-utils.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-validators.ts --verbose --logfile --timeout 60 && tstest test/test.schematron-validator.ts --verbose --logfile --timeout 60 && tstest test/test.xrechnung-creditnote.node.ts --verbose --logfile --timeout 60 && tstest test/test.accountingdoc-types.node.ts --verbose --logfile --timeout 60 && tstest test/test.corrected-invoice.node.ts --verbose --logfile --timeout 60 && tstest test/test.xrechnung-3-due-date.node.ts --verbose --logfile --timeout 60 && tstest test/test.calendar-dates.node.ts --verbose --logfile --timeout 60 && tstest test/test.document-totals.node.ts --verbose --logfile --timeout 60 && tstest test/test.reverse-charge.node.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-unitcodes.node.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-lineunit.node.ts --verbose --logfile --timeout 60",
70
+ "test:unit": "tstest test/test.cii-xrechnung.node.ts --verbose --logfile --timeout 60 && tstest test/test.einvoice.ts --verbose --logfile --timeout 60 && tstest test/test.decimal.ts --verbose --logfile --timeout 60 && tstest test/test.decimal-currency-calculator.ts --verbose --logfile --timeout 60 && tstest test/test.currency-utils.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-validators.ts --verbose --logfile --timeout 60 && tstest test/test.schematron-validator.ts --verbose --logfile --timeout 60 && tstest test/test.xrechnung-creditnote.node.ts --verbose --logfile --timeout 60 && tstest test/test.accountingdoc-types.node.ts --verbose --logfile --timeout 60 && tstest test/test.corrected-invoice.node.ts --verbose --logfile --timeout 60 && tstest test/test.xrechnung-3-due-date.node.ts --verbose --logfile --timeout 60 && tstest test/test.calendar-dates.node.ts --verbose --logfile --timeout 60 && tstest test/test.document-totals.node.ts --verbose --logfile --timeout 60 && tstest test/test.reverse-charge.node.ts --verbose --logfile --timeout 60 && tstest test/test.cii-schema-order.node.ts --verbose --logfile --timeout 60 && tstest test/test.tax-number.node.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-unitcodes.node.ts --verbose --logfile --timeout 60 && tstest test/test.en16931-lineunit.node.ts --verbose --logfile --timeout 60",
71
71
  "test:format": "tstest test/test.format-detection.ts --verbose --logfile --timeout 60",
72
72
  "test:corpus": "tstest test/suite/einvoice_corpus-validation/ --verbose --logfile --timeout 60",
73
73
  "test:performance": "NODE_OPTIONS=--expose-gc tstest test/suite/einvoice_performance/ --verbose --logfile --timeout 60",
package/readme.md CHANGED
@@ -356,13 +356,20 @@ any other. `EInvoice.language` defaults to `'en'`: set it to `'de'` for the
356
356
  German wording.
357
357
 
358
358
  Export refuses a reverse charge document, naming the rule, when a line states a
359
- VAT rate other than 0 (BR-AE-05), the seller has no VAT identifier, or the
360
- buyer has neither a VAT identifier nor a legal registration identifier
359
+ VAT rate other than 0 (BR-AE-05), the seller has neither a VAT identifier nor a
360
+ tax number (`registrationDetails.taxNumber`, BT-32, the Steuernummer, which
361
+ § 14 Abs. 4 Satz 1 Nr. 2 UStG allows), or the buyer has neither a VAT
362
+ identifier nor a legal registration identifier
361
363
  (`registrationDetails.registrationId`, BR-AE-02). On the seller side BR-AE-02
362
- would also accept a tax registration identifier (BT-32, the Steuernummer) or a
363
- tax representative's VAT identifier (BT-63); the envelope can state neither, so
364
- a domestic § 13b issuer that has only a Steuernummer (which § 14 Abs. 4 Satz 1
365
- Nr. 2 UStG allows) is refused until the envelope carries a tax number.
364
+ would also accept a tax representative's VAT identifier (BT-63), which the
365
+ envelope cannot state.
366
+
367
+ The envelope has no place of supply, so einvoice checks only what EN 16931
368
+ BR-AE-02 requires. Whether an invoice needs the VAT identification numbers of
369
+ both parties because the supply is made in another member state (§ 14a Abs. 1
370
+ Satz 3 UStG) is for the issuing application to enforce: the parties' countries
371
+ do not tell it, since a domestic § 13b supply to a buyer based in another
372
+ member state is taxed in Germany and may state a tax number.
366
373
 
367
374
  The envelope states reverse charge for the whole document; an item has no VAT
368
375
  category of its own. A document mixing reverse charge lines with standard rated
@@ -403,6 +410,7 @@ the UTC midnight of that day, `Date.UTC(2026, 8, 20)`.
403
410
  Missing or invalid document-level invoice IDs and issue dates are rejected.
404
411
  - `FatturaPA` should be documented as detection-only right now.
405
412
  - The day of supply: UBL and XRechnung write `deliveryDate` as `cac:Delivery/cbc:ActualDeliveryDate` (BT-72) and `periodOfPerformance` as `cac:InvoicePeriod` (BG-14), and read both back. Factur-X and ZUGFeRD write `deliveryDate` as `ram:ActualDeliverySupplyChainEvent` and read it back only when the document states it.
413
+ - Party identifiers: `registrationDetails.vatId` is the VAT identifier (BT-31 seller, BT-48 buyer), `registrationId` the legal registration identifier such as the commercial register number (BT-30, BT-47), and `taxNumber` the seller's tax registration identifier, the Steuernummer (BT-32), which § 14 Abs. 4 Satz 1 Nr. 2 UStG allows in place of the VAT identifier. UBL and XRechnung write the tax number as a second `cac:PartyTaxScheme` with the tax scheme `FC`, after the VAT one; Factur-X and ZUGFeRD as `ram:SpecifiedTaxRegistration/ram:ID` with the scheme `FC`. The decoders read each by its scheme, whatever order the document lists them in. EN 16931 has no tax number for the buyer, so a buyer's `taxNumber` is not written.
406
414
  - Credit notes, debit notes, corrected invoices and self-billed invoices share the `EInvoice` class; see the type code table above. Credit and debit amounts are written as given, the encoders do not change signs.
407
415
  - ZUGFeRD v1 input is detected and routed, but the v1 decoder does not read the v1 header, so such a document always arrives as an `invoice`. Known defect, to be fixed separately.
408
416
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/einvoice',
6
- version: '8.2.3',
6
+ version: '8.3.0',
7
7
  description: 'A TypeScript module for creating, manipulating, and embedding XML data within PDF files specifically tailored for electronic invoice (einvoice) packages.'
8
8
  }
@@ -4,7 +4,7 @@ import { EInvoiceFormatError } from '../../errors.js';
4
4
  import { getPrecedingInvoiceReferences } from '../utils/preceding.invoice.js';
5
5
  import { getWritableDate } from '../utils/date.value.js';
6
6
  import { assertVatCategoryWritable } from '../utils/vat.category.js';
7
- import { CII_NAMESPACES, CIIProfile } from './cii.types.js';
7
+ import { CII_CHILD_SEQUENCES, CII_NAMESPACES, CIIProfile } from './cii.types.js';
8
8
 
9
9
  /**
10
10
  * Base encoder for CII-based invoice formats
@@ -113,6 +113,44 @@ export abstract class CIIBaseEncoder extends BaseEncoder {
113
113
  }
114
114
  }
115
115
 
116
+ /**
117
+ * Puts the children of every CII element into the order the schema requires
118
+ * (`CII_CHILD_SEQUENCES`). The encoders add elements in several passes; this
119
+ * final pass makes the document follow the schema sequences. The sort is
120
+ * stable, so repeated elements (notes, lines, VAT breakdowns) keep their
121
+ * order, and an element a sequence does not name stays behind the element it
122
+ * followed.
123
+ * @param doc XML document
124
+ */
125
+ protected orderCiiElements(doc: Document): void {
126
+ const localName = (element: Element) => element.nodeName.slice(element.nodeName.indexOf(':') + 1);
127
+ const order = (element: Element): void => {
128
+ const children: Element[] = [];
129
+ for (let node = element.firstChild; node; node = node.nextSibling) {
130
+ if (node.nodeType === 1) {
131
+ children.push(node as Element);
132
+ }
133
+ }
134
+ const sequence = CII_CHILD_SEQUENCES[localName(element)];
135
+ if (sequence) {
136
+ let lastRank = -1;
137
+ const ranked = children.map((child, position) => {
138
+ const rank = sequence.indexOf(localName(child));
139
+ lastRank = rank === -1 ? lastRank : rank;
140
+ return { child, rank: lastRank, position };
141
+ });
142
+ ranked.sort((a, b) => a.rank - b.rank || a.position - b.position);
143
+ for (const { child } of ranked) {
144
+ element.appendChild(child);
145
+ }
146
+ }
147
+ for (const child of children) {
148
+ order(child);
149
+ }
150
+ };
151
+ order(doc.documentElement);
152
+ }
153
+
116
154
  /**
117
155
  * Formats a date as an ISO string (YYYY-MM-DD, UTC). A value that is no
118
156
  * valid timestamp is refused with an `EInvoiceFormatError` naming the field.
@@ -43,3 +43,44 @@ export const CII_PROFILE_IDS = {
43
43
  ZUGFERD_V1_COMFORT: 'urn:ferd:CrossIndustryDocument:invoice:1p0:comfort',
44
44
  ZUGFERD_V1_EXTENDED: 'urn:ferd:CrossIndustryDocument:invoice:1p0:extended'
45
45
  };
46
+
47
+ /**
48
+ * The children of the CII elements the encoders write, in the order the schema
49
+ * requires them: the sequences of the UN/CEFACT Cross Industry Invoice D16B
50
+ * schema as the EN 16931 validation artefacts ship it
51
+ * (`test/assets/eInvoicing-EN16931/cii/schema/D16B SCRDM (Subset)/uncoupled clm/CII/uncefact/data/standard/`,
52
+ * `CrossIndustryInvoice_100pD16B.xsd` and
53
+ * `CrossIndustryInvoice_ReusableAggregateBusinessInformationEntity_100pD16B.xsd`),
54
+ * keyed by the local name of the parent element. The Factur-X 1.07.3 and
55
+ * ZUGFeRD 2 schemas are subsets of it with the same order.
56
+ */
57
+ export const CII_CHILD_SEQUENCES: Readonly<Record<string, readonly string[]>> = {
58
+ CrossIndustryInvoice: ['ExchangedDocumentContext', 'ExchangedDocument', 'SupplyChainTradeTransaction', 'ValuationBreakdownStatement'],
59
+ ExchangedDocument: ['ID', 'Name', 'TypeCode', 'IssueDateTime', 'CopyIndicator', 'Purpose', 'ControlRequirementIndicator', 'LanguageID', 'PurposeCode', 'RevisionDateTime', 'VersionID', 'GlobalID', 'RevisionID', 'PreviousRevisionID', 'CategoryCode', 'IncludedNote', 'EffectiveSpecifiedPeriod', 'IssuerTradeParty'],
60
+ SupplyChainTradeTransaction: ['IncludedSupplyChainTradeLineItem', 'ApplicableHeaderTradeAgreement', 'ApplicableHeaderTradeDelivery', 'ApplicableHeaderTradeSettlement'],
61
+ ApplicableHeaderTradeAgreement: ['Reference', 'BuyerReference', 'SellerTradeParty', 'BuyerTradeParty', 'SalesAgentTradeParty', 'BuyerRequisitionerTradeParty', 'BuyerAssignedAccountantTradeParty', 'SellerAssignedAccountantTradeParty', 'BuyerTaxRepresentativeTradeParty', 'SellerTaxRepresentativeTradeParty', 'ProductEndUserTradeParty', 'ApplicableTradeDeliveryTerms', 'SellerOrderReferencedDocument', 'BuyerOrderReferencedDocument', 'QuotationReferencedDocument', 'OrderResponseReferencedDocument', 'ContractReferencedDocument', 'DemandForecastReferencedDocument', 'SupplyInstructionReferencedDocument', 'PromotionalDealReferencedDocument', 'PriceListReferencedDocument', 'AdditionalReferencedDocument', 'RequisitionerReferencedDocument', 'BuyerAgentTradeParty', 'PurchaseConditionsReferencedDocument', 'SpecifiedProcuringProject', 'UltimateCustomerOrderReferencedDocument'],
62
+ SellerTradeParty: ['ID', 'GlobalID', 'Name', 'RoleCode', 'Description', 'SpecifiedLegalOrganization', 'DefinedTradeContact', 'PostalTradeAddress', 'URIUniversalCommunication', 'SpecifiedTaxRegistration', 'EndPointURIUniversalCommunication', 'LogoAssociatedSpecifiedBinaryFile'],
63
+ BuyerTradeParty: ['ID', 'GlobalID', 'Name', 'RoleCode', 'Description', 'SpecifiedLegalOrganization', 'DefinedTradeContact', 'PostalTradeAddress', 'URIUniversalCommunication', 'SpecifiedTaxRegistration', 'EndPointURIUniversalCommunication', 'LogoAssociatedSpecifiedBinaryFile'],
64
+ PostalTradeAddress: ['ID', 'PostcodeCode', 'PostOfficeBox', 'BuildingName', 'LineOne', 'LineTwo', 'LineThree', 'LineFour', 'LineFive', 'StreetName', 'CityName', 'CitySubDivisionName', 'CountryID', 'CountryName', 'CountrySubDivisionID', 'CountrySubDivisionName', 'AttentionOf', 'CareOf', 'BuildingNumber', 'DepartmentName', 'AdditionalStreetName'],
65
+ DefinedTradeContact: ['ID', 'PersonName', 'DepartmentName', 'TypeCode', 'JobTitle', 'Responsibility', 'PersonID', 'TelephoneUniversalCommunication', 'DirectTelephoneUniversalCommunication', 'MobileTelephoneUniversalCommunication', 'FaxUniversalCommunication', 'EmailURIUniversalCommunication', 'TelexUniversalCommunication', 'VOIPUniversalCommunication', 'InstantMessagingUniversalCommunication', 'SpecifiedNote', 'SpecifiedContactPerson'],
66
+ SpecifiedLegalOrganization: ['LegalClassificationCode', 'Name', 'ID', 'TradingBusinessName', 'PostalTradeAddress', 'AuthorizedLegalRegistration'],
67
+ ApplicableHeaderTradeDelivery: ['RelatedSupplyChainConsignment', 'ShipToTradeParty', 'UltimateShipToTradeParty', 'ShipFromTradeParty', 'ActualDespatchSupplyChainEvent', 'ActualPickUpSupplyChainEvent', 'ActualDeliverySupplyChainEvent', 'ActualReceiptSupplyChainEvent', 'AdditionalReferencedDocument', 'DespatchAdviceReferencedDocument', 'ReceivingAdviceReferencedDocument', 'DeliveryNoteReferencedDocument', 'ConsumptionReportReferencedDocument', 'PreviousDeliverySupplyChainEvent', 'PackingListReferencedDocument'],
68
+ ActualDeliverySupplyChainEvent: ['ID', 'OccurrenceDateTime', 'TypeCode', 'Description', 'DescriptionBinaryObject', 'UnitQuantity', 'LatestOccurrenceDateTime', 'EarliestOccurrenceDateTime', 'OccurrenceSpecifiedPeriod', 'OccurrenceLogisticsLocation'],
69
+ ApplicableHeaderTradeSettlement: ['DuePayableAmount', 'CreditorReferenceTypeCode', 'CreditorReferenceType', 'CreditorReferenceIssuerID', 'CreditorReferenceID', 'PaymentReference', 'TaxCurrencyCode', 'InvoiceCurrencyCode', 'PaymentCurrencyCode', 'InvoiceIssuerReference', 'InvoiceDateTime', 'NextInvoiceDateTime', 'CreditReasonCode', 'CreditReason', 'InvoicerTradeParty', 'InvoiceeTradeParty', 'PayeeTradeParty', 'PayerTradeParty', 'TaxApplicableTradeCurrencyExchange', 'InvoiceApplicableTradeCurrencyExchange', 'PaymentApplicableTradeCurrencyExchange', 'SpecifiedTradeSettlementPaymentMeans', 'ApplicableTradeTax', 'BillingSpecifiedPeriod', 'SpecifiedTradeAllowanceCharge', 'SubtotalCalculatedTradeTax', 'SpecifiedLogisticsServiceCharge', 'SpecifiedTradePaymentTerms', 'SpecifiedTradeSettlementHeaderMonetarySummation', 'SpecifiedFinancialAdjustment', 'InvoiceReferencedDocument', 'ProFormaInvoiceReferencedDocument', 'LetterOfCreditReferencedDocument', 'FactoringAgreementReferencedDocument', 'FactoringListReferencedDocument', 'PayableSpecifiedTradeAccountingAccount', 'ReceivableSpecifiedTradeAccountingAccount', 'PurchaseSpecifiedTradeAccountingAccount', 'SalesSpecifiedTradeAccountingAccount', 'SpecifiedTradeSettlementFinancialCard', 'SpecifiedAdvancePayment', 'UltimatePayeeTradeParty'],
70
+ SpecifiedTradeSettlementPaymentMeans: ['PaymentChannelCode', 'TypeCode', 'GuaranteeMethodCode', 'PaymentMethodCode', 'Information', 'ID', 'ApplicableTradeSettlementFinancialCard', 'PayerPartyDebtorFinancialAccount', 'PayeePartyCreditorFinancialAccount', 'PayerSpecifiedDebtorFinancialInstitution', 'PayeeSpecifiedCreditorFinancialInstitution'],
71
+ PayeePartyCreditorFinancialAccount: ['IBANID', 'AccountName', 'ProprietaryID'],
72
+ ApplicableTradeTax: ['CalculatedAmount', 'TypeCode', 'ExemptionReason', 'CalculatedRate', 'CalculationSequenceNumeric', 'BasisQuantity', 'BasisAmount', 'UnitBasisAmount', 'LineTotalBasisAmount', 'AllowanceChargeBasisAmount', 'CategoryCode', 'CurrencyCode', 'Jurisdiction', 'CustomsDutyIndicator', 'ExemptionReasonCode', 'TaxBasisAllowanceRate', 'TaxPointDate', 'Type', 'InformationAmount', 'CategoryName', 'DueDateTypeCode', 'RateApplicablePercent', 'SpecifiedTradeAccountingAccount', 'ServiceSupplyTradeCountry', 'BuyerRepayableTaxSpecifiedTradeAccountingAccount', 'SellerPayableTaxSpecifiedTradeAccountingAccount', 'SellerRefundableTaxSpecifiedTradeAccountingAccount', 'BuyerDeductibleTaxSpecifiedTradeAccountingAccount', 'BuyerNonDeductibleTaxSpecifiedTradeAccountingAccount', 'PlaceApplicableTradeLocation'],
73
+ BillingSpecifiedPeriod: ['DurationMeasure', 'InclusiveIndicator', 'Description', 'StartDateTime', 'EndDateTime', 'CompleteDateTime', 'OpenIndicator', 'SeasonCode', 'ID', 'Name', 'SequenceNumeric', 'StartDateFlexibilityCode', 'ContinuousIndicator', 'PurposeCode'],
74
+ SpecifiedTradePaymentTerms: ['ID', 'FromEventCode', 'SettlementPeriodMeasure', 'Description', 'DueDateDateTime', 'TypeCode', 'InstructionTypeCode', 'DirectDebitMandateID', 'PartialPaymentPercent', 'PaymentMeansID', 'PartialPaymentAmount', 'ApplicableTradePaymentPenaltyTerms', 'ApplicableTradePaymentDiscountTerms', 'PayeeTradeParty'],
75
+ SpecifiedTradeSettlementHeaderMonetarySummation: ['LineTotalAmount', 'ChargeTotalAmount', 'AllowanceTotalAmount', 'TaxBasisTotalAmount', 'TaxTotalAmount', 'RoundingAmount', 'GrandTotalAmount', 'InformationAmount', 'TotalPrepaidAmount', 'TotalDiscountAmount', 'TotalAllowanceChargeAmount', 'DuePayableAmount', 'RetailValueExcludingTaxInformationAmount', 'TotalDepositFeeInformationAmount', 'ProductValueExcludingTobaccoTaxInformationAmount', 'TotalRetailValueInformationAmount', 'GrossLineTotalAmount', 'NetLineTotalAmount', 'NetIncludingTaxesLineTotalAmount'],
76
+ InvoiceReferencedDocument: ['IssuerAssignedID', 'URIID', 'StatusCode', 'CopyIndicator', 'LineID', 'TypeCode', 'GlobalID', 'RevisionID', 'Name', 'AttachmentBinaryObject', 'Information', 'ReferenceTypeCode', 'SectionName', 'PreviousRevisionID', 'FormattedIssueDateTime', 'EffectiveSpecifiedPeriod', 'IssuerTradeParty', 'AttachedSpecifiedBinaryFile'],
77
+ IncludedSupplyChainTradeLineItem: ['DescriptionCode', 'AssociatedDocumentLineDocument', 'SpecifiedTradeProduct', 'SpecifiedLineTradeAgreement', 'SpecifiedLineTradeDelivery', 'SpecifiedLineTradeSettlement', 'IncludedSubordinateTradeLineItem'],
78
+ AssociatedDocumentLineDocument: ['LineID', 'ParentLineID', 'LineStatusCode', 'LineStatusReasonCode', 'IncludedNote'],
79
+ SpecifiedTradeProduct: ['ID', 'GlobalID', 'SellerAssignedID', 'BuyerAssignedID', 'ManufacturerAssignedID', 'Name', 'TradeName', 'Description', 'TypeCode', 'NetWeightMeasure', 'GrossWeightMeasure', 'ProductGroupID', 'EndItemTypeCode', 'EndItemName', 'AreaDensityMeasure', 'UseDescription', 'BrandName', 'SubBrandName', 'DrainedNetWeightMeasure', 'VariableMeasureIndicator', 'ColourCode', 'ColourDescription', 'Designation', 'FormattedCancellationAnnouncedLaunchDateTime', 'FormattedLatestProductDataChangeDateTime', 'ApplicableProductCharacteristic', 'ApplicableMaterialGoodsCharacteristic', 'DesignatedProductClassification', 'IndividualTradeProductInstance', 'CertificationEvidenceReferenceReferencedDocument', 'InspectionReferenceReferencedDocument', 'OriginTradeCountry', 'LinearSpatialDimension', 'MinimumLinearSpatialDimension', 'MaximumLinearSpatialDimension', 'ManufacturerTradeParty', 'PresentationSpecifiedBinaryFile', 'MSDSReferenceReferencedDocument', 'AdditionalReferenceReferencedDocument', 'LegalRightsOwnerTradeParty', 'BrandOwnerTradeParty', 'IncludedReferencedProduct', 'InformationNote'],
80
+ SpecifiedLineTradeAgreement: ['BuyerReference', 'BuyerRequisitionerTradeParty', 'ApplicableTradeDeliveryTerms', 'SellerOrderReferencedDocument', 'BuyerOrderReferencedDocument', 'QuotationReferencedDocument', 'ContractReferencedDocument', 'DemandForecastReferencedDocument', 'PromotionalDealReferencedDocument', 'AdditionalReferencedDocument', 'GrossPriceProductTradePrice', 'NetPriceProductTradePrice', 'RequisitionerReferencedDocument', 'ItemSellerTradeParty', 'ItemBuyerTradeParty', 'IncludedSpecifiedMarketplace', 'UltimateCustomerOrderReferencedDocument'],
81
+ NetPriceProductTradePrice: ['TypeCode', 'ChargeAmount', 'BasisQuantity', 'MinimumQuantity', 'MaximumQuantity', 'ChangeReason', 'OrderUnitConversionFactorNumeric', 'AppliedTradeAllowanceCharge', 'ValiditySpecifiedPeriod', 'IncludedTradeTax', 'DeliveryTradeLocation', 'TradeComparisonReferencePrice', 'AssociatedReferencedDocument'],
82
+ SpecifiedLineTradeDelivery: ['RequestedQuantity', 'ReceivedQuantity', 'BilledQuantity', 'ChargeFreeQuantity', 'PackageQuantity', 'ProductUnitQuantity', 'PerPackageUnitQuantity', 'NetWeightMeasure', 'GrossWeightMeasure', 'TheoreticalWeightMeasure', 'DespatchedQuantity', 'SpecifiedDeliveryAdjustment', 'IncludedSupplyChainPackaging', 'RelatedSupplyChainConsignment', 'ShipToTradeParty', 'UltimateShipToTradeParty', 'ShipFromTradeParty', 'ActualDespatchSupplyChainEvent', 'ActualPickUpSupplyChainEvent', 'RequestedDeliverySupplyChainEvent', 'ActualDeliverySupplyChainEvent', 'ActualReceiptSupplyChainEvent', 'AdditionalReferencedDocument', 'DespatchAdviceReferencedDocument', 'ReceivingAdviceReferencedDocument', 'DeliveryNoteReferencedDocument', 'ConsumptionReportReferencedDocument', 'PackingListReferencedDocument'],
83
+ SpecifiedLineTradeSettlement: ['PaymentReference', 'InvoiceIssuerReference', 'TotalAdjustmentAmount', 'DiscountIndicator', 'ApplicableTradeTax', 'BillingSpecifiedPeriod', 'SpecifiedTradeAllowanceCharge', 'SubtotalCalculatedTradeTax', 'SpecifiedLogisticsServiceCharge', 'SpecifiedTradePaymentTerms', 'SpecifiedTradeSettlementLineMonetarySummation', 'SpecifiedFinancialAdjustment', 'InvoiceReferencedDocument', 'AdditionalReferencedDocument', 'PayableSpecifiedTradeAccountingAccount', 'ReceivableSpecifiedTradeAccountingAccount', 'PurchaseSpecifiedTradeAccountingAccount', 'SalesSpecifiedTradeAccountingAccount', 'SpecifiedTradeSettlementFinancialCard'],
84
+ SpecifiedTradeSettlementLineMonetarySummation: ['LineTotalAmount', 'ChargeTotalAmount', 'AllowanceTotalAmount', 'TaxBasisTotalAmount', 'TaxTotalAmount', 'GrandTotalAmount', 'InformationAmount', 'TotalAllowanceChargeAmount', 'TotalRetailValueInformationAmount', 'GrossLineTotalAmount', 'NetLineTotalAmount', 'NetIncludingTaxesLineTotalAmount', 'ProductWeightLossInformationAmount'],
85
+ IncludedNote: ['Subject', 'ContentCode', 'Content', 'SubjectCode', 'ID'],
86
+ };
@@ -157,13 +157,11 @@ export class FacturXDecoder extends CIIBaseDecoder {
157
157
  // Extract VAT ID
158
158
  const vatId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]`) || '';
159
159
 
160
- // Extract registration ID
161
- // the legal registration identifier (BT-30, BT-47); a document that states only a tax
162
- // number (scheme FC, BT-32) keeps it here as before, the envelope has no field of its own for it
163
- const registrationId =
164
- this.getText(`${partyXPath}/ram:SpecifiedLegalOrganization/ram:ID`) ||
165
- this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) ||
166
- '';
160
+ // the legal registration identifier (BT-30, BT-47)
161
+ const registrationId = this.getText(`${partyXPath}/ram:SpecifiedLegalOrganization/ram:ID`) || '';
162
+
163
+ // the tax registration identifier (BT-32 for the seller), the Steuernummer: scheme FC
164
+ const taxNumber = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) || '';
167
165
 
168
166
  // Create contact object
169
167
  return {
@@ -176,7 +174,8 @@ export class FacturXDecoder extends CIIBaseDecoder {
176
174
  registrationDetails: {
177
175
  vatId: vatId,
178
176
  registrationId: registrationId,
179
- registrationName: ''
177
+ registrationName: '',
178
+ ...(taxNumber ? { taxNumber } : {})
180
179
  }
181
180
  } as business.TContact;
182
181
  }
@@ -4,6 +4,7 @@ import { FACTURX_PROFILE_IDS } from './facturx.types.js';
4
4
  import { DOMParser, XMLSerializer } from '../../../plugins.js';
5
5
  import { getDocumentTypeCode } from '../../utils/document.typecode.js';
6
6
  import { computeDocumentTotals } from '../../utils/document.totals.js';
7
+ import { toPlainDecimalString } from '../../utils/number.text.js';
7
8
  import { getWritableDate, getWritableDueDate } from '../../utils/date.value.js';
8
9
 
9
10
  /**
@@ -26,6 +27,9 @@ export class FacturXEncoder extends CIIBaseEncoder {
26
27
  this.addCommonInvoiceData(xmlDoc, creditNote);
27
28
 
28
29
  // Serialize to string
30
+ // the schema order of every element, whatever order the passes above added them in
31
+ this.orderCiiElements(xmlDoc);
32
+
29
33
  return new XMLSerializer().serializeToString(xmlDoc);
30
34
  }
31
35
 
@@ -45,6 +49,9 @@ export class FacturXEncoder extends CIIBaseEncoder {
45
49
  this.addCommonInvoiceData(xmlDoc, invoice);
46
50
 
47
51
  // Serialize to string
52
+ // the schema order of every element, whatever order the passes above added them in
53
+ this.orderCiiElements(xmlDoc);
54
+
48
55
  return new XMLSerializer().serializeToString(xmlDoc);
49
56
  }
50
57
 
@@ -202,12 +209,12 @@ export class FacturXEncoder extends CIIBaseEncoder {
202
209
 
203
210
  // Add seller
204
211
  const sellerElement = doc.createElement('ram:SellerTradeParty');
205
- this.addPartyInfo(doc, sellerElement, invoice.from);
212
+ this.addPartyInfo(doc, sellerElement, invoice.from, 'seller');
206
213
  agreementElement.appendChild(sellerElement);
207
214
 
208
215
  // Add buyer
209
216
  const buyerElement = doc.createElement('ram:BuyerTradeParty');
210
- this.addPartyInfo(doc, buyerElement, invoice.to);
217
+ this.addPartyInfo(doc, buyerElement, invoice.to, 'buyer');
211
218
  agreementElement.appendChild(buyerElement);
212
219
  }
213
220
 
@@ -216,8 +223,9 @@ export class FacturXEncoder extends CIIBaseEncoder {
216
223
  * @param doc XML document
217
224
  * @param partyElement Party element
218
225
  * @param party Party data
226
+ * @param partyRole Whether the party is the seller or the buyer
219
227
  */
220
- private addPartyInfo(doc: Document, partyElement: Element, party: any): void {
228
+ private addPartyInfo(doc: Document, partyElement: Element, party: any, partyRole: 'seller' | 'buyer'): void {
221
229
  // Add name
222
230
  const nameElement = doc.createElement('ram:Name');
223
231
  nameElement.textContent = party.name;
@@ -274,6 +282,17 @@ export class FacturXEncoder extends CIIBaseEncoder {
274
282
  partyElement.appendChild(taxRegistrationElement);
275
283
  }
276
284
 
285
+ // Seller tax registration identifier (BT-32), the Steuernummer: scheme FC, after the VAT
286
+ // identifier. EN 16931 has no such element for the buyer, so a buyer's tax number is not written.
287
+ if (partyRole === 'seller' && party.registrationDetails?.taxNumber) {
288
+ const taxRegistrationElement = doc.createElement('ram:SpecifiedTaxRegistration');
289
+ const taxIdElement = doc.createElement('ram:ID');
290
+ taxIdElement.setAttribute('schemeID', 'FC');
291
+ taxIdElement.textContent = party.registrationDetails.taxNumber;
292
+ taxRegistrationElement.appendChild(taxIdElement);
293
+ partyElement.appendChild(taxRegistrationElement);
294
+ }
295
+
277
296
  }
278
297
 
279
298
  /**
@@ -422,7 +441,8 @@ export class FacturXEncoder extends CIIBaseEncoder {
422
441
  const agreementElement = doc.createElement('ram:SpecifiedLineTradeAgreement');
423
442
  const priceElement = doc.createElement('ram:NetPriceProductTradePrice');
424
443
  const chargeAmountElement = doc.createElement('ram:ChargeAmount');
425
- chargeAmountElement.textContent = item.unitNetPrice.toFixed(2);
444
+ // Item net price (BT-146) with the precision it has; EN 16931 does not limit its decimals
445
+ chargeAmountElement.textContent = toPlainDecimalString(item.unitNetPrice);
426
446
  priceElement.appendChild(chargeAmountElement);
427
447
  agreementElement.appendChild(priceElement);
428
448
  lineItemElement.appendChild(agreementElement);
@@ -430,7 +450,7 @@ export class FacturXEncoder extends CIIBaseEncoder {
430
450
  // Add delivery information (quantity)
431
451
  const deliveryElement = doc.createElement('ram:SpecifiedLineTradeDelivery');
432
452
  const quantityElement = doc.createElement('ram:BilledQuantity');
433
- quantityElement.textContent = item.unitQuantity.toString();
453
+ quantityElement.textContent = toPlainDecimalString(item.unitQuantity); // BT-129
434
454
  // a line without a unit is written without one, so that BR-23 reports it
435
455
  if (item.unitType) {
436
456
  quantityElement.setAttribute('unitCode', item.unitType);
@@ -160,13 +160,11 @@ export class ZUGFeRDDecoder extends CIIBaseDecoder {
160
160
  // Extract VAT ID
161
161
  const vatId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]`) || '';
162
162
 
163
- // Extract registration ID
164
- // the legal registration identifier (BT-30, BT-47); a document that states only a tax
165
- // number (scheme FC, BT-32) keeps it here as before, the envelope has no field of its own for it
166
- const registrationId =
167
- this.getText(`${partyXPath}/ram:SpecifiedLegalOrganization/ram:ID`) ||
168
- this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) ||
169
- '';
163
+ // the legal registration identifier (BT-30, BT-47)
164
+ const registrationId = this.getText(`${partyXPath}/ram:SpecifiedLegalOrganization/ram:ID`) || '';
165
+
166
+ // the tax registration identifier (BT-32 for the seller), the Steuernummer: scheme FC
167
+ const taxNumber = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) || '';
170
168
 
171
169
  // Create contact object
172
170
  return {
@@ -179,7 +177,8 @@ export class ZUGFeRDDecoder extends CIIBaseDecoder {
179
177
  registrationDetails: {
180
178
  vatId: vatId,
181
179
  registrationId: registrationId,
182
- registrationName: ''
180
+ registrationName: '',
181
+ ...(taxNumber ? { taxNumber } : {})
183
182
  }
184
183
  } as business.TContact;
185
184
  }