@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,39 @@
1
+ import { ValidationLevel } from '../interfaces.js';
2
+ /**
3
+ * Base validator class that defines common validation functionality
4
+ * for all invoice format validators
5
+ */
6
+ export class BaseValidator {
7
+ constructor(xml) {
8
+ this.errors = [];
9
+ this.xml = xml;
10
+ }
11
+ /**
12
+ * Gets all validation errors found during validation
13
+ * @returns Array of validation errors
14
+ */
15
+ getValidationErrors() {
16
+ return this.errors;
17
+ }
18
+ /**
19
+ * Checks if the document is valid
20
+ * @returns True if no validation errors were found
21
+ */
22
+ isValid() {
23
+ return this.errors.length === 0;
24
+ }
25
+ /**
26
+ * Adds an error to the validation errors list
27
+ * @param code Error code
28
+ * @param message Error message
29
+ * @param location Location in the XML where the error occurred
30
+ */
31
+ addError(code, message, location = '') {
32
+ this.errors.push({
33
+ code,
34
+ message,
35
+ location
36
+ });
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9mb3JtYXRzL2Jhc2UudmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUduRDs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUFJakMsWUFBWSxHQUFXO1FBRmIsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFHdkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQVNEOzs7T0FHRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBY0Q7Ozs7O09BS0c7SUFDTyxRQUFRLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxXQUFtQixFQUFFO1FBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2YsSUFBSTtZQUNKLE9BQU87WUFDUCxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIn0=
@@ -0,0 +1,61 @@
1
+ import { BaseDecoder } from '../base/base.decoder.js';
2
+ import type { TInvoice, TCreditNote, TDebitNote } from '../../interfaces/common.js';
3
+ import { CIIProfile } from './cii.types.js';
4
+ import { xpath } from '../../plugins.js';
5
+ /**
6
+ * Base decoder for CII-based invoice formats
7
+ */
8
+ export declare abstract class CIIBaseDecoder extends BaseDecoder {
9
+ protected doc: Document;
10
+ protected namespaces: Record<string, string>;
11
+ protected select: xpath.XPathSelect;
12
+ protected profile: CIIProfile;
13
+ constructor(xml: string, skipValidation?: boolean);
14
+ /**
15
+ * Decodes CII XML into a TInvoice object
16
+ * @returns Promise resolving to a TInvoice object
17
+ */
18
+ decode(): Promise<TInvoice>;
19
+ /**
20
+ * Detects the CII profile from the XML
21
+ */
22
+ protected detectProfile(): void;
23
+ /**
24
+ * Decodes a CII credit note
25
+ * @returns Promise resolving to a TCreditNote object
26
+ */
27
+ protected abstract decodeCreditNote(): Promise<TCreditNote>;
28
+ /**
29
+ * Decodes a CII debit note (invoice)
30
+ * @returns Promise resolving to a TDebitNote object
31
+ */
32
+ protected abstract decodeDebitNote(): Promise<TDebitNote>;
33
+ /**
34
+ * Gets a text value from an XPath expression
35
+ * @param xpath XPath expression
36
+ * @param context Optional context node
37
+ * @returns Text value or empty string if not found
38
+ */
39
+ protected getText(xpathExpr: string, context?: Node): string;
40
+ /**
41
+ * Gets a number value from an XPath expression
42
+ * @param xpath XPath expression
43
+ * @param context Optional context node
44
+ * @returns Number value or 0 if not found or not a number
45
+ */
46
+ protected getNumber(xpathExpr: string, context?: Node): number;
47
+ /**
48
+ * Gets a date value from an XPath expression
49
+ * @param xpath XPath expression
50
+ * @param context Optional context node
51
+ * @returns Date timestamp or current time if not found or invalid
52
+ */
53
+ protected getDate(xpathExpr: string, context?: Node): number;
54
+ /**
55
+ * Checks if a node exists
56
+ * @param xpath XPath expression
57
+ * @param context Optional context node
58
+ * @returns True if node exists
59
+ */
60
+ protected exists(xpathExpr: string, context?: Node): boolean;
61
+ }
@@ -0,0 +1,111 @@
1
+ import { BaseDecoder } from '../base/base.decoder.js';
2
+ import { CII_NAMESPACES, CIIProfile } from './cii.types.js';
3
+ import { DOMParser, xpath } from '../../plugins.js';
4
+ /**
5
+ * Base decoder for CII-based invoice formats
6
+ */
7
+ export class CIIBaseDecoder extends BaseDecoder {
8
+ constructor(xml, skipValidation = false) {
9
+ super(xml, skipValidation);
10
+ this.profile = CIIProfile.EN16931;
11
+ // Parse XML document
12
+ this.doc = new DOMParser().parseFromString(xml, 'application/xml');
13
+ // Set up namespaces for XPath queries
14
+ this.namespaces = {
15
+ rsm: CII_NAMESPACES.RSM,
16
+ ram: CII_NAMESPACES.RAM,
17
+ udt: CII_NAMESPACES.UDT
18
+ };
19
+ // Create XPath selector with namespaces
20
+ this.select = xpath.useNamespaces(this.namespaces);
21
+ // Detect profile
22
+ this.detectProfile();
23
+ }
24
+ /**
25
+ * Decodes CII XML into a TInvoice object
26
+ * @returns Promise resolving to a TInvoice object
27
+ */
28
+ async decode() {
29
+ // Determine if it's a credit note or debit note based on type code
30
+ const typeCode = this.getText('//ram:TypeCode');
31
+ if (typeCode === '381') { // Credit note type code
32
+ return this.decodeCreditNote();
33
+ }
34
+ else {
35
+ return this.decodeDebitNote();
36
+ }
37
+ }
38
+ /**
39
+ * Detects the CII profile from the XML
40
+ */
41
+ detectProfile() {
42
+ // Look for profile identifier
43
+ const profileNode = this.select('string(//rsm:ExchangedDocumentContext/ram:GuidelineSpecifiedDocumentContextParameter/ram:ID)', this.doc);
44
+ if (profileNode) {
45
+ const profileText = profileNode.toString();
46
+ if (profileText.includes('BASIC')) {
47
+ this.profile = CIIProfile.BASIC;
48
+ }
49
+ else if (profileText.includes('EN16931')) {
50
+ this.profile = CIIProfile.EN16931;
51
+ }
52
+ else if (profileText.includes('EXTENDED')) {
53
+ this.profile = CIIProfile.EXTENDED;
54
+ }
55
+ else if (profileText.includes('MINIMUM')) {
56
+ this.profile = CIIProfile.MINIMUM;
57
+ }
58
+ else if (profileText.includes('COMFORT')) {
59
+ this.profile = CIIProfile.COMFORT;
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Gets a text value from an XPath expression
65
+ * @param xpath XPath expression
66
+ * @param context Optional context node
67
+ * @returns Text value or empty string if not found
68
+ */
69
+ getText(xpathExpr, context) {
70
+ const node = this.select(xpathExpr, context || this.doc)[0];
71
+ return node ? (node.textContent || '') : '';
72
+ }
73
+ /**
74
+ * Gets a number value from an XPath expression
75
+ * @param xpath XPath expression
76
+ * @param context Optional context node
77
+ * @returns Number value or 0 if not found or not a number
78
+ */
79
+ getNumber(xpathExpr, context) {
80
+ const text = this.getText(xpathExpr, context);
81
+ const num = parseFloat(text);
82
+ return isNaN(num) ? 0 : num;
83
+ }
84
+ /**
85
+ * Gets a date value from an XPath expression
86
+ * @param xpath XPath expression
87
+ * @param context Optional context node
88
+ * @returns Date timestamp or current time if not found or invalid
89
+ */
90
+ getDate(xpathExpr, context) {
91
+ const text = this.getText(xpathExpr, context);
92
+ if (!text)
93
+ return Date.now();
94
+ const date = new Date(text);
95
+ return isNaN(date.getTime()) ? Date.now() : date.getTime();
96
+ }
97
+ /**
98
+ * Checks if a node exists
99
+ * @param xpath XPath expression
100
+ * @param context Optional context node
101
+ * @returns True if node exists
102
+ */
103
+ exists(xpathExpr, context) {
104
+ const nodes = this.select(xpathExpr, context || this.doc);
105
+ if (Array.isArray(nodes)) {
106
+ return nodes.length > 0;
107
+ }
108
+ return false;
109
+ }
110
+ }
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lpLmRlY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL2NpaS9jaWkuZGVjb2Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixjQUFlLFNBQVEsV0FBVztJQU10RCxZQUFZLEdBQVcsRUFBRSxpQkFBMEIsS0FBSztRQUN0RCxLQUFLLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBSG5CLFlBQU8sR0FBZSxVQUFVLENBQUMsT0FBTyxDQUFDO1FBS2pELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5FLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRztZQUN2QixHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUc7WUFDdkIsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHO1NBQ3hCLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRCxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsTUFBTTtRQUNqQixtRUFBbUU7UUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0Is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
@@ -0,0 +1,43 @@
1
+ import { BaseEncoder } from '../base/base.encoder.js';
2
+ import type { TInvoice, TCreditNote, TDebitNote } from '../../interfaces/common.js';
3
+ import { CIIProfile } from './cii.types.js';
4
+ /**
5
+ * Base encoder for CII-based invoice formats
6
+ */
7
+ export declare abstract class CIIBaseEncoder extends BaseEncoder {
8
+ protected profile: CIIProfile;
9
+ /**
10
+ * Sets the CII profile to use for encoding
11
+ * @param profile CII profile
12
+ */
13
+ setProfile(profile: CIIProfile): void;
14
+ /**
15
+ * Encodes a TInvoice object into CII XML
16
+ * @param invoice TInvoice object to encode
17
+ * @returns CII XML string
18
+ */
19
+ encode(invoice: TInvoice): Promise<string>;
20
+ /**
21
+ * Encodes a TCreditNote object into CII XML
22
+ * @param creditNote TCreditNote object to encode
23
+ * @returns CII XML string
24
+ */
25
+ protected abstract encodeCreditNote(creditNote: TCreditNote): Promise<string>;
26
+ /**
27
+ * Encodes a TDebitNote object into CII XML
28
+ * @param debitNote TDebitNote object to encode
29
+ * @returns CII XML string
30
+ */
31
+ protected abstract encodeDebitNote(debitNote: TDebitNote): Promise<string>;
32
+ /**
33
+ * Creates the XML declaration and root element
34
+ * @returns XML string with declaration and root element
35
+ */
36
+ protected createXmlRoot(): string;
37
+ /**
38
+ * Formats a date as an ISO string (YYYY-MM-DD)
39
+ * @param timestamp Timestamp to format
40
+ * @returns Formatted date string
41
+ */
42
+ protected formatDate(timestamp: number): string;
43
+ }
@@ -0,0 +1,48 @@
1
+ import { BaseEncoder } from '../base/base.encoder.js';
2
+ import { CII_NAMESPACES, CIIProfile } from './cii.types.js';
3
+ /**
4
+ * Base encoder for CII-based invoice formats
5
+ */
6
+ export class CIIBaseEncoder extends BaseEncoder {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.profile = CIIProfile.EN16931;
10
+ }
11
+ /**
12
+ * Sets the CII profile to use for encoding
13
+ * @param profile CII profile
14
+ */
15
+ setProfile(profile) {
16
+ this.profile = profile;
17
+ }
18
+ /**
19
+ * Encodes a TInvoice object into CII XML
20
+ * @param invoice TInvoice object to encode
21
+ * @returns CII XML string
22
+ */
23
+ async encode(invoice) {
24
+ // TInvoice is always an invoice, treat it as debit note for encoding
25
+ return this.encodeDebitNote(invoice);
26
+ }
27
+ /**
28
+ * Creates the XML declaration and root element
29
+ * @returns XML string with declaration and root element
30
+ */
31
+ createXmlRoot() {
32
+ return `<?xml version="1.0" encoding="UTF-8"?>
33
+ <rsm:CrossIndustryInvoice xmlns:rsm="${CII_NAMESPACES.RSM}"
34
+ xmlns:ram="${CII_NAMESPACES.RAM}"
35
+ xmlns:udt="${CII_NAMESPACES.UDT}">
36
+ </rsm:CrossIndustryInvoice>`;
37
+ }
38
+ /**
39
+ * Formats a date as an ISO string (YYYY-MM-DD)
40
+ * @param timestamp Timestamp to format
41
+ * @returns Formatted date string
42
+ */
43
+ formatDate(timestamp) {
44
+ const date = new Date(timestamp);
45
+ return date.toISOString().split('T')[0];
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lpLmVuY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL2NpaS9jaWkuZW5jb2Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsY0FBZSxTQUFRLFdBQVc7SUFBeEQ7O1FBQ1ksWUFBTyxHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUM7SUF1RHJELENBQUM7SUFyREM7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLE9BQW1CO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFpQjtRQUNuQyxxRUFBcUU7UUFDckUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQWdDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBZ0JEOzs7T0FHRztJQUNPLGFBQWE7UUFDckIsT0FBTzt1Q0FDNEIsY0FBYyxDQUFDLEdBQUc7ZUFDMUMsY0FBYyxDQUFDLEdBQUc7ZUFDbEIsY0FBYyxDQUFDLEdBQUc7NEJBQ0wsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLFVBQVUsQ0FBQyxTQUFpQjtRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGIn0=
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CII-specific types and constants
3
+ */
4
+ export declare const CII_NAMESPACES: {
5
+ RSM: string;
6
+ RAM: string;
7
+ UDT: string;
8
+ };
9
+ export declare const ZUGFERD_V1_NAMESPACES: {
10
+ RSM: string;
11
+ RAM: string;
12
+ UDT: string;
13
+ };
14
+ export declare enum CIIProfile {
15
+ BASIC = "BASIC",
16
+ COMFORT = "COMFORT",
17
+ EXTENDED = "EXTENDED",
18
+ EN16931 = "EN16931",
19
+ MINIMUM = "MINIMUM"
20
+ }
21
+ export declare const CII_PROFILE_IDS: {
22
+ FACTURX_MINIMUM: string;
23
+ FACTURX_BASIC: string;
24
+ FACTURX_EN16931: string;
25
+ ZUGFERD_BASIC: string;
26
+ ZUGFERD_COMFORT: string;
27
+ ZUGFERD_EXTENDED: string;
28
+ ZUGFERD_V1_BASIC: string;
29
+ ZUGFERD_V1_COMFORT: string;
30
+ ZUGFERD_V1_EXTENDED: string;
31
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * CII-specific types and constants
3
+ */
4
+ // CII namespaces (ZUGFeRD v2/Factur-X)
5
+ export const CII_NAMESPACES = {
6
+ RSM: 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100',
7
+ RAM: 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100',
8
+ UDT: 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'
9
+ };
10
+ // ZUGFeRD v1 namespaces
11
+ export const ZUGFERD_V1_NAMESPACES = {
12
+ RSM: 'urn:ferd:CrossIndustryDocument:invoice:1p0',
13
+ RAM: 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12',
14
+ UDT: 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15'
15
+ };
16
+ // CII profiles
17
+ export var CIIProfile;
18
+ (function (CIIProfile) {
19
+ CIIProfile["BASIC"] = "BASIC";
20
+ CIIProfile["COMFORT"] = "COMFORT";
21
+ CIIProfile["EXTENDED"] = "EXTENDED";
22
+ CIIProfile["EN16931"] = "EN16931";
23
+ CIIProfile["MINIMUM"] = "MINIMUM";
24
+ })(CIIProfile || (CIIProfile = {}));
25
+ // CII profile IDs for different formats
26
+ export const CII_PROFILE_IDS = {
27
+ // Factur-X profiles
28
+ FACTURX_MINIMUM: 'urn:factur-x.eu:1p0:minimum',
29
+ FACTURX_BASIC: 'urn:factur-x.eu:1p0:basicwl',
30
+ FACTURX_EN16931: 'urn:cen.eu:en16931:2017',
31
+ // ZUGFeRD v2 profiles
32
+ ZUGFERD_BASIC: 'urn:zugferd:basic',
33
+ ZUGFERD_COMFORT: 'urn:zugferd:comfort',
34
+ ZUGFERD_EXTENDED: 'urn:zugferd:extended',
35
+ // ZUGFeRD v1 profiles
36
+ ZUGFERD_V1_BASIC: 'urn:ferd:CrossIndustryDocument:invoice:1p0:basic',
37
+ ZUGFERD_V1_COMFORT: 'urn:ferd:CrossIndustryDocument:invoice:1p0:comfort',
38
+ ZUGFERD_V1_EXTENDED: 'urn:ferd:CrossIndustryDocument:invoice:1p0:extended'
39
+ };
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lpLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy9jaWkvY2lpLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsdUNBQXVDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM1QixHQUFHLEVBQUUsOERBQThEO0lBQ25FLEdBQUcsRUFBRSxvRkFBb0Y7SUFDekYsR0FBRyxFQUFFLDZEQUE2RDtDQUNuRSxDQUFDO0FBRUYsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLEdBQUcsRUFBRSw0Q0FBNEM7SUFDakQsR0FBRyxFQUFFLG1GQUFtRjtJQUN4RixHQUFHLEVBQUUsNERBQTREO0NBQ2xFLENBQUM7QUFFRixlQUFlO0FBQ2YsTUFBTSxDQUFOLElBQVksVUFNWDtBQU5ELFdBQVksVUFBVTtJQUNwQiw2QkFBZSxDQUFBO0lBQ2YsaUNBQW1CLENBQUE7SUFDbkIsbUNBQXFCLENBQUE7SUFDckIsaUNBQW1CLENBQUE7SUFDbkIsaUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQU5XLFVBQVUsS0FBVixVQUFVLFFBTXJCO0FBRUQsd0NBQXdDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixvQkFBb0I7SUFDcEIsZUFBZSxFQUFFLDZCQUE2QjtJQUM5QyxhQUFhLEVBQUUsNkJBQTZCO0lBQzVDLGVBQWUsRUFBRSx5QkFBeUI7SUFFMUMsc0JBQXNCO0lBQ3RCLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsZUFBZSxFQUFFLHFCQUFxQjtJQUN0QyxnQkFBZ0IsRUFBRSxzQkFBc0I7SUFFeEMsc0JBQXNCO0lBQ3RCLGdCQUFnQixFQUFFLGtEQUFrRDtJQUNwRSxrQkFBa0IsRUFBRSxvREFBb0Q7SUFDeEUsbUJBQW1CLEVBQUUscURBQXFEO0NBQzNFLENBQUMifQ==
@@ -0,0 +1,56 @@
1
+ import { BaseValidator } from '../base/base.validator.js';
2
+ import { ValidationLevel } from '../../interfaces/common.js';
3
+ import type { ValidationResult } from '../../interfaces/common.js';
4
+ import { CIIProfile } from './cii.types.js';
5
+ import { xpath } from '../../plugins.js';
6
+ /**
7
+ * Base validator for CII-based invoice formats
8
+ */
9
+ export declare abstract class CIIBaseValidator extends BaseValidator {
10
+ protected doc: Document;
11
+ protected namespaces: Record<string, string>;
12
+ protected select: xpath.XPathSelect;
13
+ protected profile: CIIProfile;
14
+ constructor(xml: string);
15
+ /**
16
+ * Validates CII XML against the specified level of validation
17
+ * @param level Validation level
18
+ * @returns Result of validation
19
+ */
20
+ validate(level?: ValidationLevel): ValidationResult;
21
+ /**
22
+ * Validates CII XML against schema
23
+ * @returns True if schema validation passed
24
+ */
25
+ protected validateSchema(): boolean;
26
+ /**
27
+ * Validates structure of the CII XML document
28
+ * @returns True if structure validation passed
29
+ */
30
+ protected abstract validateStructure(): boolean;
31
+ /**
32
+ * Detects the CII profile from the XML
33
+ */
34
+ protected detectProfile(): void;
35
+ /**
36
+ * Gets a text value from an XPath expression
37
+ * @param xpath XPath expression
38
+ * @param context Optional context node
39
+ * @returns Text value or empty string if not found
40
+ */
41
+ protected getText(xpathExpr: string, context?: Node): string;
42
+ /**
43
+ * Gets a number value from an XPath expression
44
+ * @param xpath XPath expression
45
+ * @param context Optional context node
46
+ * @returns Number value or 0 if not found or not a number
47
+ */
48
+ protected getNumber(xpathExpr: string, context?: Node): number;
49
+ /**
50
+ * Checks if a node exists
51
+ * @param xpath XPath expression
52
+ * @param context Optional context node
53
+ * @returns True if node exists
54
+ */
55
+ protected exists(xpathExpr: string, context?: Node): boolean;
56
+ }
@@ -0,0 +1,146 @@
1
+ import { BaseValidator } from '../base/base.validator.js';
2
+ import { ValidationLevel } from '../../interfaces/common.js';
3
+ import { CII_NAMESPACES, CIIProfile } from './cii.types.js';
4
+ import { DOMParser, xpath } from '../../plugins.js';
5
+ /**
6
+ * Base validator for CII-based invoice formats
7
+ */
8
+ export class CIIBaseValidator extends BaseValidator {
9
+ constructor(xml) {
10
+ super(xml);
11
+ this.profile = CIIProfile.EN16931;
12
+ try {
13
+ // Parse XML document
14
+ this.doc = new DOMParser().parseFromString(xml, 'application/xml');
15
+ // Set up namespaces for XPath queries
16
+ this.namespaces = {
17
+ rsm: CII_NAMESPACES.RSM,
18
+ ram: CII_NAMESPACES.RAM,
19
+ udt: CII_NAMESPACES.UDT
20
+ };
21
+ // Create XPath selector with namespaces
22
+ this.select = xpath.useNamespaces(this.namespaces);
23
+ // Detect profile
24
+ this.detectProfile();
25
+ }
26
+ catch (error) {
27
+ this.addError('CII-PARSE', `Failed to parse XML: ${error}`, '/');
28
+ }
29
+ }
30
+ /**
31
+ * Validates CII XML against the specified level of validation
32
+ * @param level Validation level
33
+ * @returns Result of validation
34
+ */
35
+ validate(level = ValidationLevel.SYNTAX) {
36
+ // Reset errors
37
+ this.errors = [];
38
+ // Check if document was parsed successfully
39
+ if (!this.doc) {
40
+ return {
41
+ valid: false,
42
+ errors: this.errors,
43
+ level: level
44
+ };
45
+ }
46
+ // Perform validation based on level
47
+ let valid = true;
48
+ if (level === ValidationLevel.SYNTAX) {
49
+ valid = this.validateSchema();
50
+ }
51
+ else if (level === ValidationLevel.SEMANTIC) {
52
+ valid = this.validateSchema() && this.validateStructure();
53
+ }
54
+ else if (level === ValidationLevel.BUSINESS) {
55
+ valid = this.validateSchema() &&
56
+ this.validateStructure() &&
57
+ this.validateBusinessRules();
58
+ }
59
+ return {
60
+ valid,
61
+ errors: this.errors,
62
+ level
63
+ };
64
+ }
65
+ /**
66
+ * Validates CII XML against schema
67
+ * @returns True if schema validation passed
68
+ */
69
+ validateSchema() {
70
+ // Basic schema validation (simplified for now)
71
+ if (!this.doc)
72
+ return false;
73
+ // Check for root element
74
+ const root = this.doc.documentElement;
75
+ if (!root || root.nodeName !== 'rsm:CrossIndustryInvoice') {
76
+ this.addError('CII-SCHEMA-1', 'Root element must be rsm:CrossIndustryInvoice', '/');
77
+ return false;
78
+ }
79
+ // Check for required namespaces
80
+ if (!root.lookupNamespaceURI('rsm') || !root.lookupNamespaceURI('ram')) {
81
+ this.addError('CII-SCHEMA-2', 'Required namespaces rsm and ram must be declared', '/');
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+ /**
87
+ * Detects the CII profile from the XML
88
+ */
89
+ detectProfile() {
90
+ // Look for profile identifier
91
+ const profileNode = this.select('string(//rsm:ExchangedDocumentContext/ram:GuidelineSpecifiedDocumentContextParameter/ram:ID)', this.doc);
92
+ if (profileNode) {
93
+ const profileText = profileNode.toString();
94
+ if (profileText.includes('BASIC')) {
95
+ this.profile = CIIProfile.BASIC;
96
+ }
97
+ else if (profileText.includes('EN16931')) {
98
+ this.profile = CIIProfile.EN16931;
99
+ }
100
+ else if (profileText.includes('EXTENDED')) {
101
+ this.profile = CIIProfile.EXTENDED;
102
+ }
103
+ else if (profileText.includes('MINIMUM')) {
104
+ this.profile = CIIProfile.MINIMUM;
105
+ }
106
+ else if (profileText.includes('COMFORT')) {
107
+ this.profile = CIIProfile.COMFORT;
108
+ }
109
+ }
110
+ }
111
+ /**
112
+ * Gets a text value from an XPath expression
113
+ * @param xpath XPath expression
114
+ * @param context Optional context node
115
+ * @returns Text value or empty string if not found
116
+ */
117
+ getText(xpathExpr, context) {
118
+ const node = this.select(xpathExpr, context || this.doc)[0];
119
+ return node ? (node.textContent || '') : '';
120
+ }
121
+ /**
122
+ * Gets a number value from an XPath expression
123
+ * @param xpath XPath expression
124
+ * @param context Optional context node
125
+ * @returns Number value or 0 if not found or not a number
126
+ */
127
+ getNumber(xpathExpr, context) {
128
+ const text = this.getText(xpathExpr, context);
129
+ const num = parseFloat(text);
130
+ return isNaN(num) ? 0 : num;
131
+ }
132
+ /**
133
+ * Checks if a node exists
134
+ * @param xpath XPath expression
135
+ * @param context Optional context node
136
+ * @returns True if node exists
137
+ */
138
+ exists(xpathExpr, context) {
139
+ const nodes = this.select(xpathExpr, context || this.doc);
140
+ if (Array.isArray(nodes)) {
141
+ return nodes.length > 0;
142
+ }
143
+ return false;
144
+ }
145
+ }
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lpLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvY2lpL2NpaS52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGdCQUFpQixTQUFRLGFBQWE7SUFNMUQsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUhILFlBQU8sR0FBZSxVQUFVLENBQUMsT0FBTyxDQUFDO1FBS2pELElBQUksQ0FBQztZQUNILHFCQUFxQjtZQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRW5FLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHO2dCQUNoQixHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUc7Z0JBQ3ZCLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRztnQkFDdkIsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHO2FBQ3hCLENBQUM7WUFFRix3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVuRCxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFX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
@@ -0,0 +1,43 @@
1
+ import { CIIBaseDecoder } from '../cii.decoder.js';
2
+ import type { TCreditNote, TDebitNote } from '../../../interfaces/common.js';
3
+ /**
4
+ * Decoder for Factur-X invoice format
5
+ */
6
+ export declare class FacturXDecoder extends CIIBaseDecoder {
7
+ /**
8
+ * Decodes a Factur-X credit note
9
+ * @returns Promise resolving to a TCreditNote object
10
+ */
11
+ protected decodeCreditNote(): Promise<TCreditNote>;
12
+ /**
13
+ * Decodes a Factur-X debit note (invoice)
14
+ * @returns Promise resolving to a TDebitNote object
15
+ */
16
+ protected decodeDebitNote(): Promise<TDebitNote>;
17
+ /**
18
+ * Extracts common invoice data from Factur-X XML
19
+ * @returns Common invoice data
20
+ */
21
+ private extractCommonData;
22
+ /**
23
+ * Extracts party information from Factur-X XML
24
+ * @param partyXPath XPath to the party node
25
+ * @returns Party information as TContact
26
+ */
27
+ private extractParty;
28
+ /**
29
+ * Extracts invoice items from Factur-X XML
30
+ * @returns Array of invoice items
31
+ */
32
+ private extractItems;
33
+ /**
34
+ * Extracts notes from Factur-X XML
35
+ * @returns Array of notes
36
+ */
37
+ private extractNotes;
38
+ /**
39
+ * Creates a default date object
40
+ * @returns Default date object
41
+ */
42
+ private createDefaultDate;
43
+ }