User request — especificación para desarrollo ← Todos los gadgets Ver la maqueta
Gadget 02 · User request

Generador de unidades y clases

wc-laravel · módulo planificacion Laravel 5.7 / PHP 7.1 Profesor · UTP Borrador para revisión 2026-09-11

Armar una unidad viendo las dos cosas que importan a la vez: cómo se reparten las clases en las semanas del período, y cómo queda —exactamente— la planificación que WebClass ya imprime hoy. Con arrastre entre semanas, categorización por objetivo e indicador, y cobertura curricular que muestra qué quedó fuera.

1El formato impreso no se inventó

Este gadget no propone un documento nuevo. La pantalla reproduce el formato de planificación que WebClass ya genera —documento de referencia: la unidad «SEGUNDO BÁSICO - UNIDAD 1: Números del 0 al 100; contar y comparar», 30 clases, prof. yanett mayorga— con sus cajas de pestaña naranja, sus insignias redondas de OA y actitud, y sus recursos adjuntos en amarillo.

Es deliberado: si el editor mostrara otra cosa, el profesor no reconocería su propia planificación y habría que convencer a UTP de aceptar un formato distinto. Lo que cambia no es el documento; es que ahora se edita viéndolo.

1.1 La portada de la unidad

BloqueCampos
Rótulo y título«PLANIFICACIÓN DE LA UNIDAD» / «UNIDAD n» / el título largo con nivel y nombre
Tarjeta izquierdaProfesor, Asignatura, Nivel, Validado por (o «Unidad sin validar»)
Tarjeta derechaN° Clases, Duración en horas, Inicio, Término
Caja 1Objetivos de aprendizaje, agrupados por eje: «2° BÁSICO - NÚMEROS Y OPERACIONES», «2° BÁSICO - MEDICIÓN»… cada OA con su insignia (OA1, OA17)
Caja 2Aprendizajes transversales — en la unidad real va vacía
Caja 3Tipo de evaluación (Formativa / Sumativa…)
Caja 4Habilidades
Caja 5Actitudes, con su letra del programa (B, C, D) en la insignia

1.2 Cada clase

BloqueCampos
Rótulo y título«PLANIFICACIÓN DE LA CLASE» / «n. TÍTULO»
Tarjeta izquierdaProfesor, Asignatura, Nivel, Unidad
Tarjeta derechaDuración en horas, Inicio + Hora inicio, Término + Hora término, Validado por
ActitudesLas de la clase, con su letra
Objetivos de la ClaseEje, insignia del OA, título de la unidad, texto del OA, INDICADORES DE EVALUACIÓN (prefijo IE-) y las habilidades
Inicio / Desarrollo / CierreCada uno con su Tiempo en minutos, el texto narrativo y sus recursos adjuntos. El Inicio lleva además Prerrequisitos
Pie eventual«MATERIALES PRÓXIMA CLASE:»
Dos defectos del documento actual, que hay que arreglar de paso

Los dos salen en el PDF de producción de la unidad de referencia:

1. La caja ACTITUDES de cada clase imprime la palabra Array. Aparece en todas las páginas de clase. Es el síntoma clásico de un echo sobre un array de PHP en vez de recorrerlo:

👤 ACTITUDES
Array

Donde debería decir, una por línea y con su insignia: C — Manifestar curiosidad e interés por el aprendizaje de las matemáticas. El profesor hoy no ve las actitudes que declaró.

2. «Hora Término: 00:00» en casi todas las clases. La hora de inicio viene bien (08:00) y la de término queda en cero, es decir nunca se calculó ni se pidió. Una clase con hora de término 00:00 no cuadra con el horario ni con el libro de clases.

En la maqueta la clase 1 reproduce el defecto a propósito, sale en rojo y bloquea el guardado hasta corregirla. Ver §9.

2Es el gadget 01, con otro par de tablas

La estructura es deliberadamente la misma que la del generador de evaluaciones, porque el producto es el mismo y el usuario también:

Gadget 01Gadget 02
Contenedorpruebaunidad
Ítempreguntaclase
Categorizaciónpregunta_atributo, pregunta_indicadorclase_atributo, clase_indicador_adicional
Cuerpo del ítemEnunciado y alternativasclase_detalle: inicio, desarrollo y cierre
AdjuntosImágenes y gráficosclase_recurso
Vista centralLa hoja impresaCalendario y hoja impresa
Tabla que se arma solaEspecificacionesCobertura curricular

Se reusa todo lo que ya se resolvió ahí: paginación real, arrastre entre contenedores, carriles de metadatos, cajones, tokens de IA, y la regla de guardar bloqueado cuando falta algo sin lo cual el artefacto no sirve. Conviene leer esa solicitud antes que esta.

La maquinaria de edición es un solo componente, no uno por pantalla

Esto no es una figura retórica: en la maqueta está literalmente en un archivo compartido, assets/editor.js y assets/editor.css, que los dos gadgets cargan. Lo que vive ahí:

Por qué importa para el desarrollador. Cada una de esas piezas tiene trampas que ya costó encontrar una vez —que Chrome desarma el <div> envolvente de una imagen al insertarla, que queryCommandState devuelve la alineación anterior, que el borrador hay que leerlo antes del primer repintado, que borrar el borrador tiene que cancelar la escritura en cola—. Implementarlas dos veces es encontrarlas dos veces. El detalle de cada una está en la solicitud del gadget 01, §6.2 y §7.c.

2.b Lo que el gadget 02 gana con eso

3Lo que ya existe en la base

Relevado el 2026-09-11 leyendo los modelos Eloquent de wc-laravel/app/. Las tablas ya están todas.

TablaPara quéModelo
unidadCabecera: colegio, sector (asignatura), curso, usuario, fechaini, fechafin, visibleApp\Unit
claseLa clase: unidad, profesor, fechaini, fechafin, visibleApp\Lesson
clase_detalleUno a uno con la clase (idclase). Es dónde deberían vivir inicio, desarrollo y cierre — hay que confirmar sus columnas en la baseApp\LessonDetail
clase_recursoRecursos y materiales de la claseApp\LessonResource
clase_atributo / unidad_atributoObjetivos, habilidades, actitudes y contenidos, vía atributo_tipoApp\LessonAttribute, App\UnitAttribute
clase_indicador_adicionalIndicadores de evaluación por claseApp\LessonAditionalIndicator
clase_adicionalCampos extra de la claseApp\LessonAditional
atributo_tipoCatálogo de tipos de atributo. AttributeType::attributeList() filtra por los ids [3,4,5,7,9,16] — hay que averiguar qué es cada unoApp\AttributeType

3.1 Lo que el formato impreso exige y hay que ubicar

El documento real muestra campos que la pantalla tiene que poder leer y escribir. Antes de programar hay que decidir dónde vive cada uno:

Campo del documentoDónde debería estar
Validado por (unidad y clase)Probablemente clase_adicional / columna en unidad. Es el estado que UTP cambia al autorizar: hay que saber si es texto libre o un usuario.
Hora inicio y Hora términoSi clase.fechaini es timestamp Unix, la hora ya cabe ahí. Eso explicaría el 00:00: se guarda la fecha a medianoche y nadie escribe la hora.
Tiempo de cada momento (min)clase_detalle, una columna por momento.
Prerrequisitosclase_detalle. Hoy sólo aparece en el Inicio.
Eje del OADel catálogo curricular, no de la clase: el eje se deduce del OA.
Actitudes con su letraatributo_tipo. La letra (B, C, D) es parte del dato, no un correlativo de pantalla.
Tipo de evaluación de la unidadunidad_atributo o columna propia.
Materiales próxima claseclase_detalle o clase_adicional.
Conclusión: no hay tablas nuevas

Igual que en el gadget 01, la estructura está y lo que falta es la pantalla. A lo sumo faltan columnas en clase_detalle (tiempos, prerrequisitos) y la hora de término. Lo único realmente nuevo sería el consumo de tokens de IA, y esa tabla ya se especificó en el gadget 01: es la misma bolsa.

Decidido con el negocio: una clase, una unidad

Hay una diferencia estructural con el gadget 01 que conviene tener clara:

Se evaluó cambiarlo y se decidió que no. Reusar una clase es duplicarla: el camino «Duplicar una unidad anterior» copia las clases y corre las fechas. Editar la copia no toca el original, y eso es lo esperado cuando un profesor toma la unidad del año pasado.

Consecuencia práctica: no hay «banco de clases» equivalente al banco de ítems, y no hace falta migrar datos.

4Quién lo usa

RolQué haceQué le importa
Profesor de asignaturaArma la unidad y la va ajustando durante el semestre.Que las clases quepan en las semanas que tiene, y no tener que escribir dos veces lo mismo.
Jefe de UTPRevisa la planificación y la valida.La cobertura curricular: qué objetivos del nivel quedan sin tocar. Y qué clases siguen sin validar.
Coordinador de departamentoReparte unidades entre los profesores del nivel.Poder duplicar una unidad para otro curso sin rehacerla.

5Dónde vive

En el módulo que ya existe: resources/views/planificacion/, con App\Http\Controllers\Planificacion\PlanificacionController y UnitController. Las vistas actuales montan Vue 2 en un <div id="app"> con componentes en resources/js/components/planificacion/ — o sea que el terreno para una pantalla Vue ya está preparado, a diferencia del gadget 01.

resources/views/planificacion/
├── unidad-editor.blade.php          la pantalla nueva
resources/js/components/planificacion/
├── Calendario.vue                   semanas + arrastre
├── Planificacion.vue                la hoja paginada
├── Cobertura.vue                    la tabla que se arma sola
└── CajonClase.vue                   objetivos, momentos, datos y recursos

Ya existe la entrada .js('resources/js/planificacion.js', 'public/js') en webpack.mix.js: no hay que agregar ninguna.

6Pantalla 1 — Crear la unidad

Arriba el contexto: nivel, asignatura, curso, período (desde / hasta) y horas semanales. El período es obligatorio — sin él no hay calendario que dibujar — y las horas semanales son lo que después permite avisar que una semana está sobrecargada.

CaminoQué hace
Desde ceroEl calendario dibujado y ninguna clase.
Desde los objetivos de aprendizajeSe eligen los OA del nivel y se crea una clase por indicador de evaluación, ya categorizada y repartida. Es el camino que deja la cobertura cuadrada desde el principio.
Duplicar una unidad anteriorCopia las clases y corre las fechas al período nuevo. Es el reemplazo del banco de ítems, dado que las clases no se comparten.
Con ayuda de la IAPropone la secuencia a partir de los OA y de las horas disponibles. Consume tokens; nace como borrador.
Digitalizar una planificaciónPDF o foto de una planificación en papel, con recorte por clase. Mismo mecanismo del gadget 01.

7Pantalla 2 — El editor

7.1 Cuatro pestañas, porque son cuatro preguntas distintas

PestañaRespondeQuién la usa
General¿Qué se compromete esta unidad? OA por eje, habilidades, actitudes, tipo de evaluaciónEl profesor, al empezar
Calendario¿Cabe la unidad en el tiempo que tengo?El profesor, mientras planifica
Planificación¿Cómo queda el documento que entrego?UTP, al revisar
Cobertura¿Qué objetivos e indicadores no toca nadie?UTP, al validar

Las cuatro son la misma data. Mover una clase en el calendario cambia su lugar en la planificación; destildar un OA en General lo saca de la portada y de la cobertura; editar un momento sobre la hoja se guarda al instante. No son cuatro documentos.

7.2 El calendario

7.3 La planificación impresa

Igual que la hoja del gadget 01: hojas de verdad, paginadas, cada una a escala real con su número al pie, y el mismo corte que tendrá el PDF.

Cómo se pagina, exactamente

7.4 Cobertura curricular

La tabla se arma sola con lo categorizado, igual que la de especificaciones. Pero con una diferencia que es el punto entero de la pestaña:

Lo que importa es lo que falta

Además de los OA cubiertos, la tabla lista —marcados con ○— los objetivos comprometidos que no toca ninguna clase y, un nivel más abajo, los indicadores de cada OA que quedaron sin trabajar. Una tabla que sólo muestra lo que sí se hizo siempre se ve completa.

El desglose por indicador es lo que distingue «cubrí el OA1» de «cubrí uno de los cuatro indicadores del OA1», que es la diferencia que a UTP le importa.

El texto lo dice explícitamente: que un indicador quede fuera puede estar bien —se cubre en otra unidad— pero tiene que ser una decisión y no un olvido.

7.5 El cajón de la clase

SecciónQué tiene
ObjetivosOA (agrupado por eje y limitado a los de la unidad), indicadores de evaluación del OA elegido, habilidades y actitudes.
MomentosTiempo, prerrequisitos y texto de inicio, desarrollo y cierre, con botón para redactarlos con IA.
Datos y recursosFecha, hora de inicio, hora de término, duración, validado por, materiales para la próxima clase, y los recursos adjuntos por momento.

Cambiar el OA vacía los indicadores y vuelve a ofrecer sólo los del OA nuevo: dejar los viejos sería peor que no tener ninguno. Cambiar la duración o la hora de inicio recalcula la hora de término, que es la raíz del defecto del §1.

El puente con el gadget 01

Una clase puede ser de tipo evaluación y quedar enlazada a una prueba del generador de evaluaciones. Ese enlace es lo que permite, más adelante, responder preguntas que hoy nadie puede responder: ¿la prueba mide los objetivos que efectivamente se pasaron en clases? — cruzando la cobertura de la unidad con la tabla de especificaciones de la prueba.

No está en el alcance de este gadget, pero el enlace hay que dejarlo guardado desde el principio; agregarlo después obliga a revisar unidad por unidad.

8Herramientas de IA

Misma bolsa de tokens del gadget 01, mismas reglas (costo visible antes de gastar, consumo auditado por usuario, todo lo generado nace como borrador).

HerramientaQué haceCosto de referencia
Proponer la secuencia de clasesArma la unidad desde los OA y las horas disponibles140
Redactar inicio, desarrollo y cierreLos tres momentos de una clase45
Sugerir indicadoresLos indicadores del OA que calzan con la clase25
Redistribuir en el calendarioReparte respetando las horas semanalesgratis

«Redistribuir» no usa IA — es un reparto aritmético por horas. Va en el cajón por comodidad, pero no cobra y lo dice: cobrar tokens por algo que es un bucle es el tipo de cosa que erosiona la confianza en el resto.

9Guardar y descargar

Mismo patrón del gadget 01, con dos niveles:

Qué faltaQué pasa
La unidad no tiene clasesNo deja guardar.
Clases sin fechaNo deja guardar.
Clases fuera del períodoNo deja guardar.
Clases sin hora de término válida (falta, o es ≤ la de inicio: el 00:00 del §1)No deja guardar.
Clases sin OA o sin indicadoresAvisa y guarda igual; queda incompleta.
Clases sin validar, o la unidad sin validarAvisa y guarda igual.
Clases generadas por IA sin revisarAvisa y guarda igual.
Por qué la fecha y la hora bloquean

Una clase sin fecha, fuera del período o con hora de término 00:00 no llega al libro de clases ni cuadra con el horario. La planificación quedaría incompleta sin que nadie se entere, que es exactamente el caso que hay que impedir — y que hoy está ocurriendo en producción.

Igual que en el gadget 01, el aviso dice cuáles son por número y tiene un botón «Ir a la primera» que abre el calendario y la resalta. Y cada clase lleva su etiqueta en la tarjeta desde antes.

Validar no bloquea: es acto de UTP, no del profesor, y bloquear ahí dejaría al profesor sin poder guardar su propio trabajo.

Descargar exige estar guardado, con la misma lógica y el mismo «Guardar y descargar» en un paso. Formatos: PDF de la unidad, PDF de una clase, Word editable y planilla de cobertura.

10Fuera de alcance

11Criterios de aceptación

  1. Sin período no se puede llegar al editor.
  2. La portada reproduce el documento real: dos tarjetas de cabecera, las cinco cajas y los OA agrupados por eje con su insignia.
  3. La caja de actitudes imprime una actitud por línea con su letra, y en ningún caso la palabra Array.
  4. Cada clase muestra Hora inicio y Hora término, y cambiar la duración o la hora de inicio recalcula la de término.
  5. El calendario muestra una fila por semana del período y las fechas correctas.
  6. Arrastrar una clase a otra semana cambia su fecha, y el cambio se ve en la planificación y en la cobertura.
  7. Una clase arrastrada nunca queda en sábado o domingo.
  8. Una semana con más horas de clase que las disponibles se marca.
  9. El número de hojas de la planificación es igual al del PDF, cada clase empieza en hoja nueva y ninguna pieza se parte entre páginas.
  10. Cambiar a horizontal repagina y el PDF sale apaisado.
  11. Apagar «imprimir los momentos» produce la versión resumida, reduce el número de hojas y el PDF lo respeta.
  12. Destildar un OA en General lo saca de la portada y de la cobertura.
  13. La cobertura lista los OA y los indicadores sin cubrir, no sólo los cubiertos.
  14. Al cambiar el OA de una clase, los indicadores quedan vacíos y sólo ofrece los del OA nuevo.
  15. Guardar con una clase sin fecha, fuera del período o sin hora de término se bloquea, dice cuál es y lleva hasta ella.
  16. Duplicar una unidad corre todas las fechas al período nuevo y no altera la original.
  17. El inicio, desarrollo y cierre de una clase se escriben en un modal con la barra de formato fija arriba, y aceptan negrita, listas, tablas e imágenes.
  18. Los cuatro botones de alineación actúan sobre la fila del cursor, y una imagen se alinea y se mueve de verdad dentro de su fila.
  19. Una imagen se sube o se genera con IA, se redimensiona tirando de una esquina manteniendo la proporción, y el HTML guardado no contiene ni el marco ni los tiradores.
  20. Una imagen de 2000 px entra achicada a 1400, y el aviso dice cuánto se achicó y cuánto pesa.
  21. El generador de imágenes declara su límite antes de generar y rechaza lo que queda fuera sin cobrar tokens.
  22. Se puede deshacer y rehacer con Ctrl+Z / Ctrl+Y, y el aviso dice qué se deshizo.
  23. Una clase se duplica —la copia entra justo debajo, sin fecha y sin validar— y se elimina con confirmación; ambas se deshacen.
  24. El borrador se guarda solo y se ofrece al volver, con su fecha y su número de clases.
  25. Las clases se reordenan con el teclado desde su asa, intercambiando la fecha con la vecina —mover la posición sin tocar la fecha no se vería, porque el calendario ordena por fecha—.
  26. La cobertura curricular se descarga como planilla, con una fila por clase, y se abre en Excel en español sin quedar toda en una columna.

12Qué hay que confirmar antes de programar

  1. Las columnas de clase_detalle, leyendo la base: es dónde van inicio, desarrollo y cierre, y de eso depende si hay que agregar los tiempos y los prerrequisitos.
  2. Dónde se guarda la hora de inicio y término, y por qué la de término queda en 00:00. Es el defecto del §1 y hay que ver si el arreglo es de datos, de formulario o de ambos.
  3. Dónde se imprime Array en la plantilla de la clase: es un solo echo y arregla todas las páginas.
  4. Qué son los tipos de atributo [3,4,5,7,9,16] que filtra AttributeType::attributeList(). Deberían estar ahí el OA, la habilidad y la actitud.
  5. De dónde sale la letra de la actitud (B, C, D): si está en el catálogo o se arma en la vista.
  6. Cómo se relacionan sector y asignatura, y si unidad.curso nulo significa «todos los cursos del nivel» — el código de Unit::getPlanUnitsBySchoolAndSector lo sugiere, porque trata el caso -1 con whereNull('unidad.curso').
  7. De dónde salen las horas semanales de la asignatura por curso: si están en el horario del establecimiento, no hay que pedirlas a mano — y de paso sale la hora de inicio real de cada bloque.
  8. Si el año escolar se filtra por year(from_unixtime(fechaini)), como hace hoy Unit: eso significa que las fechas se guardan como timestamp Unix, no como date. Conviene confirmarlo antes de escribir cualquier consulta.
  9. Qué es exactamente «Validado por»: texto libre, nombre de usuario o estado con flujo. En el documento real conviven «Currículum WebClass» y el nombre de una persona.
Sobre la maqueta

HTML autónomo, sin build ni CDN, y no guarda nada. Los datos de ejemplo son la unidad real de 2° Básico citada en el §1 —con sus recursos, sus prerrequisitos y sus tiempos— para que la discusión sea sobre el comportamiento y no sobre si el contenido es verosímil.

Hereda el CSS del gadget 01 a propósito, para que los dos se vean como el mismo producto; en el desarrollo real eso sería un archivo de estilos compartido del módulo.

Está escrita en JavaScript plano. El producto usa Vue 2, y en este módulo eso ya está montado: las vistas de planificacion son un div#app con componentes propios, así que acá no hay que introducir nada nuevo.

← Todos los gadgets