Files
FRASA-CAS/docs/PLAN-REGLAS-COTIZADOR.md
Consult AS Technology e3b5660769 feat: modulo WhatsApp (WA CRM) con round-robin de conversaciones
- Servicio wacrm en api-gateway (pg pool lazy): round-robin de conversaciones
  sin agente entre vendedores vinculados y miembro-agentes de la cuenta wacrm,
  cron cada 30 s; bandeja del vendedor; estado/config/reasignar para admin.
- Endpoints /api/wacrm/* con guarda de rol admin/manager.
- Usuario.wacrmUserId en schema Prisma (vinculo CRM<->wacrm).
- App apps/wa-crm (/wa-crm/): bandeja + administracion del round-robin.
- Landing: tarjeta WhatsApp; clave 'whatsapp' en MATRIZ de roles.
- Plan de nuevas reglas de negocio del cotizador (docs/PLAN-REGLAS-COTIZADOR.md).
- WACRM_PG_URL apunta a Postgres de Supabase por 127.0.0.1:5433.
- Tests de integracion wacrm (3) y suite completa 764/764 en verde.
2026-09-30 00:30:17 +00:00

126 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```
gastos = 0.055 × precio
firma = % enganche firma elegido (dentro del rango del tipo)
totalEng = % enganche total elegido (≤ tope del tipo; firma ≤ totalEng)
diferido = totalEng − firma (lo que se difiere en mensualidades)
mensualidad = diferido × precio ÷ N_meses
saldoPorPagar = precio + gastos − (firma% + diferido%) × precio
(= precio + gastos − totalEng% × precio)
```
- **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)
1. **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.
2. **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í.
3. **Aforo**: si el financiamiento calculado supera el aforo, ¿bloquear la
opción o mostrarla en rojo como "no viable"? Se propone mostrar no viable.
4. **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)
1. Nuevo tipo `TipoCredito = 'bancario' | 'infonavit' | 'contado' | 'semicontado'`
(reemplaza/usa el catálogo actual de opciones de crédito).
2. Tabla de reglas por tipo (única fuente de verdad en ambos lados, misma
constante): `REGLAS_TIPO` con `{rangoFirmaMin, rangoFirmaMax, topeTotal,
aforo, pisoNotaria, permiteDiferir}`.
3. Entrada del motor: `{precio, apartado, tipo, pctFirma, pctTotal, incluirGastosEnFirma, meses}`.
4. 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`.
5. 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`)
1. Selector de **tipo de crédito** con las 4 opciones y sus topes visibles.
2. **Slider/input de enganche total** (0 → tope del tipo) y **slider/input de
enganche a firma** (rango del tipo, ≤ total).
3. **Toggle "Incluir gastos de escrituración en el pago de firma"**.
4. 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.).
5. 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
1. `Cotizacion`: columnas nuevas `tipoCredito`, `pctFirma`, `pctTotal`,
`incluirGastosFirma` (migración SQLite manual, estilo existente). Mantener
`opcionesCredito` JSON para compatibilidad de lectura histórica.
2. 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.