Skip to content

Asignación rápida

Ventana de la aplicación SIVA para repartir automáticamente a los vigilantes confirmados en las sedes, edificios y aulas de un ejercicio, con opción de revisar y editar manualmente la propuesta antes de aplicarla.

Dónde se abre

Dentro de la ventana de asignaciones de un ejercicio (GestionarAsignacionesModal.vue), en la pestaña Asignación, con el botón "Asignación rápida". Abre un modal independiente (QuickAssignModal.vue) de tamaño XL.

Componentes implicados

Componente / archivoResponsabilidad
frontend/src/components/ejercicios/modals/QuickAssignModal.vueOrquestador. Carga la meta, muestra el layout (config a la izquierda, resultado a la derecha) y controla el pie del modal.
QuickAssignScopeSelector.vueSelección del alcance (dónde se ejecuta el reparto).
QuickAssignRulesList.vueOrden y activación de las reglas de reparto.
QuickAssignOptionsPanel.vueOpciones adicionales del motor.
QuickAssignResultsPanel.vueMuestra la propuesta generada y permite editarla (drag&drop, quitar, responsable).
frontend/src/stores/simulationStore.tsStore Pinia: estado de configuración, resultado, edición y aplicación.
backend/src/services/simulation.service.tsMotor de simulación (genera la propuesta) y aplicación al guardar.
backend/src/dtos/simulation.dto.tsValidación Zod de los endpoints de simulación.

Configuración

Alcance (scope)

  • todas: reparto global en todas las ubicaciones del ejercicio.
  • sedes: solo en las sedes seleccionadas (ids).
  • edificios: solo en los edificios concretos seleccionados (ids).
  • aulas: solo en las aulas concretas seleccionadas (ids de ejercicioSedeAulaId).

Reglas (reglas) — se ejecutan en orden

  • resp — "Cobertura de responsables": garantiza al menos minResponsablesAula responsables por aula y, en edificios manuales, ceil(asignados / (ratioManual + 1)) (sobre los vigilantes finalmente asignados, no sobre la capacidad planificada).
  • pref — "Sede de preferencia": asigna cada vigilante a su sede preferida.
  • orden — "Orden de confirmación": rellena los huecos restantes por orden de confirmación (fecha_respuesta del llamamiento).

Los vigilantes sin preferencia se asignan siempre al final, rellenando lo que queda.

Opciones (QuickAssignConfig)

  • reasignarTodo: si está activo se borran las asignaciones existentes y se reparte desde cero; si no, se conservan y solo se rellenan huecos.
  • respetarCapacidad: no sobre-asignar por encima de los necesarios.
  • asignacionEquitativa: reparto por rondas (round-robin) en lugar de llenar un edificio antes de pasar al siguiente.
  • priorizarSinPreferencia: los responsables sin sede preferida se asignan antes.
  • designarResponsablesAuto: si está activo, cuando faltan responsables etiquetados el motor marca como responsables a vigilantes ya asignados hasta cumplir el mínimo por aula/edificio. Si está desactivado, los puestos sin cubrir se avisan y pueden marcarse a mano en la propuesta.
  • ratioManual: responsables en edificios sin aulas (1 por cada N vigilantes no responsables).
  • minResponsablesAula: mínimo de responsables exigido por cada aula (por defecto 1).
  • fijados: posiciones bloqueadas por el usuario (vigilanteId, targetType, targetId, esResponsable) que se conservan al volver a generar, aunque reasignarTodo esté activo.

Flujo de uso

  1. Se configura alcance, reglas y opciones.
  2. Generar propuestaPOST /ejercicios/:id/simulate con la configuración.
  3. Se revisa el resultado (agrupado por edificio/aula, con estadísticas: necesarios, propuestos, responsables cubiertos, sin asignar).
  4. Edición opcional de la propuesta (ver siguiente sección).
  5. Aplicar asignaciónPOST /ejercicios/:id/apply-simulation con el reparto final.

Edición de la propuesta (drag&drop)

El panel de resultados es editable en cuanto hay propuesta generada:

  • Arrastrar un vigilante entre aulas/edificios (o desde "Sin asignar").
  • Quitar (icono x) → pasa a "Sin asignar".
  • Marcar/desmarcar responsable (icono persona) por vigilante y aula.
  • Fijar/desfijar (icono candado) por vigilante: bloquea su posición actual para que se conserve al volver a generar. Si se arrastra un vigilante fijado, el candado lo sigue al nuevo destino (o se pierde al moverlo a "Sin asignar").
  • Auto-scroll al acercarse al borde del contenedor y scroll con la rueda del ratón mientras se arrastra.
  • Cada cambio recalcula las estadísticas en el store (simulationStore).

La edición muta resultado.slots[].vigilantes y resultado.sinAsignar mediante las acciones del store: moverVigilante, quitarVigilante, asignarDesdeSinAsignar y toggleResponsable.

Endpoints

GET /ejercicios/:id/simulation-meta

Devuelve los datos necesarios para simular: vigilantes confirmados (con etiquetas, sede preferida y orden de confirmación), ubicaciones del ejercicio (sedes, edificios con modo y aulas con necesarios), y las asignaciones ya existentes. Los vigilantes bloqueados y penalizados se excluyen.

POST /ejercicios/:id/simulate

Cuerpo (simulateBodySchema): ejercicio_id, scope, reglas, respetarCapacidad, ratioManual, minResponsablesAula, reasignarTodo, asignacionEquitativa, priorizarSinPreferencia, designarResponsablesAuto, excluirVigilanteIds, fijados.

Devuelve { slots, sinAsignar, stats }. Cada slot corresponde a un aula o a un edificio manual, con necesarios, minResponsables y sus vigilantes propuestos.

POST /ejercicios/:id/apply-simulation

Cuerpo (applySimulationBodySchema): ejercicio_id, reasignarTodo, reconciliar y assignments (lista de vigilanteId, targetType aula/edificio, targetId, esResponsable).

  • Si reasignarTodo, borra las asignaciones existentes del ejercicio.
  • Si reconciliar, para cada destino presente en el payload elimina las asignaciones existentes no incluidas (permite que "quitar un vigilante preexistente" en la propuesta se refleje al aplicar, incluso con reasignarTodo=false).
  • Luego crea/reactiva las asignaciones enviadas.

Avisos del panel de resultados

  • Rojo "sin responsable" por aula cuando hay vigilantes pero ningún responsable.
  • Morado "exceso" cuando un aula tiene más vigilantes de los necesarios.
  • Banner de desequilibrio de responsables: aparece si hay alguna aula ocupada sin responsable y otra con 2 o más responsables.

Historial de mejoras recientes

  • Mínimo de responsables calculado sobre los vigilantes realmente asignados (edificios manuales y aulas), no sobre la capacidad planificada.
  • Opción designarResponsablesAuto para cubrir puestos de responsable sin etiqueta y aviso de puestos sin cubrir al generar si está desactivada.
  • Edición de la propuesta antes de aplicar: drag&drop entre aulas, quitar a "Sin asignar", toggle de responsable y flag reconciliar.
  • Auto-scroll y scroll con rueda durante el arrastre en el panel de resultados.
  • minResponsablesAula configurable (antes fijado a 1) en opciones, DTO y motor.
  • Aviso de desequilibrio de responsables en el panel de resultados.

SIVA — Sistema Integral de Vigilantes de Aulas