@fin.cx/einvoice 5.0.3 → 5.1.3

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 (117) 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/npmextra.json +1 -1
  58. package/package.json +12 -6
  59. package/readme.md +255 -810
  60. package/ts/00_commitinfo_data.ts +1 -1
  61. package/ts/einvoice.ts +63 -14
  62. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  63. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  64. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  65. package/ts/formats/semantic/semantic.validator.ts +654 -0
  66. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  67. package/ts/formats/utils/currency.utils.ts +299 -0
  68. package/ts/formats/utils/decimal.ts +509 -0
  69. package/ts/formats/validation/codelist.validator.ts +317 -0
  70. package/ts/formats/validation/conformance.harness.ts +591 -0
  71. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  72. package/ts/formats/validation/facturx.validator.ts +579 -0
  73. package/ts/formats/validation/integrated.validator.ts +405 -0
  74. package/ts/formats/validation/peppol.validator.ts +589 -0
  75. package/ts/formats/validation/schematron.downloader.ts +304 -0
  76. package/ts/formats/validation/schematron.integration.ts +285 -0
  77. package/ts/formats/validation/schematron.validator.ts +348 -0
  78. package/ts/formats/validation/schematron.worker.ts +221 -0
  79. package/ts/formats/validation/validation.types.ts +274 -0
  80. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  81. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  82. package/ts/interfaces/common.ts +1 -0
  83. package/ts/interfaces/en16931-metadata.ts +104 -0
  84. package/ts/plugins.ts +8 -0
  85. package/ts/tspublish.json +3 -0
  86. package/dist_ts/classes.decoder.d.ts +0 -40
  87. package/dist_ts/classes.decoder.js +0 -320
  88. package/dist_ts/classes.encoder.d.ts +0 -51
  89. package/dist_ts/classes.encoder.js +0 -293
  90. package/dist_ts/classes.xinvoice.d.ts +0 -136
  91. package/dist_ts/classes.xinvoice.js +0 -352
  92. package/dist_ts/formats/base.decoder.d.ts +0 -19
  93. package/dist_ts/formats/base.decoder.js +0 -130
  94. package/dist_ts/formats/base.validator.d.ts +0 -44
  95. package/dist_ts/formats/base.validator.js +0 -39
  96. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  97. package/dist_ts/formats/decoder.factory.js +0 -46
  98. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  99. package/dist_ts/formats/factorx.decoder.js +0 -178
  100. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  101. package/dist_ts/formats/factorx.encoder.js +0 -293
  102. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  103. package/dist_ts/formats/facturx.decoder.js +0 -210
  104. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  105. package/dist_ts/formats/facturx.encoder.js +0 -293
  106. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  107. package/dist_ts/formats/facturx.validator.js +0 -266
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  109. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  110. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  111. package/dist_ts/formats/ubl.validator.js +0 -306
  112. package/dist_ts/formats/validator.factory.d.ts +0 -18
  113. package/dist_ts/formats/validator.factory.js +0 -78
  114. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  115. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  116. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  117. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -0,0 +1,254 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as path from 'path';
3
+ import { promises as fs } from 'fs';
4
+ /**
5
+ * Official Schematron sources for e-invoicing standards
6
+ */
7
+ export const SCHEMATRON_SOURCES = {
8
+ EN16931: [
9
+ {
10
+ name: 'EN16931-UBL',
11
+ version: '1.3.14',
12
+ url: 'https://github.com/ConnectingEurope/eInvoicing-EN16931/raw/master/ubl/schematron/EN16931-UBL-validation.sch',
13
+ description: 'Official EN16931 validation rules for UBL format',
14
+ format: 'UBL'
15
+ },
16
+ {
17
+ name: 'EN16931-CII',
18
+ version: '1.3.14',
19
+ url: 'https://github.com/ConnectingEurope/eInvoicing-EN16931/raw/master/cii/schematron/EN16931-CII-validation.sch',
20
+ description: 'Official EN16931 validation rules for CII format',
21
+ format: 'CII'
22
+ },
23
+ {
24
+ name: 'EN16931-EDIFACT',
25
+ version: '1.3.14',
26
+ url: 'https://github.com/ConnectingEurope/eInvoicing-EN16931/raw/master/edifact/schematron/EN16931-EDIFACT-validation.sch',
27
+ description: 'Official EN16931 validation rules for EDIFACT format',
28
+ format: 'CII'
29
+ }
30
+ ],
31
+ XRECHNUNG: [
32
+ {
33
+ name: 'XRechnung-UBL',
34
+ version: '3.0.2',
35
+ url: 'https://github.com/itplr-kosit/xrechnung-schematron/raw/master/src/validation/schematron/ubl/XRechnung-UBL-validation.sch',
36
+ description: 'XRechnung CIUS validation for UBL',
37
+ format: 'UBL'
38
+ },
39
+ {
40
+ name: 'XRechnung-CII',
41
+ version: '3.0.2',
42
+ url: 'https://github.com/itplr-kosit/xrechnung-schematron/raw/master/src/validation/schematron/cii/XRechnung-CII-validation.sch',
43
+ description: 'XRechnung CIUS validation for CII',
44
+ format: 'CII'
45
+ }
46
+ ],
47
+ PEPPOL: [
48
+ {
49
+ name: 'PEPPOL-EN16931-UBL',
50
+ version: '3.0.17',
51
+ url: 'https://github.com/OpenPEPPOL/peppol-bis-invoice-3/raw/master/rules/sch/PEPPOL-EN16931-UBL.sch',
52
+ description: 'PEPPOL BIS Billing 3.0 validation rules for UBL',
53
+ format: 'UBL'
54
+ },
55
+ {
56
+ name: 'PEPPOL-EN16931-CII',
57
+ version: '3.0.17',
58
+ url: 'https://github.com/OpenPEPPOL/peppol-bis-invoice-3/raw/master/rules/sch/PEPPOL-EN16931-CII.sch',
59
+ description: 'PEPPOL BIS Billing 3.0 validation rules for CII',
60
+ format: 'CII'
61
+ }
62
+ ]
63
+ };
64
+ /**
65
+ * Schematron downloader and cache manager
66
+ */
67
+ export class SchematronDownloader {
68
+ constructor(cacheDir = 'assets_downloaded/schematron') {
69
+ this.cacheDir = cacheDir;
70
+ }
71
+ /**
72
+ * Initialize the downloader
73
+ */
74
+ async initialize() {
75
+ // Ensure cache directory exists
76
+ this.smartfile = await import('@push.rocks/smartfile');
77
+ await fs.mkdir(this.cacheDir, { recursive: true });
78
+ }
79
+ /**
80
+ * Download a Schematron file
81
+ */
82
+ async download(source) {
83
+ const fileName = `${source.name}-v${source.version}.sch`;
84
+ const filePath = path.join(this.cacheDir, fileName);
85
+ // Check if already cached
86
+ if (await this.isCached(filePath)) {
87
+ console.log(`Using cached Schematron: ${fileName}`);
88
+ return filePath;
89
+ }
90
+ console.log(`Downloading Schematron: ${source.name} v${source.version}`);
91
+ try {
92
+ // Download the file
93
+ const response = await fetch(source.url);
94
+ if (!response.ok) {
95
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
96
+ }
97
+ const content = await response.text();
98
+ // Validate it's actually Schematron
99
+ if (!content.includes('schematron') && !content.includes('sch:schema')) {
100
+ throw new Error('Downloaded file does not appear to be Schematron');
101
+ }
102
+ // Save to cache
103
+ await fs.writeFile(filePath, content, 'utf-8');
104
+ // Also save metadata
105
+ const metaPath = filePath.replace('.sch', '.meta.json');
106
+ await fs.writeFile(metaPath, JSON.stringify({
107
+ source: source.name,
108
+ version: source.version,
109
+ url: source.url,
110
+ format: source.format,
111
+ downloadDate: new Date().toISOString()
112
+ }, null, 2), 'utf-8');
113
+ console.log(`Successfully downloaded: ${fileName}`);
114
+ return filePath;
115
+ }
116
+ catch (error) {
117
+ throw new Error(`Failed to download ${source.name}: ${error.message}`);
118
+ }
119
+ }
120
+ /**
121
+ * Download all Schematron files for a standard
122
+ */
123
+ async downloadStandard(standard) {
124
+ const sources = SCHEMATRON_SOURCES[standard];
125
+ if (!sources) {
126
+ throw new Error(`Unknown standard: ${standard}`);
127
+ }
128
+ const paths = [];
129
+ for (const source of sources) {
130
+ try {
131
+ const path = await this.download(source);
132
+ paths.push(path);
133
+ }
134
+ catch (error) {
135
+ console.warn(`Failed to download ${source.name}: ${error.message}`);
136
+ }
137
+ }
138
+ return paths;
139
+ }
140
+ /**
141
+ * Check if a file is cached
142
+ */
143
+ async isCached(filePath) {
144
+ try {
145
+ await fs.access(filePath);
146
+ // Check if file is not empty
147
+ const stats = await fs.stat(filePath);
148
+ return stats.size > 0;
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ /**
155
+ * Get cached Schematron files
156
+ */
157
+ async getCachedFiles() {
158
+ const files = [];
159
+ try {
160
+ const entries = await fs.readdir(this.cacheDir);
161
+ for (const entry of entries) {
162
+ if (entry.endsWith('.sch')) {
163
+ const filePath = path.join(this.cacheDir, entry);
164
+ const metaPath = filePath.replace('.sch', '.meta.json');
165
+ try {
166
+ const metadata = JSON.parse(await fs.readFile(metaPath, 'utf-8'));
167
+ files.push({ path: filePath, metadata });
168
+ }
169
+ catch {
170
+ // No metadata file
171
+ files.push({ path: filePath, metadata: null });
172
+ }
173
+ }
174
+ }
175
+ }
176
+ catch (error) {
177
+ console.warn(`Failed to list cached files: ${error.message}`);
178
+ }
179
+ return files;
180
+ }
181
+ /**
182
+ * Clear cache
183
+ */
184
+ async clearCache() {
185
+ try {
186
+ const entries = await fs.readdir(this.cacheDir);
187
+ for (const entry of entries) {
188
+ if (entry.endsWith('.sch') || entry.endsWith('.meta.json')) {
189
+ await fs.unlink(path.join(this.cacheDir, entry));
190
+ }
191
+ }
192
+ console.log('Schematron cache cleared');
193
+ }
194
+ catch (error) {
195
+ console.warn(`Failed to clear cache: ${error.message}`);
196
+ }
197
+ }
198
+ /**
199
+ * Get the appropriate Schematron for a format
200
+ */
201
+ async getSchematronForFormat(standard, format) {
202
+ const sources = SCHEMATRON_SOURCES[standard];
203
+ if (!sources)
204
+ return null;
205
+ const source = sources.find(s => s.format === format || s.format === 'BOTH');
206
+ if (!source)
207
+ return null;
208
+ return await this.download(source);
209
+ }
210
+ /**
211
+ * Update all cached Schematron files
212
+ */
213
+ async updateAll() {
214
+ console.log('Updating all Schematron files...');
215
+ for (const standard of ['EN16931', 'XRECHNUNG', 'PEPPOL']) {
216
+ await this.downloadStandard(standard);
217
+ }
218
+ console.log('All Schematron files updated');
219
+ }
220
+ }
221
+ /**
222
+ * ISO Schematron skeleton URLs
223
+ * These are needed to compile Schematron to XSLT
224
+ */
225
+ export const ISO_SCHEMATRON_SKELETONS = {
226
+ 'iso_dsdl_include.xsl': 'https://github.com/Schematron/schematron/raw/master/trunk/schematron/code/iso_dsdl_include.xsl',
227
+ 'iso_abstract_expand.xsl': 'https://github.com/Schematron/schematron/raw/master/trunk/schematron/code/iso_abstract_expand.xsl',
228
+ 'iso_svrl_for_xslt2.xsl': 'https://github.com/Schematron/schematron/raw/master/trunk/schematron/code/iso_svrl_for_xslt2.xsl',
229
+ 'iso_schematron_skeleton_for_saxon.xsl': 'https://github.com/Schematron/schematron/raw/master/trunk/schematron/code/iso_schematron_skeleton_for_saxon.xsl'
230
+ };
231
+ /**
232
+ * Download ISO Schematron skeleton files
233
+ */
234
+ export async function downloadISOSkeletons(targetDir = 'assets_downloaded/schematron/iso') {
235
+ await fs.mkdir(targetDir, { recursive: true });
236
+ console.log('Downloading ISO Schematron skeleton files...');
237
+ for (const [name, url] of Object.entries(ISO_SCHEMATRON_SKELETONS)) {
238
+ try {
239
+ const response = await fetch(url);
240
+ if (!response.ok) {
241
+ throw new Error(`HTTP ${response.status}`);
242
+ }
243
+ const content = await response.text();
244
+ const filePath = path.join(targetDir, name);
245
+ await fs.writeFile(filePath, content, 'utf-8');
246
+ console.log(`Downloaded: ${name}`);
247
+ }
248
+ catch (error) {
249
+ console.warn(`Failed to download ${name}: ${error.message}`);
250
+ }
251
+ }
252
+ console.log('ISO Schematron skeleton download complete');
253
+ }
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hdHJvbi5kb3dubG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL3NjaGVtYXRyb24uZG93bmxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBYXBDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXVDO0lBQ3BFLE9BQU8sRUFBRTtRQUNQO1lBQ0UsSUFBSSxFQUFFLGFBQWE7WUFDbkIsT0FBTyxFQUFFLFFBQVE7WUFDakIsR0FBRyxFQUFFLDZHQUE2RztZQUNsSCxXQUFXLEVBQUUsa0RBQWtEO1lBQy9ELE1BQU0sRUFBRSxLQUFLO1NBQ2Q7UUFDRDtZQUNFLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLEdBQUcsRUFBRSw2R0FBNkc7WUFDbEgsV0FBVyxFQUFFLGtEQUFrRDtZQUMvRCxNQUFNLEVBQUUsS0FBSztTQUNkO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLEdBQUcsRUFBRSxxSEFBcUg7WUFDMUgsV0FBVyxFQUFFLHNEQUFzRDtZQUNuRSxNQUFNLEVBQUUsS0FBSztTQUNkO0tBQ0Y7SUFDRCxTQUFTLEVBQUU7UUFDVDtZQUNFLElBQUksRUFBRSxlQUFlO1lBQ3JCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLEdBQUcsRUFBRSwySEFBMkg7WUFDaEksV0FBVyxFQUFFLG1DQUFtQztZQUNoRCxNQUFNLEVBQUUsS0FBSztTQUNkO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsZUFBZTtZQUNyQixPQUFPLEVBQUUsT0FBTztZQUNoQixHQUFHLEVBQUUsMkhB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
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Integration of official Schematron validation with the EInvoice module
3
+ */
4
+ import type { ValidationOptions, ValidationReport } from './validation.types.js';
5
+ import type { EInvoice } from '../../einvoice.js';
6
+ /**
7
+ * Integrated validator combining TypeScript and Schematron validation
8
+ */
9
+ export declare class IntegratedValidator {
10
+ private hybridValidator;
11
+ private schematronValidator;
12
+ private businessRulesValidator;
13
+ private codeListValidator;
14
+ private schematronLoaded;
15
+ constructor();
16
+ /**
17
+ * Setup TypeScript validators in the hybrid pipeline
18
+ */
19
+ private setupTypeScriptValidators;
20
+ /**
21
+ * Load Schematron for a specific format and standard
22
+ */
23
+ loadSchematron(standard: 'EN16931' | 'PEPPOL' | 'XRECHNUNG', format: 'UBL' | 'CII'): Promise<void>;
24
+ /**
25
+ * Get the path to the appropriate Schematron file
26
+ */
27
+ private getSchematronPath;
28
+ /**
29
+ * Validate an invoice using all available validators
30
+ */
31
+ validate(invoice: EInvoice, xmlContent?: string, options?: ValidationOptions): Promise<ValidationReport>;
32
+ /**
33
+ * Detect format from XML content
34
+ */
35
+ private detectFormat;
36
+ /**
37
+ * Estimate total number of rules for a profile
38
+ */
39
+ private estimateTotalRules;
40
+ /**
41
+ * Validate with automatic format detection
42
+ */
43
+ validateAuto(invoice: EInvoice, xmlContent?: string): Promise<ValidationReport>;
44
+ /**
45
+ * Check if Schematron validation is available
46
+ */
47
+ hasSchematron(): boolean;
48
+ /**
49
+ * Get available Schematron files
50
+ */
51
+ getAvailableSchematron(): Promise<Array<{
52
+ standard: string;
53
+ format: string;
54
+ path: string;
55
+ }>>;
56
+ }
57
+ /**
58
+ * Create a pre-configured validator for a specific standard
59
+ */
60
+ export declare function createStandardValidator(standard: 'EN16931' | 'PEPPOL' | 'XRECHNUNG', format: 'UBL' | 'CII'): Promise<IntegratedValidator>;
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Integration of official Schematron validation with the EInvoice module
3
+ */
4
+ import { SchematronValidator, HybridValidator } from './schematron.validator.js';
5
+ import { EN16931BusinessRulesValidator } from './en16931.business-rules.validator.js';
6
+ import { CodeListValidator } from './codelist.validator.js';
7
+ import * as path from 'path';
8
+ import { promises as fs } from 'fs';
9
+ /**
10
+ * Integrated validator combining TypeScript and Schematron validation
11
+ */
12
+ export class IntegratedValidator {
13
+ constructor() {
14
+ this.schematronLoaded = false;
15
+ this.schematronValidator = new SchematronValidator();
16
+ this.hybridValidator = new HybridValidator(this.schematronValidator);
17
+ this.businessRulesValidator = new EN16931BusinessRulesValidator();
18
+ this.codeListValidator = new CodeListValidator();
19
+ // Add TypeScript validators to hybrid pipeline
20
+ this.setupTypeScriptValidators();
21
+ }
22
+ /**
23
+ * Setup TypeScript validators in the hybrid pipeline
24
+ */
25
+ setupTypeScriptValidators() {
26
+ // Wrap business rules validator
27
+ this.hybridValidator.addTSValidator({
28
+ validate: (xml) => {
29
+ // Note: This would need the invoice object, not XML
30
+ // In practice, we'd parse the XML to EInvoice first
31
+ return [];
32
+ }
33
+ });
34
+ }
35
+ /**
36
+ * Load Schematron for a specific format and standard
37
+ */
38
+ async loadSchematron(standard, format) {
39
+ const schematronPath = await this.getSchematronPath(standard, format);
40
+ if (!schematronPath) {
41
+ throw new Error(`No Schematron available for ${standard} ${format}`);
42
+ }
43
+ // Check if file exists
44
+ try {
45
+ await fs.access(schematronPath);
46
+ }
47
+ catch {
48
+ throw new Error(`Schematron file not found: ${schematronPath}. Run 'npm run download-schematron' first.`);
49
+ }
50
+ await this.schematronValidator.loadSchematron(schematronPath, true);
51
+ this.schematronLoaded = true;
52
+ }
53
+ /**
54
+ * Get the path to the appropriate Schematron file
55
+ */
56
+ async getSchematronPath(standard, format) {
57
+ const basePath = 'assets_downloaded/schematron';
58
+ // Map standard and format to file pattern
59
+ const patterns = {
60
+ EN16931: {
61
+ UBL: 'EN16931-UBL-*.sch',
62
+ CII: 'EN16931-CII-*.sch'
63
+ },
64
+ PEPPOL: {
65
+ UBL: 'PEPPOL-EN16931-UBL-*.sch',
66
+ CII: 'PEPPOL-EN16931-CII-*.sch'
67
+ },
68
+ XRECHNUNG: {
69
+ UBL: 'XRechnung-UBL-*.sch',
70
+ CII: 'XRechnung-CII-*.sch'
71
+ }
72
+ };
73
+ const pattern = patterns[standard]?.[format];
74
+ if (!pattern)
75
+ return null;
76
+ // Find matching files
77
+ try {
78
+ const files = await fs.readdir(basePath);
79
+ const regex = new RegExp(pattern.replace('*', '.*'));
80
+ const matches = files.filter(f => regex.test(f));
81
+ if (matches.length > 0) {
82
+ // Return the most recent version (lexicographically last)
83
+ matches.sort();
84
+ return path.join(basePath, matches[matches.length - 1]);
85
+ }
86
+ }
87
+ catch {
88
+ // Directory doesn't exist
89
+ }
90
+ return null;
91
+ }
92
+ /**
93
+ * Validate an invoice using all available validators
94
+ */
95
+ async validate(invoice, xmlContent, options = {}) {
96
+ const startTime = Date.now();
97
+ const results = [];
98
+ // Determine format hint
99
+ const formatHint = options.formatHint || this.detectFormat(xmlContent);
100
+ // Run TypeScript validators
101
+ if (options.checkCodeLists !== false) {
102
+ results.push(...this.codeListValidator.validate(invoice));
103
+ }
104
+ results.push(...this.businessRulesValidator.validate(invoice, options));
105
+ // Run Schematron validation if XML is provided and Schematron is loaded
106
+ if (xmlContent && this.schematronLoaded) {
107
+ try {
108
+ const schematronResults = await this.schematronValidator.validate(xmlContent, {
109
+ includeWarnings: !options.strictMode,
110
+ parameters: {
111
+ profile: options.profile
112
+ }
113
+ });
114
+ results.push(...schematronResults);
115
+ }
116
+ catch (error) {
117
+ console.warn(`Schematron validation failed: ${error.message}`);
118
+ }
119
+ }
120
+ // Calculate statistics
121
+ const errorCount = results.filter(r => r.severity === 'error').length;
122
+ const warningCount = results.filter(r => r.severity === 'warning').length;
123
+ const infoCount = results.filter(r => r.severity === 'info').length;
124
+ // Estimate rule coverage
125
+ const totalRules = this.estimateTotalRules(options.profile);
126
+ const rulesChecked = new Set(results.map(r => r.ruleId)).size;
127
+ return {
128
+ valid: errorCount === 0,
129
+ profile: options.profile || 'EN16931',
130
+ timestamp: new Date().toISOString(),
131
+ validatorVersion: '1.0.0',
132
+ rulesetVersion: '1.3.14',
133
+ results,
134
+ errorCount,
135
+ warningCount,
136
+ infoCount,
137
+ rulesChecked,
138
+ rulesTotal: totalRules,
139
+ coverage: (rulesChecked / totalRules) * 100,
140
+ validationTime: Date.now() - startTime,
141
+ documentId: invoice.accountingDocId,
142
+ documentType: invoice.accountingDocType,
143
+ format: formatHint
144
+ };
145
+ }
146
+ /**
147
+ * Detect format from XML content
148
+ */
149
+ detectFormat(xmlContent) {
150
+ if (!xmlContent)
151
+ return undefined;
152
+ if (xmlContent.includes('urn:oasis:names:specification:ubl:schema:xsd:Invoice-2')) {
153
+ return 'UBL';
154
+ }
155
+ else if (xmlContent.includes('urn:un:unece:uncefact:data:standard:CrossIndustryInvoice')) {
156
+ return 'CII';
157
+ }
158
+ return undefined;
159
+ }
160
+ /**
161
+ * Estimate total number of rules for a profile
162
+ */
163
+ estimateTotalRules(profile) {
164
+ const ruleCounts = {
165
+ EN16931: 150,
166
+ PEPPOL_BIS_3_0: 250,
167
+ XRECHNUNG_3_0: 280,
168
+ FACTURX_BASIC: 100,
169
+ FACTURX_EN16931: 150
170
+ };
171
+ return ruleCounts[profile || 'EN16931'] || 150;
172
+ }
173
+ /**
174
+ * Validate with automatic format detection
175
+ */
176
+ async validateAuto(invoice, xmlContent) {
177
+ // Auto-detect format
178
+ const format = this.detectFormat(xmlContent);
179
+ // Try to load appropriate Schematron
180
+ if (format && !this.schematronLoaded) {
181
+ try {
182
+ await this.loadSchematron('EN16931', format);
183
+ }
184
+ catch (error) {
185
+ console.warn(`Could not load Schematron: ${error.message}`);
186
+ }
187
+ }
188
+ return this.validate(invoice, xmlContent, {
189
+ formatHint: format,
190
+ checkCalculations: true,
191
+ checkVAT: true,
192
+ checkCodeLists: true
193
+ });
194
+ }
195
+ /**
196
+ * Check if Schematron validation is available
197
+ */
198
+ hasSchematron() {
199
+ return this.schematronLoaded;
200
+ }
201
+ /**
202
+ * Get available Schematron files
203
+ */
204
+ async getAvailableSchematron() {
205
+ const available = [];
206
+ for (const standard of ['EN16931', 'PEPPOL', 'XRECHNUNG']) {
207
+ for (const format of ['UBL', 'CII']) {
208
+ const schematronPath = await this.getSchematronPath(standard, format);
209
+ if (schematronPath) {
210
+ available.push({ standard, format, path: schematronPath });
211
+ }
212
+ }
213
+ }
214
+ return available;
215
+ }
216
+ }
217
+ /**
218
+ * Create a pre-configured validator for a specific standard
219
+ */
220
+ export async function createStandardValidator(standard, format) {
221
+ const validator = new IntegratedValidator();
222
+ try {
223
+ await validator.loadSchematron(standard, format);
224
+ }
225
+ catch (error) {
226
+ console.warn(`Schematron not available for ${standard} ${format}: ${error.message}`);
227
+ }
228
+ return validator;
229
+ }
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hdHJvbi5pbnRlZ3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdmFsaWRhdGlvbi9zY2hlbWF0cm9uLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQU85QjtRQUZRLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUd4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksNkJBQTZCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBRWpELCtDQUErQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyx5QkFBeUI7UUFDL0IsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO1lBQ2xDLFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUN4QixvREFBb0Q7Z0JBQ3BELG9EQUFvRDtnQkFDcEQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGNBQWMsQ0FDekIsUUFBNEMsRUFDNUMsTUFBcUI7UUFFckIsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsY0FBYyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzVHLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUM3QixRQUE0QyxFQUM1QyxNQUFxQjtRQUVyQixNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQztRQUVoRCwwQ0FBMEM7UUFDMUMsTUFBTSxRQUFRLEdBQTJDO1lBQ3ZELE9BQU8sRUFBRTtnQkFDUCxHQUFHLEVBQUUsbUJBQW1CO2dCQUN4QixHQUFHLEVBQUUsbUJBQW1CO2FBQ3pCO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLEdBQUcsRUFBRSwwQkFBMEI7Z0JBQy9CLEdBQUcsRUFBRSwwQkFBMEI7YUFDaEM7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsR0FBRyxFQUFFLHFCQUFxQjthQUMzQjtTQUNGLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLHNCQUFzQjtRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsMERBQTBEO2dCQUMxRCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMEJBQTBCO1FBQzVCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQ25CLE9BQWlCLEVBQ2pCLFVBQW1CLEVBQ25CLFVBQTZCLEVBQUU7UUFFL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUF1QixFQUFFLENBQUM7UUFFdkMsd0JBQXdCO1FBQ3hCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV2RSw0QkFBNEI7UUFDNUIsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXhFLHdFQUF3RTtRQUN4RSxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFO29CQUM1RSxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVTtvQkFDcEMsVUFBVSxFQUFFO3dCQUNWLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztxQkFDekI7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN0RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXBFLHlCQUF5QjtRQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFOUQsT0FBTztZQUNMLEtBQUssRUFBRSxVQUFVLEtBQUssQ0FBQztZQUN2QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTO1lBQ3JDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxnQkFBZ0IsRUFBRSxPQUFPO1lBQ3pCLGNBQWMsRUFBRSxRQUFRO1lBQ3hCLE9BQU87WUFDUCxVQUFVO1lBQ1YsWUFBWTtZQUNaLFNBQVM7WUFDVCxZQUFZO1lBQ1osVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUc7WUFDM0MsY0FBYyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO1lBQ3RDLFVBQVUsRUFBRSxPQUFPLENBQUMsZUFBZTtZQUNuQyxZQUFZLEVBQUUsT0FBTyxDQUFDLGlCQUFpQjtZQUN2QyxNQUFNLEVBQUUsVUFBVTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLFVBQW1CO1FBQ3RDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFbEMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLHdEQUF3RCxDQUFDLEVBQUUsQ0FBQztZQUNsRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsMERBQTBELENBQUMsRUFBRSxDQUFDO1lBQzNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLE9BQWdCO1FBQ3pDLE1BQU0sVUFBVSxHQUEyQjtZQUN6QyxPQUFPLEVBQUUsR0FBRztZQUNaLGNBQWMsRUFBRSxHQUFHO1lBQ25CLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLGVBQWUsRUFBRSxHQUFHO1NBQ3JCLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQ3ZCLE9BQWlCLEVBQ2pCLFVBQW1CO1FBRW5CLHFCQUFxQjtRQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdDLHFDQUFxQztRQUNyQyxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUU7WUFDeEMsVUFBVSxFQUFFLE1BQU07WUFDbEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQjtRQUtqQyxNQUFNLFNBQVMsR0FBOEQsRUFBRSxDQUFDO1FBRWhGLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBVSxFQUFFLENBQUM7WUFDbkUsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQVUsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ25CLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFFBQTRDLEVBQzVDLE1BQXFCO0lBRXJCLE1BQU0sU0FBUyxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUU1QyxJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsUUFBUSxJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyJ9
@@ -0,0 +1,79 @@
1
+ import type { ValidationResult } from './validation.types.js';
2
+ /**
3
+ * Schematron validation options
4
+ */
5
+ export interface SchematronOptions {
6
+ phase?: string;
7
+ parameters?: Record<string, any>;
8
+ includeWarnings?: boolean;
9
+ maxErrors?: number;
10
+ }
11
+ /**
12
+ * Schematron validation engine using Saxon-JS
13
+ * Provides official standards validation through Schematron rules
14
+ */
15
+ export declare class SchematronValidator {
16
+ private compiledStylesheet;
17
+ private schematronRules;
18
+ private isCompiled;
19
+ constructor(schematronRules?: string);
20
+ /**
21
+ * Load Schematron rules from file or string
22
+ */
23
+ loadSchematron(source: string, isFilePath?: boolean): Promise<void>;
24
+ /**
25
+ * Compile Schematron to XSLT using ISO Schematron skeleton
26
+ */
27
+ private compileSchematron;
28
+ /**
29
+ * Validate an XML document against loaded Schematron rules
30
+ */
31
+ validate(xmlContent: string, options?: SchematronOptions): Promise<ValidationResult[]>;
32
+ /**
33
+ * Parse SVRL output to ValidationResult array
34
+ */
35
+ private parseSVRL;
36
+ /**
37
+ * Extract ValidationResult from SVRL element
38
+ */
39
+ private extractValidationResult;
40
+ /**
41
+ * Generate simplified XSLT from Schematron
42
+ * This is a placeholder - in production, use ISO Schematron skeleton
43
+ */
44
+ private generateXSLTFromSchematron;
45
+ /**
46
+ * Check if validator has rules loaded
47
+ */
48
+ hasRules(): boolean;
49
+ /**
50
+ * Get list of available phases from Schematron
51
+ */
52
+ getPhases(): Promise<string[]>;
53
+ /**
54
+ * Validate with specific phase activated
55
+ */
56
+ validateWithPhase(xmlContent: string, phase: string, options?: SchematronOptions): Promise<ValidationResult[]>;
57
+ }
58
+ /**
59
+ * Factory function to create validator with standard Schematron packs
60
+ */
61
+ export declare function createStandardValidator(standard: 'EN16931' | 'XRECHNUNG' | 'PEPPOL' | 'FACTURX'): Promise<SchematronValidator>;
62
+ /**
63
+ * Hybrid validator that combines TypeScript and Schematron validation
64
+ */
65
+ export declare class HybridValidator {
66
+ private schematronValidator;
67
+ private tsValidators;
68
+ constructor(schematronValidator?: SchematronValidator);
69
+ /**
70
+ * Add a TypeScript validator to the pipeline
71
+ */
72
+ addTSValidator(validator: {
73
+ validate: (xml: string) => ValidationResult[];
74
+ }): void;
75
+ /**
76
+ * Run all validators and merge results
77
+ */
78
+ validate(xmlContent: string, options?: SchematronOptions): Promise<ValidationResult[]>;
79
+ }