feat(cotizador): tope de mensualidades = meses que faltan para la entrega (UI y API); nunca se rebasa la fecha de entrega

This commit is contained in:
2026-09-29 20:50:25 +00:00
parent 4e3ce67ae7
commit ed367582c3
7 changed files with 94 additions and 30 deletions

View File

@@ -17,10 +17,11 @@ export const APARTADO_ESQUEMA_DEFAULT = 15000
const MS_POR_MES = 30.4 * 86400000
/**
* Mensualidades del diferimiento sugeridas para una unidad: los meses que
* faltan hasta su fecha de entrega estimada (la que vive en el módulo de
* captura: entrega programada/reprogramada de obra). Si la unidad no trae
* fecha, cae al default del esquema (14). El vendedor puede ajustarla después.
* Tope (y default) de mensualidades del diferimiento para una unidad: los
* meses que faltan hasta su fecha de entrega estimada (la que vive en el
* módulo de captura: entrega programada/reprogramada de obra). El diferimiento
* nunca puede rebasar la entrega de la vivienda. Si la unidad no trae fecha,
* cae al default global del esquema (14; tope 36).
*/
export function mensualidadesParaUnidad(u: Unidad | null, hoy: Date = new Date()): number {
const fecha = u?.fechaEntrega
@@ -101,18 +102,29 @@ export function useCotizacion(reglas: ReglasDesarrollo = SIN_REGLAS): UseCotizac
/** Elige unidad y, con ella, las mensualidades del diferimiento: los meses
* que faltan para la entrega estimada de esa vivienda (dato del módulo de
* captura). El vendedor puede ajustarlas después. */
* captura). El vendedor puede ajustarlas después, sin rebasar la entrega. */
const elegirUnidad = (u: Unidad | null) => {
setUnidad(u)
setNumMensualidades(mensualidadesParaUnidad(u))
}
/** Tope de mensualidades: las que faltan para la entrega (36 sin fecha) */
const topeMensualidades = () => mensualidadesParaUnidad(unidad)
const ajustarMensualidades = (n: number) => {
setNumMensualidades(Math.max(MENSUALIDADES_MIN, Math.min(n, topeMensualidades())))
}
const restaurar = (estado: EstadoRestaurar) => {
setDesarrolloState(estado.desarrollo)
setUnidad(estado.unidad)
setAcabados(estado.acabados)
setApartado(estado.apartado)
setNumMensualidades(estado.numMensualidades ?? MENSUALIDADES_DEFAULT)
// El diferimiento no puede rebasar la entrega: una cotización guardada con
// más mensualidades se acota a las que faltan hoy para esa unidad
setNumMensualidades(
Math.min(estado.numMensualidades ?? MENSUALIDADES_DEFAULT, mensualidadesParaUnidad(estado.unidad)),
)
setEscrituracionDiferida(estado.escrituracionDiferida ?? false)
}
@@ -160,7 +172,7 @@ export function useCotizacion(reglas: ReglasDesarrollo = SIN_REGLAS): UseCotizac
setApartado,
apartadoEfectivo,
numMensualidades,
setNumMensualidades,
setNumMensualidades: ajustarMensualidades,
escrituracionDiferida,
setEscrituracionDiferida,
precioLista,