Ir al contenido

Padrón de participantes

El padrón vive por evento: un mismo email puede existir en eventos distintos. La unicidad interna es lower(email) dentro del evento.

precargado ──confirmar-registro──▶ registrado ──asistencia──▶ asistio
Estado Significado
precargado Está en el padrón pero aún no confirma sus datos
registrado Confirmó nombre; elegible para reserva y boleto
asistio Marcado en puerta (manual o vía check-in)

Repetir una transición ya consumida responde 409.

Ventana de terminal
curl -X POST http://localhost:5000/participantes/importar \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{
"eventoId": "<uuid>",
"archivoNombre": "padron-diciembre.csv",
"ejecutadaPor": "<uuid-admin>",
"filas": [
{ "email": "ana@empresa.mx", "nombrePadron": "Ana López", "tipoEmpleado": "quincenal" },
{ "email": "luis@empresa.mx", "nombrePadron": "Luis Pérez", "tipoEmpleado": "externo" }
]
}'

Respuesta (200):

{
"importacionId": "…",
"filasLeidas": 2,
"filasAceptadas": 2,
"filasRechazadas": 0,
"rechazos": []
}

Todo es idempotente por email: reimportar un email ya existente no duplica ni pisa la fila confirmada. Cada corrida queda registrada en importacion_padron.

tipoEmpleado ∈ quincenal | semanal | externo | invitado.

  • POST /participantes/ — alta manual (201).
  • PATCH /participantes/{id} — corrige datos de padrón (p. ej. estatusLaboral); las columnas de sistema (id, fechas) no aceptan cambios.
  • DELETE /participantes/{id} — 409 si el participante tiene reserva vigente (borrar con historial no permitido).
Ventana de terminal
# precargado → registrado (el participante confirma su nombre)
curl -X POST http://localhost:5000/participantes/{id}/confirmar-registro \
-H 'content-type: application/json' -H "authorization: Bearer $TOKEN" \
-d '{"nombreConfirmado":"Ana López"}'
# registrado → asistio (marca manual, p. ej. en ventanilla)
curl -X POST http://localhost:5000/participantes/{id}/asistencia \
-H "authorization: Bearer $TOKEN"

En el flujo normal, el check-in QR marca la asistencia solo; el endpoint manual cubre casos sin escáner.

Ventana de terminal
# Listado paginado del evento (cursor opaco)
GET /participantes/?eventoId=<uuid>&limit=100&cursor=…
# Filtros: estadoRegistro, q (búsqueda)
GET /participantes/por-email?eventoId=<uuid>&email=ana@empresa.mx
GET /participantes/{id}

El cursor es opaco: pásalo tal cual desde siguienteCursor (null al final). total acompaña cada página para paginar con contador.

Qué zonas puede ocupar cada participante (lo usa el selector de lugares):

Ventana de terminal
GET /participantes/{id}/zonas # lista actual
PUT /participantes/{id}/zonas # reemplazo completo { zonasIds: [...] }

PUT reemplaza, no mezcla. Una zona de otro evento responde 400.

→ Reservas