📘 ITS Lab Support

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.

⚖️
Marco regulatorio

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 usuarioCómo se validaContra 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.

⚖️
Revocación en caliente

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:

MensajeQué significa
Usuario no encontrado en ITS LabEl email no corresponde a ningún usuario del sistema.
Usuario archivado — contactá a un administradorEl usuario existe pero fue dado de baja (archivado).
Sin contraseña configuradaEl usuario no tiene contraseña local seteada (aplica al flujo de administrador local).
Contraseña incorrectaLa contraseña local no coincide (flujo administrador local).
Credenciales de Odoo inválidasOdoo rechazó email/contraseña del técnico (flujo Odoo).
Token inválido o expiradoEl 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.

1
Destino en la URL

Si la URL de login trae ?return_to=<destino>, tras autenticar ITS Lab redirige a ese destino llevando el token de sesión.

2
Allowlist de destinos

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.

3
Validación en el otro sistema

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.

💡
Una sola sesión para todo el dominio

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.

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óduloRutaDescripción
Inicio/Dashboard de KPIs + cards de acceso rápido a cada módulo.
Laboratorios/laboratoriosClientes, sectores y usuarios asignados.
Equipos/equiposEquipos HPLC/UHPLC, módulos, servicios GMP y consumibles.
Consumibles/consumiblesCatálogo de partes y consumibles.
Historial/historialRegistro completo de servicios GMP ejecutados.
INST/STD/SV/stdInstrumentos de medición, estándares (patrones) y solventes de referencia.
AT / RB/asistenciasAsistencias Técnicas y Reparaciones de Banco.
Admin/adminSolo administradores — usuarios, tipos, parámetros y log de actividad.
ℹ️
La card Admin solo aparece para administradores

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.

💡
Navegación mobile

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:

NivelAutenticaciónAlcance
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.
👷 Técnico 🔑 Administrador

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).

BucketDías hasta el vencimiento
VencidoMenos de 0 días (ya venció).
CríticoEntre 0 y 14 días.
PróximoEntre 15 y 30 días.
ℹ️
Qué protocolos ve cada uno

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

⚖️
No existen eliminaciones — solo archivado

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.

PrincipioImplementación en ITS Lab
Trazabilidad completaCada 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 motivoEl modal de archivado exige un motivo de mínimo 5 caracteres. Sin motivo no se confirma la acción.
Números de protocolo inmutablesLos códigos ITS-AAAAMMDD-NN, AT-AAAAMMDD-NN y RB-AAAAMMDD-NN se generan una sola vez y nunca se sobreescriben.
Audit trail append-onlyLa 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 firmadosJWT 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.

TipoProyecto OdooSincronización
Servicios GMPProyecto 12ITS Lab → Odoo al crear; Odoo → ITS Lab al cambiar de estado.
AT / RBProyecto 13Ídem — el odoo_task_id vincula ambos sistemas.
ℹ️
Cierre automático Odoo → ITS Lab

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

📊
Dashboard y KPIs
Semáforo de vencimientos, equipos críticos, servicios recientes.
🏢
Laboratorios
Clientes, sectores y usuarios en jerarquía de tres niveles.
🔬
Equipos HPLC/UHPLC
Ficha de equipo, módulos, servicios GMP, consumibles.
📋
Historial GMP
Protocolo ITS completo, estados, STD y consumibles usados.
⚗️
INST/STD/SV
Instrumentos, patrones y solventes de referencia con vencimientos.
🔧
AT y Reparaciones
Asistencias Técnicas y Reparaciones de Banco con seguimiento.
📄
Reporte de Cliente
PDF multipágina por período: GMP, AT/RB y fichas por equipo.
🔑
Administración
Solo administradores: usuarios, tipos, parámetros y log de actividad.

Preguntas frecuentes

¿La sesión se renueva sola mientras trabajo?+
No. La sesión dura 8 horas fijas desde el login y no se renueva por actividad. Al cumplirse las 8 horas hay que volver a iniciar sesión. El token vive en el navegador y sobrevive recargas mientras siga vigente.
Soy administrador y un técnico no puede entrar aunque la contraseña es correcta.+
Los técnicos se validan contra Odoo (XML-RPC), no contra una contraseña local de ITS Lab. Si el técnico no entra, verificá que sus credenciales de Odoo funcionen en ion-target.odoo.com. La contraseña local solo aplica al administrador local (es_admin_local).
Como técnico solo veo algunas alertas de vencimiento, ¿por qué?+
El banner de vencimientos filtra por responsable: el técnico ve solo sus propios protocolos. El administrador ve todos. Es el comportamiento esperado, no un error.
¿Por qué no veo el módulo Admin en el menú?+
El acceso a Admin lo da el booleano 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.
Archivaron a un usuario, ¿su sesión sigue activa hasta que expire?+
No. Aunque el token dure 8 horas, el backend revalida contra la base en cada request. Si el usuario fue archivado o perdió el rol de administrador, su token queda invalidado en la siguiente llamada (revocación en caliente).
¿Puedo entrar desde el celular?+
Sí. ITS Lab es una PWA (Progressive Web App) con diseño responsive completo. Podés agregar el acceso directo a la pantalla de inicio desde el navegador. En mobile el menú se colapsa en el ícono ≡.