Documentación de la API

Tenants (Organizaciones)

GET/api/tenants

Obtener lista de todas las organizaciones

Response:

[
  {
    "id": "uuid",
    "name": "Centro Médico ABC",
    "slug": "centro-medico-abc",
    "logo": "https://...",
    "primaryColor": "#0066CC",
    "createdAt": "2024-01-15T10:00:00Z",
    "updatedAt": "2024-01-15T10:00:00Z"
  }
]
POST/api/tenants

Crear una nueva organización

Request Body:

{
  "name": "Centro Médico ABC",
  "slug": "centro-medico-abc",
  "logo": "https://...",        // opcional
  "primaryColor": "#0066CC"     // opcional, default: #0066CC
}

Response:

{
  "id": "uuid",
  "name": "Centro Médico ABC",
  "slug": "centro-medico-abc",
  ...
}

Tipos de Turnero

Cada tenant puede tener múltiples tipos de turnero: Consulta Externa, Toma de Muestras, Urgencias, Imágenes Diagnósticas, etc.

GET/api/tenants/{tenantId}/queue-types

Obtener tipos de turnero de una organización

Response:

[
  {
    "id": "uuid",
    "tenantId": "uuid",
    "name": "Consulta Externa",
    "slug": "consulta-externa",
    "code": "CE",
    "description": "Consultas médicas generales",
    "color": "#0284c7",
    "icon": "stethoscope",
    "voiceAnnouncement": "both",
    "isActive": true,
    "displayOrder": 1,
    "createdAt": "2024-01-15T10:00:00Z"
  }
]
POST/api/tenants/{tenantId}/queue-types

Crear un nuevo tipo de turnero

Request Body:

{
  "name": "Toma de Muestras",       // requerido
  "slug": "toma-muestras",          // requerido - para URL
  "code": "TM",                     // requerido - prefijo de turnos
  "description": "Laboratorio",     // opcional
  "color": "#059669",               // opcional
  "icon": "test-tube",              // opcional (users, test-tube, stethoscope, siren, image, pill, heart-pulse, clipboard)
  "voiceAnnouncement": "both",      // opcional (turn_number, patient_name, both, none)
  "displayOrder": 2                 // opcional
}

Opciones de Anuncio de Voz

  • turn_number - Solo anuncia el número de turno
  • patient_name - Solo anuncia el nombre del paciente
  • both - Anuncia turno y nombre del paciente
  • none - Sin anuncio de voz

Consultorios

GET/api/tenants/{tenantId}/offices

Obtener consultorios de una organización

Response:

[
  {
    "id": "uuid",
    "tenantId": "uuid",
    "queueTypeId": "uuid",
    "name": "Consultorio 1",
    "code": "C01",
    "floor": "Piso 2",
    "isActive": true,
    "createdAt": "2024-01-15T10:00:00Z"
  }
]
POST/api/tenants/{tenantId}/offices

Crear un nuevo consultorio

Request Body:

{
  "name": "Consultorio 1",
  "code": "C01",
  "queueTypeId": "uuid",  // opcional - tipo de turnero asociado
  "floor": "Piso 2"       // opcional
}

Turnos

GET/api/tenants/{tenantId}/turns

Obtener turnos de una organización

Query Parameters:

  • status - Filtrar por estado (waiting, calling, attending, completed, cancelled, no_show)
  • queueType - Filtrar por tipo de turnero (slug)
  • date - Filtrar por fecha (YYYY-MM-DD)

Response:

[
  {
    "id": "uuid",
    "tenantId": "uuid",
    "queueTypeId": "uuid",
    "officeId": "uuid",
    "turnNumber": "CE001",
    "patientName": "Juan Pérez",
    "patientDocument": "12345678",
    "status": "waiting",
    "priority": 0,
    "announced": false,
    "notes": null,
    "calledAt": null,
    "attendedAt": null,
    "completedAt": null,
    "createdAt": "2024-01-15T10:00:00Z",
    "updatedAt": "2024-01-15T10:00:00Z",
    "office": { ... },
    "queueType": { ... }
  }
]
POST/api/tenants/{tenantId}/turns

Crear un nuevo turno

Request Body:

{
  "patientName": "Juan Pérez",     // requerido
  "queueTypeId": "uuid",           // requerido - tipo de turnero
  "patientDocument": "12345678",   // opcional
  "officeId": "uuid",              // opcional
  "priority": 0,                   // opcional, 0=normal, 1+=prioritario
  "notes": "Observaciones"         // opcional
}

Response:

{
  "id": "uuid",
  "turnNumber": "CE001",
  "status": "waiting",
  "queueType": { "name": "Consulta Externa", "code": "CE", ... },
  ...
}
PATCH/api/tenants/{tenantId}/turns/{turnId}

Actualizar un turno (cambiar estado, asignar consultorio, etc.)

Request Body:

{
  "status": "calling",        // waiting, calling, attending, completed, cancelled, no_show
  "officeId": "uuid",         // opcional
  "notes": "Nota adicional",  // opcional
  "patientName": "Nuevo nombre"  // opcional
}
POST/api/tenants/{tenantId}/turns/call-next

Llamar al siguiente turno en espera (prioridad más alta primero, luego más antiguo)

Request Body:

{
  "officeId": "uuid",        // requerido - consultorio que llama
  "queueTypeId": "uuid"      // opcional - filtrar por tipo de turnero
}

Response:

{
  "id": "uuid",
  "turnNumber": "CE001",
  "status": "calling",
  "calledAt": "2024-01-15T10:30:00Z",
  "office": { ... },
  "queueType": { ... },
  ...
}
DELETE/api/tenants/{tenantId}/turns/{turnId}

Eliminar un turno

Display (Pantalla)

GET/api/tenants/{tenantId}/display

Obtener datos optimizados para el display del turnero

Query Parameters:

  • queueType - Filtrar por tipo de turnero (slug). Si no se especifica, muestra todos los tipos.

Response:

{
  "tenant": {
    "id": "uuid",
    "name": "Centro Médico ABC",
    "slug": "centro-medico-abc",
    "logo": "https://...",
    "primaryColor": "#0066CC",
    ...
  },
  "queueType": {
    // Tipo de turnero seleccionado (null si no se filtró)
    "id": "uuid",
    "name": "Consulta Externa",
    "slug": "consulta-externa",
    "voiceAnnouncement": "both",
    ...
  },
  "queueTypes": [
    // Todos los tipos de turnero activos del tenant
    { "id": "uuid", "name": "Consulta Externa", "slug": "consulta-externa", ... }
  ],
  "calling": [
    // Turnos con status "calling" (siendo llamados)
    { 
      "turnNumber": "CE001", 
      "patientName": "...", 
      "office": {...}, 
      "queueType": {...},
      "announced": false,
      ... 
    }
  ],
  "waiting": [
    // Próximos 15 turnos en espera
    { "turnNumber": "CE002", "patientName": "...", "queueType": {...}, ... }
  ],
  "recent": [
    // Últimos 5 turnos atendidos/completados
    { "turnNumber": "CE000", ... }
  ],
  "timestamp": "2024-01-15T10:30:00Z"
}

URLs del Display

/display/{slug}

Pantalla principal del turnero. Muestra todos los tipos de turnero.

/display/{slug}?queueType=consulta-externa

Pantalla filtrada por tipo de turnero específico.

/demo

Demostración con datos de ejemplo y prueba de voz.

Anuncios de Voz

El sistema incluye anuncios de voz automáticos en español latinoamericano (es-419). Los anuncios se activan cuando un turno pasa a estado "calling".

Características:

  • - Sonido de atención antes del anuncio
  • - Anuncio configurable por tipo de turnero (número, nombre, o ambos)
  • - Indica el consultorio/ventanilla de destino
  • - Repetición automática del anuncio
  • - Botón para activar/desactivar la voz
  • - Compatible con voces de Chrome, Firefox, Safari y Edge

Ejemplo de anuncio:

"Atención. Turno C E cero cero uno. Paciente María García López. Por favor diríjase a Consultorio 3. Piso 2."

Estados del Turno

  • waiting - En espera de ser llamado
  • calling - Siendo llamado (se muestra en pantalla y se anuncia por voz)
  • attending - En atención
  • completed - Atención completada
  • cancelled - Turno cancelado
  • no_show - Paciente no se presentó