📋 Historial GMP

Historial de servicios GMP y Protocolo ITS

El módulo Historial es el registro permanente de todos los servicios GMP que ION-target ejecuta sobre los equipos de sus clientes: calificaciones (IQ, OQ, PQ, IQOQ), verificaciones de performance, mantenimientos preventivos y calibraciones. Cada servicio tiene un número ITS único e inmutable y un Protocolo ITS (el panel de detalle) donde se cargan módulos, patrones (STD), técnicos, el reporte y el vínculo con el informe de cliente de eQMS.

⚖️
Registro GMP — inmutabilidad

El número ITS y el parentesco de un servicio son inmutables una vez creados. Los servicios no se eliminan (la API responde 405 a cualquier DELETE): se archivan con motivo obligatorio y quedan consultables. Todo cambio queda en el audit trail.

Estados del servicio

Un servicio GMP tiene cinco estados. Esta es la fuente única — cualquier otro valor que veas en pantalla es dato heredado:

EstadoDescripciónQué habilita
Por Realizar Estado inicial al crear el servicio. Registrado, pendiente de agendar. Editar el protocolo, programar, ejecutar o cancelar.
Programado Fecha acordada con el cliente y técnico asignado. Iniciar ejecución, volver a Por Realizar o cancelar.
En Ejecución Técnico realizando el servicio en sitio. Finalizar (con guard de informe) o cancelar.
Finalizado Servicio completado. Odoo sincroniza el cierre. Es el estado de cierre. Requiere informe de cliente o N/A.
Cancelado El servicio no se realizó. Odoo sincroniza la cancelación. No es irreversible: se puede volver a otro estado.
ℹ️
"Ejecutado" es un estado heredado, no uno nuevo

En datos viejos podés ver servicios en estado "Ejecutado". Es un valor importado: el modal no permite setearlo, y los servicios nuevos usan "En Ejecución". Por eso el filtro "Ejecutado" del listado no trae los servicios nuevos — para esos, filtrá por "En Ejecución".

⚠️
No hay máquina de estados que restrinja las transiciones

El modal permite pasar a cualquier estado. El backend solo valida que el estado sea un valor válido (400 si no lo es) y aplica el guard de Finalizado. El diagrama de abajo es la política operativa recomendada, no un bloqueo forzado por el sistema.

Por Realizar Programado En Ejecución Finalizado Cancelado 🔐 requiere informe de cliente o N/A cancelar (sin justificación) — desde cualquier estado ⬡ Odoo sincroniza en Finalizado / Cancelado

Las flechas grises son la política operativa recomendada (avance y retroceso), no un bloqueo del sistema: el modal permite ir a cualquier estado. El único candado real es el paso a Finalizado, que exige el informe de cliente (o marcar N/A). La cancelación es posible desde cualquier estado y no es irreversible.

Guard de cierre — informe de cliente

⚖️
No se puede finalizar sin informe de cliente (o N/A)

Para pasar un servicio a Finalizado se requiere el url_informe_cliente (el link al informe firmado en eQMS/CTR) o marcarlo como N/A. Si falta, el backend responde 409 y en el protocolo aparece el botón "Sin informe eQMS (N/A)", que pide una justificación de ≥15 caracteres. El link del informe lo recibe eQMS automáticamente al firmar el bundle CTR, vía PATCH /historial/{id}/url-informe.

⚖️
El estado vive en dos tablas — se mueven juntas por un solo camino

El estado del servicio existe en dos lugares: historial_servicio.estado (el banner del Protocolo ITS) y equipo_servicio.estado (el chip que ves en el listado de Equipos). Solo PATCH /historial/{id}/estado los mueve a los dos a la vez. Editar el servicio con PUT no toca el estado — justamente para que no se pueda saltear el guard de Finalizado.

Cancelación

Cancelar un servicio lo lleva al estado Cancelado y Odoo sincroniza la cancelación. A diferencia de lo que decía la versión anterior de esta ayuda:

  • No pide justificación ni un mínimo de caracteres.
  • No es irreversible: desde Cancelado se puede volver a otro estado (el sistema no lo bloquea).

Cambio de mes — cancela y recrea

⚖️
Un número ITS pertenece a un mes

Si cambiás el mes de la fecha de ejecución de un servicio que ya tiene protocolo, el sistema cancela ese servicio y abre uno nuevo (con número ITS del nuevo mes): un número ITS corresponde a un único mes, por trazabilidad. Por eso PUT /equipo-servicios/{id} bloquea el cambio de mes cuando hay protocolo asociado (responde 409) y el flujo se resuelve por el modal "Cambio de mes detectado". Cambiar solo el día del mismo mes no dispara la recreación.

Recalificación e ITS parentados

Un servicio puede ser hijo de otro (servicio_padre_id) del mismo equipo y tipo — típicamente para encadenar una recalificación con su calificación original.

  • El parentesco tiene un solo nivel: no hay "nietos" (un hijo no puede ser padre de otro).
  • El vínculo padre-hijo es inmutable una vez creado.
  • Un padre con hijos activos no se puede archivar (hay que resolver los hijos primero).

Tipos de servicio

El catálogo tiene 11 tipos de servicio GMP. La categoría se detecta por substring del nombre del tipo:

SiglaTipo
IQInstallation Qualification (calificación de instalación).
OQOperational Qualification (calificación operacional).
PQPerformance Qualification (calificación de desempeño).
IQOQCalificación combinada de instalación y operación.
PVVerificación de Performance.
PMMantenimiento Preventivo.
CalCalibración (y sus variantes del catálogo).
⚠️
AT y RB no son servicios GMP

AT (asistencia técnica) y RB (reparación) son intervenciones, no servicios GMP: no se cargan como servicio del historial. Si se intenta crearlas como tipo de servicio, el backend las rechaza con 422. Se gestionan desde AT y Reparaciones.

Numeración y vencimiento

ConceptoRegla
Número ITS Formato ITS-AAAAMMDD-NN. El correlativo diario (NN) se asigna de forma atómica y el número es inmutable. Si se ingresa un número manual, debe ser único (409 si ya existe).
Vencimiento Se calcula desde la fecha de ejecución + periodicidad (en meses) y se lleva al último día de ese mes.

Protocolo ITS — el modal

El Protocolo ITS es el panel de detalle de un servicio. Se abre al hacer click en el número ITS (📋 ITS-20260722-01) desde cualquier parte del sistema.

Campo / secciónDetalle
N° de protocoloEl número ITS. Inmutable.
N° de protocolo del clienteReferencia del cliente. Editable.
ObservacionesTexto libre.
ReporteTexto libre, con un botón "Aplicar comentario predeterminado" que sugiere un texto según la sigla del tipo de servicio.
MódulosSelección de los módulos del equipo involucrados en el servicio.
STDInstrumentos, estándares y solventes usados. Solo se ofrecen los recursos VIGENTES. Ver INST/STD/SV.
Técnicos ejecutoresLos técnicos que realizaron el servicio.
Informe de clienteSección con un badge de tres estados (ver abajo).

La sección Informe de cliente muestra uno de tres badges según el estado del vínculo con eQMS:

✓ PDF recibido N/A (sin informe) ⚠ pendiente de eQMS

Acciones sobre el servicio

AcciónEndpointCondiciones
ListarGET /historialCon filtros y agrupaciones.
Ver protocoloGET /historial/{id}Detalle completo del servicio.
CrearPOST /historialGenera el número ITS. Rechaza AT/RB (422).
EditarPUT /historial/{id}No toca el estado ni url_informe. 409 si está archivado.
Cambiar estadoPATCH /historial/{id}/estado400 si el estado es inválido; guard 409 al finalizar sin informe. Sincroniza equipo_servicio.
Recibir informePATCH /historial/{id}/url-informeLo llama eQMS al firmar el bundle CTR.
Marcar N/APATCH /historial/{id}/url-informe-naJustificación ≥15 caracteres.
ArchivarPATCH /historial/{id}/archivarMotivo obligatorio. Un padre con hijos activos no se archiva.
RestaurarPATCH /historial/{id}/restaurarSolo administrador (403 si no).
EliminarDELETE /historial/{id}No permitido — responde 405.

Preguntas frecuentes

¿Por qué no me deja cerrar el servicio como Finalizado?+
Porque falta el informe de cliente. Para finalizar se requiere el link al informe firmado en eQMS/CTR (url_informe_cliente) o marcarlo como N/A. Sin eso el sistema responde 409. Usá el botón "Sin informe eQMS (N/A)" y escribí una justificación de al menos 15 caracteres, o esperá a que eQMS envíe el informe al firmar el bundle.
Cambié el mes de la fecha y apareció un modal "Cambio de mes detectado".+
Es el comportamiento esperado. Un número ITS pertenece a un único mes, así que cambiar el mes de un servicio con protocolo cancela ese servicio y abre uno nuevo con número ITS del mes correcto. Si solo querés mover el día dentro del mismo mes, no se dispara la recreación.
El filtro "Ejecutado" no me trae nada.+
"Ejecutado" es un estado heredado (importado de datos viejos): el modal no lo setea y los servicios nuevos usan "En Ejecución". Para ver servicios en curso, filtrá por "En Ejecución".
Quiero restaurar un servicio archivado y me da 403.+
Restaurar es una acción exclusiva de administradores (PATCH /historial/{id}/restaurar). Si no sos admin, el sistema responde 403. Pedile a un administrador que lo restaure.
¿De dónde sale la fecha de vencimiento?+
Se calcula con la fecha de ejecución + la periodicidad (en meses) del servicio, y se lleva al último día de ese mes. No se ingresa a mano.