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:
@@ -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<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 }[] = [
|
||||
{ valor: 'SOLTERO', etiqueta: 'Soltero(a)' },
|
||||
|
||||
@@ -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<ViviendaCredito>) {
|
||||
@@ -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' && (
|
||||
<CampoTexto nombre="proyectoOtro" etiqueta="Nombre del proyecto" requerido />
|
||||
)}
|
||||
{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="lote" etiqueta="Lote" />
|
||||
<CampoTexto nombre="ubicacion" etiqueta="Ubicación" />
|
||||
|
||||
Reference in New Issue
Block a user