Generador de unidades y clases
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
| Bloque | Campos |
|---|---|
| Rótulo y título | «PLANIFICACIÓN DE LA UNIDAD» / «UNIDAD n» / el título largo con nivel y nombre |
| Tarjeta izquierda | Profesor, Asignatura, Nivel, Validado por (o «Unidad sin validar») |
| Tarjeta derecha | N° Clases, Duración en horas, Inicio, Término |
| Caja 1 | Objetivos 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 2 | Aprendizajes transversales — en la unidad real va vacía |
| Caja 3 | Tipo de evaluación (Formativa / Sumativa…) |
| Caja 4 | Habilidades |
| Caja 5 | Actitudes, con su letra del programa (B, C, D) en la insignia |
1.2 Cada clase
| Bloque | Campos |
|---|---|
| Rótulo y título | «PLANIFICACIÓN DE LA CLASE» / «n. TÍTULO» |
| Tarjeta izquierda | Profesor, Asignatura, Nivel, Unidad |
| Tarjeta derecha | Duración en horas, Inicio + Hora inicio, Término + Hora término, Validado por |
| Actitudes | Las de la clase, con su letra |
| Objetivos de la Clase | Eje, insignia del OA, título de la unidad, texto del OA, INDICADORES DE EVALUACIÓN (prefijo IE-) y las habilidades |
| Inicio / Desarrollo / Cierre | Cada 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:» |
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:
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 01 | Gadget 02 | |
|---|---|---|
| Contenedor | prueba | unidad |
| Ítem | pregunta | clase |
| Categorización | pregunta_atributo, pregunta_indicador | clase_atributo, clase_indicador_adicional |
| Cuerpo del ítem | Enunciado y alternativas | clase_detalle: inicio, desarrollo y cierre |
| Adjuntos | Imágenes y gráficos | clase_recurso |
| Vista central | La hoja impresa | Calendario y hoja impresa |
| Tabla que se arma sola | Especificaciones | Cobertura 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.
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í:
- Deshacer y rehacer (Ctrl+Z / Ctrl+Y), con nombre por paso.
- Borrador automático, la red debajo de Guardar.
- El editor de texto en modal: barra WYSIWYG fija, alineación por fila, viñetas y listas, tablas.
- Imágenes: subir una (con achique automático antes de entrar) o generarla con IA, redimensionarla tirando de una esquina y alinearla.
- Reordenar con el teclado y bajar un CSV que Excel en español abra bien.
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
- El inicio, desarrollo y cierre de cada clase se escriben en el modal, con formato, listas, tablas e imágenes. Son los campos más largos del gadget y los que más se retocan; hasta ahora eran cajas de texto plano.
- Una clase se duplica —la siguiente suele ser la misma estructura con otro contenido—. La copia entra justo debajo, sin fecha y sin validar: una copia con la misma fecha choca con el original en el calendario, y una copia que nace «validada por UTP» es una firma que nadie puso.
- Una clase se elimina, con confirmación, y Ctrl+Z la devuelve.
- La cobertura curricular se descarga como planilla, con una fila por clase. UTP la necesita para sus informes y hasta ahora la rehacía a mano.
- Las clases se reordenan con el teclado. Con un detalle propio de este gadget: como se ordenan por fecha, mover la posición en la lista no se vería —el repintado siguiente las devuelve a su sitio—. Lo que se intercambia es la fecha y la hora con la clase vecina, que es lo que el profesor quiere decir con «esta clase va antes que la otra».
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.
| Tabla | Para qué | Modelo |
|---|---|---|
unidad | Cabecera: colegio, sector (asignatura), curso, usuario, fechaini, fechafin, visible | App\Unit |
clase | La clase: unidad, profesor, fechaini, fechafin, visible | App\Lesson |
clase_detalle | Uno a uno con la clase (idclase). Es dónde deberían vivir inicio, desarrollo y cierre — hay que confirmar sus columnas en la base | App\LessonDetail |
clase_recurso | Recursos y materiales de la clase | App\LessonResource |
clase_atributo / unidad_atributo | Objetivos, habilidades, actitudes y contenidos, vía atributo_tipo | App\LessonAttribute, App\UnitAttribute |
clase_indicador_adicional | Indicadores de evaluación por clase | App\LessonAditionalIndicator |
clase_adicional | Campos extra de la clase | App\LessonAditional |
atributo_tipo | Catálogo de tipos de atributo. AttributeType::attributeList() filtra por los ids [3,4,5,7,9,16] — hay que averiguar qué es cada uno | App\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 documento | Dó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érmino | Si 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. |
| Prerrequisitos | clase_detalle. Hoy sólo aparece en el Inicio. |
| Eje del OA | Del catálogo curricular, no de la clase: el eje se deduce del OA. |
| Actitudes con su letra | atributo_tipo. La letra (B, C, D) es parte del dato, no un correlativo de pantalla. |
| Tipo de evaluación de la unidad | unidad_atributo o columna propia. |
| Materiales próxima clase | clase_detalle o clase_adicional. |
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.
Hay una diferencia estructural con el gadget 01 que conviene tener clara:
- Una pregunta se reutiliza en varias pruebas, a través de
prueba_preguntas. Por eso existe el banco de ítems. - Una clase pertenece a una sola unidad (
clase.unidad), y así se deja.
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
| Rol | Qué hace | Qué le importa |
|---|---|---|
| Profesor de asignatura | Arma 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 UTP | Revisa la planificación y la valida. | La cobertura curricular: qué objetivos del nivel quedan sin tocar. Y qué clases siguen sin validar. |
| Coordinador de departamento | Reparte 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.
| Camino | Qué hace |
|---|---|
| Desde cero | El calendario dibujado y ninguna clase. |
| Desde los objetivos de aprendizaje | Se 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 anterior | Copia 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 IA | Propone la secuencia a partir de los OA y de las horas disponibles. Consume tokens; nace como borrador. |
| Digitalizar una planificación | PDF 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ña | Responde | Quién la usa |
|---|---|---|
| General | ¿Qué se compromete esta unidad? OA por eje, habilidades, actitudes, tipo de evaluación | El 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
- Una fila por semana del período, calculada desde
unidad.fechainiyfechafin. - Cada semana muestra horas usadas / horas disponibles y se pone en rojo cuando se pasa. Es la señal que hoy no existe en ninguna parte: el profesor se entera de que no le alcanzan las horas cuando ya va tarde.
- Las clases se arrastran entre semanas. Al soltar, la fecha se recalcula: se conserva el día de la semana si ya lo tenía; si no, se reparte de lunes en adelante. Nunca cae sábado o domingo.
- Hay una bandeja de «sin fecha» arriba, que aparece sólo si hay alguna. De ahí se arrastran a una semana.
- El título se edita en la propia tarjeta, y las horas con un selector.
- Cada tarjeta lleva sus etiquetas de lo que falta: «sin objetivo», «sin fecha», «sin hora de término», «sin validar», «borrador IA». El borde izquierdo cambia de color según el caso.
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.
- Cada clase empieza en hoja nueva, como en el documento real.
- Dentro de la clase, la unidad indivisible no es la clase entera sino cada pieza: cabecera, actitudes, objetivos, y un bloque por momento. Una clase larga se reparte entre dos hojas cortando entre momentos — que es justo lo que hace la planificación real, donde DESARROLLO suele quedar en la hoja siguiente.
- Ninguna pieza se parte por dentro: nunca queda media caja de actitudes en una hoja y la otra mitad en la siguiente.
- La medición se hace sobre el cuerpo de la hoja ya visible y con la tipografía cargada. Medir con la pestaña oculta da cero y deja todo en una hoja — pasa de verdad, y se arregla repintando al mostrarla.
- En Opciones: tipo de hoja, orientación, márgenes, ver saltos de página, y un interruptor para imprimir sin los momentos — la versión resumida que suele pedir UTP.
- El texto de cada momento y su tiempo en minutos se editan en el lugar, sobre la hoja.
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:
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ón | Qué tiene |
|---|---|
| Objetivos | OA (agrupado por eje y limitado a los de la unidad), indicadores de evaluación del OA elegido, habilidades y actitudes. |
| Momentos | Tiempo, prerrequisitos y texto de inicio, desarrollo y cierre, con botón para redactarlos con IA. |
| Datos y recursos | Fecha, 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.
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).
| Herramienta | Qué hace | Costo de referencia |
|---|---|---|
| Proponer la secuencia de clases | Arma la unidad desde los OA y las horas disponibles | 140 |
| Redactar inicio, desarrollo y cierre | Los tres momentos de una clase | 45 |
| Sugerir indicadores | Los indicadores del OA que calzan con la clase | 25 |
| Redistribuir en el calendario | Reparte respetando las horas semanales | gratis |
«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é falta | Qué pasa |
|---|---|
| La unidad no tiene clases | No deja guardar. |
| Clases sin fecha | No deja guardar. |
| Clases fuera del período | No 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 indicadores | Avisa y guarda igual; queda incompleta. |
| Clases sin validar, o la unidad sin validar | Avisa y guarda igual. |
| Clases generadas por IA sin revisar | Avisa y guarda igual. |
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
- El libro de clases y el registro de lo efectivamente realizado
(
clase_registro/LessonRegistration). Esta pantalla planifica; el registro es otra cosa y ya existe. - El flujo de validación de UTP (solicitar, aprobar, rechazar con observaciones). Acá sólo se muestra y se edita el campo «Validado por».
- La adecuación PIE de cada clase, que tiene su propio módulo y sus propias tablas.
- La biblioteca de recursos: acá se listan y se nombran, pero subirlos y versionarlos es otro módulo.
- El cruce entre la cobertura de la unidad y la tabla de especificaciones de la prueba (§7.5).
- Compartir clases entre profesores: se decidió que se duplican (§3).
11Criterios de aceptación
- Sin período no se puede llegar al editor.
- La portada reproduce el documento real: dos tarjetas de cabecera, las cinco cajas y los OA agrupados por eje con su insignia.
- La caja de actitudes imprime una actitud por línea con su letra, y
en ningún caso la palabra
Array. - Cada clase muestra Hora inicio y Hora término, y cambiar la duración o la hora de inicio recalcula la de término.
- El calendario muestra una fila por semana del período y las fechas correctas.
- Arrastrar una clase a otra semana cambia su fecha, y el cambio se ve en la planificación y en la cobertura.
- Una clase arrastrada nunca queda en sábado o domingo.
- Una semana con más horas de clase que las disponibles se marca.
- 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.
- Cambiar a horizontal repagina y el PDF sale apaisado.
- Apagar «imprimir los momentos» produce la versión resumida, reduce el número de hojas y el PDF lo respeta.
- Destildar un OA en General lo saca de la portada y de la cobertura.
- La cobertura lista los OA y los indicadores sin cubrir, no sólo los cubiertos.
- Al cambiar el OA de una clase, los indicadores quedan vacíos y sólo ofrece los del OA nuevo.
- 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.
- Duplicar una unidad corre todas las fechas al período nuevo y no altera la original.
- 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.
- 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.
- 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.
- Una imagen de 2000 px entra achicada a 1400, y el aviso dice cuánto se achicó y cuánto pesa.
- El generador de imágenes declara su límite antes de generar y rechaza lo que queda fuera sin cobrar tokens.
- Se puede deshacer y rehacer con Ctrl+Z / Ctrl+Y, y el aviso dice qué se deshizo.
- Una clase se duplica —la copia entra justo debajo, sin fecha y sin validar— y se elimina con confirmación; ambas se deshacen.
- El borrador se guarda solo y se ofrece al volver, con su fecha y su número de clases.
- 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—.
- 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
- 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. - 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. - Dónde se imprime
Arrayen la plantilla de la clase: es un soloechoy arregla todas las páginas. - Qué son los tipos de atributo
[3,4,5,7,9,16]que filtraAttributeType::attributeList(). Deberían estar ahí el OA, la habilidad y la actitud. - De dónde sale la letra de la actitud (
B,C,D): si está en el catálogo o se arma en la vista. - Cómo se relacionan
sectory asignatura, y siunidad.cursonulo significa «todos los cursos del nivel» — el código deUnit::getPlanUnitsBySchoolAndSectorlo sugiere, porque trata el caso-1conwhereNull('unidad.curso'). - 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.
- Si el año escolar se filtra por
year(from_unixtime(fechaini)), como hace hoyUnit: eso significa que las fechas se guardan como timestamp Unix, no comodate. Conviene confirmarlo antes de escribir cualquier consulta. - 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.
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.