@fin.cx/einvoice 9.0.0 → 10.0.1

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 (126) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/einvoice.d.ts +12 -0
  3. package/dist_ts/einvoice.js +45 -3
  4. package/dist_ts/formats/base/base.decoder.d.ts +27 -2
  5. package/dist_ts/formats/base/base.decoder.js +52 -27
  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 +191 -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 +15 -3
  15. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +0 -6
  16. package/dist_ts/formats/cii/facturx/facturx.encoder.js +11 -25
  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 +15 -2
  22. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +0 -7
  23. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +9 -67
  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 +43 -1
  28. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +6 -2
  29. package/dist_ts/formats/semantic/semantic.adapter.js +20 -18
  30. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +0 -4
  31. package/dist_ts/formats/ubl/en16931.ubl.validator.js +5 -42
  32. package/dist_ts/formats/ubl/generic/ubl.encoder.js +18 -24
  33. package/dist_ts/formats/ubl/ubl.decoder.d.ts +4 -0
  34. package/dist_ts/formats/ubl/ubl.decoder.js +9 -1
  35. package/dist_ts/formats/ubl/ubl.encoder.js +9 -5
  36. package/dist_ts/formats/ubl/ubl.validator.d.ts +13 -0
  37. package/dist_ts/formats/ubl/ubl.validator.js +28 -1
  38. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +10 -1
  39. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +0 -7
  40. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +30 -45
  41. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +5 -4
  42. package/dist_ts/formats/ubl/xrechnung.validator.js +71 -68
  43. package/dist_ts/formats/utils/date.value.d.ts +35 -0
  44. package/dist_ts/formats/utils/date.value.js +98 -1
  45. package/dist_ts/formats/utils/format.detector.js +16 -10
  46. package/dist_ts/formats/utils/party.contact.d.ts +16 -0
  47. package/dist_ts/formats/utils/party.contact.js +16 -0
  48. package/dist_ts/formats/utils/party.identifier.d.ts +28 -0
  49. package/dist_ts/formats/utils/party.identifier.js +49 -0
  50. package/dist_ts/formats/utils/peppol.profile.d.ts +10 -0
  51. package/dist_ts/formats/utils/peppol.profile.js +12 -0
  52. package/dist_ts/formats/utils/seller.identifier.d.ts +46 -0
  53. package/dist_ts/formats/utils/seller.identifier.js +78 -0
  54. package/dist_ts/formats/utils/stated.values.d.ts +80 -0
  55. package/dist_ts/formats/utils/stated.values.js +418 -0
  56. package/dist_ts/formats/utils/vat.category.d.ts +30 -2
  57. package/dist_ts/formats/utils/vat.category.js +36 -6
  58. package/dist_ts/formats/utils/vat.id.d.ts +18 -0
  59. package/dist_ts/formats/utils/vat.id.js +22 -0
  60. package/dist_ts/formats/validation/conformance.harness.js +6 -6
  61. package/dist_ts/formats/validation/en16931.business-rules.validator.js +4 -21
  62. package/dist_ts/formats/validation/facturx.validator.js +6 -6
  63. package/dist_ts/formats/validation/integrated.validator.js +4 -13
  64. package/dist_ts/formats/validation/peppol.validator.js +6 -13
  65. package/dist_ts/formats/validation/validation.types.d.ts +5 -0
  66. package/dist_ts/formats/validation/validation.types.js +6 -1
  67. package/dist_ts/formats/validation/vat-categories.validator.d.ts +21 -42
  68. package/dist_ts/formats/validation/vat-categories.validator.js +137 -431
  69. package/dist_ts/formats/validation/xrechnung.validator.d.ts +11 -58
  70. package/dist_ts/formats/validation/xrechnung.validator.js +58 -324
  71. package/dist_ts/index.d.ts +1 -0
  72. package/dist_ts/index.js +1 -1
  73. package/dist_ts/interfaces/en16931-metadata.d.ts +0 -4
  74. package/dist_ts/interfaces/stated.values.d.ts +93 -0
  75. package/dist_ts/interfaces/stated.values.js +2 -0
  76. package/package.json +4 -4
  77. package/readme.md +152 -7
  78. package/ts/00_commitinfo_data.ts +1 -1
  79. package/ts/einvoice.ts +52 -2
  80. package/ts/formats/base/base.decoder.ts +55 -45
  81. package/ts/formats/cii/cii.decoder.ts +159 -32
  82. package/ts/formats/cii/cii.encoder.ts +206 -14
  83. package/ts/formats/cii/cii.types.ts +7 -9
  84. package/ts/formats/cii/cii.validator.ts +30 -32
  85. package/ts/formats/cii/facturx/facturx.decoder.ts +16 -2
  86. package/ts/formats/cii/facturx/facturx.encoder.ts +13 -25
  87. package/ts/formats/cii/facturx/facturx.types.ts +0 -9
  88. package/ts/formats/cii/facturx/facturx.validator.ts +5 -43
  89. package/ts/formats/cii/zugferd/zugferd.decoder.ts +16 -1
  90. package/ts/formats/cii/zugferd/zugferd.encoder.ts +10 -72
  91. package/ts/formats/cii/zugferd/zugferd.types.ts +0 -9
  92. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +56 -0
  93. package/ts/formats/cii/zugferd/zugferd.validator.ts +5 -1
  94. package/ts/formats/semantic/semantic.adapter.ts +19 -17
  95. package/ts/formats/ubl/en16931.ubl.validator.ts +5 -64
  96. package/ts/formats/ubl/generic/ubl.encoder.ts +19 -23
  97. package/ts/formats/ubl/ubl.decoder.ts +12 -0
  98. package/ts/formats/ubl/ubl.encoder.ts +8 -4
  99. package/ts/formats/ubl/ubl.validator.ts +29 -0
  100. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +8 -0
  101. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +33 -45
  102. package/ts/formats/ubl/xrechnung.validator.ts +75 -127
  103. package/ts/formats/utils/date.value.ts +106 -0
  104. package/ts/formats/utils/format.detector.ts +15 -9
  105. package/ts/formats/utils/party.contact.ts +30 -0
  106. package/ts/formats/utils/party.identifier.ts +61 -0
  107. package/ts/formats/utils/peppol.profile.ts +13 -0
  108. package/ts/formats/utils/seller.identifier.ts +102 -0
  109. package/ts/formats/utils/stated.values.ts +499 -0
  110. package/ts/formats/utils/vat.category.ts +47 -5
  111. package/ts/formats/utils/vat.id.ts +24 -0
  112. package/ts/formats/validation/conformance.harness.ts +5 -5
  113. package/ts/formats/validation/en16931.business-rules.validator.ts +3 -28
  114. package/ts/formats/validation/facturx.validator.ts +5 -5
  115. package/ts/formats/validation/integrated.validator.ts +3 -16
  116. package/ts/formats/validation/peppol.validator.ts +5 -16
  117. package/ts/formats/validation/validation.types.ts +7 -1
  118. package/ts/formats/validation/vat-categories.validator.ts +179 -761
  119. package/ts/formats/validation/xrechnung.validator.ts +61 -382
  120. package/ts/index.ts +9 -0
  121. package/ts/interfaces/en16931-metadata.ts +3 -7
  122. package/ts/interfaces/stated.values.ts +94 -0
  123. package/ts/readme.md +1 -1
  124. package/dist_ts/formats/utils/eu.memberstates.d.ts +0 -11
  125. package/dist_ts/formats/utils/eu.memberstates.js +0 -16
  126. package/ts/formats/utils/eu.memberstates.ts +0 -16
@@ -1,7 +1,5 @@
1
- import * as plugins from '../../plugins.js';
2
- import { findInvalidItemAmounts, getTotalsSkippedResult } from '../utils/document.totals.js';
3
- import { CurrencyCalculator } from '../utils/currency.utils.js';
4
- import { isEuMemberState } from '../utils/eu.memberstates.js';
1
+ import { computeDocumentTotals, findInvalidItemAmounts, getDocumentCalculator, getTotalsSkippedResult, } from '../utils/document.totals.js';
2
+ import { Decimal } from '../utils/decimal.js';
5
3
  /**
6
4
  * VAT Category codes according to UNCL5305
7
5
  */
@@ -18,21 +16,48 @@ export var VATCategory;
18
16
  VATCategory["M"] = "M"; // Tax for production, services and importation in Ceuta and Melilla
19
17
  })(VATCategory || (VATCategory = {}));
20
18
  /**
21
- * Comprehensive VAT Category Rules Validator
22
- * Implements all EN16931 VAT category-specific business rules
19
+ * The EN 16931 rules this validator checks, with their official text (CEN/TC 434
20
+ * EN 16931 validation artefacts 1.3.16, the UBL model; the CII model differs only
21
+ * in the case of "Breakdown" in BR-AE-10 and BR-S-10 and "VAT breakdown" in BR-AE-01)
22
+ */
23
+ const VAT_CATEGORY_RULES = {
24
+ 'BR-S-01': 'An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Standard rated" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "Standard rated".',
25
+ 'BR-S-05': 'In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Standard rated" the Invoiced item VAT rate (BT-152) shall be greater than zero.',
26
+ 'BR-S-08': 'For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).',
27
+ 'BR-S-09': 'The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Standard rated" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).',
28
+ 'BR-S-10': 'A VAT breakdown (BG-23) with VAT Category code (BT-118) "Standard rate" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).',
29
+ 'BR-AE-01': 'An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Reverse charge" shall contain in the VAT Breakdown (BG-23) exactly one VAT category code (BT-118) equal with "VAT reverse charge".',
30
+ 'BR-AE-02': 'An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47).',
31
+ 'BR-AE-05': 'In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" the Invoiced item VAT rate (BT-152) shall be 0 (zero).',
32
+ 'BR-AE-08': 'In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Reverse charge".',
33
+ 'BR-AE-09': 'The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" shall be 0 (zero).',
34
+ 'BR-AE-10': 'A VAT breakdown (BG-23) with VAT Category code (BT-118) "Reverse charge" shall have a VAT exemption reason code (BT-121), meaning "Reverse charge" or the VAT exemption reason text (BT-120) "Reverse charge" (or the equivalent standard text in another language).',
35
+ 'BR-CO-17': 'VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals.',
36
+ };
37
+ /**
38
+ * The EN 16931 VAT category rules of a document, checked on the VAT categories
39
+ * and the VAT breakdown the encoders write.
40
+ *
41
+ * The category of every line is the one the encoders write (`getVatCategory`):
42
+ * reverse charge (AE) when the document states `reverseCharge`, standard rated
43
+ * (S) otherwise. The envelope states no category of its own for an item or a
44
+ * breakdown, so the other categories (Z, E, K, G, O, L, M) cannot occur, and
45
+ * an item's `metadata` is not read for one. A decoded document may state one
46
+ * for a line (`statedValues.lines[].vatCategoryCode`); the envelope reads such
47
+ * a line as S, so BR-S-05 is not reported for a line whose stated category is
48
+ * not S. The VAT breakdown is the one the
49
+ * encoders write (`computeDocumentTotals().vatGroups`): one group per category
50
+ * and rate. The envelope has no document level allowances or charges, so the
51
+ * rules on them (BR-S-02 to -04 and -06 to -07 and their counterparts) do not
52
+ * apply, and a taxable amount is the sum of the line net amounts.
23
53
  */
24
54
  export class VATCategoriesValidator {
25
55
  results = [];
26
- currencyCalculator;
27
56
  /**
28
57
  * Validate VAT categories according to EN16931
29
58
  */
30
59
  validate(invoice) {
31
60
  this.results = [];
32
- // Initialize currency calculator if currency is available
33
- if (invoice.currency) {
34
- this.currencyCalculator = new CurrencyCalculator(invoice.currency);
35
- }
36
61
  // The VAT breakdown is computed from the line amounts; while one is no number it cannot
37
62
  // be, so these rules are skipped and the result says so (the line rules report the lines)
38
63
  const invalidAmounts = findInvalidItemAmounts(invoice.items);
@@ -40,445 +65,126 @@ export class VATCategoriesValidator {
40
65
  this.results.push(getTotalsSkippedResult(invalidAmounts, 'EN16931'));
41
66
  return this.results;
42
67
  }
43
- // Group items by VAT category
44
- const itemsByCategory = this.groupItemsByVATCategory(invoice.items || []);
45
- const breakdownsByCategory = this.groupBreakdownsByCategory(invoice.taxBreakdown || []);
46
- // Validate each VAT category
47
- this.validateStandardRate(itemsByCategory.get('S'), breakdownsByCategory.get('S'), invoice);
48
- this.validateZeroRated(itemsByCategory.get('Z'), breakdownsByCategory.get('Z'), invoice);
49
- this.validateExempt(itemsByCategory.get('E'), breakdownsByCategory.get('E'), invoice);
50
- this.validateReverseCharge(itemsByCategory.get('AE'), breakdownsByCategory.get('AE'), invoice);
51
- this.validateIntraCommunity(itemsByCategory.get('K'), breakdownsByCategory.get('K'), invoice);
52
- this.validateExport(itemsByCategory.get('G'), breakdownsByCategory.get('G'), invoice);
53
- this.validateOutOfScope(itemsByCategory.get('O'), breakdownsByCategory.get('O'), invoice);
54
- // Cross-category validation
55
- this.validateCrossCategoryRules(invoice, itemsByCategory, breakdownsByCategory);
68
+ const totals = computeDocumentTotals(invoice);
69
+ const calculator = getDocumentCalculator(invoice.currency);
70
+ const items = invoice.items ?? [];
71
+ this.validateLines(invoice, items, totals);
72
+ this.validateBreakdown(items, totals, calculator);
56
73
  return this.results;
57
74
  }
58
75
  /**
59
- * Validate Standard Rate VAT (BR-S-*)
60
- */
61
- validateStandardRate(items, breakdown, invoice) {
62
- if (!items || items.length === 0)
63
- return;
64
- // BR-S-01: Invoice with standard rated items must have standard rated breakdown
65
- if (!breakdown) {
66
- this.addError('BR-S-01', 'Invoice with standard rated items must have a standard rated VAT breakdown', 'taxBreakdown');
67
- return;
68
- }
69
- // BR-S-02: Standard rate VAT category taxable amount
70
- const expectedTaxable = this.calculateTaxableAmount(items);
71
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
72
- this.addError('BR-S-02', `Standard rate VAT taxable amount mismatch`, 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
73
- }
74
- // BR-S-03: Standard rate VAT category tax amount
75
- const rate = breakdown.taxPercent || 0;
76
- const expectedTax = this.calculateVATAmount(expectedTaxable, rate);
77
- if (!this.areAmountsEqual(breakdown.taxAmount, expectedTax)) {
78
- this.addError('BR-S-03', `Standard rate VAT tax amount mismatch`, 'taxBreakdown.taxAmount', breakdown.taxAmount, expectedTax);
79
- }
80
- // BR-S-04: Standard rate VAT category code must be "S"
81
- if (breakdown.categoryCode && breakdown.categoryCode !== 'S') {
82
- this.addError('BR-S-04', 'Standard rate VAT category code must be "S"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'S');
83
- }
84
- // BR-S-05: Standard rate VAT rate must be greater than zero
85
- if (rate <= 0) {
86
- this.addError('BR-S-05', 'Standard rate VAT rate must be greater than zero', 'taxBreakdown.taxPercent', rate, '> 0');
87
- }
88
- // BR-S-08: No exemption reason for standard rate
89
- if (breakdown.exemptionReason) {
90
- this.addError('BR-S-08', 'Standard rate VAT must not have an exemption reason', 'taxBreakdown.exemptionReason');
91
- }
92
- }
93
- /**
94
- * Validate Zero Rated VAT (BR-Z-*)
95
- */
96
- validateZeroRated(items, breakdown, invoice) {
97
- if (!items || items.length === 0)
98
- return;
99
- // BR-Z-01: Invoice with zero rated items must have zero rated breakdown
100
- if (!breakdown) {
101
- this.addError('BR-Z-01', 'Invoice with zero rated items must have a zero rated VAT breakdown', 'taxBreakdown');
102
- return;
103
- }
104
- // BR-Z-02: Zero rate VAT category taxable amount
105
- const expectedTaxable = this.calculateTaxableAmount(items);
106
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
107
- this.addError('BR-Z-02', 'Zero rate VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
108
- }
109
- // BR-Z-03: Zero rate VAT tax amount must be zero
110
- if (breakdown.taxAmount !== 0) {
111
- this.addError('BR-Z-03', 'Zero rate VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
112
- }
113
- // BR-Z-04: Zero rate VAT category code must be "Z"
114
- if (breakdown.categoryCode && breakdown.categoryCode !== 'Z') {
115
- this.addError('BR-Z-04', 'Zero rate VAT category code must be "Z"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'Z');
116
- }
117
- // BR-Z-05: Zero rate VAT rate must be zero
118
- if (breakdown.taxPercent !== 0) {
119
- this.addError('BR-Z-05', 'Zero rate VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
120
- }
121
- }
122
- /**
123
- * Validate Exempt from Tax (BR-E-*)
124
- */
125
- validateExempt(items, breakdown, invoice) {
126
- if (!items || items.length === 0)
127
- return;
128
- // BR-E-01: Invoice with exempt items must have exempt breakdown
129
- if (!breakdown) {
130
- this.addError('BR-E-01', 'Invoice with tax exempt items must have an exempt VAT breakdown', 'taxBreakdown');
131
- return;
132
- }
133
- // BR-E-02: Exempt VAT category taxable amount
134
- const expectedTaxable = this.calculateTaxableAmount(items);
135
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
136
- this.addError('BR-E-02', 'Exempt VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
137
- }
138
- // BR-E-03: Exempt VAT tax amount must be zero
139
- if (breakdown.taxAmount !== 0) {
140
- this.addError('BR-E-03', 'Exempt VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
141
- }
142
- // BR-E-04: Exempt VAT category code must be "E"
143
- if (breakdown.categoryCode && breakdown.categoryCode !== 'E') {
144
- this.addError('BR-E-04', 'Exempt VAT category code must be "E"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'E');
145
- }
146
- // BR-E-05: Exempt VAT rate must be zero
147
- if (breakdown.taxPercent !== 0) {
148
- this.addError('BR-E-05', 'Exempt VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
149
- }
150
- // BR-E-06: Exempt VAT must have exemption reason
151
- if (!breakdown.exemptionReason && !breakdown.exemptionReasonCode) {
152
- this.addError('BR-E-06', 'Exempt VAT must have an exemption reason or exemption reason code', 'taxBreakdown.exemptionReason');
153
- }
154
- }
155
- /**
156
- * Validate VAT Reverse Charge (BR-AE-*)
157
- */
158
- validateReverseCharge(items, breakdown, invoice) {
159
- if (!items || items.length === 0)
160
- return;
161
- // BR-AE-01: Invoice with reverse charge items must have reverse charge breakdown
162
- if (!breakdown) {
163
- this.addError('BR-AE-01', 'Invoice with reverse charge items must have a reverse charge VAT breakdown', 'taxBreakdown');
164
- return;
165
- }
166
- // BR-AE-02: Reverse charge VAT category taxable amount
167
- const expectedTaxable = this.calculateTaxableAmount(items);
168
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
169
- this.addError('BR-AE-02', 'Reverse charge VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
170
- }
171
- // BR-AE-03: Reverse charge VAT tax amount must be zero
172
- if (breakdown.taxAmount !== 0) {
173
- this.addError('BR-AE-03', 'Reverse charge VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
174
- }
175
- // BR-AE-04: Reverse charge VAT category code must be "AE"
176
- if (breakdown.categoryCode && breakdown.categoryCode !== 'AE') {
177
- this.addError('BR-AE-04', 'Reverse charge VAT category code must be "AE"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'AE');
178
- }
179
- // BR-AE-05: Reverse charge VAT rate must be zero
180
- if (breakdown.taxPercent !== 0) {
181
- this.addError('BR-AE-05', 'Reverse charge VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
182
- }
183
- // BR-AE-06: Reverse charge must have exemption reason
184
- if (!breakdown.exemptionReason && !breakdown.exemptionReasonCode) {
185
- this.addError('BR-AE-06', 'Reverse charge VAT must have an exemption reason', 'taxBreakdown.exemptionReason');
186
- }
187
- // BR-AE-08: Buyer must have VAT identifier for reverse charge
188
- if (!invoice?.metadata?.buyerTaxId) {
189
- this.addError('BR-AE-08', 'Buyer must have a VAT identifier for reverse charge invoices', 'metadata.buyerTaxId');
190
- }
191
- }
192
- /**
193
- * Validate Intra-Community Supply (BR-K-*)
76
+ * The rules on the lines of each category: the rate (BR-S-05, BR-AE-05), the breakdown the
77
+ * category needs (BR-S-01, BR-AE-01) and the parties' identifiers of reverse charge (BR-AE-02)
194
78
  */
195
- validateIntraCommunity(items, breakdown, invoice) {
196
- if (!items || items.length === 0)
197
- return;
198
- // BR-K-01: Invoice with intra-community items must have intra-community breakdown
199
- if (!breakdown) {
200
- this.addError('BR-K-01', 'Invoice with intra-community supply must have corresponding VAT breakdown', 'taxBreakdown');
201
- return;
202
- }
203
- // BR-K-02: Intra-community VAT category taxable amount
204
- const expectedTaxable = this.calculateTaxableAmount(items);
205
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
206
- this.addError('BR-K-02', 'Intra-community VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
207
- }
208
- // BR-K-03: Intra-community VAT tax amount must be zero
209
- if (breakdown.taxAmount !== 0) {
210
- this.addError('BR-K-03', 'Intra-community VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
211
- }
212
- // BR-K-04: Intra-community VAT category code must be "K"
213
- if (breakdown.categoryCode && breakdown.categoryCode !== 'K') {
214
- this.addError('BR-K-04', 'Intra-community VAT category code must be "K"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'K');
215
- }
216
- // BR-K-05: Intra-community VAT rate must be zero
217
- if (breakdown.taxPercent !== 0) {
218
- this.addError('BR-K-05', 'Intra-community VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
219
- }
220
- // BR-K-06: Must have exemption reason
221
- if (!breakdown.exemptionReason && !breakdown.exemptionReasonCode) {
222
- this.addError('BR-K-06', 'Intra-community supply must have an exemption reason', 'taxBreakdown.exemptionReason');
223
- }
224
- // BR-K-08: Both seller and buyer must have VAT identifiers
225
- if (!invoice?.metadata?.sellerTaxId) {
226
- this.addError('BR-K-08', 'Seller must have a VAT identifier for intra-community supply', 'metadata.sellerTaxId');
227
- }
228
- if (!invoice?.metadata?.buyerTaxId) {
229
- this.addError('BR-K-09', 'Buyer must have a VAT identifier for intra-community supply', 'metadata.buyerTaxId');
230
- }
231
- // BR-K-10: Must be in different EU member states
232
- if (invoice?.from?.address?.countryCode === invoice?.to?.address?.countryCode) {
233
- this.addWarning('BR-K-10', 'Intra-community supply should be between different EU member states', 'address.countryCode');
234
- }
235
- }
236
- /**
237
- * Validate Export Outside EU (BR-G-*)
238
- */
239
- validateExport(items, breakdown, invoice) {
240
- if (!items || items.length === 0)
241
- return;
242
- // BR-G-01: Invoice with export items must have export breakdown
243
- if (!breakdown) {
244
- this.addError('BR-G-01', 'Invoice with export items must have an export VAT breakdown', 'taxBreakdown');
245
- return;
246
- }
247
- // BR-G-02: Export VAT category taxable amount
248
- const expectedTaxable = this.calculateTaxableAmount(items);
249
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
250
- this.addError('BR-G-02', 'Export VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
251
- }
252
- // BR-G-03: Export VAT tax amount must be zero
253
- if (breakdown.taxAmount !== 0) {
254
- this.addError('BR-G-03', 'Export VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
255
- }
256
- // BR-G-04: Export VAT category code must be "G"
257
- if (breakdown.categoryCode && breakdown.categoryCode !== 'G') {
258
- this.addError('BR-G-04', 'Export VAT category code must be "G"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'G');
259
- }
260
- // BR-G-05: Export VAT rate must be zero
261
- if (breakdown.taxPercent !== 0) {
262
- this.addError('BR-G-05', 'Export VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
263
- }
264
- // BR-G-06: Must have exemption reason
265
- if (!breakdown.exemptionReason && !breakdown.exemptionReasonCode) {
266
- this.addError('BR-G-06', 'Export must have an exemption reason', 'taxBreakdown.exemptionReason');
267
- }
268
- // BR-G-08: Buyer should be outside EU
269
- const buyerCountry = invoice?.to?.address?.countryCode;
270
- if (buyerCountry && this.isEUCountry(buyerCountry)) {
271
- this.addWarning('BR-G-08', 'Export category should be used for buyers outside EU', 'to.address.countryCode', buyerCountry, 'non-EU');
272
- }
273
- }
274
- /**
275
- * Validate Out of Scope Services (BR-O-*)
276
- */
277
- validateOutOfScope(items, breakdown, invoice) {
278
- if (!items || items.length === 0)
279
- return;
280
- // BR-O-01: Invoice with out of scope items must have out of scope breakdown
281
- if (!breakdown) {
282
- this.addError('BR-O-01', 'Invoice with out of scope items must have corresponding VAT breakdown', 'taxBreakdown');
283
- return;
284
- }
285
- // BR-O-02: Out of scope VAT category taxable amount
286
- const expectedTaxable = this.calculateTaxableAmount(items);
287
- if (!this.areAmountsEqual(breakdown.netAmount, expectedTaxable)) {
288
- this.addError('BR-O-02', 'Out of scope VAT taxable amount mismatch', 'taxBreakdown.netAmount', breakdown.netAmount, expectedTaxable);
289
- }
290
- // BR-O-03: Out of scope VAT tax amount must be zero
291
- if (breakdown.taxAmount !== 0) {
292
- this.addError('BR-O-03', 'Out of scope VAT tax amount must be zero', 'taxBreakdown.taxAmount', breakdown.taxAmount, 0);
293
- }
294
- // BR-O-04: Out of scope VAT category code must be "O"
295
- if (breakdown.categoryCode && breakdown.categoryCode !== 'O') {
296
- this.addError('BR-O-04', 'Out of scope VAT category code must be "O"', 'taxBreakdown.categoryCode', breakdown.categoryCode, 'O');
297
- }
298
- // BR-O-05: Out of scope VAT rate must be zero
299
- if (breakdown.taxPercent !== 0) {
300
- this.addError('BR-O-05', 'Out of scope VAT rate must be zero', 'taxBreakdown.taxPercent', breakdown.taxPercent, 0);
301
- }
302
- // BR-O-06: Must have exemption reason
303
- if (!breakdown.exemptionReason && !breakdown.exemptionReasonCode) {
304
- this.addError('BR-O-06', 'Out of scope services must have an exemption reason', 'taxBreakdown.exemptionReason');
79
+ validateLines(invoice, items, totals) {
80
+ items.forEach((item, index) => {
81
+ const category = totals.lineVatCategories[index];
82
+ // A decoded line keeps the category its document states (BT-151). One that is not S is a
83
+ // category the envelope cannot express (Z, E, K, G, O, or AE in a document that mixes S and
84
+ // AE lines, which the decoders do not read as reverse charge); its rate says nothing of BR-S-05.
85
+ const statedCategory = invoice.statedValues?.lines[index]?.vatCategoryCode;
86
+ if (category === 'S' && !(item.vatPercentage > 0) && (statedCategory === undefined || statedCategory === 'S')) {
87
+ this.addError('BR-S-05', {
88
+ field: `items[${index}].vatPercentage`,
89
+ btReference: 'BT-152',
90
+ bgReference: 'BG-25',
91
+ value: item.vatPercentage,
92
+ expected: '> 0',
93
+ });
94
+ }
95
+ if (category === 'AE' && item.vatPercentage !== 0) {
96
+ this.addError('BR-AE-05', {
97
+ field: `items[${index}].vatPercentage`,
98
+ btReference: 'BT-152',
99
+ bgReference: 'BG-25',
100
+ value: item.vatPercentage,
101
+ expected: 0,
102
+ });
103
+ }
104
+ });
105
+ const hasCategory = (category) => totals.lineVatCategories.includes(category);
106
+ const groupsOf = (category) => totals.vatGroups.filter((group) => group.category === category);
107
+ if (hasCategory('S') && groupsOf('S').length === 0) {
108
+ this.addError('BR-S-01', { field: 'taxBreakdown', btReference: 'BT-118' });
109
+ }
110
+ if (hasCategory('AE') && groupsOf('AE').length !== 1) {
111
+ this.addError('BR-AE-01', {
112
+ field: 'taxBreakdown',
113
+ btReference: 'BT-118',
114
+ value: groupsOf('AE').length,
115
+ expected: 1,
116
+ remediation: 'a reverse charge breakdown per rate: give every reverse charge line the VAT rate 0 (BR-AE-05)',
117
+ });
118
+ }
119
+ if (hasCategory('AE')) {
120
+ const seller = invoice.from?.registrationDetails;
121
+ if (!seller?.vatId?.trim() && !seller?.taxNumber?.trim()) {
122
+ this.addError('BR-AE-02', {
123
+ field: 'from.registrationDetails',
124
+ btReference: 'BT-31',
125
+ bgReference: 'BG-4',
126
+ remediation: 'state from.registrationDetails.vatId (BT-31) or .taxNumber (BT-32); the envelope cannot state a tax representative (BT-63)',
127
+ });
128
+ }
129
+ const buyer = invoice.to?.registrationDetails;
130
+ if (!buyer?.vatId?.trim() && !buyer?.registrationId?.trim()) {
131
+ this.addError('BR-AE-02', {
132
+ field: 'to.registrationDetails',
133
+ bgReference: 'BG-7',
134
+ btReference: 'BT-48',
135
+ remediation: 'state to.registrationDetails.vatId (BT-48) or .registrationId (BT-47)',
136
+ });
137
+ }
305
138
  }
306
139
  }
307
140
  /**
308
- * Cross-category validation rules
141
+ * The rules on each VAT breakdown group: its taxable amount (BR-S-08, BR-AE-08), its tax
142
+ * amount (BR-S-09, BR-AE-09, BR-CO-17) and its exemption reason (BR-S-10, BR-AE-10)
309
143
  */
310
- validateCrossCategoryRules(invoice, itemsByCategory, breakdownsByCategory) {
311
- // BR-CO-17: VAT category tax amount = Σ(VAT category taxable amount × VAT rate)
312
- breakdownsByCategory.forEach((breakdown, category) => {
313
- if (category === 'S' && breakdown.taxPercent > 0) {
314
- const expectedTax = this.calculateVATAmount(breakdown.netAmount, breakdown.taxPercent);
315
- if (!this.areAmountsEqual(breakdown.taxAmount, expectedTax)) {
316
- this.addError('BR-CO-17', `VAT tax amount calculation error for category ${category}`, 'taxBreakdown.taxAmount', breakdown.taxAmount, expectedTax);
144
+ validateBreakdown(items, totals, calculator) {
145
+ for (const group of totals.vatGroups) {
146
+ const lineNetAmounts = totals.lineNetAmounts.filter((_, index) => totals.lineVatCategories[index] === group.category && items[index].vatPercentage === group.rate);
147
+ const expectedTaxable = calculator.round(Decimal.sum(lineNetAmounts));
148
+ const expectedTax = calculator.calculateVAT(group.taxableAmount, group.rate);
149
+ const amounts = (value, expected) => ({ value: value.toNumber(), expected: expected.toNumber() });
150
+ const at = `rate ${group.rate}`;
151
+ if (group.category === 'S') {
152
+ if (!group.taxableAmount.equals(expectedTaxable)) {
153
+ this.addError('BR-S-08', { field: `taxBreakdown[${at}].netAmount`, btReference: 'BT-116', ...amounts(group.taxableAmount, expectedTaxable) });
154
+ }
155
+ if (!group.taxAmount.equals(expectedTax)) {
156
+ this.addError('BR-S-09', { field: `taxBreakdown[${at}].taxAmount`, btReference: 'BT-117', ...amounts(group.taxAmount, expectedTax) });
157
+ }
158
+ if (group.exemption) {
159
+ this.addError('BR-S-10', { field: `taxBreakdown[${at}]`, btReference: 'BT-121', value: group.exemption.code });
317
160
  }
318
161
  }
319
- });
320
- // BR-CO-18: Invoice with mixed VAT categories
321
- const categoriesUsed = new Set();
322
- itemsByCategory.forEach((items, category) => {
323
- if (items.length > 0)
324
- categoriesUsed.add(category);
325
- });
326
- // BR-IC-01: Supply to EU countries without VAT ID should use standard rate
327
- if (categoriesUsed.has('K') && !invoice.metadata?.buyerTaxId) {
328
- this.addError('BR-IC-01', 'Intra-community supply requires buyer VAT identifier', 'metadata.buyerTaxId');
329
- }
330
- // BR-IC-02: Reverse charge requires specific conditions
331
- if (categoriesUsed.has('AE')) {
332
- // Check for service codes that qualify for reverse charge
333
- const hasQualifyingServices = invoice.items?.some(item => this.isReverseChargeService(item));
334
- if (!hasQualifyingServices) {
335
- this.addWarning('BR-IC-02', 'Reverse charge should only be used for qualifying services', 'items');
336
- }
337
- }
338
- // BR-CO-19: Sum of VAT breakdown taxable amounts must equal invoice tax exclusive total
339
- let totalTaxable = 0;
340
- breakdownsByCategory.forEach(breakdown => {
341
- totalTaxable += breakdown.netAmount || 0;
342
- });
343
- const declaredTotal = invoice.totalNet || 0;
344
- if (!this.areAmountsEqual(totalTaxable, declaredTotal)) {
345
- this.addError('BR-CO-19', 'Sum of VAT breakdown taxable amounts must equal invoice total without VAT', 'totalNet', declaredTotal, totalTaxable);
346
- }
347
- }
348
- // Helper methods
349
- groupItemsByVATCategory(items) {
350
- const groups = new Map();
351
- items.forEach(item => {
352
- const category = this.determineVATCategory(item);
353
- if (!groups.has(category)) {
354
- groups.set(category, []);
162
+ if (group.category === 'AE') {
163
+ if (!group.taxableAmount.equals(expectedTaxable)) {
164
+ this.addError('BR-AE-08', { field: `taxBreakdown[${at}].netAmount`, btReference: 'BT-116', ...amounts(group.taxableAmount, expectedTaxable) });
165
+ }
166
+ if (!group.taxAmount.isZero()) {
167
+ this.addError('BR-AE-09', { field: `taxBreakdown[${at}].taxAmount`, btReference: 'BT-117', value: group.taxAmount.toNumber(), expected: 0 });
168
+ }
169
+ if (group.exemption?.code !== 'VATEX-EU-AE' && !group.exemption?.reason.trim()) {
170
+ this.addError('BR-AE-10', { field: `taxBreakdown[${at}]`, btReference: 'BT-121' });
171
+ }
355
172
  }
356
- groups.get(category).push(item);
357
- });
358
- return groups;
359
- }
360
- groupBreakdownsByCategory(breakdowns) {
361
- const groups = new Map();
362
- breakdowns.forEach(breakdown => {
363
- const category = breakdown.categoryCode || this.inferCategoryFromRate(breakdown.taxPercent);
364
- groups.set(category, breakdown);
365
- });
366
- return groups;
367
- }
368
- determineVATCategory(item) {
369
- // Determine VAT category from item metadata or rate
370
- const metadata = item.metadata;
371
- if (metadata?.vatCategory) {
372
- return metadata.vatCategory;
373
- }
374
- // Infer from rate
375
- if (item.vatPercentage === undefined || item.vatPercentage === null) {
376
- return 'S'; // Default to standard
377
- }
378
- else if (item.vatPercentage > 0) {
379
- return 'S'; // Standard rate
380
- }
381
- else if (item.vatPercentage === 0) {
382
- // Could be Z, E, AE, K, G, or O - need more context
383
- if (metadata?.exemptionReason) {
384
- if (metadata.exemptionReason.includes('reverse'))
385
- return 'AE';
386
- if (metadata.exemptionReason.includes('intra'))
387
- return 'K';
388
- if (metadata.exemptionReason.includes('export'))
389
- return 'G';
390
- if (metadata.exemptionReason.includes('scope'))
391
- return 'O';
392
- return 'E'; // Default exempt
173
+ if (!group.taxAmount.equals(expectedTax)) {
174
+ this.addError('BR-CO-17', { field: `taxBreakdown[${at}].taxAmount`, btReference: 'BT-117', ...amounts(group.taxAmount, expectedTax) });
393
175
  }
394
- return 'Z'; // Default zero-rated
395
- }
396
- return 'S'; // Default
397
- }
398
- inferCategoryFromRate(rate) {
399
- if (!rate || rate === 0)
400
- return 'Z';
401
- if (rate > 0)
402
- return 'S';
403
- return 'S';
404
- }
405
- calculateTaxableAmount(items) {
406
- const total = items.reduce((sum, item) => {
407
- const lineNet = (item.unitNetPrice || 0) * (item.unitQuantity || 0);
408
- return sum + (this.currencyCalculator ? this.currencyCalculator.round(lineNet) : lineNet);
409
- }, 0);
410
- return this.currencyCalculator ? this.currencyCalculator.round(total) : total;
411
- }
412
- calculateVATAmount(taxableAmount, rate) {
413
- const vat = taxableAmount * (rate / 100);
414
- return this.currencyCalculator ? this.currencyCalculator.round(vat) : vat;
415
- }
416
- areAmountsEqual(value1, value2) {
417
- if (this.currencyCalculator) {
418
- return this.currencyCalculator.areEqual(value1, value2);
419
176
  }
420
- return Math.abs(value1 - value2) < 0.01;
421
177
  }
422
- isEUCountry(countryCode) {
423
- return isEuMemberState(countryCode);
424
- }
425
- isReverseChargeService(item) {
426
- // Check if item qualifies for reverse charge
427
- // This would typically check service codes
428
- const metadata = item.metadata;
429
- if (metadata?.serviceCode) {
430
- // Construction services, telecommunication, etc.
431
- const reverseChargeServices = ['44', '45', '61', '62'];
432
- return reverseChargeServices.some(code => metadata.serviceCode.startsWith(code));
433
- }
434
- return false;
435
- }
436
- addError(ruleId, message, field, value, expected) {
178
+ addError(ruleId, finding) {
437
179
  this.results.push({
438
180
  ruleId,
439
181
  source: 'EN16931',
440
182
  severity: 'error',
441
- message,
442
- field,
443
- value,
444
- expected,
445
- btReference: this.getBTReference(ruleId),
446
- bgReference: 'BG-23' // VAT breakdown
183
+ message: VAT_CATEGORY_RULES[ruleId],
184
+ bgReference: 'BG-23',
185
+ ...finding,
447
186
  });
448
187
  }
449
- addWarning(ruleId, message, field, value, expected) {
450
- this.results.push({
451
- ruleId,
452
- source: 'EN16931',
453
- severity: 'warning',
454
- message,
455
- field,
456
- value,
457
- expected,
458
- btReference: this.getBTReference(ruleId),
459
- bgReference: 'BG-23'
460
- });
461
- }
462
- getBTReference(ruleId) {
463
- const btMap = {
464
- 'BR-S-': 'BT-118', // VAT category rate
465
- 'BR-Z-': 'BT-118',
466
- 'BR-E-': 'BT-120', // VAT exemption reason
467
- 'BR-AE-': 'BT-120',
468
- 'BR-K-': 'BT-120',
469
- 'BR-G-': 'BT-120',
470
- 'BR-O-': 'BT-120',
471
- 'BR-CO-17': 'BT-117', // VAT category tax amount
472
- 'BR-CO-18': 'BT-118',
473
- 'BR-CO-19': 'BT-116' // VAT category taxable amount
474
- };
475
- for (const [prefix, bt] of Object.entries(btMap)) {
476
- if (ruleId.startsWith(prefix)) {
477
- return bt;
478
- }
479
- }
480
- return undefined;
481
- }
482
188
  }
483
189
  /**
484
190
  * Get VAT category name
@@ -497,4 +203,4 @@ export function getVATCategoryName(category) {
497
203
  };
498
204
  return names[category] || 'Unknown';
499
205
  }
500
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LWNhdGVnb3JpZXMudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL3ZhdC1jYXRlZ29yaWVzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBVVg7QUFWRCxXQUFZLFdBQVc7SUFDckIsc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asd0JBQVMsQ0FBQTtJQUNULHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBLENBQUksb0VBQW9FO0FBQ2pGLENBQUMsRUFWVyxXQUFXLEtBQVgsV0FBVyxRQVV0QjtBQWNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDekIsT0FBTyxHQUF1QixFQUFFLENBQUM7SUFDakMsa0JBQWtCLENBQXNCO0lBRWhEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLE9BQWlCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWxCLDBEQUEwRDtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELHdGQUF3RjtRQUN4RiwwRkFBMEY7UUFDMUYs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
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmF0LWNhdGVnb3JpZXMudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL3ZhdC1jYXRlZ29yaWVzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsc0JBQXNCLEdBRXZCLE1BQU0sNkJBQTZCLENBQUM7QUFJckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSTlDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQixzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCx3QkFBUyxDQUFBO0lBQ1Qsc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUE7SUFDUCxzQkFBTyxDQUFBO0lBQ1Asc0JBQU8sQ0FBQTtJQUNQLHNCQUFPLENBQUEsQ0FBSSxvRUFBb0U7QUFDakYsQ0FBQyxFQVZXLFdBQVcsS0FBWCxXQUFXLFFBVXRCO0FBY0Q7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsU0FBUyxFQUNQLG1UQUFtVDtJQUNyVCxTQUFTLEVBQ1AsbUtBQW1LO0lBQ3JLLFNBQVMsRUFDUCx1ZkFBdWY7SUFDemYsU0FBUyxFQUNQLHlOQUF5TjtJQUMzTixTQUFTLEVBQ1Asb0tBQW9LO0lBQ3RLLFVBQVUsRUFDUixzVEFBc1Q7SUFDeFQsVUFBVSxFQUNSLGtYQUFrWDtJQUNwWCxVQUFVLEVBQ1IsMEpBQTBKO0lBQzVKLFVBQVUsRUFDUixrWEFBa1g7SUFDcFgsVUFBVSxFQUNSLDZJQUE2STtJQUMvSSxVQUFVLEVBQ1Isc1FBQXNRO0lBQ3hRLFVBQVUsRUFDUix3SUFBd0k7Q0FDbEksQ0FBQztBQWNYOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxPQUFPLHNC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