@fin.cx/einvoice 5.0.2 → 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 +13 -8
  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,417 @@
1
+ /**
2
+ * XRechnung CIUS Validator
3
+ * Implements German-specific validation rules for XRechnung 3.0
4
+ *
5
+ * XRechnung is the German Core Invoice Usage Specification (CIUS) of EN16931
6
+ * Required for B2G invoicing in Germany since November 2020
7
+ */
8
+ /**
9
+ * XRechnung-specific validator implementing German CIUS rules
10
+ */
11
+ export class XRechnungValidator {
12
+ static { this.LEITWEG_ID_PATTERN = /^[0-9]{2,3}-[0-9]{1,12}-[0-9]{2,30}$/; }
13
+ static { this.IBAN_PATTERNS = {
14
+ DE: { length: 22, pattern: /^DE[0-9]{2}[0-9]{8}[0-9]{10}$/ },
15
+ AT: { length: 20, pattern: /^AT[0-9]{2}[0-9]{5}[0-9]{11}$/ },
16
+ CH: { length: 21, pattern: /^CH[0-9]{2}[0-9]{5}[0-9A-Z]{12}$/ },
17
+ FR: { length: 27, pattern: /^FR[0-9]{2}[0-9]{5}[0-9]{5}[0-9A-Z]{11}[0-9]{2}$/ },
18
+ NL: { length: 18, pattern: /^NL[0-9]{2}[A-Z]{4}[0-9]{10}$/ },
19
+ BE: { length: 16, pattern: /^BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}$/ },
20
+ IT: { length: 27, pattern: /^IT[0-9]{2}[A-Z][0-9]{5}[0-9]{5}[0-9A-Z]{12}$/ },
21
+ ES: { length: 24, pattern: /^ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{2}[0-9]{10}$/ }
22
+ }; }
23
+ static { this.BIC_PATTERN = /^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$/; }
24
+ // SEPA countries
25
+ static { this.SEPA_COUNTRIES = new Set([
26
+ 'AD', 'AT', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI',
27
+ 'FR', 'GB', 'GI', 'GR', 'HR', 'HU', 'IE', 'IS', 'IT', 'LI', 'LT', 'LU',
28
+ 'LV', 'MC', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK', 'SM', 'VA'
29
+ ]); }
30
+ /**
31
+ * Validate XRechnung-specific requirements
32
+ */
33
+ validateXRechnung(invoice) {
34
+ const results = [];
35
+ // Check if this is an XRechnung invoice
36
+ if (!this.isXRechnungInvoice(invoice)) {
37
+ return results; // Not XRechnung, skip validation
38
+ }
39
+ // Validate mandatory fields
40
+ results.push(...this.validateLeitwegId(invoice));
41
+ results.push(...this.validateBuyerReference(invoice));
42
+ results.push(...this.validatePaymentDetails(invoice));
43
+ results.push(...this.validateSellerContact(invoice));
44
+ results.push(...this.validateTaxRegistration(invoice));
45
+ return results;
46
+ }
47
+ /**
48
+ * Check if invoice is XRechnung based on profile/customization ID
49
+ */
50
+ isXRechnungInvoice(invoice) {
51
+ const profileId = invoice.metadata?.profileId || '';
52
+ const customizationId = invoice.metadata?.customizationId || '';
53
+ // XRechnung profile identifiers
54
+ const xrechnungProfiles = [
55
+ 'urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0',
56
+ 'urn:cen.eu:en16931:2017#conformant#urn:xeinkauf.de:kosit:xrechnung_3.0',
57
+ 'urn:cen.eu:en16931:2017:xrechnung',
58
+ 'xrechnung'
59
+ ];
60
+ return xrechnungProfiles.some(profile => profileId.toLowerCase().includes(profile.toLowerCase()) ||
61
+ customizationId.toLowerCase().includes(profile.toLowerCase()));
62
+ }
63
+ /**
64
+ * Validate Leitweg-ID (routing ID for German public administration)
65
+ * Pattern: [0-9]{2,3}-[0-9]{1,12}-[0-9]{2,30}
66
+ * Rule: XR-DE-01
67
+ */
68
+ validateLeitwegId(invoice) {
69
+ const results = [];
70
+ // Leitweg-ID is typically in buyer reference (BT-10) for B2G
71
+ const buyerReference = invoice.metadata?.buyerReference || invoice.buyerReference || '';
72
+ // Check if it looks like a Leitweg-ID
73
+ if (buyerReference && this.looksLikeLeitwegId(buyerReference)) {
74
+ if (!XRechnungValidator.LEITWEG_ID_PATTERN.test(buyerReference.trim())) {
75
+ results.push({
76
+ ruleId: 'XR-DE-01',
77
+ severity: 'error',
78
+ source: 'XRECHNUNG',
79
+ message: `Invalid Leitweg-ID format: ${buyerReference}. Expected pattern: [0-9]{2,3}-[0-9]{1,12}-[0-9]{2,30}`,
80
+ btReference: 'BT-10',
81
+ field: 'buyerReference',
82
+ value: buyerReference
83
+ });
84
+ }
85
+ }
86
+ // For B2G invoices, Leitweg-ID might be mandatory
87
+ if (this.isB2GInvoice(invoice) && !buyerReference) {
88
+ results.push({
89
+ ruleId: 'XR-DE-15',
90
+ severity: 'error',
91
+ source: 'XRECHNUNG',
92
+ message: 'Buyer reference (Leitweg-ID) is mandatory for B2G invoices in Germany',
93
+ btReference: 'BT-10',
94
+ field: 'buyerReference'
95
+ });
96
+ }
97
+ return results;
98
+ }
99
+ /**
100
+ * Check if string looks like a Leitweg-ID
101
+ */
102
+ looksLikeLeitwegId(value) {
103
+ // Contains dashes and numbers in the right proportion
104
+ return value.includes('-') && /^\d+-\d+-\d+$/.test(value.trim());
105
+ }
106
+ /**
107
+ * Check if this is a B2G invoice
108
+ */
109
+ isB2GInvoice(invoice) {
110
+ // Check if buyer is a public entity (simplified check)
111
+ const buyerName = invoice.to?.name?.toLowerCase() || '';
112
+ const buyerType = invoice.metadata?.extensions?.buyerType?.toLowerCase() || '';
113
+ const publicIndicators = [
114
+ 'bundesamt', 'landesamt', 'stadtverwaltung', 'gemeinde',
115
+ 'ministerium', 'behƶrde', 'ƶffentlich', 'public', 'government'
116
+ ];
117
+ return publicIndicators.some(indicator => buyerName.includes(indicator) || buyerType.includes(indicator));
118
+ }
119
+ /**
120
+ * Validate mandatory buyer reference (BT-10)
121
+ * Rule: XR-DE-15
122
+ */
123
+ validateBuyerReference(invoice) {
124
+ const results = [];
125
+ const buyerReference = invoice.metadata?.buyerReference || invoice.buyerReference || '';
126
+ // Skip if B2G invoice - already handled in validateLeitwegId
127
+ if (this.isB2GInvoice(invoice)) {
128
+ return results;
129
+ }
130
+ if (!buyerReference || buyerReference.trim().length === 0) {
131
+ results.push({
132
+ ruleId: 'XR-DE-15',
133
+ severity: 'error',
134
+ source: 'XRECHNUNG',
135
+ message: 'Buyer reference (BT-10) is mandatory in XRechnung',
136
+ btReference: 'BT-10',
137
+ field: 'buyerReference'
138
+ });
139
+ }
140
+ return results;
141
+ }
142
+ /**
143
+ * Validate payment details (IBAN/BIC for SEPA)
144
+ * Rules: XR-DE-19, XR-DE-20
145
+ */
146
+ validatePaymentDetails(invoice) {
147
+ const results = [];
148
+ // Check payment means
149
+ const paymentMeans = invoice.metadata?.extensions?.paymentMeans;
150
+ if (!paymentMeans || paymentMeans.length === 0) {
151
+ return results; // No payment details to validate
152
+ }
153
+ for (const payment of paymentMeans) {
154
+ // Validate IBAN if present
155
+ if (payment.iban) {
156
+ const ibanResult = this.validateIBAN(payment.iban);
157
+ if (!ibanResult.valid) {
158
+ results.push({
159
+ ruleId: 'XR-DE-19',
160
+ severity: 'error',
161
+ source: 'XRECHNUNG',
162
+ message: `Invalid IBAN: ${ibanResult.message}`,
163
+ btReference: 'BT-84',
164
+ field: 'iban',
165
+ value: payment.iban
166
+ });
167
+ }
168
+ // Check if IBAN country is in SEPA zone
169
+ const countryCode = payment.iban.substring(0, 2);
170
+ if (!XRechnungValidator.SEPA_COUNTRIES.has(countryCode)) {
171
+ results.push({
172
+ ruleId: 'XR-DE-19',
173
+ severity: 'warning',
174
+ source: 'XRECHNUNG',
175
+ message: `IBAN country ${countryCode} is not in SEPA zone`,
176
+ btReference: 'BT-84',
177
+ field: 'iban',
178
+ value: payment.iban
179
+ });
180
+ }
181
+ }
182
+ // Validate BIC if present
183
+ if (payment.bic) {
184
+ const bicResult = this.validateBIC(payment.bic);
185
+ if (!bicResult.valid) {
186
+ results.push({
187
+ ruleId: 'XR-DE-20',
188
+ severity: 'error',
189
+ source: 'XRECHNUNG',
190
+ message: `Invalid BIC: ${bicResult.message}`,
191
+ btReference: 'BT-86',
192
+ field: 'bic',
193
+ value: payment.bic
194
+ });
195
+ }
196
+ }
197
+ // For German domestic payments, BIC is optional if IBAN starts with DE
198
+ if (payment.iban?.startsWith('DE') && !payment.bic) {
199
+ // This is fine, BIC is optional for domestic German payments
200
+ }
201
+ else if (payment.iban && !payment.iban.startsWith('DE') && !payment.bic) {
202
+ results.push({
203
+ ruleId: 'XR-DE-20',
204
+ severity: 'warning',
205
+ source: 'XRECHNUNG',
206
+ message: 'BIC is recommended for international SEPA transfers',
207
+ btReference: 'BT-86',
208
+ field: 'bic'
209
+ });
210
+ }
211
+ }
212
+ return results;
213
+ }
214
+ /**
215
+ * Validate IBAN format and checksum
216
+ */
217
+ validateIBAN(iban) {
218
+ // Remove spaces and convert to uppercase
219
+ const cleanIBAN = iban.replace(/\s/g, '').toUpperCase();
220
+ // Check basic format
221
+ if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(cleanIBAN)) {
222
+ return { valid: false, message: 'Invalid IBAN format' };
223
+ }
224
+ // Get country code
225
+ const countryCode = cleanIBAN.substring(0, 2);
226
+ // Check country-specific format
227
+ const countryFormat = XRechnungValidator.IBAN_PATTERNS[countryCode];
228
+ if (countryFormat) {
229
+ if (cleanIBAN.length !== countryFormat.length) {
230
+ return {
231
+ valid: false,
232
+ message: `Invalid IBAN length for ${countryCode}: expected ${countryFormat.length}, got ${cleanIBAN.length}`
233
+ };
234
+ }
235
+ if (!countryFormat.pattern.test(cleanIBAN)) {
236
+ return {
237
+ valid: false,
238
+ message: `Invalid IBAN format for ${countryCode}`
239
+ };
240
+ }
241
+ }
242
+ // Validate checksum using mod-97 algorithm
243
+ const rearranged = cleanIBAN.substring(4) + cleanIBAN.substring(0, 4);
244
+ const numeric = rearranged.replace(/[A-Z]/g, char => (char.charCodeAt(0) - 55).toString());
245
+ // Calculate mod 97 for large numbers
246
+ let remainder = 0;
247
+ for (let i = 0; i < numeric.length; i++) {
248
+ remainder = (remainder * 10 + parseInt(numeric[i])) % 97;
249
+ }
250
+ if (remainder !== 1) {
251
+ return { valid: false, message: 'Invalid IBAN checksum' };
252
+ }
253
+ return { valid: true };
254
+ }
255
+ /**
256
+ * Validate BIC format
257
+ */
258
+ validateBIC(bic) {
259
+ const cleanBIC = bic.replace(/\s/g, '').toUpperCase();
260
+ if (!XRechnungValidator.BIC_PATTERN.test(cleanBIC)) {
261
+ return {
262
+ valid: false,
263
+ message: 'Invalid BIC format. Expected 8 or 11 alphanumeric characters'
264
+ };
265
+ }
266
+ // Additional validation could check if BIC exists in SWIFT directory
267
+ // but that requires external data
268
+ return { valid: true };
269
+ }
270
+ /**
271
+ * Validate seller contact details
272
+ * Rule: XR-DE-02
273
+ */
274
+ validateSellerContact(invoice) {
275
+ const results = [];
276
+ // Seller contact is mandatory in XRechnung
277
+ const sellerContact = invoice.metadata?.extensions?.sellerContact;
278
+ if (!sellerContact || (!sellerContact.name && !sellerContact.email && !sellerContact.phone)) {
279
+ results.push({
280
+ ruleId: 'XR-DE-02',
281
+ severity: 'error',
282
+ source: 'XRECHNUNG',
283
+ message: 'Seller contact information (name, email, or phone) is mandatory in XRechnung',
284
+ bgReference: 'BG-6',
285
+ field: 'sellerContact'
286
+ });
287
+ }
288
+ // Validate email format if present
289
+ if (sellerContact?.email && !this.isValidEmail(sellerContact.email)) {
290
+ results.push({
291
+ ruleId: 'XR-DE-02',
292
+ severity: 'warning',
293
+ source: 'XRECHNUNG',
294
+ message: `Invalid email format: ${sellerContact.email}`,
295
+ btReference: 'BT-43',
296
+ field: 'email',
297
+ value: sellerContact.email
298
+ });
299
+ }
300
+ // Validate phone format if present (basic validation)
301
+ if (sellerContact?.phone && !this.isValidPhone(sellerContact.phone)) {
302
+ results.push({
303
+ ruleId: 'XR-DE-02',
304
+ severity: 'warning',
305
+ source: 'XRECHNUNG',
306
+ message: `Invalid phone format: ${sellerContact.phone}`,
307
+ btReference: 'BT-42',
308
+ field: 'phone',
309
+ value: sellerContact.phone
310
+ });
311
+ }
312
+ return results;
313
+ }
314
+ /**
315
+ * Validate email format
316
+ */
317
+ isValidEmail(email) {
318
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
319
+ return emailPattern.test(email);
320
+ }
321
+ /**
322
+ * Validate phone format (basic)
323
+ */
324
+ isValidPhone(phone) {
325
+ // Remove common formatting characters
326
+ const cleanPhone = phone.replace(/[\s\-\(\)\.]/g, '');
327
+ // Check if it contains only numbers and optional + at start
328
+ return /^\+?[0-9]{6,15}$/.test(cleanPhone);
329
+ }
330
+ /**
331
+ * Validate tax registration details
332
+ * Rules: XR-DE-03, XR-DE-04
333
+ */
334
+ validateTaxRegistration(invoice) {
335
+ const results = [];
336
+ const sellerVatId = invoice.metadata?.sellerTaxId ||
337
+ (invoice.from?.type === 'company' ? invoice.from.registrationDetails?.vatId : undefined) ||
338
+ invoice.metadata?.extensions?.sellerVatId;
339
+ const sellerTaxId = invoice.metadata?.extensions?.sellerTaxId;
340
+ // Either VAT ID or Tax ID must be present
341
+ if (!sellerVatId && !sellerTaxId) {
342
+ results.push({
343
+ ruleId: 'XR-DE-03',
344
+ severity: 'error',
345
+ source: 'XRECHNUNG',
346
+ message: 'Either seller VAT ID (BT-31) or Tax ID (BT-32) must be provided',
347
+ btReference: 'BT-31',
348
+ field: 'sellerTaxRegistration'
349
+ });
350
+ }
351
+ // Validate German VAT ID format if present
352
+ if (sellerVatId && sellerVatId.startsWith('DE')) {
353
+ if (!this.isValidGermanVatId(sellerVatId)) {
354
+ results.push({
355
+ ruleId: 'XR-DE-04',
356
+ severity: 'error',
357
+ source: 'XRECHNUNG',
358
+ message: `Invalid German VAT ID format: ${sellerVatId}`,
359
+ btReference: 'BT-31',
360
+ field: 'vatId',
361
+ value: sellerVatId
362
+ });
363
+ }
364
+ }
365
+ // Validate German Tax ID format if present
366
+ if (sellerTaxId && this.looksLikeGermanTaxId(sellerTaxId)) {
367
+ if (!this.isValidGermanTaxId(sellerTaxId)) {
368
+ results.push({
369
+ ruleId: 'XR-DE-04',
370
+ severity: 'warning',
371
+ source: 'XRECHNUNG',
372
+ message: `Invalid German Tax ID format: ${sellerTaxId}`,
373
+ btReference: 'BT-32',
374
+ field: 'taxId',
375
+ value: sellerTaxId
376
+ });
377
+ }
378
+ }
379
+ return results;
380
+ }
381
+ /**
382
+ * Validate German VAT ID format
383
+ */
384
+ isValidGermanVatId(vatId) {
385
+ // German VAT ID: DE followed by 9 digits
386
+ const germanVatPattern = /^DE[0-9]{9}$/;
387
+ return germanVatPattern.test(vatId.replace(/\s/g, ''));
388
+ }
389
+ /**
390
+ * Check if value looks like a German Tax ID
391
+ */
392
+ looksLikeGermanTaxId(value) {
393
+ const clean = value.replace(/[\s\/\-]/g, '');
394
+ return /^[0-9]{10,11}$/.test(clean);
395
+ }
396
+ /**
397
+ * Validate German Tax ID format
398
+ */
399
+ isValidGermanTaxId(taxId) {
400
+ // German Tax ID: 11 digits with specific checksum algorithm
401
+ const clean = taxId.replace(/[\s\/\-]/g, '');
402
+ if (!/^[0-9]{11}$/.test(clean)) {
403
+ return false;
404
+ }
405
+ // Simplified validation - full algorithm would require checksum calculation
406
+ // At least check that not all digits are the same
407
+ const firstDigit = clean[0];
408
+ return !clean.split('').every(digit => digit === firstDigit);
409
+ }
410
+ /**
411
+ * Create XRechnung profile validator instance
412
+ */
413
+ static create() {
414
+ return new XRechnungValidator();
415
+ }
416
+ }
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdmFsaWRhdGlvbi94cmVjaG51bmcudmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUtIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjthQUNMLHVCQUFrQixHQUFHLHNDQUFzQyxDQUFDO2FBQzVELGtCQUFhLEdBQXdEO1FBQzNGLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtCQUErQixFQUFFO1FBQzVELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtCQUErQixFQUFFO1FBQzVELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFO1FBQy9ELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtEQUFrRCxFQUFFO1FBQy9FLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtCQUErQixFQUFFO1FBQzVELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFO1FBQ25FLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtDQUErQyxFQUFFO1FBQzVFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLCtDQUErQyxFQUFFO0tBQzdFLENBQUM7YUFDc0IsZ0JBQVcsR0FBRyxxQ0FBcUMsQ0FBQztJQUU1RSxpQkFBaUI7YUFDTyxtQkFBYyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQy9DLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFF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
@@ -38,6 +38,7 @@ export interface ValidationError {
38
38
  export interface ValidationResult {
39
39
  valid: boolean;
40
40
  errors: ValidationError[];
41
+ warnings?: ValidationError[];
41
42
  level: ValidationLevel;
42
43
  }
43
44
  /**
@@ -0,0 +1,83 @@
1
+ /**
2
+ * EN16931-compliant metadata interface for EInvoice
3
+ * Contains all additional fields required for full standards compliance
4
+ */
5
+ import type { InvoiceFormat } from './common.js';
6
+ /**
7
+ * Extended metadata for EN16931 compliance
8
+ */
9
+ export interface IEInvoiceMetadata {
10
+ format?: InvoiceFormat;
11
+ version?: string;
12
+ profile?: string;
13
+ customizationId?: string;
14
+ vatAccountingCurrency?: string;
15
+ documentTypeCode?: string;
16
+ paymentMeansCode?: string;
17
+ paidAmount?: number;
18
+ amountDue?: number;
19
+ sellerTaxId?: string;
20
+ buyerTaxId?: string;
21
+ buyerReference?: string;
22
+ profileId?: string;
23
+ paymentTerms?: string;
24
+ deliveryAddress?: {
25
+ streetName?: string;
26
+ houseNumber?: string;
27
+ city?: string;
28
+ postalCode?: string;
29
+ countryCode?: string;
30
+ countrySubdivision?: string;
31
+ };
32
+ paymentAccount?: {
33
+ iban?: string;
34
+ accountName?: string;
35
+ bankId?: string;
36
+ };
37
+ allowances?: Array<{
38
+ amount: number;
39
+ baseAmount?: number;
40
+ percentage?: number;
41
+ vatCategoryCode?: string;
42
+ vatRate?: number;
43
+ reason?: string;
44
+ reasonCode?: string;
45
+ }>;
46
+ charges?: Array<{
47
+ amount: number;
48
+ baseAmount?: number;
49
+ percentage?: number;
50
+ vatCategoryCode?: string;
51
+ vatRate?: number;
52
+ reason?: string;
53
+ reasonCode?: string;
54
+ }>;
55
+ extensions?: Record<string, any>;
56
+ }
57
+ /**
58
+ * Extended item metadata for EN16931 compliance
59
+ */
60
+ export interface IItemMetadata {
61
+ vatCategoryCode?: string;
62
+ priceBaseQuantity?: number;
63
+ exemptionReason?: string;
64
+ originCountryCode?: string;
65
+ commodityCode?: string;
66
+ attributes?: Array<{
67
+ name: string;
68
+ value: string;
69
+ }>;
70
+ }
71
+ /**
72
+ * Extended accounting document item with metadata
73
+ */
74
+ export interface IExtendedAccountingDocItem {
75
+ position: number;
76
+ name: string;
77
+ articleNumber?: string;
78
+ unitType: string;
79
+ unitQuantity: number;
80
+ unitNetPrice: number;
81
+ vatPercentage: number;
82
+ metadata?: IItemMetadata;
83
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * EN16931-compliant metadata interface for EInvoice
3
+ * Contains all additional fields required for full standards compliance
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4xNjkzMS1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ludGVyZmFjZXMvZW4xNjkzMS1tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0cifQ==
@@ -8,7 +8,9 @@ import * as path from 'path';
8
8
  import * as crypto from 'crypto';
9
9
  import { PDFDocument, PDFDict, PDFName, PDFRawStream, PDFArray, PDFString, AFRelationship } from 'pdf-lib';
10
10
  import { DOMParser, XMLSerializer } from 'xmldom';
11
+ import * as xmldom from 'xmldom';
11
12
  import * as xpath from 'xpath';
13
+ import * as SaxonJS from 'saxon-js';
12
14
  import * as pako from 'pako';
13
15
  import { business, finance, general } from '@tsclass/tsclass';
14
- export { fs, path, crypto, PDFDocument, PDFDict, PDFName, PDFRawStream, PDFArray, PDFString, AFRelationship, DOMParser, XMLSerializer, xpath, pako, business, finance, general };
16
+ export { fs, path, crypto, PDFDocument, PDFDict, PDFName, PDFRawStream, PDFArray, PDFString, AFRelationship, DOMParser, XMLSerializer, xmldom, xpath, SaxonJS, pako, business, finance, general };
@@ -11,7 +11,10 @@ import * as crypto from 'crypto';
11
11
  import { PDFDocument, PDFDict, PDFName, PDFRawStream, PDFArray, PDFString, AFRelationship } from 'pdf-lib';
12
12
  // XML-related imports
13
13
  import { DOMParser, XMLSerializer } from 'xmldom';
14
+ import * as xmldom from 'xmldom';
14
15
  import * as xpath from 'xpath';
16
+ // XSLT/Schematron imports
17
+ import * as SaxonJS from 'saxon-js';
15
18
  // Compression-related imports
16
19
  import * as pako from 'pako';
17
20
  // Business model imports
@@ -23,9 +26,11 @@ fs, path, crypto,
23
26
  // PDF-lib exports
24
27
  PDFDocument, PDFDict, PDFName, PDFRawStream, PDFArray, PDFString, AFRelationship,
25
28
  // XML-related exports
26
- DOMParser, XMLSerializer, xpath,
29
+ DOMParser, XMLSerializer, xmldom, xpath,
30
+ // XSLT/Schematron exports
31
+ SaxonJS,
27
32
  // Compression-related exports
28
33
  pako,
29
34
  // Business model exports
30
35
  business, finance, general };
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILDJCQUEyQjtBQUMzQixPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxzQkFBc0I7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLFNBQVMsQ0FBQztBQUVqQixzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEQsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsOEJBQThCO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLHlCQUF5QjtBQUN6QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU5RCx3QkFBd0I7QUFDeEIsT0FBTztBQUNMLDJCQUEyQjtBQUMzQixFQUFFLEVBQ0YsSUFBSSxFQUNKLE1BQU07QUFFTixrQkFBa0I7QUFDbEIsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFFBQVEsRUFDUixTQUFTLEVBQ1QsY0FBYztBQUVkLHNCQUFzQjtBQUN0QixTQUFTLEVBQ1QsYUFBYSxFQUNiLEtBQUs7QUFFTCw4QkFBOEI7QUFDOUIsSUFBSTtBQUVKLHlCQUF5QjtBQUN6QixRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUixDQUFDIn0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILDJCQUEyQjtBQUMzQixPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxzQkFBc0I7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULGNBQWMsRUFDZixNQUFNLFNBQVMsQ0FBQztBQUVqQixzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsMEJBQTBCO0FBQzFCLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLDhCQUE4QjtBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3Qix5QkFBeUI7QUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUQsd0JBQXdCO0FBQ3hCLE9BQU87QUFDTCwyQkFBMkI7QUFDM0IsRUFBRSxFQUNGLElBQUksRUFDSixNQUFNO0FBRU4sa0JBQWtCO0FBQ2xCLFdBQVcsRUFDWCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksRUFDWixRQUFRLEVBQ1IsU0FBUyxFQUNULGNBQWM7QUFFZCxzQkFBc0I7QUFDdEIsU0FBUyxFQUNULGFBQWEsRUFDYixNQUFNLEVBQ04sS0FBSztBQUVMLDBCQUEwQjtBQUMxQixPQUFPO0FBRVAsOEJBQThCO0FBQzlCLElBQUk7QUFFSix5QkFBeUI7QUFDekIsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLEVBQ1IsQ0FBQyJ9
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Script to download official Schematron files for e-invoice validation
4
+ */
5
+ declare function main(): Promise<void>;
6
+ export default main;
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Script to download official Schematron files for e-invoice validation
4
+ */
5
+ import { SchematronDownloader } from '../dist_ts/formats/validation/schematron.downloader.js';
6
+ async function main() {
7
+ console.log('šŸ“„ Starting Schematron download...\n');
8
+ const downloader = new SchematronDownloader('assets_downloaded/schematron');
9
+ await downloader.initialize();
10
+ // Download EN16931 Schematron files
11
+ console.log('šŸ”µ Downloading EN16931 Schematron files...');
12
+ try {
13
+ const en16931Paths = await downloader.downloadStandard('EN16931');
14
+ console.log(`āœ… Downloaded ${en16931Paths.length} EN16931 files`);
15
+ en16931Paths.forEach(p => console.log(` - ${p}`));
16
+ }
17
+ catch (error) {
18
+ console.error(`āŒ Failed to download EN16931: ${error.message}`);
19
+ }
20
+ console.log('\nšŸ”µ Downloading PEPPOL Schematron files...');
21
+ try {
22
+ const peppolPaths = await downloader.downloadStandard('PEPPOL');
23
+ console.log(`āœ… Downloaded ${peppolPaths.length} PEPPOL files`);
24
+ peppolPaths.forEach(p => console.log(` - ${p}`));
25
+ }
26
+ catch (error) {
27
+ console.error(`āŒ Failed to download PEPPOL: ${error.message}`);
28
+ }
29
+ console.log('\nšŸ”µ Downloading XRechnung Schematron files...');
30
+ try {
31
+ const xrechnungPaths = await downloader.downloadStandard('XRECHNUNG');
32
+ console.log(`āœ… Downloaded ${xrechnungPaths.length} XRechnung files`);
33
+ xrechnungPaths.forEach(p => console.log(` - ${p}`));
34
+ }
35
+ catch (error) {
36
+ console.error(`āŒ Failed to download XRechnung: ${error.message}`);
37
+ }
38
+ // List cached files
39
+ console.log('\nšŸ“‚ Cached Schematron files:');
40
+ const cached = await downloader.getCachedFiles();
41
+ cached.forEach(file => {
42
+ if (file.metadata) {
43
+ console.log(` - ${file.path}`);
44
+ console.log(` Version: ${file.metadata.version}`);
45
+ console.log(` Format: ${file.metadata.format}`);
46
+ console.log(` Downloaded: ${file.metadata.downloadDate}`);
47
+ }
48
+ else {
49
+ console.log(` - ${file.path} (no metadata)`);
50
+ }
51
+ });
52
+ console.log('\nāœ… Schematron download complete!');
53
+ }
54
+ // Run if executed directly
55
+ if (import.meta.url === `file://${process.argv[1]}`) {
56
+ main().catch(error => {
57
+ console.error('āŒ Script failed:', error);
58
+ process.exit(1);
59
+ });
60
+ }
61
+ export default main;
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtc2NoZW1hdHJvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2luc3RhbGwvZG93bmxvYWQtc2NoZW1hdHJvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUU5RixLQUFLLFVBQVUsSUFBSTtJQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRTlCLG9DQUFvQztJQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsWUFBWSxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQztRQUNqRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFB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