El estado solo se mueve por las transiciones que define el catálogo (status_transitions):
- Abierto → En progreso o Cancelado
- En progreso → En espera, Resuelto o Cancelado
- En espera → En progreso o Cancelado
- Resuelto → Cerrado o En progreso
Cerrado y Cancelado son finales: de ahí solo se sale reabriendo. El detalle muestra un botón “Pasar a X” con el siguiente paso natural y el resto en “Cambiar a…”; el Kanban de Mis incidentes usa el mismo flujo al soltar una tarjeta.
Paso a paso
- PersonaElige el estado nuevo
Solo se ofrecen los destinos que la API entrega para ese incidente; el navegador no conoce las transiciones.
- Navegador¿El destino pide nota o es final?
Resuelto y Cancelado piden nota (
statuses.requires_note); los finales piden además confirmación. Los demás estados aceptan una nota opcional ("Agregar una nota"). - PersonaEscribe la nota y confirma
- NavegadorEnvía PUT /incidents/{id}/status
Con el código del estado, la versión conocida y la nota (hasta 1.000 caracteres).
- API¿Lo ve y puede cambiar su estado?
Con
incidents.status.any, o conincidents.status.assignedsi lo tiene asignado. Nunca en uno cerrado, cancelado o eliminado. - API¿Versión actual?
- Base de datos¿La transición está en el catálogo?
- APISi el destino pide nota, ¿la trae?
- APICalcula la fecha de resolución
Por las banderas del catálogo: a un estado pendiente,
resolved_atvuelve a vacío; a uno no pendiente ni final (Resuelto), ahora; a uno final, se conserva la que tenía. - Base de datosGuarda estado, versión e historial
Un solo
UPDATEcon la versión en elWHEREy la entradastatus_changed(de y a, con la nota) en la misma transacción. - Cola y avisosAvisa del cambio tras confirmar
Caché del dashboard,
incident.changedy notificación a quien lo creó y a quien lo tiene asignado (nunca a quien hizo el cambio). - NavegadorMuestra el estado nuevo y su historial
Qué ve la persona en cada error
| Código | HTTP | Cuándo | Mensaje en pantalla |
|---|---|---|---|
INVALID_STATUS_TRANSITION | 409 | Ese destino no sale del estado actual (por ejemplo, otra persona lo movió) | Ese cambio de estado no está permitido desde el estado actual. Recarga la página para ver las opciones disponibles. |
STATUS_NOTE_REQUIRED | 422 | Resuelto o Cancelado sin nota | Para este cambio de estado hace falta una nota. Escribe brevemente qué pasó y vuelve a intentarlo. |
VERSION_CONFLICT | 409 | Alguien guardó otro cambio antes | Alguien más guardó cambios en este incidente mientras lo tenías abierto. Recarga para ver la versión actual antes de seguir. |
INCIDENT_FINALIZED | 409 | Ya está cerrado o cancelado | Este incidente ya está cerrado o cancelado, así que no se puede modificar. |
FORBIDDEN_ACTION | 403 | Sin permiso de estado, o no lo tiene asignado | No tienes permiso para hacer esta acción. Si crees que deberías tenerlo, habla con un administrador. |
Dónde está en el código
ChangeIncidentStatus: transición, nota y fecha de resolución.IncidentRules(resolvedAt) eIncidentAccess.EloquentIncidentCatalog: transiciones del catálogo.useStatusChange,useNoteDialogeIncidentNoteDialog.- Explicación del módulo: Módulo Incidents.