feat(captura): módulo de captura por departamentos

Backend: tabla CapturaDepartamento, 5 departamentos, 7 desarrollos,
service CRUD + importador Excel + 6 endpoints.
Frontend: tabla editable inline, tabs por dept, resumen avance,
paginación, filtro estatus, permisos por rol, dark mode.
746 API tests + 42 landing tests.
This commit is contained in:
2026-09-07 07:59:14 +00:00
parent 7d19e0da38
commit c2a8f4e929
21 changed files with 2496 additions and 7 deletions

View File

@@ -8,8 +8,8 @@ const porId = (id: string): Modulo => {
}
describe('MODULOS', () => {
it('expone los 7 módulos del ecosistema', () => {
expect(MODULOS).toHaveLength(7)
it('expone los 8 módulos del ecosistema', () => {
expect(MODULOS).toHaveLength(8)
expect(MODULOS.map((m) => m.id)).toEqual([
'cotizador',
'alta-clientes',
@@ -18,6 +18,7 @@ describe('MODULOS', () => {
'tableros',
'mi-dia',
'contactos',
'captura',
])
})
@@ -39,8 +40,9 @@ describe('MODULOS', () => {
expect(porId('mi-dia').url).toBe('/hoy/')
})
it('Contactos es vista interna (sin url externa)', () => {
it('Contactos y Captura son vistas internas (sin url externa)', () => {
expect(porId('contactos').url).toBeUndefined()
expect(porId('captura').url).toBeUndefined()
})
it('liga cada módulo a la matriz de roles del API', () => {
@@ -51,6 +53,7 @@ describe('MODULOS', () => {
expect(porId('tableros').claves).toEqual(['mi-tablero', 'tablero-comercial'])
expect(porId('mi-dia').claves).toEqual(['mi-dia'])
expect(porId('contactos').claves).toEqual(['contactos'])
expect(porId('captura').claves).toEqual(['captura'])
})
it('no hay ids ni URLs duplicadas', () => {

View File

@@ -59,6 +59,12 @@ export const MODULOS: Modulo[] = [
descripcion: 'Directorio de contactos del CRM: teléfono, email y estado',
claves: ['contactos'],
},
{
id: 'captura',
nombre: 'Captura',
descripcion: 'Captura por departamentos: Obra, Ventas, Escrituración, Finanzas y Postventa',
claves: ['captura'],
},
]
/**