Llega al laboratorio, usa el kiosko táctil para obtener su turno, firma consentimientos desde su celular vía WhatsApp.
Llama turnos, vincula paciente, selecciona exámenes, registra pago, envía consentimientos y pasa al paciente al área de muestras.
Llama turnos de su estación, verifica consentimientos firmados, inicia atención, toma la muestra y finaliza el turno.
Configura lugares, exámenes, prioridades, plantillas WhatsApp. Monitorea dashboard e historial. Exporta reportes CSV.
Muestran en tiempo real el turno en atención y la cola de espera. Se actualizan vía SSE (Server-Sent Events).
El motor de cola ordena los turnos por peso de prioridad (menor = más urgente) y luego por orden de llegada (FIFO). Las prioridades son configurables desde el panel de administración.
| Código | Prioridad | Color | Icono | Descripción | Peso |
|---|---|---|---|---|---|
| A | Niños | #ef4444 |
👶 fa-child | Pacientes menores de edad | 1 (mayor prioridad) |
| B | Embarazadas | #f97316 |
💗 fa-heart | Mujeres en estado de embarazo | 2 |
| C | Adulto mayor | #eab308 |
🧓 fa-person-cane | Mayores de 60 años | 3 |
| D | Discapacidad | #8b5cf6 |
♿ fa-wheelchair | Personas con discapacidad | 4 |
| E | Paciente general | #3b82f6 |
🧑 fa-user | Atención general | 5 |
| F | Muestra pendiente | #6b7280 |
🧪 fa-vial | Entrega de muestra tomada previamente | 6 (menor prioridad) |
Cada prioridad tiene su propia secuencia:
A-001 (niño, llegó 8:00) → E-001 (general, llegó 8:05) → A-002 (niño, llegó 8:10) → E-002 (general, llegó 8:15)
El motor de cola ordena por peso de prioridad y luego por número correlativo: primero llama a A-001 (prioridad A, peso 1), luego A-002, después E-001, y finalmente E-002.
La transición en_espera_lugar → en_servicio está bloqueada si el turno tiene consentimientos en estado pendiente, enviado o visto. Todos deben estar en firmado o rechazado antes de poder iniciar la atención. Esto se valida en cambiar_estado.php.
El paciente llega al laboratorio y se acerca al kiosko táctil (tablet o pantalla touch). No requiere login — es una pantalla pública siempre activa.
El kiosko nunca expone datos de otros pacientes. Solo muestra el código del turno recién creado y su posición en cola. El campo paciente_nombre almacena la cédula digitada (no el nombre real). El nombre real se vincula después en recepción.
El recepcionista ve la cola de turnos en espera en su pantalla. Cuando decide atender un turno, lo llama y se abre la ficha de atención.
Al hacer clic en "Guardar solicitud", se crea la turnero_solicitud con los exámenes (turnero_examen_items), el pago y el lugar destino. El sistema calcula automáticamente qué consentimientos informados se requieren basándose en los exámenes seleccionados y el lugar de destino.
Una vez guardada la solicitud, aparecen los consentimientos requeridos. El recepcionista puede enviarlos por WhatsApp o hacer que el paciente firme presencialmente en una tablet.
exam_tipo_consentimientos + turnero_lugar_consentimientos para determinar qué formularios aplica● pendiente → creado pero no enviado | ● enviado → WhatsApp enviado | ● visto → paciente abrió el enlace | ● firmado → paciente firmó | ● rechazado → paciente rechazó
Si varios exámenes requieren el mismo formulario de consentimiento, el sistema lo detecta y envía un solo enlace de firma. También si el paciente ya firmó ese consentimiento en una visita anterior, se reutiliza el token existente.
El recepcionista hace clic en "Pasar a lugar". El turno cambia de estado y aparece en la cola de la estación de toma de muestras asignada.
lugar_destino_id = la estación seleccionada (ej: "Toma de Muestras 1")El auxiliar de la estación de muestras ve en su pantalla la cola de pacientes asignados a su lugar. Este es el proceso detallado de toma de muestras:
El auxiliar hace clic en "Llamar siguiente". El motor de cola selecciona el turno con mayor prioridad (menor peso) y mayor tiempo de espera. El turno pasa a estado en_servicio.
⚠️ Bloqueo: Si hay consentimientos sin firmar, el botón "Iniciar atención" está deshabilitado y se muestra un banner rojo indicando cuántos consentimientos faltan.
Se abre la ficha con toda la información:
Si algún consentimiento aún no está firmado, el auxiliar puede:
Cuando todos los consentimientos están OK (firmados o rechazados), el botón "Iniciar atención" se habilita. El auxiliar hace clic y el estado cambia a en_servicio. Se registra inicio_lugar_at.
🧪 En este momento el auxiliar toma la muestra de sangre/orina/etc. al paciente.
El auxiliar hace clic en "Finalizar". El turno pasa a estado finalizado. Se registra fin_lugar_at. La ficha se cierra y el auxiliar puede llamar al siguiente paciente.
"Ausente": El paciente no se presentó → estado ausente
"Regresar a cola": El paciente necesita esperar (ej: ayuno insuficiente) → vuelve a en_espera_lugar
Durante todo el proceso, las pantallas TV muestran el estado actualizado del sistema. Hay 3 tipos de display:
El administrador tiene acceso a vistas de control y configuración del sistema completo.
| # | Actor / Vista | → API | Acción en BD | Resultado | Notifica |
|---|---|---|---|---|---|
| 1 | Kiosko | POST create_turno.php | INSERT turnero_turnos (estado=espera, correlativo por prioridad) | Código "A-001" + posición cola | SSE notify |
| 2 | Recepción | POST llamar_turno.php | UPDATE estado=en_recepcion + timestamps | Turno con datos completos | SSE notify |
| 3 | Recepción | POST create_solicitud.php | INSERT turnero_solicitudes + turnero_examen_items | Solicitud + consentimientos requeridos | SSE notify |
| 4 | Recepción | POST send_consentimiento.php | INSERT/UPDATE turnero_consentimientos + tokens UUID | Estado → enviado | |
| 5 | Paciente (celular) | GET ver_formulario_enviado.php?token=... | UPDATE turnero_consentimientos estado=firmado | Formulario firmado + evidencia | postMessage |
| 6 | Recepción | POST cambiar_estado.php → en_espera_lugar | UPDATE estado + lugar_destino_id | Turno pasa a cola del lugar | SSE notify |
| 7 | Lugar (auxiliar) | POST llamar_turno.php (area=lugar) | UPDATE estado=en_servicio + timestamps | Turno con ficha completa | SSE notify |
| 8 | Lugar (auxiliar) | GET get_consentimientos.php (polling 5s) | SELECT turnero_consentimientos + paciente + exámenes | Verifica si todos están firmados | — |
| 9 | Lugar (auxiliar) | POST cambiar_estado.php → finalizado | UPDATE estado + fin_lugar_at | Turno completado | SSE notify |
| 10 | Pantallas TV | GET sse_turno.php (conexión persistente) | SELECT cola + activo (cada 2s o por cambio) | Render en tiempo real + audio + voz | — |
Tabla principal. Cada fila = un turno. Almacena: código, número, prioridad, estado, timestamps de cada fase (creado, llamado recepción, inicio/fin recepción, llamado lugar, inicio/fin lugar), paciente_nombre (cédula del kiosko), paciente_cel.
Una por día. Controla apertura/cierre del sistema. Almacena: fecha, abierto_por, inicio_at, fin_at, sse_ping_at (para notificaciones SSE).
Vincula un turno con un paciente real, un lugar destino y los datos de pago. Se crea en recepción después de llamar el turno.
Relación N:M entre solicitud y tipos de examen. Cada fila = un examen solicitado para esa solicitud.
Cada consentimiento requerido por turno. Almacena: token UUID, estado (pendiente/enviado/visto/firmado/rechazado), timestamps.
Catálogo de estaciones: recepción, toma de muestras 1, 2, etc. Campos: nombre, tipo (recepcion/muestras), descripción, sort_order, activo.
Código (A-F), nombre, color, icono, descripción, orden_peso. Configurable desde el panel admin.
Catálogo de tipos de examen del laboratorio. Código, nombre, categoría. Se usa en la ficha de recepción.
exam_tipo_consentimientos: qué formularios requiere cada tipo de examen.
turnero_lugar_consentimientos: qué formularios requiere cada lugar/servicio.