Plan — Nuevas reglas de negocio del Cotizador FRASA
Fuente: Reglas de negocio Cotizador FRASA .xlsx (entregado por el cliente).
Alcance: aplicar estas reglas al cotizador web (apps/cotizador) y a su espejo
del lado del API (api-gateway/src/services/cotizacion-esquema.service.ts).
1. Lectura de las reglas (interpretación)
Globales (todos los tipos)
| Concepto |
Regla |
| Apartado |
$15,000 (cantidad fija, ya confirmada por el cliente) |
| Gastos de escrituración |
5.5 % del precio de venta |
| Gastos — opción del cliente |
Puede incluirlos en el pago de firma (toggle). Si los incluye, se liquidan junto con el enganche para firma de contrato |
| Mensualidades a diferir |
Número de meses calendario completos entre la fecha de cotización y la fecha de entrega de la vivienda (ya implementado vía captura) |
| Mensualidad a pagar |
Enganche diferido ÷ mensualidades |
| Enganche total |
El % total que el cliente elige pagar como enganche (incluye el apartado). Tope por tipo de crédito |
Tipos de crédito
| Tipo |
Rango enganche para firma |
Tope enganche total |
Aforo |
Notaría |
| Bancario |
2.5 % – 15 % |
15 % |
84.5 % |
No aplica |
| Infonavit-Cofinavit |
2.5 % – 15 % |
15 % |
89.5 % |
No aplica |
| Semi Contado |
50 % – 85 % |
85 % |
No aplica |
Debe quedar 15 % para notaría |
| Contado |
86 % – 95 % |
95 % |
No aplica |
Debe quedar mínimo 5 % para notaría |
Fórmulas
- Bancario / Infonavit-Cofinavit:
monto a financiar = saldoPorPagar.
Validación de aforo: saldoPorPagar ≤ aforo × precio; si se rebasa, la
combinación elegida no es viable y hay que pedir más enganche.
- Semi Contado: no hay financiamiento. Restricción: el saldo por pagar debe
dejar ≥ 15 % para el pago en notaría (
saldoPorPagar ≥ 0.15 × precio,
equivalente a totalEng ≤ 0.85 + gastos%). El "monto pago en notaría" = 15 %.
- Contado: sin mensualidades (diferido = 0; todo el enganche se paga a la
firma). Restricción: saldo ≥ 5 % para notaría (
totalEng ≤ 0.95 + gastos%).
Diferencias contra el esquema actual
| Aspecto |
Esquema actual (FRASA) |
Nuevo |
| Enganche firma |
fijo 2.5 % |
rango por tipo (2.5–15 / 50–85 / 86–95 %) |
| Enganche diferible |
fijo 7.5 % editable |
total elegido − firma |
| Tope enganche |
90 % global |
por tipo: 15 / 15 / 85 / 95 % |
| Aforo |
no se valida |
validación 84.5 / 89.5 % (bancario/infonavit) |
| Gastos 5.5 % |
siempre aparte |
toggle: incluidos en firma u aparte |
| Notaría |
no existe |
piso 15 % (semi) / 5 % (contado) |
| Anticipo adicional |
campo extra (decisión previa: sin espacio separado) |
se absorbe en "enganche total" |
2. Puntos a confirmar con el cliente (antes o durante la implementación)
- Apartado dentro del %: se interpreta que el % de enganche total es
dinero total (el apartado de $15,000 forma parte de él), según la columna
K ("% de enganche elegido incluido el apartado"). Confirmar.
- Semi Contado / Contado: ¿el "pago en notaría" (15 % / 5 %) es parte del
saldo por pagar que el cliente liquida al final? Se asume que sí.
- Aforo: si el financiamiento calculado supera el aforo, ¿bloquear la
opción o mostrarla en rojo como "no viable"? Se propone mostrar no viable.
- Rango de enganche para firma en créditos: ¿el 2.5 % mínimo sigue
incluyendo el apartado como parte del pago a firma (como hoy)? Se propone
que sí.
3. Plan de implementación
3.1 Motor de cálculo — esquema-frasa.ts (app) y cotizacion-esquema.service.ts (API, espejo)
- Nuevo tipo
TipoCredito = 'bancario' | 'infonavit' | 'contado' | 'semicontado'
(reemplaza/usa el catálogo actual de opciones de crédito).
- Tabla de reglas por tipo (única fuente de verdad en ambos lados, misma
constante):
REGLAS_TIPO con {rangoFirmaMin, rangoFirmaMax, topeTotal, aforo, pisoNotaria, permiteDiferir}.
- Entrada del motor:
{precio, apartado, tipo, pctFirma, pctTotal, incluirGastosEnFirma, meses}.
- Salida:
{gastos, montoFirma, montoDiferido, mensualidad, saldoPorPagar, montoFinanciar, pagoNotaria, viable, motivos[]} con validaciones:
- firma dentro de rango; total ≤ tope; total ≥ firma;
- si diferido > 0 → meses ≥ 1 (tope por fecha de entrega, ya existente);
- aforo (bancario/infonavit):
saldo ≤ aforo × precio;
- piso notaría (semi/contado):
saldo ≥ piso × precio.
- Quitar del esquema actual lo que queda reemplazado: enganche fijo 2.5/7.5,
tope global 90 %,
engancheAdicional (el "total elegido" lo absorbe).
3.2 UI del cotizador (apps/cotizador)
- Selector de tipo de crédito con las 4 opciones y sus topes visibles.
- Slider/input de enganche total (0 → tope del tipo) y slider/input de
enganche a firma (rango del tipo, ≤ total).
- Toggle "Incluir gastos de escrituración en el pago de firma".
- Tabla de resultados: apartado, firma, diferido, mensualidad (×N meses),
gastos, saldo, monto a financiar (o pago en notaría), y badge viable /
no viable con motivo (aforo excedido, piso notaría, etc.).
- Las 4 opciones de crédito del guardado existente pasan a ser las 4
combinaciones tipo+porcentajes que el vendedor guarde, no 4 presets fijos.
3.3 Persistencia y reportes
Cotizacion: columnas nuevas tipoCredito, pctFirma, pctTotal,
incluirGastosFirma (migración SQLite manual, estilo existente). Mantener
opcionesCredito JSON para compatibilidad de lectura histórica.
- PDF: sección de desglose según nuevo esquema (firma / diferido / notaría /
financiamiento, viable o no).
3.4 Pruebas
- Unitarias del motor: casos dorados por tipo (límites de rango, tope, aforo
justo arriba/abajo, pisos de notaría, toggle de gastos).
- Smoke API:
POST cotización con cada tipo → verificar montos y viable.
- Regresión: cotizaciones históricas existentes siguen leyéndose.
3.5 Entrega
- Migración + build de
api-gateway y apps/cotizador.
- Actualización de guía de usuario del cotizador (sección reglas).
- Resumen de cambios para el cliente con los puntos 2 resueltos.