From 1f5b6ee0885909dddef3072b41baae0a6a164313 Mon Sep 17 00:00:00 2001 From: Consult AS Technology Date: Fri, 28 Aug 2026 05:28:59 +0000 Subject: [PATCH] =?UTF-8?q?feat(alta):=20dropdown=20de=20modelo=20filtrado?= =?UTF-8?q?=20por=20proyecto=20en=20vivienda/cr=C3=A9dito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MODELOS_POR_PROYECTO con los modelos reales del inventario (DIAGONAL, SENDA, ATELIER, ESTANZA, SOLANA); texto libre en OTRO/Montebello - PROYECTOS ampliado con ATELIER, ESTANZA y SOLANA - Limpia el modelo al cambiar de proyecto si no aplica --- apps/alta-clientes/src/data/constantes.ts | 20 +++++++++++++++- .../src/forms/ViviendaCreditoForm.tsx | 24 +++++++++++++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/apps/alta-clientes/src/data/constantes.ts b/apps/alta-clientes/src/data/constantes.ts index 53660f7..3922969 100644 --- a/apps/alta-clientes/src/data/constantes.ts +++ b/apps/alta-clientes/src/data/constantes.ts @@ -10,7 +10,25 @@ import type { SlotDocumento, } from '../types' -export const PROYECTOS = ['RESIDENCIAL MONTEBELLO', 'SENDA', 'DIAGONAL', 'OTRO'] as const +export const PROYECTOS = [ + 'RESIDENCIAL MONTEBELLO', + 'SENDA', + 'DIAGONAL', + 'ATELIER', + 'ESTANZA', + 'SOLANA', + 'OTRO', +] as const + +// Modelos por proyecto (inventario real, ago-2026). Los proyectos sin lista +// (RESIDENCIAL MONTEBELLO histórico, OTRO) capturan el modelo en texto libre. +export const MODELOS_POR_PROYECTO: Partial> = { + DIAGONAL: ['1R', '2RA', '2RB', '2RC'], + SENDA: ['HIMALAYA', 'SANTIAGO', 'ESMERALDA PA', 'ESMERALDA PB', 'SANTA CRUZ'], + ATELIER: ['TRIBECA', 'SOHO'], + ESTANZA: ['DUPLO A', 'DUPLO B'], + SOLANA: ['MIRADOR', 'PANORAMA'], +} export const ESTADOS_CIVILES: { valor: EstadoCivil; etiqueta: string }[] = [ { valor: 'SOLTERO', etiqueta: 'Soltero(a)' }, diff --git a/apps/alta-clientes/src/forms/ViviendaCreditoForm.tsx b/apps/alta-clientes/src/forms/ViviendaCreditoForm.tsx index 6402f64..c017775 100644 --- a/apps/alta-clientes/src/forms/ViviendaCreditoForm.tsx +++ b/apps/alta-clientes/src/forms/ViviendaCreditoForm.tsx @@ -1,4 +1,5 @@ import { useForm, FormProvider } from 'react-hook-form' +import { useEffect } from 'react' import { zodResolver } from '@hookform/resolvers/zod' import type { ViviendaCredito, TipoCredito } from '../types' import { viviendaCreditoSchema } from '../lib/schemas' @@ -6,7 +7,7 @@ import { CampoTexto, CampoSelect, MensajeError } from '../components/Campos' import SectionCard from '../components/SectionCard' import Navegacion from './Navegacion' import type { PasoProps } from './DatosGeneralesForm' -import { PROYECTOS, TIPOS_CREDITO, TIPOS_PRODUCTO } from '../data/constantes' +import { PROYECTOS, MODELOS_POR_PROYECTO, TIPOS_CREDITO, TIPOS_PRODUCTO } from '../data/constantes' /** Paso 6: datos de la vivienda, crédito e identificación oficial (PLD) */ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }: PasoProps) { @@ -17,6 +18,17 @@ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente } }) const proyecto = metodos.watch('proyecto') const tiposSeleccionados = metodos.watch('tiposCredito') ?? [] + type Proyecto = (typeof PROYECTOS)[number] + const modelos = MODELOS_POR_PROYECTO[proyecto as Proyecto] + + // Al cambiar de proyecto, limpia el modelo si no aplica en la lista nueva + useEffect(() => { + const actual = metodos.getValues('modelo') + if (modelos && actual && !modelos.includes(actual)) { + metodos.setValue('modelo', '', { shouldDirty: true }) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [proyecto]) const alternarCredito = (valor: TipoCredito) => { const actuales = metodos.getValues('tiposCredito') ?? [] @@ -41,7 +53,15 @@ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente } {proyecto === 'OTRO' && ( )} - + {modelos ? ( + ({ valor: m, etiqueta: m }))} + /> + ) : ( + + )}