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)}`}