@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.
Files changed (171) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.decoder.d.ts +40 -0
  4. package/dist_ts/classes.decoder.js +320 -0
  5. package/dist_ts/classes.encoder.d.ts +51 -0
  6. package/dist_ts/classes.encoder.js +293 -0
  7. package/dist_ts/classes.xinvoice.d.ts +136 -0
  8. package/dist_ts/classes.xinvoice.js +352 -0
  9. package/dist_ts/einvoice.d.ts +217 -0
  10. package/dist_ts/einvoice.js +505 -0
  11. package/dist_ts/errors.d.ts +121 -0
  12. package/dist_ts/errors.js +241 -0
  13. package/dist_ts/formats/base/base.decoder.d.ts +32 -0
  14. package/dist_ts/formats/base/base.decoder.js +52 -0
  15. package/dist_ts/formats/base/base.encoder.d.ts +13 -0
  16. package/dist_ts/formats/base/base.encoder.js +7 -0
  17. package/dist_ts/formats/base/base.validator.d.ts +44 -0
  18. package/dist_ts/formats/base/base.validator.js +39 -0
  19. package/dist_ts/formats/base.decoder.d.ts +19 -0
  20. package/dist_ts/formats/base.decoder.js +130 -0
  21. package/dist_ts/formats/base.validator.d.ts +44 -0
  22. package/dist_ts/formats/base.validator.js +39 -0
  23. package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
  24. package/dist_ts/formats/cii/cii.decoder.js +111 -0
  25. package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
  26. package/dist_ts/formats/cii/cii.encoder.js +48 -0
  27. package/dist_ts/formats/cii/cii.types.d.ts +31 -0
  28. package/dist_ts/formats/cii/cii.types.js +40 -0
  29. package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
  30. package/dist_ts/formats/cii/cii.validator.js +146 -0
  31. package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
  32. package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
  33. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
  34. package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
  35. package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
  36. package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
  37. package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
  38. package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
  39. package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
  40. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
  41. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
  42. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
  43. package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
  44. package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
  45. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
  46. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
  47. package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
  48. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
  49. package/dist_ts/formats/decoder.factory.d.ts +15 -0
  50. package/dist_ts/formats/decoder.factory.js +46 -0
  51. package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
  52. package/dist_ts/formats/factories/decoder.factory.js +56 -0
  53. package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
  54. package/dist_ts/formats/factories/encoder.factory.js +40 -0
  55. package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
  56. package/dist_ts/formats/factories/validator.factory.js +110 -0
  57. package/dist_ts/formats/factorx.decoder.d.ts +18 -0
  58. package/dist_ts/formats/factorx.decoder.js +178 -0
  59. package/dist_ts/formats/factorx.encoder.d.ts +51 -0
  60. package/dist_ts/formats/factorx.encoder.js +293 -0
  61. package/dist_ts/formats/facturx.decoder.d.ts +18 -0
  62. package/dist_ts/formats/facturx.decoder.js +210 -0
  63. package/dist_ts/formats/facturx.encoder.d.ts +51 -0
  64. package/dist_ts/formats/facturx.encoder.js +293 -0
  65. package/dist_ts/formats/facturx.validator.d.ts +67 -0
  66. package/dist_ts/formats/facturx.validator.js +266 -0
  67. package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
  68. package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
  69. package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
  70. package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
  71. package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
  72. package/dist_ts/formats/pdf/extractors/index.js +5 -0
  73. package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
  74. package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
  75. package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
  76. package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
  77. package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
  78. package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
  79. package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
  80. package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
  81. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
  82. package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
  83. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
  84. package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
  85. package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
  86. package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
  87. package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
  88. package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
  89. package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
  90. package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
  91. package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
  92. package/dist_ts/formats/ubl/ubl.types.js +21 -0
  93. package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
  94. package/dist_ts/formats/ubl/ubl.validator.js +112 -0
  95. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
  96. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
  97. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
  98. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
  99. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
  100. package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
  101. package/dist_ts/formats/ubl.validator.d.ts +82 -0
  102. package/dist_ts/formats/ubl.validator.js +306 -0
  103. package/dist_ts/formats/utils/format.detector.d.ts +62 -0
  104. package/dist_ts/formats/utils/format.detector.js +249 -0
  105. package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
  106. package/dist_ts/formats/validation/en16931.validator.js +119 -0
  107. package/dist_ts/formats/validator.factory.d.ts +18 -0
  108. package/dist_ts/formats/validator.factory.js +78 -0
  109. package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
  110. package/dist_ts/formats/xinvoice.decoder.js +332 -0
  111. package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
  112. package/dist_ts/formats/xinvoice.encoder.js +282 -0
  113. package/dist_ts/index.d.ts +51 -0
  114. package/dist_ts/index.js +90 -0
  115. package/dist_ts/interfaces/common.d.ts +79 -0
  116. package/dist_ts/interfaces/common.js +24 -0
  117. package/dist_ts/interfaces.d.ts +87 -0
  118. package/dist_ts/interfaces.js +23 -0
  119. package/dist_ts/plugins.d.ts +14 -0
  120. package/dist_ts/plugins.js +31 -0
  121. package/npmextra.json +35 -0
  122. package/package.json +71 -0
  123. package/readme.hints.md +1107 -0
  124. package/readme.howtofixtests.md +38 -0
  125. package/readme.literature.md +1 -0
  126. package/readme.md +998 -0
  127. package/readme.plan.md +481 -0
  128. package/ts/00_commitinfo_data.ts +8 -0
  129. package/ts/einvoice.ts +603 -0
  130. package/ts/errors.ts +341 -0
  131. package/ts/formats/base/base.decoder.ts +68 -0
  132. package/ts/formats/base/base.encoder.ts +14 -0
  133. package/ts/formats/base/base.validator.ts +64 -0
  134. package/ts/formats/cii/cii.decoder.ts +139 -0
  135. package/ts/formats/cii/cii.encoder.ts +64 -0
  136. package/ts/formats/cii/cii.types.ts +44 -0
  137. package/ts/formats/cii/cii.validator.ts +171 -0
  138. package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
  139. package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
  140. package/ts/formats/cii/facturx/facturx.types.ts +18 -0
  141. package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
  142. package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
  143. package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
  144. package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
  145. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
  146. package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
  147. package/ts/formats/factories/decoder.factory.ts +62 -0
  148. package/ts/formats/factories/encoder.factory.ts +47 -0
  149. package/ts/formats/factories/validator.factory.ts +134 -0
  150. package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
  151. package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
  152. package/ts/formats/pdf/extractors/index.ts +4 -0
  153. package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
  154. package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
  155. package/ts/formats/pdf/pdf.embedder.ts +242 -0
  156. package/ts/formats/pdf/pdf.extractor.ts +141 -0
  157. package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
  158. package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
  159. package/ts/formats/ubl/ubl.decoder.ts +121 -0
  160. package/ts/formats/ubl/ubl.encoder.ts +63 -0
  161. package/ts/formats/ubl/ubl.types.ts +22 -0
  162. package/ts/formats/ubl/ubl.validator.ts +133 -0
  163. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
  164. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
  165. package/ts/formats/ubl/xrechnung.validator.ts +185 -0
  166. package/ts/formats/utils/format.detector.ts +306 -0
  167. package/ts/formats/validation/en16931.validator.ts +135 -0
  168. package/ts/index.ts +164 -0
  169. package/ts/interfaces/common.ts +90 -0
  170. package/ts/interfaces.ts +98 -0
  171. package/ts/plugins.ts +61 -0
@@ -0,0 +1,110 @@
1
+ import { BaseValidator } from '../base/base.validator.js';
2
+ import { InvoiceFormat, ValidationLevel } from '../../interfaces/common.js';
3
+ import { FormatDetector } from '../utils/format.detector.js';
4
+ // Import specific validators
5
+ import { EN16931UBLValidator } from '../ubl/en16931.ubl.validator.js';
6
+ import { XRechnungValidator } from '../ubl/xrechnung.validator.js';
7
+ import { FacturXValidator } from '../cii/facturx/facturx.validator.js';
8
+ import { ZUGFeRDValidator } from '../cii/zugferd/zugferd.validator.js';
9
+ // The EN16931UBLValidator handles all UBL-based formats with proper business rules
10
+ // No need for legacy validator implementations here
11
+ /**
12
+ * FatturaPA validator implementation
13
+ * Basic implementation for Italian electronic invoices
14
+ */
15
+ class FatturaPAValidator extends BaseValidator {
16
+ validate(level = ValidationLevel.SYNTAX) {
17
+ // Reset errors
18
+ this.errors = [];
19
+ let valid = true;
20
+ if (level === ValidationLevel.SYNTAX) {
21
+ valid = this.validateSchema();
22
+ }
23
+ else if (level === ValidationLevel.SEMANTIC || level === ValidationLevel.BUSINESS) {
24
+ valid = this.validateSchema() && this.validateBusinessRules();
25
+ }
26
+ return {
27
+ valid,
28
+ errors: this.errors,
29
+ level
30
+ };
31
+ }
32
+ validateSchema() {
33
+ // Basic schema validation for FatturaPA
34
+ if (!this.xml.includes('<FatturaElettronica')) {
35
+ this.addError('FATT-SCHEMA-1', 'Root element must be FatturaElettronica', '/');
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ validateBusinessRules() {
41
+ // Basic placeholder implementation - would need more detailed rules
42
+ // for a real implementation
43
+ return this.validateSchema();
44
+ }
45
+ }
46
+ /**
47
+ * Factory to create the appropriate validator based on the XML format
48
+ */
49
+ export class ValidatorFactory {
50
+ /**
51
+ * Creates a validator for the specified XML content
52
+ * @param xml XML content to validate
53
+ * @returns Appropriate validator instance
54
+ */
55
+ static createValidator(xml) {
56
+ try {
57
+ const format = FormatDetector.detectFormat(xml);
58
+ switch (format) {
59
+ case InvoiceFormat.UBL:
60
+ return new EN16931UBLValidator(xml);
61
+ case InvoiceFormat.XRECHNUNG:
62
+ return new XRechnungValidator(xml);
63
+ case InvoiceFormat.CII:
64
+ // For now, use Factur-X validator for generic CII
65
+ return new FacturXValidator(xml);
66
+ case InvoiceFormat.ZUGFERD:
67
+ return new ZUGFeRDValidator(xml);
68
+ case InvoiceFormat.FACTURX:
69
+ return new FacturXValidator(xml);
70
+ case InvoiceFormat.FATTURAPA:
71
+ return new FatturaPAValidator(xml);
72
+ default:
73
+ // For unknown formats, provide a generic validator that will
74
+ // mark the document as invalid but won't throw an exception
75
+ return new GenericValidator(xml, format);
76
+ }
77
+ }
78
+ catch (error) {
79
+ // If an error occurs during validator creation, return a generic validator
80
+ // that will provide meaningful error information instead of throwing
81
+ console.error(`Error creating validator: ${error}`);
82
+ return new GenericValidator(xml, 'unknown');
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * Generic validator for unknown or unsupported formats
88
+ * Provides meaningful validation errors instead of throwing exceptions
89
+ */
90
+ class GenericValidator extends BaseValidator {
91
+ constructor(xml, format) {
92
+ super(xml);
93
+ this.format = format;
94
+ this.addError('GEN-1', `Unsupported invoice format: ${format}`, '/');
95
+ }
96
+ validate(level = ValidationLevel.SYNTAX) {
97
+ return {
98
+ valid: false,
99
+ errors: this.errors,
100
+ level
101
+ };
102
+ }
103
+ validateSchema() {
104
+ return false;
105
+ }
106
+ validateBusinessRules() {
107
+ return false;
108
+ }
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL2ZhY3Rvcmllcy92YWxpZGF0b3IuZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXZFLG1GQUFtRjtBQUNuRixvREFBb0Q7QUFFcEQ7OztHQUdHO0FBQ0gsTUFBTSxrQkFBbUIsU0FBUSxhQUFhO0lBQzVDLFFBQVEsQ0FBQyxRQUF5QixlQUFlLENBQUMsTUFBTTtRQUN0RCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEYsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztR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
@@ -0,0 +1,18 @@
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
+ }
@@ -0,0 +1,178 @@
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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
@@ -0,0 +1,51 @@
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
+ }