Centro de Mensajes
Generada 2026-08-13. Fuente: exploración de código de controlgmg-v2 + observación manual del navegador (QA).
Backend
Sección titulada «Backend»- No es un dominio de negocio con su propio modelo principal (no existe
MessageCenter.phpcomo Eloquent model) — es un sistema transversal de notificaciones que envuelve al modeloApp\Core\Modules\Module(catálogo de módulos de negocio:liquidaciones,tractor,remolque,compras,tareas,llantas, etc.) y sus relaciones. Vive enapp/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 comoOrder,Task,ProductGroup,OrderProductque el propio trait referencia coninstanceof). ExponegetNotifiableUsers(),getParticipantUsers(),getCommentDefaultNotifiableUsers(),getNewCommentDefaultNotifiableUsers(),sendApprovalRequestByRoleAndEventable(). Requiere que la clase que lo usa implementegetModule(): Module.App\Core\MessageCenter\MessageCenterModuleTypes(app/Core/MessageCenter/MessageCenterModuleTypes.php) — catálogo estáticoALL_MODULEScon ~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
modulesya existente deApp\Core\Modules\Module, reutilizada — no se confirmó una tablamessage_centersdedicada).
- 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).
Frontend (Vue 2)
Sección titulada «Frontend (Vue 2)»- Rutas registradas en
resources/js/routes/message-center.js, importadas enresources/js/routes.jsvíaimport {MessageCenterRoutes} from "./routes/message-center"y esparcidas (...MessageCenterRoutes) dentro del arreglo principal de rutas:/centro-de-mensajes→MessageCenterPage.vue(@c/MessageCenter/MessageCenterPage), guardcan('view-message-center')./centro-de-mensajes/reportes/usuarios→Reports/MessageCenterUserReport.vue, guardcan('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-operatordocumentado 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, propstats_range). ConsumeModuleService.get({ only_messageable: true, with_stats: false, ...filters }). Cada fila esMessageCenterModuleRow.vue; al hacer click (toggleView) se expande inlineMessageCenterModuleForm.vue(mismo patrónel-collapse-transitionque 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 pararole-notifiables.User/MessageCenterUserRow.vue,User/MessageCenterUserSection.vue— UI parauser-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).
Permisos (Laratrust)
Sección titulada «Permisos (Laratrust)»Fuente: config/laratrust_seeder.php, resource message-center: 'v,c,r,u,d' → generadas en App\Core\Security\PermissionConst:
view-message-centercreate-message-centerread-message-centerupdate-message-centerdelete-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-testiden la app (mismo patrón que el resto decontrolgmg-v2, no se modifica el repo para agregarlos). - El listado de
MessageCenterPage.vueno es una tabla HTML sino filas custom (MessageCenterModuleRow.vue), y no está paginado (// No paginated moduleen 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.
Datos observados en QA (2026-08-12)
Sección titulada «Datos observados en QA (2026-08-12)»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.