From d0174fed3ec33fd251036956adab880d657f8409 Mon Sep 17 00:00:00 2001 From: Horux Dev Date: Tue, 19 May 2026 16:15:41 +0000 Subject: [PATCH] feat(cfdi-viewer): mostrar complemento de pago en facturas tipo P MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Para CFDIs tipo P (Pago) el visor ahora muestra: - Monto pagado - Fecha de pago - Número de parcialidad - UUID relacionado (factura pagada) - Saldo insoluto - Impuestos del pago (ISR/IVA/IEPS retenciones y traslados) Además se ocultan para tipo P: - Tabla de conceptos (dummy) - Bloque de totales tradicional (subtotal/IVA/total) - Sección CFDIs relacionados (reemplazada por UUID pagado) El complemento de pago se renderiza en una card verde destacada. --- apps/web/components/cfdi/cfdi-invoice.tsx | 158 ++++++++++++++++------ 1 file changed, 118 insertions(+), 40 deletions(-) diff --git a/apps/web/components/cfdi/cfdi-invoice.tsx b/apps/web/components/cfdi/cfdi-invoice.tsx index 6695564..b764962 100644 --- a/apps/web/components/cfdi/cfdi-invoice.tsx +++ b/apps/web/components/cfdi/cfdi-invoice.tsx @@ -204,8 +204,8 @@ export const CfdiInvoice = forwardRef( - {/* CFDIs Relacionados */} - {(cfdi.cfdiTipoRelacion || cfdi.cfdisRelacionados) && ( + {/* CFDIs Relacionados (no-P) */} + {(cfdi.cfdiTipoRelacion || cfdi.cfdisRelacionados) && cfdi.tipoComprobante !== 'P' && (
@@ -239,6 +239,82 @@ export const CfdiInvoice = forwardRef(
)} + {/* Complemento de Pago (solo tipo P) */} + {cfdi.tipoComprobante === 'P' && ( +
+
+ + + +
+

Complemento de Pago

+ {cfdi.montoPago > 0 && ( +
+ Monto pagado + {formatCurrency(cfdi.montoPago)} +
+ )} + {cfdi.fechaPagoP && ( +
+ Fecha de pago + {formatDate(cfdi.fechaPagoP)} +
+ )} + {cfdi.numParcialidad && ( +
+ Parcialidad + {cfdi.numParcialidad} +
+ )} + {cfdi.uuidRelacionado && ( +
+ UUID relacionado (factura pagada): +
+ {cfdi.uuidRelacionado.split('|').map((uuid) => uuid.trim()).filter(Boolean).map((uuid, idx) => ( + + {uuid} + + ))} +
+
+ )} + {cfdi.saldoInsoluto && ( +
+ Saldo insoluto + {cfdi.saldoInsoluto} +
+ )} + {/* Impuestos del pago */} + {(cfdi.isrRetencionPago > 0 || cfdi.ivaTrasladoPago > 0 || cfdi.ivaRetencionPago > 0 || cfdi.iepsTrasladoPago > 0 || cfdi.iepsRetencionPago > 0) && ( +
+

Impuestos del pago

+
+ {cfdi.isrRetencionPago > 0 && ( +
ISR Ret.-{formatCurrency(cfdi.isrRetencionPago)}
+ )} + {cfdi.ivaTrasladoPago > 0 && ( +
IVA Tras.{formatCurrency(cfdi.ivaTrasladoPago)}
+ )} + {cfdi.ivaRetencionPago > 0 && ( +
IVA Ret.-{formatCurrency(cfdi.ivaRetencionPago)}
+ )} + {cfdi.iepsTrasladoPago > 0 && ( +
IEPS Tras.{formatCurrency(cfdi.iepsTrasladoPago)}
+ )} + {cfdi.iepsRetencionPago > 0 && ( +
IEPS Ret.-{formatCurrency(cfdi.iepsRetencionPago)}
+ )} +
+
+ )} +
+
+
+ )} + {/* Datos del Comprobante */}
@@ -272,8 +348,8 @@ export const CfdiInvoice = forwardRef(
- {/* Conceptos */} - {conceptos && conceptos.length > 0 && ( + {/* Conceptos — ocultar para tipo P (concepto dummy) */} + {conceptos && conceptos.length > 0 && cfdi.tipoComprobante !== 'P' && (

@@ -323,45 +399,47 @@ export const CfdiInvoice = forwardRef(

)} - {/* Totales */} -
-
-
-
- Subtotal - {formatCurrency(cfdi.subtotal)} + {/* Totales — ocultar bloque tradicional para tipo P */} + {cfdi.tipoComprobante !== 'P' && ( +
+
+
+
+ Subtotal + {formatCurrency(cfdi.subtotal)} +
+ {cfdi.descuento > 0 && ( +
+ Descuento + -{formatCurrency(cfdi.descuento)} +
+ )} + {cfdi.ivaTraslado > 0 && ( +
+ IVA (16%) + {formatCurrency(cfdi.ivaTraslado)} +
+ )} + {cfdi.ivaRetencion > 0 && ( +
+ IVA Retenido + -{formatCurrency(cfdi.ivaRetencion)} +
+ )} + {cfdi.isrRetencion > 0 && ( +
+ ISR Retenido + -{formatCurrency(cfdi.isrRetencion)} +
+ )} +
+
+ TOTAL + {formatCurrency(cfdi.total)}
- {cfdi.descuento > 0 && ( -
- Descuento - -{formatCurrency(cfdi.descuento)} -
- )} - {cfdi.ivaTraslado > 0 && ( -
- IVA (16%) - {formatCurrency(cfdi.ivaTraslado)} -
- )} - {cfdi.ivaRetencion > 0 && ( -
- IVA Retenido - -{formatCurrency(cfdi.ivaRetencion)} -
- )} - {cfdi.isrRetencion > 0 && ( -
- ISR Retenido - -{formatCurrency(cfdi.isrRetencion)} -
- )} -
-
- TOTAL - {formatCurrency(cfdi.total)}
-
+ )} {/* Timbre Fiscal Digital */}