Plan de Pruebas — M1: Transacciones
Fecha: 2026-07-25 Módulo: doc/plans/2026-07-25-plan-desarrollo-modulos.md (M1) Ambiente: Dev local (./start-dev.sh) — http://localhost:5173
Antes de empezar
La base tiene datos de ejemplo (24 transacciones, 3 asientos de prefondeo). Si en algún momento querés arrancar de cero con los mismos datos:
docker compose exec backend php artisan tinker --execute="App\Models\AuditLog::query()->delete(); App\Models\Transaction::query()->delete();"
docker compose exec backend php artisan db:seed --no-interactionEsto deja: 24 transacciones (11 ACCEPTED, 8 PAID, 5 CANCELLED), saldo de prefondeo ≈ USD 53.915,61.
Actualizado 2026-07-25 — fix crítico aplicado: las ACCEPTED no tienen PDV (son una bolsa compartida por país, ver doc/plans/2026-07-25-fix-pdv-asignacion-transacciones.md). El PDV se asigna recién al resolverlas (PAID/CANCELLED). Las 13 ya resueltas del seed quedan repartidas entre los 4 PDVs: GT-CAP-001 (2), GT-QUE-002 (4), GT-MIX-003 (3), GT-ESC-004 (4).
Actualizado 2026-07-27 — el diálogo de confirmación de pagar/cancelar ya no es el confirm() nativo del navegador: ahora es un modal propio tipo recibo (monto en grande, ícono semántico verde/rojo), y el resultado (éxito, conflicto por concurrencia, saldo insuficiente) se muestra con notificaciones flotantes arriba a la derecha en vez de un cartel rojo fijo en la página. Ver doc/plans/2026-07-25-modal-confirmacion-rediseno.md. Afecta las secciones 5, 6, 7 y 8 de abajo.
Usuarios de prueba
| Password | Rol | Alcance | |
|---|---|---|---|
admin@cislatam.test | Admin123! | Admin | Guatemala, todos los PDVs |
supervisor@cislatam.test | Super123! | Supervisor | Solo GT-CAP-001 y GT-QUE-002 |
backoffice@cislatam.test | Backoffice123! | Backoffice | Solo GT-CAP-001 |
Si el emulador de Firebase se reinició y el login falla con "usuario o contraseña incorrectos", correr docker compose exec backend php artisan db:seed de nuevo — el emulador es en memoria y pierde los usuarios en cada restart del contenedor.
1. Login y permisos por rol
| # | Paso | Resultado esperado |
|---|---|---|
| 1.1 | Entrar a http://localhost:5173, loguearte como Backoffice | Caés directo en Transacciones (no en Dashboard — Backoffice no tiene permiso de leerlo) |
| 1.2 | Mirar el menú lateral como Backoffice | Solo aparecen Transacciones y Prefondeo. Nada de Reportes ni del bloque Administración |
| 1.3 | Escribir a mano en la barra de direcciones http://localhost:5173/admin/usuarios-accesos/usuarios estando logueado como Backoffice | Te rebota a Transacciones — no se llega ni escribiendo la URL directo |
| 1.4 | Cerrar sesión, entrar como Supervisor | Caés en Dashboard. Menú: Dashboard, Transacciones, Prefondeo, Reportes, Auditoría (esta última sola, sin el resto de Administración — no tiene permiso de leer Usuarios y Accesos ni Ubicaciones) |
| 1.5 | Cerrar sesión, entrar como Admin | Caés en Dashboard. Menú completo: Dashboard, Transacciones, Prefondeo, Reportes, Usuarios y Accesos, Ubicaciones, Configuración, Auditoría (8 ítems — Usuarios/Roles y Permisos/Asignación de Roles y Países/Estaciones quedaron agrupados con tabs, ver doc/plans/2026-07-25-navegacion-admin-tabs.md) |
| 1.6 | Con cualquier usuario, mirar arriba a la derecha | Se ve el rol y país activo (ej. "Admin · GT") y el mail |
2. Listado de Transacciones — bolsa compartida (ACCEPTED) vs. alcance por PDV (resueltas)
| # | Paso | Resultado esperado |
|---|---|---|
| 2.1 | Como Backoffice (solo GT-CAP-001), ir a Transacciones sin filtros | Ves 13: las 11 ACCEPTED (bolsa compartida — todas, sin importar PDV) + 2 ya resueltas de tu PDV |
| 2.2 | Como Supervisor (GT-CAP-001 + GT-QUE-002), ir a Transacciones sin filtros | Ves 17: las 11 ACCEPTED + 6 resueltas de tus 2 PDVs |
| 2.3 | Como Admin, ir a Transacciones | Ves las 24 (todo el país) |
| 2.4 | Como Backoffice, filtrar estado = ACCEPTED | El filtro de PDV queda deshabilitado (con tooltip explicando por qué) — no tiene sentido, ninguna ACCEPTED tiene PDV todavía |
| 2.5 | Como Backoffice, filtrar estado = PAID o CANCELLED | Ahí sí se habilita el filtro de PDV, y solo aparece tu PDV (GT-CAP-001) para elegir |
| 2.6 | Como Admin, filtrar estado = PAID y PDV = GT-QUE-002 | Ves solo las resueltas de ese PDV específico |
3. Listado — filtros y búsqueda
| # | Paso | Resultado esperado |
|---|---|---|
| 3.1 | Filtrar por estado = PAID | Solo se ven las transacciones pagadas |
| 3.2 | Filtrar por estado = CANCELLED | Solo las canceladas |
| 3.3 | Buscar por un MTCN completo o parcial (ej. 0000000001) | Aparece esa transacción puntual |
| 3.4 | Buscar por apellido (ej. García) | Filtra por nombre/apellido del beneficiario |
| 3.5 | Combinar estado (PAID o CANCELLED) + PDV + búsqueda a la vez | Los filtros se combinan (AND), no se pisan entre sí |
| 3.6 | Borrar todos los filtros | Vuelve a mostrar todo el alcance del usuario |
4. Detalle de transacción
| # | Paso | Resultado esperado |
|---|---|---|
| 4.1 | Click en cualquier fila del listado | Abre el detalle: nombre, MTCN, monto, país, PDV, contacto — sin comisión (información restringida, ver doc/plans/2026-07-25-restringir-comision.md) |
| 4.2 | Mirar la sección Historial en una transacción recién creada (sin movimientos) | Dice "Sin movimientos todavía" |
| 4.3 | Como Backoffice, entrar al detalle de una transacción ACCEPTED cualquiera (aunque no sea de tu PDV — todavía no tiene PDV asignado) | Se abre normalmente — es bolsa compartida, cualquiera con acceso al país la ve |
| 4.4 | Como Backoffice, entrar al detalle de una transacción ya resuelta (PAID/CANCELLED) de otro PDV (pedile el link a un Admin) | Pantalla de "Transacción no encontrada" — no un error de permiso, para no confirmar que existe. Acá sí aplica el acotamiento por PDV |
| 4.5 | Como Backoffice, entrar al detalle de una transacción de otro país (si hubiera más de uno activo) | Mismo resultado: "Transacción no encontrada" |
5. Cambiar a PAID
| # | Paso | Resultado esperado |
|---|---|---|
| 5.1 | Como Admin, abrir una transacción en estado ACCEPTED y click en "Cambiar a PAID" | Aparece el modal de confirmación tipo recibo (monto en grande arriba, ícono verde, MTCN/beneficiario debajo, sin comisión) — no el diálogo nativo del navegador |
| 5.2 | Click en "Confirmar pago" | El modal se cierra, aparece una notificación verde de éxito arriba a la derecha ("Transacción pagada"), el estado pasa a PAID y aparece en el Historial "Cambio de estado" con tu usuario y la hora |
| 5.3 | Con esa misma transacción ya PAID, mirar los botones | "Cambiar a PAID" y "Cancelar transacción" quedan grises/deshabilitados, con el texto "Solo se puede operar sobre transacciones ACCEPTED" |
| 5.4 | Como Backoffice o Supervisor, repetir 5.1–5.2 con una transacción de tu alcance | Funciona igual (ambos roles tienen permiso de Escribir en Transacciones) |
| 5.5 | Como Backoffice (un solo PDV asignado), después de pagar una transacción, mirar el campo PDV en el detalle | Ahora muestra tu PDV — quedó asignado recién al resolverla, no antes |
| 5.6 | Filtrar Transacciones por estado=PAID y tu PDV | Ahora aparece la que acabás de pagar (5.5) — antes de resolverla no hubiera aparecido en ningún filtro de PDV |
| 5.7 | Activar el modo oscuro (ícono de luna arriba a la derecha) y repetir 5.1 | El modal se ve correctamente en oscuro (fondo y textos oscuros, no queda "transparente" ni con el tema claro de por dentro) |
6. Saldo de prefondeo insuficiente
El saldo actual del país es ≈ USD 53.915. Para probar el bloqueo por saldo insuficiente hace falta una transacción cuyo monto+comisión supere eso — no hay ninguna así en el seed por defecto (los montos son moderados a propósito). Para forzar el caso:
docker compose exec backend php artisan tinker --execute="
\$gt = App\Models\Country::where('iso_code','GT')->first();
App\Models\Transaction::create(['soterex_transaction_id'=>'STX-QA-001','mtcn'=>'5555555555','status'=>'ACCEPTED','country_id'=>\$gt->id,'first_name'=>'Prueba','last_name'=>'Saldo','amount'=>60000,'fee'=>2100,'origin_currency'=>'USD','destination_country'=>'GT','sender'=>'US']);
"| # | Paso | Resultado esperado |
|---|---|---|
| 6.1 | Buscar el MTCN 5555555555, abrir el detalle, click en "Cambiar a PAID" y confirmar | El modal se queda abierto (no se cierra solo, para que puedas reintentar) y aparece una notificación roja: "Saldo de prefondeo insuficiente — Disponible X — no alcanza para esta transacción." (sin el monto exacto requerido — junto al monto ya visible permitiría derivar la comisión, ver doc/plans/2026-07-25-restringir-comision.md) |
| 6.2 | Cerrar el modal con "Cancelar" y recargar la página | La transacción sigue en ACCEPTED — el intento fallido no la modificó |
Para limpiar esta transacción de prueba después: mismo comando de "Antes de empezar".
7. Cancelar transacción
| # | Paso | Resultado esperado |
|---|---|---|
| 7.1 | Abrir una transacción ACCEPTED, click en "Cancelar transacción" | Aparece el mismo modal tipo recibo, pero con ícono rojo y botón "Cancelar transacción" en rojo (para diferenciarlo visualmente de pagar) |
| 7.1b | Click en "Cancelar transacción" dentro del modal | Se cierra, notificación verde de éxito ("Transacción cancelada"), pasa a CANCELLED y queda en el Historial |
| 7.2 | Intentar cancelar una transacción que ya está CANCELLED o PAID | Los botones ya están deshabilitados — no se puede ni intentar desde la UI |
8. Bolsa compartida y concurrencia (el fix de hoy)
El caso real: dos cajeros de PDVs distintos ven la misma transacción ACCEPTED en su listado (es compartida) y ambos intentan tomarla casi al mismo tiempo. Para probarlo hace falta abrir la misma transacción en dos pestañas/navegadores con usuarios distintos:
| # | Paso | Resultado esperado |
|---|---|---|
| 8.1 | Abrir la misma transacción ACCEPTED en dos pestañas (ej. Admin en una, Supervisor en otra) | Ambas pantallas la muestran ACCEPTED con los botones habilitados |
| 8.2 | En la primera pestaña, pagarla y confirmar | Pasa a PAID normalmente |
| 8.3 | En la segunda pestaña (sin recargar), click en "Cambiar a PAID" y confirmar | El modal se cierra solo y aparece una notificación naranja de advertencia con el mensaje del backend (algo como "Esta transacción ya no está ACCEPTED... probablemente la resolvió otro usuario") — y la pantalla se refresca sola mostrando el estado real (PAID) con los botones ya deshabilitados |
| 8.4 | Revisar el saldo de prefondeo después de 8.2 y 8.3 | Se descontó una sola vez — el segundo intento no tocó el saldo |
9. Listado — filtros de fecha, ordenamiento y paginado (mejoras 2026-07-27)
| # | Paso | Resultado esperado |
|---|---|---|
| 9.1 | Filtrar por "Desde" y "Hasta" (ej. el mismo día en ambos) | Solo aparecen transacciones creadas ese día — el filtro "Hasta" incluye el día completo, no corta a medianoche |
| 9.2 | Poner una fecha "Desde" muy futura (ej. 2099-01-01) | El listado queda vacío, con el mensaje "No hay transacciones con estos filtros" |
| 9.3 | Click en cualquier encabezado de columna (MTCN, Beneficiario, Estado, País, PDV, Monto, Creada, Última actualización — sin Comisión, sacada del listado, ver doc/plans/2026-07-25-restringir-comision.md) | Ordena por esa columna, ascendente, con una flechita ↑ junto al título |
| 9.4 | Click de nuevo en el mismo encabezado | Invierte a descendente (flechita ↓) |
| 9.5 | Click en un encabezado distinto al activo | Cambia el orden a esa columna, siempre arrancando en ascendente |
| 9.6 | Mirar la columna "Creada" | Muestra la fecha de creación de la transacción — distinta de "Última actualización" |
| 9.7 | Entrar al detalle de una transacción desde el listado | El ítem "Transacciones" del menú lateral se mantiene resaltado en naranja (antes se apagaba al entrar al detalle) |
| 9.8 | Con más de 25 transacciones en el alcance, moverse entre páginas con el paginador de abajo | Cambia de página sin perder los filtros ni el orden activos |
10. Qué NO es parte de este módulo (no reportar como bug)
- Los datos de Dashboard, Prefondeo, Reportes y todos los ABMs de Administración son pantallas placeholder — se implementan en los próximos módulos (M2–M4).
- No hay conexión real con Soterex todavía (M5) — el pago/cancelación queda en la base local, no se le avisa a Soterex.
- No hay exportación a Excel/PDF todavía.
Cómo reportarme el feedback
Para cada punto que falle, con el número de la tabla alcanza (ej. "2.2 me mostró 10 en vez de 12"). Si es algo visual o poco claro, una captura ayuda pero no es obligatoria.

