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,
|
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)' },
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
Reference in New Issue
Block a user