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:
2
apps/api/src/migrations/tenant/044_cfdi_cp_receptor.sql
Normal file
2
apps/api/src/migrations/tenant/044_cfdi_cp_receptor.sql
Normal 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);
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user