Skip to content

Asignación masiva de jurados por categoría (área)#7

Merged
eddndev merged 3 commits into
mainfrom
feat/asignacion-masiva-categoria
Jun 19, 2026
Merged

Asignación masiva de jurados por categoría (área)#7
eddndev merged 3 commits into
mainfrom
feat/asignacion-masiva-categoria

Conversation

@eddndev

@eddndev eddndev commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Resuelve "demasiados jurados por prototipo / asignar por área": como las áreas = las 7 categorías, se añade asignación en bloque por categoría. Construido sobre main (incluye PR #5 de Robert). No requiere migración ni entidad nueva.

Qué hace

Un admin elige categoría + rúbrica + varios jurados y todos quedan asignados a todos los prototipos de esa categoría en la edición de la rúbrica. Reusa la tabla assignments y el pipeline verificado de evaluación + promedio (N jurados por prototipo).

Backend — POST /admin/assignments/bulk

  • Body { categoria_id, template_id, jurado_ids[] }. Deriva la edición del template.
  • Inserta el producto (jurado × prototipo) en una sola sentencia CTE (cuenta e inserta en el mismo snapshot), idempotente (ON CONFLICT DO NOTHING).
  • Valida: jurado_ids no vacío, todos rol jurado, categoría y template existentes → 422. Sólo admin → 403.
  • Devuelve { created, skipped, prototipos, jurados }.
  • Tests: +8 en admin_assignments.rs (16 verdes): caso normal, idempotente, solape parcial (created=3/skipped=1), no-jurado, vacío, categoría y template desconocidos, 403. OpenAPI regenerado.

Mobile

  • Botón "Asignar jurados por categoría" en el panel de Asignaciones → hoja con selección de edición/categoría/rúbrica + jurados (multi-select, buscar, seleccionar todos).
  • Tras asignar invalida cachés (capturando el ProviderContainer antes del await, robusto si el widget se desmonta) y muestra el resumen.
  • flutter analyze limpio · build APK verde.

Calidad

Revisión adversarial multi-agente (4 lentes × verificación independiente): 20 hallazgos → 6 confirmados → todos aplicados (el único fix-now era la invalidación post-await sin guard).

⚠️ Merge a main despliega el API a prod (endpoint aditivo, no cambia comportamiento existente). La UI llega en el siguiente build de la app.

https://claude.ai/code/session_019ZSsKMAxiM8DENEBf36oWv

…oría/área

Asigna un conjunto de jurados a TODOS los prototipos de una categoría dentro de
la edición del template, en un solo INSERT idempotente (ON CONFLICT DO NOTHING).
Es la forma práctica de cubrir el "área" de la exhibición sin asignar uno por
uno. Reusa la tabla assignments y todo el pipeline verificado de evaluación +
promedio. Valida: jurado_ids no vacío, todos rol jurado, categoría y template
existentes (422). Devuelve {created, skipped, prototipos, jurados}.

Tests: +6 en admin_assignments.rs (14 verdes). openapi.json regenerado.
Claude-Session: https://claude.ai/code/session_019ZSsKMAxiM8DENEBf36oWv
Nuevo botón "Asignar jurados por categoría" en el panel de Asignaciones que abre
una hoja (BulkAssignSheet): elige edición + categoría + rúbrica + varios jurados
(multi-select con buscar/seleccionar todos) y llama POST /admin/assignments/bulk.
Tras asignar, invalida las cachés por prototipo y el listado, y muestra el
resumen (creadas / ya existían / jurados × prototipos). Reusa los providers
existentes (ediciones, categoriasCatalog, activeJurados, templatesByEdition).

analyze limpio.
Claude-Session: https://claude.ai/code/session_019ZSsKMAxiM8DENEBf36oWv
- API: cuenta prototipos + inserta en UNA sentencia (CTE protos/ins) → mismo
  snapshot, sin carrera entre contar e insertar; conteos created/skipped exactos.
- API tests: +partial_overlap (created=3, skipped=1) y +unknown_template (422).
  16 verdes.
- Mobile: captura el ProviderContainer ANTES del await → la invalidación de
  cachés no lanza si el widget se desmonta en vuelo (fix-now). Guard de lista
  vacía en el selector de ediciones. Comentario en editionId (UI-only).

cargo test admin_assignments 16/16 · flutter analyze limpio.
Claude-Session: https://claude.ai/code/session_019ZSsKMAxiM8DENEBf36oWv
@eddndev
eddndev merged commit b141469 into main Jun 19, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants