Sistema de Gestión de Servicios Técnicos
ITS Lab es el sistema de gestión de servicios técnicos de ION-target Support para equipos HPLC/UHPLC en laboratorios farmacéuticos clientes. Centraliza protocolos GMP, asistencias técnicas, calibraciones de estándares y reportes de cliente bajo un marco regulatorio ANMAT/EMA, con audit trail inmutable y control de vencimientos.
ITS Lab opera bajo ANMAT Disposición 4994/2022, EMA Annex 11 y GAMP5 Categoría 3. Toda operación de modificación y archivo se registra en un audit trail append-only (Row Level Security en PostgreSQL) con un correlation ID único por request.
Acceso y login
El sistema está disponible en https://its.ion-target.com. Se ingresa con
email y contraseña desde la pantalla de login, que llama a POST /auth/login.
ITS Lab tiene dos flujos de autenticación según el tipo de usuario:
| Tipo de usuario | Cómo se valida | Contra qué |
|---|---|---|
| Técnico | Credenciales de Odoo | Se valida por XML-RPC contra Odoo (ion-target.odoo.com). Son las mismas credenciales que usa el técnico en Odoo. |
| Administrador local | Contraseña local (es_admin_local) |
Se valida con una contraseña local (hash bcrypt) guardada en ITS Lab, no contra Odoo. |
La sesión
Tras autenticar, el backend emite un JWT firmado con RS256 (par de claves RSA-2048). La sesión
tiene una duración fija de 8 horas y no se renueva por actividad: el token se
guarda en el navegador (localStorage), sobrevive recargas y, al expirar, hay que volver a iniciar
sesión.
Aunque el token dure 8 horas, el backend revalida contra la base en cada request. Si a un usuario lo archivan o le quitan el rol de administrador local, su token queda invalidado en la siguiente llamada — no hay que esperar a que expire.
Errores de login
Todos los errores de autenticación devuelven HTTP 401 con un mensaje específico:
| Mensaje | Qué significa |
|---|---|
| Usuario no encontrado en ITS Lab | El email no corresponde a ningún usuario del sistema. |
| Usuario archivado — contactá a un administrador | El usuario existe pero fue dado de baja (archivado). |
| Sin contraseña configurada | El usuario no tiene contraseña local seteada (aplica al flujo de administrador local). |
| Contraseña incorrecta | La contraseña local no coincide (flujo administrador local). |
| Credenciales de Odoo inválidas | Odoo rechazó email/contraseña del técnico (flujo Odoo). |
| Token inválido o expirado | El JWT presentado ya no es válido (expiró, o el usuario fue archivado/revocado). |
SSO — inicio de sesión unificado
ITS Lab actúa como proveedor de identidad para el ecosistema *.ion-target.com
(Portal de Ayuda, ION eQMS). Un usuario que ya inició sesión en ITS Lab puede pasar a otro sistema del dominio
sin volver a autenticarse.
Si la URL de login trae ?return_to=<destino>, tras autenticar ITS Lab redirige a
ese destino llevando el token de sesión.
El redirect solo ocurre si el destino pasa una allowlist: dominios
ion-target.com y sus subdominios por https (más localhost en
desarrollo). Cualquier destino externo se descarta para no filtrar el token a un tercero.
El sistema receptor (por ejemplo eQMS) valida el token consultando la clave pública en
GET /auth/jwks. No necesita compartir la clave privada: verifica la firma RS256 con el JWKS.
Como ITS Lab expone su JWKS público, los demás sistemas de ion-target.com pueden aceptar su
token sin un login propio. Por seguridad, el token nunca viaja a un destino fuera de la allowlist.
Navegación
La barra de navegación superior (azul navy) está siempre visible y da acceso a los módulos del sistema. La pantalla de Inicio combina cards de acceso rápido con el Dashboard de KPIs embebido.
| Módulo | Ruta | Descripción |
|---|---|---|
| Inicio | / | Dashboard de KPIs + cards de acceso rápido a cada módulo. |
| Laboratorios | /laboratorios | Clientes, sectores y usuarios asignados. |
| Equipos | /equipos | Equipos HPLC/UHPLC, módulos, servicios GMP y consumibles. |
| Consumibles | /consumibles | Catálogo de partes y consumibles. |
| Historial | /historial | Registro completo de servicios GMP ejecutados. |
| INST/STD/SV | /std | Instrumentos de medición, estándares (patrones) y solventes de referencia. |
| AT / RB | /asistencias | Asistencias Técnicas y Reparaciones de Banco. |
| Admin | /admin | Solo administradores — usuarios, tipos, parámetros y log de actividad. |
En Inicio, la card de acceso rápido a Administración se muestra únicamente a los usuarios
con es_admin_local. Un técnico no la ve.
En dispositivos móviles el menú se colapsa en un botón hamburguesa (≡) en la esquina superior derecha. Tocá para expandirlo. ITS Lab es una PWA responsive.
Roles de usuario
El acceso lo determina el booleano es_admin_local, no el campo "rol" (que es una
etiqueta libre, descriptiva, sin efecto sobre los permisos). Hay dos niveles reales:
| Nivel | Autenticación | Alcance |
|---|---|---|
| Técnico | Contra Odoo (XML-RPC) | Todos los módulos salvo Admin. En el banner de vencimientos ve solo sus propios protocolos. |
| Administrador local | Contraseña local (bcrypt) | Ve el módulo Admin y todos los vencimientos. Es el único que puede setear contraseñas y disparar envíos. |
Banner de alertas de vencimiento
Arriba de todos los módulos aparece un banner cuando hay protocolos GMP por vencer. El frontend
lo alimenta con GET /notificaciones/vencimientos. Es descartable (✕) y
expandible ("Ver detalle" abre una tabla con el desglose).
| Bucket | Días hasta el vencimiento |
|---|---|
| Vencido | Menos de 0 días (ya venció). |
| Crítico | Entre 0 y 14 días. |
| Próximo | Entre 15 y 30 días. |
El técnico ve únicamente los protocolos de los que es responsable; el
administrador ve todos. La ventana de días proviene del parámetro
dias_alerta_vencimiento (por defecto 30).
Principios GMP del sistema
Ningún registro puede borrarse: la API responde 405 a cualquier DELETE. Los
módulos implementan archivado lógico con un motivo obligatorio (mínimo 5 caracteres) que
queda en el audit trail. Los archivados pueden restaurarse con privilegios de administrador.
| Principio | Implementación en ITS Lab |
|---|---|
| Trazabilidad completa | Cada acción (crear, modificar, archivar, enviar reporte) se registra en log_actividad con usuario, timestamp y correlation ID único por operación. |
| Archivado obligatorio con motivo | El modal de archivado exige un motivo de mínimo 5 caracteres. Sin motivo no se confirma la acción. |
| Números de protocolo inmutables | Los códigos ITS-AAAAMMDD-NN, AT-AAAAMMDD-NN y RB-AAAAMMDD-NN se generan una sola vez y nunca se sobreescriben. |
| Audit trail append-only | La tabla log_actividad tiene Row Level Security (RLS) en PostgreSQL: ningún rol de aplicación puede modificar ni eliminar registros. |
| Autenticación con tokens firmados | JWT firmado con RS256 (RSA-2048). JWKS público disponible en GET /auth/jwks para la integración con eQMS. |
Integración con Odoo
ITS Lab es el sistema origen: los servicios y asistencias creados aquí generan tareas
automáticamente en Odoo (ion-target.odoo.com). El cierre vuelve de Odoo a ITS Lab
por webhook.
| Tipo | Proyecto Odoo | Sincronización |
|---|---|---|
| Servicios GMP | Proyecto 12 | ITS Lab → Odoo al crear; Odoo → ITS Lab al cambiar de estado. |
| AT / RB | Proyecto 13 | Ídem — el odoo_task_id vincula ambos sistemas. |
Cuando una tarea se cierra en Odoo, un webhook a /odoo/webhook-stage actualiza el estado en
ITS Lab. El webhook está protegido por un secreto incrustado en la URL, y el mapeo de estado
se resuelve por stage_id numérico.
Módulos del sistema
Preguntas frecuentes
ion-target.odoo.com. La contraseña local solo aplica al administrador local (es_admin_local).es_admin_local, no el campo "rol" (que es una etiqueta libre). Si necesitás acceso administrativo, contactá a quien administra el sistema para que te lo asigne.