xinvoice/ts/formats/utils/format.detector.ts
2025-04-03 16:41:10 +00:00

49 lines
1.7 KiB
TypeScript

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;
}
}
}