Editar cambia el título, la descripción, la prioridad y el vencimiento. El estado y el asignado tienen sus propios flujos. Cada incidente lleva un número de versión: quien guarda envía la versión que conocía, y si otra persona guardó entretanto, la API lo rechaza en lugar de pisar su cambio.
Paso a paso
- PersonaPulsa Editar en el detalle
El botón solo aparece si la API dice que puede (
actions.update). El navegador no calcula la regla. - NavegadorCarga el incidente con su versión
Mientras edita, si llega por tiempo real un cambio de otra persona, avisa "Otra persona cambió este incidente · Recargar" sin borrar el borrador. Si intenta salir con cambios sin guardar, pide confirmación.
- NavegadorEnvía PUT /incidents/{id} con version
El vencimiento solo se envía si cambió; así un incidente vencido se puede seguir editando sin que la regla "no en el pasado" lo impida.
- API¿Lo ve y puede editarlo?
Con
incidents.update.any, mientras no esté cerrado ni cancelado. Conincidents.update.own, solo lo que creó y mientras siga en el estado inicial. Si no lo puede ver, 404, como si no existiera. - API¿La versión es la actual?
- API¿Cambió algo?
Compara campo por campo. Si nada cambió, devuelve el incidente tal cual, sin escribir ni dejar historial.
- APIDevuelve el incidente sin cambios
- Base de datosUPDATE con la versión en el WHERE
UPDATE … WHERE id = ? AND lock_version = ?y la versión sube en la misma sentencia. Si otra transacción ganó en ese instante, no afecta filas y la API responde el mismo 409. En la misma transacción queda la entradaupdateddel historial con solo los campos que cambiaron (antes y después). - Cola y avisosAvisa del cambio tras confirmar
Caché del dashboard,
incident.changeda quienes pueden verlo y notificaciones a los participantes. - NavegadorVuelve al detalle con "Cambios guardados."
Ante el VERSION_CONFLICT, el formulario conserva lo escrito, muestra el aviso y un botón “Recargar” que trae la versión actual.
Qué ve la persona en cada error
| Código | HTTP | Cuándo | Mensaje en pantalla |
|---|---|---|---|
VERSION_CONFLICT | 409 | Otra persona guardó después de que se abrió el formulario | Alguien más guardó cambios en este incidente mientras lo tenías abierto. Recarga para ver la versión actual antes de seguir. |
INCIDENT_EDIT_LOCKED | 409 | Quien lo creó intenta editar cuando ya no está en el estado inicial | Este incidente ya lo están atendiendo, así que ya no puedes editarlo. Si necesitas cambiar algo, habla con un supervisor. |
INCIDENT_FINALIZED | 409 | Está cerrado o cancelado | Este incidente ya está cerrado o cancelado, así que no se puede modificar. |
FORBIDDEN_ACTION | 403 | Lo ve, pero su rol no incluye editarlo | No tienes permiso para hacer esta acción. Si crees que deberías tenerlo, habla con un administrador. |
RESOURCE_NOT_FOUND | 404 | No existe, está eliminado o no lo puede ver | No encontramos lo que buscas. Puede que se haya eliminado o que no tengas acceso. |
Dónde está en el código
UpdateIncident: comparación campo por campo y transacción.IncidentGateeIncidentAccess: quién puede y por qué no.EloquentIncidentRepository: la versión en el mismoUPDATE.UpdateIncidentRequest:versionobligatoria yassigneerechazado.useIncidentFormeIncidentFormPage: conflicto, “Recargar” y aviso de tiempo real.- Explicación del módulo: Módulo Incidents.