@fin.cx/einvoice 5.0.2 → 5.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/package.json +13 -8
  58. package/readme.md +255 -810
  59. package/ts/00_commitinfo_data.ts +1 -1
  60. package/ts/einvoice.ts +63 -14
  61. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  62. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  63. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  64. package/ts/formats/semantic/semantic.validator.ts +654 -0
  65. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  66. package/ts/formats/utils/currency.utils.ts +299 -0
  67. package/ts/formats/utils/decimal.ts +509 -0
  68. package/ts/formats/validation/codelist.validator.ts +317 -0
  69. package/ts/formats/validation/conformance.harness.ts +591 -0
  70. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  71. package/ts/formats/validation/facturx.validator.ts +579 -0
  72. package/ts/formats/validation/integrated.validator.ts +405 -0
  73. package/ts/formats/validation/peppol.validator.ts +589 -0
  74. package/ts/formats/validation/schematron.downloader.ts +304 -0
  75. package/ts/formats/validation/schematron.integration.ts +285 -0
  76. package/ts/formats/validation/schematron.validator.ts +348 -0
  77. package/ts/formats/validation/schematron.worker.ts +221 -0
  78. package/ts/formats/validation/validation.types.ts +274 -0
  79. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  80. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  81. package/ts/interfaces/common.ts +1 -0
  82. package/ts/interfaces/en16931-metadata.ts +104 -0
  83. package/ts/plugins.ts +8 -0
  84. package/ts/tspublish.json +3 -0
  85. package/dist_ts/classes.decoder.d.ts +0 -40
  86. package/dist_ts/classes.decoder.js +0 -320
  87. package/dist_ts/classes.encoder.d.ts +0 -51
  88. package/dist_ts/classes.encoder.js +0 -293
  89. package/dist_ts/classes.xinvoice.d.ts +0 -136
  90. package/dist_ts/classes.xinvoice.js +0 -352
  91. package/dist_ts/formats/base.decoder.d.ts +0 -19
  92. package/dist_ts/formats/base.decoder.js +0 -130
  93. package/dist_ts/formats/base.validator.d.ts +0 -44
  94. package/dist_ts/formats/base.validator.js +0 -39
  95. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  96. package/dist_ts/formats/decoder.factory.js +0 -46
  97. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  98. package/dist_ts/formats/factorx.decoder.js +0 -178
  99. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  100. package/dist_ts/formats/factorx.encoder.js +0 -293
  101. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  102. package/dist_ts/formats/facturx.decoder.js +0 -210
  103. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  104. package/dist_ts/formats/facturx.encoder.js +0 -293
  105. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  106. package/dist_ts/formats/facturx.validator.js +0 -266
  107. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  109. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  110. package/dist_ts/formats/ubl.validator.js +0 -306
  111. package/dist_ts/formats/validator.factory.d.ts +0 -18
  112. package/dist_ts/formats/validator.factory.js +0 -78
  113. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  114. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  115. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  116. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -0,0 +1,538 @@
1
+ /**
2
+ * Adapter for converting between EInvoice and EN16931 Semantic Model
3
+ * Provides bidirectional conversion capabilities
4
+ */
5
+ import { EInvoice } from '../../einvoice.js';
6
+ /**
7
+ * Adapter for converting between EInvoice and EN16931 Semantic Model
8
+ */
9
+ export class SemanticModelAdapter {
10
+ /**
11
+ * Convert EInvoice to EN16931 Semantic Model
12
+ */
13
+ toSemanticModel(invoice) {
14
+ return {
15
+ // Core document information
16
+ documentInformation: {
17
+ invoiceNumber: invoice.accountingDocId,
18
+ issueDate: invoice.issueDate,
19
+ typeCode: this.mapInvoiceType(invoice.accountingDocType),
20
+ currencyCode: invoice.currency,
21
+ notes: invoice.notes ? this.mapNotes(invoice.notes) : undefined
22
+ },
23
+ // Process metadata
24
+ processControl: invoice.metadata?.profileId ? {
25
+ businessProcessType: invoice.metadata?.extensions?.businessProcessId,
26
+ specificationIdentifier: invoice.metadata.profileId
27
+ } : undefined,
28
+ // References
29
+ references: {
30
+ buyerReference: invoice.metadata?.buyerReference,
31
+ projectReference: invoice.metadata?.extensions?.projectReference,
32
+ contractReference: invoice.metadata?.extensions?.contractReference,
33
+ purchaseOrderReference: invoice.metadata?.extensions?.purchaseOrderReference,
34
+ salesOrderReference: invoice.metadata?.extensions?.salesOrderReference,
35
+ precedingInvoices: invoice.metadata?.extensions?.precedingInvoices
36
+ },
37
+ // Seller
38
+ seller: {
39
+ ...this.mapSeller(invoice.from),
40
+ postalAddress: this.mapAddress(invoice.from),
41
+ contact: this.mapContact(invoice.from)
42
+ },
43
+ // Buyer
44
+ buyer: {
45
+ ...this.mapBuyer(invoice.to),
46
+ postalAddress: this.mapAddress(invoice.to),
47
+ contact: this.mapContact(invoice.to)
48
+ },
49
+ // Payee (if different from seller)
50
+ payee: invoice.metadata?.extensions?.payee,
51
+ // Tax representative
52
+ taxRepresentative: invoice.metadata?.extensions?.taxRepresentative,
53
+ // Delivery
54
+ delivery: this.mapDelivery(invoice),
55
+ // Invoice period
56
+ invoicingPeriod: invoice.metadata?.extensions?.invoicingPeriod ? {
57
+ startDate: invoice.metadata.extensions.invoicingPeriod.startDate,
58
+ endDate: invoice.metadata.extensions.invoicingPeriod.endDate,
59
+ descriptionCode: invoice.metadata.extensions.invoicingPeriod.descriptionCode
60
+ } : undefined,
61
+ // Payment instructions
62
+ paymentInstructions: this.mapPaymentInstructions(invoice),
63
+ // Payment card info
64
+ paymentCardInfo: invoice.metadata?.extensions?.paymentCard,
65
+ // Direct debit
66
+ directDebit: invoice.metadata?.extensions?.directDebit,
67
+ // Payment terms
68
+ paymentTerms: invoice.dueInDays !== undefined ? {
69
+ note: `Payment due in ${invoice.dueInDays} days`
70
+ } : undefined,
71
+ // Document level allowances and charges
72
+ documentLevelAllowances: invoice.metadata?.extensions?.documentAllowances,
73
+ documentLevelCharges: invoice.metadata?.extensions?.documentCharges,
74
+ // Document totals
75
+ documentTotals: this.mapDocumentTotals(invoice),
76
+ // VAT breakdown
77
+ vatBreakdown: this.mapVATBreakdown(invoice),
78
+ // Additional documents
79
+ additionalDocuments: invoice.metadata?.extensions?.supportingDocuments,
80
+ // Invoice lines
81
+ invoiceLines: this.mapInvoiceLines(invoice.items || [])
82
+ };
83
+ }
84
+ /**
85
+ * Convert EN16931 Semantic Model to EInvoice
86
+ */
87
+ fromSemanticModel(model) {
88
+ const invoice = new EInvoice();
89
+ invoice.accountingDocId = model.documentInformation.invoiceNumber;
90
+ invoice.issueDate = model.documentInformation.issueDate;
91
+ invoice.accountingDocType = this.reverseMapInvoiceType(model.documentInformation.typeCode);
92
+ invoice.currency = model.documentInformation.currencyCode;
93
+ invoice.from = this.reverseMapSeller(model.seller);
94
+ invoice.to = this.reverseMapBuyer(model.buyer);
95
+ invoice.items = this.reverseMapInvoiceLines(model.invoiceLines);
96
+ // Set metadata
97
+ if (model.processControl) {
98
+ invoice.metadata = {
99
+ ...invoice.metadata,
100
+ profileId: model.processControl.specificationIdentifier,
101
+ extensions: {
102
+ ...invoice.metadata?.extensions,
103
+ businessProcessId: model.processControl.businessProcessType
104
+ }
105
+ };
106
+ }
107
+ // Set references
108
+ if (model.references) {
109
+ invoice.metadata = {
110
+ ...invoice.metadata,
111
+ buyerReference: model.references.buyerReference,
112
+ extensions: {
113
+ ...invoice.metadata?.extensions,
114
+ contractReference: model.references.contractReference,
115
+ purchaseOrderReference: model.references.purchaseOrderReference,
116
+ salesOrderReference: model.references.salesOrderReference,
117
+ precedingInvoices: model.references.precedingInvoices,
118
+ projectReference: model.references.projectReference
119
+ }
120
+ };
121
+ }
122
+ // Set payment terms
123
+ if (model.paymentTerms?.note) {
124
+ const daysMatch = model.paymentTerms.note.match(/(\d+) days/);
125
+ if (daysMatch) {
126
+ invoice.dueInDays = parseInt(daysMatch[1], 10);
127
+ }
128
+ }
129
+ // Set payment options
130
+ if (model.paymentInstructions.paymentAccountIdentifier) {
131
+ invoice.paymentOptions = {
132
+ sepa: {
133
+ iban: model.paymentInstructions.paymentAccountIdentifier,
134
+ bic: model.paymentInstructions.paymentServiceProviderIdentifier
135
+ },
136
+ bankInfo: {
137
+ accountHolder: model.paymentInstructions.paymentAccountName || '',
138
+ institutionName: model.paymentInstructions.paymentServiceProviderIdentifier || ''
139
+ }
140
+ };
141
+ }
142
+ // Set extensions
143
+ if (model.payee || model.taxRepresentative || model.documentLevelAllowances) {
144
+ invoice.metadata = {
145
+ ...invoice.metadata,
146
+ extensions: {
147
+ ...invoice.metadata?.extensions,
148
+ payee: model.payee,
149
+ taxRepresentative: model.taxRepresentative,
150
+ documentAllowances: model.documentLevelAllowances,
151
+ documentCharges: model.documentLevelCharges,
152
+ supportingDocuments: model.additionalDocuments,
153
+ paymentCard: model.paymentCardInfo,
154
+ directDebit: model.directDebit,
155
+ taxDetails: model.vatBreakdown
156
+ }
157
+ };
158
+ }
159
+ return invoice;
160
+ }
161
+ /**
162
+ * Map invoice type code
163
+ */
164
+ mapInvoiceType(type) {
165
+ const typeMap = {
166
+ 'invoice': '380',
167
+ 'creditNote': '381',
168
+ 'debitNote': '383',
169
+ 'correctedInvoice': '384',
170
+ 'prepaymentInvoice': '386',
171
+ 'selfBilledInvoice': '389',
172
+ 'invoice_380': '380',
173
+ 'credit_note_381': '381'
174
+ };
175
+ return typeMap[type] || '380';
176
+ }
177
+ /**
178
+ * Reverse map invoice type code
179
+ */
180
+ reverseMapInvoiceType(code) {
181
+ const typeMap = {
182
+ '380': 'invoice',
183
+ '381': 'creditNote',
184
+ '383': 'debitNote',
185
+ '384': 'correctedInvoice',
186
+ '386': 'prepaymentInvoice',
187
+ '389': 'selfBilledInvoice'
188
+ };
189
+ return typeMap[code] || 'invoice';
190
+ }
191
+ /**
192
+ * Map notes
193
+ */
194
+ mapNotes(notes) {
195
+ const notesArray = Array.isArray(notes) ? notes : [notes];
196
+ return notesArray.map(note => ({ noteContent: note }));
197
+ }
198
+ /**
199
+ * Map seller information
200
+ */
201
+ mapSeller(from) {
202
+ const contact = from;
203
+ if (contact.type === 'company') {
204
+ return {
205
+ name: contact.name || '',
206
+ tradingName: contact.tradingName,
207
+ identifier: contact.registrationDetails?.registrationId,
208
+ legalRegistrationIdentifier: contact.registrationDetails?.registrationId,
209
+ vatIdentifier: contact.registrationDetails?.vatId || contact.vatNumber,
210
+ taxRegistrationIdentifier: contact.taxId,
211
+ additionalLegalInfo: contact.description,
212
+ electronicAddress: contact.email || contact.contact?.email
213
+ };
214
+ }
215
+ else {
216
+ return {
217
+ name: contact.name || `${contact.firstName || ''} ${contact.lastName || ''}`.trim(),
218
+ identifier: contact.registrationDetails?.registrationId,
219
+ vatIdentifier: contact.registrationDetails?.vatId || contact.vatNumber,
220
+ electronicAddress: contact.email
221
+ };
222
+ }
223
+ }
224
+ /**
225
+ * Map buyer information
226
+ */
227
+ mapBuyer(to) {
228
+ const contact = to;
229
+ if (contact.type === 'company') {
230
+ return {
231
+ name: contact.name || '',
232
+ tradingName: contact.tradingName,
233
+ identifier: contact.registrationDetails?.registrationId,
234
+ legalRegistrationIdentifier: contact.registrationDetails?.registrationId,
235
+ vatIdentifier: contact.registrationDetails?.vatId || contact.vatNumber,
236
+ electronicAddress: contact.email || contact.contact?.email
237
+ };
238
+ }
239
+ else {
240
+ return {
241
+ name: contact.name || `${contact.firstName || ''} ${contact.lastName || ''}`.trim(),
242
+ identifier: contact.registrationDetails?.registrationId,
243
+ vatIdentifier: contact.registrationDetails?.vatId || contact.vatNumber,
244
+ electronicAddress: contact.email
245
+ };
246
+ }
247
+ }
248
+ /**
249
+ * Map address
250
+ */
251
+ mapAddress(party) {
252
+ const contact = party;
253
+ const address = {
254
+ countryCode: contact.address?.country || contact.country || ''
255
+ };
256
+ if (contact.address) {
257
+ if (typeof contact.address === 'string') {
258
+ const addressParts = contact.address.split(',').map((s) => s.trim());
259
+ address.addressLine1 = addressParts[0];
260
+ if (addressParts.length > 1)
261
+ address.addressLine2 = addressParts[1];
262
+ }
263
+ else if (typeof contact.address === 'object') {
264
+ address.addressLine1 = [contact.address.streetName, contact.address.houseNumber].filter(Boolean).join(' ');
265
+ address.city = contact.address.city;
266
+ address.postCode = contact.address.postalCode;
267
+ address.countryCode = contact.address.country || address.countryCode;
268
+ }
269
+ }
270
+ // Support both nested and flat structures
271
+ if (!address.city)
272
+ address.city = contact.city;
273
+ if (!address.postCode)
274
+ address.postCode = contact.postalCode;
275
+ return address;
276
+ }
277
+ /**
278
+ * Map contact information
279
+ */
280
+ mapContact(party) {
281
+ const contact = party;
282
+ if (contact.type === 'company' && contact.contact) {
283
+ return {
284
+ contactPoint: contact.contact.name,
285
+ telephoneNumber: contact.contact.phone,
286
+ emailAddress: contact.contact.email
287
+ };
288
+ }
289
+ else if (contact.type === 'person') {
290
+ return {
291
+ contactPoint: contact.name || `${contact.firstName || ''} ${contact.lastName || ''}`.trim(),
292
+ telephoneNumber: contact.phone,
293
+ emailAddress: contact.email
294
+ };
295
+ }
296
+ else if (contact.email || contact.phone) {
297
+ // Fallback for any contact with email or phone
298
+ return {
299
+ contactPoint: contact.name,
300
+ telephoneNumber: contact.phone,
301
+ emailAddress: contact.email
302
+ };
303
+ }
304
+ return undefined;
305
+ }
306
+ /**
307
+ * Map delivery information
308
+ */
309
+ mapDelivery(invoice) {
310
+ const delivery = invoice.metadata?.extensions?.delivery;
311
+ if (!delivery)
312
+ return undefined;
313
+ return {
314
+ name: delivery.name,
315
+ locationIdentifier: delivery.locationId,
316
+ actualDeliveryDate: delivery.actualDate,
317
+ deliveryAddress: delivery.address ? {
318
+ addressLine1: delivery.address.line1,
319
+ addressLine2: delivery.address.line2,
320
+ city: delivery.address.city,
321
+ postCode: delivery.address.postCode,
322
+ countryCode: delivery.address.countryCode
323
+ } : undefined
324
+ };
325
+ }
326
+ /**
327
+ * Map payment instructions
328
+ */
329
+ mapPaymentInstructions(invoice) {
330
+ const paymentMeans = invoice.metadata?.extensions?.paymentMeans;
331
+ const paymentAccount = invoice.metadata?.extensions?.paymentAccount;
332
+ return {
333
+ paymentMeansTypeCode: paymentMeans?.paymentMeansCode || '30', // Default to credit transfer
334
+ paymentMeansText: paymentMeans?.paymentMeansText,
335
+ remittanceInformation: paymentMeans?.remittanceInformation,
336
+ paymentAccountIdentifier: paymentAccount?.iban,
337
+ paymentAccountName: paymentAccount?.accountName,
338
+ paymentServiceProviderIdentifier: paymentAccount?.bic || paymentAccount?.institutionName
339
+ };
340
+ }
341
+ /**
342
+ * Map document totals
343
+ */
344
+ mapDocumentTotals(invoice) {
345
+ return {
346
+ lineExtensionAmount: invoice.totalNet,
347
+ taxExclusiveAmount: invoice.totalNet,
348
+ taxInclusiveAmount: invoice.totalGross,
349
+ allowanceTotalAmount: invoice.metadata?.extensions?.documentAllowances?.reduce((sum, a) => sum + a.amount, 0),
350
+ chargeTotalAmount: invoice.metadata?.extensions?.documentCharges?.reduce((sum, c) => sum + c.amount, 0),
351
+ prepaidAmount: invoice.metadata?.extensions?.prepaidAmount,
352
+ roundingAmount: invoice.metadata?.extensions?.roundingAmount,
353
+ payableAmount: invoice.totalGross
354
+ };
355
+ }
356
+ /**
357
+ * Map VAT breakdown
358
+ */
359
+ mapVATBreakdown(invoice) {
360
+ const taxDetails = invoice.metadata?.extensions?.taxDetails;
361
+ if (!taxDetails) {
362
+ // Create default VAT breakdown from invoice totals
363
+ if (invoice.totalVat > 0) {
364
+ return [{
365
+ vatCategoryTaxableAmount: invoice.totalNet,
366
+ vatCategoryTaxAmount: invoice.totalVat,
367
+ vatCategoryCode: 'S', // Standard rate
368
+ vatCategoryRate: (invoice.totalVat / invoice.totalNet) * 100
369
+ }];
370
+ }
371
+ return undefined;
372
+ }
373
+ return taxDetails;
374
+ }
375
+ /**
376
+ * Map invoice lines
377
+ */
378
+ mapInvoiceLines(items) {
379
+ if (!items)
380
+ return [];
381
+ return items.map((item, index) => ({
382
+ identifier: (index + 1).toString(),
383
+ note: item.description || item.text || '',
384
+ invoicedQuantity: item.unitQuantity,
385
+ invoicedQuantityUnitOfMeasureCode: item.unitType || 'C62',
386
+ lineExtensionAmount: item.unitNetPrice * item.unitQuantity,
387
+ purchaseOrderLineReference: item.purchaseOrderLineRef,
388
+ buyerAccountingReference: item.buyerAccountingRef,
389
+ period: item.period,
390
+ allowances: item.allowances,
391
+ charges: item.charges,
392
+ priceDetails: {
393
+ itemNetPrice: item.unitNetPrice,
394
+ itemPriceDiscount: item.priceDiscount,
395
+ itemGrossPrice: item.grossPrice,
396
+ itemPriceBaseQuantity: item.priceBaseQuantity || 1
397
+ },
398
+ vatInformation: {
399
+ categoryCode: this.mapVATCategory(item.vatPercentage),
400
+ rate: item.vatPercentage
401
+ },
402
+ itemInformation: {
403
+ name: item.name,
404
+ description: item.description || item.text || '',
405
+ sellersIdentifier: item.articleNumber,
406
+ buyersIdentifier: item.buyersItemId,
407
+ standardIdentifier: item.gtin || item.ean,
408
+ classificationIdentifier: item.unspsc,
409
+ originCountryCode: item.originCountry,
410
+ attributes: item.attributes
411
+ }
412
+ }));
413
+ }
414
+ /**
415
+ * Map VAT category from percentage
416
+ */
417
+ mapVATCategory(percentage) {
418
+ if (percentage === undefined || percentage === null)
419
+ return 'S';
420
+ if (percentage === 0)
421
+ return 'Z';
422
+ if (percentage > 0)
423
+ return 'S';
424
+ return 'E'; // Exempt
425
+ }
426
+ /**
427
+ * Reverse map seller
428
+ */
429
+ reverseMapSeller(seller) {
430
+ const isCompany = seller.legalRegistrationIdentifier || seller.tradingName;
431
+ return {
432
+ type: isCompany ? 'company' : 'person',
433
+ name: seller.name,
434
+ description: seller.additionalLegalInfo || '',
435
+ address: {
436
+ streetName: seller.postalAddress.addressLine1 || '',
437
+ houseNumber: '',
438
+ city: seller.postalAddress.city || '',
439
+ postalCode: seller.postalAddress.postCode || '',
440
+ country: seller.postalAddress.countryCode || ''
441
+ },
442
+ registrationDetails: {
443
+ vatId: seller.vatIdentifier || '',
444
+ registrationId: seller.identifier || seller.legalRegistrationIdentifier || '',
445
+ registrationName: seller.name
446
+ },
447
+ status: 'active',
448
+ foundedDate: {
449
+ year: new Date().getFullYear(),
450
+ month: new Date().getMonth() + 1,
451
+ day: new Date().getDate()
452
+ }
453
+ };
454
+ }
455
+ /**
456
+ * Reverse map buyer
457
+ */
458
+ reverseMapBuyer(buyer) {
459
+ const isCompany = buyer.legalRegistrationIdentifier || buyer.tradingName;
460
+ return {
461
+ type: isCompany ? 'company' : 'person',
462
+ name: buyer.name,
463
+ description: '',
464
+ address: {
465
+ streetName: buyer.postalAddress.addressLine1 || '',
466
+ houseNumber: '',
467
+ city: buyer.postalAddress.city || '',
468
+ postalCode: buyer.postalAddress.postCode || '',
469
+ country: buyer.postalAddress.countryCode || ''
470
+ },
471
+ registrationDetails: {
472
+ vatId: buyer.vatIdentifier || '',
473
+ registrationId: buyer.identifier || buyer.legalRegistrationIdentifier || '',
474
+ registrationName: buyer.name
475
+ },
476
+ status: 'active',
477
+ foundedDate: {
478
+ year: new Date().getFullYear(),
479
+ month: new Date().getMonth() + 1,
480
+ day: new Date().getDate()
481
+ }
482
+ };
483
+ }
484
+ /**
485
+ * Reverse map invoice lines
486
+ */
487
+ reverseMapInvoiceLines(lines) {
488
+ return lines.map((line, index) => ({
489
+ position: index + 1,
490
+ name: line.itemInformation.name,
491
+ description: line.itemInformation.description || '',
492
+ unitQuantity: line.invoicedQuantity,
493
+ unitType: line.invoicedQuantityUnitOfMeasureCode,
494
+ unitNetPrice: line.priceDetails.itemNetPrice,
495
+ vatPercentage: line.vatInformation.rate || 0,
496
+ articleNumber: line.itemInformation.sellersIdentifier || ''
497
+ }));
498
+ }
499
+ /**
500
+ * Validate semantic model completeness
501
+ */
502
+ validateSemanticModel(model) {
503
+ const errors = [];
504
+ // Check mandatory fields
505
+ if (!model.documentInformation.invoiceNumber) {
506
+ errors.push('BT-1: Invoice number is mandatory');
507
+ }
508
+ if (!model.documentInformation.issueDate) {
509
+ errors.push('BT-2: Invoice issue date is mandatory');
510
+ }
511
+ if (!model.documentInformation.typeCode) {
512
+ errors.push('BT-3: Invoice type code is mandatory');
513
+ }
514
+ if (!model.documentInformation.currencyCode) {
515
+ errors.push('BT-5: Invoice currency code is mandatory');
516
+ }
517
+ if (!model.seller?.name) {
518
+ errors.push('BT-27: Seller name is mandatory');
519
+ }
520
+ if (!model.seller?.postalAddress?.countryCode) {
521
+ errors.push('BT-40: Seller country code is mandatory');
522
+ }
523
+ if (!model.buyer?.name) {
524
+ errors.push('BT-44: Buyer name is mandatory');
525
+ }
526
+ if (!model.buyer?.postalAddress?.countryCode) {
527
+ errors.push('BT-55: Buyer country code is mandatory');
528
+ }
529
+ if (!model.documentTotals) {
530
+ errors.push('BG-22: Document totals are mandatory');
531
+ }
532
+ if (!model.invoiceLines || model.invoiceLines.length === 0) {
533
+ errors.push('BG-25: At least one invoice line is mandatory');
534
+ }
535
+ return errors;
536
+ }
537
+ }
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMuYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvc2VtYW50aWMvc2VtYW50aWMuYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFvQjdDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUFpQjtRQUN0QyxPQUFPO1lBQ0wsNEJBQTRCO1lBQzVCLG1CQUFtQixFQUFFO2dCQUNuQixhQUFhLEVBQUUsT0FBTyxDQUFDLGVBQWU7Z0JBQ3RDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO2dCQUN4RCxZQUFZLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzlCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNoRTtZQUVELG1CQUFtQjtZQUNuQixjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxpQkFBaUI7Z0JBQ3BFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUzthQUNwRCxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBRWIsYUFBYTtZQUNiLFVBQVUsRUFBRTtnQkFDVixjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjO2dCQUNoRCxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0I7Z0JBQ2hFLGlC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
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Semantic Model Validator
3
+ * Validates invoices against EN16931 Business Terms and Business Groups
4
+ */
5
+ import type { ValidationResult } from '../validation/validation.types.js';
6
+ import type { EN16931SemanticModel } from './bt-bg.model.js';
7
+ import type { EInvoice } from '../../einvoice.js';
8
+ /**
9
+ * Semantic Model Validator
10
+ * Validates against all EN16931 Business Terms (BT) and Business Groups (BG)
11
+ */
12
+ export declare class SemanticModelValidator {
13
+ private adapter;
14
+ private btRules;
15
+ constructor();
16
+ /**
17
+ * Validate an invoice using the semantic model
18
+ */
19
+ validate(invoice: EInvoice): ValidationResult[];
20
+ /**
21
+ * Initialize Business Term validation rules
22
+ */
23
+ private initializeBusinessTermRules;
24
+ /**
25
+ * Validate Business Groups
26
+ */
27
+ private validateBusinessGroups;
28
+ /**
29
+ * Validate cardinality constraints
30
+ */
31
+ private validateCardinality;
32
+ /**
33
+ * Validate conditional rules
34
+ */
35
+ private validateConditionalRules;
36
+ /**
37
+ * Get semantic model from invoice
38
+ */
39
+ getSemanticModel(invoice: EInvoice): EN16931SemanticModel;
40
+ /**
41
+ * Create invoice from semantic model
42
+ */
43
+ createInvoice(model: EN16931SemanticModel): EInvoice;
44
+ /**
45
+ * Get BT/BG mapping for an invoice
46
+ */
47
+ getBusinessTermMapping(invoice: EInvoice): Map<string, any>;
48
+ }