@fin.cx/einvoice 5.0.3 → 5.1.3
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/npmextra.json +1 -1
- package/package.json +12 -6
- 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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbmNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5lbmNvZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUV6QixnQkFBZSxDQUFDO0lBRWhCOztPQUVHO0lBQ0ksZ0JBQWdCLENBQUMsU0FBMkM7UUFDakUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdCQUFnQixDQUFDLFNBQTJDO1FBQ2pFLG1EQUFtRDtRQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFxQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNoRixNQUFNLFFBQVEsR0FBc0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBc0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUVyRSxpQ0FBaUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCO2FBQ3pCLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQzdDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRTtZQUMvQixXQUFXLEVBQUUsOERBQThEO1lBQzNFLFdBQVcsRUFBRSw2REFBNkQ7WUFDMUUsV0FBVyxFQUFFLDJEQUEyRDtZQUN4RSxXQUFXLEVBQUUsb0ZBQW9GO1NBQ2xHLENBQUMsQ0FBQztRQUVM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
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { business, finance } from './plugins.js';
|
|
2
|
-
import { InvoiceFormat, ValidationLevel } from './interfaces/common.js';
|
|
3
|
-
import type { ValidationResult, ValidationError, XInvoiceOptions, IPdf, ExportFormat } from './interfaces/common.js';
|
|
4
|
-
/**
|
|
5
|
-
* Main class for working with electronic invoices.
|
|
6
|
-
* Supports various invoice formats including Factur-X, ZUGFeRD, UBL, and XRechnung
|
|
7
|
-
* Implements TInvoice interface for seamless integration with existing systems
|
|
8
|
-
*/
|
|
9
|
-
export declare class XInvoice {
|
|
10
|
-
id: string;
|
|
11
|
-
invoiceId: string;
|
|
12
|
-
invoiceType: 'creditnote' | 'debitnote';
|
|
13
|
-
versionInfo: business.TDocumentEnvelope<string, any>['versionInfo'];
|
|
14
|
-
type: 'invoice';
|
|
15
|
-
date: number;
|
|
16
|
-
status: 'draft' | 'invoice' | 'paid' | 'refunded';
|
|
17
|
-
subject: string;
|
|
18
|
-
from: business.TContact;
|
|
19
|
-
to: business.TContact;
|
|
20
|
-
incidenceId: string;
|
|
21
|
-
language: string;
|
|
22
|
-
legalContact?: business.TContact;
|
|
23
|
-
objectActions: any[];
|
|
24
|
-
pdf: IPdf | null;
|
|
25
|
-
pdfAttachments: IPdf[] | null;
|
|
26
|
-
accentColor: string | null;
|
|
27
|
-
logoUrl: string | null;
|
|
28
|
-
items: finance.TInvoiceItem[];
|
|
29
|
-
dueInDays: number;
|
|
30
|
-
reverseCharge: boolean;
|
|
31
|
-
currency: finance.TCurrency;
|
|
32
|
-
notes: string[];
|
|
33
|
-
periodOfPerformance?: {
|
|
34
|
-
from: number;
|
|
35
|
-
to: number;
|
|
36
|
-
};
|
|
37
|
-
deliveryDate?: number;
|
|
38
|
-
buyerReference?: string;
|
|
39
|
-
electronicAddress?: {
|
|
40
|
-
scheme: string;
|
|
41
|
-
value: string;
|
|
42
|
-
};
|
|
43
|
-
paymentOptions?: finance.IPaymentOptionInfo;
|
|
44
|
-
private xmlString;
|
|
45
|
-
private detectedFormat;
|
|
46
|
-
private validationErrors;
|
|
47
|
-
private options;
|
|
48
|
-
private pdfEmbedder;
|
|
49
|
-
private pdfExtractor;
|
|
50
|
-
/**
|
|
51
|
-
* Creates a new XInvoice instance
|
|
52
|
-
* @param options Configuration options
|
|
53
|
-
*/
|
|
54
|
-
constructor(options?: XInvoiceOptions);
|
|
55
|
-
/**
|
|
56
|
-
* Creates an empty TContact object
|
|
57
|
-
*/
|
|
58
|
-
private createEmptyContact;
|
|
59
|
-
/**
|
|
60
|
-
* Creates a new XInvoice instance from XML
|
|
61
|
-
* @param xmlString XML content
|
|
62
|
-
* @param options Configuration options
|
|
63
|
-
* @returns XInvoice instance
|
|
64
|
-
*/
|
|
65
|
-
static fromXml(xmlString: string, options?: XInvoiceOptions): Promise<XInvoice>;
|
|
66
|
-
/**
|
|
67
|
-
* Creates a new XInvoice instance from PDF
|
|
68
|
-
* @param pdfBuffer PDF buffer
|
|
69
|
-
* @param options Configuration options
|
|
70
|
-
* @returns XInvoice instance
|
|
71
|
-
*/
|
|
72
|
-
static fromPdf(pdfBuffer: Uint8Array | Buffer, options?: XInvoiceOptions): Promise<XInvoice>;
|
|
73
|
-
/**
|
|
74
|
-
* Loads XML data into the XInvoice instance
|
|
75
|
-
* @param xmlString XML content
|
|
76
|
-
* @param validate Whether to validate the XML
|
|
77
|
-
* @returns This instance for chaining
|
|
78
|
-
*/
|
|
79
|
-
loadXml(xmlString: string, validate?: boolean): Promise<XInvoice>;
|
|
80
|
-
/**
|
|
81
|
-
* Loads PDF data into the XInvoice instance
|
|
82
|
-
* @param pdfBuffer PDF buffer
|
|
83
|
-
* @param validate Whether to validate the extracted XML
|
|
84
|
-
* @returns This instance for chaining
|
|
85
|
-
*/
|
|
86
|
-
loadPdf(pdfBuffer: Uint8Array | Buffer, validate?: boolean): Promise<XInvoice>;
|
|
87
|
-
/**
|
|
88
|
-
* Copies data from a TInvoice object
|
|
89
|
-
* @param invoice Source invoice data
|
|
90
|
-
*/
|
|
91
|
-
private copyInvoiceData;
|
|
92
|
-
/**
|
|
93
|
-
* Validates the XML against the appropriate format rules
|
|
94
|
-
* @param level Validation level (syntax, semantic, business)
|
|
95
|
-
* @returns Validation result
|
|
96
|
-
*/
|
|
97
|
-
validate(level?: ValidationLevel): Promise<ValidationResult>;
|
|
98
|
-
/**
|
|
99
|
-
* Checks if the invoice is valid
|
|
100
|
-
* @returns True if no validation errors were found
|
|
101
|
-
*/
|
|
102
|
-
isValid(): boolean;
|
|
103
|
-
/**
|
|
104
|
-
* Gets validation errors from the last validation
|
|
105
|
-
* @returns Array of validation errors
|
|
106
|
-
*/
|
|
107
|
-
getValidationErrors(): ValidationError[];
|
|
108
|
-
/**
|
|
109
|
-
* Exports the invoice as XML in the specified format
|
|
110
|
-
* @param format Target format (e.g., 'facturx', 'xrechnung')
|
|
111
|
-
* @returns XML string in the specified format
|
|
112
|
-
*/
|
|
113
|
-
exportXml(format?: ExportFormat): Promise<string>;
|
|
114
|
-
/**
|
|
115
|
-
* Exports the invoice as a PDF with embedded XML
|
|
116
|
-
* @param format Target format (e.g., 'facturx', 'zugferd', 'xrechnung', 'ubl')
|
|
117
|
-
* @returns PDF object with embedded XML
|
|
118
|
-
*/
|
|
119
|
-
exportPdf(format?: ExportFormat): Promise<IPdf>;
|
|
120
|
-
/**
|
|
121
|
-
* Gets the raw XML content
|
|
122
|
-
* @returns XML string
|
|
123
|
-
*/
|
|
124
|
-
getXml(): string;
|
|
125
|
-
/**
|
|
126
|
-
* Gets the invoice format as an enum value
|
|
127
|
-
* @returns InvoiceFormat enum value
|
|
128
|
-
*/
|
|
129
|
-
getFormat(): InvoiceFormat;
|
|
130
|
-
/**
|
|
131
|
-
* Checks if the invoice is in the specified format
|
|
132
|
-
* @param format Format to check
|
|
133
|
-
* @returns True if the invoice is in the specified format
|
|
134
|
-
*/
|
|
135
|
-
isFormat(format: InvoiceFormat): boolean;
|
|
136
|
-
}
|