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
This commit is contained in:
46
api-gateway/src/services/etapas.test.ts
Normal file
46
api-gateway/src/services/etapas.test.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
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)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user