@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.
Files changed (171) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.decoder.d.ts +40 -0
  4. package/dist_ts/classes.decoder.js +320 -0
  5. package/dist_ts/classes.encoder.d.ts +51 -0
  6. package/dist_ts/classes.encoder.js +293 -0
  7. package/dist_ts/classes.xinvoice.d.ts +136 -0
  8. package/dist_ts/classes.xinvoice.js +352 -0
  9. package/dist_ts/einvoice.d.ts +217 -0
  10. package/dist_ts/einvoice.js +505 -0
  11. package/dist_ts/errors.d.ts +121 -0
  12. package/dist_ts/errors.js +241 -0
  13. package/dist_ts/formats/base/base.decoder.d.ts +32 -0
  14. package/dist_ts/formats/base/base.decoder.js +52 -0
  15. package/dist_ts/formats/base/base.encoder.d.ts +13 -0
  16. package/dist_ts/formats/base/base.encoder.js +7 -0
  17. package/dist_ts/formats/base/base.validator.d.ts +44 -0
  18. package/dist_ts/formats/base/base.validator.js +39 -0
  19. package/dist_ts/formats/base.decoder.d.ts +19 -0
  20. package/dist_ts/formats/base.decoder.js +130 -0
  21. package/dist_ts/formats/base.validator.d.ts +44 -0
  22. package/dist_ts/formats/base.validator.js +39 -0
  23. package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
  24. package/dist_ts/formats/cii/cii.decoder.js +111 -0
  25. package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
  26. package/dist_ts/formats/cii/cii.encoder.js +48 -0
  27. package/dist_ts/formats/cii/cii.types.d.ts +31 -0
  28. package/dist_ts/formats/cii/cii.types.js +40 -0
  29. package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
  30. package/dist_ts/formats/cii/cii.validator.js +146 -0
  31. package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
  32. package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
  33. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
  34. package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
  35. package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
  36. package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
  37. package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
  38. package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
  39. package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
  40. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
  41. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
  42. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
  43. package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
  44. package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
  45. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
  46. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
  47. package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
  48. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
  49. package/dist_ts/formats/decoder.factory.d.ts +15 -0
  50. package/dist_ts/formats/decoder.factory.js +46 -0
  51. package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
  52. package/dist_ts/formats/factories/decoder.factory.js +56 -0
  53. package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
  54. package/dist_ts/formats/factories/encoder.factory.js +40 -0
  55. package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
  56. package/dist_ts/formats/factories/validator.factory.js +110 -0
  57. package/dist_ts/formats/factorx.decoder.d.ts +18 -0
  58. package/dist_ts/formats/factorx.decoder.js +178 -0
  59. package/dist_ts/formats/factorx.encoder.d.ts +51 -0
  60. package/dist_ts/formats/factorx.encoder.js +293 -0
  61. package/dist_ts/formats/facturx.decoder.d.ts +18 -0
  62. package/dist_ts/formats/facturx.decoder.js +210 -0
  63. package/dist_ts/formats/facturx.encoder.d.ts +51 -0
  64. package/dist_ts/formats/facturx.encoder.js +293 -0
  65. package/dist_ts/formats/facturx.validator.d.ts +67 -0
  66. package/dist_ts/formats/facturx.validator.js +266 -0
  67. package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
  68. package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
  69. package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
  70. package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
  71. package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
  72. package/dist_ts/formats/pdf/extractors/index.js +5 -0
  73. package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
  74. package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
  75. package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
  76. package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
  77. package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
  78. package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
  79. package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
  80. package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
  81. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
  82. package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
  83. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
  84. package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
  85. package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
  86. package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
  87. package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
  88. package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
  89. package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
  90. package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
  91. package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
  92. package/dist_ts/formats/ubl/ubl.types.js +21 -0
  93. package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
  94. package/dist_ts/formats/ubl/ubl.validator.js +112 -0
  95. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
  96. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
  97. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
  98. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
  99. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
  100. package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
  101. package/dist_ts/formats/ubl.validator.d.ts +82 -0
  102. package/dist_ts/formats/ubl.validator.js +306 -0
  103. package/dist_ts/formats/utils/format.detector.d.ts +62 -0
  104. package/dist_ts/formats/utils/format.detector.js +249 -0
  105. package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
  106. package/dist_ts/formats/validation/en16931.validator.js +119 -0
  107. package/dist_ts/formats/validator.factory.d.ts +18 -0
  108. package/dist_ts/formats/validator.factory.js +78 -0
  109. package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
  110. package/dist_ts/formats/xinvoice.decoder.js +332 -0
  111. package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
  112. package/dist_ts/formats/xinvoice.encoder.js +282 -0
  113. package/dist_ts/index.d.ts +51 -0
  114. package/dist_ts/index.js +90 -0
  115. package/dist_ts/interfaces/common.d.ts +79 -0
  116. package/dist_ts/interfaces/common.js +24 -0
  117. package/dist_ts/interfaces.d.ts +87 -0
  118. package/dist_ts/interfaces.js +23 -0
  119. package/dist_ts/plugins.d.ts +14 -0
  120. package/dist_ts/plugins.js +31 -0
  121. package/npmextra.json +35 -0
  122. package/package.json +71 -0
  123. package/readme.hints.md +1107 -0
  124. package/readme.howtofixtests.md +38 -0
  125. package/readme.literature.md +1 -0
  126. package/readme.md +998 -0
  127. package/readme.plan.md +481 -0
  128. package/ts/00_commitinfo_data.ts +8 -0
  129. package/ts/einvoice.ts +603 -0
  130. package/ts/errors.ts +341 -0
  131. package/ts/formats/base/base.decoder.ts +68 -0
  132. package/ts/formats/base/base.encoder.ts +14 -0
  133. package/ts/formats/base/base.validator.ts +64 -0
  134. package/ts/formats/cii/cii.decoder.ts +139 -0
  135. package/ts/formats/cii/cii.encoder.ts +64 -0
  136. package/ts/formats/cii/cii.types.ts +44 -0
  137. package/ts/formats/cii/cii.validator.ts +171 -0
  138. package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
  139. package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
  140. package/ts/formats/cii/facturx/facturx.types.ts +18 -0
  141. package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
  142. package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
  143. package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
  144. package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
  145. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
  146. package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
  147. package/ts/formats/factories/decoder.factory.ts +62 -0
  148. package/ts/formats/factories/encoder.factory.ts +47 -0
  149. package/ts/formats/factories/validator.factory.ts +134 -0
  150. package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
  151. package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
  152. package/ts/formats/pdf/extractors/index.ts +4 -0
  153. package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
  154. package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
  155. package/ts/formats/pdf/pdf.embedder.ts +242 -0
  156. package/ts/formats/pdf/pdf.extractor.ts +141 -0
  157. package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
  158. package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
  159. package/ts/formats/ubl/ubl.decoder.ts +121 -0
  160. package/ts/formats/ubl/ubl.encoder.ts +63 -0
  161. package/ts/formats/ubl/ubl.types.ts +22 -0
  162. package/ts/formats/ubl/ubl.validator.ts +133 -0
  163. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
  164. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
  165. package/ts/formats/ubl/xrechnung.validator.ts +185 -0
  166. package/ts/formats/utils/format.detector.ts +306 -0
  167. package/ts/formats/validation/en16931.validator.ts +135 -0
  168. package/ts/index.ts +164 -0
  169. package/ts/interfaces/common.ts +90 -0
  170. package/ts/interfaces.ts +98 -0
  171. 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;
@@ -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
+ }