@fin.cx/einvoice 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.decoder.d.ts +40 -0
- package/dist_ts/classes.decoder.js +320 -0
- package/dist_ts/classes.encoder.d.ts +51 -0
- package/dist_ts/classes.encoder.js +293 -0
- package/dist_ts/classes.xinvoice.d.ts +136 -0
- package/dist_ts/classes.xinvoice.js +352 -0
- package/dist_ts/einvoice.d.ts +217 -0
- package/dist_ts/einvoice.js +505 -0
- package/dist_ts/errors.d.ts +121 -0
- package/dist_ts/errors.js +241 -0
- package/dist_ts/formats/base/base.decoder.d.ts +32 -0
- package/dist_ts/formats/base/base.decoder.js +52 -0
- package/dist_ts/formats/base/base.encoder.d.ts +13 -0
- package/dist_ts/formats/base/base.encoder.js +7 -0
- package/dist_ts/formats/base/base.validator.d.ts +44 -0
- package/dist_ts/formats/base/base.validator.js +39 -0
- package/dist_ts/formats/base.decoder.d.ts +19 -0
- package/dist_ts/formats/base.decoder.js +130 -0
- package/dist_ts/formats/base.validator.d.ts +44 -0
- package/dist_ts/formats/base.validator.js +39 -0
- package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
- package/dist_ts/formats/cii/cii.decoder.js +111 -0
- package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
- package/dist_ts/formats/cii/cii.encoder.js +48 -0
- package/dist_ts/formats/cii/cii.types.d.ts +31 -0
- package/dist_ts/formats/cii/cii.types.js +40 -0
- package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
- package/dist_ts/formats/cii/cii.validator.js +146 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
- package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
- package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
- package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
- package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
- package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
- package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
- package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
- package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
- package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
- package/dist_ts/formats/decoder.factory.d.ts +15 -0
- package/dist_ts/formats/decoder.factory.js +46 -0
- package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
- package/dist_ts/formats/factories/decoder.factory.js +56 -0
- package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
- package/dist_ts/formats/factories/encoder.factory.js +40 -0
- package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
- package/dist_ts/formats/factories/validator.factory.js +110 -0
- package/dist_ts/formats/factorx.decoder.d.ts +18 -0
- package/dist_ts/formats/factorx.decoder.js +178 -0
- package/dist_ts/formats/factorx.encoder.d.ts +51 -0
- package/dist_ts/formats/factorx.encoder.js +293 -0
- package/dist_ts/formats/facturx.decoder.d.ts +18 -0
- package/dist_ts/formats/facturx.decoder.js +210 -0
- package/dist_ts/formats/facturx.encoder.d.ts +51 -0
- package/dist_ts/formats/facturx.encoder.js +293 -0
- package/dist_ts/formats/facturx.validator.d.ts +67 -0
- package/dist_ts/formats/facturx.validator.js +266 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
- package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
- package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
- package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
- package/dist_ts/formats/pdf/extractors/index.js +5 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
- package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
- package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
- package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
- package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
- package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
- package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
- package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
- package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
- package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
- package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
- package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
- package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
- package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
- package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
- package/dist_ts/formats/ubl/ubl.types.js +21 -0
- package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
- package/dist_ts/formats/ubl/ubl.validator.js +112 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
- package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
- package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
- package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
- package/dist_ts/formats/ubl.validator.d.ts +82 -0
- package/dist_ts/formats/ubl.validator.js +306 -0
- package/dist_ts/formats/utils/format.detector.d.ts +62 -0
- package/dist_ts/formats/utils/format.detector.js +249 -0
- package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
- package/dist_ts/formats/validation/en16931.validator.js +119 -0
- package/dist_ts/formats/validator.factory.d.ts +18 -0
- package/dist_ts/formats/validator.factory.js +78 -0
- package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
- package/dist_ts/formats/xinvoice.decoder.js +332 -0
- package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
- package/dist_ts/formats/xinvoice.encoder.js +282 -0
- package/dist_ts/index.d.ts +51 -0
- package/dist_ts/index.js +90 -0
- package/dist_ts/interfaces/common.d.ts +79 -0
- package/dist_ts/interfaces/common.js +24 -0
- package/dist_ts/interfaces.d.ts +87 -0
- package/dist_ts/interfaces.js +23 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +31 -0
- package/npmextra.json +35 -0
- package/package.json +71 -0
- package/readme.hints.md +1107 -0
- package/readme.howtofixtests.md +38 -0
- package/readme.literature.md +1 -0
- package/readme.md +998 -0
- package/readme.plan.md +481 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/einvoice.ts +603 -0
- package/ts/errors.ts +341 -0
- package/ts/formats/base/base.decoder.ts +68 -0
- package/ts/formats/base/base.encoder.ts +14 -0
- package/ts/formats/base/base.validator.ts +64 -0
- package/ts/formats/cii/cii.decoder.ts +139 -0
- package/ts/formats/cii/cii.encoder.ts +64 -0
- package/ts/formats/cii/cii.types.ts +44 -0
- package/ts/formats/cii/cii.validator.ts +171 -0
- package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
- package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
- package/ts/formats/cii/facturx/facturx.types.ts +18 -0
- package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
- package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
- package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
- package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
- package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
- package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
- package/ts/formats/factories/decoder.factory.ts +62 -0
- package/ts/formats/factories/encoder.factory.ts +47 -0
- package/ts/formats/factories/validator.factory.ts +134 -0
- package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
- package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
- package/ts/formats/pdf/extractors/index.ts +4 -0
- package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
- package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
- package/ts/formats/pdf/pdf.embedder.ts +242 -0
- package/ts/formats/pdf/pdf.extractor.ts +141 -0
- package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
- package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
- package/ts/formats/ubl/ubl.decoder.ts +121 -0
- package/ts/formats/ubl/ubl.encoder.ts +63 -0
- package/ts/formats/ubl/ubl.types.ts +22 -0
- package/ts/formats/ubl/ubl.validator.ts +133 -0
- package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
- package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
- package/ts/formats/ubl/xrechnung.validator.ts +185 -0
- package/ts/formats/utils/format.detector.ts +306 -0
- package/ts/formats/validation/en16931.validator.ts +135 -0
- package/ts/index.ts +164 -0
- package/ts/interfaces/common.ts +90 -0
- package/ts/interfaces.ts +98 -0
- package/ts/plugins.ts +61 -0
|
@@ -0,0 +1,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lpLnZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2Zvcm1hdHMvY2lpL2NpaS52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGdCQUFpQixTQUFRLGFBQWE7SUFNMUQsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUhILFlBQU8sR0FBZSxVQUFVLENBQUMsT0FBTyxDQUFDO1FBS2pELElBQUksQ0FBQztZQUNILHFCQUFxQjtZQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRW5FLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHO2dCQUNoQixHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUc7Z0JBQ3ZCLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRztnQkFDdkIsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHO2FBQ3hCLENBQUM7WUFFRix3Q0FBd0M7WUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVuRCxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxRQUF5QixlQUFlLENBQUMsTUFBTTtRQUM3RCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPO2dCQUNMLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDO1FBQ0osQ0FBQztRQUVELG9DQUFvQztRQUNwQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMsQ0FBQzthQUFNLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzVELENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDOUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUs7U0FDTixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNPLGNBQWM7UUFDdEIsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTVCLHlCQUF5QjtRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssMEJBQTBCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSwrQ0FBK0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGtEQUFrRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVFEOztPQUVHO0lBQ08sYUFBYTtRQUNyQiw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FDN0IsOEZBQThGLEVBQzlGLElBQUksQ0FBQyxHQUFHLENBQ1QsQ0FBQztRQUVGLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRTNDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDcEMsQ0FBQztpQkFBTSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sT0FBTyxDQUFDLFNBQWlCLEVBQUUsT0FBYztRQUNqRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxTQUFTLENBQUMsU0FBaUIsRUFBRSxPQUFjO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sTUFBTSxDQUFDLFNBQWlCLEVBQUUsT0FBYztRQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIn0=
|
|
@@ -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
|
+
}
|