@fin.cx/einvoice 5.0.3 → 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.
- 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/package.json +9 -3
- 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
|
@@ -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
|
+
}
|