feat(alta): dropdown de modelo filtrado por proyecto en vivienda/crédito

- 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
This commit is contained in:
2026-08-28 05:28:59 +00:00
parent 26bf08e789
commit 1f5b6ee088
2 changed files with 41 additions and 3 deletions

View File

@@ -10,7 +10,25 @@ import type {
SlotDocumento, SlotDocumento,
} from '../types' } 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<Record<(typeof PROYECTOS)[number], string[]>> = {
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 }[] = [ export const ESTADOS_CIVILES: { valor: EstadoCivil; etiqueta: string }[] = [
{ valor: 'SOLTERO', etiqueta: 'Soltero(a)' }, { valor: 'SOLTERO', etiqueta: 'Soltero(a)' },

View File

@@ -1,4 +1,5 @@
import { useForm, FormProvider } from 'react-hook-form' import { useForm, FormProvider } from 'react-hook-form'
import { useEffect } from 'react'
import { zodResolver } from '@hookform/resolvers/zod' import { zodResolver } from '@hookform/resolvers/zod'
import type { ViviendaCredito, TipoCredito } from '../types' import type { ViviendaCredito, TipoCredito } from '../types'
import { viviendaCreditoSchema } from '../lib/schemas' import { viviendaCreditoSchema } from '../lib/schemas'
@@ -6,7 +7,7 @@ import { CampoTexto, CampoSelect, MensajeError } from '../components/Campos'
import SectionCard from '../components/SectionCard' import SectionCard from '../components/SectionCard'
import Navegacion from './Navegacion' import Navegacion from './Navegacion'
import type { PasoProps } from './DatosGeneralesForm' 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) */ /** Paso 6: datos de la vivienda, crédito e identificación oficial (PLD) */
export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }: PasoProps<ViviendaCredito>) { export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }: PasoProps<ViviendaCredito>) {
@@ -17,6 +18,17 @@ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }
}) })
const proyecto = metodos.watch('proyecto') const proyecto = metodos.watch('proyecto')
const tiposSeleccionados = metodos.watch('tiposCredito') ?? [] 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 alternarCredito = (valor: TipoCredito) => {
const actuales = metodos.getValues('tiposCredito') ?? [] const actuales = metodos.getValues('tiposCredito') ?? []
@@ -41,7 +53,15 @@ export default function ViviendaCreditoForm({ valores, onAnterior, onSiguiente }
{proyecto === 'OTRO' && ( {proyecto === 'OTRO' && (
<CampoTexto nombre="proyectoOtro" etiqueta="Nombre del proyecto" requerido /> <CampoTexto nombre="proyectoOtro" etiqueta="Nombre del proyecto" requerido />
)} )}
<CampoTexto nombre="modelo" etiqueta="Modelo" /> {modelos ? (
<CampoSelect
nombre="modelo"
etiqueta="Modelo"
opciones={modelos.map((m) => ({ valor: m, etiqueta: m }))}
/>
) : (
<CampoTexto nombre="modelo" etiqueta="Modelo" />
)}
<CampoTexto nombre="manzana" etiqueta="Manzana" /> <CampoTexto nombre="manzana" etiqueta="Manzana" />
<CampoTexto nombre="lote" etiqueta="Lote" /> <CampoTexto nombre="lote" etiqueta="Lote" />
<CampoTexto nombre="ubicacion" etiqueta="Ubicación" /> <CampoTexto nombre="ubicacion" etiqueta="Ubicación" />