@fin.cx/einvoice 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.decoder.d.ts +40 -0
- package/dist_ts/classes.decoder.js +320 -0
- package/dist_ts/classes.encoder.d.ts +51 -0
- package/dist_ts/classes.encoder.js +293 -0
- package/dist_ts/classes.xinvoice.d.ts +136 -0
- package/dist_ts/classes.xinvoice.js +352 -0
- package/dist_ts/einvoice.d.ts +217 -0
- package/dist_ts/einvoice.js +505 -0
- package/dist_ts/errors.d.ts +121 -0
- package/dist_ts/errors.js +241 -0
- package/dist_ts/formats/base/base.decoder.d.ts +32 -0
- package/dist_ts/formats/base/base.decoder.js +52 -0
- package/dist_ts/formats/base/base.encoder.d.ts +13 -0
- package/dist_ts/formats/base/base.encoder.js +7 -0
- package/dist_ts/formats/base/base.validator.d.ts +44 -0
- package/dist_ts/formats/base/base.validator.js +39 -0
- package/dist_ts/formats/base.decoder.d.ts +19 -0
- package/dist_ts/formats/base.decoder.js +130 -0
- package/dist_ts/formats/base.validator.d.ts +44 -0
- package/dist_ts/formats/base.validator.js +39 -0
- package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
- package/dist_ts/formats/cii/cii.decoder.js +111 -0
- package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
- package/dist_ts/formats/cii/cii.encoder.js +48 -0
- package/dist_ts/formats/cii/cii.types.d.ts +31 -0
- package/dist_ts/formats/cii/cii.types.js +40 -0
- package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
- package/dist_ts/formats/cii/cii.validator.js +146 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
- package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
- package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
- package/dist_ts/formats/decoder.factory.d.ts +15 -0
- package/dist_ts/formats/decoder.factory.js +46 -0
- package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
- package/dist_ts/formats/factories/decoder.factory.js +56 -0
- package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
- package/dist_ts/formats/factories/encoder.factory.js +40 -0
- package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
- package/dist_ts/formats/factories/validator.factory.js +110 -0
- package/dist_ts/formats/factorx.decoder.d.ts +18 -0
- package/dist_ts/formats/factorx.decoder.js +178 -0
- package/dist_ts/formats/factorx.encoder.d.ts +51 -0
- package/dist_ts/formats/factorx.encoder.js +293 -0
- package/dist_ts/formats/facturx.decoder.d.ts +18 -0
- package/dist_ts/formats/facturx.decoder.js +210 -0
- package/dist_ts/formats/facturx.encoder.d.ts +51 -0
- package/dist_ts/formats/facturx.encoder.js +293 -0
- package/dist_ts/formats/facturx.validator.d.ts +67 -0
- package/dist_ts/formats/facturx.validator.js +266 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
- package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
- package/dist_ts/formats/pdf/extractors/index.js +5 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
- package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
- package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
- package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
- package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
- package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
- package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
- package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
- package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
- package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
- package/dist_ts/formats/ubl/ubl.types.js +21 -0
- package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
- package/dist_ts/formats/ubl/ubl.validator.js +112 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
- package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
- package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
- package/dist_ts/formats/ubl.validator.d.ts +82 -0
- package/dist_ts/formats/ubl.validator.js +306 -0
- package/dist_ts/formats/utils/format.detector.d.ts +62 -0
- package/dist_ts/formats/utils/format.detector.js +249 -0
- package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
- package/dist_ts/formats/validation/en16931.validator.js +119 -0
- package/dist_ts/formats/validator.factory.d.ts +18 -0
- package/dist_ts/formats/validator.factory.js +78 -0
- package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
- package/dist_ts/formats/xinvoice.decoder.js +332 -0
- package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
- package/dist_ts/formats/xinvoice.encoder.js +282 -0
- package/dist_ts/index.d.ts +51 -0
- package/dist_ts/index.js +90 -0
- package/dist_ts/interfaces/common.d.ts +79 -0
- package/dist_ts/interfaces/common.js +24 -0
- package/dist_ts/interfaces.d.ts +87 -0
- package/dist_ts/interfaces.js +23 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +31 -0
- package/npmextra.json +35 -0
- package/package.json +71 -0
- package/readme.hints.md +1107 -0
- package/readme.howtofixtests.md +38 -0
- package/readme.literature.md +1 -0
- package/readme.md +998 -0
- package/readme.plan.md +481 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/einvoice.ts +603 -0
- package/ts/errors.ts +341 -0
- package/ts/formats/base/base.decoder.ts +68 -0
- package/ts/formats/base/base.encoder.ts +14 -0
- package/ts/formats/base/base.validator.ts +64 -0
- package/ts/formats/cii/cii.decoder.ts +139 -0
- package/ts/formats/cii/cii.encoder.ts +64 -0
- package/ts/formats/cii/cii.types.ts +44 -0
- package/ts/formats/cii/cii.validator.ts +171 -0
- package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
- package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
- package/ts/formats/cii/facturx/facturx.types.ts +18 -0
- package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
- package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
- package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
- package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
- package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
- package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
- package/ts/formats/factories/decoder.factory.ts +62 -0
- package/ts/formats/factories/encoder.factory.ts +47 -0
- package/ts/formats/factories/validator.factory.ts +134 -0
- package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
- package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
- package/ts/formats/pdf/extractors/index.ts +4 -0
- package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
- package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
- package/ts/formats/pdf/pdf.embedder.ts +242 -0
- package/ts/formats/pdf/pdf.extractor.ts +141 -0
- package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
- package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
- package/ts/formats/ubl/ubl.decoder.ts +121 -0
- package/ts/formats/ubl/ubl.encoder.ts +63 -0
- package/ts/formats/ubl/ubl.types.ts +22 -0
- package/ts/formats/ubl/ubl.validator.ts +133 -0
- package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
- package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
- package/ts/formats/ubl/xrechnung.validator.ts +185 -0
- package/ts/formats/utils/format.detector.ts +306 -0
- package/ts/formats/validation/en16931.validator.ts +135 -0
- package/ts/index.ts +164 -0
- package/ts/interfaces/common.ts +90 -0
- package/ts/interfaces.ts +98 -0
- package/ts/plugins.ts +61 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CIIBaseDecoder } from '../cii.decoder.js';
|
|
2
|
+
import type { TCreditNote, TDebitNote } from '../../../interfaces/common.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decoder for ZUGFeRD v1 invoice format
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZUGFeRDV1Decoder extends CIIBaseDecoder {
|
|
7
|
+
/**
|
|
8
|
+
* Constructor
|
|
9
|
+
* @param xml XML string to decode
|
|
10
|
+
* @param skipValidation Whether to skip EN16931 validation
|
|
11
|
+
*/
|
|
12
|
+
constructor(xml: string, skipValidation?: boolean);
|
|
13
|
+
/**
|
|
14
|
+
* Decodes a ZUGFeRD v1 credit note
|
|
15
|
+
* @returns Promise resolving to a TCreditNote object
|
|
16
|
+
*/
|
|
17
|
+
protected decodeCreditNote(): Promise<TCreditNote>;
|
|
18
|
+
/**
|
|
19
|
+
* Decodes a ZUGFeRD v1 debit note (invoice)
|
|
20
|
+
* @returns Promise resolving to a TDebitNote object
|
|
21
|
+
*/
|
|
22
|
+
protected decodeDebitNote(): Promise<TDebitNote>;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts common invoice data from ZUGFeRD v1 XML
|
|
25
|
+
* @returns Common invoice data
|
|
26
|
+
*/
|
|
27
|
+
private extractCommonData;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts party information from ZUGFeRD v1 XML
|
|
30
|
+
* @param partyXPath XPath to the party node
|
|
31
|
+
* @returns Party information as TContact
|
|
32
|
+
*/
|
|
33
|
+
private extractParty;
|
|
34
|
+
/**
|
|
35
|
+
* Extracts invoice items from ZUGFeRD v1 XML
|
|
36
|
+
* @returns Array of invoice items
|
|
37
|
+
*/
|
|
38
|
+
private extractItems;
|
|
39
|
+
/**
|
|
40
|
+
* Extracts notes from ZUGFeRD v1 XML
|
|
41
|
+
* @returns Array of notes
|
|
42
|
+
*/
|
|
43
|
+
private extractNotes;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a default date for empty date fields
|
|
46
|
+
* @returns Default date object compatible with TContact
|
|
47
|
+
*/
|
|
48
|
+
private createDefaultDate;
|
|
49
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { CIIBaseDecoder } from '../cii.decoder.js';
|
|
2
|
+
import { ZUGFERD_V1_NAMESPACES } from '../cii.types.js';
|
|
3
|
+
import { business, finance } from '../../../plugins.js';
|
|
4
|
+
import { EN16931Validator } from '../../validation/en16931.validator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Decoder for ZUGFeRD v1 invoice format
|
|
7
|
+
*/
|
|
8
|
+
export class ZUGFeRDV1Decoder extends CIIBaseDecoder {
|
|
9
|
+
/**
|
|
10
|
+
* Constructor
|
|
11
|
+
* @param xml XML string to decode
|
|
12
|
+
* @param skipValidation Whether to skip EN16931 validation
|
|
13
|
+
*/
|
|
14
|
+
constructor(xml, skipValidation = false) {
|
|
15
|
+
super(xml, skipValidation);
|
|
16
|
+
// Override namespaces for ZUGFeRD v1
|
|
17
|
+
this.namespaces = {
|
|
18
|
+
rsm: ZUGFERD_V1_NAMESPACES.RSM,
|
|
19
|
+
ram: ZUGFERD_V1_NAMESPACES.RAM,
|
|
20
|
+
udt: ZUGFERD_V1_NAMESPACES.UDT
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Decodes a ZUGFeRD v1 credit note
|
|
25
|
+
* @returns Promise resolving to a TCreditNote object
|
|
26
|
+
*/
|
|
27
|
+
async decodeCreditNote() {
|
|
28
|
+
// Get common invoice data
|
|
29
|
+
const commonData = await this.extractCommonData();
|
|
30
|
+
// Create a credit note with the common data
|
|
31
|
+
return {
|
|
32
|
+
...commonData,
|
|
33
|
+
accountingDocType: 'creditnote'
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decodes a ZUGFeRD v1 debit note (invoice)
|
|
38
|
+
* @returns Promise resolving to a TDebitNote object
|
|
39
|
+
*/
|
|
40
|
+
async decodeDebitNote() {
|
|
41
|
+
// Get common invoice data
|
|
42
|
+
const commonData = await this.extractCommonData();
|
|
43
|
+
// Create a debit note with the common data
|
|
44
|
+
return {
|
|
45
|
+
...commonData,
|
|
46
|
+
accountingDocType: 'debitnote'
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extracts common invoice data from ZUGFeRD v1 XML
|
|
51
|
+
* @returns Common invoice data
|
|
52
|
+
*/
|
|
53
|
+
async extractCommonData() {
|
|
54
|
+
// Extract invoice ID
|
|
55
|
+
const invoiceId = this.getText('//ram:ID');
|
|
56
|
+
// Extract issue date
|
|
57
|
+
const issueDateStr = this.getText('//ram:IssueDateTime/udt:DateTimeString');
|
|
58
|
+
const issueDateFormat = this.getText('//ram:IssueDateTime/udt:DateTimeString/@format');
|
|
59
|
+
const issueDate = this.parseCIIDate(issueDateStr, issueDateFormat);
|
|
60
|
+
// Extract seller information
|
|
61
|
+
const seller = this.extractParty('//ram:SellerTradeParty');
|
|
62
|
+
// Extract buyer information
|
|
63
|
+
const buyer = this.extractParty('//ram:BuyerTradeParty');
|
|
64
|
+
// Extract items
|
|
65
|
+
const items = this.extractItems();
|
|
66
|
+
// Extract due date
|
|
67
|
+
const dueDateStr = this.getText('//ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString');
|
|
68
|
+
const dueDate = dueDateStr ? new Date(dueDateStr).getTime() : Date.now();
|
|
69
|
+
const dueInDays = Math.round((dueDate - issueDate) / (1000 * 60 * 60 * 24));
|
|
70
|
+
// Extract currency
|
|
71
|
+
const currencyCode = this.getText('//ram:InvoiceCurrencyCode') || 'EUR';
|
|
72
|
+
// Extract total amount (not used in this implementation but could be useful)
|
|
73
|
+
// const totalAmount = this.getNumber('//ram:GrandTotalAmount');
|
|
74
|
+
// Extract notes
|
|
75
|
+
const allNotes = this.extractNotes();
|
|
76
|
+
// Extract subject and notes separately
|
|
77
|
+
// If we have notes, the first one might be the subject
|
|
78
|
+
let subject = `Invoice ${invoiceId}`;
|
|
79
|
+
let notes = [...allNotes];
|
|
80
|
+
// If the first note doesn't look like a payment term or other standard note,
|
|
81
|
+
// treat it as the subject
|
|
82
|
+
if (allNotes.length > 0 && !allNotes[0].toLowerCase().includes('due in') &&
|
|
83
|
+
!allNotes[0].toLowerCase().includes('payment')) {
|
|
84
|
+
subject = allNotes[0];
|
|
85
|
+
notes = allNotes.slice(1); // Remove subject from notes
|
|
86
|
+
}
|
|
87
|
+
// Check for reverse charge
|
|
88
|
+
const reverseCharge = this.exists('//ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode[text()="62"]');
|
|
89
|
+
// Create the common invoice data
|
|
90
|
+
const invoiceData = {
|
|
91
|
+
type: 'accounting-doc',
|
|
92
|
+
accountingDocType: 'invoice',
|
|
93
|
+
id: invoiceId,
|
|
94
|
+
accountingDocId: invoiceId,
|
|
95
|
+
date: issueDate,
|
|
96
|
+
accountingDocStatus: 'issued',
|
|
97
|
+
versionInfo: {
|
|
98
|
+
type: 'final',
|
|
99
|
+
version: '1.0.0'
|
|
100
|
+
},
|
|
101
|
+
language: 'en',
|
|
102
|
+
incidenceId: invoiceId,
|
|
103
|
+
from: seller,
|
|
104
|
+
to: buyer,
|
|
105
|
+
subject: subject,
|
|
106
|
+
items: items,
|
|
107
|
+
dueInDays: dueInDays,
|
|
108
|
+
reverseCharge: reverseCharge,
|
|
109
|
+
currency: currencyCode,
|
|
110
|
+
notes: notes,
|
|
111
|
+
deliveryDate: issueDate,
|
|
112
|
+
objectActions: []
|
|
113
|
+
};
|
|
114
|
+
return invoiceData;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extracts party information from ZUGFeRD v1 XML
|
|
118
|
+
* @param partyXPath XPath to the party node
|
|
119
|
+
* @returns Party information as TContact
|
|
120
|
+
*/
|
|
121
|
+
extractParty(partyXPath) {
|
|
122
|
+
// Extract name
|
|
123
|
+
const name = this.getText(`${partyXPath}/ram:Name`);
|
|
124
|
+
// Extract address
|
|
125
|
+
const streetName = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:LineOne`);
|
|
126
|
+
const city = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:CityName`);
|
|
127
|
+
const postalCode = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:PostcodeCode`);
|
|
128
|
+
const country = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:CountryID`);
|
|
129
|
+
// Try to extract house number from street if possible
|
|
130
|
+
let houseNumber = '';
|
|
131
|
+
const streetParts = streetName.match(/^(.*?)\s+(\d+.*)$/);
|
|
132
|
+
if (streetParts) {
|
|
133
|
+
// If we can split into street name and house number
|
|
134
|
+
houseNumber = streetParts[2];
|
|
135
|
+
}
|
|
136
|
+
// Create address object
|
|
137
|
+
const address = {
|
|
138
|
+
streetName: streetName,
|
|
139
|
+
houseNumber: houseNumber,
|
|
140
|
+
city: city,
|
|
141
|
+
postalCode: postalCode,
|
|
142
|
+
countryCode: country
|
|
143
|
+
};
|
|
144
|
+
// Extract VAT ID
|
|
145
|
+
const vatId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]`) || '';
|
|
146
|
+
// Extract registration ID
|
|
147
|
+
const registrationId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) || '';
|
|
148
|
+
// Create contact object
|
|
149
|
+
return {
|
|
150
|
+
type: 'company',
|
|
151
|
+
name: name,
|
|
152
|
+
description: '',
|
|
153
|
+
address: address,
|
|
154
|
+
status: 'active',
|
|
155
|
+
foundedDate: this.createDefaultDate(),
|
|
156
|
+
registrationDetails: {
|
|
157
|
+
vatId: vatId,
|
|
158
|
+
registrationId: registrationId,
|
|
159
|
+
registrationName: ''
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Extracts invoice items from ZUGFeRD v1 XML
|
|
165
|
+
* @returns Array of invoice items
|
|
166
|
+
*/
|
|
167
|
+
extractItems() {
|
|
168
|
+
const items = [];
|
|
169
|
+
// Get all item nodes
|
|
170
|
+
const itemNodes = this.select('//ram:IncludedSupplyChainTradeLineItem', this.doc);
|
|
171
|
+
// Process each item
|
|
172
|
+
if (Array.isArray(itemNodes)) {
|
|
173
|
+
for (let i = 0; i < itemNodes.length; i++) {
|
|
174
|
+
const itemNode = itemNodes[i];
|
|
175
|
+
// Extract item data
|
|
176
|
+
const name = this.getText('ram:SpecifiedTradeProduct/ram:Name', itemNode);
|
|
177
|
+
const articleNumber = this.getText('ram:SpecifiedTradeProduct/ram:SellerAssignedID', itemNode);
|
|
178
|
+
const unitQuantity = this.getNumber('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity', itemNode);
|
|
179
|
+
const unitType = this.getText('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity/@unitCode', itemNode) || 'EA';
|
|
180
|
+
const unitNetPrice = this.getNumber('ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:ChargeAmount', itemNode);
|
|
181
|
+
const vatPercentage = this.getNumber('ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent', itemNode);
|
|
182
|
+
// Create item object
|
|
183
|
+
items.push({
|
|
184
|
+
position: i + 1,
|
|
185
|
+
name: name,
|
|
186
|
+
articleNumber: articleNumber,
|
|
187
|
+
unitType: unitType,
|
|
188
|
+
unitQuantity: unitQuantity,
|
|
189
|
+
unitNetPrice: unitNetPrice,
|
|
190
|
+
vatPercentage: vatPercentage
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return items;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Extracts notes from ZUGFeRD v1 XML
|
|
198
|
+
* @returns Array of notes
|
|
199
|
+
*/
|
|
200
|
+
extractNotes() {
|
|
201
|
+
const notes = [];
|
|
202
|
+
// Get all note nodes
|
|
203
|
+
const noteNodes = this.select('//ram:IncludedNote', this.doc);
|
|
204
|
+
// Process each note
|
|
205
|
+
if (Array.isArray(noteNodes)) {
|
|
206
|
+
for (let i = 0; i < noteNodes.length; i++) {
|
|
207
|
+
const noteNode = noteNodes[i];
|
|
208
|
+
const noteText = this.getText('ram:Content', noteNode);
|
|
209
|
+
if (noteText) {
|
|
210
|
+
notes.push(noteText);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return notes;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Creates a default date for empty date fields
|
|
218
|
+
* @returns Default date object compatible with TContact
|
|
219
|
+
*/
|
|
220
|
+
createDefaultDate() {
|
|
221
|
+
// Create a date object that will be compatible with TContact
|
|
222
|
+
return {
|
|
223
|
+
year: 2000,
|
|
224
|
+
month: 1,
|
|
225
|
+
day: 1
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVnZmVyZC52MS5kZWNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZm9ybWF0cy9jaWkvenVnZmVyZC96dWdmZXJkLnYxLmRlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFekU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsY0FBYztJQUNsRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFXLEVBQUUsaUJBQTBCLEtBQUs7UUFDdEQsS0FBSyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMzQixxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztZQUM5QixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztZQUM5QixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsMEJBQTBCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFbEQsNENBQTRDO1FBQzVDLE9BQU87WUFDTCxHQUFHLFVBQVU7WUFDYixpQkFBaUIsRUFBRSxZQUFxQjtTQUNmLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxlQUFlO1FBQzdCLDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIs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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CIIBaseValidator } from '../cii.validator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validator for ZUGFeRD invoice format
|
|
4
|
+
*/
|
|
5
|
+
export declare class ZUGFeRDValidator extends CIIBaseValidator {
|
|
6
|
+
/**
|
|
7
|
+
* Validates ZUGFeRD XML structure
|
|
8
|
+
* @returns True if structure validation passed
|
|
9
|
+
*/
|
|
10
|
+
protected validateStructure(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Validates ZUGFeRD XML against business rules
|
|
13
|
+
* @returns True if business validation passed
|
|
14
|
+
*/
|
|
15
|
+
protected validateBusinessRules(): boolean;
|
|
16
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CIIBaseValidator } from '../cii.validator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validator for ZUGFeRD invoice format
|
|
4
|
+
*/
|
|
5
|
+
export class ZUGFeRDValidator extends CIIBaseValidator {
|
|
6
|
+
/**
|
|
7
|
+
* Validates ZUGFeRD XML structure
|
|
8
|
+
* @returns True if structure validation passed
|
|
9
|
+
*/
|
|
10
|
+
validateStructure() {
|
|
11
|
+
// Check for required elements in ZUGFeRD structure
|
|
12
|
+
const invoiceId = this.getText('//rsm:ExchangedDocument/ram:ID');
|
|
13
|
+
if (!invoiceId) {
|
|
14
|
+
this.addError('ZUGFERD-STRUCT-1', 'Invoice ID is required', '//rsm:ExchangedDocument/ram:ID');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validates ZUGFeRD XML against business rules
|
|
21
|
+
* @returns True if business validation passed
|
|
22
|
+
*/
|
|
23
|
+
validateBusinessRules() {
|
|
24
|
+
// Implement ZUGFeRD-specific business rules
|
|
25
|
+
// For now, we'll just use the base CII validation
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVnZmVyZC52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9mb3JtYXRzL2NpaS96dWdmZXJkL3p1Z2ZlcmQudmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGdCQUFnQjtJQUNwRDs7O09BR0c7SUFDTyxpQkFBaUI7UUFDekIsbURBQW1EO1FBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLGdDQUFnQyxDQUFDLENBQUM7WUFDOUYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08scUJBQXFCO1FBQzdCLDRDQUE0QztRQUM1QyxrREFBa0Q7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseDecoder } from './base.decoder.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory class for creating the appropriate decoder based on XML format.
|
|
4
|
+
* Analyzes XML content and returns the best decoder for the given format.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DecoderFactory {
|
|
7
|
+
/**
|
|
8
|
+
* Creates a decoder for the given XML content
|
|
9
|
+
*/
|
|
10
|
+
static createDecoder(xmlString: string): BaseDecoder;
|
|
11
|
+
/**
|
|
12
|
+
* Detects the XML invoice format using string pattern matching
|
|
13
|
+
*/
|
|
14
|
+
private static detectFormat;
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BaseDecoder } from './base.decoder.js';
|
|
2
|
+
import { FacturXDecoder } from './facturx.decoder.js';
|
|
3
|
+
import { XInvoiceDecoder } from './xinvoice.decoder.js';
|
|
4
|
+
/**
|
|
5
|
+
* Factory class for creating the appropriate decoder based on XML format.
|
|
6
|
+
* Analyzes XML content and returns the best decoder for the given format.
|
|
7
|
+
*/
|
|
8
|
+
export class DecoderFactory {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a decoder for the given XML content
|
|
11
|
+
*/
|
|
12
|
+
static createDecoder(xmlString) {
|
|
13
|
+
if (!xmlString) {
|
|
14
|
+
throw new Error('No XML string provided for decoder selection');
|
|
15
|
+
}
|
|
16
|
+
const format = DecoderFactory.detectFormat(xmlString);
|
|
17
|
+
switch (format) {
|
|
18
|
+
case 'XInvoice/UBL':
|
|
19
|
+
return new XInvoiceDecoder(xmlString);
|
|
20
|
+
case 'FacturX/ZUGFeRD':
|
|
21
|
+
default:
|
|
22
|
+
// Default to FacturX/ZUGFeRD decoder
|
|
23
|
+
return new FacturXDecoder(xmlString);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Detects the XML invoice format using string pattern matching
|
|
28
|
+
*/
|
|
29
|
+
static detectFormat(xmlString) {
|
|
30
|
+
// XInvoice/UBL format
|
|
31
|
+
if (xmlString.includes('oasis:names:specification:ubl') ||
|
|
32
|
+
xmlString.includes('Invoice xmlns') ||
|
|
33
|
+
xmlString.includes('xrechnung')) {
|
|
34
|
+
return 'XInvoice/UBL';
|
|
35
|
+
}
|
|
36
|
+
// ZUGFeRD/Factur-X (CII format)
|
|
37
|
+
if (xmlString.includes('CrossIndustryInvoice') ||
|
|
38
|
+
xmlString.includes('un/cefact') ||
|
|
39
|
+
xmlString.includes('rsm:')) {
|
|
40
|
+
return 'FacturX/ZUGFeRD';
|
|
41
|
+
}
|
|
42
|
+
// Default to FacturX/ZUGFeRD
|
|
43
|
+
return 'FacturX/ZUGFeRD';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9kZWNvZGVyLmZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxjQUFjO2dCQUNqQixPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXhDLEtBQUssaUJBQWlCLENBQUM7WUFDdkI7Z0JBQ0UscUNBQXFDO2dCQUNyQyxPQUFPLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQWlCO1FBQzNDLHNCQUFzQjtRQUN0QixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7WUFDbkQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDbkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseDecoder } from '../base/base.decoder.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory to create the appropriate decoder based on the XML format
|
|
4
|
+
*/
|
|
5
|
+
export declare class DecoderFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a decoder for the specified XML content
|
|
8
|
+
* @param xml XML content to decode
|
|
9
|
+
* @param skipValidation Whether to skip EN16931 validation
|
|
10
|
+
* @returns Appropriate decoder instance
|
|
11
|
+
*/
|
|
12
|
+
static createDecoder(xml: string, skipValidation?: boolean): BaseDecoder;
|
|
13
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BaseDecoder } from '../base/base.decoder.js';
|
|
2
|
+
import { InvoiceFormat } from '../../interfaces/common.js';
|
|
3
|
+
import { FormatDetector } from '../utils/format.detector.js';
|
|
4
|
+
// Import specific decoders
|
|
5
|
+
import { XRechnungDecoder } from '../ubl/xrechnung/xrechnung.decoder.js';
|
|
6
|
+
import { FacturXDecoder } from '../cii/facturx/facturx.decoder.js';
|
|
7
|
+
import { ZUGFeRDDecoder } from '../cii/zugferd/zugferd.decoder.js';
|
|
8
|
+
import { ZUGFeRDV1Decoder } from '../cii/zugferd/zugferd.v1.decoder.js';
|
|
9
|
+
/**
|
|
10
|
+
* Factory to create the appropriate decoder based on the XML format
|
|
11
|
+
*/
|
|
12
|
+
export class DecoderFactory {
|
|
13
|
+
/**
|
|
14
|
+
* Creates a decoder for the specified XML content
|
|
15
|
+
* @param xml XML content to decode
|
|
16
|
+
* @param skipValidation Whether to skip EN16931 validation
|
|
17
|
+
* @returns Appropriate decoder instance
|
|
18
|
+
*/
|
|
19
|
+
static createDecoder(xml, skipValidation = false) {
|
|
20
|
+
const format = FormatDetector.detectFormat(xml);
|
|
21
|
+
switch (format) {
|
|
22
|
+
case InvoiceFormat.UBL:
|
|
23
|
+
case InvoiceFormat.XRECHNUNG:
|
|
24
|
+
return new XRechnungDecoder(xml, skipValidation);
|
|
25
|
+
case InvoiceFormat.CII:
|
|
26
|
+
// For now, use Factur-X decoder for generic CII
|
|
27
|
+
return new FacturXDecoder(xml, skipValidation);
|
|
28
|
+
case InvoiceFormat.ZUGFERD:
|
|
29
|
+
// Determine if it's ZUGFeRD v1 or v2 based on root element
|
|
30
|
+
if (xml.includes('CrossIndustryDocument') ||
|
|
31
|
+
xml.includes('urn:ferd:CrossIndustryDocument:invoice:1p0') ||
|
|
32
|
+
(xml.includes('ZUGFeRD') && !xml.includes('CrossIndustryInvoice'))) {
|
|
33
|
+
return new ZUGFeRDV1Decoder(xml, skipValidation);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return new ZUGFeRDDecoder(xml, skipValidation);
|
|
37
|
+
}
|
|
38
|
+
case InvoiceFormat.FACTURX:
|
|
39
|
+
return new FacturXDecoder(xml, skipValidation);
|
|
40
|
+
case InvoiceFormat.FATTURAPA:
|
|
41
|
+
// return new FatturaPADecoder(xml);
|
|
42
|
+
throw new Error('FatturaPA decoder not yet implemented');
|
|
43
|
+
default:
|
|
44
|
+
// If format is unknown but contains CrossIndustryInvoice, try ZUGFeRD decoder
|
|
45
|
+
if (xml.includes('CrossIndustryInvoice')) {
|
|
46
|
+
return new ZUGFeRDDecoder(xml, skipValidation);
|
|
47
|
+
}
|
|
48
|
+
// If format is unknown but contains CrossIndustryDocument, try ZUGFeRD v1 decoder
|
|
49
|
+
if (xml.includes('CrossIndustryDocument')) {
|
|
50
|
+
return new ZUGFeRDV1Decoder(xml, skipValidation);
|
|
51
|
+
}
|
|
52
|
+
throw new Error(`Unsupported invoice format: ${format}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3JpZXMvZGVjb2Rlci5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXhFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVcsRUFBRSxpQkFBMEIsS0FBSztRQUN0RSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhELFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxhQUFhLENBQUMsU0FBUztnQkFDMUIsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVuRCxLQUFLLGFBQWEsQ0FBQyxHQUFHO2dCQUNwQixnREFBZ0Q7Z0JBQ2hELE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRWpELEtBQUssYUFBYSxDQUFDLE9BQU87Z0JBQ3hCLDJEQUEyRDtnQkFDM0QsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO29CQUNyQyxHQUFHLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDO29CQUMxRCxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2RSxPQUFPLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFFSCxLQUFLLGFBQWEsQ0FBQyxPQUFPO2dCQUN4QixPQUFPLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVqRCxLQUFLLGFBQWEsQ0FBQyxTQUFTO2dCQUMxQixvQ0FBb0M7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUUzRDtnQkFDRSw4RUFBOEU7Z0JBQzlFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELGtGQUFrRjtnQkFDbEYsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseEncoder } from '../base/base.encoder.js';
|
|
2
|
+
import { InvoiceFormat } from '../../interfaces/common.js';
|
|
3
|
+
import type { ExportFormat } from '../../interfaces/common.js';
|
|
4
|
+
/**
|
|
5
|
+
* Factory to create the appropriate encoder based on the target format
|
|
6
|
+
*/
|
|
7
|
+
export declare class EncoderFactory {
|
|
8
|
+
/**
|
|
9
|
+
* Creates an encoder for the specified format
|
|
10
|
+
* @param format Target format for encoding
|
|
11
|
+
* @returns Appropriate encoder instance
|
|
12
|
+
*/
|
|
13
|
+
static createEncoder(format: ExportFormat | InvoiceFormat): BaseEncoder;
|
|
14
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BaseEncoder } from '../base/base.encoder.js';
|
|
2
|
+
import { InvoiceFormat } from '../../interfaces/common.js';
|
|
3
|
+
// Import specific encoders
|
|
4
|
+
import { UBLEncoder } from '../ubl/generic/ubl.encoder.js';
|
|
5
|
+
import { XRechnungEncoder } from '../ubl/xrechnung/xrechnung.encoder.js';
|
|
6
|
+
import { FacturXEncoder } from '../cii/facturx/facturx.encoder.js';
|
|
7
|
+
import { ZUGFeRDEncoder } from '../cii/zugferd/zugferd.encoder.js';
|
|
8
|
+
/**
|
|
9
|
+
* Factory to create the appropriate encoder based on the target format
|
|
10
|
+
*/
|
|
11
|
+
export class EncoderFactory {
|
|
12
|
+
/**
|
|
13
|
+
* Creates an encoder for the specified format
|
|
14
|
+
* @param format Target format for encoding
|
|
15
|
+
* @returns Appropriate encoder instance
|
|
16
|
+
*/
|
|
17
|
+
static createEncoder(format) {
|
|
18
|
+
switch (format.toLowerCase()) {
|
|
19
|
+
case InvoiceFormat.UBL:
|
|
20
|
+
case 'ubl':
|
|
21
|
+
return new UBLEncoder();
|
|
22
|
+
case InvoiceFormat.XRECHNUNG:
|
|
23
|
+
case 'xrechnung':
|
|
24
|
+
return new XRechnungEncoder();
|
|
25
|
+
case InvoiceFormat.CII:
|
|
26
|
+
// For now, use Factur-X encoder for generic CII
|
|
27
|
+
return new FacturXEncoder();
|
|
28
|
+
case InvoiceFormat.ZUGFERD:
|
|
29
|
+
case 'zugferd':
|
|
30
|
+
// Use dedicated ZUGFeRD encoder
|
|
31
|
+
return new ZUGFeRDEncoder();
|
|
32
|
+
case InvoiceFormat.FACTURX:
|
|
33
|
+
case 'facturx':
|
|
34
|
+
return new FacturXEncoder();
|
|
35
|
+
default:
|
|
36
|
+
throw new Error(`Unsupported invoice format for encoding: ${format}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3JpZXMvZW5jb2Rlci5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHM0QsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBb0M7UUFDOUQsUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM3QixLQUFLLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUUxQixLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDN0IsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBRWhDLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ3BCLGdEQUFnRDtnQkFDaEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBRTlCLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUMzQixLQUFLLFNBQVM7Z0JBQ1osZ0NBQWdDO2dCQUNoQyxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFFOUIsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzNCLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFFOUI7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseValidator } from '../base/base.validator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Factory to create the appropriate validator based on the XML format
|
|
4
|
+
*/
|
|
5
|
+
export declare class ValidatorFactory {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a validator for the specified XML content
|
|
8
|
+
* @param xml XML content to validate
|
|
9
|
+
* @returns Appropriate validator instance
|
|
10
|
+
*/
|
|
11
|
+
static createValidator(xml: string): BaseValidator;
|
|
12
|
+
}
|