Appearance
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 / archivo | Responsabilidad |
|---|---|
frontend/src/components/ejercicios/modals/QuickAssignModal.vue | Orquestador. Carga la meta, muestra el layout (config a la izquierda, resultado a la derecha) y controla el pie del modal. |
QuickAssignScopeSelector.vue | Selección del alcance (dónde se ejecuta el reparto). |
QuickAssignRulesList.vue | Orden y activación de las reglas de reparto. |
QuickAssignOptionsPanel.vue | Opciones adicionales del motor. |
QuickAssignResultsPanel.vue | Muestra la propuesta generada y permite editarla (drag&drop, quitar, responsable). |
frontend/src/stores/simulationStore.ts | Store Pinia: estado de configuración, resultado, edición y aplicación. |
backend/src/services/simulation.service.ts | Motor de simulación (genera la propuesta) y aplicación al guardar. |
backend/src/dtos/simulation.dto.ts | Validació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 deejercicioSedeAulaId).
Reglas (reglas) — se ejecutan en orden
resp— "Cobertura de responsables": garantiza al menosminResponsablesAularesponsables 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_respuestadel 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, aunquereasignarTodoesté activo.
Flujo de uso
- Se configura alcance, reglas y opciones.
- Generar propuesta →
POST /ejercicios/:id/simulatecon la configuración. - Se revisa el resultado (agrupado por edificio/aula, con estadísticas: necesarios, propuestos, responsables cubiertos, sin asignar).
- Edición opcional de la propuesta (ver siguiente sección).
- Aplicar asignación →
POST /ejercicios/:id/apply-simulationcon 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 conreasignarTodo=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
designarResponsablesAutopara 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.
minResponsablesAulaconfigurable (antes fijado a 1) en opciones, DTO y motor.- Aviso de desequilibrio de responsables en el panel de resultados.