@fin.cx/einvoice 5.0.2 → 5.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/package.json +13 -8
  58. package/readme.md +255 -810
  59. package/ts/00_commitinfo_data.ts +1 -1
  60. package/ts/einvoice.ts +63 -14
  61. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  62. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  63. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  64. package/ts/formats/semantic/semantic.validator.ts +654 -0
  65. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  66. package/ts/formats/utils/currency.utils.ts +299 -0
  67. package/ts/formats/utils/decimal.ts +509 -0
  68. package/ts/formats/validation/codelist.validator.ts +317 -0
  69. package/ts/formats/validation/conformance.harness.ts +591 -0
  70. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  71. package/ts/formats/validation/facturx.validator.ts +579 -0
  72. package/ts/formats/validation/integrated.validator.ts +405 -0
  73. package/ts/formats/validation/peppol.validator.ts +589 -0
  74. package/ts/formats/validation/schematron.downloader.ts +304 -0
  75. package/ts/formats/validation/schematron.integration.ts +285 -0
  76. package/ts/formats/validation/schematron.validator.ts +348 -0
  77. package/ts/formats/validation/schematron.worker.ts +221 -0
  78. package/ts/formats/validation/validation.types.ts +274 -0
  79. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  80. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  81. package/ts/interfaces/common.ts +1 -0
  82. package/ts/interfaces/en16931-metadata.ts +104 -0
  83. package/ts/plugins.ts +8 -0
  84. package/ts/tspublish.json +3 -0
  85. package/dist_ts/classes.decoder.d.ts +0 -40
  86. package/dist_ts/classes.decoder.js +0 -320
  87. package/dist_ts/classes.encoder.d.ts +0 -51
  88. package/dist_ts/classes.encoder.js +0 -293
  89. package/dist_ts/classes.xinvoice.d.ts +0 -136
  90. package/dist_ts/classes.xinvoice.js +0 -352
  91. package/dist_ts/formats/base.decoder.d.ts +0 -19
  92. package/dist_ts/formats/base.decoder.js +0 -130
  93. package/dist_ts/formats/base.validator.d.ts +0 -44
  94. package/dist_ts/formats/base.validator.js +0 -39
  95. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  96. package/dist_ts/formats/decoder.factory.js +0 -46
  97. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  98. package/dist_ts/formats/factorx.decoder.js +0 -178
  99. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  100. package/dist_ts/formats/factorx.encoder.js +0 -293
  101. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  102. package/dist_ts/formats/facturx.decoder.js +0 -210
  103. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  104. package/dist_ts/formats/facturx.encoder.js +0 -293
  105. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  106. package/dist_ts/formats/facturx.validator.js +0 -266
  107. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  109. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  110. package/dist_ts/formats/ubl.validator.js +0 -306
  111. package/dist_ts/formats/validator.factory.d.ts +0 -18
  112. package/dist_ts/formats/validator.factory.js +0 -78
  113. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  114. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  115. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  116. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -1,18 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { BaseDecoder } from './base.decoder.js';
3
- /**
4
- * A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
5
- * Converts XML into structured ILetter with invoice data.
6
- */
7
- export declare class FacturXDecoder extends BaseDecoder {
8
- private xmlDoc;
9
- constructor(xmlString: string);
10
- /**
11
- * Extracts text from the first element matching the tag name
12
- */
13
- private getElementText;
14
- /**
15
- * Converts Factur-X/ZUGFeRD XML to a structured letter object
16
- */
17
- getLetterData(): Promise<plugins.tsclass.business.ILetter>;
18
- }
@@ -1,178 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import * as xmldom from 'xmldom';
3
- import { BaseDecoder } from './base.decoder.js';
4
- /**
5
- * A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
6
- * Converts XML into structured ILetter with invoice data.
7
- */
8
- export class FacturXDecoder extends BaseDecoder {
9
- constructor(xmlString) {
10
- super(xmlString);
11
- this.xmlDoc = null;
12
- // Parse XML to DOM for easier element extraction
13
- try {
14
- const parser = new xmldom.DOMParser();
15
- this.xmlDoc = parser.parseFromString(this.xmlString, 'text/xml');
16
- }
17
- catch (error) {
18
- console.error('Error parsing Factur-X XML:', error);
19
- }
20
- }
21
- /**
22
- * Extracts text from the first element matching the tag name
23
- */
24
- getElementText(tagName) {
25
- if (!this.xmlDoc) {
26
- return '';
27
- }
28
- try {
29
- // Basic handling for namespaced tags
30
- let namespace = '';
31
- let localName = tagName;
32
- if (tagName.includes(':')) {
33
- const parts = tagName.split(':');
34
- namespace = parts[0];
35
- localName = parts[1];
36
- }
37
- // Find all elements with this name
38
- const elements = this.xmlDoc.getElementsByTagName(tagName);
39
- if (elements.length > 0) {
40
- return elements[0].textContent || '';
41
- }
42
- // Try with just the local name if we didn't find it with the namespace
43
- if (namespace) {
44
- const elements = this.xmlDoc.getElementsByTagName(localName);
45
- if (elements.length > 0) {
46
- return elements[0].textContent || '';
47
- }
48
- }
49
- return '';
50
- }
51
- catch (error) {
52
- console.error(`Error extracting element ${tagName}:`, error);
53
- return '';
54
- }
55
- }
56
- /**
57
- * Converts Factur-X/ZUGFeRD XML to a structured letter object
58
- */
59
- async getLetterData() {
60
- try {
61
- // Extract invoice ID
62
- let invoiceId = this.getElementText('ram:ID');
63
- if (!invoiceId) {
64
- // Try alternative locations
65
- invoiceId = this.getElementText('rsm:ExchangedDocument ram:ID') || 'Unknown';
66
- }
67
- // Extract seller name
68
- let sellerName = this.getElementText('ram:Name');
69
- if (!sellerName) {
70
- sellerName = this.getElementText('ram:SellerTradeParty ram:Name') || 'Unknown Seller';
71
- }
72
- // Extract buyer name
73
- let buyerName = '';
74
- // Try to find BuyerTradeParty Name specifically
75
- if (this.xmlDoc) {
76
- const buyerParties = this.xmlDoc.getElementsByTagName('ram:BuyerTradeParty');
77
- if (buyerParties.length > 0) {
78
- const nameElements = buyerParties[0].getElementsByTagName('ram:Name');
79
- if (nameElements.length > 0) {
80
- buyerName = nameElements[0].textContent || '';
81
- }
82
- }
83
- }
84
- if (!buyerName) {
85
- buyerName = 'Unknown Buyer';
86
- }
87
- // Create seller
88
- const seller = {
89
- name: sellerName,
90
- type: 'company',
91
- description: sellerName,
92
- address: {
93
- streetName: this.getElementText('ram:LineOne') || 'Unknown',
94
- houseNumber: '0', // Required by IAddress interface
95
- city: this.getElementText('ram:CityName') || 'Unknown',
96
- country: this.getElementText('ram:CountryID') || 'Unknown',
97
- postalCode: this.getElementText('ram:PostcodeCode') || 'Unknown',
98
- },
99
- };
100
- // Create buyer
101
- const buyer = {
102
- name: buyerName,
103
- type: 'company',
104
- description: buyerName,
105
- address: {
106
- streetName: 'Unknown',
107
- houseNumber: '0',
108
- city: 'Unknown',
109
- country: 'Unknown',
110
- postalCode: 'Unknown',
111
- },
112
- };
113
- // Extract invoice type
114
- let invoiceType = 'debitnote';
115
- const typeCode = this.getElementText('ram:TypeCode');
116
- if (typeCode === '381') {
117
- invoiceType = 'creditnote';
118
- }
119
- // Create invoice data
120
- const invoiceData = {
121
- id: invoiceId,
122
- status: null,
123
- type: invoiceType,
124
- billedBy: seller,
125
- billedTo: buyer,
126
- deliveryDate: Date.now(),
127
- dueInDays: 30,
128
- periodOfPerformance: null,
129
- printResult: null,
130
- currency: (this.getElementText('ram:InvoiceCurrencyCode') || 'EUR'),
131
- notes: [],
132
- items: [
133
- {
134
- name: 'Item from Factur-X XML',
135
- unitQuantity: 1,
136
- unitNetPrice: 0,
137
- vatPercentage: 0,
138
- position: 0,
139
- unitType: 'units',
140
- }
141
- ],
142
- reverseCharge: false,
143
- };
144
- // Return a letter
145
- return {
146
- versionInfo: {
147
- type: 'draft',
148
- version: '1.0.0',
149
- },
150
- type: 'invoice',
151
- date: Date.now(),
152
- subject: `Invoice: ${invoiceId}`,
153
- from: seller,
154
- to: buyer,
155
- content: {
156
- invoiceData: invoiceData,
157
- textData: null,
158
- timesheetData: null,
159
- contractData: null,
160
- },
161
- needsCoverSheet: false,
162
- objectActions: [],
163
- pdf: null,
164
- incidenceId: null,
165
- language: null,
166
- legalContact: null,
167
- logoUrl: null,
168
- pdfAttachments: null,
169
- accentColor: null,
170
- };
171
- }
172
- catch (error) {
173
- console.error('Error converting Factur-X XML to letter data:', error);
174
- return this.createDefaultLetter();
175
- }
176
- }
177
- }
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeC5kZWNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3J4LmRlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsV0FBVztJQUc3QyxZQUFZLFNBQWlCO1FBQzNCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUhYLFdBQU0sR0FBb0IsSUFBSSxDQUFDO1FBS3JDLGlEQUFpRDtRQUNqRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gscUNBQXFDO1lBQ3JDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFeEIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8s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
@@ -1,51 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- /**
3
- * A class to convert a given ILetter with invoice data
4
- * into a Factur-X compliant XML (also compatible with ZUGFeRD and EN16931).
5
- *
6
- * Factur-X is the French implementation of the European e-invoicing standard EN16931,
7
- * which is also implemented in Germany as ZUGFeRD. Both formats are based on
8
- * UN/CEFACT Cross Industry Invoice (CII) XML schemas.
9
- */
10
- export declare class FacturXEncoder {
11
- constructor();
12
- /**
13
- * Alias for createFacturXXml to maintain backward compatibility
14
- */
15
- createZugferdXml(letterArg: plugins.tsclass.business.ILetter): string;
16
- /**
17
- * Creates a Factur-X compliant XML based on the provided letter data.
18
- * This XML is also compliant with ZUGFeRD and EN16931 standards.
19
- */
20
- createFacturXXml(letterArg: plugins.tsclass.business.ILetter): string;
21
- /**
22
- * Helper: Determine if the letter is in draft or final.
23
- */
24
- private isDraft;
25
- /**
26
- * Helper: Format date to certain patterns (very minimal example).
27
- * e.g. 'yyyyMMdd' => '20231231'
28
- */
29
- private formatDate;
30
- /**
31
- * Helper: Map your custom 'unitType' to an ISO code or similar.
32
- */
33
- private mapUnitType;
34
- /**
35
- * Example: Sum all VAT amounts from items.
36
- */
37
- private sumAllVat;
38
- /**
39
- * Example: Extract main (or highest) VAT rate from items as representative.
40
- * In reality, you might list multiple 'ApplicableTradeTax' blocks by group.
41
- */
42
- private extractMainVatRate;
43
- /**
44
- * Example: Sum net amounts (without VAT).
45
- */
46
- private calcLineTotalNet;
47
- /**
48
- * Example: net + VAT = grand total
49
- */
50
- private calcGrandTotal;
51
- }
@@ -1,293 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- /**
3
- * A class to convert a given ILetter with invoice data
4
- * into a Factur-X compliant XML (also compatible with ZUGFeRD and EN16931).
5
- *
6
- * Factur-X is the French implementation of the European e-invoicing standard EN16931,
7
- * which is also implemented in Germany as ZUGFeRD. Both formats are based on
8
- * UN/CEFACT Cross Industry Invoice (CII) XML schemas.
9
- */
10
- export class FacturXEncoder {
11
- constructor() { }
12
- /**
13
- * Alias for createFacturXXml to maintain backward compatibility
14
- */
15
- createZugferdXml(letterArg) {
16
- return this.createFacturXXml(letterArg);
17
- }
18
- /**
19
- * Creates a Factur-X compliant XML based on the provided letter data.
20
- * This XML is also compliant with ZUGFeRD and EN16931 standards.
21
- */
22
- createFacturXXml(letterArg) {
23
- // 1) Get your "SmartXml" or "xmlbuilder2" instance
24
- const smartxmlInstance = new plugins.smartxml.SmartXml();
25
- if (!letterArg?.content?.invoiceData) {
26
- throw new Error('Letter does not contain invoice data.');
27
- }
28
- const invoice = letterArg.content.invoiceData;
29
- const billedBy = invoice.billedBy;
30
- const billedTo = invoice.billedTo;
31
- // 2) Start building the document
32
- const doc = smartxmlInstance
33
- .create({ version: '1.0', encoding: 'UTF-8' })
34
- .ele('rsm:CrossIndustryInvoice', {
35
- 'xmlns:rsm': 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100',
36
- 'xmlns:udt': 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100',
37
- 'xmlns:qdt': 'urn:un:unece:uncefact:data:standard:QualifiedDataType:100',
38
- 'xmlns:ram': 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'
39
- });
40
- // 3) Exchanged Document Context
41
- const docContext = doc.ele('rsm:ExchangedDocumentContext');
42
- // Add test indicator
43
- docContext.ele('ram:TestIndicator')
44
- .ele('udt:Indicator')
45
- .txt(this.isDraft(letterArg) ? 'true' : 'false')
46
- .up()
47
- .up();
48
- // Add Factur-X profile information
49
- // EN16931 profile is compliant with both Factur-X and ZUGFeRD
50
- docContext.ele('ram:GuidelineSpecifiedDocumentContextParameter')
51
- .ele('ram:ID')
52
- .txt('urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:en16931')
53
- .up()
54
- .up();
55
- docContext.up(); // </rsm:ExchangedDocumentContext>
56
- // 4) Exchanged Document (Invoice Header Info)
57
- const exchangedDoc = doc.ele('rsm:ExchangedDocument');
58
- // Invoice ID
59
- exchangedDoc.ele('ram:ID').txt(invoice.id).up();
60
- // Document type code
61
- // 380 = commercial invoice, 381 = credit note
62
- const documentTypeCode = invoice.type === 'creditnote' ? '381' : '380';
63
- exchangedDoc.ele('ram:TypeCode').txt(documentTypeCode).up();
64
- // Issue date
65
- exchangedDoc
66
- .ele('ram:IssueDateTime')
67
- .ele('udt:DateTimeString', { format: '102' })
68
- // Format 'YYYYMMDD' as per Factur-X specification
69
- .txt(this.formatDate(letterArg.date))
70
- .up()
71
- .up();
72
- // Document name - Factur-X recommended field
73
- const documentName = invoice.type === 'creditnote' ? 'CREDIT NOTE' : 'INVOICE';
74
- exchangedDoc.ele('ram:Name').txt(documentName).up();
75
- // Optional: Add language indicator (recommended for Factur-X)
76
- // Use document language if specified, default to 'en'
77
- const languageCode = letterArg.language?.toUpperCase() || 'EN';
78
- exchangedDoc
79
- .ele('ram:IncludedNote')
80
- .ele('ram:Content').txt('Invoice created with Factur-X compliant software').up()
81
- .ele('ram:SubjectCode').txt('REG').up() // REG = regulatory information
82
- .up();
83
- exchangedDoc.up(); // </rsm:ExchangedDocument>
84
- // 5) Supply Chain Trade Transaction
85
- const supplyChainEle = doc.ele('rsm:SupplyChainTradeTransaction');
86
- // 5.1) Included Supply Chain Trade Line Items
87
- invoice.items.forEach((item) => {
88
- const lineItemEle = supplyChainEle.ele('ram:IncludedSupplyChainTradeLineItem');
89
- lineItemEle.ele('ram:SpecifiedTradeProduct')
90
- .ele('ram:Name')
91
- .txt(item.name)
92
- .up()
93
- .up(); // </ram:SpecifiedTradeProduct>
94
- lineItemEle.ele('ram:SpecifiedLineTradeAgreement')
95
- .ele('ram:GrossPriceProductTradePrice')
96
- .ele('ram:ChargeAmount')
97
- .txt(item.unitNetPrice.toFixed(2))
98
- .up()
99
- .up()
100
- .up(); // </ram:SpecifiedLineTradeAgreement>
101
- lineItemEle.ele('ram:SpecifiedLineTradeDelivery')
102
- .ele('ram:BilledQuantity')
103
- .txt(item.unitQuantity.toString())
104
- .up()
105
- .up(); // </ram:SpecifiedLineTradeDelivery>
106
- lineItemEle.ele('ram:SpecifiedLineTradeSettlement')
107
- .ele('ram:ApplicableTradeTax')
108
- .ele('ram:RateApplicablePercent')
109
- .txt(item.vatPercentage.toFixed(2))
110
- .up()
111
- .up()
112
- .ele('ram:SpecifiedTradeSettlementLineMonetarySummation')
113
- .ele('ram:LineTotalAmount')
114
- .txt((item.unitQuantity *
115
- item.unitNetPrice *
116
- (1 + item.vatPercentage / 100)).toFixed(2))
117
- .up()
118
- .up()
119
- .up(); // </ram:SpecifiedLineTradeSettlement>
120
- });
121
- // 5.2) Applicable Header Trade Agreement
122
- const headerTradeAgreementEle = supplyChainEle.ele('ram:ApplicableHeaderTradeAgreement');
123
- // Seller
124
- const sellerPartyEle = headerTradeAgreementEle.ele('ram:SellerTradeParty');
125
- sellerPartyEle.ele('ram:Name').txt(billedBy.name).up();
126
- // Example: If it's a company, put company name, etc.
127
- const sellerAddressEle = sellerPartyEle.ele('ram:PostalTradeAddress');
128
- sellerAddressEle.ele('ram:PostcodeCode').txt(billedBy.address.postalCode).up();
129
- sellerAddressEle.ele('ram:LineOne').txt(billedBy.address.streetName).up();
130
- sellerAddressEle.ele('ram:CityName').txt(billedBy.address.city).up();
131
- // Typically you'd include 'ram:CountryID' with ISO2 code, e.g. "DE"
132
- sellerAddressEle.up(); // </ram:PostalTradeAddress>
133
- sellerPartyEle.up(); // </ram:SellerTradeParty>
134
- // Buyer
135
- const buyerPartyEle = headerTradeAgreementEle.ele('ram:BuyerTradeParty');
136
- buyerPartyEle.ele('ram:Name').txt(billedTo.name).up();
137
- const buyerAddressEle = buyerPartyEle.ele('ram:PostalTradeAddress');
138
- buyerAddressEle.ele('ram:PostcodeCode').txt(billedTo.address.postalCode).up();
139
- buyerAddressEle.ele('ram:LineOne').txt(billedTo.address.streetName).up();
140
- buyerAddressEle.ele('ram:CityName').txt(billedTo.address.city).up();
141
- buyerAddressEle.up(); // </ram:PostalTradeAddress>
142
- buyerPartyEle.up(); // </ram:BuyerTradeParty>
143
- headerTradeAgreementEle.up(); // </ram:ApplicableHeaderTradeAgreement>
144
- // 5.3) Applicable Header Trade Delivery
145
- const headerTradeDeliveryEle = supplyChainEle.ele('ram:ApplicableHeaderTradeDelivery');
146
- const actualDeliveryEle = headerTradeDeliveryEle.ele('ram:ActualDeliverySupplyChainEvent');
147
- const occurrenceEle = actualDeliveryEle.ele('ram:OccurrenceDateTime')
148
- .ele('udt:DateTimeString', { format: '102' });
149
- const deliveryDate = invoice.deliveryDate || letterArg.date;
150
- occurrenceEle.txt(this.formatDate(deliveryDate)).up();
151
- actualDeliveryEle.up(); // </ram:ActualDeliverySupplyChainEvent>
152
- headerTradeDeliveryEle.up(); // </ram:ApplicableHeaderTradeDelivery>
153
- // 5.4) Applicable Header Trade Settlement
154
- const headerTradeSettlementEle = supplyChainEle.ele('ram:ApplicableHeaderTradeSettlement');
155
- // Tax currency code, doc currency code, etc.
156
- headerTradeSettlementEle.ele('ram:InvoiceCurrencyCode').txt(invoice.currency).up();
157
- // Example single tax breakdown
158
- const tradeTaxEle = headerTradeSettlementEle.ele('ram:ApplicableTradeTax');
159
- tradeTaxEle.ele('ram:TypeCode').txt('VAT').up();
160
- tradeTaxEle.ele('ram:CalculatedAmount').txt(this.sumAllVat(invoice).toFixed(2)).up();
161
- tradeTaxEle
162
- .ele('ram:RateApplicablePercent')
163
- .txt(this.extractMainVatRate(invoice.items).toFixed(2))
164
- .up();
165
- tradeTaxEle.up(); // </ram:ApplicableTradeTax>
166
- // Payment Terms
167
- const paymentTermsEle = headerTradeSettlementEle.ele('ram:SpecifiedTradePaymentTerms');
168
- // Payment description
169
- paymentTermsEle.ele('ram:Description').txt(`Payment due in ${invoice.dueInDays} days.`).up();
170
- // Due date calculation
171
- const dueDate = new Date(letterArg.date);
172
- dueDate.setDate(dueDate.getDate() + invoice.dueInDays);
173
- // Add due date as per Factur-X spec
174
- paymentTermsEle
175
- .ele('ram:DueDateDateTime')
176
- .ele('udt:DateTimeString', { format: '102' })
177
- .txt(this.formatDate(dueDate.getTime()))
178
- .up()
179
- .up();
180
- // Add payment means if available
181
- if (invoice.billedBy.sepaConnection) {
182
- // Add SEPA information as per Factur-X standard
183
- const paymentMeans = headerTradeSettlementEle.ele('ram:SpecifiedTradeSettlementPaymentMeans');
184
- paymentMeans.ele('ram:TypeCode').txt('58').up(); // 58 = SEPA credit transfer
185
- // Payment reference (for bank statement reconciliation)
186
- paymentMeans.ele('ram:Information').txt(`Reference: ${invoice.id}`).up();
187
- // Payee account (IBAN)
188
- if (invoice.billedBy.sepaConnection.iban) {
189
- const payeeAccount = paymentMeans.ele('ram:PayeePartyCreditorFinancialAccount');
190
- payeeAccount.ele('ram:IBANID').txt(invoice.billedBy.sepaConnection.iban).up();
191
- payeeAccount.up();
192
- }
193
- // Bank BIC
194
- if (invoice.billedBy.sepaConnection.bic) {
195
- const payeeBank = paymentMeans.ele('ram:PayeeSpecifiedCreditorFinancialInstitution');
196
- payeeBank.ele('ram:BICID').txt(invoice.billedBy.sepaConnection.bic).up();
197
- payeeBank.up();
198
- }
199
- paymentMeans.up();
200
- }
201
- paymentTermsEle.up(); // </ram:SpecifiedTradePaymentTerms>
202
- // Monetary Summation
203
- const monetarySummationEle = headerTradeSettlementEle.ele('ram:SpecifiedTradeSettlementHeaderMonetarySummation');
204
- monetarySummationEle
205
- .ele('ram:LineTotalAmount')
206
- .txt(this.calcLineTotalNet(invoice).toFixed(2))
207
- .up();
208
- monetarySummationEle
209
- .ele('ram:TaxTotalAmount')
210
- .txt(this.sumAllVat(invoice).toFixed(2))
211
- .up();
212
- monetarySummationEle
213
- .ele('ram:GrandTotalAmount')
214
- .txt(this.calcGrandTotal(invoice).toFixed(2))
215
- .up();
216
- monetarySummationEle.up(); // </ram:SpecifiedTradeSettlementHeaderMonetarySummation>
217
- headerTradeSettlementEle.up(); // </ram:ApplicableHeaderTradeSettlement>
218
- supplyChainEle.up(); // </rsm:SupplyChainTradeTransaction>
219
- doc.up(); // </rsm:CrossIndustryInvoice>
220
- // 6) Return the final XML string
221
- return doc.end({ prettyPrint: true });
222
- }
223
- /**
224
- * Helper: Determine if the letter is in draft or final.
225
- */
226
- isDraft(letterArg) {
227
- return letterArg.versionInfo?.type === 'draft';
228
- }
229
- /**
230
- * Helper: Format date to certain patterns (very minimal example).
231
- * e.g. 'yyyyMMdd' => '20231231'
232
- */
233
- formatDate(timestampMs) {
234
- const date = new Date(timestampMs);
235
- const yyyy = date.getFullYear();
236
- const mm = String(date.getMonth() + 1).padStart(2, '0');
237
- const dd = String(date.getDate()).padStart(2, '0');
238
- return `${yyyy}${mm}${dd}`;
239
- }
240
- /**
241
- * Helper: Map your custom 'unitType' to an ISO code or similar.
242
- */
243
- mapUnitType(unitType) {
244
- switch (unitType.toLowerCase()) {
245
- case 'hour':
246
- return 'HUR';
247
- case 'piece':
248
- return 'C62';
249
- default:
250
- return 'C62'; // fallback
251
- }
252
- }
253
- /**
254
- * Example: Sum all VAT amounts from items.
255
- */
256
- sumAllVat(invoice) {
257
- return invoice.items.reduce((acc, item) => {
258
- const net = item.unitNetPrice * item.unitQuantity;
259
- const vat = net * (item.vatPercentage / 100);
260
- return acc + vat;
261
- }, 0);
262
- }
263
- /**
264
- * Example: Extract main (or highest) VAT rate from items as representative.
265
- * In reality, you might list multiple 'ApplicableTradeTax' blocks by group.
266
- */
267
- extractMainVatRate(items) {
268
- let max = 0;
269
- items.forEach((item) => {
270
- if (item.vatPercentage > max)
271
- max = item.vatPercentage;
272
- });
273
- return max;
274
- }
275
- /**
276
- * Example: Sum net amounts (without VAT).
277
- */
278
- calcLineTotalNet(invoice) {
279
- return invoice.items.reduce((acc, item) => {
280
- const net = item.unitNetPrice * item.unitQuantity;
281
- return acc + net;
282
- }, 0);
283
- }
284
- /**
285
- * Example: net + VAT = grand total
286
- */
287
- calcGrandTotal(invoice) {
288
- const net = this.calcLineTotalNet(invoice);
289
- const vat = this.sumAllVat(invoice);
290
- return net + vat;
291
- }
292
- }
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeC5lbmNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3J4LmVuY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBRXpCLGdCQUFlLENBQUM7SUFFaEI7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxTQUEyQztRQUNqRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0JBQWdCLENBQUMsU0FBMkM7UUFDakUsbURBQW1EO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQXFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXJFLGlDQUFpQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0I7YUFDekIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDN0MsR0FBRyxDQUFDLDBCQUEwQixFQUFFO1lBQy9CLFdBQVcsRUFBRSw4REFBOEQ7WUFDM0UsV0FBVyxFQUFFLDZEQUE2RDtZQUMxRSxXQUFXLEVBQUUsMkRBQTJEO1lBQ3hFLFdBQVcsRUFBRSxvRkFBb0Y7U0FDbEcsQ0FB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
@@ -1,18 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { BaseDecoder } from './base.decoder.js';
3
- /**
4
- * A decoder for Factur-X/ZUGFeRD XML format (based on UN/CEFACT CII).
5
- * Converts XML into structured ILetter with invoice data.
6
- */
7
- export declare class FacturXDecoder extends BaseDecoder {
8
- private xmlDoc;
9
- constructor(xmlString: string);
10
- /**
11
- * Extracts text from the first element matching the tag name
12
- */
13
- private getElementText;
14
- /**
15
- * Converts Factur-X/ZUGFeRD XML to a structured letter object
16
- */
17
- getLetterData(): Promise<plugins.tsclass.business.ILetter>;
18
- }