Ir al contenido

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.

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), tabla workshops.
  • Fillable: name, office_id (soft-deletes). Relación belongsTo(Office) y hasMany(PreventiveMaintenance) vía maintenances_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: PreventiveMaintenance se asigna a una unidad (tractor) — el flujo trae GetUnitsForMPController. Relación con Workshop: vía assign-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 con Maintenances/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).

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)

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.
  • Ruta /taller y /taller/codigos → resources/js/components/Units/Diagnosis/UnitDiagnosisPage.vue (mismo componente para ambas rutas; guard can('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 (guard can('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ún MaintenancePreventiveTabs).
    • 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 /taller en routes.js.
  • Servicios JS (resources/js/services/...) no inspeccionados por límite de tiempo — por verificar nombres exactos de endpoints consumidos desde el frontend (probablemente maintenance-preventive-service.js / workshop-service.js o similar).

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” con canView: ['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-diagnosis para “Codigos”, view-maintenances-preventives para “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-testid en la app en general (patrón confirmado ya en Remolques) — hay que asumir que Taller tampoco los tiene.
  • UnitDiagnosisPage.vue usa 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 sin for documentados en remolques.md probablemente aplican aquí también.
  • MaintenancePreventiveTabs.vue implica 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.

La página carga en https://qa.controlgmg.com/taller bajo el título “Taller”. No se inspeccionó el contenido a mayor detalle visual.