UNPKG

@fin.cx/einvoice

Version:

A TypeScript module for creating, manipulating, and embedding XML data within PDF files specifically tailored for electronic invoice (einvoice) packages.

110 lines 7.64 kB
import { BaseValidator } from '../base/base.validator.js'; import { InvoiceFormat, ValidationLevel } from '../../interfaces/common.js'; import { FormatDetector } from '../utils/format.detector.js'; // Import specific validators import { EN16931UBLValidator } from '../ubl/en16931.ubl.validator.js'; import { XRechnungValidator } from '../ubl/xrechnung.validator.js'; import { FacturXValidator } from '../cii/facturx/facturx.validator.js'; import { ZUGFeRDValidator } from '../cii/zugferd/zugferd.validator.js'; // The EN16931UBLValidator handles all UBL-based formats with proper business rules // No need for legacy validator implementations here /** * FatturaPA validator implementation * Basic implementation for Italian electronic invoices */ class FatturaPAValidator extends BaseValidator { validate(level = ValidationLevel.SYNTAX) { // Reset errors this.errors = []; let valid = true; if (level === ValidationLevel.SYNTAX) { valid = this.validateSchema(); } else if (level === ValidationLevel.SEMANTIC || level === ValidationLevel.BUSINESS) { valid = this.validateSchema() && this.validateBusinessRules(); } return { valid, errors: this.errors, level }; } validateSchema() { // Basic schema validation for FatturaPA if (!this.xml.includes('<FatturaElettronica')) { this.addError('FATT-SCHEMA-1', 'Root element must be FatturaElettronica', '/'); return false; } return true; } validateBusinessRules() { // Basic placeholder implementation - would need more detailed rules // for a real implementation return this.validateSchema(); } } /** * Factory to create the appropriate validator based on the XML format */ export class ValidatorFactory { /** * Creates a validator for the specified XML content * @param xml XML content to validate * @returns Appropriate validator instance */ static createValidator(xml) { try { const format = FormatDetector.detectFormat(xml); switch (format) { case InvoiceFormat.UBL: return new EN16931UBLValidator(xml); case InvoiceFormat.XRECHNUNG: return new XRechnungValidator(xml); case InvoiceFormat.CII: // For now, use Factur-X validator for generic CII return new FacturXValidator(xml); case InvoiceFormat.ZUGFERD: return new ZUGFeRDValidator(xml); case InvoiceFormat.FACTURX: return new FacturXValidator(xml); case InvoiceFormat.FATTURAPA: return new FatturaPAValidator(xml); default: // For unknown formats, provide a generic validator that will // mark the document as invalid but won't throw an exception return new GenericValidator(xml, format); } } catch (error) { // If an error occurs during validator creation, return a generic validator // that will provide meaningful error information instead of throwing console.error(`Error creating validator: ${error}`); return new GenericValidator(xml, 'unknown'); } } } /** * Generic validator for unknown or unsupported formats * Provides meaningful validation errors instead of throwing exceptions */ class GenericValidator extends BaseValidator { constructor(xml, format) { super(xml); this.format = format; this.addError('GEN-1', `Unsupported invoice format: ${format}`, '/'); } validate(level = ValidationLevel.SYNTAX) { return { valid: false, errors: this.errors, level }; } validateSchema() { return false; } validateBusinessRules() { return false; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9mb3JtYXRzL2ZhY3Rvcmllcy92YWxpZGF0b3IuZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXZFLG1GQUFtRjtBQUNuRixvREFBb0Q7QUFFcEQ7OztHQUdHO0FBQ0gsTUFBTSxrQkFBbUIsU0FBUSxhQUFhO0lBQzVDLFFBQVEsQ0FBQyxRQUF5QixlQUFlLENBQUMsTUFBTTtRQUN0RCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLENBQUM7YUFBTSxJQUFJLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEYsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztR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