Ir al contenido

Centro de Mensajes

Generada 2026-08-13. Fuente: exploración de código de controlgmg-v2 + observación manual del navegador (QA).

  • No es un dominio de negocio con su propio modelo principal (no existe MessageCenter.php como Eloquent model) — es un sistema transversal de notificaciones que envuelve al modelo App\Core\Modules\Module (catálogo de módulos de negocio: liquidaciones, tractor, remolque, compras, tareas, llantas, etc.) y sus relaciones. Vive en app/Core/MessageCenter/.
  • Piezas clave:
    • App\Core\MessageCenter\MessageCenterNotifiableTrait (app/Core/MessageCenter/MessageCenterNotifiableTrait.php) — trait que consumen los modelos “notificables” de otros dominios (confirmado: Trailer, y por extensión modelos como Order, Task, ProductGroup, OrderProduct que el propio trait referencia con instanceof). Expone getNotifiableUsers(), getParticipantUsers(), getCommentDefaultNotifiableUsers(), getNewCommentDefaultNotifiableUsers(), sendApprovalRequestByRoleAndEventable(). Requiere que la clase que lo usa implemente getModule(): Module.
    • App\Core\MessageCenter\MessageCenterModuleTypes (app/Core/MessageCenter/MessageCenterModuleTypes.php) — catálogo estático ALL_MODULES con ~26 módulos que participan del Centro de Mensajes (liquidaciones, expedientes de operadores/clientes/admin, contratos, escuela de operadores, vales, estudio de mercado, perfil de puesto, carta de porte, tractor, remolque, compras y sus derivados, videos, salidas, transportistas/subcontrataciones, proveedores, tareas, llantas, personal, mantenimientos preventivos). También define destinos: TO_EMAIL (to_email), TO_WHATSAPP (to_whatsapp), TO_WEB (to_web) — es decir, el Centro de Mensajes decide, por rol/usuario/módulo, quién recibe notificaciones y por qué canal (email, WhatsApp vía UltraMsg, o web).
    • App\Core\MessageCenter\Reports\MessageCenterUserEventReport — soporta el reporte de eventos por usuario.
    • Controladores en app/Http/Controllers/MessageCenter/: ModuleRoleNotifiableController, ModuleUserNotifiableController, MessageCenterUserReportController.
  • Tablas (confirmadas por nombre de migración, estructura interna no inspeccionada):
    • module_events (database/migrations/2021_03_16_120423_create_module_events_table.php) — catálogo de eventos por módulo (p. ej. comment, rejected, authorization-request, authorized, según se documentó en Liquidaciones).
    • module_role_notifiables (2021_03_02_131720_...) — qué roles son notificados por módulo/evento.
    • module_user_notifiables (2021_03_02_131849_...) — qué usuarios específicos son notificados por módulo/evento (override sobre roles).
    • Por verificar: tabla de configuración base de “módulos messageables” (probablemente la tabla modules ya existente de App\Core\Modules\Module, reutilizada — no se confirmó una tabla message_centers dedicada).
  • El propósito funcional: cada módulo de negocio define eventos (altas, comentarios, cambios de estatus, autorizaciones, etc.); el Centro de Mensajes permite configurar, por rol y/o por usuario individual, quién debe recibir la notificación de cada evento y por qué canal. Es el mismo mecanismo que en Liquidaciones mapea eventos (comment, rejected, authorization-request, authorized, not-authorized, payment-programed, payment-confirmed) a las transiciones de estatus.

Archivo completo routes/message-center/message-center.php (todas bajo prefijo message-center, dentro del grupo global auth:api + password_expired de routes/web.php):

Método Ruta Acción
GET /message-center/role-notifiables/{module} ModuleRoleNotifiableController@index — lista notificables por rol para un módulo
PUT /message-center/role-notifiables/{module}/reset ModuleRoleNotifiableController@reset — restablece config por rol a default
POST /message-center/role-notifiables/{module}/{role} ModuleRoleNotifiableController@create — asigna notificables a un rol
GET /message-center/user-notifiables/{module} ModuleUserNotifiableController@index — lista notificables por usuario para un módulo
PUT /message-center/user-notifiables/{module}/reset ModuleUserNotifiableController@reset — restablece config por usuario
POST /message-center/user-notifiables/{module}/{user} ModuleUserNotifiableController@create — asigna notificables a un usuario
GET /message-center/user-event-report/{module} MessageCenterUserReportController@getUserEventData — reporte de eventos por usuario

No hay middleware permission: a nivel de ruta (mismo patrón que Liquidaciones) — la autorización de vista vive en el frontend (beforeEnter: can('view-message-center')) y presumiblemente en los controladores/FormRequests (no inspeccionados a detalle).

  • Rutas registradas en resources/js/routes/message-center.js, importadas en resources/js/routes.js vía import {MessageCenterRoutes} from "./routes/message-center" y esparcidas (...MessageCenterRoutes) dentro del arreglo principal de rutas:
    • /centro-de-mensajes → MessageCenterPage.vue (@c/MessageCenter/MessageCenterPage), guard can('view-message-center').
    • /centro-de-mensajes/reportes/usuarios → Reports/MessageCenterUserReport.vue, guard can('view-waybills-reports') (posible bug de copy-paste: usa el permiso de reportes de Cartas de Porte/Waybills, no uno propio de message-center — a validar, similar al caso de “Sin liquidaciones”/delete-operator documentado en Liquidaciones).
  • MessageCenterPage.vue (resources/js/components/MessageCenter/MessageCenterPage.vue) — página raíz, listado NO paginado (// No paginated module) de módulos messageables: filtro de búsqueda (search-everything) y rango de fechas para estadísticas (date-range, prop stats_range). Consume ModuleService.get({ only_messageable: true, with_stats: false, ...filters }). Cada fila es MessageCenterModuleRow.vue; al hacer click (toggleView) se expande inline MessageCenterModuleForm.vue (mismo patrón el-collapse-transition que Liquidaciones/Remolques).
  • Otros componentes en resources/js/components/MessageCenter/ (estructura no inspeccionada a fondo, solo listados por nombre):
    • MessageCenterModuleFormDialog.vue, MessageCenterModuleForm.vue, MessageCenterModuleRow.vue — formulario/fila de configuración por módulo.
    • Model/MessageCenterModelButton.vue, Model/MessageCenterModelDialog.vue, Model/MessageCenterModelRow.vue, Model/MessageCenterModelSection.vue — probablemente config de notificables a nivel de instancia/registro concreto (no solo módulo genérico).
    • Role/MessageCenterRoleRow.vue, Role/MessageCenterRoleSection.vue — UI para role-notifiables.
    • User/MessageCenterUserRow.vue, User/MessageCenterUserSection.vue — UI para user-notifiables.
    • Forms/MessageCenterEventDialog.vue, Forms/MessageCenterNotifiableButtons.vue — selección de canal (email/WhatsApp/web) por evento.
    • Reports/MessageCenterNotifiableSymbol.vue, Reports/MessageCenterUserReport.vue — reporte de eventos por usuario (ruta /centro-de-mensajes/reportes/usuarios).
  • No se localizó un ítem propio de “Centro de Mensajes” en resources/js/components/Nav/menuOptions.js (sidebar de módulos de negocio) — consistente con lo observado en QA: se accede desde un ícono en el banner superior, no desde el sidebar. Por verificar: confirmar en código si existe una entrada separada para el ícono del banner (no buscada en esta pasada).

Fuente: config/laratrust_seeder.php, resource message-center: 'v,c,r,u,d' → generadas en App\Core\Security\PermissionConst:

  • view-message-center
  • create-message-center
  • read-message-center
  • update-message-center
  • delete-message-center

No hay permisos específicos de tipo approve-/comment- como en otros dominios (Liquidaciones) — el CRUD estándar (v,c,r,u,d) parece cubrir tanto ver el catálogo como configurar notificables por rol/usuario. La ruta de reportes usa view-waybills-reports en vez de un permiso propio (ver nota en Frontend).

Selectores usados por el tester (riesgo de fragilidad)

Sección titulada «Selectores usados por el tester (riesgo de fragilidad)»

No hay specs de Playwright para este módulo todavía — a diferencia de Remolques (que sí tiene tests/remolques/expand-trailer-detail.spec.ts), Centro de Mensajes no ha sido explorado con Playwright/codegen contra QA real. Todo lo que sigue es inferencia de código, no verificación en vivo:

  • No hay data-testid en la app (mismo patrón que el resto de controlgmg-v2, no se modifica el repo para agregarlos).
  • El listado de MessageCenterPage.vue no es una tabla HTML sino filas custom (MessageCenterModuleRow.vue), y no está paginado (// No paginated module en el propio código) — un test que espere paginación estándar (como en Liquidaciones/Remolques) fallará; hay que verificar en vivo cómo se comporta con muchos módulos.
  • El acceso es vía un ícono en el banner superior (no el sidebar de menuOptions.js), por lo que el selector de navegación será distinto al patrón usado para otros módulos — no se identificó el markup/selector de ese ícono en esta pasada.
  • El formulario de configuración se expande inline (el-collapse-transition + MessageCenterModuleForm.vue), mismo patrón visto en Liquidaciones y Remolques, pero su estructura interna de campos (rol vs. usuario, checkboxes de canal email/WhatsApp/web) no ha sido inspeccionada a nivel de HTML — no asumir labels asociados correctamente a inputs.
  • Hay al menos 3 niveles de configuración anidados posibles en la UI (por módulo → por rol/usuario → por evento/canal), lo que sugiere diálogos o secciones colapsables adicionales (MessageCenterEventDialog.vue, MessageCenterModelDialog.vue) cuyo flujo de apertura no se verificó en vivo.

Antes de escribir cualquier spec para este módulo, correr npm run codegen:gmg contra QA real para verificar selectores, igual que se hizo para Remolques.

La página carga en https://qa.controlgmg.com/centro-de-mensajes bajo el título “Centro De Mensajes”, accesible desde el ícono de mensajes en el banner superior (no en el sidebar de módulos de negocio). No se inspeccionó el contenido a mayor detalle visual.