Plan de Pruebas — M4: ABMs de Administración
Fecha: 2026-07-27 Módulo: doc/plans/2026-07-25-plan-desarrollo-modulos.md (M4) Ambiente: Dev local (./start-dev.sh) — http://localhost:5173
Aviso importante sobre esta ronda de QA
Todo lo de este documento se verificó con tests automáticos (115 en total, backend) y pegándole directo a la API real con curl contra el stack levantado (login real contra el emulador de Firebase, altas/modificaciones reales, respuestas reales). No se verificó clickeando en un navegador real — no había herramienta de browser disponible en la sesión que implementó esto. Todo lo que involucra solo backend (permisos, validaciones, cascadas, auditoría) está probado con la misma rigurosidad que M1/M2/M3. Lo que sí necesita tus ojos en un navegador de verdad:
- Que las 7 pantallas nuevas rendericen bien (tablas, modales, checkboxes) — el build de producción (
vue-tsc+vite build) corre limpio, pero eso no reemplaza verlo. - El timer de inactividad (sección 6) — la lógica nunca se disparó en un browser real, es lo de mayor riesgo real de este módulo.
Usuarios (mismos que M1/M2/M3)
| Password | Rol | |
|---|---|---|
admin@cislatam.test | Admin123! | Admin — acceso completo a los 7 ABMs |
supervisor@cislatam.test | Super123! | Supervisor — solo Auditoría (lectura) de los 7 |
backoffice@cislatam.test | Backoffice123! | Backoffice — ningún ABM de Administración |
1. Países
| # | Paso | Resultado esperado |
|---|---|---|
| 1.1 | Como Admin, entrar a Usuarios y Accesos → no está acá, es Ubicaciones → Países | Tabla con los países existentes + formulario de alta a la derecha |
| 1.2 | Dar de alta un país con código de 2 letras ya usado (ej. GT) | 422 — código duplicado, no se crea nada |
| 1.3 | Dar de alta un país nuevo con comisión fuera de 0–100 (ej. 150) | 422 |
| 1.4 | Dar de alta un país nuevo válido (ej. código PA, Panamá, comisión 4) | Aparece en la tabla, código en mayúsculas aunque lo hayas tipeado en minúscula |
| 1.5 | Editar el país recién creado (cambiar el nombre) | Se guarda, refresh (F5) mantiene el cambio |
| 1.6 | Desactivarlo desde la tabla | Pide confirmación (modal), pasa a "Inactivo" |
| 1.7 | Reactivarlo | Vuelve a "Activo" — sin parpadeo de datos viejos durante la recarga |
| 1.8 | Como Backoffice, entrar por URL directa a Países | Te rebota — no tiene acceso a ningún ABM de Administración |
2. Estaciones / PDV
| # | Paso | Resultado esperado |
|---|---|---|
| 2.1 | Como Admin, entrar a Ubicaciones → Estaciones / PDV | Tabla + formulario de alta con selector de país |
| 2.2 | Dar de alta una estación sin tocar "Mails de notificación" | Se crea sin mails — el formulario arranca sin filas, hay que click "+ Agregar" para sumar una |
| 2.3 | Agregar 2 mails de notificación al alta, uno con el checkbox destildado | Se crean ambos, uno enabled=true y el otro false |
| 2.4 | Editar la estación: sacar un mail, agregar uno nuevo, togglear el enabled del que queda | Los 3 cambios se reflejan juntos en un solo "Guardar" |
| 2.5 | Desactivar/reactivar una estación | Mismo modal de confirmación que Países |
3. Usuarios
| # | Paso | Resultado esperado |
|---|---|---|
| 3.1 | Como Admin, entrar a Usuarios y Accesos → Usuarios | Buscador + tabla paginada (25 por página) + botón "+ Nuevo usuario" |
| 3.2 | Crear un usuario nuevo con un email que no existe | Modal de "Contraseña generada" — copiala con el botón de copiar, no se vuelve a mostrar |
| 3.3 | Intentar crear un usuario con un email ya usado | 422, mensaje claro |
| 3.4 | Cerrar sesión y entrar con el usuario recién creado, usando la contraseña copiada en 3.2 | Login funciona — la cuenta es real en Firebase, no solo en la tabla users |
| 3.5 | Como Admin, buscar ese usuario y click "Restablecer contraseña" | Nuevo modal de contraseña — probar que la vieja (3.2) ya NO sirve para loguearse y la nueva sí |
| 3.6 | Editar el email de un usuario | Cerrar sesión y volver a entrar con el mail nuevo y la misma contraseña — tiene que andar (se sincronizó en Firebase) |
| 3.7 | Desactivar un usuario y tratar de loguearse con él | El login de Firebase funciona (no lo bloquea Firebase), pero la app lo rebota igual — mensaje "usuario desactivado" |
| 3.8 | Buscar por un fragmento de email en el buscador | Filtra la tabla, debounce (no dispara en cada tecla) |
4. Roles y Permisos
| # | Paso | Resultado esperado |
|---|---|---|
| 4.1 | Como Admin, entrar a Usuarios y Accesos → Roles y Permisos | Grilla: filas = módulos, columnas = Admin/Supervisor/Backoffice, cada una con 3 checkboxes (L/E/B) |
| 4.2 | En cualquier módulo de Backoffice, activar el checkbox "B" (Borrar) | Se activan también "E" y "L" solos, sin que los toques |
| 4.3 | Con B y E activos, intentar destildar "E" | El checkbox de Escribir queda deshabilitado mientras Borrar esté activo — ni se puede clickear |
| 4.4 | Destildar primero "B", después "E" | Ahora sí se puede — hay que ir de abajo hacia arriba |
| 4.5 | Con E activo, intentar destildar "L" | Mismo bloqueo — hay que sacar Escribir primero |
| 4.6 | Cualquier cambio válido | Se guarda solo, sin botón "Guardar" aparte — un click, un save |
5. Asignación de Roles
| # | Paso | Resultado esperado |
|---|---|---|
| 5.1 | Como Admin, entrar a Usuarios y Accesos → Asignación de Roles | Buscador de usuario por email |
| 5.2 | Buscar y elegir un usuario | Aparece su tabla de asignaciones actuales (vacía si es nuevo) + formulario de alta a la derecha |
| 5.3 | Alta: elegir país, rol, y 1-2 PDVs de ese país | Se crea, aparece en la tabla con los PDVs listados |
| 5.4 | Repetir el alta exacto (mismo usuario+país+rol) | 422 — ya existe esa combinación |
| 5.5 | Click "Editar PDVs" en una asignación existente | Se abre un editor inline con el multi-select de PDVs precargado |
| 5.6 | Cerrar sesión y entrar con ese usuario | Ve exactamente las transacciones/lo que corresponda a los PDVs/país recién asignados — ni más ni menos |
| 5.7 | Eliminar una asignación | Pide confirmación, desaparece de la tabla |
6. Timeout de sesión (⚠️ no verificado en navegador — probar con atención)
| # | Paso | Resultado esperado |
|---|---|---|
| 6.1 | Como Admin, entrar a Configuración | Debajo de la tarjeta de Soterex hay una nueva: "Timeout de sesión (global)" |
| 6.2 | Cambiar el valor a 1 minuto y guardar | Se guarda, muestra "Última edición" actualizada |
| 6.3 | Dejar la pestaña quieta (sin mover mouse/teclado) por poco más de 1 minuto | Esto es lo importante de probar: debería cerrar sesión sola y mandarte a /login?reason=timeout con un cartel "Tu sesión se cerró por inactividad" |
| 6.4 | Volver a loguearte, y esta vez mover el mouse cada 30s | La sesión NO debería cerrarse mientras haya actividad |
| 6.5 | En Roles y Permisos, poner un override de timeout distinto en un rol (ej. 2 minutos) | Un usuario con ese rol usa 2 minutos en vez del global, aunque el global siga en 1 |
| 6.6 | En Usuarios, poner un override en un usuario puntual (ej. 10 minutos) | Ese usuario usa 10 minutos sin importar lo que diga su rol o el global — el override de usuario gana siempre |
| 6.7 | Volver a poner el timeout global en un valor razonable (ej. 30) antes de seguir usando la app | Evita que se corte la sesión todo el tiempo mientras seguís probando otras pantallas |
7. Auditoría
| # | Paso | Resultado esperado |
|---|---|---|
| 7.1 | Como Admin o Supervisor, entrar a Auditoría | Tabla paginada, más reciente primero |
| 7.2 | Como Backoffice, entrar por URL directa | Te rebota — Backoffice no tiene acceso a Auditoría |
| 7.3 | Filtrar por acción (ej. "Usuario creado") | Solo aparecen esas filas |
| 7.4 | Filtrar por email del actor | Solo movimientos hechos por ese usuario |
| 7.5 | Mirar la columna "Detalle" de una fila de login, alta de país, o cambio de estado de transacción | Texto legible (no JSON crudo) — ej. "ACCEPTED → PAID (MTCN ...)" |
| 7.6 | Mirar el detalle de algo menos común | Cae a un bloque de JSON crudo — no debería romper la página |
| 7.7 | Cualquier acción hecha en las secciones 1-6 de este mismo documento | Tiene que aparecer acá, filtrando por esa acción |
8. Qué NO es parte de este módulo (no reportar como bug)
- M5 (integración real con Soterex) sigue pendiente — Configuración solo tiene el modo mock/real de la conexión, sin credenciales de verdad todavía.
- Roles y Permisos no tiene alta/baja/rename de rol — los 3 roles (Admin/Supervisor/Backoffice) son fijos por diseño, la pantalla solo edita la matriz de permisos.
- El timer de inactividad es por pestaña — si tenés dos pestañas abiertas, una inactiva puede cerrar sesión mientras seguís usando la otra activamente. Es una limitación conocida y aceptada, no un bug.
Cómo reportarme el feedback
Con el número de la tabla alcanza (ej. "6.3 no cerró sesión sola"). Para la sección 6 en particular, contame también qué valor de timeout pusiste y cuánto tiempo esperaste realmente.

