feat(cotizador): mensualidades del diferimiento = meses faltantes para la entrega estimada de la unidad (captura de obra)

This commit is contained in:
2026-09-29 20:11:24 +00:00
parent 1c1e6b04e4
commit 4e3ce67ae7
6 changed files with 84 additions and 12 deletions

View File

@@ -4,6 +4,8 @@ import { obtenerPrecioLista, resolverNumMensualidades } from '../lib/calculation
import { DESARROLLO_DEFAULT } from '../data/desarrollos'
import {
MENSUALIDADES_DEFAULT,
MENSUALIDADES_MAX,
MENSUALIDADES_MIN,
calcularEsquemaFrasa,
type EsquemaFrasaResultado,
} from '../lib/esquema-frasa'
@@ -12,6 +14,23 @@ import { SIN_REGLAS, desarrolloEfectivo, type ReglasDesarrollo } from '../lib/re
/** Apartado con el que arranca (y se reinicia) el cotizador: cantidad libre */
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.
*/
export function mensualidadesParaUnidad(u: Unidad | null, hoy: Date = new Date()): number {
const fecha = u?.fechaEntrega
if (!fecha) return MENSUALIDADES_DEFAULT
const entrega = new Date(`${fecha}T00:00:00`).getTime()
if (!Number.isFinite(entrega)) return MENSUALIDADES_DEFAULT
const sugeridas = Math.max(MENSUALIDADES_MIN, Math.round((entrega - hoy.getTime()) / MS_POR_MES))
return Math.min(MENSUALIDADES_MAX, sugeridas)
}
interface UseCotizacionResult {
desarrollo: string
/** Cambia de desarrollo: limpia la unidad elegida */
@@ -25,7 +44,9 @@ interface UseCotizacionResult {
setApartado: (v: number) => void
/** Apartado aplicado a los cálculos (acotado a >= 0; el vendedor puede apartar con cualquier monto, incluso $0) */
apartadoEfectivo: number
/** Número de mensualidades del diferimiento (elección del vendedor, 1..36) */
/** Número de mensualidades del diferimiento (1..36): al elegir unidad se
* prellena con los meses que faltan para su entrega estimada; el vendedor
* puede ajustarla */
numMensualidades: number
setNumMensualidades: (n: number) => void
/** true = la escrituración (5.5%) se difiere con el enganche; false = se paga a la firma */
@@ -78,6 +99,14 @@ export function useCotizacion(reglas: ReglasDesarrollo = SIN_REGLAS): UseCotizac
setAcabados(false)
}
/** 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. */
const elegirUnidad = (u: Unidad | null) => {
setUnidad(u)
setNumMensualidades(mensualidadesParaUnidad(u))
}
const restaurar = (estado: EstadoRestaurar) => {
setDesarrolloState(estado.desarrollo)
setUnidad(estado.unidad)
@@ -124,7 +153,7 @@ export function useCotizacion(reglas: ReglasDesarrollo = SIN_REGLAS): UseCotizac
setDesarrollo,
params,
unidad,
setUnidad,
setUnidad: elegirUnidad,
acabados,
setAcabados,
apartado,