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

@@ -1,7 +1,7 @@
// @vitest-environment jsdom
import { afterEach, describe, expect, it } from 'vitest'
import { act, cleanup, renderHook } from '@testing-library/react'
import { APARTADO_ESQUEMA_DEFAULT, useCotizacion } from './useCotizacion'
import { APARTADO_ESQUEMA_DEFAULT, mensualidadesParaUnidad, useCotizacion } from './useCotizacion'
import { SIN_REGLAS } from '../lib/reglas'
import { MENSUALIDADES_DEFAULT, calcularEsquemaFrasa } from '../lib/esquema-frasa'
import { INVENTARIO_SEED } from '../data/unidades'
@@ -27,7 +27,7 @@ afterEach(cleanup)
describe('useCotizacion — esquema único FRASA 2026', () => {
it('arranca con apartado $15,000, 14 mensualidades y escrituración a la firma', () => {
const { result } = montar()
const { result } = renderHook(() => useCotizacion(SIN_REGLAS))
expect(result.current.apartado).toBe(APARTADO_ESQUEMA_DEFAULT)
expect(result.current.apartadoEfectivo).toBe(15000)
@@ -35,6 +35,34 @@ describe('useCotizacion — esquema único FRASA 2026', () => {
expect(result.current.escrituracionDiferida).toBe(false)
})
it('elegir unidad con fecha de entrega: las mensualidades = meses que faltan para entregarla', () => {
const { result } = renderHook(() => useCotizacion(SIN_REGLAS))
act(() => {
result.current.setUnidad(unidadDiagonal)
})
expect(result.current.numMensualidades).toBe(mensualidadesParaUnidad(unidadDiagonal))
expect(result.current.numMensualidades).not.toBe(MENSUALIDADES_DEFAULT)
})
it('elegir unidad SIN fecha de entrega: cae al default del esquema (14)', () => {
const { result } = renderHook(() => useCotizacion(SIN_REGLAS))
act(() => {
result.current.setUnidad({ ...unidadDiagonal, fechaEntrega: null })
})
expect(result.current.numMensualidades).toBe(MENSUALIDADES_DEFAULT)
})
it('mensualidadesParaUnidad: acota a 1..36 y cae al default sin fecha', () => {
const hoy = new Date('2026-09-29T12:00:00')
const base = { ...unidadDiagonal }
expect(mensualidadesParaUnidad({ ...base, fechaEntrega: '2026-10-15' }, hoy)).toBe(1)
expect(mensualidadesParaUnidad({ ...base, fechaEntrega: '2035-12-31' }, hoy)).toBe(36)
expect(mensualidadesParaUnidad({ ...base, fechaEntrega: '2027-09-29' }, hoy)).toBe(12)
expect(mensualidadesParaUnidad(null, hoy)).toBe(MENSUALIDADES_DEFAULT)
})
it('el resultado cuadra con calcularEsquemaFrasa sobre el precio de lista', () => {
const { result } = montar()
const { unidad, acabados } = result.current
@@ -42,7 +70,7 @@ describe('useCotizacion — esquema único FRASA 2026', () => {
const esperado = calcularEsquemaFrasa({
precio: result.current.precioLista,
apartado: 15000,
numMensualidades: 14,
numMensualidades: mensualidadesParaUnidad(unidadDiagonal),
escrituracionDiferida: false,
})
expect(result.current.resultado).toEqual(esperado)