@fin.cx/einvoice 5.0.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.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.decoder.d.ts +40 -0
- package/dist_ts/classes.decoder.js +320 -0
- package/dist_ts/classes.encoder.d.ts +51 -0
- package/dist_ts/classes.encoder.js +293 -0
- package/dist_ts/classes.xinvoice.d.ts +136 -0
- package/dist_ts/classes.xinvoice.js +352 -0
- package/dist_ts/einvoice.d.ts +217 -0
- package/dist_ts/einvoice.js +505 -0
- package/dist_ts/errors.d.ts +121 -0
- package/dist_ts/errors.js +241 -0
- package/dist_ts/formats/base/base.decoder.d.ts +32 -0
- package/dist_ts/formats/base/base.decoder.js +52 -0
- package/dist_ts/formats/base/base.encoder.d.ts +13 -0
- package/dist_ts/formats/base/base.encoder.js +7 -0
- package/dist_ts/formats/base/base.validator.d.ts +44 -0
- package/dist_ts/formats/base/base.validator.js +39 -0
- package/dist_ts/formats/base.decoder.d.ts +19 -0
- package/dist_ts/formats/base.decoder.js +130 -0
- package/dist_ts/formats/base.validator.d.ts +44 -0
- package/dist_ts/formats/base.validator.js +39 -0
- package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
- package/dist_ts/formats/cii/cii.decoder.js +111 -0
- package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
- package/dist_ts/formats/cii/cii.encoder.js +48 -0
- package/dist_ts/formats/cii/cii.types.d.ts +31 -0
- package/dist_ts/formats/cii/cii.types.js +40 -0
- package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
- package/dist_ts/formats/cii/cii.validator.js +146 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
- package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
- package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
- package/dist_ts/formats/decoder.factory.d.ts +15 -0
- package/dist_ts/formats/decoder.factory.js +46 -0
- package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
- package/dist_ts/formats/factories/decoder.factory.js +56 -0
- package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
- package/dist_ts/formats/factories/encoder.factory.js +40 -0
- package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
- package/dist_ts/formats/factories/validator.factory.js +110 -0
- package/dist_ts/formats/factorx.decoder.d.ts +18 -0
- package/dist_ts/formats/factorx.decoder.js +178 -0
- package/dist_ts/formats/factorx.encoder.d.ts +51 -0
- package/dist_ts/formats/factorx.encoder.js +293 -0
- package/dist_ts/formats/facturx.decoder.d.ts +18 -0
- package/dist_ts/formats/facturx.decoder.js +210 -0
- package/dist_ts/formats/facturx.encoder.d.ts +51 -0
- package/dist_ts/formats/facturx.encoder.js +293 -0
- package/dist_ts/formats/facturx.validator.d.ts +67 -0
- package/dist_ts/formats/facturx.validator.js +266 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
- package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
- package/dist_ts/formats/pdf/extractors/index.js +5 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
- package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
- package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
- package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
- package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
- package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
- package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
- package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
- package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
- package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
- package/dist_ts/formats/ubl/ubl.types.js +21 -0
- package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
- package/dist_ts/formats/ubl/ubl.validator.js +112 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
- package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
- package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
- package/dist_ts/formats/ubl.validator.d.ts +82 -0
- package/dist_ts/formats/ubl.validator.js +306 -0
- package/dist_ts/formats/utils/format.detector.d.ts +62 -0
- package/dist_ts/formats/utils/format.detector.js +249 -0
- package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
- package/dist_ts/formats/validation/en16931.validator.js +119 -0
- package/dist_ts/formats/validator.factory.d.ts +18 -0
- package/dist_ts/formats/validator.factory.js +78 -0
- package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
- package/dist_ts/formats/xinvoice.decoder.js +332 -0
- package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
- package/dist_ts/formats/xinvoice.encoder.js +282 -0
- package/dist_ts/index.d.ts +51 -0
- package/dist_ts/index.js +90 -0
- package/dist_ts/interfaces/common.d.ts +79 -0
- package/dist_ts/interfaces/common.js +24 -0
- package/dist_ts/interfaces.d.ts +87 -0
- package/dist_ts/interfaces.js +23 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +31 -0
- package/npmextra.json +35 -0
- package/package.json +71 -0
- package/readme.hints.md +1107 -0
- package/readme.howtofixtests.md +38 -0
- package/readme.literature.md +1 -0
- package/readme.md +998 -0
- package/readme.plan.md +481 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/einvoice.ts +603 -0
- package/ts/errors.ts +341 -0
- package/ts/formats/base/base.decoder.ts +68 -0
- package/ts/formats/base/base.encoder.ts +14 -0
- package/ts/formats/base/base.validator.ts +64 -0
- package/ts/formats/cii/cii.decoder.ts +139 -0
- package/ts/formats/cii/cii.encoder.ts +64 -0
- package/ts/formats/cii/cii.types.ts +44 -0
- package/ts/formats/cii/cii.validator.ts +171 -0
- package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
- package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
- package/ts/formats/cii/facturx/facturx.types.ts +18 -0
- package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
- package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
- package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
- package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
- package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
- package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
- package/ts/formats/factories/decoder.factory.ts +62 -0
- package/ts/formats/factories/encoder.factory.ts +47 -0
- package/ts/formats/factories/validator.factory.ts +134 -0
- package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
- package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
- package/ts/formats/pdf/extractors/index.ts +4 -0
- package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
- package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
- package/ts/formats/pdf/pdf.embedder.ts +242 -0
- package/ts/formats/pdf/pdf.extractor.ts +141 -0
- package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
- package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
- package/ts/formats/ubl/ubl.decoder.ts +121 -0
- package/ts/formats/ubl/ubl.encoder.ts +63 -0
- package/ts/formats/ubl/ubl.types.ts +22 -0
- package/ts/formats/ubl/ubl.validator.ts +133 -0
- package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
- package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
- package/ts/formats/ubl/xrechnung.validator.ts +185 -0
- package/ts/formats/utils/format.detector.ts +306 -0
- package/ts/formats/validation/en16931.validator.ts +135 -0
- package/ts/index.ts +164 -0
- package/ts/interfaces/common.ts +90 -0
- package/ts/interfaces.ts +98 -0
- package/ts/plugins.ts +61 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { UBLBaseDecoder } from '../ubl.decoder.js';
|
|
2
|
+
import { business, finance } from '../../../plugins.js';
|
|
3
|
+
import { UBLDocumentType } from '../ubl.types.js';
|
|
4
|
+
import { EN16931Validator } from '../../validation/en16931.validator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Decoder for XRechnung (UBL) format
|
|
7
|
+
* Implements decoding of XRechnung invoices to TInvoice
|
|
8
|
+
*/
|
|
9
|
+
export class XRechnungDecoder extends UBLBaseDecoder {
|
|
10
|
+
/**
|
|
11
|
+
* Decodes a UBL credit note
|
|
12
|
+
* @returns Promise resolving to a TCreditNote object
|
|
13
|
+
*/
|
|
14
|
+
async decodeCreditNote() {
|
|
15
|
+
// Extract common data
|
|
16
|
+
const commonData = await this.extractCommonData();
|
|
17
|
+
// Return the invoice data as a credit note
|
|
18
|
+
return {
|
|
19
|
+
...commonData,
|
|
20
|
+
accountingDocType: 'creditnote'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Decodes a UBL debit note (invoice)
|
|
25
|
+
* @returns Promise resolving to a TDebitNote object
|
|
26
|
+
*/
|
|
27
|
+
async decodeDebitNote() {
|
|
28
|
+
// Extract common data
|
|
29
|
+
const commonData = await this.extractCommonData();
|
|
30
|
+
// Return the invoice data as a debit note
|
|
31
|
+
return {
|
|
32
|
+
...commonData,
|
|
33
|
+
accountingDocType: 'debitnote'
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extracts common invoice data from XRechnung XML
|
|
38
|
+
* @returns Common invoice data
|
|
39
|
+
*/
|
|
40
|
+
async extractCommonData() {
|
|
41
|
+
try {
|
|
42
|
+
// Default values
|
|
43
|
+
const invoiceId = this.getText('//cbc:ID', this.doc) || `INV-${Date.now()}`;
|
|
44
|
+
const issueDateText = this.getText('//cbc:IssueDate', this.doc);
|
|
45
|
+
const issueDate = issueDateText ? new Date(issueDateText).getTime() : Date.now();
|
|
46
|
+
const currencyCode = this.getText('//cbc:DocumentCurrencyCode', this.doc) || 'EUR';
|
|
47
|
+
// Extract payment terms
|
|
48
|
+
let dueInDays = 30; // Default
|
|
49
|
+
const dueDateText = this.getText('//cac:PaymentTerms/cbc:PaymentDueDate', this.doc);
|
|
50
|
+
if (dueDateText) {
|
|
51
|
+
const dueDateObj = new Date(dueDateText);
|
|
52
|
+
const issueDateObj = new Date(issueDate);
|
|
53
|
+
const diffTime = Math.abs(dueDateObj.getTime() - issueDateObj.getTime());
|
|
54
|
+
dueInDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
|
55
|
+
}
|
|
56
|
+
// Extract items
|
|
57
|
+
const items = [];
|
|
58
|
+
const invoiceLines = this.select('//cac:InvoiceLine', this.doc);
|
|
59
|
+
if (invoiceLines && Array.isArray(invoiceLines)) {
|
|
60
|
+
for (let i = 0; i < invoiceLines.length; i++) {
|
|
61
|
+
const line = invoiceLines[i];
|
|
62
|
+
const position = i + 1;
|
|
63
|
+
const name = this.getText('./cac:Item/cbc:Name', line) || `Item ${position}`;
|
|
64
|
+
const description = this.getText('./cac:Item/cbc:Description', line) || '';
|
|
65
|
+
const articleNumber = this.getText('./cac:Item/cac:SellersItemIdentification/cbc:ID', line) || '';
|
|
66
|
+
const buyerItemID = this.getText('./cac:Item/cac:BuyersItemIdentification/cbc:ID', line) || '';
|
|
67
|
+
const standardItemID = this.getText('./cac:Item/cac:StandardItemIdentification/cbc:ID', line) || '';
|
|
68
|
+
const commodityClassification = this.getText('./cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode', line) || '';
|
|
69
|
+
const unitType = this.getText('./cbc:InvoicedQuantity/@unitCode', line) || 'EA';
|
|
70
|
+
let unitQuantity = 1;
|
|
71
|
+
const quantityText = this.getText('./cbc:InvoicedQuantity', line);
|
|
72
|
+
if (quantityText) {
|
|
73
|
+
unitQuantity = parseFloat(quantityText) || 1;
|
|
74
|
+
}
|
|
75
|
+
let unitNetPrice = 0;
|
|
76
|
+
const priceText = this.getText('./cac:Price/cbc:PriceAmount', line);
|
|
77
|
+
if (priceText) {
|
|
78
|
+
unitNetPrice = parseFloat(priceText) || 0;
|
|
79
|
+
}
|
|
80
|
+
let vatPercentage = 0;
|
|
81
|
+
const percentText = this.getText('./cac:Item/cac:ClassifiedTaxCategory/cbc:Percent', line);
|
|
82
|
+
if (percentText) {
|
|
83
|
+
vatPercentage = parseFloat(percentText) || 0;
|
|
84
|
+
}
|
|
85
|
+
// Create item with extended metadata
|
|
86
|
+
const item = {
|
|
87
|
+
position,
|
|
88
|
+
name,
|
|
89
|
+
articleNumber,
|
|
90
|
+
unitType,
|
|
91
|
+
unitQuantity,
|
|
92
|
+
unitNetPrice,
|
|
93
|
+
vatPercentage
|
|
94
|
+
};
|
|
95
|
+
// Extract order line reference
|
|
96
|
+
const orderLineReference = this.getText('./cac:OrderLineReference/cac:OrderReference/cbc:ID', line) || '';
|
|
97
|
+
const orderLineReferenceId = this.getText('./cac:OrderLineReference/cbc:LineID', line) || '';
|
|
98
|
+
// Extract additional item properties
|
|
99
|
+
const additionalProps = {};
|
|
100
|
+
const propNodes = this.select('./cac:Item/cac:AdditionalItemProperty', line);
|
|
101
|
+
if (propNodes && Array.isArray(propNodes)) {
|
|
102
|
+
for (const propNode of propNodes) {
|
|
103
|
+
const propName = this.getText('./cbc:Name', propNode);
|
|
104
|
+
const propValue = this.getText('./cbc:Value', propNode);
|
|
105
|
+
if (propName && propValue) {
|
|
106
|
+
additionalProps[propName] = propValue;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Store additional item data in metadata
|
|
111
|
+
if (description || buyerItemID || standardItemID || commodityClassification || orderLineReference || Object.keys(additionalProps).length > 0) {
|
|
112
|
+
item.metadata = {
|
|
113
|
+
description,
|
|
114
|
+
buyerItemID,
|
|
115
|
+
standardItemID,
|
|
116
|
+
commodityClassification,
|
|
117
|
+
orderLineReference,
|
|
118
|
+
orderLineReferenceId,
|
|
119
|
+
additionalProperties: additionalProps
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
items.push(item);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Extract business references
|
|
126
|
+
const buyerReference = this.getText('//cbc:BuyerReference', this.doc);
|
|
127
|
+
const orderReference = this.getText('//cac:OrderReference/cbc:ID', this.doc);
|
|
128
|
+
const contractReference = this.getText('//cac:ContractDocumentReference/cbc:ID', this.doc);
|
|
129
|
+
const projectReference = this.getText('//cac:ProjectReference/cbc:ID', this.doc);
|
|
130
|
+
// Extract payment information
|
|
131
|
+
const paymentMeansCode = this.getText('//cac:PaymentMeans/cbc:PaymentMeansCode', this.doc);
|
|
132
|
+
const paymentID = this.getText('//cac:PaymentMeans/cbc:PaymentID', this.doc);
|
|
133
|
+
const paymentDueDate = this.getText('//cac:PaymentMeans/cbc:PaymentDueDate', this.doc);
|
|
134
|
+
const iban = this.getText('//cac:PaymentMeans/cac:PayeeFinancialAccount/cbc:ID', this.doc);
|
|
135
|
+
const bic = this.getText('//cac:PaymentMeans/cac:PayeeFinancialAccount/cac:FinancialInstitutionBranch/cbc:ID', this.doc);
|
|
136
|
+
const bankName = this.getText('//cac:PaymentMeans/cac:PayeeFinancialAccount/cac:FinancialInstitutionBranch/cbc:Name', this.doc);
|
|
137
|
+
const accountName = this.getText('//cac:PaymentMeans/cac:PayeeFinancialAccount/cbc:Name', this.doc);
|
|
138
|
+
// Extract payment terms with discount
|
|
139
|
+
const paymentTermsNote = this.getText('//cac:PaymentTerms/cbc:Note', this.doc);
|
|
140
|
+
const discountPercent = this.getText('//cac:PaymentTerms/cbc:SettlementDiscountPercent', this.doc);
|
|
141
|
+
// Extract period information
|
|
142
|
+
const periodStart = this.getText('//cac:InvoicePeriod/cbc:StartDate', this.doc);
|
|
143
|
+
const periodEnd = this.getText('//cac:InvoicePeriod/cbc:EndDate', this.doc);
|
|
144
|
+
const deliveryDate = this.getText('//cac:Delivery/cbc:ActualDeliveryDate', this.doc);
|
|
145
|
+
// Extract notes (excluding PaymentTerms notes)
|
|
146
|
+
const allNotes = [];
|
|
147
|
+
const noteNodes = this.select('//cbc:Note[not(parent::cac:PaymentTerms)]', this.doc);
|
|
148
|
+
if (noteNodes && Array.isArray(noteNodes)) {
|
|
149
|
+
for (let i = 0; i < noteNodes.length; i++) {
|
|
150
|
+
const noteText = noteNodes[i].textContent || '';
|
|
151
|
+
if (noteText) {
|
|
152
|
+
allNotes.push(noteText);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Extract subject and notes separately
|
|
157
|
+
// If we have notes, the first one might be the subject
|
|
158
|
+
let subject = `Invoice ${invoiceId}`;
|
|
159
|
+
let notes = [...allNotes];
|
|
160
|
+
// If the first note doesn't look like a payment term or other standard note,
|
|
161
|
+
// treat it as the subject
|
|
162
|
+
if (allNotes.length > 0 && !allNotes[0].toLowerCase().includes('due in') &&
|
|
163
|
+
!allNotes[0].toLowerCase().includes('payment')) {
|
|
164
|
+
subject = allNotes[0];
|
|
165
|
+
notes = allNotes.slice(1); // Remove subject from notes
|
|
166
|
+
}
|
|
167
|
+
// Extract seller and buyer information
|
|
168
|
+
const seller = this.extractParty('//cac:AccountingSupplierParty/cac:Party');
|
|
169
|
+
const buyer = this.extractParty('//cac:AccountingCustomerParty/cac:Party');
|
|
170
|
+
// Create the common invoice data with metadata for business references
|
|
171
|
+
const invoiceData = {
|
|
172
|
+
type: 'accounting-doc',
|
|
173
|
+
accountingDocType: 'invoice',
|
|
174
|
+
id: invoiceId,
|
|
175
|
+
accountingDocId: invoiceId,
|
|
176
|
+
date: issueDate,
|
|
177
|
+
accountingDocStatus: 'issued',
|
|
178
|
+
versionInfo: {
|
|
179
|
+
type: 'final',
|
|
180
|
+
version: '1.0.0'
|
|
181
|
+
},
|
|
182
|
+
language: 'en',
|
|
183
|
+
incidenceId: invoiceId,
|
|
184
|
+
from: seller,
|
|
185
|
+
to: buyer,
|
|
186
|
+
subject: subject,
|
|
187
|
+
items: items,
|
|
188
|
+
dueInDays: dueInDays,
|
|
189
|
+
reverseCharge: false,
|
|
190
|
+
currency: currencyCode,
|
|
191
|
+
notes: notes,
|
|
192
|
+
objectActions: [],
|
|
193
|
+
metadata: {
|
|
194
|
+
format: 'xrechnung',
|
|
195
|
+
version: '1.0.0',
|
|
196
|
+
extensions: {
|
|
197
|
+
businessReferences: {
|
|
198
|
+
buyerReference,
|
|
199
|
+
orderReference,
|
|
200
|
+
contractReference,
|
|
201
|
+
projectReference
|
|
202
|
+
},
|
|
203
|
+
paymentInformation: {
|
|
204
|
+
paymentMeansCode,
|
|
205
|
+
paymentID,
|
|
206
|
+
paymentDueDate,
|
|
207
|
+
iban,
|
|
208
|
+
bic,
|
|
209
|
+
bankName,
|
|
210
|
+
accountName,
|
|
211
|
+
paymentTermsNote,
|
|
212
|
+
discountPercent
|
|
213
|
+
},
|
|
214
|
+
dateInformation: {
|
|
215
|
+
periodStart,
|
|
216
|
+
periodEnd,
|
|
217
|
+
deliveryDate
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
// Validate mandatory EN16931 fields unless validation is skipped
|
|
223
|
+
if (!this.skipValidation) {
|
|
224
|
+
EN16931Validator.validateMandatoryFields(invoiceData);
|
|
225
|
+
}
|
|
226
|
+
return invoiceData;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// Re-throw validation errors
|
|
230
|
+
if (error.message && error.message.includes('EN16931 validation failed')) {
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
console.error('Error extracting common data:', error);
|
|
234
|
+
// Return default data
|
|
235
|
+
return {
|
|
236
|
+
type: 'accounting-doc',
|
|
237
|
+
accountingDocType: 'invoice',
|
|
238
|
+
id: `INV-${Date.now()}`,
|
|
239
|
+
accountingDocId: `INV-${Date.now()}`,
|
|
240
|
+
date: Date.now(),
|
|
241
|
+
accountingDocStatus: 'issued',
|
|
242
|
+
versionInfo: {
|
|
243
|
+
type: 'final',
|
|
244
|
+
version: '1.0.0'
|
|
245
|
+
},
|
|
246
|
+
language: 'en',
|
|
247
|
+
incidenceId: `INV-${Date.now()}`,
|
|
248
|
+
from: this.createEmptyContact(),
|
|
249
|
+
to: this.createEmptyContact(),
|
|
250
|
+
subject: 'Invoice',
|
|
251
|
+
items: [],
|
|
252
|
+
dueInDays: 30,
|
|
253
|
+
reverseCharge: false,
|
|
254
|
+
currency: 'EUR',
|
|
255
|
+
notes: [],
|
|
256
|
+
objectActions: []
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Extracts party information from XML
|
|
262
|
+
* @param partyPath XPath to the party element
|
|
263
|
+
* @returns TContact object
|
|
264
|
+
*/
|
|
265
|
+
extractParty(partyPath) {
|
|
266
|
+
try {
|
|
267
|
+
// Default values
|
|
268
|
+
let name = '';
|
|
269
|
+
let streetName = '';
|
|
270
|
+
let houseNumber = '0';
|
|
271
|
+
let city = '';
|
|
272
|
+
let postalCode = '';
|
|
273
|
+
let country = '';
|
|
274
|
+
let countryCode = '';
|
|
275
|
+
let vatId = '';
|
|
276
|
+
let registrationId = '';
|
|
277
|
+
let registrationName = '';
|
|
278
|
+
let contactPhone = '';
|
|
279
|
+
let contactEmail = '';
|
|
280
|
+
let contactName = '';
|
|
281
|
+
let gln = '';
|
|
282
|
+
const additionalIdentifiers = [];
|
|
283
|
+
// Try to extract party information
|
|
284
|
+
const partyNodes = this.select(partyPath, this.doc);
|
|
285
|
+
if (partyNodes && Array.isArray(partyNodes) && partyNodes.length > 0) {
|
|
286
|
+
const party = partyNodes[0];
|
|
287
|
+
// Extract GLN from EndpointID
|
|
288
|
+
const endpointId = this.getText('./cbc:EndpointID[@schemeID="0088"]', party);
|
|
289
|
+
if (endpointId) {
|
|
290
|
+
gln = endpointId;
|
|
291
|
+
}
|
|
292
|
+
// Extract additional party identifications
|
|
293
|
+
const partyIdNodes = this.select('./cac:PartyIdentification', party);
|
|
294
|
+
if (partyIdNodes && Array.isArray(partyIdNodes)) {
|
|
295
|
+
for (const idNode of partyIdNodes) {
|
|
296
|
+
const idValue = this.getText('./cbc:ID', idNode);
|
|
297
|
+
const idElement = idNode.getElementsByTagName('cbc:ID')[0];
|
|
298
|
+
const schemeId = idElement?.getAttribute('schemeID');
|
|
299
|
+
if (idValue) {
|
|
300
|
+
additionalIdentifiers.push({
|
|
301
|
+
value: idValue,
|
|
302
|
+
scheme: schemeId || ''
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Extract name
|
|
308
|
+
name = this.getText('./cac:PartyName/cbc:Name', party) || '';
|
|
309
|
+
// Extract address
|
|
310
|
+
const addressNodes = this.select('./cac:PostalAddress', party);
|
|
311
|
+
if (addressNodes && Array.isArray(addressNodes) && addressNodes.length > 0) {
|
|
312
|
+
const address = addressNodes[0];
|
|
313
|
+
streetName = this.getText('./cbc:StreetName', address) || '';
|
|
314
|
+
houseNumber = this.getText('./cbc:BuildingNumber', address) || '0';
|
|
315
|
+
city = this.getText('./cbc:CityName', address) || '';
|
|
316
|
+
postalCode = this.getText('./cbc:PostalZone', address) || '';
|
|
317
|
+
const countryNodes = this.select('./cac:Country', address);
|
|
318
|
+
if (countryNodes && Array.isArray(countryNodes) && countryNodes.length > 0) {
|
|
319
|
+
const countryNode = countryNodes[0];
|
|
320
|
+
country = this.getText('./cbc:Name', countryNode) || '';
|
|
321
|
+
countryCode = this.getText('./cbc:IdentificationCode', countryNode) || '';
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Extract tax information
|
|
325
|
+
const taxSchemeNodes = this.select('./cac:PartyTaxScheme', party);
|
|
326
|
+
if (taxSchemeNodes && Array.isArray(taxSchemeNodes) && taxSchemeNodes.length > 0) {
|
|
327
|
+
vatId = this.getText('./cbc:CompanyID', taxSchemeNodes[0]) || '';
|
|
328
|
+
}
|
|
329
|
+
// Extract registration information
|
|
330
|
+
const legalEntityNodes = this.select('./cac:PartyLegalEntity', party);
|
|
331
|
+
if (legalEntityNodes && Array.isArray(legalEntityNodes) && legalEntityNodes.length > 0) {
|
|
332
|
+
registrationId = this.getText('./cbc:CompanyID', legalEntityNodes[0]) || '';
|
|
333
|
+
registrationName = this.getText('./cbc:RegistrationName', legalEntityNodes[0]) || name;
|
|
334
|
+
}
|
|
335
|
+
// Extract contact information
|
|
336
|
+
const contactNodes = this.select('./cac:Contact', party);
|
|
337
|
+
if (contactNodes && Array.isArray(contactNodes) && contactNodes.length > 0) {
|
|
338
|
+
const contact = contactNodes[0];
|
|
339
|
+
contactPhone = this.getText('./cbc:Telephone', contact) || '';
|
|
340
|
+
contactEmail = this.getText('./cbc:ElectronicMail', contact) || '';
|
|
341
|
+
contactName = this.getText('./cbc:Name', contact) || '';
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Create contact with additional metadata for contact information
|
|
345
|
+
const contact = {
|
|
346
|
+
type: 'company',
|
|
347
|
+
name: name,
|
|
348
|
+
description: '',
|
|
349
|
+
address: {
|
|
350
|
+
streetName: streetName,
|
|
351
|
+
houseNumber: houseNumber,
|
|
352
|
+
city: city,
|
|
353
|
+
postalCode: postalCode,
|
|
354
|
+
country: country,
|
|
355
|
+
countryCode: countryCode
|
|
356
|
+
},
|
|
357
|
+
status: 'active',
|
|
358
|
+
foundedDate: {
|
|
359
|
+
year: 2000,
|
|
360
|
+
month: 1,
|
|
361
|
+
day: 1
|
|
362
|
+
},
|
|
363
|
+
registrationDetails: {
|
|
364
|
+
vatId: vatId,
|
|
365
|
+
registrationId: registrationId,
|
|
366
|
+
registrationName: registrationName
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
// Store contact information and additional identifiers in metadata if available
|
|
370
|
+
const metadata = {};
|
|
371
|
+
if (contactPhone || contactEmail || contactName) {
|
|
372
|
+
metadata.contactInformation = {
|
|
373
|
+
phone: contactPhone,
|
|
374
|
+
email: contactEmail,
|
|
375
|
+
name: contactName
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
if (gln) {
|
|
379
|
+
contact.gln = gln;
|
|
380
|
+
}
|
|
381
|
+
if (additionalIdentifiers.length > 0) {
|
|
382
|
+
contact.additionalIdentifiers = additionalIdentifiers;
|
|
383
|
+
}
|
|
384
|
+
if (Object.keys(metadata).length > 0) {
|
|
385
|
+
contact.metadata = metadata;
|
|
386
|
+
}
|
|
387
|
+
return contact;
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
console.error('Error extracting party information:', error);
|
|
391
|
+
return this.createEmptyContact();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Creates an empty TContact object
|
|
396
|
+
* @returns Empty TContact object
|
|
397
|
+
*/
|
|
398
|
+
createEmptyContact() {
|
|
399
|
+
return {
|
|
400
|
+
type: 'company',
|
|
401
|
+
name: '',
|
|
402
|
+
description: '',
|
|
403
|
+
address: {
|
|
404
|
+
streetName: '',
|
|
405
|
+
houseNumber: '0',
|
|
406
|
+
city: '',
|
|
407
|
+
country: '',
|
|
408
|
+
postalCode: ''
|
|
409
|
+
},
|
|
410
|
+
status: 'active',
|
|
411
|
+
foundedDate: {
|
|
412
|
+
year: 2000,
|
|
413
|
+
month: 1,
|
|
414
|
+
day: 1
|
|
415
|
+
},
|
|
416
|
+
registrationDetails: {
|
|
417
|
+
vatId: '',
|
|
418
|
+
registrationId: '',
|
|
419
|
+
registrationName: ''
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJlY2hudW5nLmRlY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9mb3JtYXRzL3VibC94cmVjaG51bmcveHJlY2hudW5nLmRlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXpFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxjQUFjO0lBQ2xEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsc0JBQXNCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFbEQsMkNBQTJDO1FBQzNDLE9BQU87WUFDTCxHQUFHLFVBQVU7WUFDYixpQkFBaUIsRUFBRSxZQUFxQjtTQUNmLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxlQUFlO1FBQzdCLHNCQUFzQjtRQUN0QixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWxELDBDQUEwQztRQUMxQyxPQUFPO1lBQ0wsR0FBRyxVQUFVO1lBQ2IsaUJBQWlCLEVBQUUsV0FBb0I7U0FDZixDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLElBQUksQ0FBQztZQUNILGlCQUFpQjtZQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMs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
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { UBLEncoder } from '../generic/ubl.encoder.js';
|
|
2
|
+
import type { TCreditNote, TDebitNote } from '../../../interfaces/common.js';
|
|
3
|
+
/**
|
|
4
|
+
* Encoder for XRechnung (UBL) format
|
|
5
|
+
* Extends the generic UBL encoder with XRechnung-specific customizations
|
|
6
|
+
*/
|
|
7
|
+
export declare class XRechnungEncoder extends UBLEncoder {
|
|
8
|
+
/**
|
|
9
|
+
* Encodes a credit note into XRechnung XML
|
|
10
|
+
* @param creditNote Credit note to encode
|
|
11
|
+
* @returns XRechnung XML string
|
|
12
|
+
*/
|
|
13
|
+
protected encodeCreditNote(creditNote: TCreditNote): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Encodes a debit note (invoice) into XRechnung XML
|
|
16
|
+
* @param debitNote Debit note to encode
|
|
17
|
+
* @returns XRechnung XML string
|
|
18
|
+
*/
|
|
19
|
+
protected encodeDebitNote(debitNote: TDebitNote): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Applies XRechnung-specific customizations to the document
|
|
22
|
+
* @param doc XML document
|
|
23
|
+
* @param invoice Invoice data
|
|
24
|
+
*/
|
|
25
|
+
private applyXRechnungCustomizations;
|
|
26
|
+
/**
|
|
27
|
+
* Adds electronic address to party if not already present
|
|
28
|
+
* @param doc XML document
|
|
29
|
+
* @param partyType Party type selector
|
|
30
|
+
* @param party Party data
|
|
31
|
+
*/
|
|
32
|
+
private addElectronicAddressToParty;
|
|
33
|
+
/**
|
|
34
|
+
* Fixes German country codes in the document
|
|
35
|
+
* @param doc XML document
|
|
36
|
+
*/
|
|
37
|
+
private fixGermanCountryCodes;
|
|
38
|
+
/**
|
|
39
|
+
* Adds business references from metadata to the document
|
|
40
|
+
* @param doc XML document
|
|
41
|
+
* @param businessReferences Business references from metadata
|
|
42
|
+
*/
|
|
43
|
+
private addBusinessReferences;
|
|
44
|
+
/**
|
|
45
|
+
* Enhances payment information from metadata
|
|
46
|
+
* @param doc XML document
|
|
47
|
+
* @param paymentInfo Payment information from metadata
|
|
48
|
+
*/
|
|
49
|
+
private enhancePaymentInformation;
|
|
50
|
+
/**
|
|
51
|
+
* Adds date information from metadata
|
|
52
|
+
* @param doc XML document
|
|
53
|
+
* @param dateInfo Date information from metadata
|
|
54
|
+
*/
|
|
55
|
+
private addDateInformation;
|
|
56
|
+
/**
|
|
57
|
+
* Enhances party information with contact details from metadata
|
|
58
|
+
* @param doc XML document
|
|
59
|
+
* @param invoice Invoice data
|
|
60
|
+
*/
|
|
61
|
+
private enhancePartyInformation;
|
|
62
|
+
/**
|
|
63
|
+
* Adds contact information to a party
|
|
64
|
+
* @param doc XML document
|
|
65
|
+
* @param partySelector Party selector
|
|
66
|
+
* @param contactInfo Contact information from metadata
|
|
67
|
+
*/
|
|
68
|
+
private addContactToParty;
|
|
69
|
+
/**
|
|
70
|
+
* Enhances line items with metadata
|
|
71
|
+
* @param doc XML document
|
|
72
|
+
* @param invoice Invoice data
|
|
73
|
+
*/
|
|
74
|
+
private enhanceLineItems;
|
|
75
|
+
}
|