import { InvoiceFormat } from '../../interfaces/common.js'; import { DOMParser } from 'xmldom'; /** * Utility class for detecting invoice formats */ export class FormatDetector { /** * Detects the format of an XML document * @param xml XML content to analyze * @returns Detected invoice format */ public static detectFormat(xml: string): InvoiceFormat { try { const doc = new DOMParser().parseFromString(xml, 'application/xml'); const root = doc.documentElement; if (!root) { return InvoiceFormat.UNKNOWN; } // UBL detection (Invoice or CreditNote root element) if (root.nodeName === 'Invoice' || root.nodeName === 'CreditNote') { // For simplicity, we'll treat all UBL documents as XRechnung for now // In a real implementation, we would check for specific customization IDs return InvoiceFormat.XRECHNUNG; } // Factur-X/ZUGFeRD detection (CrossIndustryInvoice root element) if (root.nodeName === 'rsm:CrossIndustryInvoice' || root.nodeName === 'CrossIndustryInvoice') { // For simplicity, we'll treat all CII documents as Factur-X for now // In a real implementation, we would check for specific profiles return InvoiceFormat.FACTURX; } // FatturaPA detection would be implemented here if (root.nodeName === 'FatturaElettronica' || (root.getAttribute('xmlns') && root.getAttribute('xmlns')!.includes('fatturapa.gov.it'))) { return InvoiceFormat.FATTURAPA; } return InvoiceFormat.UNKNOWN; } catch (error) { console.error('Error detecting format:', error); return InvoiceFormat.UNKNOWN; } } }