Files
FRASA-CAS/api-gateway/src/services/etapas.test.ts
Consult AS Technology 9e04b76616 feat(unidades): pipeline de 10 etapas por unidad + sync desde Reporte_EstatusVenta
- Columna Etapa en Monday Unidades (10 labels oficiales), 155 unidades pobladas
- sync-etapas.ts idempotente (--archivo/--dry-run/--semilla) con traspasos
  Vendido→Escrituración y Escriturado→SAC como actividades (sin retroactivas)
- API: etapa en unidades + porEtapa en /api/reportes/resumen
- Dashboard: gráfica pipeline por etapa + KPI en notaría; cotizador muestra etapa
- 28 cambios aplicados desde Reporte_EstatusVenta (8 avances, 20 nuevas);
  contradicciones retenidas para revisión humana (documentadas)
- Tests: api 168, dashboards 9, cotizador 71
2026-08-28 04:43:02 +00:00

47 lines
1.8 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { ETAPAS_PIPELINE, normalizarEtapa, rangoEtapa, TRASPASOS } from './etapas.js'
describe('normalizarEtapa', () => {
it('mapea las etiquetas del maestro ERP a los labels oficiales', () => {
expect(normalizarEtapa('APARTADO')).toBe('Apartado')
expect(normalizarEtapa('RESERVADO')).toBe('Reserva')
expect(normalizarEtapa('VENDIDO')).toBe('Vendido')
expect(normalizarEtapa('INTEGRACION')).toBe('Integración')
expect(normalizarEtapa('EN ANALISIS')).toBe('En Análisis')
expect(normalizarEtapa('AUTORIZADO')).toBe('Autorizado')
expect(normalizarEtapa('NOTARIA')).toBe('Notaría')
expect(normalizarEtapa('ESCRITURADO')).toBe('Escriturado')
expect(normalizarEtapa('ENTREGA')).toBe('Entrega')
expect(normalizarEtapa('POSTVENTA')).toBe('PostVenta')
})
it('acepta los labels oficiales tal cual (idempotente)', () => {
for (const etapa of ETAPAS_PIPELINE) {
expect(normalizarEtapa(etapa)).toBe(etapa)
}
})
it('devuelve null para vacío, DISPONIBLE o desconocidos', () => {
expect(normalizarEtapa('')).toBeNull()
expect(normalizarEtapa(null)).toBeNull()
expect(normalizarEtapa(undefined)).toBeNull()
expect(normalizarEtapa('DISPONIBLE')).toBeNull()
expect(normalizarEtapa('OTRA COSA')).toBeNull()
})
})
describe('rangoEtapa / TRASPASOS', () => {
it('el rango sigue el orden oficial 1..10', () => {
expect(rangoEtapa('Apartado')).toBe(1)
expect(rangoEtapa('Vendido')).toBe(3)
expect(rangoEtapa('Escriturado')).toBe(8)
expect(rangoEtapa('PostVenta')).toBe(10)
})
it('solo Vendido y Escriturado disparan traspaso de departamento', () => {
expect(TRASPASOS['Vendido']).toBe('Escrituración')
expect(TRASPASOS['Escriturado']).toBe('SAC')
expect(Object.keys(TRASPASOS)).toHaveLength(2)
})
})