@fin.cx/einvoice 8.3.1 → 10.0.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 (139) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/einvoice.d.ts +26 -0
  3. package/dist_ts/einvoice.js +61 -3
  4. package/dist_ts/formats/base/base.decoder.d.ts +18 -1
  5. package/dist_ts/formats/base/base.decoder.js +30 -17
  6. package/dist_ts/formats/cii/cii.decoder.d.ts +89 -6
  7. package/dist_ts/formats/cii/cii.decoder.js +125 -30
  8. package/dist_ts/formats/cii/cii.encoder.d.ts +71 -1
  9. package/dist_ts/formats/cii/cii.encoder.js +195 -12
  10. package/dist_ts/formats/cii/cii.types.d.ts +2 -5
  11. package/dist_ts/formats/cii/cii.types.js +7 -9
  12. package/dist_ts/formats/cii/cii.validator.d.ts +13 -6
  13. package/dist_ts/formats/cii/cii.validator.js +29 -30
  14. package/dist_ts/formats/cii/facturx/facturx.decoder.js +19 -3
  15. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +0 -6
  16. package/dist_ts/formats/cii/facturx/facturx.encoder.js +17 -26
  17. package/dist_ts/formats/cii/facturx/facturx.types.d.ts +0 -5
  18. package/dist_ts/formats/cii/facturx/facturx.types.js +1 -8
  19. package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +0 -5
  20. package/dist_ts/formats/cii/facturx/facturx.validator.js +5 -29
  21. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +19 -2
  22. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +0 -7
  23. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +15 -68
  24. package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +0 -5
  25. package/dist_ts/formats/cii/zugferd/zugferd.types.js +1 -8
  26. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +26 -0
  27. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +47 -1
  28. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +6 -2
  29. package/dist_ts/formats/semantic/semantic.adapter.js +29 -20
  30. package/dist_ts/formats/semantic/semantic.validator.js +17 -2
  31. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +0 -4
  32. package/dist_ts/formats/ubl/en16931.ubl.validator.js +5 -42
  33. package/dist_ts/formats/ubl/generic/ubl.encoder.js +29 -26
  34. package/dist_ts/formats/ubl/ubl.decoder.d.ts +4 -0
  35. package/dist_ts/formats/ubl/ubl.decoder.js +9 -1
  36. package/dist_ts/formats/ubl/ubl.encoder.js +13 -5
  37. package/dist_ts/formats/ubl/ubl.validator.d.ts +13 -0
  38. package/dist_ts/formats/ubl/ubl.validator.js +28 -1
  39. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +14 -1
  40. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +0 -7
  41. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +30 -45
  42. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +5 -4
  43. package/dist_ts/formats/ubl/xrechnung.validator.js +71 -68
  44. package/dist_ts/formats/utils/date.value.d.ts +11 -0
  45. package/dist_ts/formats/utils/date.value.js +33 -1
  46. package/dist_ts/formats/utils/document.totals.d.ts +1 -3
  47. package/dist_ts/formats/utils/document.totals.js +1 -2
  48. package/dist_ts/formats/utils/format.detector.js +16 -10
  49. package/dist_ts/formats/utils/paid.amount.d.ts +44 -0
  50. package/dist_ts/formats/utils/paid.amount.js +124 -0
  51. package/dist_ts/formats/utils/party.contact.d.ts +16 -0
  52. package/dist_ts/formats/utils/party.contact.js +16 -0
  53. package/dist_ts/formats/utils/party.identifier.d.ts +28 -0
  54. package/dist_ts/formats/utils/party.identifier.js +49 -0
  55. package/dist_ts/formats/utils/peppol.profile.d.ts +10 -0
  56. package/dist_ts/formats/utils/peppol.profile.js +12 -0
  57. package/dist_ts/formats/utils/preceding.invoice.d.ts +12 -2
  58. package/dist_ts/formats/utils/preceding.invoice.js +22 -3
  59. package/dist_ts/formats/utils/seller.identifier.d.ts +46 -0
  60. package/dist_ts/formats/utils/seller.identifier.js +78 -0
  61. package/dist_ts/formats/utils/stated.values.d.ts +80 -0
  62. package/dist_ts/formats/utils/stated.values.js +418 -0
  63. package/dist_ts/formats/utils/vat.category.d.ts +30 -2
  64. package/dist_ts/formats/utils/vat.category.js +36 -6
  65. package/dist_ts/formats/utils/vat.id.d.ts +18 -0
  66. package/dist_ts/formats/utils/vat.id.js +22 -0
  67. package/dist_ts/formats/validation/conformance.harness.js +6 -6
  68. package/dist_ts/formats/validation/en16931.business-rules.validator.js +4 -19
  69. package/dist_ts/formats/validation/facturx.validator.js +6 -6
  70. package/dist_ts/formats/validation/integrated.validator.js +4 -13
  71. package/dist_ts/formats/validation/peppol.validator.js +6 -13
  72. package/dist_ts/formats/validation/validation.types.d.ts +5 -0
  73. package/dist_ts/formats/validation/validation.types.js +6 -1
  74. package/dist_ts/formats/validation/vat-categories.validator.d.ts +21 -42
  75. package/dist_ts/formats/validation/vat-categories.validator.js +137 -431
  76. package/dist_ts/formats/validation/xrechnung.validator.d.ts +11 -58
  77. package/dist_ts/formats/validation/xrechnung.validator.js +58 -324
  78. package/dist_ts/index.d.ts +1 -0
  79. package/dist_ts/index.js +1 -1
  80. package/dist_ts/interfaces/common.d.ts +1 -0
  81. package/dist_ts/interfaces/en16931-metadata.d.ts +0 -5
  82. package/dist_ts/interfaces/stated.values.d.ts +93 -0
  83. package/dist_ts/interfaces/stated.values.js +2 -0
  84. package/package.json +2 -2
  85. package/readme.md +182 -6
  86. package/ts/00_commitinfo_data.ts +1 -1
  87. package/ts/einvoice.ts +70 -2
  88. package/ts/formats/base/base.decoder.ts +32 -29
  89. package/ts/formats/cii/cii.decoder.ts +159 -32
  90. package/ts/formats/cii/cii.encoder.ts +210 -14
  91. package/ts/formats/cii/cii.types.ts +7 -9
  92. package/ts/formats/cii/cii.validator.ts +30 -32
  93. package/ts/formats/cii/facturx/facturx.decoder.ts +21 -2
  94. package/ts/formats/cii/facturx/facturx.encoder.ts +19 -26
  95. package/ts/formats/cii/facturx/facturx.types.ts +0 -9
  96. package/ts/formats/cii/facturx/facturx.validator.ts +5 -43
  97. package/ts/formats/cii/zugferd/zugferd.decoder.ts +21 -1
  98. package/ts/formats/cii/zugferd/zugferd.encoder.ts +16 -73
  99. package/ts/formats/cii/zugferd/zugferd.types.ts +0 -9
  100. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +66 -0
  101. package/ts/formats/cii/zugferd/zugferd.validator.ts +5 -1
  102. package/ts/formats/semantic/semantic.adapter.ts +28 -19
  103. package/ts/formats/semantic/semantic.validator.ts +17 -1
  104. package/ts/formats/ubl/en16931.ubl.validator.ts +5 -64
  105. package/ts/formats/ubl/generic/ubl.encoder.ts +31 -25
  106. package/ts/formats/ubl/ubl.decoder.ts +12 -0
  107. package/ts/formats/ubl/ubl.encoder.ts +12 -4
  108. package/ts/formats/ubl/ubl.validator.ts +29 -0
  109. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +13 -0
  110. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +33 -45
  111. package/ts/formats/ubl/xrechnung.validator.ts +75 -127
  112. package/ts/formats/utils/date.value.ts +33 -0
  113. package/ts/formats/utils/document.totals.ts +1 -4
  114. package/ts/formats/utils/format.detector.ts +15 -9
  115. package/ts/formats/utils/paid.amount.ts +160 -0
  116. package/ts/formats/utils/party.contact.ts +30 -0
  117. package/ts/formats/utils/party.identifier.ts +61 -0
  118. package/ts/formats/utils/peppol.profile.ts +13 -0
  119. package/ts/formats/utils/preceding.invoice.ts +23 -2
  120. package/ts/formats/utils/seller.identifier.ts +102 -0
  121. package/ts/formats/utils/stated.values.ts +499 -0
  122. package/ts/formats/utils/vat.category.ts +47 -5
  123. package/ts/formats/utils/vat.id.ts +24 -0
  124. package/ts/formats/validation/conformance.harness.ts +5 -5
  125. package/ts/formats/validation/en16931.business-rules.validator.ts +3 -26
  126. package/ts/formats/validation/facturx.validator.ts +5 -5
  127. package/ts/formats/validation/integrated.validator.ts +3 -16
  128. package/ts/formats/validation/peppol.validator.ts +5 -16
  129. package/ts/formats/validation/validation.types.ts +7 -1
  130. package/ts/formats/validation/vat-categories.validator.ts +179 -761
  131. package/ts/formats/validation/xrechnung.validator.ts +61 -382
  132. package/ts/index.ts +9 -0
  133. package/ts/interfaces/common.ts +1 -0
  134. package/ts/interfaces/en16931-metadata.ts +3 -8
  135. package/ts/interfaces/stated.values.ts +94 -0
  136. package/ts/readme.md +1 -1
  137. package/dist_ts/formats/utils/eu.memberstates.d.ts +0 -11
  138. package/dist_ts/formats/utils/eu.memberstates.js +0 -16
  139. package/ts/formats/utils/eu.memberstates.ts +0 -16
@@ -1,39 +1,16 @@
1
1
  import { EN16931UBLValidator } from './en16931.ubl.validator.js';
2
+ import { GERMAN_VAT_ID_FORMAT_CODE, germanVatIdFormatMessage, isMalformedGermanVatId } from '../utils/vat.id.js';
2
3
  /**
3
4
  * XRechnung-specific validator that extends EN16931 validation
4
5
  * Implements additional German CIUS (Core Invoice Usage Specification) rules
5
6
  */
6
7
  export class XRechnungValidator extends EN16931UBLValidator {
7
- /**
8
- * Validates XRechnung-specific structure requirements
9
- */
10
- validateStructure() {
11
- // First validate EN16931 structure
12
- let valid = super.validateStructure();
13
- // XRechnung-specific: Check for proper customization ID
14
- const customizationID = this.getText('//cbc:CustomizationID');
15
- if (!customizationID || !customizationID.includes('xrechnung')) {
16
- this.addError('XRECH-STRUCT-1', 'XRechnung customization ID is missing or invalid', '//cbc:CustomizationID');
17
- valid = false;
18
- }
19
- return valid;
20
- }
21
8
  /**
22
9
  * Validates XRechnung-specific business rules
23
10
  */
24
11
  validateBusinessRules() {
25
12
  // First validate EN16931 business rules
26
13
  let valid = super.validateBusinessRules();
27
- // BR-DE-1: Payment terms (BT-20) or Payment due date (BT-9) shall be provided.
28
- if (!this.exists('//cbc:PaymentDueDate') && !this.exists('//cac:PaymentTerms/cbc:Note')) {
29
- this.addError('BR-DE-1', 'Payment terms or Payment due date shall be provided', '//cac:PaymentTerms');
30
- valid = false;
31
- }
32
- // BR-DE-2: The element "Buyer reference" (BT-10) shall be provided.
33
- if (!this.exists('//cbc:BuyerReference')) {
34
- this.addError('BR-DE-2', 'Buyer reference is required in XRechnung', '//cbc:BuyerReference');
35
- valid = false;
36
- }
37
14
  // BR-DE-16 (XRechnung): when a VAT category code S, Z, E, AE, K, G, L or M is used (BT-95,
38
15
  // BT-102, BT-151), the seller states a VAT identifier (BT-31) or a tax registration
39
16
  // identifier (BT-32), which is any party tax scheme of the seller, or a tax representative
@@ -49,62 +26,88 @@ export class XRechnungValidator extends EN16931UBLValidator {
49
26
  this.addError('BR-DE-16', 'A document with the VAT category code S, Z, E, AE, K, G, L or M states the seller VAT identifier (BT-31), the seller tax registration identifier (BT-32) or a seller tax representative (BG-11)', '//cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme');
50
27
  valid = false;
51
28
  }
52
- // BR-DE-7: The element "Seller city" (BT-37) shall be provided.
53
- if (!this.exists('//cac:AccountingSupplierParty//cac:PostalAddress/cbc:CityName')) {
54
- this.addError('BR-DE-7', 'Seller city is required', '//cac:AccountingSupplierParty//cac:PostalAddress');
55
- valid = false;
56
- }
57
- // BR-DE-8: The element "Seller post code" (BT-38) shall be provided.
58
- if (!this.exists('//cac:AccountingSupplierParty//cac:PostalAddress/cbc:PostalZone')) {
59
- this.addError('BR-DE-8', 'Seller post code is required', '//cac:AccountingSupplierParty//cac:PostalAddress');
60
- valid = false;
61
- }
62
- // BR-DE-9: The element "Buyer city" (BT-52) shall be provided.
63
- if (!this.exists('//cac:AccountingCustomerParty//cac:PostalAddress/cbc:CityName')) {
64
- this.addError('BR-DE-9', 'Buyer city is required', '//cac:AccountingCustomerParty//cac:PostalAddress');
29
+ // The rules below carry the IDs of the official rule sets and check what they check, in
30
+ // their context: KoSIT XRechnung Schematron 2.6.0 (BR-DE-*, and PEPPOL-EN16931-R010, which it
31
+ // includes) and the CEN EN 16931 validation artefacts 1.3.16 (BR-21, BR-49).
32
+ const supplierParty = '/*/cac:AccountingSupplierParty/cac:Party';
33
+ const customerParty = '/*/cac:AccountingCustomerParty/cac:Party';
34
+ const requireElement = (context, element, ruleId, message) => {
35
+ for (const node of this.nodes(context)) {
36
+ if (!this.exists(`${element}[normalize-space(.)]`, node)) {
37
+ this.addError(ruleId, message, `${context}/${element}`);
38
+ valid = false;
39
+ }
40
+ }
41
+ };
42
+ // BR-DE-1: an invoice states PAYMENT INSTRUCTIONS (BG-16)
43
+ if (!this.exists('/*/cac:PaymentMeans')) {
44
+ this.addError('BR-DE-1', 'An invoice states the payment instructions (BG-16)', '/*/cac:PaymentMeans');
65
45
  valid = false;
66
46
  }
67
- // BR-DE-10: The element "Buyer post code" (BT-53) shall be provided.
68
- if (!this.exists('//cac:AccountingCustomerParty//cac:PostalAddress/cbc:PostalZone')) {
69
- this.addError('BR-DE-10', 'Buyer post code is required', '//cac:AccountingCustomerParty//cac:PostalAddress');
70
- valid = false;
47
+ // BR-49 (EN 16931): a payment instruction (BG-16) states the payment means type code (BT-81)
48
+ for (const [index, paymentMeans] of this.nodes('/*/cac:PaymentMeans').entries()) {
49
+ if (!this.exists('cbc:PaymentMeansCode', paymentMeans)) {
50
+ this.addError('BR-49', 'A payment instruction (BG-16) states the payment means type code (BT-81)', `/*/cac:PaymentMeans[${index + 1}]/cbc:PaymentMeansCode`);
51
+ valid = false;
52
+ }
71
53
  }
72
- // BR-DE-11: The element "Seller contact telephone number" (BT-42) shall be provided.
73
- if (!this.exists('//cac:AccountingSupplierParty//cac:Contact/cbc:Telephone')) {
74
- this.addError('BR-DE-11', 'Seller contact telephone number is required', '//cac:AccountingSupplierParty//cac:Contact');
54
+ // BR-DE-15: the buyer reference (BT-10) is stated
55
+ requireElement('/*', 'cbc:BuyerReference', 'BR-DE-15', 'The buyer reference (BT-10) is stated');
56
+ // BR-DE-2: the seller contact (BG-6) is stated; BR-DE-6 and BR-DE-7: with a telephone number
57
+ // (BT-42) and an email address (BT-43)
58
+ if (this.exists(supplierParty) && !this.exists(`${supplierParty}/cac:Contact`)) {
59
+ this.addError('BR-DE-2', 'The seller contact (BG-6) is stated', `${supplierParty}/cac:Contact`);
75
60
  valid = false;
76
61
  }
77
- // BR-DE-12: The element "Seller contact email address" (BT-43) shall be provided.
78
- if (!this.exists('//cac:AccountingSupplierParty//cac:Contact/cbc:ElectronicMail')) {
79
- this.addError('BR-DE-12', 'Seller contact email address is required', '//cac:AccountingSupplierParty//cac:Contact');
80
- valid = false;
62
+ requireElement(`${supplierParty}/cac:Contact`, 'cbc:Telephone', 'BR-DE-6', 'The seller contact telephone number (BT-42) is stated');
63
+ requireElement(`${supplierParty}/cac:Contact`, 'cbc:ElectronicMail', 'BR-DE-7', 'The seller contact email address (BT-43) is stated');
64
+ // BR-DE-3, BR-DE-4: the seller city (BT-37) and post code (BT-38)
65
+ requireElement(`${supplierParty}/cac:PostalAddress`, 'cbc:CityName', 'BR-DE-3', 'The seller city (BT-37) is stated');
66
+ requireElement(`${supplierParty}/cac:PostalAddress`, 'cbc:PostalZone', 'BR-DE-4', 'The seller post code (BT-38) is stated');
67
+ // BR-DE-8, BR-DE-9: the buyer city (BT-52) and post code (BT-53)
68
+ requireElement(`${customerParty}/cac:PostalAddress`, 'cbc:CityName', 'BR-DE-8', 'The buyer city (BT-52) is stated');
69
+ requireElement(`${customerParty}/cac:PostalAddress`, 'cbc:PostalZone', 'BR-DE-9', 'The buyer post code (BT-53) is stated');
70
+ // PEPPOL-EN16931-R010, part of the XRechnung rules: the buyer electronic address (BT-49)
71
+ for (const party of this.nodes(customerParty)) {
72
+ if (!this.exists('cbc:EndpointID', party)) {
73
+ this.addError('PEPPOL-EN16931-R010', 'The buyer electronic address (BT-49) is stated', `${customerParty}/cbc:EndpointID`);
74
+ valid = false;
75
+ }
81
76
  }
82
- // BR-DE-13: The element "Buyer electronic address" (BT-49) shall be provided.
83
- if (!this.exists('//cac:AccountingCustomerParty//cac:Party/cbc:EndpointID')) {
84
- this.addError('BR-DE-13', 'Buyer electronic address (EndpointID) is required', '//cac:AccountingCustomerParty//cac:Party');
85
- valid = false;
77
+ // BR-21 (EN 16931): each invoice line (BG-25) has an invoice line identifier (BT-126)
78
+ for (const [index, line] of this.nodes('/*/cac:InvoiceLine | /*/cac:CreditNoteLine').entries()) {
79
+ if (!this.exists('cbc:ID[normalize-space(.)]', line)) {
80
+ this.addError('BR-21', `Invoice line ${index + 1} has an invoice line identifier (BT-126)`, `${this.locationOf(line)}/cbc:ID`);
81
+ valid = false;
82
+ }
86
83
  }
87
- // BR-DE-14: The element "Payment means type code" (BT-81) shall be provided.
88
- if (!this.exists('//cac:PaymentMeans/cbc:PaymentMeansCode')) {
89
- this.addError('BR-DE-14', 'Payment means type code is required', '//cac:PaymentMeans');
84
+ // BR-CO-25 (EN 16931): while the amount due for payment (BT-115) is positive, the payment due
85
+ // date (BT-9) or the payment terms (BT-20) are stated. The CEN artefacts for UBL and CII do not
86
+ // check this rule; EN 16931 states it.
87
+ const amountDue = Number(this.getText('/*/cac:LegalMonetaryTotal/cbc:PayableAmount').trim());
88
+ if (amountDue > 0 &&
89
+ !this.exists('/*/cbc:DueDate[normalize-space(.)] | /*/cac:PaymentMeans/cbc:PaymentDueDate[normalize-space(.)]') &&
90
+ !this.exists('/*/cac:PaymentTerms/cbc:Note[normalize-space(.)]')) {
91
+ this.addError('BR-CO-25', 'While an amount is due (BT-115), the payment due date (BT-9) or the payment terms (BT-20) are stated', '/*/cac:PaymentTerms');
90
92
  valid = false;
91
93
  }
92
- // BR-DE-15: The element "Invoice line identifier" (BT-126) shall be provided.
93
- const invoiceLines = this.select('//cac:InvoiceLine | //cac:CreditNoteLine', this.doc);
94
- for (let i = 0; i < invoiceLines.length; i++) {
95
- const line = invoiceLines[i];
96
- if (!this.exists('./cbc:ID', line)) {
97
- this.addError('BR-DE-15', `Invoice line ${i + 1} is missing identifier`, `//cac:InvoiceLine[${i + 1}]`);
94
+ // The package's own check of the German VAT identification number format (no official rule)
95
+ for (const vatId of this.nodes('/*/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID="VAT"]/cbc:CompanyID')) {
96
+ const value = (vatId.textContent ?? '').trim();
97
+ if (isMalformedGermanVatId(value)) {
98
+ this.addError(GERMAN_VAT_ID_FORMAT_CODE, germanVatIdFormatMessage(value), '/*/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID');
98
99
  valid = false;
99
100
  }
100
101
  }
101
- // German VAT ID format validation
102
- const supplierVatId = this.getText('//cac:AccountingSupplierParty//cbc:CompanyID[../cac:TaxScheme/cbc:ID="VAT"]');
103
- if (supplierVatId && supplierVatId.startsWith('DE') && !/^DE[0-9]{9}$/.test(supplierVatId)) {
104
- this.addError('BR-DE-VAT', 'German VAT ID format is invalid (must be DE followed by 9 digits)', '//cac:AccountingSupplierParty//cbc:CompanyID');
105
- valid = false;
106
- }
107
102
  return valid;
108
103
  }
104
+ /**
105
+ * The nodes an XPath expression selects
106
+ * @param xpathExpr XPath expression
107
+ */
108
+ nodes(xpathExpr) {
109
+ const result = this.select(xpathExpr, this.doc);
110
+ return Array.isArray(result) ? result : [];
111
+ }
109
112
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdWJsL3hyZWNobnVuZy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLG1CQUFtQjtJQUN6RDs7T0FFRztJQUNPLGlCQUFpQjtRQUN6QixtQ0FBbUM7UUFDbkMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFdEMsd0RBQXdEO1FBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxRQUFRLENBQ1gsZ0JBQWdCLEVBQ2hCLGtEQUFrRCxFQUNsRCx1QkFBdUIsQ0FDeEIsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ08scUJBQXFCO1FBQzdCLHdDQUF3QztRQUN4QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUUxQywrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDO1lBQ3hGLElBQUksQ0FBQyxRQUFRLENBQ1gsU0FBUyxFQUNULHFEQUFxRCxFQUNyRCxvQkFBb0IsQ0FDckIsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FDWCxTQUFTLEVBQ1QsMENBQTBDLEVBQzFDLHNCQUFzQixDQUN2QixDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQsMkZBQTJGO1FBQzNGLG9GQUFvRjtRQUNwRiwyRkFBMkY7UUFDM0YsNkZBQTZGO1FBQzdGLDBGQUEwRjtRQUMxRixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQy9CLGdMQUFnTCxFQUNoTCxJQUFJLENBQUMsR0FBRyxDQUNULENBQUM7UUFDRixNQUFNLGVBQWUsR0FDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDNUIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUUsSUFBYSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFDRSxlQUFlO1lBQ2YsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLCtGQUErRixDQUFDO1lBQzdHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxFQUM3QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDWCxVQUFVLEVBQ1YsaU1BQWlNLEVBQ2pNLDREQUE0RCxDQUM3RCxDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLCtEQUErRCxDQUFDLEVBQUUsQ0FBQztZQUNsRixJQUFJLENBQUMsUUFBUSxDQUNYLFNBQVMsRUFDVCx5QkFBeUIsRUFDekIsa0RBQWtELENBQ25ELENBQUM7WUFDRixLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUVBQWlFLENBQUMsRUFBRSxDQUFDO1lBQ3BGLElBQUksQ0FBQyxRQUFRLENBQ1gsU0FBUyxFQUNULDhCQUE4QixFQUM5QixrREFBa0QsQ0FDbkQsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywrREFBK0QsQ0FBQyxFQUFFLENBQUM7WUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FDWCxTQUFTLEVBQ1Qsd0JBQXdCLEVBQ3hCLGtEQUFrRCxDQUNuRCxDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlFQUFpRSxDQUFDLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsUUFBUSxDQUNYLFVBQVUsRUFDViw2QkFBNkIsRUFDN0Isa0RBQWtELENBQ25ELENBQUM7WUFDRixLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxxRkFBcUY7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMERBQTBELENBQUMsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxRQUFRLENBQ1gsVUFBVSxFQUNWLDZDQUE2QyxFQUM3Qyw0Q0FBNEMsQ0FDN0MsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELGtGQUFrRjtRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywrREFBK0QsQ0FBQyxFQUFFLENBQUM7WUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FDWCxVQUFVLEVBQ1YsMENBQTBDLEVBQzFDLDRDQUE0QyxDQUM3QyxDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHlEQUF5RCxDQUFDLEVBQUUsQ0FBQztZQUM1RSxJQUFJLENBQUMsUUFBUSxDQUNYLFVBQVUsRUFDVixtREFBbUQsRUFDbkQsMENBQTBDLENBQzNDLENBQUM7WUFDRixLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUNBQXlDLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQ1gsVUFBVSxFQUNWLHFDQUFxQyxFQUNyQyxvQkFBb0IsQ0FDckIsQ0FBQztZQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEIsQ0FBQztRQUVELDhFQUE4RTtRQUM5RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLDBDQUEwQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQVcsQ0FBQztRQUNqRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FDWCxVQUFVLEVBQ1YsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUM3QyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUM5QixDQUFDO2dCQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyw2RUFBNkUsQ0FBQyxDQUFDO1FBQ2xILElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDM0YsSUFBSSxDQUFDLFFBQVEsQ0FDWCxXQUFXLEVBQ1gsbUVBQW1FLEVBQ25FLDhDQUE4QyxDQUMvQyxDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YifQ==
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdWJsL3hyZWNobnVuZy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHdCQUF3QixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakg7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLG1CQUFtQjtJQUN6RDs7T0FFRztJQUNPLHFCQUFxQjtRQUM3Qix3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFMUMsMkZBQTJGO1FBQzNGLG9GQUFvRjtRQUNwRiwyRkFBMkY7UUFDM0YsNkZBQTZGO1FBQzdGLDBGQUEwRjtRQUMxRixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQy9CLGdMQUFnTCxFQUNoTCxJQUFJLENBQUMsR0FBRyxDQUNULENBQUM7UUFDRixNQUFNLGVBQWUsR0FDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDNUIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUUsSUFBYSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckcsSUFDRSxlQUFlO1lBQ2YsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLCtGQUErRixDQUFDO1lBQzdH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
@@ -26,3 +26,14 @@ export declare const getWritableDate: (timestamp: unknown, field: string, target
26
26
  * @param targetFormat The format being written
27
27
  */
28
28
  export declare const getWritableDueDate: (issueTimestamp: unknown, dueInDays: unknown, targetFormat: string) => Date;
29
+ /**
30
+ * The calendar day a UBL `xsd:date` names (BT-2, BT-9, BT-26, BT-72, BT-73,
31
+ * BT-74), as the UTC midnight of that day; undefined when the value is no such
32
+ * date. The value is `YYYY-MM-DD`, optionally followed by a time zone: `Z`, or
33
+ * `+hh:mm` / `-hh:mm` of at most 14:00. The zone says where the day is; it
34
+ * does not name another day, so `2026-08-01+02:00` and `2026-08-01-12:00` both
35
+ * name 1 August 2026. EN 16931 dates are calendar days without a zone, and CII
36
+ * format 102 has none, so the day is what every format reads and writes.
37
+ * @param value The date as the document states it
38
+ */
39
+ export declare const parseXsdDateDay: (value: string) => number | undefined;
@@ -47,4 +47,36 @@ export const getWritableDueDate = (issueTimestamp, dueInDays, targetFormat) => {
47
47
  dueDate.setUTCDate(dueDate.getUTCDate() + dueInDays);
48
48
  return dueDate;
49
49
  };
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS52YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdXRpbHMvZGF0ZS52YWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFrQixFQUFFLEtBQWEsRUFBRSxZQUFvQixFQUFRLEVBQUU7SUFDL0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0csSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxzQkFBc0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDL0UsWUFBWTtZQUNaLG1CQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxjQUF1QixFQUFFLFNBQWtCLEVBQUUsWUFBb0IsRUFBUSxFQUFFO0lBQzVHLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxjQUFjLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekYsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLG1CQUFtQixDQUFDLGdFQUFnRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUNqSCxZQUFZO1lBQ1osbUJBQW1CLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsK0ZBQStGO0lBQy9GLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyJ9
50
+ /**
51
+ * The calendar day a UBL `xsd:date` names (BT-2, BT-9, BT-26, BT-72, BT-73,
52
+ * BT-74), as the UTC midnight of that day; undefined when the value is no such
53
+ * date. The value is `YYYY-MM-DD`, optionally followed by a time zone: `Z`, or
54
+ * `+hh:mm` / `-hh:mm` of at most 14:00. The zone says where the day is; it
55
+ * does not name another day, so `2026-08-01+02:00` and `2026-08-01-12:00` both
56
+ * name 1 August 2026. EN 16931 dates are calendar days without a zone, and CII
57
+ * format 102 has none, so the day is what every format reads and writes.
58
+ * @param value The date as the document states it
59
+ */
60
+ export const parseXsdDateDay = (value) => {
61
+ const match = /^(\d{4})-(\d{2})-(\d{2})(?:Z|[+-](\d{2}):(\d{2}))?$/.exec(value.trim());
62
+ if (!match) {
63
+ return undefined;
64
+ }
65
+ const [year, month, day] = [Number(match[1]), Number(match[2]), Number(match[3])];
66
+ if (match[4] !== undefined) {
67
+ const [zoneHours, zoneMinutes] = [Number(match[4]), Number(match[5])];
68
+ if (zoneHours > 14 || zoneMinutes > 59 || (zoneHours === 14 && zoneMinutes !== 0)) {
69
+ return undefined;
70
+ }
71
+ }
72
+ if (year < 1) {
73
+ return undefined;
74
+ }
75
+ const date = new Date(0);
76
+ date.setUTCFullYear(year, month - 1, day);
77
+ if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month - 1 || date.getUTCDate() !== day) {
78
+ return undefined;
79
+ }
80
+ return date.getTime();
81
+ };
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS52YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdXRpbHMvZGF0ZS52YWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFrQixFQUFFLEtBQWEsRUFBRSxZQUFvQixFQUFRLEVBQUU7SUFDL0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0csSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxzQkFBc0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDL0UsWUFBWTtZQUNaLG1CQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxjQUF1QixFQUFFLFNBQWtCLEVBQUUsWUFBb0IsRUFBUSxFQUFFO0lBQzVHLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxjQUFjLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekYsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLG1CQUFtQixDQUFDLGdFQUFnRSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUNqSCxZQUFZO1lBQ1osbUJBQW1CLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsK0ZBQStGO0lBQy9GLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBc0IsRUFBRTtJQUNuRSxNQUFNLEtBQUssR0FBRyxxREFBcUQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxXQUFXLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEVBQUUsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNwRyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDIn0=
@@ -67,10 +67,8 @@ export interface IDocumentTotals {
67
67
  vatGroups: IDocumentVatGroup[];
68
68
  /** Invoice total VAT amount (BT-110): the sum of the rounded VAT category tax amounts */
69
69
  taxTotal: Decimal;
70
- /** Invoice total amount with VAT (BT-112): BT-109 + BT-110 */
70
+ /** Invoice total amount with VAT (BT-112): BT-109 + BT-110; the paid amount and the amount due are `getPaymentTotals` */
71
71
  grandTotal: Decimal;
72
- /** Amount due for payment (BT-115): BT-112, as the envelope states no paid amount yet */
73
- duePayable: Decimal;
74
72
  }
75
73
  /**
76
74
  * Computes the totals of a document the way the EN 16931 business rules check
@@ -105,7 +105,6 @@ export const computeDocumentTotals = (accountingDoc) => {
105
105
  vatGroups,
106
106
  taxTotal,
107
107
  grandTotal,
108
- duePayable: grandTotal,
109
108
  };
110
109
  };
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQudG90YWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy9kb2N1bWVudC50b3RhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBNkMsTUFBTSxtQkFBbUIsQ0FBQztBQVMvRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQTBDLEVBQXdCLEVBQUU7SUFDekcsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztJQUN6QyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQVUsRUFBRSxDQUFDO1lBQy9FLE1BQU0sS0FBSyxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENB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
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQudG90YWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy9kb2N1bWVudC50b3RhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBNkMsTUFBTSxtQkFBbUIsQ0FBQztBQVMvRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQTBDLEVBQXdCLEVBQUU7SUFDekcsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztJQUN6QyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLENBQVUsRUFBRSxDQUFDO1lBQy9FLE1BQU0sS0FBSyxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENB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
@@ -80,12 +80,19 @@ export class FormatDetector {
80
80
  if (/xrechnung/i.test(guidelineId)) {
81
81
  return InvoiceFormat.XRECHNUNG;
82
82
  }
83
- if (/factur-x/i.test(guidelineId) || /urn:cen\.eu:en16931:2017/i.test(guidelineId)) {
83
+ // an identifier that names Factur-X or ZUGFeRD decides; ZUGFeRD 2.0 BASIC and EXTENDED name ZUGFeRD
84
+ // after the EN 16931 identifier they extend (urn:cen.eu:en16931:2017#...#urn:zugferd.de:2p0:...)
85
+ if (/factur-x/i.test(guidelineId)) {
84
86
  return InvoiceFormat.FACTURX;
85
87
  }
86
- if (/zugferd/i.test(guidelineId) || /urn:ferd:/i.test(guidelineId) || /urn:zugferd/i.test(guidelineId)) {
88
+ if (/zugferd/i.test(guidelineId) || /urn:ferd:/i.test(guidelineId)) {
87
89
  return InvoiceFormat.ZUGFERD;
88
90
  }
91
+ // the EN 16931 profile identifier is shared by Factur-X 1.0 and ZUGFeRD 2.x, one standard with one
92
+ // XML: an XML-only document of it reads as Factur-X
93
+ if (/urn:cen\.eu:en16931:2017/i.test(guidelineId)) {
94
+ return InvoiceFormat.FACTURX;
95
+ }
89
96
  return InvoiceFormat.CII;
90
97
  }
91
98
  if (/<(?:[A-Za-z_][\w.-]*:)?CrossIndustryDocument\b/.test(sample)) {
@@ -231,22 +238,21 @@ export class FormatDetector {
231
238
  }
232
239
  for (const idNode of Array.from(idNodes)) {
233
240
  const profileText = idNode.textContent || '';
234
- // Check for ZUGFeRD profiles (v1 and v2)
241
+ // Check for ZUGFeRD profiles: v1, the ZUGFeRD 2.0 identifiers (urn:zugferd.de:2p0:...) and the
242
+ // urn:zugferd:... identifiers earlier releases of this library wrote
235
243
  if (profileText.includes('zugferd') ||
236
244
  profileText.includes('urn:ferd:') ||
237
- profileText === CII_PROFILE_IDS.ZUGFERD_BASIC ||
238
- profileText === CII_PROFILE_IDS.ZUGFERD_COMFORT ||
239
- profileText === CII_PROFILE_IDS.ZUGFERD_EXTENDED ||
240
245
  profileText === CII_PROFILE_IDS.ZUGFERD_V1_BASIC ||
241
246
  profileText === CII_PROFILE_IDS.ZUGFERD_V1_COMFORT ||
242
247
  profileText === CII_PROFILE_IDS.ZUGFERD_V1_EXTENDED) {
243
248
  return InvoiceFormat.ZUGFERD;
244
249
  }
245
- // Check for Factur-X profiles
250
+ // Check for Factur-X profiles; the EN 16931 profile of ZUGFeRD 2.x has the same identifier, and
251
+ // an XML-only document of it is Factur-X: ZUGFeRD 2.x and Factur-X 1.0 are one standard
246
252
  if (profileText.includes('factur-x') ||
247
253
  profileText === CII_PROFILE_IDS.FACTURX_MINIMUM ||
248
- profileText === CII_PROFILE_IDS.FACTURX_BASIC ||
249
- profileText === CII_PROFILE_IDS.FACTURX_EN16931) {
254
+ profileText === CII_PROFILE_IDS.FACTURX_BASIC_WL ||
255
+ profileText === CII_PROFILE_IDS.EN16931) {
250
256
  return InvoiceFormat.FACTURX;
251
257
  }
252
258
  }
@@ -278,4 +284,4 @@ export class FormatDetector {
278
284
  return InvoiceFormat.CII;
279
285
  }
280
286
  }
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmRldGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy9mb3JtYXQuZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBVztRQUNwQyxJQUFJLENBQUM7WUFDSCx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQy9CLENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQUksVUFBVSxLQUFLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDO1lBRWpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDL0IsQ0FBQztZQUVELHFEQUFx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
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmRldGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy91dGlscy9mb3JtYXQuZGV0ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBVztRQUNwQyxJQUFJLENBQUM7WUFDSCx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQy9CLENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQUksVUFBVSxLQUFLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDO1lBRWpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDL0IsQ0FBQztZQUVELHFEQUFx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
@@ -0,0 +1,44 @@
1
+ import type { TAccountingDoc, TAdvancePayment } from '../../interfaces/common.js';
2
+ import { Decimal } from './decimal.js';
3
+ import type { IDocumentTotals } from './document.totals.js';
4
+ /** The paid amount (BT-113) and the amount due for payment (BT-115) an encoder writes */
5
+ export interface IPaymentTotals {
6
+ /** Paid amount (BT-113) as the document states it; undefined when it states none or zero, and nothing is written */
7
+ paidAmount?: Decimal;
8
+ /** Amount due for payment (BT-115): BT-112 − BT-113 (BR-CO-16; the envelope has no rounding amount BT-114); zero or negative when paid in full or overpaid */
9
+ duePayable: Decimal;
10
+ }
11
+ /** Why a paid amount cannot be written: the rule it breaks, the field and what is wrong */
12
+ export interface IPaymentProblem {
13
+ ruleId: string;
14
+ field: string;
15
+ message: string;
16
+ }
17
+ /** What the paid amount and the amount due are computed from */
18
+ export type TPaymentSource = Pick<TAccountingDoc, 'accountingDocType' | 'paidAmount'> & {
19
+ advancePayments?: TAdvancePayment[];
20
+ };
21
+ /**
22
+ * The paid amount and the amount due as an encoder writes them (see
23
+ * `computePaymentTotals` above for the rules); a document that breaks one is
24
+ * refused with an `EInvoiceFormatError` naming the field.
25
+ * @param accountingDoc The document
26
+ * @param totals Its totals (`computeDocumentTotals`)
27
+ */
28
+ export declare const getPaymentTotals: (accountingDoc: TPaymentSource, totals: IDocumentTotals) => IPaymentTotals;
29
+ /**
30
+ * What keeps a document's paid amount from being written, for a validator to
31
+ * report instead of throwing; undefined when there is nothing
32
+ * @param accountingDoc The document
33
+ * @param totals Its totals (`computeDocumentTotals`)
34
+ */
35
+ export declare const findPaymentProblem: (accountingDoc: TPaymentSource, totals: IDocumentTotals) => IPaymentProblem | undefined;
36
+ /**
37
+ * The paid amount (BT-113) a decoder reads: the number the document states,
38
+ * or undefined when it states none or zero (a stated zero is nothing paid, as
39
+ * an absent one). A paid amount that is no number is refused, since the amount
40
+ * due depends on it.
41
+ * @param text The text of the paid amount element, '' when absent
42
+ * @param format The format being read
43
+ */
44
+ export declare const readPaidAmount: (text: string, format: string) => number | undefined;
@@ -0,0 +1,124 @@
1
+ import { EInvoiceFormatError, EInvoiceParsingError } from '../../errors.js';
2
+ import { Decimal } from './decimal.js';
3
+ import { toPlainDecimalString } from './number.text.js';
4
+ /** Carries a payment problem out of the computation */
5
+ class PaymentProblemSignal extends Error {
6
+ problem;
7
+ constructor(problem) {
8
+ super(problem.message);
9
+ this.problem = problem;
10
+ }
11
+ }
12
+ const refuse = (field, message, ruleId = 'PAID-AMOUNT') => {
13
+ throw new PaymentProblemSignal({ ruleId, field, message });
14
+ };
15
+ /** An amount as the document states it, at its full precision; a value that is no finite number is refused */
16
+ const statedDecimal = (value, field) => {
17
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
18
+ return refuse(field, `${field} is no finite number: ${String(value)}`);
19
+ }
20
+ return new Decimal(toPlainDecimalString(value));
21
+ };
22
+ /** The number of decimals of a stated amount */
23
+ const decimalsOf = (value) => (toPlainDecimalString(value).split('.')[1] ?? '').length;
24
+ /** The document types that can be a final invoice (Endrechnung) and deduct advance payments */
25
+ const finalInvoiceTypes = ['invoice', 'corrected-invoice', 'self-billed-invoice'];
26
+ /**
27
+ * The paid amount and the amount due of a document, as an encoder writes them.
28
+ * - When the document lists `advancePayments`, its `paidAmount` equals their
29
+ * gross sum, the `net` plus the `vat` of every group of every payment, to
30
+ * the last decimal (the rule `@tsclass/tsclass` sets). A document that
31
+ * breaks it, or lists advance payments without a paid amount, is refused;
32
+ * neither value is recomputed from the other.
33
+ * - The paid amount (BT-113) has at most the currency's decimals, two at most
34
+ * (BR-DEC-16); one with more is refused, not rounded.
35
+ * - A paid amount of zero is nothing paid, as an absent one: BT-113 is not
36
+ * written and BT-115 is BT-112.
37
+ * @param accountingDoc The document
38
+ * @param totals Its totals (`computeDocumentTotals`)
39
+ */
40
+ const computePaymentTotals = (accountingDoc, totals) => {
41
+ const advancePayments = accountingDoc.advancePayments ?? [];
42
+ if (advancePayments.length > 0 && !finalInvoiceTypes.includes(accountingDoc.accountingDocType)) {
43
+ refuse('advancePayments', `advancePayments: a ${accountingDoc.accountingDocType} deducts no advance payments; only an invoice, a corrected invoice or a self-billed invoice is a final invoice (§ 14 Abs. 5 Satz 2 UStG)`);
44
+ }
45
+ const statedPaid = accountingDoc.paidAmount;
46
+ if (advancePayments.length > 0) {
47
+ const grossSum = Decimal.sum(advancePayments.flatMap((payment, paymentIndex) => payment.vatGroups.flatMap((group, groupIndex) => [
48
+ statedDecimal(group.net, `advancePayments[${paymentIndex}].vatGroups[${groupIndex}].net`),
49
+ statedDecimal(group.vat, `advancePayments[${paymentIndex}].vatGroups[${groupIndex}].vat`),
50
+ ])));
51
+ if (statedPaid === undefined || !statedDecimal(statedPaid, 'paidAmount').equals(grossSum)) {
52
+ refuse('paidAmount', `paidAmount (${statedPaid === undefined ? 'absent' : toPlainDecimalString(statedPaid)}) does not equal the gross sum of the advancePayments (${grossSum.toString()}), the net plus the vat of every group of every payment; neither value is recomputed from the other`);
53
+ }
54
+ }
55
+ if (statedPaid === undefined) {
56
+ return { duePayable: totals.grandTotal };
57
+ }
58
+ const paid = statedDecimal(statedPaid, 'paidAmount');
59
+ if (decimalsOf(statedPaid) > totals.minorUnits) {
60
+ refuse('paidAmount', `paidAmount: the paid amount (BT-113) has at most ${totals.minorUnits} decimals, it is ${toPlainDecimalString(statedPaid)}`, 'BR-DEC-16');
61
+ }
62
+ if (paid.isZero()) {
63
+ return { duePayable: totals.grandTotal };
64
+ }
65
+ return { paidAmount: paid, duePayable: totals.grandTotal.subtract(paid) };
66
+ };
67
+ /**
68
+ * The paid amount and the amount due as an encoder writes them (see
69
+ * `computePaymentTotals` above for the rules); a document that breaks one is
70
+ * refused with an `EInvoiceFormatError` naming the field.
71
+ * @param accountingDoc The document
72
+ * @param totals Its totals (`computeDocumentTotals`)
73
+ */
74
+ export const getPaymentTotals = (accountingDoc, totals) => {
75
+ try {
76
+ return computePaymentTotals(accountingDoc, totals);
77
+ }
78
+ catch (error) {
79
+ if (error instanceof PaymentProblemSignal) {
80
+ throw new EInvoiceFormatError(`${error.problem.ruleId}: ${error.problem.message}`, {
81
+ unsupportedFeatures: [error.problem.field],
82
+ });
83
+ }
84
+ throw error;
85
+ }
86
+ };
87
+ /**
88
+ * What keeps a document's paid amount from being written, for a validator to
89
+ * report instead of throwing; undefined when there is nothing
90
+ * @param accountingDoc The document
91
+ * @param totals Its totals (`computeDocumentTotals`)
92
+ */
93
+ export const findPaymentProblem = (accountingDoc, totals) => {
94
+ try {
95
+ computePaymentTotals(accountingDoc, totals);
96
+ return undefined;
97
+ }
98
+ catch (error) {
99
+ if (error instanceof PaymentProblemSignal) {
100
+ return error.problem;
101
+ }
102
+ throw error;
103
+ }
104
+ };
105
+ /**
106
+ * The paid amount (BT-113) a decoder reads: the number the document states,
107
+ * or undefined when it states none or zero (a stated zero is nothing paid, as
108
+ * an absent one). A paid amount that is no number is refused, since the amount
109
+ * due depends on it.
110
+ * @param text The text of the paid amount element, '' when absent
111
+ * @param format The format being read
112
+ */
113
+ export const readPaidAmount = (text, format) => {
114
+ const trimmed = text.trim();
115
+ if (!trimmed) {
116
+ return undefined;
117
+ }
118
+ const value = Number(trimmed);
119
+ if (!/^[+-]?(\d+\.?\d*|\.\d+)$/.test(trimmed) || !Number.isFinite(value)) {
120
+ throw new EInvoiceParsingError(`The paid amount (BT-113) is no decimal number: ${trimmed}`, { format });
121
+ }
122
+ return value === 0 ? undefined : value;
123
+ };
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFpZC5hbW91bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL3V0aWxzL3BhaWQuYW1vdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFrQnhELHVEQUF1RDtBQUN2RCxNQUFNLG9CQUFxQixTQUFRLEtBQUs7SUFDVjtJQUE1QixZQUE0QixPQUF3QjtRQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBREcsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7SUFFcEQsQ0FBQztDQUNGO0FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFhLEVBQUUsT0FBZSxFQUFFLE1BQU0sR0FBRyxhQUFhLEVBQVMsRUFBRTtJQUMvRSxNQUFNLElBQUksb0JBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDO0FBRUYsOEdBQThHO0FBQzlHLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBYyxFQUFFLEtBQWEsRUFBVyxFQUFFO0lBQy9ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEtBQUsseUJBQXlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDLENBQUM7QUFFRixnREFB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
@@ -0,0 +1,16 @@
1
+ import type { business } from '@tsclass/tsclass';
2
+ /** The contact of a party: the seller contact (BG-6) or the buyer contact (BG-9) */
3
+ export interface IPartyContact {
4
+ /** Contact point (BT-41, BT-56) */
5
+ name?: string;
6
+ /** Telephone number (BT-42, BT-57) */
7
+ phone?: string;
8
+ /** Email address (BT-43, BT-58) */
9
+ email?: string;
10
+ }
11
+ /**
12
+ * The contact a party states, as the encoders write it: the contact metadata first, otherwise
13
+ * the party's own name, telephone number and email address; none when the party states neither.
14
+ * @param party The seller or the buyer
15
+ */
16
+ export declare const getPartyContact: (party: business.TContact | undefined) => IPartyContact | undefined;