Taller
Generada 2026-08-13. Fuente: exploración de código de controlgmg-v2 + observación manual del navegador (QA). Actualiza este archivo cuando el módulo cambie de forma relevante para tests.
Aviso importante: “Taller” en el nav NO es el módulo Workshops
Sección titulada «Aviso importante: “Taller” en el nav NO es el módulo Workshops»El link de sidebar “Taller” (/taller) apunta a resources/js/components/Units/Diagnosis/UnitDiagnosisPage.vue —
es el catálogo de diagnóstico de unidades (códigos de diagnóstico, rutinas de servicio, síntomas de falla),
NO un listado de talleres físicos ni de órdenes de servicio. El submenú “Taller” tiene 3 entradas
(ver resources/js/components/Nav/menuOptions.js:398-417):
| Submenú | Ruta | Componente | Permiso de vista |
|---|---|---|---|
| Taller (raíz) | /taller |
Units/Diagnosis/UnitDiagnosisPage.vue |
view-unit-diagnosis |
| Códigos | /taller/codigos |
Units/Diagnosis/UnitDiagnosisPage.vue (mismo componente) |
view-unit-diagnosis |
| Mantenimientos Preventivos | /taller/mantenimientos/preventivos |
Maintenances/Preventives/MaintenancePreventiveTabs.vue |
view-maintenances-preventives |
El sub-dominio backend src/Workshops/ (modelo Workshop, tabla workshops) es en realidad un catálogo simple de
talleres físicos (nombre + oficina) usado como selector dentro de Mantenimientos Preventivos
(WorkshopSelector.vue, WorkshopCreateDialog.vue/WorkshopUpdateDialog.vue en Catalogs/) — no tiene pantalla
propia en el nav “Taller”.
Las situaciones “TALLER CORTO PLAZO”/“TALLER MEDIANO PLAZO” vistas en Remolques/Tractores no se originan en
src/Workshops/ ni en src/Maintenances/Preventives/: son valores de unit_situations/trailer sincronizados desde
AS400 y agrupados bajo el grupo genérico TALLER (database/seeders/UnitSituationGroupSeeder.php:40, tabla
unit_situation_groups). No se encontraron las cadenas literales “TALLER CORTO PLAZO”/“TALLER MEDIANO PLAZO” en el
código — son datos (catálogo AS400), no constantes de PHP/JS. Por verificar: confirmar en BD la tabla unit_situations
para ver el detalle exacto de esos valores y si están asociados al taller físico o solo es una etiqueta de situación.
Backend
Sección titulada «Backend»src/Workshops/ — catálogo de talleres físicos
Sección titulada «src/Workshops/ — catálogo de talleres físicos»- Modelo:
Src\Workshops\Models\Workshop(src/Workshops/Models/Workshop.php), tablaworkshops. - Fillable:
name,office_id(soft-deletes). RelaciónbelongsTo(Office)yhasMany(PreventiveMaintenance)víamaintenances_preventives(). - Migración única:
2025_03_05_090514_create_workshops_table.php. - CRUD simple vía controladores de acción única (
Controllers/CreateWorkshopController.php,DeleteWorkshopController.php,FindWorkshopController.php,GetWorkshopsController.php,UpdateWorkshopController.php). - Tests:
src/Workshops/Tests/Feature/{Create,Delete,Find,GetWorkshops,Update}WorkshopControllerTest.php(uno por controlador).
src/Maintenances/Preventives/ — mantenimientos preventivos (el “Taller” funcional real)
Sección titulada «src/Maintenances/Preventives/ — mantenimientos preventivos (el “Taller” funcional real)»Sub-dominio mucho más grande, con submódulos propios: Actions/, BusinessRules/, Commands/, Controllers/, DTOs/, Enums/, Exceptions/, Factories/, Filters/, Migrations/, Models/, Notifications/, Providers/, Resources/, Routes/, Seeders/, Tests/.
- Modelos (
src/Maintenances/Preventives/Models/):PreventiveMaintenance(entidad principal),PreventiveMaintenanceAuthorization,PreventiveMaintenanceLevel,MpSequence,MpSequenceBusinessRule,MpSequenceBusinessRuleUnit(reglas de negocio por unidad/motor para disparar secuencias de mantenimiento),MpTask,MpAssignedTask,MpProduct,MpAssignedProduct. - Relación con Unit:
PreventiveMaintenancese asigna a una unidad (tractor) — el flujo traeGetUnitsForMPController. Relación con Workshop: víaassign-workshop/authorize-workshop(un taller físico se asigna y autoriza para atender el mantenimiento). - Flujo de estado observado en las rutas (ver abajo): crear → asignar taller → autorizar taller → asignar mecánico → asignar inspección → confirmar piezas/salida de piezas → confirmar disponibilidad de piezas → confirmar conclusión + piezas físicas vs salidas (o rechazar) → validar conclusión → confirmar concluido → confirmar unidad disponible. Es una máquina de estados con bastantes pasos — candidato fuerte a bugs de orden/transición.
- Business Rules:
MpSequenceBusinessRule/...Unit— reglas configurables por unidad que determinan qué secuencias de mantenimiento aplican (posiblemente relacionado con “BusinessRules” mencionado en CLAUDE.md como módulo separado top-level, no confundir conMaintenances/Preventives/BusinessRules/interno). - Tests:
src/Maintenances/Preventives/Tests/Feature/— 21 archivos, uno por controlador/acción (crear, autorizar, asignar taller/mecánico/inspección, confirmar piezas, confirmar conclusión, rechazar, validar conclusión, confirmar concluido, confirmar unidad disponible, archivos, comentarios). Cobertura backend amplia.
src/Units/ — diagnóstico de unidades (lo que realmente muestra /taller en el nav)
Sección titulada «src/Units/ — diagnóstico de unidades (lo que realmente muestra /taller en el nav)»No explorado a fondo por límite de tiempo (fuera del alcance explícito Workshops/Maintenances pedido, pero es la pantalla real de /taller). Componentes Vue: Units/Diagnosis/UnitDiagnosisPage.vue, UnitDiagnosisRow.vue, UnitDiagnosisCodeRow.vue. Por verificar: modelo(s) backend de diagnóstico (src/Units/...), tabla(s), y si tiene rutas API modulares propias (no se inspeccionaron).
src/Workshops/Routes/api.php
Sección titulada «src/Workshops/Routes/api.php»Grupo: middleware ['auth:api', 'password_expired'], prefix workshops, name workshops. (nota: NO coincide con lo que dice CLAUDE.md sobre mapWorkshopRoutes() usando ['api', 'hasTeam'] — el archivo real usa auth:api + password_expired, sin hasTeam. Por verificar contra RouteServiceProvider::map() si hay doble registro o el comentario de CLAUDE.md está desactualizado).
| Método | Ruta | Acción |
|---|---|---|
| GET | /workshops |
listado (GetWorkshopsController) |
| GET | /workshops/{workshop} |
detalle (FindWorkshopController) |
| POST | /workshops |
crear |
| PUT | /workshops/{workshop} |
actualizar |
| DELETE | /workshops/{workshop} |
eliminar (soft-delete) |
src/Maintenances/Preventives/Routes/api.php
Sección titulada «src/Maintenances/Preventives/Routes/api.php»Grupo: middleware ['auth:api', 'password_expired'], prefix maintenances/preventives, name maintenances.preventives. (misma observación: no se ve hasTeam ni prefijo web en el archivo real; por verificar en RouteServiceProvider::map() cómo se monta finalmente).
Endpoints principales:
GET /maintenances/preventives— listado;GET /{maintenance}— detalle;POST /— crear;DELETE /{maintenance}— eliminar.- Catálogos:
GET /levels,/statuses,/units,/sequences. - Business rules por secuencia:
GET/POST /sequences/business-rules,PUT/DELETE /sequences/business-rules/{businessRule}; por unidad:POST/PUT/DELETE /sequences/business-rules/{businessRule}/units[/{businessRuleUnit}]. - Tasks:
GET/POST /tasks,PUT/DELETE /tasks/{mp_task}. - Products:
GET/POST /products,PUT/DELETE /products/{mp_product}. - Flujo de estado (todos
PATCH /{maintenance}/...):authorize,unauthorize,assign-workshop,authorize-workshop,unauthorize-workshop,assign-inspection,assign-mechanic,confirm-pieces-output,confirm-pieces-and-availability,confirm-conclusion-and-physical-parts-vs-outputs,reject-physical-parts-vs-outputs,validate-conclusion,confirm-concluded,confirm-unit-available. - Archivos:
POST /{maintenance}/files,GET /{maintenance}/files/{file}/download,PUT/DELETE /files/{file}. - Comentarios:
POST /{maintenance}/add-comment.
Frontend (Vue 2)
Sección titulada «Frontend (Vue 2)»- Ruta
/tallery/taller/codigos→resources/js/components/Units/Diagnosis/UnitDiagnosisPage.vue(mismo componente para ambas rutas; guardcan('view-unit-diagnosis')). Dentro tiene botones condicionales para abrir diálogos de “Códigos de diagnóstico” (create-unit-diagnosis/update-unit-diagnosis), “Rutinas de servicio” (create-service-routines/update-service-routines) y “Síntomas de falla” (create-failure-symptoms/update-failure-symptoms). Filtros: búsqueda general (search-everything) y por Tractor (unit-selector). - Ruta
/taller/mantenimientos/preventivos→resources/js/components/Maintenances/Preventives/MaintenancePreventiveTabs.vue(guardcan('view-maintenances-preventives')).MaintenancePreventivePage.vue/MaintenancePreventiveRow.vue/MaintenancePreventiveDetailsRow.vue— listado y detalle expandible por mantenimiento.UnitMaintenancePreventivePage.vue/UnitMaintenancePreventiveRow.vue/UnitMaintenancePreventiveDetailsRow.vue— vista por unidad (tab separado, segúnMaintenancePreventiveTabs).Dialogs/MaintenancePreventiveCreateDialog.vue,Dialogs/AssignWorkshopDialog.vue,Dialogs/MaintenancePreventiveLogsDialog.vue.FormSections/MaintenancePreventiveForm.vue,MaintenancePreventiveAuthorizations.vue,MaintenancePreventiveFilesForm.vue,WorkshopForm.vue.MessageCenter/PreventiveMaintenanceNotificationsPopover.vue— notificaciones relacionadas fuera del módulo.
- Catálogo Workshop (talleres físicos):
Catalogs/WorkshopSelector.vue(selector reutilizable) +Catalogs/Dialogs/WorkshopCreateDialog.vue/WorkshopUpdateDialog.vue— probablemente vive dentro de una pantalla de Catálogos general, no bajo/taller. Por verificar: en qué ruta del nav se administra el catálogo de talleres (crear/editar Workshop) — no apareció bajo/tallerenroutes.js. - Servicios JS (
resources/js/services/...) no inspeccionados por límite de tiempo — por verificar nombres exactos de endpoints consumidos desde el frontend (probablementemaintenance-preventive-service.js/workshop-service.jso similar).
Permisos (Laratrust)
Sección titulada «Permisos (Laratrust)»Definidos en app/Core/Security/PermissionConst.php. Grupos relevantes:
- Unit Diagnosis (pantalla
/taller):view-unit-diagnosis,create-unit-diagnosis,update-unit-diagnosis,delete-unit-diagnosis,read-unit-diagnosis,create-file-unit-diagnosis,read-file-unit-diagnosis. - Workshops (catálogo de talleres):
view-workshops,create-workshops,update-workshops,delete-workshops,read-workshops. - Maintenances Preventives (
/taller/mantenimientos/preventivos):view-maintenances-preventives,create-maintenances-preventives,update-maintenances-preventives,delete-maintenances-preventives,read-maintenances-preventives,read-unit-maintenances-preventives,view-unit-maintenances-preventives,view-products-maintenances-preventives,view-tasks-maintenances-preventives,comment-maintenances-preventives,validate-conclusion-maintenances-preventives,confirm-concluded-maintenances-preventives,confirm-unit-available-maintenances-preventives,confirm-pieces-output-maintenances-preventives,confirm-pieces-and-availability-maintenances-preventives,confirm-conclusion-and-physical-parts-in-mp-vs-outputs-maintenances-preventives,reject-physical-parts-in-mp-vs-outputs-maintenances-preventives,authorize-maintenances-preventives,unauthorize-maintenances-preventives,assign-mechanic-maintenances-preventives,assign-inspection-maintenances-preventives,assign-workshop-maintenances-preventives,authorize-workshop-maintenances-preventives,unauthorize-workshop-maintenances-preventives,create-file-maintenances-preventives,read-file-maintenances-preventives,delete-file-maintenances-preventives,update-file-maintenances-preventives,create-product-maintenances-preventives,update-product-maintenances-preventives,delete-product-maintenances-preventives,create-task-maintenances-preventives,update-task-maintenances-preventives,delete-task-maintenances-preventives,create-sequence-br-maintenances-preventives,update-sequence-br-maintenances-preventives,delete-sequence-br-maintenances-preventives,get-sequence-br-maintenances-preventives,create-output-articles-maintenances-preventives. - Además (fuera de este módulo pero visibles desde
/taller):create-service-routines/update-service-routines,create-failure-symptoms/update-failure-symptoms. - Menú (
resources/js/components/Nav/menuOptions.js:396-417): entrada “Taller” concanView: ['view-unit-diagnosis', 'view-maintenances-preventives'](basta uno de los dos para ver el item de nav); submódulos individuales gateados por su propio permiso (view-unit-diagnosispara “Codigos”,view-maintenances-preventivespara “Mantenimientos Preventivos”).
Selectores usados por el tester (riesgo de fragilidad)
Sección titulada «Selectores usados por el tester (riesgo de fragilidad)»No existen specs de Playwright para Taller todavía (a diferencia de Remolques, que ya tiene tests/remolques/expand-trailer-detail.spec.ts). Todo lo siguiente es exploración de código, NO verificado contra el DOM real de QA:
- No hay
data-testiden la app en general (patrón confirmado ya en Remolques) — hay que asumir que Taller tampoco los tiene. UnitDiagnosisPage.vueusa componentes compartidos (main-container,filter-row,search-everything,unit-selector,common-add-button) iguales a los de otros reportes — los mismos problemas de scroll/posicionamiento de nav y de labels sinfordocumentados enremolques.mdprobablemente aplican aquí también.MaintenancePreventiveTabs.vueimplica un componente de tabs — por verificar el mecanismo real (¿<v-tabs>de Vuetify? ¿role=“tab”?) antes de escribir selectores de cambio de tab.- El flujo de estado de un mantenimiento preventivo (assign-workshop → authorize-workshop → assign-mechanic → … → confirm-unit-available) sugiere que la UI probablemente oculta/muestra botones de acción según el estado actual del registro — cualquier test de flujo end-to-end necesitará primero mapear qué botón aparece en qué estado, observando manualmente en QA.
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/taller bajo el título “Taller”. No se inspeccionó el contenido a mayor detalle visual.