@fin.cx/einvoice 5.0.3 → 5.1.2

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 (116) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/package.json +9 -3
  58. package/readme.md +255 -810
  59. package/ts/00_commitinfo_data.ts +1 -1
  60. package/ts/einvoice.ts +63 -14
  61. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  62. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  63. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  64. package/ts/formats/semantic/semantic.validator.ts +654 -0
  65. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  66. package/ts/formats/utils/currency.utils.ts +299 -0
  67. package/ts/formats/utils/decimal.ts +509 -0
  68. package/ts/formats/validation/codelist.validator.ts +317 -0
  69. package/ts/formats/validation/conformance.harness.ts +591 -0
  70. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  71. package/ts/formats/validation/facturx.validator.ts +579 -0
  72. package/ts/formats/validation/integrated.validator.ts +405 -0
  73. package/ts/formats/validation/peppol.validator.ts +589 -0
  74. package/ts/formats/validation/schematron.downloader.ts +304 -0
  75. package/ts/formats/validation/schematron.integration.ts +285 -0
  76. package/ts/formats/validation/schematron.validator.ts +348 -0
  77. package/ts/formats/validation/schematron.worker.ts +221 -0
  78. package/ts/formats/validation/validation.types.ts +274 -0
  79. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  80. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  81. package/ts/interfaces/common.ts +1 -0
  82. package/ts/interfaces/en16931-metadata.ts +104 -0
  83. package/ts/plugins.ts +8 -0
  84. package/ts/tspublish.json +3 -0
  85. package/dist_ts/classes.decoder.d.ts +0 -40
  86. package/dist_ts/classes.decoder.js +0 -320
  87. package/dist_ts/classes.encoder.d.ts +0 -51
  88. package/dist_ts/classes.encoder.js +0 -293
  89. package/dist_ts/classes.xinvoice.d.ts +0 -136
  90. package/dist_ts/classes.xinvoice.js +0 -352
  91. package/dist_ts/formats/base.decoder.d.ts +0 -19
  92. package/dist_ts/formats/base.decoder.js +0 -130
  93. package/dist_ts/formats/base.validator.d.ts +0 -44
  94. package/dist_ts/formats/base.validator.js +0 -39
  95. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  96. package/dist_ts/formats/decoder.factory.js +0 -46
  97. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  98. package/dist_ts/formats/factorx.decoder.js +0 -178
  99. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  100. package/dist_ts/formats/factorx.encoder.js +0 -293
  101. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  102. package/dist_ts/formats/facturx.decoder.js +0 -210
  103. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  104. package/dist_ts/formats/facturx.encoder.js +0 -293
  105. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  106. package/dist_ts/formats/facturx.validator.js +0 -266
  107. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  109. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  110. package/dist_ts/formats/ubl.validator.js +0 -306
  111. package/dist_ts/formats/validator.factory.d.ts +0 -18
  112. package/dist_ts/formats/validator.factory.js +0 -78
  113. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  114. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  115. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  116. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Decimal Arithmetic Library for EN16931 Compliance
3
+ * Provides arbitrary precision decimal arithmetic to avoid floating-point errors
4
+ *
5
+ * Based on EN16931 requirements for financial calculations:
6
+ * - All monetary amounts must be calculated with sufficient precision
7
+ * - Rounding must be consistent and predictable
8
+ * - No loss of precision in intermediate calculations
9
+ */
10
+ /**
11
+ * Decimal class for arbitrary precision arithmetic
12
+ * Internally stores the value as an integer with a scale factor
13
+ */
14
+ export class Decimal {
15
+ static get ZERO() {
16
+ if (!this._ZERO)
17
+ this._ZERO = new Decimal(0);
18
+ return this._ZERO;
19
+ }
20
+ static get ONE() {
21
+ if (!this._ONE)
22
+ this._ONE = new Decimal(1);
23
+ return this._ONE;
24
+ }
25
+ static get TEN() {
26
+ if (!this._TEN)
27
+ this._TEN = new Decimal(10);
28
+ return this._TEN;
29
+ }
30
+ static get HUNDRED() {
31
+ if (!this._HUNDRED)
32
+ this._HUNDRED = new Decimal(100);
33
+ return this._HUNDRED;
34
+ }
35
+ // Default scale for monetary calculations (4 decimal places for intermediate calculations)
36
+ static { this.DEFAULT_SCALE = 4; }
37
+ /**
38
+ * Create a new Decimal from various input types
39
+ */
40
+ constructor(value, scale) {
41
+ if (value instanceof Decimal) {
42
+ this.value = value.value;
43
+ this.scale = value.scale;
44
+ return;
45
+ }
46
+ // Special handling for direct bigint with scale (internal use)
47
+ if (typeof value === 'bigint' && scale !== undefined) {
48
+ this.value = value;
49
+ this.scale = scale;
50
+ return;
51
+ }
52
+ // Determine scale if not provided
53
+ if (scale === undefined) {
54
+ if (typeof value === 'string') {
55
+ const parts = value.split('.');
56
+ scale = parts.length > 1 ? parts[1].length : 0;
57
+ }
58
+ else {
59
+ scale = Decimal.DEFAULT_SCALE;
60
+ }
61
+ }
62
+ this.scale = scale;
63
+ // Convert to scaled integer
64
+ if (typeof value === 'string') {
65
+ // Remove any formatting
66
+ value = value.replace(/[^\d.-]/g, '');
67
+ const parts = value.split('.');
68
+ const integerPart = parts[0] || '0';
69
+ const decimalPart = (parts[1] || '').padEnd(scale, '0').slice(0, scale);
70
+ this.value = BigInt(integerPart + decimalPart);
71
+ }
72
+ else if (typeof value === 'number') {
73
+ // Handle floating point numbers
74
+ if (!isFinite(value)) {
75
+ throw new Error(`Invalid number value: ${value}`);
76
+ }
77
+ const multiplier = Math.pow(10, scale);
78
+ this.value = BigInt(Math.round(value * multiplier));
79
+ }
80
+ else {
81
+ // bigint
82
+ this.value = value * BigInt(Math.pow(10, scale));
83
+ }
84
+ }
85
+ /**
86
+ * Convert to string representation
87
+ */
88
+ toString(decimalPlaces) {
89
+ const absValue = this.value < 0n ? -this.value : this.value;
90
+ const str = absValue.toString().padStart(this.scale + 1, '0');
91
+ const integerPart = this.scale > 0 ? (str.slice(0, -this.scale) || '0') : str;
92
+ let decimalPart = this.scale > 0 ? str.slice(-this.scale) : '';
93
+ // Apply decimal places if specified
94
+ if (decimalPlaces !== undefined) {
95
+ if (decimalPlaces === 0) {
96
+ return (this.value < 0n ? '-' : '') + integerPart;
97
+ }
98
+ decimalPart = decimalPart.padEnd(decimalPlaces, '0').slice(0, decimalPlaces);
99
+ }
100
+ // Remove trailing zeros if no specific decimal places requested
101
+ if (decimalPlaces === undefined) {
102
+ decimalPart = decimalPart.replace(/0+$/, '');
103
+ }
104
+ const result = decimalPart ? `${integerPart}.${decimalPart}` : integerPart;
105
+ return this.value < 0n ? '-' + result : result;
106
+ }
107
+ /**
108
+ * Convert to number (may lose precision)
109
+ */
110
+ toNumber() {
111
+ return Number(this.value) / Math.pow(10, this.scale);
112
+ }
113
+ /**
114
+ * Convert to fixed decimal places string
115
+ */
116
+ toFixed(decimalPlaces) {
117
+ return this.round(decimalPlaces).toString(decimalPlaces);
118
+ }
119
+ /**
120
+ * Add two decimals
121
+ */
122
+ add(other) {
123
+ const otherDecimal = other instanceof Decimal ? other : new Decimal(other);
124
+ // Align scales
125
+ if (this.scale === otherDecimal.scale) {
126
+ return new Decimal(this.value + otherDecimal.value, this.scale);
127
+ }
128
+ const maxScale = Math.max(this.scale, otherDecimal.scale);
129
+ const thisScaled = this.rescale(maxScale);
130
+ const otherScaled = otherDecimal.rescale(maxScale);
131
+ return new Decimal(thisScaled.value + otherScaled.value, maxScale);
132
+ }
133
+ /**
134
+ * Subtract another decimal
135
+ */
136
+ subtract(other) {
137
+ const otherDecimal = other instanceof Decimal ? other : new Decimal(other);
138
+ // Align scales
139
+ if (this.scale === otherDecimal.scale) {
140
+ return new Decimal(this.value - otherDecimal.value, this.scale);
141
+ }
142
+ const maxScale = Math.max(this.scale, otherDecimal.scale);
143
+ const thisScaled = this.rescale(maxScale);
144
+ const otherScaled = otherDecimal.rescale(maxScale);
145
+ return new Decimal(thisScaled.value - otherScaled.value, maxScale);
146
+ }
147
+ /**
148
+ * Multiply by another decimal
149
+ */
150
+ multiply(other) {
151
+ const otherDecimal = other instanceof Decimal ? other : new Decimal(other);
152
+ // Multiply values and add scales
153
+ const newValue = this.value * otherDecimal.value;
154
+ const newScale = this.scale + otherDecimal.scale;
155
+ // Reduce scale if possible to avoid overflow
156
+ const result = new Decimal(newValue, newScale);
157
+ return result.normalize();
158
+ }
159
+ /**
160
+ * Divide by another decimal
161
+ */
162
+ divide(other, precision = 10) {
163
+ const otherDecimal = other instanceof Decimal ? other : new Decimal(other);
164
+ if (otherDecimal.value === 0n) {
165
+ throw new Error('Division by zero');
166
+ }
167
+ // Scale up the dividend to maintain precision
168
+ const scaledDividend = this.value * BigInt(Math.pow(10, precision));
169
+ const quotient = scaledDividend / otherDecimal.value;
170
+ return new Decimal(quotient, this.scale + precision - otherDecimal.scale).normalize();
171
+ }
172
+ /**
173
+ * Calculate percentage (this * rate / 100)
174
+ */
175
+ percentage(rate) {
176
+ const rateDecimal = rate instanceof Decimal ? rate : new Decimal(rate);
177
+ return this.multiply(rateDecimal).divide(100);
178
+ }
179
+ /**
180
+ * Round to specified decimal places using a specific rounding mode
181
+ */
182
+ round(decimalPlaces, mode = 'HALF_UP') {
183
+ if (decimalPlaces === this.scale) {
184
+ return this;
185
+ }
186
+ if (decimalPlaces > this.scale) {
187
+ // Just add zeros
188
+ return this.rescale(decimalPlaces);
189
+ }
190
+ // Need to round
191
+ const factor = BigInt(Math.pow(10, this.scale - decimalPlaces));
192
+ const halfFactor = factor / 2n;
193
+ let rounded;
194
+ const isNegative = this.value < 0n;
195
+ const absValue = isNegative ? -this.value : this.value;
196
+ switch (mode) {
197
+ case 'HALF_UP':
198
+ // Round half away from zero
199
+ rounded = (absValue + halfFactor) / factor;
200
+ break;
201
+ case 'HALF_DOWN':
202
+ // Round half toward zero
203
+ rounded = (absValue + halfFactor - 1n) / factor;
204
+ break;
205
+ case 'HALF_EVEN':
206
+ // Banker's rounding
207
+ const quotient = absValue / factor;
208
+ const remainder = absValue % factor;
209
+ if (remainder > halfFactor || (remainder === halfFactor && quotient % 2n === 1n)) {
210
+ rounded = quotient + 1n;
211
+ }
212
+ else {
213
+ rounded = quotient;
214
+ }
215
+ break;
216
+ case 'UP':
217
+ // Round away from zero
218
+ rounded = (absValue + factor - 1n) / factor;
219
+ break;
220
+ case 'DOWN':
221
+ // Round toward zero
222
+ rounded = absValue / factor;
223
+ break;
224
+ case 'CEILING':
225
+ // Round toward positive infinity
226
+ if (isNegative) {
227
+ rounded = absValue / factor;
228
+ }
229
+ else {
230
+ rounded = (absValue + factor - 1n) / factor;
231
+ }
232
+ break;
233
+ case 'FLOOR':
234
+ // Round toward negative infinity
235
+ if (isNegative) {
236
+ rounded = (absValue + factor - 1n) / factor;
237
+ }
238
+ else {
239
+ rounded = absValue / factor;
240
+ }
241
+ break;
242
+ default:
243
+ throw new Error(`Unknown rounding mode: ${mode}`);
244
+ }
245
+ const finalValue = isNegative ? -rounded : rounded;
246
+ return new Decimal(finalValue, decimalPlaces);
247
+ }
248
+ /**
249
+ * Compare with another decimal
250
+ */
251
+ compareTo(other) {
252
+ const otherDecimal = other instanceof Decimal ? other : new Decimal(other);
253
+ // Align scales for comparison
254
+ if (this.scale === otherDecimal.scale) {
255
+ if (this.value < otherDecimal.value)
256
+ return -1;
257
+ if (this.value > otherDecimal.value)
258
+ return 1;
259
+ return 0;
260
+ }
261
+ const maxScale = Math.max(this.scale, otherDecimal.scale);
262
+ const thisScaled = this.rescale(maxScale);
263
+ const otherScaled = otherDecimal.rescale(maxScale);
264
+ if (thisScaled.value < otherScaled.value)
265
+ return -1;
266
+ if (thisScaled.value > otherScaled.value)
267
+ return 1;
268
+ return 0;
269
+ }
270
+ /**
271
+ * Check equality
272
+ */
273
+ equals(other, tolerance) {
274
+ if (tolerance) {
275
+ const toleranceDecimal = tolerance instanceof Decimal ? tolerance : new Decimal(tolerance);
276
+ const diff = this.subtract(other);
277
+ const absDiff = diff.abs();
278
+ return absDiff.compareTo(toleranceDecimal) <= 0;
279
+ }
280
+ return this.compareTo(other) === 0;
281
+ }
282
+ /**
283
+ * Check if less than
284
+ */
285
+ lessThan(other) {
286
+ return this.compareTo(other) < 0;
287
+ }
288
+ /**
289
+ * Check if less than or equal
290
+ */
291
+ lessThanOrEqual(other) {
292
+ return this.compareTo(other) <= 0;
293
+ }
294
+ /**
295
+ * Check if greater than
296
+ */
297
+ greaterThan(other) {
298
+ return this.compareTo(other) > 0;
299
+ }
300
+ /**
301
+ * Check if greater than or equal
302
+ */
303
+ greaterThanOrEqual(other) {
304
+ return this.compareTo(other) >= 0;
305
+ }
306
+ /**
307
+ * Get absolute value
308
+ */
309
+ abs() {
310
+ return this.value < 0n ? new Decimal(-this.value, this.scale) : this;
311
+ }
312
+ /**
313
+ * Negate the value
314
+ */
315
+ negate() {
316
+ return new Decimal(-this.value, this.scale);
317
+ }
318
+ /**
319
+ * Check if zero
320
+ */
321
+ isZero() {
322
+ return this.value === 0n;
323
+ }
324
+ /**
325
+ * Check if negative
326
+ */
327
+ isNegative() {
328
+ return this.value < 0n;
329
+ }
330
+ /**
331
+ * Check if positive
332
+ */
333
+ isPositive() {
334
+ return this.value > 0n;
335
+ }
336
+ /**
337
+ * Rescale to a different number of decimal places
338
+ */
339
+ rescale(newScale) {
340
+ if (newScale === this.scale) {
341
+ return this;
342
+ }
343
+ if (newScale > this.scale) {
344
+ // Add zeros
345
+ const factor = BigInt(Math.pow(10, newScale - this.scale));
346
+ return new Decimal(this.value * factor, newScale);
347
+ }
348
+ // This would lose precision, use round() instead
349
+ throw new Error('Use round() to reduce scale');
350
+ }
351
+ /**
352
+ * Normalize by removing trailing zeros
353
+ */
354
+ normalize() {
355
+ if (this.value === 0n) {
356
+ return new Decimal(0n, 0);
357
+ }
358
+ let value = this.value;
359
+ let scale = this.scale;
360
+ while (scale > 0 && value % 10n === 0n) {
361
+ value = value / 10n;
362
+ scale--;
363
+ }
364
+ return new Decimal(value, scale);
365
+ }
366
+ /**
367
+ * Create a Decimal from a percentage string (e.g., "19%" -> 0.19)
368
+ */
369
+ static fromPercentage(value) {
370
+ const cleaned = value.replace('%', '').trim();
371
+ return new Decimal(cleaned).divide(100);
372
+ }
373
+ /**
374
+ * Sum an array of decimals
375
+ */
376
+ static sum(values) {
377
+ return values.reduce((acc, val) => {
378
+ const decimal = val instanceof Decimal ? val : new Decimal(val);
379
+ return acc.add(decimal);
380
+ }, Decimal.ZERO);
381
+ }
382
+ /**
383
+ * Get the minimum value
384
+ */
385
+ static min(...values) {
386
+ if (values.length === 0) {
387
+ throw new Error('No values provided');
388
+ }
389
+ let min = values[0] instanceof Decimal ? values[0] : new Decimal(values[0]);
390
+ for (let i = 1; i < values.length; i++) {
391
+ const current = values[i] instanceof Decimal ? values[i] : new Decimal(values[i]);
392
+ const currentDecimal = current instanceof Decimal ? current : new Decimal(current);
393
+ if (currentDecimal.lessThan(min)) {
394
+ min = currentDecimal;
395
+ }
396
+ }
397
+ return min;
398
+ }
399
+ /**
400
+ * Get the maximum value
401
+ */
402
+ static max(...values) {
403
+ if (values.length === 0) {
404
+ throw new Error('No values provided');
405
+ }
406
+ let max = values[0] instanceof Decimal ? values[0] : new Decimal(values[0]);
407
+ for (let i = 1; i < values.length; i++) {
408
+ const current = values[i] instanceof Decimal ? values[i] : new Decimal(values[i]);
409
+ const currentDecimal = current instanceof Decimal ? current : new Decimal(current);
410
+ if (currentDecimal.greaterThan(max)) {
411
+ max = currentDecimal;
412
+ }
413
+ }
414
+ return max;
415
+ }
416
+ }
417
+ /**
418
+ * Helper function to create a Decimal
419
+ */
420
+ export function decimal(value) {
421
+ return new Decimal(value);
422
+ }
423
+ /**
424
+ * Export commonly used rounding modes
425
+ */
426
+ export const RoundingMode = {
427
+ HALF_UP: 'HALF_UP',
428
+ HALF_DOWN: 'HALF_DOWN',
429
+ HALF_EVEN: 'HALF_EVEN',
430
+ UP: 'UP',
431
+ DOWN: 'DOWN',
432
+ CEILING: 'CEILING',
433
+ FLOOR: 'FLOOR'
434
+ };
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdXRpbHMvZGVjaW1hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7R0FHRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBVWxCLE1BQU0sS0FBSyxJQUFJO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sS0FBSyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyRkFBMkY7YUFDbkUsa0JBQWEsR0FBRyxDQUFDLENBQUM7SUFFMUM7O09BRUc7SUFDSCxZQUFZLEtBQXlDLEVBQUUsS0FBYztRQUNuRSxJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFH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
@@ -0,0 +1,49 @@
1
+ import type { ValidationResult } from './validation.types.js';
2
+ import type { EInvoice } from '../../einvoice.js';
3
+ /**
4
+ * Code List Validator for EN16931 compliance
5
+ * Validates against standard code lists (ISO, UNCL, UNECE)
6
+ */
7
+ export declare class CodeListValidator {
8
+ private results;
9
+ /**
10
+ * Validate all code lists in an invoice
11
+ */
12
+ validate(invoice: EInvoice): ValidationResult[];
13
+ /**
14
+ * Validate currency codes (ISO 4217)
15
+ */
16
+ private validateCurrency;
17
+ /**
18
+ * Validate country codes (ISO 3166-1 alpha-2)
19
+ */
20
+ private validateCountryCodes;
21
+ /**
22
+ * Validate document type code (UNCL1001)
23
+ */
24
+ private validateDocumentType;
25
+ /**
26
+ * Validate tax category codes (UNCL5305)
27
+ */
28
+ private validateTaxCategories;
29
+ /**
30
+ * Validate payment means codes (UNCL4461)
31
+ */
32
+ private validatePaymentMeans;
33
+ /**
34
+ * Validate unit codes (UNECE Rec 20)
35
+ */
36
+ private validateUnitCodes;
37
+ /**
38
+ * Add validation error
39
+ */
40
+ private addError;
41
+ /**
42
+ * Add validation warning
43
+ */
44
+ private addWarning;
45
+ /**
46
+ * Get code list metadata for a rule
47
+ */
48
+ private getCodeListForRule;
49
+ }