feat(cfdi): agrega C.P. receptor, regimen receptor, no_identificacion, tipo_relacion y CFDIs relacionados al visualizador

Backend:
- Migracion 044: codigo_postal_receptor VARCHAR(5) + indice
- sat-parser: extrae DomicilioFiscalReceptor
- sat.service: persiste codigo_postal_receptor en INSERT/UPDATE
- cfdi.service: incluye codigo_postal_receptor en CFDI_SELECT
- shared/types: codigoPostalReceptor en interfaz Cfdi

Frontend:
- cfdi-invoice: tarjeta receptor con C.P. y regimen (con descripciones)
- cfdi-invoice: seccion CFDI Relacionado (tipo + UUIDs)
- cfdi-invoice: columna No. Identificacion en tabla de conceptos
- cfdi-viewer-modal: mapea noIdentificacion desde DB y XML
This commit is contained in:
Horux Dev
2026-05-16 14:45:00 +00:00
parent 0bde43a309
commit bda0a4e212
8 changed files with 142 additions and 6 deletions

View File

@@ -0,0 +1,2 @@
-- Agregar código postal del receptor al CFDI (extraído del XML durante sync SAT)
ALTER TABLE cfdis ADD COLUMN IF NOT EXISTS codigo_postal_receptor VARCHAR(5);

View File

@@ -60,6 +60,7 @@ const CFDI_SELECT = `
conciliado,
regimen_fiscal_emisor as "regimenFiscalEmisor",
regimen_fiscal_receptor as "regimenFiscalReceptor",
codigo_postal_receptor as "codigoPostalReceptor",
xml_url as "xmlUrl", pdf_url as "pdfUrl",
xml_original as "xmlOriginal",
cfdi_tipo_relacion as "cfdiTipoRelacion",

View File

@@ -61,6 +61,7 @@ interface CfdiParsed {
regimenFiscalEmisor: string | null;
regimenFiscalReceptor: string | null;
codigoPostalReceptor: string | null;
// CfdiRelacionados a nivel raíz del comprobante (CFDI 4.0).
// `cfdiTipoRelacion` — clave SAT (01..07). NULL si no hay relación.
// `cfdisRelacionados` — UUIDs pipe-separated.
@@ -541,6 +542,7 @@ export function parseXml(xmlContent: string, downloadType: 'emitidos' | 'recibid
pac: timbreData.pac,
regimenFiscalEmisor: emisor['@_RegimenFiscal'] || null,
regimenFiscalReceptor: receptor['@_RegimenFiscalReceptor'] || receptor['@_RegimenFiscal'] || null,
codigoPostalReceptor: receptor['@_DomicilioFiscalReceptor'] || null,
cfdiTipoRelacion: relacionesData.tipoRelacion,
cfdisRelacionados: relacionesData.uuids,
// Impuestos comprobante

View File

@@ -211,6 +211,7 @@ async function saveCfdis(
cfdi.otrasDeduccionesNomina, m(cfdi.otrasDeduccionesNomina),
cfdi.subsidioCausado, m(cfdi.subsidioCausado),
cfdi.regimenFiscalEmisor, cfdi.regimenFiscalReceptor,
cfdi.codigoPostalReceptor,
cfdi.xmlOriginal,
cfdi.cfdiTipoRelacion, cfdi.cfdisRelacionados,
jobId,
@@ -259,9 +260,10 @@ async function saveCfdis(
otras_deducciones_nomina=$76, otras_deducciones_nomina_mxn=$77,
subsidio_causado=$78, subsidio_causado_mxn=$79,
regimen_fiscal_emisor=$80, regimen_fiscal_receptor=$81,
xml_original=$82,
cfdi_tipo_relacion=$83, cfdis_relacionados=$84,
last_sat_sync=NOW(), sat_sync_job_id=$85::uuid,
codigo_postal_receptor=$82,
xml_original=$83,
cfdi_tipo_relacion=$84, cfdis_relacionados=$85,
last_sat_sync=NOW(), sat_sync_job_id=$86::uuid,
actualizado_en=NOW()
WHERE uuid = $1`,
[cfdi.uuid, ...vals]
@@ -307,6 +309,7 @@ async function saveCfdis(
otras_deducciones_nomina, otras_deducciones_nomina_mxn,
subsidio_causado, subsidio_causado_mxn,
regimen_fiscal_emisor, regimen_fiscal_receptor,
codigo_postal_receptor,
xml_original,
cfdi_tipo_relacion, cfdis_relacionados,
source, sat_sync_job_id, last_sat_sync, contribuyente_id