diff --git a/api-gateway/src/services/unidades-local.service.test.ts b/api-gateway/src/services/unidades-local.service.test.ts
index baa33a3..1771298 100644
--- a/api-gateway/src/services/unidades-local.service.test.ts
+++ b/api-gateway/src/services/unidades-local.service.test.ts
@@ -89,12 +89,13 @@ describe('getUnidadesLocal / getUnidadLocal', () => {
expect(senda.map((u) => u.codigo)).toEqual(['U-2', 'U-3'])
})
- it('completa fechaEntrega desde la captura: entrega programada > habitabilidad > inicio de obra', async () => {
+ it('completa fechaEntrega desde la captura: reprogramada > programada > habitabilidad > inicio de obra', async () => {
prismaMock.unidad.findMany.mockResolvedValue([
fila({ codigo: 'U-1', desarrollo: 'DIAGONAL' }),
fila({ codigo: 'U-2', desarrollo: 'DIAGONAL' }),
fila({ codigo: 'S-1', desarrollo: 'SENDA' }),
fila({ codigo: 'S-2', desarrollo: 'SENDA' }),
+ fila({ codigo: 'S-3', desarrollo: 'SENDA' }),
])
prismaMock.capturaDepartamento.findMany.mockResolvedValue([
{ unidadCodigo: 'U-1', campo: 'inicio_obra_fecha', valor: '2026-01-01' },
@@ -104,11 +105,16 @@ describe('getUnidadesLocal / getUnidadLocal', () => {
// Valor vacío / no-fecha: no cuenta como dato
{ unidadCodigo: 'S-1', campo: 'entrega_programada_fecha', valor: '' },
{ unidadCodigo: 'S-2', campo: 'entrega_programada_fecha', valor: 'pendiente' },
+ // Reprogramada: manda sobre la programada cuando existe
+ { unidadCodigo: 'U-1', campo: 'entrega_reprogramada_fecha', valor: '2028-02-15' },
+ // Reprogramada vacía: se ignora y gana la programada
+ { unidadCodigo: 'S-3', campo: 'entrega_reprogramada_fecha', valor: '' },
+ { unidadCodigo: 'S-3', campo: 'entrega_programada_fecha', valor: '2027-07-01' },
])
const todas = await getUnidadesLocal()
- expect(todas.map((u) => u.fechaEntrega)).toEqual(['2027-11-20', null, '2027-05-05', null])
+ expect(todas.map((u) => u.fechaEntrega)).toEqual(['2028-02-15', null, '2027-05-05', null, '2027-07-01'])
expect(prismaMock.capturaDepartamento.findMany).toHaveBeenCalledWith(
expect.objectContaining({ where: { campo: { in: [...CAMPOS_FECHA_ENTREGA] } } }),
)
diff --git a/api-gateway/src/services/unidades-local.service.ts b/api-gateway/src/services/unidades-local.service.ts
index 4a97be1..7284b99 100644
--- a/api-gateway/src/services/unidades-local.service.ts
+++ b/api-gateway/src/services/unidades-local.service.ts
@@ -14,12 +14,15 @@ import type { UnidadCotizable } from './cotizacion.service.js'
/**
* Campos de `CapturaDepartamento` que dan la fecha de entrega de la vivienda,
- * en orden de prioridad:
- * 1. `entrega_programada_fecha` — Fecha Programada Entrega Vivienda (ESCRITURACION)
- * 2. `habitabilidad` — fecha de habitabilidad (OBRA), la de DIAGONAL
- * 3. `inicio_obra_fecha` — último recurso (ESCRITURACION)
+ * en orden de prioridad (el primero con fecha válida gana):
+ * 1. `entrega_reprogramada_fecha` — Fecha Reprogramada Entrega (la más reciente,
+ * cuando obra movió la entrega es la fecha que manda)
+ * 2. `entrega_programada_fecha` — Fecha Programada Entrega Vivienda
+ * 3. `habitabilidad` — fecha de habitabilidad (OBRA), la de DIAGONAL
+ * 4. `inicio_obra_fecha` — último recurso (ESCRITURACION)
*/
export const CAMPOS_FECHA_ENTREGA = [
+ 'entrega_reprogramada_fecha',
'entrega_programada_fecha',
'habitabilidad',
'inicio_obra_fecha',
diff --git a/apps/cotizador/src/components/EsquemaPanel.tsx b/apps/cotizador/src/components/EsquemaPanel.tsx
index eb45dc4..6cc1e5d 100644
--- a/apps/cotizador/src/components/EsquemaPanel.tsx
+++ b/apps/cotizador/src/components/EsquemaPanel.tsx
@@ -11,6 +11,8 @@ import { formatoMoneda, formatoPorcentaje } from '../lib/formatters'
interface Props {
/** Esquema FRASA 2026 calculado (siempre presente: solo se renderiza con unidad) */
esquema: EsquemaFrasaResultado
+ /** Fecha de entrega estimada de la unidad (captura de obra); alimenta la nota del diferimiento */
+ fechaEntrega?: string | null
numMensualidades: number
onNumMensualidades: (n: number) => void
escrituracionDiferida: boolean
@@ -31,6 +33,7 @@ const pasoMonto = 'mt-1 text-lg font-semibold text-[#111827] dark:text-[#E2E8F0]
*/
export function EsquemaPanel({
esquema,
+ fechaEntrega,
numMensualidades,
onNumMensualidades,
escrituracionDiferida,
@@ -145,7 +148,9 @@ export function EsquemaPanel({
)}
- De {MENSUALIDADES_MIN} a {MENSUALIDADES_MAX}; cada una de {formatoMoneda(esquema.mensualidad)}
+ {fechaEntrega
+ ? `Sugeridas por la entrega estimada (${new Date(`${fechaEntrega}T00:00:00`).toLocaleDateString('es-MX', { day: 'numeric', month: 'short', year: 'numeric' })}); cada una de ${formatoMoneda(esquema.mensualidad)}`
+ : `De ${MENSUALIDADES_MIN} a ${MENSUALIDADES_MAX}; cada una de ${formatoMoneda(esquema.mensualidad)}`}