@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,311 @@
1
+ /**
2
+ * Main integrated validator combining all validation capabilities
3
+ * Orchestrates TypeScript validators, Schematron, and profile-specific rules
4
+ */
5
+ import { IntegratedValidator } from './schematron.integration.js';
6
+ import { XRechnungValidator } from './xrechnung.validator.js';
7
+ import { PeppolValidator } from './peppol.validator.js';
8
+ import { FacturXValidator } from './facturx.validator.js';
9
+ import { EN16931BusinessRulesValidator } from './en16931.business-rules.validator.js';
10
+ import { CodeListValidator } from './codelist.validator.js';
11
+ /**
12
+ * Main validator that combines all validation capabilities
13
+ */
14
+ export class MainValidator {
15
+ constructor() {
16
+ this.schematronEnabled = false;
17
+ this.integratedValidator = new IntegratedValidator();
18
+ this.xrechnungValidator = XRechnungValidator.create();
19
+ this.peppolValidator = PeppolValidator.create();
20
+ this.facturxValidator = FacturXValidator.create();
21
+ this.businessRulesValidator = new EN16931BusinessRulesValidator();
22
+ this.codeListValidator = new CodeListValidator();
23
+ }
24
+ /**
25
+ * Initialize Schematron validation for better coverage
26
+ */
27
+ async initializeSchematron(profile) {
28
+ try {
29
+ // Check available Schematron files
30
+ const available = await this.integratedValidator.getAvailableSchematron();
31
+ if (available.length === 0) {
32
+ console.warn('No Schematron files available. Run: npm run download-schematron');
33
+ return;
34
+ }
35
+ // Load appropriate Schematron based on profile
36
+ const standard = profile || 'EN16931';
37
+ const format = 'UBL'; // Default to UBL, can be made configurable
38
+ await this.integratedValidator.loadSchematron(standard === 'XRECHNUNG' ? 'EN16931' : standard, // XRechnung uses EN16931 as base
39
+ format);
40
+ this.schematronEnabled = true;
41
+ console.log(`Schematron validation enabled for ${standard} ${format}`);
42
+ }
43
+ catch (error) {
44
+ console.warn(`Failed to initialize Schematron: ${error.message}`);
45
+ }
46
+ }
47
+ /**
48
+ * Validate an invoice with all available validators
49
+ */
50
+ async validate(invoice, xmlContent, options = {}) {
51
+ const startTime = Date.now();
52
+ const results = [];
53
+ // Detect profile from invoice
54
+ const profile = this.detectProfile(invoice);
55
+ const mergedOptions = {
56
+ ...options,
57
+ profile: profile
58
+ };
59
+ // Run base validators
60
+ if (options.checkCodeLists !== false) {
61
+ results.push(...this.codeListValidator.validate(invoice));
62
+ }
63
+ results.push(...this.businessRulesValidator.validate(invoice, mergedOptions));
64
+ // Run XRechnung-specific validation if applicable
65
+ if (this.isXRechnungInvoice(invoice)) {
66
+ const xrResults = this.xrechnungValidator.validateXRechnung(invoice);
67
+ results.push(...xrResults);
68
+ }
69
+ // Run PEPPOL-specific validation if applicable
70
+ if (this.isPeppolInvoice(invoice)) {
71
+ const peppolResults = this.peppolValidator.validatePeppol(invoice);
72
+ results.push(...peppolResults);
73
+ }
74
+ // Run Factur-X specific validation if applicable
75
+ if (this.isFacturXInvoice(invoice)) {
76
+ const facturxResults = this.facturxValidator.validateFacturX(invoice);
77
+ results.push(...facturxResults);
78
+ }
79
+ // Run Schematron validation if available and XML is provided
80
+ if (this.schematronEnabled && xmlContent) {
81
+ try {
82
+ const schematronReport = await this.integratedValidator.validate(invoice, xmlContent, mergedOptions);
83
+ // Extract only Schematron-specific results to avoid duplication
84
+ const schematronResults = schematronReport.results.filter(r => r.source === 'SCHEMATRON');
85
+ results.push(...schematronResults);
86
+ }
87
+ catch (error) {
88
+ console.warn(`Schematron validation error: ${error.message}`);
89
+ }
90
+ }
91
+ // Remove duplicates (same rule + same field)
92
+ const uniqueResults = this.deduplicateResults(results);
93
+ // Calculate statistics
94
+ const errorCount = uniqueResults.filter(r => r.severity === 'error').length;
95
+ const warningCount = uniqueResults.filter(r => r.severity === 'warning').length;
96
+ const infoCount = uniqueResults.filter(r => r.severity === 'info').length;
97
+ // Estimate coverage
98
+ const totalRules = this.estimateTotalRules(profile);
99
+ const rulesChecked = new Set(uniqueResults.map(r => r.ruleId)).size;
100
+ const coverage = totalRules > 0 ? (rulesChecked / totalRules) * 100 : 0;
101
+ return {
102
+ valid: errorCount === 0,
103
+ profile: profile || 'EN16931',
104
+ timestamp: new Date().toISOString(),
105
+ validatorVersion: '2.0.0',
106
+ rulesetVersion: '1.3.14',
107
+ results: uniqueResults,
108
+ errorCount,
109
+ warningCount,
110
+ infoCount,
111
+ rulesChecked,
112
+ rulesTotal: totalRules,
113
+ coverage,
114
+ validationTime: Date.now() - startTime,
115
+ documentId: invoice.accountingDocId,
116
+ documentType: invoice.accountingDocType,
117
+ format: this.detectFormat(xmlContent)
118
+ };
119
+ }
120
+ /**
121
+ * Detect profile from invoice metadata
122
+ */
123
+ detectProfile(invoice) {
124
+ const profileId = invoice.metadata?.profileId || '';
125
+ const customizationId = invoice.metadata?.customizationId || '';
126
+ if (profileId.includes('xrechnung') || customizationId.includes('xrechnung')) {
127
+ return 'XRECHNUNG_3.0';
128
+ }
129
+ if (profileId.includes('peppol') || customizationId.includes('peppol') ||
130
+ profileId.includes('urn:fdc:peppol.eu')) {
131
+ return 'PEPPOL_BIS_3.0';
132
+ }
133
+ if (profileId.includes('facturx') || customizationId.includes('facturx') ||
134
+ profileId.includes('zugferd')) {
135
+ // Try to detect specific Factur-X profile
136
+ const facturxProfile = this.facturxValidator.detectProfile(invoice);
137
+ if (facturxProfile) {
138
+ return `FACTURX_${facturxProfile}`;
139
+ }
140
+ return 'FACTURX_EN16931';
141
+ }
142
+ return 'EN16931';
143
+ }
144
+ /**
145
+ * Check if invoice is XRechnung
146
+ */
147
+ isXRechnungInvoice(invoice) {
148
+ const profileId = invoice.metadata?.profileId || '';
149
+ const customizationId = invoice.metadata?.customizationId || '';
150
+ const xrechnungProfiles = [
151
+ 'urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung',
152
+ 'urn:cen.eu:en16931:2017#conformant#urn:xeinkauf.de:kosit:xrechnung',
153
+ 'xrechnung'
154
+ ];
155
+ return xrechnungProfiles.some(profile => profileId.toLowerCase().includes(profile.toLowerCase()) ||
156
+ customizationId.toLowerCase().includes(profile.toLowerCase()));
157
+ }
158
+ /**
159
+ * Check if invoice is PEPPOL
160
+ */
161
+ isPeppolInvoice(invoice) {
162
+ const profileId = invoice.metadata?.profileId || '';
163
+ const customizationId = invoice.metadata?.customizationId || '';
164
+ const peppolProfiles = [
165
+ 'urn:fdc:peppol.eu:2017:poacc:billing:3.0',
166
+ 'urn:fdc:peppol.eu:2017:poacc:billing:01:1.0',
167
+ 'peppol-bis-3',
168
+ 'peppol'
169
+ ];
170
+ return peppolProfiles.some(profile => profileId.toLowerCase().includes(profile.toLowerCase()) ||
171
+ customizationId.toLowerCase().includes(profile.toLowerCase()));
172
+ }
173
+ /**
174
+ * Check if invoice is Factur-X
175
+ */
176
+ isFacturXInvoice(invoice) {
177
+ const profileId = invoice.metadata?.profileId || '';
178
+ const customizationId = invoice.metadata?.customizationId || '';
179
+ const format = invoice.metadata?.format;
180
+ return format?.includes('facturx') ||
181
+ profileId.toLowerCase().includes('facturx') ||
182
+ customizationId.toLowerCase().includes('facturx') ||
183
+ profileId.toLowerCase().includes('zugferd') ||
184
+ customizationId.toLowerCase().includes('zugferd');
185
+ }
186
+ /**
187
+ * Detect format from XML content
188
+ */
189
+ detectFormat(xmlContent) {
190
+ if (!xmlContent)
191
+ return undefined;
192
+ if (xmlContent.includes('urn:oasis:names:specification:ubl:schema:xsd:Invoice-2')) {
193
+ return 'UBL';
194
+ }
195
+ else if (xmlContent.includes('urn:un:unece:uncefact:data:standard:CrossIndustryInvoice')) {
196
+ return 'CII';
197
+ }
198
+ return undefined;
199
+ }
200
+ /**
201
+ * Remove duplicate validation results
202
+ */
203
+ deduplicateResults(results) {
204
+ const seen = new Set();
205
+ const unique = [];
206
+ for (const result of results) {
207
+ const key = `${result.ruleId}|${result.field || ''}|${result.message}`;
208
+ if (!seen.has(key)) {
209
+ seen.add(key);
210
+ unique.push(result);
211
+ }
212
+ }
213
+ return unique;
214
+ }
215
+ /**
216
+ * Estimate total rules for coverage calculation
217
+ */
218
+ estimateTotalRules(profile) {
219
+ const ruleCounts = {
220
+ EN16931: 150,
221
+ 'PEPPOL_BIS_3.0': 250,
222
+ 'XRECHNUNG_3.0': 280,
223
+ FACTURX_BASIC: 100,
224
+ FACTURX_EN16931: 150
225
+ };
226
+ return ruleCounts[profile || 'EN16931'] || 150;
227
+ }
228
+ /**
229
+ * Validate with automatic format and profile detection
230
+ */
231
+ async validateAuto(invoice, xmlContent) {
232
+ // Auto-detect profile
233
+ const profile = this.detectProfile(invoice);
234
+ // Initialize Schematron if not already done
235
+ if (!this.schematronEnabled && xmlContent) {
236
+ await this.initializeSchematron(profile.startsWith('XRECHNUNG') ? 'XRECHNUNG' :
237
+ profile.startsWith('PEPPOL') ? 'PEPPOL' : 'EN16931');
238
+ }
239
+ return this.validate(invoice, xmlContent, {
240
+ checkCalculations: true,
241
+ checkVAT: true,
242
+ checkCodeLists: true,
243
+ strictMode: profile.includes('XRECHNUNG') // Strict for XRechnung
244
+ });
245
+ }
246
+ /**
247
+ * Get validation capabilities
248
+ */
249
+ getCapabilities() {
250
+ return {
251
+ schematron: this.schematronEnabled,
252
+ xrechnung: true,
253
+ peppol: true,
254
+ facturx: true,
255
+ calculations: true,
256
+ codeLists: true
257
+ };
258
+ }
259
+ /**
260
+ * Format validation report as text
261
+ */
262
+ formatReport(report) {
263
+ const lines = [];
264
+ lines.push('=== Validation Report ===');
265
+ lines.push(`Profile: ${report.profile}`);
266
+ lines.push(`Valid: ${report.valid ? '✅' : '❌'}`);
267
+ lines.push(`Timestamp: ${report.timestamp}`);
268
+ lines.push('');
269
+ if (report.errorCount > 0) {
270
+ lines.push(`Errors: ${report.errorCount}`);
271
+ report.results
272
+ .filter(r => r.severity === 'error')
273
+ .forEach(r => {
274
+ lines.push(` ❌ [${r.ruleId}] ${r.message}`);
275
+ if (r.field)
276
+ lines.push(` Field: ${r.field}`);
277
+ });
278
+ lines.push('');
279
+ }
280
+ if (report.warningCount > 0) {
281
+ lines.push(`Warnings: ${report.warningCount}`);
282
+ report.results
283
+ .filter(r => r.severity === 'warning')
284
+ .forEach(r => {
285
+ lines.push(` ⚠️ [${r.ruleId}] ${r.message}`);
286
+ if (r.field)
287
+ lines.push(` Field: ${r.field}`);
288
+ });
289
+ lines.push('');
290
+ }
291
+ lines.push('Statistics:');
292
+ lines.push(` Rules checked: ${report.rulesChecked}/${report.rulesTotal}`);
293
+ lines.push(` Coverage: ${report.coverage.toFixed(1)}%`);
294
+ lines.push(` Validation time: ${report.validationTime}ms`);
295
+ if (report.schematronEnabled) {
296
+ lines.push(' Schematron: ✅ Enabled');
297
+ }
298
+ return lines.join('\n');
299
+ }
300
+ }
301
+ /**
302
+ * Create a pre-configured validator instance
303
+ */
304
+ export async function createValidator(options = {}) {
305
+ const validator = new MainValidator();
306
+ if (options.enableSchematron !== false) {
307
+ await validator.initializeSchematron(options.profile);
308
+ }
309
+ return validator;
310
+ }
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRlZC52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL3ZhbGlkYXRpb24vaW50ZWdyYXRlZC52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFTeEI7UUFGUSxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFHekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CLENBQy9CLE9BQTRDO1FBRTVDLElBQUksQ0FBQztZQUNILG1DQUFtQztZQUNuQyxN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
@@ -0,0 +1,77 @@
1
+ /**
2
+ * PEPPOL BIS 3.0 validator for compliance with PEPPOL e-invoice specifications
3
+ * Implements PEPPOL-specific validation rules on top of EN16931
4
+ */
5
+ import type { ValidationResult } from './validation.types.js';
6
+ import type { EInvoice } from '../../einvoice.js';
7
+ /**
8
+ * PEPPOL BIS 3.0 Validator
9
+ * Implements PEPPOL-specific validation rules and constraints
10
+ */
11
+ export declare class PeppolValidator {
12
+ private static instance;
13
+ /**
14
+ * Singleton pattern for validator instance
15
+ */
16
+ static create(): PeppolValidator;
17
+ /**
18
+ * Main validation entry point for PEPPOL
19
+ */
20
+ validatePeppol(invoice: EInvoice): ValidationResult[];
21
+ /**
22
+ * Check if invoice is PEPPOL
23
+ */
24
+ private isPeppolInvoice;
25
+ /**
26
+ * Validate Endpoint ID format (0088:xxxxxxxxx or other schemes)
27
+ * PEPPOL-T001, PEPPOL-T002
28
+ */
29
+ private validateEndpointId;
30
+ /**
31
+ * Validate endpoint ID format
32
+ */
33
+ private isValidEndpointId;
34
+ /**
35
+ * Validate GLN check digit using modulo 10
36
+ */
37
+ private validateGLNCheckDigit;
38
+ /**
39
+ * Validate Document Type ID
40
+ * PEPPOL-T003
41
+ */
42
+ private validateDocumentTypeId;
43
+ /**
44
+ * Validate Process ID
45
+ * PEPPOL-T004
46
+ */
47
+ private validateProcessId;
48
+ /**
49
+ * Validate Party Identification Schemes
50
+ * PEPPOL-T005, PEPPOL-T006
51
+ */
52
+ private validatePartyIdentification;
53
+ /**
54
+ * Validate scheme IDs against PEPPOL code list
55
+ */
56
+ private isValidSchemeId;
57
+ /**
58
+ * Validate PEPPOL-specific business rules
59
+ */
60
+ private validatePeppolBusinessRules;
61
+ /**
62
+ * Validate GTIN (Global Trade Item Number)
63
+ */
64
+ private isValidGTIN;
65
+ /**
66
+ * Validate scheme IDs used in the invoice
67
+ */
68
+ private validateSchemeIds;
69
+ /**
70
+ * Validate transport protocol requirements
71
+ */
72
+ private validateTransportProtocol;
73
+ /**
74
+ * Check if invoice is B2G (Business to Government)
75
+ */
76
+ private isPeppolB2G;
77
+ }