2026-06-10 — Asignación de camas y administración de planos

Se agregó una forma visual de asignar camas. Cada sede carga sus planos (un dibujo de las habitaciones y camas), y dentro de cada actividad el staff ve un mapa donde arrastra a cada inscripto a una cama libre. La cama asignada no es un estado de la inscripción: es un dato más (habitación + número de cama) que se puede cambiar en cualquier momento mientras la inscripción no esté en lista de espera ni cancelada.

Por qué

Antes la cama se cargaba escribiendo a mano la habitación y el número en la ficha de la inscripción, sin ver el conjunto. Con el mapa se ve de un vistazo qué camas están libres y ocupadas, se evita asignar dos personas a la misma cama y la asignación es mucho más rápida.

Qué se descartó del plan original

El análisis inicial (documento docs/2026-06-06-mapa-de-camas-y-checkin-automatico.md en el repositorio) preveía un check-in automático con mail al huésped y los estados bed_assigned / arrived / attended. Eso no se implementó y quedó descartado. El ciclo de vida de la inscripción termina en confirmed, y la cama es solo un dato editable (ver Estados y ciclo de vida).

Administración de planos (por sede)

  • Nueva pantalla “Administrar planos” dentro del grupo Configuración del panel de administración. Ahí se crean, editan y borran los planos de la sede.
  • Cada plano tiene un nombre, un identificador (slug) y un dibujo en formato SVG. El SVG es el que define las habitaciones y las camas: cada habitación puede marcar si tiene aire acondicionado, y la cantidad de camas determina si es individual (una cama) o compartida (varias).
  • Para facilitar la carga, la pantalla incluye un plano de ejemplo, la posibilidad de subir un archivo .svg y un texto de ayuda (prompt) para que una IA convierta la foto de un plano al formato esperado. Muestra una vista previa y el conteo de habitaciones y camas detectadas.
  • Los planos son propios de cada sede: lo que se carga en una sede no aparece en las demás.

Mapa de camas (dentro de la actividad)

  • Nueva pestaña “Plano de camas” en el detalle de la actividad (solo en actividades, no en promociones).
  • Se dibuja el plano real de la sede con las camas superpuestas; se puede hacer zoom y desplazar. Si la sede tiene varios planos, se elige cuál ver; si no tiene ninguno, invita a cargarlo en “Administrar planos”.
  • Colores de cada cama: libre (verde), ocupada (roja) y una en proceso de asignación (índigo). Las camas que no cumplen el filtro activo se ven atenuadas.
  • Filtros: solo con aire acondicionado, y por tipo de habitación (individual / compartida).
  • Cada cama muestra su número y, si está ocupada, el nombre de la persona. Hay tarjetas con el resumen: camas libres, ocupadas, inscriptos sin cama y total.
  • Asignar: se arrastra a un inscripto (de la lista “Sin asignar”) hasta una cama libre. Para liberar una cama, se arrastra la persona de vuelta a “Sin asignar”. También se lista aparte a quien tenga una cama cargada que no figura en el plano actual.
  • Es visible solo para el staff con permiso para gestionar inscripciones.

Dónde se carga y se cambia la cama

  • Desde el mapa de la actividad (pestaña “Plano de camas”), arrastrando.
  • Desde la ficha de la inscripción (panel de administración), en la sección “Logística”: ahora la habitación y la cama se eligen con listas desplegables armadas a partir de los planos de la sede (ya no es texto libre). No se puede editar si la inscripción está en lista de espera o cancelada. Si una cama guardada no existe en ningún plano, se conserva y se marca como “(fuera del plano)“.
  • La cama también puede cargarse al crear una inscripción desde el panel (alta manual por staff).
  • Al cancelar una inscripción, la cama se libera automáticamente.

Backend (API y plugin)

  • Los planos se guardan por sitio (cada sede tiene los suyos). Se expusieron endpoints para listar, ver, crear/reemplazar y borrar planos, protegidos por el permiso de gestión de inscripciones. El SVG se sanea al guardar (se quitan scripts y atributos peligrosos).
  • La inscripción ya tenía los campos habitación (attendee_room_slug) y número de cama (attendee_bed_number); se editan con el guardado normal de la inscripción (PATCH). Hay una guarda anti–doble reserva: no se permite asignar la misma cama a dos personas con fechas superpuestas.
  • Se quitaron del modelo los estados bed_assigned / arrived / attended. Una migración reescribe esas inscripciones antiguas a confirmed, conservando la habitación y la cama ya cargadas.

Documentación (este sitio)

  • Se publicó esta entrada de Cambios.
  • El análisis original quedó marcado como obsoleto/descartado en lo referido al check-in automático y los estados de cama.

Pendientes / a tener en cuenta

No existe un botón “Asignar en el mapa” desde la ficha de la inscripción que preseleccione a la persona en el mapa, ni el intercambio directo de una cama ocupada por otra (hay que liberar primero). El plano se carga como SVG: la conversión desde una foto se hace por fuera (con el prompt de ayuda).