@fin.cx/einvoice 5.0.3 → 5.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +9 -3
- 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,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
|
+
}
|