Ir al contenido principal

Verificar QR (1) - [verifyQR]

🧾 Descripción

Este servicio permite validar si un empleado tiene permitido registrarse (por ejemplo, marcar asistencia) en función del último escaneo de QR del bus registrado en el ERP.

La lógica se basa en verificar si el empleado escaneó su QR dentro de las últimas 4 horas (14400 segundos).

El servicio consulta la tabla:

  • Registro de Escaneres de Bus

  • Tabla Lista Blanca

Mediante dbErp() para obtener el escaneo más reciente disponible.


🚀 Endpoint

POST /verify-qr


📥 Request Body (Ejemplo)

{ "employee": "HR-EMP-00045" }

Parámetros

Campo Tipo Obligatorio Descripción
employee string ✔️ Código de empleado a validar

🔐 Seguridad

El servicio usa comunicación interna con ERP mediante:

  • dbErp()

  • Autenticación interna utilizando cookies o token del ERP.

No requiere autenticación adicional desde el cliente.


🧠 Flujo del Servicio (Explicación real)

  1. Validación inicial del parámetro

    • Si employee está vacío → se devuelve error.

  2. Consulta del último escaneo registrado en ERP

    Se ejecuta:

    SELECT tpr.name, teas.empleado, teas.fecha FROM `tabRegistro de Escaneres de Bus` tpr LEFT JOIN `tabTabla Lista Blanca` teas ON teas.parent = tpr.name WHERE teas.empleado = employee ORDER BY teas.fecha DESC LIMIT 1
  3. Si no existen registros

    • Se retorna mensaje indicando que no se encontró escaneo.

  4. Cálculo de la diferencia de tiempo

    Se obtiene el tiempo transcurrido entre:

    • Fecha del escaneo (fecha)

    • Fecha actual

    Se obtiene con:

    $diff = $fechaEscaneoCarbon->diffInSeconds(now());
  5. Aplicación de la regla de validación

    • Si la diferencia es menor a 4 horas (14400 segundos)permitido

    • Si es mayor → denegado

  6. Manejo de excepciones
    Si ocurre un error interno, se retorna el mensaje de error.


📤 Response 200 – Ejemplos

✔️ Caso permitido (último escaneo dentro de 4 horas)

{ "status": true, "msn": "permitido" }

✔️ Caso denegado (más de 4 horas sin escanear)

{ "status": true, "msn": "denegado" }

❌ No existe escaneo asociado al empleado

{ "status": false, "msn": "No se ha encontrado un escaner de bus para el empleado" }

❌ Parámetro inválido

{ "status": false, "msn": "El empleado no puede estar vacio" }

❌ Error interno

{ "status": false, "msn": "Error interno: <mensaje>" }

📚 Schemas utilizados

Registro de Escaneres de Bus (consulta)

Campos consultados:

{ "name": "string", "empleado": "string", "fecha": "datetime" }

🗃 Lógica en Pseudo-código

if employee is empty: return error("El empleado no puede estar vacio") data = GET ultimo registro de escaneo del bus para employee if no data: return error("No se ha encontrado un escaneo") fechaEscaneo = data.fecha diferencia = now() - fechaEscaneo (en segundos) if diferencia < 14400: return permitido else: return denegado