49 lines
1.7 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
}
|