@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,352 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { business, finance } from './plugins.js';
|
|
3
|
+
import { InvoiceFormat, ValidationLevel } from './interfaces/common.js';
|
|
4
|
+
// PDF-related imports are handled by the PDF utilities
|
|
5
|
+
// Import factories
|
|
6
|
+
import { DecoderFactory } from './formats/factories/decoder.factory.js';
|
|
7
|
+
import { EncoderFactory } from './formats/factories/encoder.factory.js';
|
|
8
|
+
import { ValidatorFactory } from './formats/factories/validator.factory.js';
|
|
9
|
+
// Import PDF utilities
|
|
10
|
+
import { PDFEmbedder } from './formats/pdf/pdf.embedder.js';
|
|
11
|
+
import { PDFExtractor } from './formats/pdf/pdf.extractor.js';
|
|
12
|
+
// Import format detector
|
|
13
|
+
import { FormatDetector } from './formats/utils/format.detector.js';
|
|
14
|
+
/**
|
|
15
|
+
* Main class for working with electronic invoices.
|
|
16
|
+
* Supports various invoice formats including Factur-X, ZUGFeRD, UBL, and XRechnung
|
|
17
|
+
* Implements TInvoice interface for seamless integration with existing systems
|
|
18
|
+
*/
|
|
19
|
+
export class XInvoice {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new XInvoice instance
|
|
22
|
+
* @param options Configuration options
|
|
23
|
+
*/
|
|
24
|
+
constructor(options) {
|
|
25
|
+
// TInvoice interface properties
|
|
26
|
+
this.id = '';
|
|
27
|
+
this.invoiceId = '';
|
|
28
|
+
this.invoiceType = 'debitnote';
|
|
29
|
+
this.versionInfo = {
|
|
30
|
+
type: 'draft',
|
|
31
|
+
version: '1.0.0'
|
|
32
|
+
};
|
|
33
|
+
this.type = 'invoice';
|
|
34
|
+
this.date = Date.now();
|
|
35
|
+
this.status = 'invoice';
|
|
36
|
+
this.subject = '';
|
|
37
|
+
this.incidenceId = '';
|
|
38
|
+
this.language = 'en';
|
|
39
|
+
this.objectActions = [];
|
|
40
|
+
this.pdf = null;
|
|
41
|
+
this.pdfAttachments = null;
|
|
42
|
+
this.accentColor = null;
|
|
43
|
+
this.logoUrl = null;
|
|
44
|
+
// Additional properties for invoice data
|
|
45
|
+
this.items = [];
|
|
46
|
+
this.dueInDays = 30;
|
|
47
|
+
this.reverseCharge = false;
|
|
48
|
+
this.currency = 'EUR';
|
|
49
|
+
this.notes = [];
|
|
50
|
+
// XInvoice specific properties
|
|
51
|
+
this.xmlString = '';
|
|
52
|
+
this.detectedFormat = InvoiceFormat.UNKNOWN;
|
|
53
|
+
this.validationErrors = [];
|
|
54
|
+
this.options = {
|
|
55
|
+
validateOnLoad: false,
|
|
56
|
+
validationLevel: ValidationLevel.SYNTAX
|
|
57
|
+
};
|
|
58
|
+
// PDF utilities
|
|
59
|
+
this.pdfEmbedder = new PDFEmbedder();
|
|
60
|
+
this.pdfExtractor = new PDFExtractor();
|
|
61
|
+
// Initialize empty contact objects
|
|
62
|
+
this.from = this.createEmptyContact();
|
|
63
|
+
this.to = this.createEmptyContact();
|
|
64
|
+
// Apply options if provided
|
|
65
|
+
if (options) {
|
|
66
|
+
this.options = { ...this.options, ...options };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates an empty TContact object
|
|
71
|
+
*/
|
|
72
|
+
createEmptyContact() {
|
|
73
|
+
return {
|
|
74
|
+
name: '',
|
|
75
|
+
type: 'company',
|
|
76
|
+
description: '',
|
|
77
|
+
address: {
|
|
78
|
+
streetName: '',
|
|
79
|
+
houseNumber: '0',
|
|
80
|
+
city: '',
|
|
81
|
+
country: '',
|
|
82
|
+
postalCode: ''
|
|
83
|
+
},
|
|
84
|
+
status: 'active',
|
|
85
|
+
foundedDate: {
|
|
86
|
+
year: 2000,
|
|
87
|
+
month: 1,
|
|
88
|
+
day: 1
|
|
89
|
+
},
|
|
90
|
+
registrationDetails: {
|
|
91
|
+
vatId: '',
|
|
92
|
+
registrationId: '',
|
|
93
|
+
registrationName: ''
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Creates a new XInvoice instance from XML
|
|
99
|
+
* @param xmlString XML content
|
|
100
|
+
* @param options Configuration options
|
|
101
|
+
* @returns XInvoice instance
|
|
102
|
+
*/
|
|
103
|
+
static async fromXml(xmlString, options) {
|
|
104
|
+
const xinvoice = new XInvoice(options);
|
|
105
|
+
// Load XML data
|
|
106
|
+
await xinvoice.loadXml(xmlString);
|
|
107
|
+
return xinvoice;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Creates a new XInvoice instance from PDF
|
|
111
|
+
* @param pdfBuffer PDF buffer
|
|
112
|
+
* @param options Configuration options
|
|
113
|
+
* @returns XInvoice instance
|
|
114
|
+
*/
|
|
115
|
+
static async fromPdf(pdfBuffer, options) {
|
|
116
|
+
const xinvoice = new XInvoice(options);
|
|
117
|
+
// Load PDF data
|
|
118
|
+
await xinvoice.loadPdf(pdfBuffer);
|
|
119
|
+
return xinvoice;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Loads XML data into the XInvoice instance
|
|
123
|
+
* @param xmlString XML content
|
|
124
|
+
* @param validate Whether to validate the XML
|
|
125
|
+
* @returns This instance for chaining
|
|
126
|
+
*/
|
|
127
|
+
async loadXml(xmlString, validate = false) {
|
|
128
|
+
this.xmlString = xmlString;
|
|
129
|
+
// Detect format
|
|
130
|
+
this.detectedFormat = FormatDetector.detectFormat(xmlString);
|
|
131
|
+
try {
|
|
132
|
+
// Initialize the decoder with the XML string using the factory
|
|
133
|
+
const decoder = DecoderFactory.createDecoder(xmlString);
|
|
134
|
+
// Decode the XML into a TInvoice object
|
|
135
|
+
const invoice = await decoder.decode();
|
|
136
|
+
// Copy data from the decoded invoice
|
|
137
|
+
this.copyInvoiceData(invoice);
|
|
138
|
+
// Validate the XML if requested or if validateOnLoad is true
|
|
139
|
+
if (validate || this.options.validateOnLoad) {
|
|
140
|
+
await this.validate(this.options.validationLevel);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error('Error loading XML:', error);
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Loads PDF data into the XInvoice instance
|
|
151
|
+
* @param pdfBuffer PDF buffer
|
|
152
|
+
* @param validate Whether to validate the extracted XML
|
|
153
|
+
* @returns This instance for chaining
|
|
154
|
+
*/
|
|
155
|
+
async loadPdf(pdfBuffer, validate = false) {
|
|
156
|
+
try {
|
|
157
|
+
// Extract XML from PDF using the consolidated extractor
|
|
158
|
+
const extractResult = await this.pdfExtractor.extractXml(pdfBuffer);
|
|
159
|
+
// Store the PDF buffer
|
|
160
|
+
this.pdf = {
|
|
161
|
+
name: 'invoice.pdf',
|
|
162
|
+
id: `invoice-${Date.now()}`,
|
|
163
|
+
metadata: {
|
|
164
|
+
textExtraction: '',
|
|
165
|
+
format: extractResult.success ? extractResult.format?.toString() : undefined
|
|
166
|
+
},
|
|
167
|
+
buffer: pdfBuffer instanceof Buffer ? new Uint8Array(pdfBuffer) : pdfBuffer
|
|
168
|
+
};
|
|
169
|
+
// Handle extraction result
|
|
170
|
+
if (!extractResult.success || !extractResult.xml) {
|
|
171
|
+
const errorMessage = extractResult.error ? extractResult.error.message : 'Unknown error extracting XML from PDF';
|
|
172
|
+
console.warn('XML extraction failed:', errorMessage);
|
|
173
|
+
throw new Error(`No XML found in PDF: ${errorMessage}`);
|
|
174
|
+
}
|
|
175
|
+
// Load the extracted XML
|
|
176
|
+
await this.loadXml(extractResult.xml, validate);
|
|
177
|
+
// Store the detected format
|
|
178
|
+
this.detectedFormat = extractResult.format || InvoiceFormat.UNKNOWN;
|
|
179
|
+
return this;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('Error loading PDF:', error);
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Copies data from a TInvoice object
|
|
188
|
+
* @param invoice Source invoice data
|
|
189
|
+
*/
|
|
190
|
+
copyInvoiceData(invoice) {
|
|
191
|
+
// Copy basic properties
|
|
192
|
+
this.id = invoice.id;
|
|
193
|
+
this.invoiceId = invoice.invoiceId || invoice.id;
|
|
194
|
+
this.invoiceType = invoice.invoiceType;
|
|
195
|
+
this.versionInfo = { ...invoice.versionInfo };
|
|
196
|
+
this.type = invoice.type;
|
|
197
|
+
this.date = invoice.date;
|
|
198
|
+
this.status = invoice.status;
|
|
199
|
+
this.subject = invoice.subject;
|
|
200
|
+
this.from = { ...invoice.from };
|
|
201
|
+
this.to = { ...invoice.to };
|
|
202
|
+
this.incidenceId = invoice.incidenceId;
|
|
203
|
+
this.language = invoice.language;
|
|
204
|
+
this.legalContact = invoice.legalContact ? { ...invoice.legalContact } : undefined;
|
|
205
|
+
this.objectActions = [...invoice.objectActions];
|
|
206
|
+
this.pdf = invoice.pdf;
|
|
207
|
+
this.pdfAttachments = invoice.pdfAttachments;
|
|
208
|
+
// Copy invoice-specific properties
|
|
209
|
+
if (invoice.items)
|
|
210
|
+
this.items = [...invoice.items];
|
|
211
|
+
if (invoice.dueInDays)
|
|
212
|
+
this.dueInDays = invoice.dueInDays;
|
|
213
|
+
if (invoice.reverseCharge !== undefined)
|
|
214
|
+
this.reverseCharge = invoice.reverseCharge;
|
|
215
|
+
if (invoice.currency)
|
|
216
|
+
this.currency = invoice.currency;
|
|
217
|
+
if (invoice.notes)
|
|
218
|
+
this.notes = [...invoice.notes];
|
|
219
|
+
if (invoice.periodOfPerformance)
|
|
220
|
+
this.periodOfPerformance = { ...invoice.periodOfPerformance };
|
|
221
|
+
if (invoice.deliveryDate)
|
|
222
|
+
this.deliveryDate = invoice.deliveryDate;
|
|
223
|
+
if (invoice.buyerReference)
|
|
224
|
+
this.buyerReference = invoice.buyerReference;
|
|
225
|
+
if (invoice.electronicAddress)
|
|
226
|
+
this.electronicAddress = { ...invoice.electronicAddress };
|
|
227
|
+
if (invoice.paymentOptions)
|
|
228
|
+
this.paymentOptions = { ...invoice.paymentOptions };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Validates the XML against the appropriate format rules
|
|
232
|
+
* @param level Validation level (syntax, semantic, business)
|
|
233
|
+
* @returns Validation result
|
|
234
|
+
*/
|
|
235
|
+
async validate(level = ValidationLevel.SYNTAX) {
|
|
236
|
+
if (!this.xmlString) {
|
|
237
|
+
throw new Error('No XML to validate');
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
// Initialize the validator with the XML string
|
|
241
|
+
const validator = ValidatorFactory.createValidator(this.xmlString);
|
|
242
|
+
// Run validation
|
|
243
|
+
const result = validator.validate(level);
|
|
244
|
+
// Store validation errors
|
|
245
|
+
this.validationErrors = result.errors;
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error('Error validating XML:', error);
|
|
250
|
+
const errorResult = {
|
|
251
|
+
valid: false,
|
|
252
|
+
errors: [{
|
|
253
|
+
code: 'VAL-ERROR',
|
|
254
|
+
message: `Validation error: ${error instanceof Error ? error.message : String(error)}`
|
|
255
|
+
}],
|
|
256
|
+
level
|
|
257
|
+
};
|
|
258
|
+
this.validationErrors = errorResult.errors;
|
|
259
|
+
return errorResult;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Checks if the invoice is valid
|
|
264
|
+
* @returns True if no validation errors were found
|
|
265
|
+
*/
|
|
266
|
+
isValid() {
|
|
267
|
+
return this.validationErrors.length === 0;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Gets validation errors from the last validation
|
|
271
|
+
* @returns Array of validation errors
|
|
272
|
+
*/
|
|
273
|
+
getValidationErrors() {
|
|
274
|
+
return this.validationErrors;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Exports the invoice as XML in the specified format
|
|
278
|
+
* @param format Target format (e.g., 'facturx', 'xrechnung')
|
|
279
|
+
* @returns XML string in the specified format
|
|
280
|
+
*/
|
|
281
|
+
async exportXml(format = 'facturx') {
|
|
282
|
+
// Create encoder for the specified format
|
|
283
|
+
const encoder = EncoderFactory.createEncoder(format);
|
|
284
|
+
// Generate XML
|
|
285
|
+
return await encoder.encode(this);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Exports the invoice as a PDF with embedded XML
|
|
289
|
+
* @param format Target format (e.g., 'facturx', 'zugferd', 'xrechnung', 'ubl')
|
|
290
|
+
* @returns PDF object with embedded XML
|
|
291
|
+
*/
|
|
292
|
+
async exportPdf(format = 'facturx') {
|
|
293
|
+
if (!this.pdf) {
|
|
294
|
+
throw new Error('No PDF data available. Use loadPdf() first or set the pdf property.');
|
|
295
|
+
}
|
|
296
|
+
// Generate XML in the specified format
|
|
297
|
+
const xmlContent = await this.exportXml(format);
|
|
298
|
+
// Determine filename based on format
|
|
299
|
+
let filename = 'invoice.xml';
|
|
300
|
+
let description = 'XML Invoice';
|
|
301
|
+
switch (format.toLowerCase()) {
|
|
302
|
+
case 'facturx':
|
|
303
|
+
filename = 'factur-x.xml';
|
|
304
|
+
description = 'Factur-X XML Invoice';
|
|
305
|
+
break;
|
|
306
|
+
case 'zugferd':
|
|
307
|
+
filename = 'zugferd-invoice.xml';
|
|
308
|
+
description = 'ZUGFeRD XML Invoice';
|
|
309
|
+
break;
|
|
310
|
+
case 'xrechnung':
|
|
311
|
+
filename = 'xrechnung.xml';
|
|
312
|
+
description = 'XRechnung XML Invoice';
|
|
313
|
+
break;
|
|
314
|
+
case 'ubl':
|
|
315
|
+
filename = 'ubl-invoice.xml';
|
|
316
|
+
description = 'UBL XML Invoice';
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
// Embed XML into PDF
|
|
320
|
+
const result = await this.pdfEmbedder.createPdfWithXml(this.pdf.buffer, xmlContent, filename, description, this.pdf.name, this.pdf.id);
|
|
321
|
+
// Handle potential errors
|
|
322
|
+
if (!result.success || !result.pdf) {
|
|
323
|
+
const errorMessage = result.error ? result.error.message : 'Unknown error embedding XML into PDF';
|
|
324
|
+
console.error('Error exporting PDF:', errorMessage);
|
|
325
|
+
throw new Error(`Failed to export PDF: ${errorMessage}`);
|
|
326
|
+
}
|
|
327
|
+
return result.pdf;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Gets the raw XML content
|
|
331
|
+
* @returns XML string
|
|
332
|
+
*/
|
|
333
|
+
getXml() {
|
|
334
|
+
return this.xmlString;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Gets the invoice format as an enum value
|
|
338
|
+
* @returns InvoiceFormat enum value
|
|
339
|
+
*/
|
|
340
|
+
getFormat() {
|
|
341
|
+
return this.detectedFormat;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Checks if the invoice is in the specified format
|
|
345
|
+
* @param format Format to check
|
|
346
|
+
* @returns True if the invoice is in the specified format
|
|
347
|
+
*/
|
|
348
|
+
isFormat(format) {
|
|
349
|
+
return this.detectedFormat === format;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy54aW52b2ljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMueGludm9pY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RSx1REFBdUQ7QUFFdkQsbUJBQW1CO0FBQ25CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFNUUsdUJBQXVCO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUQseUJBQXlCO0FBQ3pCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFpRG5COzs7T0FHRztJQUNILFlBQVksT0FBeUI7UUFwRHJDLGdDQUFnQztRQUN6QixPQUFFLEdBQVcsRUFBRSxDQUFDO1FBQ2hCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBK0IsV0FBVyxDQUFDO1FBQ3RELGdCQUFXLEdBQTJEO1lBQzNFLElBQUksRUFBRSxPQUFPO1lBQ2IsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQztRQUNLLFNBQUksR0FBYyxTQUFTLENBQUM7UUFDNUIsU0FBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQThDLFNBQVMsQ0FBQztRQUM5RCxZ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
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { business, finance } from './plugins.js';
|
|
2
|
+
import type { TInvoice, TAccountingDocItem } from '@tsclass/tsclass/dist_ts/finance/index.js';
|
|
3
|
+
import { InvoiceFormat, ValidationLevel } from './interfaces/common.js';
|
|
4
|
+
import type { ValidationResult, ValidationError, EInvoiceOptions, IPdf, ExportFormat } from './interfaces/common.js';
|
|
5
|
+
/**
|
|
6
|
+
* Main class for working with electronic invoices.
|
|
7
|
+
* Supports various invoice formats including Factur-X, ZUGFeRD, UBL, and XRechnung
|
|
8
|
+
* Extends the TInvoice interface for seamless integration with existing systems
|
|
9
|
+
*/
|
|
10
|
+
export declare class EInvoice implements TInvoice {
|
|
11
|
+
/**
|
|
12
|
+
* Creates an EInvoice instance from XML string
|
|
13
|
+
* @param xmlString XML string to parse
|
|
14
|
+
* @returns EInvoice instance
|
|
15
|
+
*/
|
|
16
|
+
static fromXml(xmlString: string): Promise<EInvoice>;
|
|
17
|
+
/**
|
|
18
|
+
* Creates an EInvoice instance from file
|
|
19
|
+
* @param filePath Path to the file
|
|
20
|
+
* @returns EInvoice instance
|
|
21
|
+
*/
|
|
22
|
+
static fromFile(filePath: string): Promise<EInvoice>;
|
|
23
|
+
/**
|
|
24
|
+
* Creates an EInvoice instance from PDF
|
|
25
|
+
* @param pdfBuffer PDF buffer
|
|
26
|
+
* @returns EInvoice instance
|
|
27
|
+
*/
|
|
28
|
+
static fromPdf(pdfBuffer: Buffer | string): Promise<EInvoice>;
|
|
29
|
+
type: 'accounting-doc';
|
|
30
|
+
accountingDocType: 'invoice';
|
|
31
|
+
accountingDocId: string;
|
|
32
|
+
accountingDocStatus: 'draft' | 'issued' | 'paid' | 'canceled' | 'refunded';
|
|
33
|
+
id: string;
|
|
34
|
+
date: number;
|
|
35
|
+
status: 'draft' | 'issued' | 'paid' | 'canceled' | 'refunded';
|
|
36
|
+
subject: string;
|
|
37
|
+
versionInfo: business.TDocumentEnvelope<string, any>['versionInfo'];
|
|
38
|
+
from: business.TContact;
|
|
39
|
+
to: business.TContact;
|
|
40
|
+
legalContact?: business.TContact;
|
|
41
|
+
incidenceId: string;
|
|
42
|
+
language: string;
|
|
43
|
+
objectActions: any[];
|
|
44
|
+
pdf: IPdf | null;
|
|
45
|
+
pdfAttachments: IPdf[] | null;
|
|
46
|
+
accentColor: string | null;
|
|
47
|
+
logoUrl: string | null;
|
|
48
|
+
items: TAccountingDocItem[];
|
|
49
|
+
dueInDays: number;
|
|
50
|
+
reverseCharge: boolean;
|
|
51
|
+
currency: finance.TCurrency;
|
|
52
|
+
notes: string[];
|
|
53
|
+
periodOfPerformance?: {
|
|
54
|
+
from: number;
|
|
55
|
+
to: number;
|
|
56
|
+
};
|
|
57
|
+
deliveryDate?: number;
|
|
58
|
+
buyerReference?: string;
|
|
59
|
+
electronicAddress?: {
|
|
60
|
+
scheme: string;
|
|
61
|
+
value: string;
|
|
62
|
+
};
|
|
63
|
+
paymentOptions?: finance.IPaymentOptionInfo;
|
|
64
|
+
relatedDocuments?: Array<{
|
|
65
|
+
relationType: 'corrects' | 'replaces' | 'references';
|
|
66
|
+
documentId: string;
|
|
67
|
+
issueDate?: number;
|
|
68
|
+
}>;
|
|
69
|
+
printResult?: {
|
|
70
|
+
pdfBufferString: string;
|
|
71
|
+
totalNet: number;
|
|
72
|
+
totalGross: number;
|
|
73
|
+
vatGroups: {
|
|
74
|
+
percentage: number;
|
|
75
|
+
items: TAccountingDocItem[];
|
|
76
|
+
}[];
|
|
77
|
+
};
|
|
78
|
+
get invoiceId(): string;
|
|
79
|
+
set invoiceId(value: string);
|
|
80
|
+
get invoiceType(): 'invoice' | 'creditnote' | 'debitnote';
|
|
81
|
+
set invoiceType(value: 'invoice' | 'creditnote' | 'debitnote');
|
|
82
|
+
get issueDate(): Date;
|
|
83
|
+
set issueDate(value: Date);
|
|
84
|
+
get totalNet(): number;
|
|
85
|
+
get totalVat(): number;
|
|
86
|
+
get totalGross(): number;
|
|
87
|
+
get taxBreakdown(): Array<{
|
|
88
|
+
taxPercent: number;
|
|
89
|
+
netAmount: number;
|
|
90
|
+
taxAmount: number;
|
|
91
|
+
}>;
|
|
92
|
+
metadata?: {
|
|
93
|
+
format?: InvoiceFormat;
|
|
94
|
+
version?: string;
|
|
95
|
+
profile?: string;
|
|
96
|
+
customizationId?: string;
|
|
97
|
+
extensions?: Record<string, any>;
|
|
98
|
+
};
|
|
99
|
+
private xmlString;
|
|
100
|
+
private detectedFormat;
|
|
101
|
+
private validationErrors;
|
|
102
|
+
private options;
|
|
103
|
+
private pdfEmbedder;
|
|
104
|
+
private pdfExtractor;
|
|
105
|
+
/**
|
|
106
|
+
* Creates a new EInvoice instance
|
|
107
|
+
* @param options Configuration options
|
|
108
|
+
*/
|
|
109
|
+
constructor(options?: EInvoiceOptions);
|
|
110
|
+
/**
|
|
111
|
+
* Creates an empty TContact object
|
|
112
|
+
*/
|
|
113
|
+
private createEmptyContact;
|
|
114
|
+
/**
|
|
115
|
+
* Exports the invoice as XML in the specified format
|
|
116
|
+
* @param format The export format
|
|
117
|
+
* @returns XML string
|
|
118
|
+
*/
|
|
119
|
+
exportXml(format: ExportFormat): Promise<string>;
|
|
120
|
+
/**
|
|
121
|
+
* Loads invoice data from XML (alias for fromXmlString)
|
|
122
|
+
* @param xmlString The XML string to parse
|
|
123
|
+
* @returns The EInvoice instance for chaining
|
|
124
|
+
*/
|
|
125
|
+
loadXml(xmlString: string): Promise<EInvoice>;
|
|
126
|
+
/**
|
|
127
|
+
* Loads invoice data from an XML string
|
|
128
|
+
* @param xmlString The XML string to parse
|
|
129
|
+
* @returns The EInvoice instance for chaining
|
|
130
|
+
*/
|
|
131
|
+
fromXmlString(xmlString: string): Promise<EInvoice>;
|
|
132
|
+
/**
|
|
133
|
+
* Loads invoice data from a file
|
|
134
|
+
* @param filePath Path to the file to load
|
|
135
|
+
* @returns The EInvoice instance for chaining
|
|
136
|
+
*/
|
|
137
|
+
fromFile(filePath: string): Promise<EInvoice>;
|
|
138
|
+
/**
|
|
139
|
+
* Loads invoice data from a PDF file
|
|
140
|
+
* @param filePath Path to the PDF file
|
|
141
|
+
* @returns The EInvoice instance for chaining
|
|
142
|
+
*/
|
|
143
|
+
fromPdfFile(filePath: string): Promise<EInvoice>;
|
|
144
|
+
/**
|
|
145
|
+
* Maps data from a TInvoice to this EInvoice instance
|
|
146
|
+
*/
|
|
147
|
+
private mapFromTInvoice;
|
|
148
|
+
/**
|
|
149
|
+
* Maps this EInvoice instance to a TInvoice
|
|
150
|
+
*/
|
|
151
|
+
private mapToTInvoice;
|
|
152
|
+
/**
|
|
153
|
+
* Exports the invoice to an XML string in the specified format
|
|
154
|
+
* @param format The target format
|
|
155
|
+
* @returns The XML string
|
|
156
|
+
*/
|
|
157
|
+
toXmlString(format: ExportFormat): Promise<string>;
|
|
158
|
+
/**
|
|
159
|
+
* Validates the invoice
|
|
160
|
+
* @param level The validation level to use
|
|
161
|
+
* @returns The validation result
|
|
162
|
+
*/
|
|
163
|
+
validate(level?: ValidationLevel): Promise<ValidationResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Embeds the invoice XML into a PDF
|
|
166
|
+
* @param pdfBuffer The PDF buffer to embed into
|
|
167
|
+
* @param format The format to use for embedding
|
|
168
|
+
* @returns The PDF buffer with embedded XML
|
|
169
|
+
*/
|
|
170
|
+
embedInPdf(pdfBuffer: Buffer, format?: ExportFormat): Promise<Buffer>;
|
|
171
|
+
/**
|
|
172
|
+
* Saves the invoice to a file
|
|
173
|
+
* @param filePath The path to save to
|
|
174
|
+
* @param format The format to save in
|
|
175
|
+
*/
|
|
176
|
+
saveToFile(filePath: string, format?: ExportFormat): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* Gets the validation errors
|
|
179
|
+
* @returns Array of validation errors
|
|
180
|
+
*/
|
|
181
|
+
getValidationErrors(): ValidationError[];
|
|
182
|
+
/**
|
|
183
|
+
* Checks if the invoice is valid
|
|
184
|
+
* @returns True if valid, false otherwise
|
|
185
|
+
*/
|
|
186
|
+
isValid(): boolean;
|
|
187
|
+
/**
|
|
188
|
+
* Gets the detected format
|
|
189
|
+
* @returns The detected invoice format
|
|
190
|
+
*/
|
|
191
|
+
getFormat(): InvoiceFormat;
|
|
192
|
+
/**
|
|
193
|
+
* Gets the original XML string
|
|
194
|
+
* @returns The XML string
|
|
195
|
+
*/
|
|
196
|
+
getXml(): string;
|
|
197
|
+
/**
|
|
198
|
+
* Calculates the total net amount
|
|
199
|
+
*/
|
|
200
|
+
private calculateTotalNet;
|
|
201
|
+
/**
|
|
202
|
+
* Calculates the total VAT amount
|
|
203
|
+
*/
|
|
204
|
+
private calculateTotalVat;
|
|
205
|
+
/**
|
|
206
|
+
* Calculates tax breakdown by rate
|
|
207
|
+
*/
|
|
208
|
+
private calculateTaxBreakdown;
|
|
209
|
+
/**
|
|
210
|
+
* Creates a new invoice item
|
|
211
|
+
*/
|
|
212
|
+
createItem(data: Partial<TAccountingDocItem>): TAccountingDocItem;
|
|
213
|
+
/**
|
|
214
|
+
* Adds an item to the invoice
|
|
215
|
+
*/
|
|
216
|
+
addItem(item: Partial<TAccountingDocItem>): void;
|
|
217
|
+
}
|