@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,188 @@
|
|
|
1
|
+
import { CodeLists } from './validation.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Code List Validator for EN16931 compliance
|
|
4
|
+
* Validates against standard code lists (ISO, UNCL, UNECE)
|
|
5
|
+
*/
|
|
6
|
+
export class CodeListValidator {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.results = [];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Validate all code lists in an invoice
|
|
12
|
+
*/
|
|
13
|
+
validate(invoice) {
|
|
14
|
+
this.results = [];
|
|
15
|
+
// Currency validation
|
|
16
|
+
this.validateCurrency(invoice);
|
|
17
|
+
// Country codes
|
|
18
|
+
this.validateCountryCodes(invoice);
|
|
19
|
+
// Document type
|
|
20
|
+
this.validateDocumentType(invoice);
|
|
21
|
+
// Tax categories
|
|
22
|
+
this.validateTaxCategories(invoice);
|
|
23
|
+
// Payment means
|
|
24
|
+
this.validatePaymentMeans(invoice);
|
|
25
|
+
// Unit codes
|
|
26
|
+
this.validateUnitCodes(invoice);
|
|
27
|
+
return this.results;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate currency codes (ISO 4217)
|
|
31
|
+
*/
|
|
32
|
+
validateCurrency(invoice) {
|
|
33
|
+
// Document currency (BT-5)
|
|
34
|
+
if (invoice.currency) {
|
|
35
|
+
if (!CodeLists.ISO4217.codes.has(invoice.currency.toUpperCase())) {
|
|
36
|
+
this.addError('BR-CL-03', `Invalid currency code: ${invoice.currency}. Must be ISO 4217`, 'EN16931', 'currency', 'BT-5', invoice.currency, Array.from(CodeLists.ISO4217.codes).join(', '));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// VAT accounting currency (BT-6)
|
|
40
|
+
const vatCurrency = invoice.metadata?.vatAccountingCurrency;
|
|
41
|
+
if (vatCurrency && !CodeLists.ISO4217.codes.has(vatCurrency.toUpperCase())) {
|
|
42
|
+
this.addError('BR-CL-04', `Invalid VAT accounting currency: ${vatCurrency}. Must be ISO 4217`, 'EN16931', 'metadata.vatAccountingCurrency', 'BT-6', vatCurrency, Array.from(CodeLists.ISO4217.codes).join(', '));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate country codes (ISO 3166-1 alpha-2)
|
|
47
|
+
*/
|
|
48
|
+
validateCountryCodes(invoice) {
|
|
49
|
+
// Seller country (BT-40)
|
|
50
|
+
const sellerCountry = invoice.from?.address?.countryCode;
|
|
51
|
+
if (sellerCountry && !CodeLists.ISO3166.codes.has(sellerCountry.toUpperCase())) {
|
|
52
|
+
this.addError('BR-CL-14', `Invalid seller country code: ${sellerCountry}. Must be ISO 3166-1 alpha-2`, 'EN16931', 'from.address.countryCode', 'BT-40', sellerCountry, 'Two-letter country code (e.g., DE, FR, IT)');
|
|
53
|
+
}
|
|
54
|
+
// Buyer country (BT-55)
|
|
55
|
+
const buyerCountry = invoice.to?.address?.countryCode;
|
|
56
|
+
if (buyerCountry && !CodeLists.ISO3166.codes.has(buyerCountry.toUpperCase())) {
|
|
57
|
+
this.addError('BR-CL-15', `Invalid buyer country code: ${buyerCountry}. Must be ISO 3166-1 alpha-2`, 'EN16931', 'to.address.countryCode', 'BT-55', buyerCountry, 'Two-letter country code (e.g., DE, FR, IT)');
|
|
58
|
+
}
|
|
59
|
+
// Delivery country (BT-80)
|
|
60
|
+
const deliveryCountry = invoice.metadata?.deliveryAddress?.countryCode;
|
|
61
|
+
if (deliveryCountry && !CodeLists.ISO3166.codes.has(deliveryCountry.toUpperCase())) {
|
|
62
|
+
this.addError('BR-CL-16', `Invalid delivery country code: ${deliveryCountry}. Must be ISO 3166-1 alpha-2`, 'EN16931', 'metadata.deliveryAddress.countryCode', 'BT-80', deliveryCountry, 'Two-letter country code (e.g., DE, FR, IT)');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate document type code (UNCL1001)
|
|
67
|
+
*/
|
|
68
|
+
validateDocumentType(invoice) {
|
|
69
|
+
const typeCode = invoice.metadata?.documentTypeCode ||
|
|
70
|
+
(invoice.accountingDocType === 'invoice' ? '380' :
|
|
71
|
+
invoice.accountingDocType === 'creditnote' ? '381' :
|
|
72
|
+
invoice.accountingDocType === 'debitnote' ? '383' : null);
|
|
73
|
+
if (typeCode && !CodeLists.UNCL1001.codes.has(typeCode)) {
|
|
74
|
+
this.addError('BR-CL-01', `Invalid document type code: ${typeCode}. Must be UNCL1001`, 'EN16931', 'metadata.documentTypeCode', 'BT-3', typeCode, Array.from(CodeLists.UNCL1001.codes.entries()).map(([k, v]) => `${k} (${v})`).join(', '));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Validate tax category codes (UNCL5305)
|
|
79
|
+
*/
|
|
80
|
+
validateTaxCategories(invoice) {
|
|
81
|
+
// Document level tax breakdown
|
|
82
|
+
// Note: taxBreakdown is a computed property that doesn't have metadata
|
|
83
|
+
// We would need to access the raw tax breakdown data from metadata if it exists
|
|
84
|
+
invoice.taxBreakdown?.forEach((breakdown, index) => {
|
|
85
|
+
// Since the computed taxBreakdown doesn't have metadata,
|
|
86
|
+
// we'll skip the tax category code validation for now
|
|
87
|
+
// This would need to be implemented differently to access the raw data
|
|
88
|
+
// TODO: Access raw tax breakdown data with metadata from invoice.metadata.taxBreakdown
|
|
89
|
+
// when that structure is implemented
|
|
90
|
+
});
|
|
91
|
+
// Line level tax categories
|
|
92
|
+
invoice.items?.forEach((item, index) => {
|
|
93
|
+
// Cast to extended type to access metadata
|
|
94
|
+
const extendedItem = item;
|
|
95
|
+
const categoryCode = extendedItem.metadata?.vatCategoryCode;
|
|
96
|
+
if (categoryCode && !CodeLists.UNCL5305.codes.has(categoryCode)) {
|
|
97
|
+
this.addError('BR-CL-10', `Invalid line tax category: ${categoryCode}. Must be UNCL5305`, 'EN16931', `items[${index}].metadata.vatCategoryCode`, 'BT-151', categoryCode, Array.from(CodeLists.UNCL5305.codes.entries()).map(([k, v]) => `${k} (${v})`).join(', '));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate payment means codes (UNCL4461)
|
|
103
|
+
*/
|
|
104
|
+
validatePaymentMeans(invoice) {
|
|
105
|
+
const paymentMeans = invoice.metadata?.paymentMeansCode;
|
|
106
|
+
if (paymentMeans && !CodeLists.UNCL4461.codes.has(paymentMeans)) {
|
|
107
|
+
this.addError('BR-CL-16', `Invalid payment means code: ${paymentMeans}. Must be UNCL4461`, 'EN16931', 'metadata.paymentMeansCode', 'BT-81', paymentMeans, Array.from(CodeLists.UNCL4461.codes.entries()).map(([k, v]) => `${k} (${v})`).join(', '));
|
|
108
|
+
}
|
|
109
|
+
// Validate payment requirements based on means code
|
|
110
|
+
if (paymentMeans === '30' || paymentMeans === '58') { // Credit transfer
|
|
111
|
+
if (!invoice.metadata?.paymentAccount?.iban) {
|
|
112
|
+
this.addWarning('BR-CL-16-1', `Payment means ${paymentMeans} (${CodeLists.UNCL4461.codes.get(paymentMeans)}) typically requires IBAN`, 'EN16931', 'metadata.paymentAccount.iban', 'BT-84');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Validate unit codes (UNECE Rec 20)
|
|
118
|
+
*/
|
|
119
|
+
validateUnitCodes(invoice) {
|
|
120
|
+
invoice.items?.forEach((item, index) => {
|
|
121
|
+
const unitCode = item.unitType;
|
|
122
|
+
if (unitCode && !CodeLists.UNECERec20.codes.has(unitCode)) {
|
|
123
|
+
this.addError('BR-CL-23', `Invalid unit code: ${unitCode}. Must be UNECE Rec 20`, 'EN16931', `items[${index}].unitCode`, 'BT-130', unitCode, 'Common codes: C62 (one), KGM (kilogram), HUR (hour), DAY (day), MTR (metre)');
|
|
124
|
+
}
|
|
125
|
+
// Validate quantity is positive for standard units
|
|
126
|
+
if (unitCode && item.unitQuantity <= 0 && unitCode !== 'LS') { // LS = Lump sum can be 1
|
|
127
|
+
this.addError('BR-25', `Quantity must be positive for unit ${unitCode}`, 'EN16931', `items[${index}].quantity`, 'BT-129', item.unitQuantity, '> 0');
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add validation error
|
|
133
|
+
*/
|
|
134
|
+
addError(ruleId, message, source, field, btReference, value, expected) {
|
|
135
|
+
this.results.push({
|
|
136
|
+
ruleId,
|
|
137
|
+
source,
|
|
138
|
+
severity: 'error',
|
|
139
|
+
message,
|
|
140
|
+
field,
|
|
141
|
+
btReference,
|
|
142
|
+
value,
|
|
143
|
+
expected,
|
|
144
|
+
codeList: this.getCodeListForRule(ruleId)
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Add validation warning
|
|
149
|
+
*/
|
|
150
|
+
addWarning(ruleId, message, source, field, btReference, value, expected) {
|
|
151
|
+
this.results.push({
|
|
152
|
+
ruleId,
|
|
153
|
+
source,
|
|
154
|
+
severity: 'warning',
|
|
155
|
+
message,
|
|
156
|
+
field,
|
|
157
|
+
btReference,
|
|
158
|
+
value,
|
|
159
|
+
expected,
|
|
160
|
+
codeList: this.getCodeListForRule(ruleId)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get code list metadata for a rule
|
|
165
|
+
*/
|
|
166
|
+
getCodeListForRule(ruleId) {
|
|
167
|
+
if (ruleId.includes('CL-03') || ruleId.includes('CL-04')) {
|
|
168
|
+
return { name: 'ISO4217', version: CodeLists.ISO4217.version };
|
|
169
|
+
}
|
|
170
|
+
if (ruleId.includes('CL-14') || ruleId.includes('CL-15') || ruleId.includes('CL-16')) {
|
|
171
|
+
return { name: 'ISO3166', version: CodeLists.ISO3166.version };
|
|
172
|
+
}
|
|
173
|
+
if (ruleId.includes('CL-01')) {
|
|
174
|
+
return { name: 'UNCL1001', version: CodeLists.UNCL1001.version };
|
|
175
|
+
}
|
|
176
|
+
if (ruleId.includes('CL-10')) {
|
|
177
|
+
return { name: 'UNCL5305', version: CodeLists.UNCL5305.version };
|
|
178
|
+
}
|
|
179
|
+
if (ruleId.includes('CL-16')) {
|
|
180
|
+
return { name: 'UNCL4461', version: CodeLists.UNCL4461.version };
|
|
181
|
+
}
|
|
182
|
+
if (ruleId.includes('CL-23')) {
|
|
183
|
+
return { name: 'UNECERec20', version: CodeLists.UNECERec20.version };
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWxpc3QudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy92YWxpZGF0aW9uL2NvZGVsaXN0LnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLbEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUE5QjtRQUNVLFlBQU8sR0FBdUIsRUFBRSxDQUFDO0lBaVQzQyxDQUFDO0lBL1NDOztPQUVHO0lBQ0ksUUFBUSxDQUFDLE9BQWlCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRWxCLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuQyxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5DLGlCQUFpQjtRQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEMsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuQyxhQUFhO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxPQUFpQjtRQUN4QywyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztn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
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conformance Test Harness for EN16931 Validation
|
|
3
|
+
* Tests validators against official samples and generates coverage reports
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Coverage report for all rules
|
|
7
|
+
*/
|
|
8
|
+
interface CoverageReport {
|
|
9
|
+
totalRules: number;
|
|
10
|
+
coveredRules: number;
|
|
11
|
+
coveragePercentage: number;
|
|
12
|
+
ruleDetails: Map<string, {
|
|
13
|
+
covered: boolean;
|
|
14
|
+
samplesCovering: string[];
|
|
15
|
+
errorCount: number;
|
|
16
|
+
warningCount: number;
|
|
17
|
+
}>;
|
|
18
|
+
uncoveredRules: string[];
|
|
19
|
+
byCategory: {
|
|
20
|
+
document: {
|
|
21
|
+
total: number;
|
|
22
|
+
covered: number;
|
|
23
|
+
};
|
|
24
|
+
calculation: {
|
|
25
|
+
total: number;
|
|
26
|
+
covered: number;
|
|
27
|
+
};
|
|
28
|
+
vat: {
|
|
29
|
+
total: number;
|
|
30
|
+
covered: number;
|
|
31
|
+
};
|
|
32
|
+
lineLevel: {
|
|
33
|
+
total: number;
|
|
34
|
+
covered: number;
|
|
35
|
+
};
|
|
36
|
+
codeLists: {
|
|
37
|
+
total: number;
|
|
38
|
+
covered: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Conformance Test Harness
|
|
44
|
+
*/
|
|
45
|
+
export declare class ConformanceTestHarness {
|
|
46
|
+
private integratedValidator;
|
|
47
|
+
private businessRulesValidator;
|
|
48
|
+
private codeListValidator;
|
|
49
|
+
private vatCategoriesValidator;
|
|
50
|
+
private xmlConverter;
|
|
51
|
+
private testSamples;
|
|
52
|
+
private results;
|
|
53
|
+
constructor();
|
|
54
|
+
/**
|
|
55
|
+
* Load test samples from directory
|
|
56
|
+
*/
|
|
57
|
+
loadTestSamples(baseDir?: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Run all validators against a single test sample
|
|
60
|
+
*/
|
|
61
|
+
private runTestSample;
|
|
62
|
+
/**
|
|
63
|
+
* Run conformance tests on all samples
|
|
64
|
+
*/
|
|
65
|
+
runConformanceTests(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Generate BR coverage matrix
|
|
68
|
+
*/
|
|
69
|
+
generateCoverageMatrix(): CoverageReport;
|
|
70
|
+
/**
|
|
71
|
+
* Print test summary
|
|
72
|
+
*/
|
|
73
|
+
private printSummary;
|
|
74
|
+
/**
|
|
75
|
+
* Generate HTML coverage report
|
|
76
|
+
*/
|
|
77
|
+
generateHTMLReport(outputPath?: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get all EN16931 business rules
|
|
80
|
+
*/
|
|
81
|
+
private getAllEN16931Rules;
|
|
82
|
+
/**
|
|
83
|
+
* Get category for a rule
|
|
84
|
+
*/
|
|
85
|
+
private getRuleCategory;
|
|
86
|
+
/**
|
|
87
|
+
* Get description from filename
|
|
88
|
+
*/
|
|
89
|
+
private getDescriptionFromFilename;
|
|
90
|
+
/**
|
|
91
|
+
* Get focus rules from filename
|
|
92
|
+
*/
|
|
93
|
+
private getFocusRulesFromFilename;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Export convenience function to run conformance tests
|
|
97
|
+
*/
|
|
98
|
+
export declare function runConformanceTests(samplesDir?: string, generateReport?: boolean): Promise<void>;
|
|
99
|
+
export {};
|