@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,282 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* A class to convert a given ILetter with invoice data
|
|
4
|
+
* into an XInvoice/XRechnung compliant XML (based on UBL).
|
|
5
|
+
*
|
|
6
|
+
* XRechnung is the German implementation of the European standard EN16931
|
|
7
|
+
* for electronic invoices to the German public sector.
|
|
8
|
+
*/
|
|
9
|
+
export class XInvoiceEncoder {
|
|
10
|
+
constructor() { }
|
|
11
|
+
/**
|
|
12
|
+
* Creates an XInvoice compliant XML based on the provided letter data.
|
|
13
|
+
*/
|
|
14
|
+
createXInvoiceXml(letterArg) {
|
|
15
|
+
// Use SmartXml for XML creation
|
|
16
|
+
const smartxmlInstance = new plugins.smartxml.SmartXml();
|
|
17
|
+
if (!letterArg?.content?.invoiceData) {
|
|
18
|
+
throw new Error('Letter does not contain invoice data.');
|
|
19
|
+
}
|
|
20
|
+
const invoice = letterArg.content.invoiceData;
|
|
21
|
+
const billedBy = invoice.billedBy;
|
|
22
|
+
const billedTo = invoice.billedTo;
|
|
23
|
+
// Create the XML document
|
|
24
|
+
const doc = smartxmlInstance
|
|
25
|
+
.create({ version: '1.0', encoding: 'UTF-8' })
|
|
26
|
+
.ele('Invoice', {
|
|
27
|
+
'xmlns': 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',
|
|
28
|
+
'xmlns:cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',
|
|
29
|
+
'xmlns:cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',
|
|
30
|
+
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance'
|
|
31
|
+
});
|
|
32
|
+
// UBL Version ID
|
|
33
|
+
doc.ele('cbc:UBLVersionID').txt('2.1').up();
|
|
34
|
+
// CustomizationID for XRechnung
|
|
35
|
+
doc.ele('cbc:CustomizationID').txt('urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0').up();
|
|
36
|
+
// ID - Invoice number
|
|
37
|
+
doc.ele('cbc:ID').txt(invoice.id).up();
|
|
38
|
+
// Issue date
|
|
39
|
+
const issueDate = new Date(letterArg.date);
|
|
40
|
+
const issueDateStr = `${issueDate.getFullYear()}-${String(issueDate.getMonth() + 1).padStart(2, '0')}-${String(issueDate.getDate()).padStart(2, '0')}`;
|
|
41
|
+
doc.ele('cbc:IssueDate').txt(issueDateStr).up();
|
|
42
|
+
// Due date
|
|
43
|
+
const dueDate = new Date(letterArg.date);
|
|
44
|
+
dueDate.setDate(dueDate.getDate() + invoice.dueInDays);
|
|
45
|
+
const dueDateStr = `${dueDate.getFullYear()}-${String(dueDate.getMonth() + 1).padStart(2, '0')}-${String(dueDate.getDate()).padStart(2, '0')}`;
|
|
46
|
+
doc.ele('cbc:DueDate').txt(dueDateStr).up();
|
|
47
|
+
// Invoice type code
|
|
48
|
+
const invoiceTypeCode = invoice.type === 'creditnote' ? '381' : '380';
|
|
49
|
+
doc.ele('cbc:InvoiceTypeCode').txt(invoiceTypeCode).up();
|
|
50
|
+
// Note - optional invoice note
|
|
51
|
+
if (invoice.notes && invoice.notes.length > 0) {
|
|
52
|
+
doc.ele('cbc:Note').txt(invoice.notes[0]).up();
|
|
53
|
+
}
|
|
54
|
+
// Document currency code
|
|
55
|
+
doc.ele('cbc:DocumentCurrencyCode').txt(invoice.currency).up();
|
|
56
|
+
// Tax currency code - same as document currency in this case
|
|
57
|
+
doc.ele('cbc:TaxCurrencyCode').txt(invoice.currency).up();
|
|
58
|
+
// Accounting supplier party (seller)
|
|
59
|
+
const supplierParty = doc.ele('cac:AccountingSupplierParty');
|
|
60
|
+
const supplierPartyDetails = supplierParty.ele('cac:Party');
|
|
61
|
+
// Seller VAT ID
|
|
62
|
+
if (billedBy.type === 'company' && billedBy.registrationDetails?.vatId) {
|
|
63
|
+
const partyTaxScheme = supplierPartyDetails.ele('cac:PartyTaxScheme');
|
|
64
|
+
partyTaxScheme.ele('cbc:CompanyID').txt(billedBy.registrationDetails.vatId).up();
|
|
65
|
+
partyTaxScheme.ele('cac:TaxScheme')
|
|
66
|
+
.ele('cbc:ID').txt('VAT').up()
|
|
67
|
+
.up();
|
|
68
|
+
}
|
|
69
|
+
// Seller name
|
|
70
|
+
supplierPartyDetails.ele('cac:PartyName')
|
|
71
|
+
.ele('cbc:Name').txt(billedBy.name).up()
|
|
72
|
+
.up();
|
|
73
|
+
// Seller postal address
|
|
74
|
+
const supplierAddress = supplierPartyDetails.ele('cac:PostalAddress');
|
|
75
|
+
supplierAddress.ele('cbc:StreetName').txt(billedBy.address.streetName).up();
|
|
76
|
+
if (billedBy.address.houseNumber) {
|
|
77
|
+
supplierAddress.ele('cbc:BuildingNumber').txt(billedBy.address.houseNumber).up();
|
|
78
|
+
}
|
|
79
|
+
supplierAddress.ele('cbc:CityName').txt(billedBy.address.city).up();
|
|
80
|
+
supplierAddress.ele('cbc:PostalZone').txt(billedBy.address.postalCode).up();
|
|
81
|
+
supplierAddress.ele('cac:Country')
|
|
82
|
+
.ele('cbc:IdentificationCode').txt(billedBy.address.country || 'DE').up()
|
|
83
|
+
.up();
|
|
84
|
+
// Seller contact
|
|
85
|
+
const supplierContact = supplierPartyDetails.ele('cac:Contact');
|
|
86
|
+
if (billedBy.email) {
|
|
87
|
+
supplierContact.ele('cbc:ElectronicMail').txt(billedBy.email).up();
|
|
88
|
+
}
|
|
89
|
+
if (billedBy.phone) {
|
|
90
|
+
supplierContact.ele('cbc:Telephone').txt(billedBy.phone).up();
|
|
91
|
+
}
|
|
92
|
+
supplierParty.up(); // Close AccountingSupplierParty
|
|
93
|
+
// Accounting customer party (buyer)
|
|
94
|
+
const customerParty = doc.ele('cac:AccountingCustomerParty');
|
|
95
|
+
const customerPartyDetails = customerParty.ele('cac:Party');
|
|
96
|
+
// Buyer VAT ID
|
|
97
|
+
if (billedTo.type === 'company' && billedTo.registrationDetails?.vatId) {
|
|
98
|
+
const partyTaxScheme = customerPartyDetails.ele('cac:PartyTaxScheme');
|
|
99
|
+
partyTaxScheme.ele('cbc:CompanyID').txt(billedTo.registrationDetails.vatId).up();
|
|
100
|
+
partyTaxScheme.ele('cac:TaxScheme')
|
|
101
|
+
.ele('cbc:ID').txt('VAT').up()
|
|
102
|
+
.up();
|
|
103
|
+
}
|
|
104
|
+
// Buyer name
|
|
105
|
+
customerPartyDetails.ele('cac:PartyName')
|
|
106
|
+
.ele('cbc:Name').txt(billedTo.name).up()
|
|
107
|
+
.up();
|
|
108
|
+
// Buyer postal address
|
|
109
|
+
const customerAddress = customerPartyDetails.ele('cac:PostalAddress');
|
|
110
|
+
customerAddress.ele('cbc:StreetName').txt(billedTo.address.streetName).up();
|
|
111
|
+
if (billedTo.address.houseNumber) {
|
|
112
|
+
customerAddress.ele('cbc:BuildingNumber').txt(billedTo.address.houseNumber).up();
|
|
113
|
+
}
|
|
114
|
+
customerAddress.ele('cbc:CityName').txt(billedTo.address.city).up();
|
|
115
|
+
customerAddress.ele('cbc:PostalZone').txt(billedTo.address.postalCode).up();
|
|
116
|
+
customerAddress.ele('cac:Country')
|
|
117
|
+
.ele('cbc:IdentificationCode').txt(billedTo.address.country || 'DE').up()
|
|
118
|
+
.up();
|
|
119
|
+
// Buyer contact
|
|
120
|
+
if (billedTo.email || billedTo.phone) {
|
|
121
|
+
const customerContact = customerPartyDetails.ele('cac:Contact');
|
|
122
|
+
if (billedTo.email) {
|
|
123
|
+
customerContact.ele('cbc:ElectronicMail').txt(billedTo.email).up();
|
|
124
|
+
}
|
|
125
|
+
if (billedTo.phone) {
|
|
126
|
+
customerContact.ele('cbc:Telephone').txt(billedTo.phone).up();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
customerParty.up(); // Close AccountingCustomerParty
|
|
130
|
+
// Payment means
|
|
131
|
+
if (billedBy.sepaConnection) {
|
|
132
|
+
const paymentMeans = doc.ele('cac:PaymentMeans');
|
|
133
|
+
paymentMeans.ele('cbc:PaymentMeansCode').txt('58').up(); // 58 = SEPA credit transfer
|
|
134
|
+
paymentMeans.ele('cbc:PaymentID').txt(invoice.id).up();
|
|
135
|
+
// IBAN
|
|
136
|
+
if (billedBy.sepaConnection.iban) {
|
|
137
|
+
const payeeAccount = paymentMeans.ele('cac:PayeeFinancialAccount');
|
|
138
|
+
payeeAccount.ele('cbc:ID').txt(billedBy.sepaConnection.iban).up();
|
|
139
|
+
// BIC
|
|
140
|
+
if (billedBy.sepaConnection.bic) {
|
|
141
|
+
payeeAccount.ele('cac:FinancialInstitutionBranch')
|
|
142
|
+
.ele('cbc:ID').txt(billedBy.sepaConnection.bic).up()
|
|
143
|
+
.up();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Payment terms
|
|
148
|
+
const paymentTerms = doc.ele('cac:PaymentTerms');
|
|
149
|
+
paymentTerms.ele('cbc:Note').txt(`Payment due in ${invoice.dueInDays} days`).up();
|
|
150
|
+
// Tax summary
|
|
151
|
+
// Group items by VAT rate
|
|
152
|
+
const vatRates = {};
|
|
153
|
+
// Collect items by VAT rate
|
|
154
|
+
invoice.items.forEach(item => {
|
|
155
|
+
if (!vatRates[item.vatPercentage]) {
|
|
156
|
+
vatRates[item.vatPercentage] = [];
|
|
157
|
+
}
|
|
158
|
+
vatRates[item.vatPercentage].push(item);
|
|
159
|
+
});
|
|
160
|
+
// Calculate tax subtotals for each rate
|
|
161
|
+
Object.entries(vatRates).forEach(([rate, items]) => {
|
|
162
|
+
const taxRate = parseFloat(rate);
|
|
163
|
+
// Calculate base amount for this rate
|
|
164
|
+
let taxableAmount = 0;
|
|
165
|
+
items.forEach(item => {
|
|
166
|
+
taxableAmount += item.unitNetPrice * item.unitQuantity;
|
|
167
|
+
});
|
|
168
|
+
// Calculate tax amount
|
|
169
|
+
const taxAmount = taxableAmount * (taxRate / 100);
|
|
170
|
+
// Create tax subtotal
|
|
171
|
+
const taxSubtotal = doc.ele('cac:TaxTotal')
|
|
172
|
+
.ele('cbc:TaxAmount').txt(taxAmount.toFixed(2))
|
|
173
|
+
.att('currencyID', invoice.currency)
|
|
174
|
+
.up();
|
|
175
|
+
taxSubtotal.ele('cac:TaxSubtotal')
|
|
176
|
+
.ele('cbc:TaxableAmount')
|
|
177
|
+
.txt(taxableAmount.toFixed(2))
|
|
178
|
+
.att('currencyID', invoice.currency)
|
|
179
|
+
.up()
|
|
180
|
+
.ele('cbc:TaxAmount')
|
|
181
|
+
.txt(taxAmount.toFixed(2))
|
|
182
|
+
.att('currencyID', invoice.currency)
|
|
183
|
+
.up()
|
|
184
|
+
.ele('cac:TaxCategory')
|
|
185
|
+
.ele('cbc:ID').txt('S').up() // Standard rate
|
|
186
|
+
.ele('cbc:Percent').txt(taxRate.toFixed(2)).up()
|
|
187
|
+
.ele('cac:TaxScheme')
|
|
188
|
+
.ele('cbc:ID').txt('VAT').up()
|
|
189
|
+
.up()
|
|
190
|
+
.up()
|
|
191
|
+
.up();
|
|
192
|
+
});
|
|
193
|
+
// Calculate invoice totals
|
|
194
|
+
let lineExtensionAmount = 0;
|
|
195
|
+
let taxExclusiveAmount = 0;
|
|
196
|
+
let taxInclusiveAmount = 0;
|
|
197
|
+
let totalVat = 0;
|
|
198
|
+
// Sum all items
|
|
199
|
+
invoice.items.forEach(item => {
|
|
200
|
+
const net = item.unitNetPrice * item.unitQuantity;
|
|
201
|
+
const vat = net * (item.vatPercentage / 100);
|
|
202
|
+
lineExtensionAmount += net;
|
|
203
|
+
taxExclusiveAmount += net;
|
|
204
|
+
totalVat += vat;
|
|
205
|
+
});
|
|
206
|
+
taxInclusiveAmount = taxExclusiveAmount + totalVat;
|
|
207
|
+
// Legal monetary total
|
|
208
|
+
const legalMonetaryTotal = doc.ele('cac:LegalMonetaryTotal');
|
|
209
|
+
legalMonetaryTotal.ele('cbc:LineExtensionAmount')
|
|
210
|
+
.txt(lineExtensionAmount.toFixed(2))
|
|
211
|
+
.att('currencyID', invoice.currency)
|
|
212
|
+
.up();
|
|
213
|
+
legalMonetaryTotal.ele('cbc:TaxExclusiveAmount')
|
|
214
|
+
.txt(taxExclusiveAmount.toFixed(2))
|
|
215
|
+
.att('currencyID', invoice.currency)
|
|
216
|
+
.up();
|
|
217
|
+
legalMonetaryTotal.ele('cbc:TaxInclusiveAmount')
|
|
218
|
+
.txt(taxInclusiveAmount.toFixed(2))
|
|
219
|
+
.att('currencyID', invoice.currency)
|
|
220
|
+
.up();
|
|
221
|
+
legalMonetaryTotal.ele('cbc:PayableAmount')
|
|
222
|
+
.txt(taxInclusiveAmount.toFixed(2))
|
|
223
|
+
.att('currencyID', invoice.currency)
|
|
224
|
+
.up();
|
|
225
|
+
// Invoice lines
|
|
226
|
+
invoice.items.forEach((item, index) => {
|
|
227
|
+
const invoiceLine = doc.ele('cac:InvoiceLine');
|
|
228
|
+
invoiceLine.ele('cbc:ID').txt((index + 1).toString()).up();
|
|
229
|
+
// Quantity
|
|
230
|
+
invoiceLine.ele('cbc:InvoicedQuantity')
|
|
231
|
+
.txt(item.unitQuantity.toString())
|
|
232
|
+
.att('unitCode', this.mapUnitType(item.unitType))
|
|
233
|
+
.up();
|
|
234
|
+
// Line extension amount (net)
|
|
235
|
+
const lineAmount = item.unitNetPrice * item.unitQuantity;
|
|
236
|
+
invoiceLine.ele('cbc:LineExtensionAmount')
|
|
237
|
+
.txt(lineAmount.toFixed(2))
|
|
238
|
+
.att('currencyID', invoice.currency)
|
|
239
|
+
.up();
|
|
240
|
+
// Item details
|
|
241
|
+
const itemEle = invoiceLine.ele('cac:Item');
|
|
242
|
+
itemEle.ele('cbc:Description').txt(item.name).up();
|
|
243
|
+
itemEle.ele('cbc:Name').txt(item.name).up();
|
|
244
|
+
// Classified tax category
|
|
245
|
+
itemEle.ele('cac:ClassifiedTaxCategory')
|
|
246
|
+
.ele('cbc:ID').txt('S').up() // Standard rate
|
|
247
|
+
.ele('cbc:Percent').txt(item.vatPercentage.toFixed(2)).up()
|
|
248
|
+
.ele('cac:TaxScheme')
|
|
249
|
+
.ele('cbc:ID').txt('VAT').up()
|
|
250
|
+
.up()
|
|
251
|
+
.up();
|
|
252
|
+
// Price
|
|
253
|
+
invoiceLine.ele('cac:Price')
|
|
254
|
+
.ele('cbc:PriceAmount')
|
|
255
|
+
.txt(item.unitNetPrice.toFixed(2))
|
|
256
|
+
.att('currencyID', invoice.currency)
|
|
257
|
+
.up()
|
|
258
|
+
.up();
|
|
259
|
+
});
|
|
260
|
+
// Return the formatted XML
|
|
261
|
+
return doc.end({ prettyPrint: true });
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Helper: Map your custom 'unitType' to an ISO code.
|
|
265
|
+
*/
|
|
266
|
+
mapUnitType(unitType) {
|
|
267
|
+
switch (unitType.toLowerCase()) {
|
|
268
|
+
case 'hour':
|
|
269
|
+
case 'hours':
|
|
270
|
+
return 'HUR';
|
|
271
|
+
case 'day':
|
|
272
|
+
case 'days':
|
|
273
|
+
return 'DAY';
|
|
274
|
+
case 'piece':
|
|
275
|
+
case 'pieces':
|
|
276
|
+
return 'C62';
|
|
277
|
+
default:
|
|
278
|
+
return 'C62'; // fallback for unknown unit types
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGludm9pY2UuZW5jb2Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Zvcm1hdHMveGludm9pY2UuZW5jb2Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUUxQixnQkFBZSxDQUFDO0lBRWhCOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsU0FBMkM7UUFDbEUsZ0NBQWdDO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQXFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXJFLDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxnQkFBZ0I7YUFDekIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDN0MsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsV0FBVyxFQUFFLDBFQUEwRTtZQUN2RixXQUFXLEVBQUUsc0VBQXNFO1lBQ25GLFdBQVcsRUFBRSwyQ0FBMkM7U0FDekQsQ0FBQyxDQUFDO1FBRUwsaUJBQWlCO1FBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFF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
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { EInvoice } from './einvoice.js';
|
|
2
|
+
import * as common from './interfaces/common.js';
|
|
3
|
+
import { DecoderFactory } from './formats/factories/decoder.factory.js';
|
|
4
|
+
import { EncoderFactory } from './formats/factories/encoder.factory.js';
|
|
5
|
+
import { ValidatorFactory } from './formats/factories/validator.factory.js';
|
|
6
|
+
import { BaseDecoder } from './formats/base/base.decoder.js';
|
|
7
|
+
import { BaseEncoder } from './formats/base/base.encoder.js';
|
|
8
|
+
import { BaseValidator } from './formats/base/base.validator.js';
|
|
9
|
+
import { UBLBaseDecoder } from './formats/ubl/ubl.decoder.js';
|
|
10
|
+
import { UBLBaseEncoder } from './formats/ubl/ubl.encoder.js';
|
|
11
|
+
import { UBLBaseValidator } from './formats/ubl/ubl.validator.js';
|
|
12
|
+
import { CIIBaseDecoder } from './formats/cii/cii.decoder.js';
|
|
13
|
+
import { CIIBaseEncoder } from './formats/cii/cii.encoder.js';
|
|
14
|
+
import { CIIBaseValidator } from './formats/cii/cii.validator.js';
|
|
15
|
+
import { PDFEmbedder } from './formats/pdf/pdf.embedder.js';
|
|
16
|
+
import { PDFExtractor } from './formats/pdf/pdf.extractor.js';
|
|
17
|
+
import { BaseXMLExtractor, StandardXMLExtractor, AssociatedFilesExtractor, TextXMLExtractor } from './formats/pdf/extractors/index.js';
|
|
18
|
+
import { FormatDetector } from './formats/utils/format.detector.js';
|
|
19
|
+
import { EInvoiceError, EInvoiceParsingError, EInvoiceValidationError, EInvoicePDFError, EInvoiceFormatError, ErrorRecovery, ErrorContext } from './errors.js';
|
|
20
|
+
import { FacturXDecoder } from './formats/cii/facturx/facturx.decoder.js';
|
|
21
|
+
import { FacturXEncoder } from './formats/cii/facturx/facturx.encoder.js';
|
|
22
|
+
import { FacturXValidator } from './formats/cii/facturx/facturx.validator.js';
|
|
23
|
+
import { ZUGFeRDDecoder } from './formats/cii/zugferd/zugferd.decoder.js';
|
|
24
|
+
import { ZUGFeRDEncoder } from './formats/cii/zugferd/zugferd.encoder.js';
|
|
25
|
+
import { ZUGFeRDValidator } from './formats/cii/zugferd/zugferd.validator.js';
|
|
26
|
+
import { ZUGFeRDV1Decoder } from './formats/cii/zugferd/zugferd.v1.decoder.js';
|
|
27
|
+
export type { TInvoice, TCreditNote, TDebitNote, TContact, TLetterEnvelope, TDocumentEnvelope, IPdf, ValidationError, ValidationResult, IValidator, ExportFormat, EInvoiceOptions } from './interfaces/common.js';
|
|
28
|
+
export { ValidationLevel, InvoiceFormat } from './interfaces/common.js';
|
|
29
|
+
export { common as interfaces };
|
|
30
|
+
export { EInvoice };
|
|
31
|
+
export { DecoderFactory, EncoderFactory, ValidatorFactory };
|
|
32
|
+
export { BaseDecoder, BaseEncoder, BaseValidator };
|
|
33
|
+
export { UBLBaseDecoder, UBLBaseEncoder, UBLBaseValidator };
|
|
34
|
+
export { CIIBaseDecoder, CIIBaseEncoder, CIIBaseValidator };
|
|
35
|
+
export { FacturXDecoder, FacturXEncoder, FacturXValidator };
|
|
36
|
+
export { ZUGFeRDDecoder, ZUGFeRDEncoder, ZUGFeRDValidator, ZUGFeRDV1Decoder };
|
|
37
|
+
export { PDFEmbedder, PDFExtractor, BaseXMLExtractor, StandardXMLExtractor, AssociatedFilesExtractor, TextXMLExtractor };
|
|
38
|
+
export { FormatDetector };
|
|
39
|
+
export { EInvoiceError, EInvoiceParsingError, EInvoiceValidationError, EInvoicePDFError, EInvoiceFormatError, ErrorRecovery, ErrorContext };
|
|
40
|
+
/**
|
|
41
|
+
* Validates an XML string against the appropriate format rules
|
|
42
|
+
* @param xml XML content to validate
|
|
43
|
+
* @param level Validation level (syntax, semantic, business)
|
|
44
|
+
* @returns ValidationResult with the result of validation
|
|
45
|
+
*/
|
|
46
|
+
export declare function validateXml(xml: string, level?: common.ValidationLevel): common.ValidationResult;
|
|
47
|
+
/**
|
|
48
|
+
* Creates a new EInvoice instance
|
|
49
|
+
* @returns A new EInvoice instance
|
|
50
|
+
*/
|
|
51
|
+
export declare function createEInvoice(): EInvoice;
|
package/dist_ts/index.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Import main class
|
|
2
|
+
import { EInvoice } from './einvoice.js';
|
|
3
|
+
// Import interfaces
|
|
4
|
+
import * as common from './interfaces/common.js';
|
|
5
|
+
// Import factories
|
|
6
|
+
import { DecoderFactory } from './formats/factories/decoder.factory.js';
|
|
7
|
+
import { EncoderFactory } from './formats/factories/encoder.factory.js';
|
|
8
|
+
import { ValidatorFactory } from './formats/factories/validator.factory.js';
|
|
9
|
+
// Import base classes
|
|
10
|
+
import { BaseDecoder } from './formats/base/base.decoder.js';
|
|
11
|
+
import { BaseEncoder } from './formats/base/base.encoder.js';
|
|
12
|
+
import { BaseValidator } from './formats/base/base.validator.js';
|
|
13
|
+
// Import UBL base classes
|
|
14
|
+
import { UBLBaseDecoder } from './formats/ubl/ubl.decoder.js';
|
|
15
|
+
import { UBLBaseEncoder } from './formats/ubl/ubl.encoder.js';
|
|
16
|
+
import { UBLBaseValidator } from './formats/ubl/ubl.validator.js';
|
|
17
|
+
// Import CII base classes
|
|
18
|
+
import { CIIBaseDecoder } from './formats/cii/cii.decoder.js';
|
|
19
|
+
import { CIIBaseEncoder } from './formats/cii/cii.encoder.js';
|
|
20
|
+
import { CIIBaseValidator } from './formats/cii/cii.validator.js';
|
|
21
|
+
// Import PDF utilities
|
|
22
|
+
import { PDFEmbedder } from './formats/pdf/pdf.embedder.js';
|
|
23
|
+
import { PDFExtractor } from './formats/pdf/pdf.extractor.js';
|
|
24
|
+
import { BaseXMLExtractor, StandardXMLExtractor, AssociatedFilesExtractor, TextXMLExtractor } from './formats/pdf/extractors/index.js';
|
|
25
|
+
// Import format detector
|
|
26
|
+
import { FormatDetector } from './formats/utils/format.detector.js';
|
|
27
|
+
// Import error classes
|
|
28
|
+
import { EInvoiceError, EInvoiceParsingError, EInvoiceValidationError, EInvoicePDFError, EInvoiceFormatError, ErrorRecovery, ErrorContext } from './errors.js';
|
|
29
|
+
// Import Factur-X implementation
|
|
30
|
+
import { FacturXDecoder } from './formats/cii/facturx/facturx.decoder.js';
|
|
31
|
+
import { FacturXEncoder } from './formats/cii/facturx/facturx.encoder.js';
|
|
32
|
+
import { FacturXValidator } from './formats/cii/facturx/facturx.validator.js';
|
|
33
|
+
// Import ZUGFeRD implementation
|
|
34
|
+
import { ZUGFeRDDecoder } from './formats/cii/zugferd/zugferd.decoder.js';
|
|
35
|
+
import { ZUGFeRDEncoder } from './formats/cii/zugferd/zugferd.encoder.js';
|
|
36
|
+
import { ZUGFeRDValidator } from './formats/cii/zugferd/zugferd.validator.js';
|
|
37
|
+
import { ZUGFeRDV1Decoder } from './formats/cii/zugferd/zugferd.v1.decoder.js';
|
|
38
|
+
export { ValidationLevel, InvoiceFormat } from './interfaces/common.js';
|
|
39
|
+
// Export interfaces (legacy support)
|
|
40
|
+
export { common as interfaces };
|
|
41
|
+
// Export main class
|
|
42
|
+
export { EInvoice };
|
|
43
|
+
// Export factories
|
|
44
|
+
export { DecoderFactory, EncoderFactory, ValidatorFactory };
|
|
45
|
+
// Export base classes
|
|
46
|
+
export { BaseDecoder, BaseEncoder, BaseValidator };
|
|
47
|
+
// Export UBL base classes
|
|
48
|
+
export { UBLBaseDecoder, UBLBaseEncoder, UBLBaseValidator };
|
|
49
|
+
// Export CII base classes
|
|
50
|
+
export { CIIBaseDecoder, CIIBaseEncoder, CIIBaseValidator };
|
|
51
|
+
// Export Factur-X implementation
|
|
52
|
+
export { FacturXDecoder, FacturXEncoder, FacturXValidator };
|
|
53
|
+
// Export ZUGFeRD implementation
|
|
54
|
+
export { ZUGFeRDDecoder, ZUGFeRDEncoder, ZUGFeRDValidator, ZUGFeRDV1Decoder };
|
|
55
|
+
// Export PDF utilities
|
|
56
|
+
export { PDFEmbedder, PDFExtractor, BaseXMLExtractor, StandardXMLExtractor, AssociatedFilesExtractor, TextXMLExtractor };
|
|
57
|
+
// Export format detector
|
|
58
|
+
export { FormatDetector };
|
|
59
|
+
// Export error classes
|
|
60
|
+
export { EInvoiceError, EInvoiceParsingError, EInvoiceValidationError, EInvoicePDFError, EInvoiceFormatError, ErrorRecovery, ErrorContext };
|
|
61
|
+
/**
|
|
62
|
+
* Validates an XML string against the appropriate format rules
|
|
63
|
+
* @param xml XML content to validate
|
|
64
|
+
* @param level Validation level (syntax, semantic, business)
|
|
65
|
+
* @returns ValidationResult with the result of validation
|
|
66
|
+
*/
|
|
67
|
+
export function validateXml(xml, level = common.ValidationLevel.SYNTAX) {
|
|
68
|
+
try {
|
|
69
|
+
const validator = ValidatorFactory.createValidator(xml);
|
|
70
|
+
return validator.validate(level);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
valid: false,
|
|
75
|
+
errors: [{
|
|
76
|
+
code: 'VAL-ERROR',
|
|
77
|
+
message: `Validation error: ${error.message}`
|
|
78
|
+
}],
|
|
79
|
+
level
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates a new EInvoice instance
|
|
85
|
+
* @returns A new EInvoice instance
|
|
86
|
+
*/
|
|
87
|
+
export function createEInvoice() {
|
|
88
|
+
return new EInvoice();
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUVqRCxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU1RSxzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFakUsMEJBQTBCO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsMEJBQTBCO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsdUJBQXVCO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixF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
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported electronic invoice formats
|
|
3
|
+
*/
|
|
4
|
+
export declare enum InvoiceFormat {
|
|
5
|
+
UNKNOWN = "unknown",
|
|
6
|
+
UBL = "ubl",// Universal Business Language
|
|
7
|
+
CII = "cii",// Cross-Industry Invoice
|
|
8
|
+
ZUGFERD = "zugferd",// ZUGFeRD (German e-invoice format)
|
|
9
|
+
FACTURX = "facturx",// Factur-X (French e-invoice format)
|
|
10
|
+
XRECHNUNG = "xrechnung",// XRechnung (German e-invoice implementation of EN16931)
|
|
11
|
+
FATTURAPA = "fatturapa"
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Formats supported for export operations
|
|
15
|
+
* This is a subset of InvoiceFormat that only includes formats
|
|
16
|
+
* that can be generated and embedded in PDFs
|
|
17
|
+
*/
|
|
18
|
+
export type ExportFormat = 'facturx' | 'zugferd' | 'xrechnung' | 'ubl' | 'cii';
|
|
19
|
+
/**
|
|
20
|
+
* Describes a validation level for invoice validation
|
|
21
|
+
*/
|
|
22
|
+
export declare enum ValidationLevel {
|
|
23
|
+
SYNTAX = "syntax",// Schema validation only
|
|
24
|
+
SEMANTIC = "semantic",// Semantic validation (field types, required fields, etc.)
|
|
25
|
+
BUSINESS = "business"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Describes a validation error
|
|
29
|
+
*/
|
|
30
|
+
export interface ValidationError {
|
|
31
|
+
code: string;
|
|
32
|
+
message: string;
|
|
33
|
+
location?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of a validation operation
|
|
37
|
+
*/
|
|
38
|
+
export interface ValidationResult {
|
|
39
|
+
valid: boolean;
|
|
40
|
+
errors: ValidationError[];
|
|
41
|
+
level: ValidationLevel;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Options for the EInvoice class
|
|
45
|
+
*/
|
|
46
|
+
export interface EInvoiceOptions {
|
|
47
|
+
validateOnLoad?: boolean;
|
|
48
|
+
validationLevel?: ValidationLevel;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Interface for validator implementations
|
|
52
|
+
*/
|
|
53
|
+
export interface IValidator {
|
|
54
|
+
validate(level?: ValidationLevel): ValidationResult;
|
|
55
|
+
isValid(): boolean;
|
|
56
|
+
getValidationErrors(): ValidationError[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* PDF interface
|
|
60
|
+
*/
|
|
61
|
+
export interface IPdf {
|
|
62
|
+
name: string;
|
|
63
|
+
id: string;
|
|
64
|
+
metadata: {
|
|
65
|
+
textExtraction: string;
|
|
66
|
+
format?: string;
|
|
67
|
+
embeddedXml?: {
|
|
68
|
+
filename: string;
|
|
69
|
+
description: string;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
buffer: Uint8Array;
|
|
73
|
+
}
|
|
74
|
+
export type { TInvoice } from '@tsclass/tsclass/dist_ts/finance/index.js';
|
|
75
|
+
export type { TCreditNote } from '@tsclass/tsclass/dist_ts/finance/index.js';
|
|
76
|
+
export type { TDebitNote } from '@tsclass/tsclass/dist_ts/finance/index.js';
|
|
77
|
+
export type { TContact } from '@tsclass/tsclass/dist_ts/business/index.js';
|
|
78
|
+
export type { TLetterEnvelope } from '@tsclass/tsclass/dist_ts/business/index.js';
|
|
79
|
+
export type { TDocumentEnvelope } from '@tsclass/tsclass/dist_ts/business/index.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { business, finance } from '../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Supported electronic invoice formats
|
|
4
|
+
*/
|
|
5
|
+
export var InvoiceFormat;
|
|
6
|
+
(function (InvoiceFormat) {
|
|
7
|
+
InvoiceFormat["UNKNOWN"] = "unknown";
|
|
8
|
+
InvoiceFormat["UBL"] = "ubl";
|
|
9
|
+
InvoiceFormat["CII"] = "cii";
|
|
10
|
+
InvoiceFormat["ZUGFERD"] = "zugferd";
|
|
11
|
+
InvoiceFormat["FACTURX"] = "facturx";
|
|
12
|
+
InvoiceFormat["XRECHNUNG"] = "xrechnung";
|
|
13
|
+
InvoiceFormat["FATTURAPA"] = "fatturapa"; // FatturaPA (Italian e-invoice format)
|
|
14
|
+
})(InvoiceFormat || (InvoiceFormat = {}));
|
|
15
|
+
/**
|
|
16
|
+
* Describes a validation level for invoice validation
|
|
17
|
+
*/
|
|
18
|
+
export var ValidationLevel;
|
|
19
|
+
(function (ValidationLevel) {
|
|
20
|
+
ValidationLevel["SYNTAX"] = "syntax";
|
|
21
|
+
ValidationLevel["SEMANTIC"] = "semantic";
|
|
22
|
+
ValidationLevel["BUSINESS"] = "business"; // Business rule validation
|
|
23
|
+
})(ValidationLevel || (ValidationLevel = {}));
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvaW50ZXJmYWNlcy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQ7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxhQVFYO0FBUkQsV0FBWSxhQUFhO0lBQ3ZCLG9DQUFtQixDQUFBO0lBQ25CLDRCQUFXLENBQUE7SUFDWCw0QkFBVyxDQUFBO0lBQ1gsb0NBQW1CLENBQUE7SUFDbkIsb0NBQW1CLENBQUE7SUFDbkIsd0NBQXVCLENBQUE7SUFDdkIsd0NBQXVCLENBQUEsQ0FBQyx1Q0FBdUM7QUFDakUsQ0FBQyxFQVJXLGFBQWEsS0FBYixhQUFhLFFBUXhCO0FBU0Q7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLG9DQUFpQixDQUFBO0lBQ2pCLHdDQUFxQixDQUFBO0lBQ3JCLHdDQUFxQixDQUFBLENBQUMsMkJBQTJCO0FBQ25ELENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQiJ9
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export interface IEInvoice {
|
|
2
|
+
InvoiceNumber: string;
|
|
3
|
+
DateIssued: string;
|
|
4
|
+
Seller: IParty;
|
|
5
|
+
Buyer: IParty;
|
|
6
|
+
Items: IInvoiceItem[];
|
|
7
|
+
TotalAmount: number;
|
|
8
|
+
}
|
|
9
|
+
export interface IParty {
|
|
10
|
+
Name: string;
|
|
11
|
+
Address: IAddress;
|
|
12
|
+
Contact: IContact;
|
|
13
|
+
TaxRegistration?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface IAddress {
|
|
16
|
+
Street: string;
|
|
17
|
+
City: string;
|
|
18
|
+
PostalCode: string;
|
|
19
|
+
Country: string;
|
|
20
|
+
}
|
|
21
|
+
export interface IContact {
|
|
22
|
+
Email: string;
|
|
23
|
+
Phone: string;
|
|
24
|
+
}
|
|
25
|
+
export interface IInvoiceItem {
|
|
26
|
+
Description: string;
|
|
27
|
+
Quantity: number;
|
|
28
|
+
UnitPrice: number;
|
|
29
|
+
TotalPrice: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Supported electronic invoice formats
|
|
33
|
+
*/
|
|
34
|
+
export declare enum InvoiceFormat {
|
|
35
|
+
UNKNOWN = "unknown",
|
|
36
|
+
UBL = "ubl",// Universal Business Language
|
|
37
|
+
CII = "cii",// Cross-Industry Invoice
|
|
38
|
+
ZUGFERD = "zugferd",// ZUGFeRD (German e-invoice format)
|
|
39
|
+
FACTURX = "facturx",// Factur-X (French e-invoice format)
|
|
40
|
+
XRECHNUNG = "xrechnung",// XRechnung (German e-invoice implementation of EN16931)
|
|
41
|
+
FATTURAPA = "fatturapa"
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Formats supported for export operations
|
|
45
|
+
* This is a subset of InvoiceFormat that only includes formats
|
|
46
|
+
* that can be generated and embedded in PDFs
|
|
47
|
+
*/
|
|
48
|
+
export type ExportFormat = 'facturx' | 'zugferd' | 'xrechnung' | 'ubl' | 'cii';
|
|
49
|
+
/**
|
|
50
|
+
* Describes a validation level for invoice validation
|
|
51
|
+
*/
|
|
52
|
+
export declare enum ValidationLevel {
|
|
53
|
+
SYNTAX = "syntax",// Schema validation only
|
|
54
|
+
SEMANTIC = "semantic",// Semantic validation (field types, required fields, etc.)
|
|
55
|
+
BUSINESS = "business"
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Describes a validation error
|
|
59
|
+
*/
|
|
60
|
+
export interface ValidationError {
|
|
61
|
+
code: string;
|
|
62
|
+
message: string;
|
|
63
|
+
location?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Result of a validation operation
|
|
67
|
+
*/
|
|
68
|
+
export interface ValidationResult {
|
|
69
|
+
valid: boolean;
|
|
70
|
+
errors: ValidationError[];
|
|
71
|
+
level: ValidationLevel;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Options for the EInvoice class
|
|
75
|
+
*/
|
|
76
|
+
export interface EInvoiceOptions {
|
|
77
|
+
validateOnLoad?: boolean;
|
|
78
|
+
validationLevel?: ValidationLevel;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Interface for validator implementations
|
|
82
|
+
*/
|
|
83
|
+
export interface IValidator {
|
|
84
|
+
validate(level?: ValidationLevel): ValidationResult;
|
|
85
|
+
isValid(): boolean;
|
|
86
|
+
getValidationErrors(): ValidationError[];
|
|
87
|
+
}
|