import type { InfoTributaria, InfoFactura, DetalleItem, TotalImpuesto } from "@/types/factura" import { formatDateForSRI } from "@/utils/factura/validations" export class XmlGenerator { static generateFacturaXml( infoTributaria: InfoTributaria, infoFactura: InfoFactura, detalles: DetalleItem[], totalesImpuestos: TotalImpuesto[] ): string { let xml = ` ${infoTributaria.ambiente} ${infoTributaria.tipoEmision} ${infoTributaria.razonSocial} ${infoTributaria.nombreComercial} ${infoTributaria.ruc} ${infoTributaria.claveAcceso} 01 ${infoTributaria.estab} ${infoTributaria.ptoEmi} ${infoTributaria.secuencial} ${infoTributaria.dirMatriz} ${formatDateForSRI(infoFactura.fechaEmision)} ${infoFactura.dirEstablecimiento} ${infoTributaria.obligadoContabilidad} ${infoFactura.tipoIdentificacionComprador} ${infoFactura.razonSocialComprador} ${infoFactura.identificacionComprador} ${infoFactura.totalSinImpuestos} ${infoFactura.totalDescuento} ` // Agregar múltiples impuestos según los detalles totalesImpuestos.forEach(impuesto => { xml += ` ${impuesto.codigo} ${impuesto.codigoPorcentaje} ${impuesto.baseImponible} ${impuesto.valor} ` }) xml += ` 0.00 ${infoFactura.importeTotal} DOLAR ${infoFactura.formaPago} ${infoFactura.importeTotal} ${infoFactura.plazo} ${infoFactura.unidadTiempo} ` detalles.forEach(item => { // Si codigoAuxiliar está vacío, usar el codigoPrincipal como fallback const codigoAux = item.codigoAuxiliar?.trim() || item.codigoPrincipal || '001' xml += ` ${item.codigoPrincipal} ${codigoAux} ${item.descripcion} ${item.cantidad} ${parseFloat(item.precioUnitario).toFixed(6)} ${item.descuento} ${item.precioTotalSinImpuesto} 2 ${item.codigoPorcentaje} ${item.tarifa} ${item.baseImponible} ${item.valorImpuesto} ` }) xml += ` ${infoFactura.direccionComprador} ${infoFactura.emailComprador} ${infoFactura.telefonoComprador} ` return xml } }