@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/einvoice.d.ts +4 -8
- package/dist_ts/einvoice.js +46 -7
- package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
- package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
- package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
- package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
- package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
- package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
- package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
- package/dist_ts/formats/semantic/semantic.validator.js +596 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
- package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
- package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
- package/dist_ts/formats/utils/currency.utils.js +250 -0
- package/dist_ts/formats/utils/decimal.d.ts +151 -0
- package/dist_ts/formats/utils/decimal.js +435 -0
- package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
- package/dist_ts/formats/validation/codelist.validator.js +188 -0
- package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
- package/dist_ts/formats/validation/conformance.harness.js +471 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
- package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
- package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
- package/dist_ts/formats/validation/facturx.validator.js +522 -0
- package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
- package/dist_ts/formats/validation/integrated.validator.js +311 -0
- package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
- package/dist_ts/formats/validation/peppol.validator.js +529 -0
- package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
- package/dist_ts/formats/validation/schematron.downloader.js +254 -0
- package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
- package/dist_ts/formats/validation/schematron.integration.js +230 -0
- package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
- package/dist_ts/formats/validation/schematron.validator.js +288 -0
- package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
- package/dist_ts/formats/validation/schematron.worker.js +185 -0
- package/dist_ts/formats/validation/validation.types.d.ts +163 -0
- package/dist_ts/formats/validation/validation.types.js +181 -0
- package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
- package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
- package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
- package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
- package/dist_ts/interfaces/common.d.ts +1 -0
- package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
- package/dist_ts/interfaces/en16931-metadata.js +6 -0
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_install/download-schematron.d.ts +6 -0
- package/dist_ts_install/download-schematron.js +62 -0
- package/dist_ts_install/download-test-samples.d.ts +19 -0
- package/dist_ts_install/download-test-samples.js +169 -0
- package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
- package/dist_ts_install/download-xrechnung-rules.js +146 -0
- package/dist_ts_install/index.d.ts +8 -0
- package/dist_ts_install/index.js +246 -0
- package/package.json +13 -8
- package/readme.md +255 -810
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/einvoice.ts +63 -14
- package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
- package/ts/formats/semantic/bt-bg.model.ts +524 -0
- package/ts/formats/semantic/semantic.adapter.ts +600 -0
- package/ts/formats/semantic/semantic.validator.ts +654 -0
- package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
- package/ts/formats/utils/currency.utils.ts +299 -0
- package/ts/formats/utils/decimal.ts +509 -0
- package/ts/formats/validation/codelist.validator.ts +317 -0
- package/ts/formats/validation/conformance.harness.ts +591 -0
- package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
- package/ts/formats/validation/facturx.validator.ts +579 -0
- package/ts/formats/validation/integrated.validator.ts +405 -0
- package/ts/formats/validation/peppol.validator.ts +589 -0
- package/ts/formats/validation/schematron.downloader.ts +304 -0
- package/ts/formats/validation/schematron.integration.ts +285 -0
- package/ts/formats/validation/schematron.validator.ts +348 -0
- package/ts/formats/validation/schematron.worker.ts +221 -0
- package/ts/formats/validation/validation.types.ts +274 -0
- package/ts/formats/validation/vat-categories.validator.ts +845 -0
- package/ts/formats/validation/xrechnung.validator.ts +494 -0
- package/ts/interfaces/common.ts +1 -0
- package/ts/interfaces/en16931-metadata.ts +104 -0
- package/ts/plugins.ts +8 -0
- package/ts/tspublish.json +3 -0
- package/dist_ts/classes.decoder.d.ts +0 -40
- package/dist_ts/classes.decoder.js +0 -320
- package/dist_ts/classes.encoder.d.ts +0 -51
- package/dist_ts/classes.encoder.js +0 -293
- package/dist_ts/classes.xinvoice.d.ts +0 -136
- package/dist_ts/classes.xinvoice.js +0 -352
- package/dist_ts/formats/base.decoder.d.ts +0 -19
- package/dist_ts/formats/base.decoder.js +0 -130
- package/dist_ts/formats/base.validator.d.ts +0 -44
- package/dist_ts/formats/base.validator.js +0 -39
- package/dist_ts/formats/decoder.factory.d.ts +0 -15
- package/dist_ts/formats/decoder.factory.js +0 -46
- package/dist_ts/formats/factorx.decoder.d.ts +0 -18
- package/dist_ts/formats/factorx.decoder.js +0 -178
- package/dist_ts/formats/factorx.encoder.d.ts +0 -51
- package/dist_ts/formats/factorx.encoder.js +0 -293
- package/dist_ts/formats/facturx.decoder.d.ts +0 -18
- package/dist_ts/formats/facturx.decoder.js +0 -210
- package/dist_ts/formats/facturx.encoder.d.ts +0 -51
- package/dist_ts/formats/facturx.encoder.js +0 -293
- package/dist_ts/formats/facturx.validator.d.ts +0 -67
- package/dist_ts/formats/facturx.validator.js +0 -266
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
- package/dist_ts/formats/ubl.validator.d.ts +0 -82
- package/dist_ts/formats/ubl.validator.js +0 -306
- package/dist_ts/formats/validator.factory.d.ts +0 -18
- package/dist_ts/formats/validator.factory.js +0 -78
- package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
- package/dist_ts/formats/xinvoice.decoder.js +0 -332
- package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hdHJvbi5pbnRlZ3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvdmFsaWRhdGlvbi9zY2hlbWF0cm9uLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQU85QjtRQUZRLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUd4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksNkJBQTZCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBRWpELCtDQUErQztRQUMvQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyx5QkFBeUI7UUFDL0IsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO1lBQ2xDLFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUN4QixvREFBb0Q7Z0JBQ3BELG9EQUFvRDtnQkFDcEQsT0FBTyxFQUFFLENBQUM7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
|
|
@@ -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
|
+
}
|