@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
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { BaseDecoder } from './base.decoder.js';
|
|
3
|
-
/**
|
|
4
|
-
* A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
|
|
5
|
-
* Converts XML into structured ILetter with invoice data.
|
|
6
|
-
*/
|
|
7
|
-
export declare class FacturXDecoder extends BaseDecoder {
|
|
8
|
-
private xmlDoc;
|
|
9
|
-
constructor(xmlString: string);
|
|
10
|
-
/**
|
|
11
|
-
* Extracts text from the first element matching the tag name
|
|
12
|
-
*/
|
|
13
|
-
private getElementText;
|
|
14
|
-
/**
|
|
15
|
-
* Converts Factur-X/ZUGFeRD XML to a structured letter object
|
|
16
|
-
*/
|
|
17
|
-
getLetterData(): Promise<plugins.tsclass.business.ILetter>;
|
|
18
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import * as xmldom from 'xmldom';
|
|
3
|
-
import { BaseDecoder } from './base.decoder.js';
|
|
4
|
-
/**
|
|
5
|
-
* A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
|
|
6
|
-
* Converts XML into structured ILetter with invoice data.
|
|
7
|
-
*/
|
|
8
|
-
export class FacturXDecoder extends BaseDecoder {
|
|
9
|
-
constructor(xmlString) {
|
|
10
|
-
super(xmlString);
|
|
11
|
-
this.xmlDoc = null;
|
|
12
|
-
// Parse XML to DOM for easier element extraction
|
|
13
|
-
try {
|
|
14
|
-
const parser = new xmldom.DOMParser();
|
|
15
|
-
this.xmlDoc = parser.parseFromString(this.xmlString, 'text/xml');
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
console.error('Error parsing Factur-X XML:', error);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Extracts text from the first element matching the tag name
|
|
23
|
-
*/
|
|
24
|
-
getElementText(tagName) {
|
|
25
|
-
if (!this.xmlDoc) {
|
|
26
|
-
return '';
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
// Basic handling for namespaced tags
|
|
30
|
-
let namespace = '';
|
|
31
|
-
let localName = tagName;
|
|
32
|
-
if (tagName.includes(':')) {
|
|
33
|
-
const parts = tagName.split(':');
|
|
34
|
-
namespace = parts[0];
|
|
35
|
-
localName = parts[1];
|
|
36
|
-
}
|
|
37
|
-
// Find all elements with this name
|
|
38
|
-
const elements = this.xmlDoc.getElementsByTagName(tagName);
|
|
39
|
-
if (elements.length > 0) {
|
|
40
|
-
return elements[0].textContent || '';
|
|
41
|
-
}
|
|
42
|
-
// Try with just the local name if we didn't find it with the namespace
|
|
43
|
-
if (namespace) {
|
|
44
|
-
const elements = this.xmlDoc.getElementsByTagName(localName);
|
|
45
|
-
if (elements.length > 0) {
|
|
46
|
-
return elements[0].textContent || '';
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return '';
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
console.error(`Error extracting element ${tagName}:`, error);
|
|
53
|
-
return '';
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Converts Factur-X/ZUGFeRD XML to a structured letter object
|
|
58
|
-
*/
|
|
59
|
-
async getLetterData() {
|
|
60
|
-
try {
|
|
61
|
-
// Extract invoice ID
|
|
62
|
-
let invoiceId = this.getElementText('ram:ID');
|
|
63
|
-
if (!invoiceId) {
|
|
64
|
-
// Try alternative locations
|
|
65
|
-
invoiceId = this.getElementText('rsm:ExchangedDocument ram:ID') || 'Unknown';
|
|
66
|
-
}
|
|
67
|
-
// Extract seller name
|
|
68
|
-
let sellerName = this.getElementText('ram:Name');
|
|
69
|
-
if (!sellerName) {
|
|
70
|
-
sellerName = this.getElementText('ram:SellerTradeParty ram:Name') || 'Unknown Seller';
|
|
71
|
-
}
|
|
72
|
-
// Extract buyer name
|
|
73
|
-
let buyerName = '';
|
|
74
|
-
// Try to find BuyerTradeParty Name specifically
|
|
75
|
-
if (this.xmlDoc) {
|
|
76
|
-
const buyerParties = this.xmlDoc.getElementsByTagName('ram:BuyerTradeParty');
|
|
77
|
-
if (buyerParties.length > 0) {
|
|
78
|
-
const nameElements = buyerParties[0].getElementsByTagName('ram:Name');
|
|
79
|
-
if (nameElements.length > 0) {
|
|
80
|
-
buyerName = nameElements[0].textContent || '';
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
if (!buyerName) {
|
|
85
|
-
buyerName = 'Unknown Buyer';
|
|
86
|
-
}
|
|
87
|
-
// Create seller
|
|
88
|
-
const seller = {
|
|
89
|
-
name: sellerName,
|
|
90
|
-
type: 'company',
|
|
91
|
-
description: sellerName,
|
|
92
|
-
address: {
|
|
93
|
-
streetName: this.getElementText('ram:LineOne') || 'Unknown',
|
|
94
|
-
houseNumber: '0', // Required by IAddress interface
|
|
95
|
-
city: this.getElementText('ram:CityName') || 'Unknown',
|
|
96
|
-
country: this.getElementText('ram:CountryID') || 'Unknown',
|
|
97
|
-
postalCode: this.getElementText('ram:PostcodeCode') || 'Unknown',
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
// Create buyer
|
|
101
|
-
const buyer = {
|
|
102
|
-
name: buyerName,
|
|
103
|
-
type: 'company',
|
|
104
|
-
description: buyerName,
|
|
105
|
-
address: {
|
|
106
|
-
streetName: 'Unknown',
|
|
107
|
-
houseNumber: '0',
|
|
108
|
-
city: 'Unknown',
|
|
109
|
-
country: 'Unknown',
|
|
110
|
-
postalCode: 'Unknown',
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
// Extract invoice type
|
|
114
|
-
let invoiceType = 'debitnote';
|
|
115
|
-
const typeCode = this.getElementText('ram:TypeCode');
|
|
116
|
-
if (typeCode === '381') {
|
|
117
|
-
invoiceType = 'creditnote';
|
|
118
|
-
}
|
|
119
|
-
// Create invoice data
|
|
120
|
-
const invoiceData = {
|
|
121
|
-
id: invoiceId,
|
|
122
|
-
status: null,
|
|
123
|
-
type: invoiceType,
|
|
124
|
-
billedBy: seller,
|
|
125
|
-
billedTo: buyer,
|
|
126
|
-
deliveryDate: Date.now(),
|
|
127
|
-
dueInDays: 30,
|
|
128
|
-
periodOfPerformance: null,
|
|
129
|
-
printResult: null,
|
|
130
|
-
currency: (this.getElementText('ram:InvoiceCurrencyCode') || 'EUR'),
|
|
131
|
-
notes: [],
|
|
132
|
-
items: [
|
|
133
|
-
{
|
|
134
|
-
name: 'Item from Factur-X XML',
|
|
135
|
-
unitQuantity: 1,
|
|
136
|
-
unitNetPrice: 0,
|
|
137
|
-
vatPercentage: 0,
|
|
138
|
-
position: 0,
|
|
139
|
-
unitType: 'units',
|
|
140
|
-
}
|
|
141
|
-
],
|
|
142
|
-
reverseCharge: false,
|
|
143
|
-
};
|
|
144
|
-
// Return a letter
|
|
145
|
-
return {
|
|
146
|
-
versionInfo: {
|
|
147
|
-
type: 'draft',
|
|
148
|
-
version: '1.0.0',
|
|
149
|
-
},
|
|
150
|
-
type: 'invoice',
|
|
151
|
-
date: Date.now(),
|
|
152
|
-
subject: `Invoice: ${invoiceId}`,
|
|
153
|
-
from: seller,
|
|
154
|
-
to: buyer,
|
|
155
|
-
content: {
|
|
156
|
-
invoiceData: invoiceData,
|
|
157
|
-
textData: null,
|
|
158
|
-
timesheetData: null,
|
|
159
|
-
contractData: null,
|
|
160
|
-
},
|
|
161
|
-
needsCoverSheet: false,
|
|
162
|
-
objectActions: [],
|
|
163
|
-
pdf: null,
|
|
164
|
-
incidenceId: null,
|
|
165
|
-
language: null,
|
|
166
|
-
legalContact: null,
|
|
167
|
-
logoUrl: null,
|
|
168
|
-
pdfAttachments: null,
|
|
169
|
-
accentColor: null,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
console.error('Error converting Factur-X XML to letter data:', error);
|
|
174
|
-
return this.createDefaultLetter();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeC5kZWNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3J4LmRlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsV0FBVztJQUc3QyxZQUFZLFNBQWlCO1FBQzNCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUhYLFdBQU0sR0FBb0IsSUFBSSxDQUFDO1FBS3JDLGlEQUFpRDtRQUNqRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gscUNBQXFDO1lBQ3JDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFeEIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8s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
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* A class to convert a given ILetter with invoice data
|
|
4
|
-
* into a Factur-X compliant XML (also compatible with ZUGFeRD and EN16931).
|
|
5
|
-
*
|
|
6
|
-
* Factur-X is the French implementation of the European e-invoicing standard EN16931,
|
|
7
|
-
* which is also implemented in Germany as ZUGFeRD. Both formats are based on
|
|
8
|
-
* UN/CEFACT Cross Industry Invoice (CII) XML schemas.
|
|
9
|
-
*/
|
|
10
|
-
export declare class FacturXEncoder {
|
|
11
|
-
constructor();
|
|
12
|
-
/**
|
|
13
|
-
* Alias for createFacturXXml to maintain backward compatibility
|
|
14
|
-
*/
|
|
15
|
-
createZugferdXml(letterArg: plugins.tsclass.business.ILetter): string;
|
|
16
|
-
/**
|
|
17
|
-
* Creates a Factur-X compliant XML based on the provided letter data.
|
|
18
|
-
* This XML is also compliant with ZUGFeRD and EN16931 standards.
|
|
19
|
-
*/
|
|
20
|
-
createFacturXXml(letterArg: plugins.tsclass.business.ILetter): string;
|
|
21
|
-
/**
|
|
22
|
-
* Helper: Determine if the letter is in draft or final.
|
|
23
|
-
*/
|
|
24
|
-
private isDraft;
|
|
25
|
-
/**
|
|
26
|
-
* Helper: Format date to certain patterns (very minimal example).
|
|
27
|
-
* e.g. 'yyyyMMdd' => '20231231'
|
|
28
|
-
*/
|
|
29
|
-
private formatDate;
|
|
30
|
-
/**
|
|
31
|
-
* Helper: Map your custom 'unitType' to an ISO code or similar.
|
|
32
|
-
*/
|
|
33
|
-
private mapUnitType;
|
|
34
|
-
/**
|
|
35
|
-
* Example: Sum all VAT amounts from items.
|
|
36
|
-
*/
|
|
37
|
-
private sumAllVat;
|
|
38
|
-
/**
|
|
39
|
-
* Example: Extract main (or highest) VAT rate from items as representative.
|
|
40
|
-
* In reality, you might list multiple 'ApplicableTradeTax' blocks by group.
|
|
41
|
-
*/
|
|
42
|
-
private extractMainVatRate;
|
|
43
|
-
/**
|
|
44
|
-
* Example: Sum net amounts (without VAT).
|
|
45
|
-
*/
|
|
46
|
-
private calcLineTotalNet;
|
|
47
|
-
/**
|
|
48
|
-
* Example: net + VAT = grand total
|
|
49
|
-
*/
|
|
50
|
-
private calcGrandTotal;
|
|
51
|
-
}
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* A class to convert a given ILetter with invoice data
|
|
4
|
-
* into a Factur-X compliant XML (also compatible with ZUGFeRD and EN16931).
|
|
5
|
-
*
|
|
6
|
-
* Factur-X is the French implementation of the European e-invoicing standard EN16931,
|
|
7
|
-
* which is also implemented in Germany as ZUGFeRD. Both formats are based on
|
|
8
|
-
* UN/CEFACT Cross Industry Invoice (CII) XML schemas.
|
|
9
|
-
*/
|
|
10
|
-
export class FacturXEncoder {
|
|
11
|
-
constructor() { }
|
|
12
|
-
/**
|
|
13
|
-
* Alias for createFacturXXml to maintain backward compatibility
|
|
14
|
-
*/
|
|
15
|
-
createZugferdXml(letterArg) {
|
|
16
|
-
return this.createFacturXXml(letterArg);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Creates a Factur-X compliant XML based on the provided letter data.
|
|
20
|
-
* This XML is also compliant with ZUGFeRD and EN16931 standards.
|
|
21
|
-
*/
|
|
22
|
-
createFacturXXml(letterArg) {
|
|
23
|
-
// 1) Get your "SmartXml" or "xmlbuilder2" instance
|
|
24
|
-
const smartxmlInstance = new plugins.smartxml.SmartXml();
|
|
25
|
-
if (!letterArg?.content?.invoiceData) {
|
|
26
|
-
throw new Error('Letter does not contain invoice data.');
|
|
27
|
-
}
|
|
28
|
-
const invoice = letterArg.content.invoiceData;
|
|
29
|
-
const billedBy = invoice.billedBy;
|
|
30
|
-
const billedTo = invoice.billedTo;
|
|
31
|
-
// 2) Start building the document
|
|
32
|
-
const doc = smartxmlInstance
|
|
33
|
-
.create({ version: '1.0', encoding: 'UTF-8' })
|
|
34
|
-
.ele('rsm:CrossIndustryInvoice', {
|
|
35
|
-
'xmlns:rsm': 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100',
|
|
36
|
-
'xmlns:udt': 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100',
|
|
37
|
-
'xmlns:qdt': 'urn:un:unece:uncefact:data:standard:QualifiedDataType:100',
|
|
38
|
-
'xmlns:ram': 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'
|
|
39
|
-
});
|
|
40
|
-
// 3) Exchanged Document Context
|
|
41
|
-
const docContext = doc.ele('rsm:ExchangedDocumentContext');
|
|
42
|
-
// Add test indicator
|
|
43
|
-
docContext.ele('ram:TestIndicator')
|
|
44
|
-
.ele('udt:Indicator')
|
|
45
|
-
.txt(this.isDraft(letterArg) ? 'true' : 'false')
|
|
46
|
-
.up()
|
|
47
|
-
.up();
|
|
48
|
-
// Add Factur-X profile information
|
|
49
|
-
// EN16931 profile is compliant with both Factur-X and ZUGFeRD
|
|
50
|
-
docContext.ele('ram:GuidelineSpecifiedDocumentContextParameter')
|
|
51
|
-
.ele('ram:ID')
|
|
52
|
-
.txt('urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:en16931')
|
|
53
|
-
.up()
|
|
54
|
-
.up();
|
|
55
|
-
docContext.up(); // </rsm:ExchangedDocumentContext>
|
|
56
|
-
// 4) Exchanged Document (Invoice Header Info)
|
|
57
|
-
const exchangedDoc = doc.ele('rsm:ExchangedDocument');
|
|
58
|
-
// Invoice ID
|
|
59
|
-
exchangedDoc.ele('ram:ID').txt(invoice.id).up();
|
|
60
|
-
// Document type code
|
|
61
|
-
// 380 = commercial invoice, 381 = credit note
|
|
62
|
-
const documentTypeCode = invoice.type === 'creditnote' ? '381' : '380';
|
|
63
|
-
exchangedDoc.ele('ram:TypeCode').txt(documentTypeCode).up();
|
|
64
|
-
// Issue date
|
|
65
|
-
exchangedDoc
|
|
66
|
-
.ele('ram:IssueDateTime')
|
|
67
|
-
.ele('udt:DateTimeString', { format: '102' })
|
|
68
|
-
// Format 'YYYYMMDD' as per Factur-X specification
|
|
69
|
-
.txt(this.formatDate(letterArg.date))
|
|
70
|
-
.up()
|
|
71
|
-
.up();
|
|
72
|
-
// Document name - Factur-X recommended field
|
|
73
|
-
const documentName = invoice.type === 'creditnote' ? 'CREDIT NOTE' : 'INVOICE';
|
|
74
|
-
exchangedDoc.ele('ram:Name').txt(documentName).up();
|
|
75
|
-
// Optional: Add language indicator (recommended for Factur-X)
|
|
76
|
-
// Use document language if specified, default to 'en'
|
|
77
|
-
const languageCode = letterArg.language?.toUpperCase() || 'EN';
|
|
78
|
-
exchangedDoc
|
|
79
|
-
.ele('ram:IncludedNote')
|
|
80
|
-
.ele('ram:Content').txt('Invoice created with Factur-X compliant software').up()
|
|
81
|
-
.ele('ram:SubjectCode').txt('REG').up() // REG = regulatory information
|
|
82
|
-
.up();
|
|
83
|
-
exchangedDoc.up(); // </rsm:ExchangedDocument>
|
|
84
|
-
// 5) Supply Chain Trade Transaction
|
|
85
|
-
const supplyChainEle = doc.ele('rsm:SupplyChainTradeTransaction');
|
|
86
|
-
// 5.1) Included Supply Chain Trade Line Items
|
|
87
|
-
invoice.items.forEach((item) => {
|
|
88
|
-
const lineItemEle = supplyChainEle.ele('ram:IncludedSupplyChainTradeLineItem');
|
|
89
|
-
lineItemEle.ele('ram:SpecifiedTradeProduct')
|
|
90
|
-
.ele('ram:Name')
|
|
91
|
-
.txt(item.name)
|
|
92
|
-
.up()
|
|
93
|
-
.up(); // </ram:SpecifiedTradeProduct>
|
|
94
|
-
lineItemEle.ele('ram:SpecifiedLineTradeAgreement')
|
|
95
|
-
.ele('ram:GrossPriceProductTradePrice')
|
|
96
|
-
.ele('ram:ChargeAmount')
|
|
97
|
-
.txt(item.unitNetPrice.toFixed(2))
|
|
98
|
-
.up()
|
|
99
|
-
.up()
|
|
100
|
-
.up(); // </ram:SpecifiedLineTradeAgreement>
|
|
101
|
-
lineItemEle.ele('ram:SpecifiedLineTradeDelivery')
|
|
102
|
-
.ele('ram:BilledQuantity')
|
|
103
|
-
.txt(item.unitQuantity.toString())
|
|
104
|
-
.up()
|
|
105
|
-
.up(); // </ram:SpecifiedLineTradeDelivery>
|
|
106
|
-
lineItemEle.ele('ram:SpecifiedLineTradeSettlement')
|
|
107
|
-
.ele('ram:ApplicableTradeTax')
|
|
108
|
-
.ele('ram:RateApplicablePercent')
|
|
109
|
-
.txt(item.vatPercentage.toFixed(2))
|
|
110
|
-
.up()
|
|
111
|
-
.up()
|
|
112
|
-
.ele('ram:SpecifiedTradeSettlementLineMonetarySummation')
|
|
113
|
-
.ele('ram:LineTotalAmount')
|
|
114
|
-
.txt((item.unitQuantity *
|
|
115
|
-
item.unitNetPrice *
|
|
116
|
-
(1 + item.vatPercentage / 100)).toFixed(2))
|
|
117
|
-
.up()
|
|
118
|
-
.up()
|
|
119
|
-
.up(); // </ram:SpecifiedLineTradeSettlement>
|
|
120
|
-
});
|
|
121
|
-
// 5.2) Applicable Header Trade Agreement
|
|
122
|
-
const headerTradeAgreementEle = supplyChainEle.ele('ram:ApplicableHeaderTradeAgreement');
|
|
123
|
-
// Seller
|
|
124
|
-
const sellerPartyEle = headerTradeAgreementEle.ele('ram:SellerTradeParty');
|
|
125
|
-
sellerPartyEle.ele('ram:Name').txt(billedBy.name).up();
|
|
126
|
-
// Example: If it's a company, put company name, etc.
|
|
127
|
-
const sellerAddressEle = sellerPartyEle.ele('ram:PostalTradeAddress');
|
|
128
|
-
sellerAddressEle.ele('ram:PostcodeCode').txt(billedBy.address.postalCode).up();
|
|
129
|
-
sellerAddressEle.ele('ram:LineOne').txt(billedBy.address.streetName).up();
|
|
130
|
-
sellerAddressEle.ele('ram:CityName').txt(billedBy.address.city).up();
|
|
131
|
-
// Typically you'd include 'ram:CountryID' with ISO2 code, e.g. "DE"
|
|
132
|
-
sellerAddressEle.up(); // </ram:PostalTradeAddress>
|
|
133
|
-
sellerPartyEle.up(); // </ram:SellerTradeParty>
|
|
134
|
-
// Buyer
|
|
135
|
-
const buyerPartyEle = headerTradeAgreementEle.ele('ram:BuyerTradeParty');
|
|
136
|
-
buyerPartyEle.ele('ram:Name').txt(billedTo.name).up();
|
|
137
|
-
const buyerAddressEle = buyerPartyEle.ele('ram:PostalTradeAddress');
|
|
138
|
-
buyerAddressEle.ele('ram:PostcodeCode').txt(billedTo.address.postalCode).up();
|
|
139
|
-
buyerAddressEle.ele('ram:LineOne').txt(billedTo.address.streetName).up();
|
|
140
|
-
buyerAddressEle.ele('ram:CityName').txt(billedTo.address.city).up();
|
|
141
|
-
buyerAddressEle.up(); // </ram:PostalTradeAddress>
|
|
142
|
-
buyerPartyEle.up(); // </ram:BuyerTradeParty>
|
|
143
|
-
headerTradeAgreementEle.up(); // </ram:ApplicableHeaderTradeAgreement>
|
|
144
|
-
// 5.3) Applicable Header Trade Delivery
|
|
145
|
-
const headerTradeDeliveryEle = supplyChainEle.ele('ram:ApplicableHeaderTradeDelivery');
|
|
146
|
-
const actualDeliveryEle = headerTradeDeliveryEle.ele('ram:ActualDeliverySupplyChainEvent');
|
|
147
|
-
const occurrenceEle = actualDeliveryEle.ele('ram:OccurrenceDateTime')
|
|
148
|
-
.ele('udt:DateTimeString', { format: '102' });
|
|
149
|
-
const deliveryDate = invoice.deliveryDate || letterArg.date;
|
|
150
|
-
occurrenceEle.txt(this.formatDate(deliveryDate)).up();
|
|
151
|
-
actualDeliveryEle.up(); // </ram:ActualDeliverySupplyChainEvent>
|
|
152
|
-
headerTradeDeliveryEle.up(); // </ram:ApplicableHeaderTradeDelivery>
|
|
153
|
-
// 5.4) Applicable Header Trade Settlement
|
|
154
|
-
const headerTradeSettlementEle = supplyChainEle.ele('ram:ApplicableHeaderTradeSettlement');
|
|
155
|
-
// Tax currency code, doc currency code, etc.
|
|
156
|
-
headerTradeSettlementEle.ele('ram:InvoiceCurrencyCode').txt(invoice.currency).up();
|
|
157
|
-
// Example single tax breakdown
|
|
158
|
-
const tradeTaxEle = headerTradeSettlementEle.ele('ram:ApplicableTradeTax');
|
|
159
|
-
tradeTaxEle.ele('ram:TypeCode').txt('VAT').up();
|
|
160
|
-
tradeTaxEle.ele('ram:CalculatedAmount').txt(this.sumAllVat(invoice).toFixed(2)).up();
|
|
161
|
-
tradeTaxEle
|
|
162
|
-
.ele('ram:RateApplicablePercent')
|
|
163
|
-
.txt(this.extractMainVatRate(invoice.items).toFixed(2))
|
|
164
|
-
.up();
|
|
165
|
-
tradeTaxEle.up(); // </ram:ApplicableTradeTax>
|
|
166
|
-
// Payment Terms
|
|
167
|
-
const paymentTermsEle = headerTradeSettlementEle.ele('ram:SpecifiedTradePaymentTerms');
|
|
168
|
-
// Payment description
|
|
169
|
-
paymentTermsEle.ele('ram:Description').txt(`Payment due in ${invoice.dueInDays} days.`).up();
|
|
170
|
-
// Due date calculation
|
|
171
|
-
const dueDate = new Date(letterArg.date);
|
|
172
|
-
dueDate.setDate(dueDate.getDate() + invoice.dueInDays);
|
|
173
|
-
// Add due date as per Factur-X spec
|
|
174
|
-
paymentTermsEle
|
|
175
|
-
.ele('ram:DueDateDateTime')
|
|
176
|
-
.ele('udt:DateTimeString', { format: '102' })
|
|
177
|
-
.txt(this.formatDate(dueDate.getTime()))
|
|
178
|
-
.up()
|
|
179
|
-
.up();
|
|
180
|
-
// Add payment means if available
|
|
181
|
-
if (invoice.billedBy.sepaConnection) {
|
|
182
|
-
// Add SEPA information as per Factur-X standard
|
|
183
|
-
const paymentMeans = headerTradeSettlementEle.ele('ram:SpecifiedTradeSettlementPaymentMeans');
|
|
184
|
-
paymentMeans.ele('ram:TypeCode').txt('58').up(); // 58 = SEPA credit transfer
|
|
185
|
-
// Payment reference (for bank statement reconciliation)
|
|
186
|
-
paymentMeans.ele('ram:Information').txt(`Reference: ${invoice.id}`).up();
|
|
187
|
-
// Payee account (IBAN)
|
|
188
|
-
if (invoice.billedBy.sepaConnection.iban) {
|
|
189
|
-
const payeeAccount = paymentMeans.ele('ram:PayeePartyCreditorFinancialAccount');
|
|
190
|
-
payeeAccount.ele('ram:IBANID').txt(invoice.billedBy.sepaConnection.iban).up();
|
|
191
|
-
payeeAccount.up();
|
|
192
|
-
}
|
|
193
|
-
// Bank BIC
|
|
194
|
-
if (invoice.billedBy.sepaConnection.bic) {
|
|
195
|
-
const payeeBank = paymentMeans.ele('ram:PayeeSpecifiedCreditorFinancialInstitution');
|
|
196
|
-
payeeBank.ele('ram:BICID').txt(invoice.billedBy.sepaConnection.bic).up();
|
|
197
|
-
payeeBank.up();
|
|
198
|
-
}
|
|
199
|
-
paymentMeans.up();
|
|
200
|
-
}
|
|
201
|
-
paymentTermsEle.up(); // </ram:SpecifiedTradePaymentTerms>
|
|
202
|
-
// Monetary Summation
|
|
203
|
-
const monetarySummationEle = headerTradeSettlementEle.ele('ram:SpecifiedTradeSettlementHeaderMonetarySummation');
|
|
204
|
-
monetarySummationEle
|
|
205
|
-
.ele('ram:LineTotalAmount')
|
|
206
|
-
.txt(this.calcLineTotalNet(invoice).toFixed(2))
|
|
207
|
-
.up();
|
|
208
|
-
monetarySummationEle
|
|
209
|
-
.ele('ram:TaxTotalAmount')
|
|
210
|
-
.txt(this.sumAllVat(invoice).toFixed(2))
|
|
211
|
-
.up();
|
|
212
|
-
monetarySummationEle
|
|
213
|
-
.ele('ram:GrandTotalAmount')
|
|
214
|
-
.txt(this.calcGrandTotal(invoice).toFixed(2))
|
|
215
|
-
.up();
|
|
216
|
-
monetarySummationEle.up(); // </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
|
|
217
|
-
headerTradeSettlementEle.up(); // </ram:ApplicableHeaderTradeSettlement>
|
|
218
|
-
supplyChainEle.up(); // </rsm:SupplyChainTradeTransaction>
|
|
219
|
-
doc.up(); // </rsm:CrossIndustryInvoice>
|
|
220
|
-
// 6) Return the final XML string
|
|
221
|
-
return doc.end({ prettyPrint: true });
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Helper: Determine if the letter is in draft or final.
|
|
225
|
-
*/
|
|
226
|
-
isDraft(letterArg) {
|
|
227
|
-
return letterArg.versionInfo?.type === 'draft';
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Helper: Format date to certain patterns (very minimal example).
|
|
231
|
-
* e.g. 'yyyyMMdd' => '20231231'
|
|
232
|
-
*/
|
|
233
|
-
formatDate(timestampMs) {
|
|
234
|
-
const date = new Date(timestampMs);
|
|
235
|
-
const yyyy = date.getFullYear();
|
|
236
|
-
const mm = String(date.getMonth() + 1).padStart(2, '0');
|
|
237
|
-
const dd = String(date.getDate()).padStart(2, '0');
|
|
238
|
-
return `${yyyy}${mm}${dd}`;
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Helper: Map your custom 'unitType' to an ISO code or similar.
|
|
242
|
-
*/
|
|
243
|
-
mapUnitType(unitType) {
|
|
244
|
-
switch (unitType.toLowerCase()) {
|
|
245
|
-
case 'hour':
|
|
246
|
-
return 'HUR';
|
|
247
|
-
case 'piece':
|
|
248
|
-
return 'C62';
|
|
249
|
-
default:
|
|
250
|
-
return 'C62'; // fallback
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Example: Sum all VAT amounts from items.
|
|
255
|
-
*/
|
|
256
|
-
sumAllVat(invoice) {
|
|
257
|
-
return invoice.items.reduce((acc, item) => {
|
|
258
|
-
const net = item.unitNetPrice * item.unitQuantity;
|
|
259
|
-
const vat = net * (item.vatPercentage / 100);
|
|
260
|
-
return acc + vat;
|
|
261
|
-
}, 0);
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Example: Extract main (or highest) VAT rate from items as representative.
|
|
265
|
-
* In reality, you might list multiple 'ApplicableTradeTax' blocks by group.
|
|
266
|
-
*/
|
|
267
|
-
extractMainVatRate(items) {
|
|
268
|
-
let max = 0;
|
|
269
|
-
items.forEach((item) => {
|
|
270
|
-
if (item.vatPercentage > max)
|
|
271
|
-
max = item.vatPercentage;
|
|
272
|
-
});
|
|
273
|
-
return max;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Example: Sum net amounts (without VAT).
|
|
277
|
-
*/
|
|
278
|
-
calcLineTotalNet(invoice) {
|
|
279
|
-
return invoice.items.reduce((acc, item) => {
|
|
280
|
-
const net = item.unitNetPrice * item.unitQuantity;
|
|
281
|
-
return acc + net;
|
|
282
|
-
}, 0);
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Example: net + VAT = grand total
|
|
286
|
-
*/
|
|
287
|
-
calcGrandTotal(invoice) {
|
|
288
|
-
const net = this.calcLineTotalNet(invoice);
|
|
289
|
-
const vat = this.sumAllVat(invoice);
|
|
290
|
-
return net + vat;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeC5lbmNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3J4LmVuY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBRXpCLGdCQUFlLENBQUM7SUFFaEI7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxTQUEyQztRQUNqRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0JBQWdCLENBQUMsU0FBMkM7UUFDakUsbURBQW1EO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQXFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXJFLGlDQUFpQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0I7YUFDekIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDN0MsR0FBRyxDQUFDLDBCQUEwQixFQUFFO1lBQy9CLFdBQVcsRUFBRSw4REFBOEQ7WUFDM0UsV0FBVyxFQUFFLDZEQUE2RDtZQUMxRSxXQUFXLEVBQUUsMkRBQTJEO1lBQ3hFLFdBQVcsRUFBRSxvRkFBb0Y7U0FDbEcsQ0FBQyxDQUFDO1FBRUwsZ0NBQWdDO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUUzRCxxQkFBcUI7UUFDckIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQzthQUNoQyxHQUFHLENBQUMsZUFBZSxDQUFDO2FBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUNqRCxFQUFFLEVBQUU7YUFDTixFQUFFLEVBQUUsQ0FBQztRQUVOLG1DQUFtQztRQUNuQyw4REFBOEQ7UUFDOUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQzthQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDO2FBQ1gsR0FBRyxDQUFDLCtEQUErRCxDQUFDO2FBQ3RFLEVBQUUsRUFBRTthQUNOLEVBQUUsRUFBRSxDQUFDO1FBRU4sVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsa0NBQWtDO1FBRW5ELDhDQUE4QztRQUM5QyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFdEQsYUFBYTtRQUNiLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUVoRCxxQkFBcUI7UUFDckIsOENBQThDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3ZFLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFNUQsYUFBYTtRQUNiLFlBQVk7YUFDVCxHQUFHLENBQUMsbUJBQW1CLENBQUM7YUFDdEIsR0FBRyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzNDLGtEQUFrRDthQUNqRCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDdEMsRUFBRSxFQUFFO2FBQ04sRUFBRSxFQUFFLENBQUM7UUFFUiw2Q0FBNkM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXBELDhEQUE4RDtRQUM5RCxzREFBc0Q7UUFDdEQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFDL0QsWUFBWTthQUNULEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzthQUNyQixHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUMsRUFBRSxFQUFFO2FBQy9FLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQywrQkFBK0I7YUFDeEUsRUFBRSxFQUFFLENBQUM7UUFFUixZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQywyQkFBMkI7UUFFOUMsb0NBQW9DO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUVsRSw4Q0FBOEM7UUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFFL0UsV0FBVyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQztpQkFDekMsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDZixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDZCxFQUFFLEVBQUU7aUJBQ04sRUFBRSxFQUFFLENBQUMsQ0FBQywrQkFBK0I7WUFFdEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQztpQkFDL0MsR0FBRyxDQUFDLGlDQUFpQyxDQUFDO2lCQUNwQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7aUJBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDakMsRUFBRSxFQUFFO2lCQUNOLEVBQUUsRUFBRTtpQkFDTixFQUFFLEVBQUUsQ0FBQyxDQUFDLHFDQUFxQztZQUU1QyxXQUFXLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QyxHQUFHLENBQUMsb0JBQW9CLENBQUM7aUJBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNqQyxFQUFFLEVBQUU7aUJBQ04sRUFBRSxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7WUFFM0MsV0FBVyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQztpQkFDaEQsR0FBRyxDQUFDLHdCQUF3QixDQUFDO2lCQUMzQixHQUFHLENBQUMsMkJBQTJCLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEMsRUFBRSxFQUFFO2lCQUNOLEVBQUUsRUFBRTtpQkFDSixHQUFHLENBQUMsbURBQW1ELENBQUM7aUJBQ3RELEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDMUIsR0FBRyxDQUNGLENBQ0UsSUFBSSxDQUFDLFlBQVk7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZO2dCQUNqQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUMvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDYjtpQkFDQSxFQUFFLEVBQUU7aUJBQ04sRUFBRSxFQUFFO2lCQUNOLEVBQUUsRUFBRSxDQUFDLENBQUMsc0NBQXNDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBRUgseUNBQXlDO1FBQ3pDLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3pGLFNBQVM7UUFDVCxNQUFNLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMzRSxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkQscURBQXFEO1FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3RFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9FLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckUsb0VBQW9FO1FBQ3BFLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO1FBQ25ELGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQjtRQUUvQyxRQUFRO1FBQ1IsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwRSxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6RSxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtRQUNsRCxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7UUFDN0MsdUJBQXVCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyx3Q0FBd0M7UUFFdEUsd0NBQXdDO1FBQ3hDLE1BQU0sc0JBQXNCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0saUJBQWlCLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDM0YsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDO2FBQ2xFLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRWhELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztRQUM1RCxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0RCxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztRQUNoRSxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUVwRSwwQ0FBMEM7UUFDMUMsTUFBTSx3QkFBd0IsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0YsNkNBQTZDO1FBQzdDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFbkYsK0JBQStCO1FBQy9CLE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hELFdBQVcsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyRixXQUFXO2FBQ1IsR0FBRyxDQUFDLDJCQUEyQixDQUFDO2FBQ2hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RCxFQUFFLEVBQUUsQ0FBQztRQUNSLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtRQUU5QyxnQkFBZ0I7UUFDaEIsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFdkYsc0JBQXNCO1FBQ3RCLGVBQWUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLE9BQU8sQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRTdGLHVCQUF1QjtRQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZELG9DQUFvQztRQUNwQyxlQUFlO2FBQ1osR0FBRyxDQUFDLHFCQUFxQixDQUFDO2FBQ3hCLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUN6QyxFQUFFLEVBQUU7YUFDTixFQUFFLEVBQUUsQ0FBQztRQUVSLGlDQUFpQztRQUNqQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEMsZ0RBQWdEO1lBQ2hELE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzlGLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO1lBRTdFLHdEQUF3RDtZQUN4RCxZQUFZLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFFekUsdUJBQXVCO1lBQ3ZCLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztnQkFDaEYsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQixDQUFDO1lBRUQsV0FBVztZQUNYLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsZ0RBQWdELENBQUMsQ0FBQztnQkFDckYsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixDQUFDO1lBRUQsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxlQUFlLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7UUFFMUQscUJBQXFCO1FBQ3JCLE1BQU0sb0JBQW9CLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDakgsb0JBQW9CO2FBQ2pCLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQzthQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5QyxFQUFFLEVBQUUsQ0FBQztRQUNSLG9CQUFvQjthQUNqQixHQUFHLENBQUMsb0JBQW9CLENBQUM7YUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZDLEVBQUUsRUFBRSxDQUFDO1FBQ1Isb0JBQW9CO2FBQ2pCLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQzthQUMzQixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUMsRUFBRSxFQUFFLENBQUM7UUFDUixvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlEQUF5RDtRQUNwRix3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLHlDQUF5QztRQUV4RSxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxxQ0FBcUM7UUFDMUQsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsOEJBQThCO1FBRXhDLGlDQUFpQztRQUNqQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxPQUFPLENBQUMsU0FBMkM7UUFDekQsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxPQUFPLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVUsQ0FBQyxXQUFtQjtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxRQUFnQjtRQUNsQyxRQUFRLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQy9CLEtBQUssTUFBTTtnQkFDVCxPQUFPLEtBQUssQ0FBQztZQUNmLEtBQUssT0FBTztnQkFDVixPQUFPLEtBQUssQ0FBQztZQUNmO2dCQUNFLE9BQU8sS0FBSyxDQUFDLENBQUMsV0FBVztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxDQUFDLE9BQXlDO1FBQ3pELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2xELE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDN0MsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ25CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0IsQ0FBQyxLQUE2QztRQUN0RSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUc7Z0JBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLE9BQXlDO1FBQ2hFLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2xELE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNuQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsT0FBeUM7UUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7Q0FDRiJ9
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { BaseDecoder } from './base.decoder.js';
|
|
3
|
-
/**
|
|
4
|
-
* A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
|
|
5
|
-
* Converts XML into structured ILetter with invoice data.
|
|
6
|
-
*/
|
|
7
|
-
export declare class FacturXDecoder extends BaseDecoder {
|
|
8
|
-
private xmlDoc;
|
|
9
|
-
constructor(xmlString: string);
|
|
10
|
-
/**
|
|
11
|
-
* Extracts text from the first element matching the tag name
|
|
12
|
-
*/
|
|
13
|
-
private getElementText;
|
|
14
|
-
/**
|
|
15
|
-
* Converts Factur-X/ZUGFeRD XML to a structured letter object
|
|
16
|
-
*/
|
|
17
|
-
getLetterData(): Promise<plugins.tsclass.business.ILetter>;
|
|
18
|
-
}
|