Ir al contenido

Check-in

Cada entrada tiene un punto de acceso:

Ventana de terminal
curl -X POST http://localhost:5000/puntos/?eventoId=<uuid> \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{"nombre":"Puerta Norte"}'
  • PATCH /puntos/{id} con { "activo": false } cierra la puerta: mientras esté inactiva, escanear responde 409 "Punto de acceso inactivo".
  • DELETE /puntos/{id} responde 409 si ya tiene escaneos registrados.
  • GET /puntos/?eventoId=… lista las puertas del evento.
Ventana de terminal
curl -X POST http://localhost:5000/checkin/escanear \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{
"eventoId": "<uuid>",
"puntoAccesoId": "<uuid>",
"usuarioAdminId": "<uuid>",
"codigo": "codigo-qr-del-boleto",
"dispositivo": "tablet-entrada"
}'

Responde siempre 200 con el resultado (un escaneo rechazado no es error HTTP):

{
"resultado": "valido",
"boletoId": "…",
"reservaId": "…",
"mensaje": "Entrada permitida"
}
resultado Cuándo
valido QR correcto, firma OK, no usado — primer ingreso
duplicado El boleto ya entró (un boleto = un ingreso)
revocado El boleto fue revocado
no_encontrado El código no corresponde a ningún boleto

Al valido se marca además la asistencia del participante (registrado → asistio).

Errores HTTP: 409 si el punto está inactivo; 400/404 si algo del evento no existe.

Ventana de terminal
# Escaneos paginados con filtros (cursor por fecha)
GET /checkin/?eventoId=<uuid>&resultado=duplicado&desde=2026-12-18T00:00:00Z&hasta=…&limit=50
# Foto de accesos para el dashboard
GET /checkin/conteo?eventoId=<uuid>

El conteo devuelve { total, validos, duplicados, revocados, noEncontrados } agrupado por resultado.

Para lo que ocurre en puerta y no es un escaneo: QR ilegible, cambio de mesa, persona no listada:

Ventana de terminal
curl -X POST http://localhost:5000/incidencias/?eventoId=<uuid> \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{
"tipo": "cambio_mesa",
"participanteId": "<uuid>",
"mesaId": "<uuid>",
"descripcion": "Pidió cambiar a mesa de sombra",
"abiertaPor": "<uuid-admin>"
}'

tipo ∈ qr_ilegible | cambio_mesa | no_listado. Seguimiento:

Ventana de terminal
PATCH /incidencias/{id} -d '{"estado":"en_proceso"}'
PATCH /incidencias/{id} -d '{"estado":"resuelta"}' # guarda resueltaAt

GET /incidencias/?eventoId=… filtra por estado; GET /incidencias/{id} devuelve la ficha con los involucrados (participante, mesa).

→ Notificaciones