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