AOS Program es el módulo de gestión de programa y agenda del ecosistema AOS Palace. Permite al equipo organizador construir la parrilla de ponencias de un congreso de forma automática o manual, publicarla en el sitio web y gestionar todas las interacciones con los ponentes: confirmación de horario, declaración de indisponibilidades y valoración de sesiones.
Roles del sistema
| Rol | Acciones disponibles |
|---|---|
| Administrador / Secretaría | Configurar jornada, ejecutar auto-programación, gestionar parrilla, resolver peticiones, ver auditoría, editar plantillas de correo. |
| Ponente / Autor | Ver su horario en "Mi Programación", declarar indisponibilidades, ver estado de sus peticiones. |
| Asistente registrado | Ver el programa público, guardar favoritos, valorar sesiones. |
| Componente | Versión mínima | Notas |
|---|---|---|
| WordPress | 6.0 | — |
| PHP | 7.4 | Se recomienda 8.1+ |
| AOS Palace Core | Cualquiera activa | Obligatorio. Sin él el plugin se desactiva automáticamente. |
| AOS Paper | Opcional | Necesario para programar artículos científicos. Sin él, solo se pueden programar Actividades manuales. |
| Edición activa | — | Debe existir una edición activa en AOS Palace con fechas de inicio y fin definidas. |
AOS Program verifica la presencia de AOS Palace Core al cargar. Si no lo detecta, muestra un aviso en el panel de WordPress y no inicializa sus módulos.
- Verifica que AOS Palace Core está activo
Ve a Plugins → Plugins instalados y comprueba que AOS Palace Core aparece activo. Sin él, AOS Program no puede funcionar.
- Sube e instala AOS Program
Ve a Plugins → Añadir nuevo → Subir plugin, selecciona el archivo
.zipde AOS Program y haz clic en Instalar ahora. - Actívalo e introduce la licencia
Activa el plugin. Aparecerá AOS Program en el menú lateral del admin. Ve a AOS Program → Ajustes → Licencia e introduce tu clave de licencia.
- Crea una edición activa en AOS Palace
En AOS Palace → Ediciones, asegúrate de tener una edición publicada y activa con las fechas del congreso correctamente definidas.
- Configura la jornada
Ve a AOS Program → Ajustes → Jornada y define la duración de los slots, el número de salas y los bloques horarios del día.
- Verifica el email de secretaría
En AOS Program → Ajustes → Correos, introduce el email que recibirá las notificaciones de peticiones de ponentes.
Una vez completados estos pasos, ya puedes ejecutar la Programación Automática o empezar a asignar ponencias manualmente desde la Parrilla.
Esta pestaña es el núcleo de la configuración. Aquí defines cómo está organizado cada día del congreso: cuántas ponencias caben en paralelo, cuánto duran y en qué franjas horarias tienen lugar.
| Opción | Descripción | Por defecto |
|---|---|---|
| Duración estándar de ponencia | Minutos asignados a cada paper sin duración específica. | 20 min |
| Número de Salas en Paralelo | Cuántas salas simultáneas hay en el congreso. Mínimo 1. | 1 |
| Nombre de cada sala | Si se dejan en blanco se muestran como "Sala 1", "Sala 2"… | — |
| Estado del Programa | Borrador o Definitivo. Ver sección Estado del Programa. | Borrador |
| Peticiones de Indisponibilidad | Checkbox global para habilitar o deshabilitar el formulario de peticiones. | Desactivado |
| Mostrar Resúmenes | Si está activo, el resumen del artículo se muestra en las tarjetas de la parrilla pública. | Desactivado |
Si configuras 0 salas, tanto la programación automática como la asignación manual devolverán un error. Asegúrate de tener al menos 1 sala.
La estructura de jornada define cómo se divide cada día del congreso en franjas horarias. Se compone de bloques ordenados que el sistema lee de arriba a abajo.
Gestión de bloques
- Añadir bloque: Botón "+ Añadir al final" en la cabecera de la sección.
- Insertar entre bloques: Botón + en cada bloque para insertar uno inmediatamente después.
- Reordenar: Arrastra el icono ☰ de cada bloque para cambiar el orden.
- Eliminar: Botón × en cada bloque. Debe quedar al menos un bloque.
La parrilla pública solo muestra las horas entre el inicio del primer bloque activo y el fin del último, ocultando horas muertas.
Al pasar a estado Definitivo, los autores ya no podrán enviar nuevas peticiones. Puedes volver a Borrador en cualquier momento si necesitas reabrirlas.
Con un solo clic, el sistema toma todos los artículos aprobados (de AOS Paper) no programados aún y los distribuye en los slots disponibles, respetando salas, horarios, disponibilidad de autores e indisponibilidades declaradas.
Cómo ejecutarla
- Ve a AOS Program → Parrilla
La columna "Sin asignar" muestra todos los papers pendientes a la izquierda.
- Haz clic en "Programar Automáticamente"
Puedes elegir si limpiar la parrilla existente o solo completar los huecos libres.
- Revisa el resultado
El sistema muestra cuántos artículos se programaron, cuántos se saltaron y si hubo errores.
- Ajusta manualmente si es necesario
Usa el drag & drop para mover ponencias que no quedaron en el lugar óptimo.
approved y fase final que no tienen slot asignado en la edición activa.pending y conflict_placed. Si el slot cae en una franja declarada como no disponible, lo descarta (pasada 1).Distribución multi-día (v1.12.0+): el motor reparte la carga entre todos los días disponibles cuando no hay restricciones. Si tu congreso dura 3 días y tienes 30 papers, el motor pondrá ~10 por día en lugar de amontonar todos en el día 1. Cuando un autor también es moderador, sus participaciones se agrupan en el mismo día para no obligarle a viajar.
Requisito previo: Debes tener al menos 1 sala configurada y bloques horarios activos definidos. Si falta alguno de estos elementos, la programación automática devuelve un error sin programar nada.
¿Quieres entender el motor en detalle? En la raíz del plugin hay un documento técnico SCHEDULER-LOGIC.md que explica las 4 dimensiones del score, las dos pasadas (limpia y fallback), los casos edge y las limitaciones conocidas. Útil si quieres proponer mejoras o entender por qué un caso concreto se programa de cierta manera.
El sistema PIN permite fijar manualmente un slot de la parrilla para que la programación automática lo respete. Útil cuando un ponente solo puede asistir en una hora concreta, o cuando se ha negociado una actividad con horario inamovible.
Cómo fijar un slot
- Coloca el cursor sobre el slot en la parrilla
Aparecen los botones de acción en la esquina (chincheta y "×").
- Pulsa el botón de chincheta
El slot pasa a fondo amarillo claro con el icono 📌 visible permanentemente. El botón "×" (eliminar) queda deshabilitado.
- Para desfijar
Vuelve a pulsar la chincheta. El fondo amarillo desaparece y el botón eliminar se reactiva.
Qué garantiza un slot fijado
| Acción del admin | Comportamiento sobre el slot fijado |
|---|---|
| Programación Automática (con o sin "Limpiar parrilla antes") | El slot se conserva en su sitio. El motor reserva su rango horario y no programa nada encima. |
| Vaciar parrilla (por defecto) | El slot se conserva. Solo se borra si el admin marca explícitamente "Incluir slots fijados". |
| Botón "×" (eliminar) | Está deshabilitado mientras está fijado. Hay que desfijar primero — evita borrados accidentales. |
| Drag & drop | Se puede mover. El estado pinned se preserva en la nueva celda. |
Caso de uso típico: tienes una conferencia inaugural el primer día a las 9:00 que es inamovible. Asígnala manualmente, fíjala con la chincheta y luego ejecuta la programación automática. El motor distribuirá el resto de papers respetando ese slot.
El botón "Vaciar parrilla" (en la toolbar superior, junto a "Programar Automáticamente") abre un modal con tres opciones independientes para controlar qué quieres borrar.
Opciones del modal
| Opción | Por defecto | Qué hace |
|---|---|---|
| Artículos | ✅ Marcado | Borra todos los slots de tipo paper. |
| Actividades | ✅ Marcado | Borra todos los slots de tipo activity. |
| Incluir slots fijados | ❌ Desmarcado | Si está desmarcado, los slots con chincheta (📌) se conservan. Si está marcado, también se borran. |
Casos de uso típicos
- Empezar de cero (excepto fijados): deja las 3 opciones por defecto (Artículos ✅ Actividades ✅ Pinned ❌). El admin conserva las decisiones manuales irrevocables.
- Limpiar solo papers, dejar actividades: útil cuando el cronograma de actividades está cerrado pero quieres re-organizar las ponencias. Desmarca "Actividades".
- Limpiar solo actividades: a la inversa, si quieres reorganizar los descansos, comidas o eventos sociales sin tocar las ponencias.
- Borrado total (incluyendo fijados): marca las 3 opciones. La acción pide doble confirmación porque destruye el trabajo manual.
Antes de confirmar, el modal muestra los conteos en vivo (cargados via AJAX) para que sepas exactamente cuántos slots vas a eliminar.
La acción no se puede deshacer. Cada vaciado deja registro en Ajustes → Auditoría con los flags usados y el conteo de filas borradas — útil para forensics si algo sale mal.
Diferencia con "Programar Automáticamente → Limpiar parrilla antes": esa checkbox limpia la parrilla justo antes de ejecutar el motor, en una sola acción. "Vaciar parrilla" es independiente — limpias ahora y decides después si ejecutar el motor o asignar manualmente.
La parrilla visual permite mover cualquier elemento de forma manual. Cada movimiento valida automáticamente conflictos de autor e indisponibilidades antes de confirmar el cambio.
| Acción | Cómo hacerlo | Validación |
|---|---|---|
| Asignar desde "Sin asignar" | Arrastra una tarjeta de la columna izquierda a cualquier celda de la parrilla. | Conflicto de autor + indisponibilidad. Si hay colisión, la celda se muestra en rojo y no se confirma el movimiento. |
| Mover entre slots | Arrastra una tarjeta ya asignada a otra celda. | Si hay conflicto de indisponibilidad, el movimiento se permite pero devuelve warning: true con aviso visible. |
| Eliminar de la parrilla | Botón "×" en la tarjeta, o arrastrarla de vuelta a "Sin asignar". | — |
| Tipo | Descripción | Comportamiento |
|---|---|---|
| Conflicto de autor | El mismo autor está programado en dos ponencias simultáneas o solapadas. | Celda en rojo. El movimiento se bloquea. |
| Conflicto autor–moderador (v1.12.0+) | Un usuario aparece como ponente en una sala y como moderador en otra (de sala completa o de item) en horarios solapados. | Bloquea con mensaje claro indicando el nombre, el rol y el horario en conflicto. Aplica en TODAS las rutas: drag&drop manual, asignar moderador de sala, asignar moderador de item. |
| Conflicto de indisponibilidad | Se programa una ponencia en una franja declarada como no disponible por el autor. | Se permite pero devuelve warning: true. Petición pasa a conflict_placed y se notifica al autor. |
Defensa en profundidad (v1.12.0+): el conflicto autor–moderador se valida tanto al programar el paper como al asignar la moderación. Si Alberto está como ponente de un paper en sala 2 a las 10:00 y luego intentas asignarlo como moderador de sala 1 (que tiene un slot a las 10:00), el sistema bloquea con: "Alberto Sanchez ya está programado como ponente en otra sala a las Vie 13/06 10:00."
Para ver un resumen de todos los conflictos actuales, consulta AOS Program → Ajustes → Auditoría, donde se registran todos los eventos tipo request_conflict.
Cuando la parrilla está llena y hay un conflicto que no se puede resolver moviendo a un espacio libre, el sistema puede sugerir intercambios: dos ponencias que pueden intercambiar sus slots sin generar nuevos conflictos.
Condiciones para un swap válido
- Misma duración: Las dos ponencias deben ocupar el mismo número de minutos.
- Autor A libre en slot B y autor B libre en slot A.
- Sin indisponibilidades cruzadas al hacer el intercambio.
AOS Program lee automáticamente los artículos aprobados desde AOS Paper. No es necesario importar ni duplicar datos: el módulo de integración consulta directamente el CPT aos_paper.
| Dato | Origen |
|---|---|
| Título | post_title |
| Resumen / Abstract | post_content |
| Área temática | Taxonomía aos_paper_thematic |
| Autores y coautores | Tabla aos_paper_authors |
| Duración específica | Meta _duration (si no existe, se usa la duración estándar configurada) |
Solo los papers con estado aprobado (aos_paper_status = approved) aparecen en la parrilla de AOS Program.
Puedes añadir al programa cualquier tipo de actividad no-paper: inauguraciones, conferencias plenarias, talleres, coffee breaks, actos de clausura, etc. Se crean como entradas del CPT aos_activity.
- Ve a AOS Program → Actividades → Añadir nueva
O usa el menú de WordPress si tienes acceso directo al CPT.
- Rellena los metadatos
Campos clave:
_duration(minutos),_activity_type(keynote, taller, pausa…),_location_id(sala) y_speakers(IDs de usuarios ponentes). - Publica la actividad
Aparecerá en la columna "Sin asignar" de la parrilla junto con los papers.
Las actividades con is_global = true ocupan visualmente todas las salas a la vez (ej. un coffee break común a todo el congreso).
Estados de una petición
Desde v1.5.0 el admin puede cambiar libremente entre cualquier estado desde la tabla de peticiones, sin restricciones de transición.
La pestaña "Mi Programación" se inyecta automáticamente en el perfil de usuario del shortcode [aos_user_profile] de AOS Palace. No requiere configuración adicional.
También puedes mostrar "Mi Programación" de forma aislada con el shortcode [aos_my_schedule] en cualquier página.
Cualquier usuario registrado puede marcar sesiones como favoritas desde el programa público. Los favoritos se guardan en el meta _aos_fav del usuario y están disponibles en "Mi Programación".
- Pulsar ♡ en el programa añade la sesión a favoritos y el icono pasa a ♥.
- Pulsar ♥ elimina el favorito. El cambio se guarda vía AJAX sin recargar la página.
- Los favoritos cuya sesión aún no está programada aparecen con la etiqueta "Sin programar". Cuando se les asigne un slot, la tarjeta mostrará automáticamente la fecha y hora.
[aos_activity_rating activity_id="123"]
Sustituye 123 por el ID del post de la actividad o paper que quieres valorar.
- Solo usuarios registrados pueden valorar.
- Cada usuario puede modificar su valoración cuantas veces quiera (sistema de upsert).
- El widget muestra la media de valoraciones y el número total de participantes.
- Las valoraciones se guardan en la tabla
aos_prog_ratings.
AOS Program envía emails automáticos en cinco situaciones. El asunto y el cuerpo de cada email son completamente editables desde el panel de administración.
[name][paper_title][start][end][room][site_name][name][paper_title][slots][author_msg][site_name][name][author_email][paper_title][slots][author_msg][site_name][name][paper_title][status][admin_msg][profile_url][site_name][name][paper_title][status][admin_msg][profile_url][site_name]Todos los emails enviados quedan registrados en el meta _aos_email_logs del usuario, visible en la pestaña "Comunicaciones Enviadas" de su ficha CRM en AOS Palace.
El sistema de auditoría registra automáticamente todos los eventos significativos del ciclo de programación. Es de solo lectura y sirve como trazabilidad completa de quién hizo qué y cuándo.
| Evento | Cuándo ocurre |
|---|---|
| slot_assigned | Al asignar un slot (auto o manual) |
| slot_moved | Al mover una ponencia a otro slot |
| slot_deleted | Al eliminar una ponencia de la parrilla |
| auto_scheduled | Al completar la programación automática |
| request_submitted | Al recibir una petición de indisponibilidad |
| request_resolved | Al marcar una petición como resuelta |
| request_conflict | Al detectar conflicto con petición |
| fav_added / fav_removed | Al añadir o eliminar un favorito |
El log muestra los últimos 300 eventos de la edición activa. Los eventos más antiguos están disponibles en la tabla aos_prog_audit_log de la base de datos.
[aos_program] — Parrilla pública del programa
[aos_program]| Atributo | Valores | Descripción |
|---|---|---|
view | full | compact | full: parrilla completa. compact: lista con solo hora y título. |
status | draft | final | Fuerza la visualización de un estado concreto, ignorando el estado configurado. |
[aos_availability_request] — Modal de indisponibilidad
[aos_availability_request item_id="123"][aos_my_schedule] — Mi programación (standalone)
[aos_my_schedule][aos_activity_rating] — Widget de valoración
[aos_activity_rating activity_id="123"]| Estado | Etiqueta en frontend | Comportamiento |
|---|---|---|
| Borrador | "Programa Provisional" | La parrilla es visible pero el usuario sabe que puede cambiar. Favoritos y Mi Programación activos. |
| Definitivo | "Programa Definitivo" | Programa estable. Formularios de indisponibilidad bloqueados. |
Usa [aos_program view="compact"] para mostrar el programa en formato lista, ideal para páginas de resumen o widgets de barra lateral.
| Término | Definición |
|---|---|
| Slot | Unidad de tiempo asignada a una ponencia: combinación de fecha, hora de inicio, hora de fin y sala. |
| Bloque activo | Franja horaria programable dentro de la jornada. Las ponencias solo se asignan aquí. |
| Bloque de exclusión | Franja no programable: comidas, inauguraciones, coffee breaks. El motor auto-programación los salta. |
| Parrilla | Vista de cuadrícula con todos los slots del congreso organizados por día y sala. |
| Paper / Artículo | Comunicación científica enviada y aprobada a través de AOS Paper. |
| Actividad | Evento no-paper (keynote, taller, pausa…) creado directamente como CPT aos_activity. |
| Conflicto de autor | Situación en la que el mismo autor está programado en dos ponencias simultáneas o solapadas. |
| Conflicto autor–moderador | Un usuario aparece como ponente en una sala y como moderador en otra (sala completa o item) en horarios solapados. Bloqueado en todas las rutas desde v1.12.0. |
| Petición de indisponibilidad | Solicitud de un ponente para informar franjas en las que no puede presentar. |
| Swap | Intercambio de slots entre dos ponencias sin generar nuevos conflictos. |
| Slot fijado (Pin) 📌 | Slot marcado con chincheta que la programación automática y la función "Vaciar parrilla" respetan por defecto. Útil para fijar ponencias o actividades inamovibles. |
| Anchor | Cada moderación programada del autor principal de un paper. El motor intenta programar la ponencia adyacente a un anchor del mismo día para agrupar las participaciones. |
| Densidad de día | Conteo de slots ya ocupados por día. El motor lo usa como tercera dimensión del score para repartir la carga entre los días disponibles. |
| Pasada 1 / Pasada 2 | El motor automático intenta primero asignar respetando temática e indisponibilidades (pasada 1). Si no encuentra slot, hace fallback aceptando conflicto de indisponibilidad y marca el slot en naranja (pasada 2). |
| is_global | Flag de actividad que la hace ocupar visualmente todas las salas simultáneamente. |
| AuditLog | Registro automático de todos los eventos de programación. Solo lectura. |
La programación automática no hace nada
Verifica que: (1) tienes al menos 1 sala configurada, (2) hay bloques activos con horario de inicio y fin, (3) las fechas de la edición activa son correctas, (4) existen artículos con estado aprobado en AOS Paper.
El favorito se añade pero no aparece en "Mi Programación"
Este problema fue corregido en v1.4.0. Si persiste, comprueba si hay errores de conexión en la consola del navegador (F12).
El email de secretaría no llega
Ve a Ajustes → Correos y verifica que el campo "Email de Secretaría Técnica" tiene un valor válido. Si está vacío, el sistema usa el admin_email de WordPress.
Los ponentes no ven el botón de indisponibilidad
Tres causas posibles: (1) el checkbox "Peticiones de Indisponibilidad" está desactivado en Ajustes, (2) el programa está en estado Definitivo, o (3) el usuario no está logueado.
Un artículo no aparece en la parrilla aunque está aprobado
AOS Program solo muestra artículos de la edición activa. Comprueba que el artículo fue enviado y vinculado correctamente a la edición activa del congreso. Si la licencia de AOS Program está en modo trial, el número de artículos visibles puede estar limitado.
¿Puedo usar AOS Program sin AOS Paper?
Sí, pero solo podrás programar Actividades manuales (aos_activity). AOS Paper es necesario para gestionar artículos científicos con revisión por pares.
El motor amontona todas las ponencias en el día 1 y deja días vacíos
Este comportamiento se corrigió en v1.12.0 con la distribución multi-día. El motor ahora reparte la carga entre todos los días disponibles según una tercera dimensión de score (densidad de día). Si sigues viendo este patrón en v1.12.0+, comprueba que las fechas de la edición activa cubren los 3 días reales y no solo el primero.
Ejecuté "Vaciar parrilla" y se perdieron mis slots fijados
Por defecto la opción "Incluir slots fijados" está desmarcada — los slots con chincheta (📌) se preservan. Si los perdiste, probablemente activaste esa opción por error. Revisa Ajustes → Auditoría: cada vaciado deja entrada schedule_cleared con los flags exactos que usaste.
El botón "×" para eliminar un slot está deshabilitado
El slot está fijado con chincheta. Es protección contra borrados accidentales. Pulsa primero la chincheta para desfijarlo, luego el botón "×" se reactivará.
No puedo asignar a Alberto como moderador de una sala
Si recibes el mensaje "Alberto ya está programado como ponente en otra sala a las…", significa que Alberto tiene una ponencia en horario solapado con algún slot de la sala que quieres asignarle. Tienes tres opciones: (1) mueve su ponencia a otra hora, (2) elige otra persona para moderar esa sala, o (3) elimina la ponencia en conflicto. El sistema bloquea estos casos desde v1.12.0 para evitar que un usuario esté programado en dos salas simultáneamente.
¿Cómo funciona exactamente el motor automático?
En la raíz del plugin existe el documento SCHEDULER-LOGIC.md con la explicación completa: las 4 dimensiones del score (anchor → proximidad → densidad de día → hora), las dos pasadas (limpia + fallback con conflict), los casos edge y las limitaciones conocidas. Recomendado para entender por qué un caso concreto se programa de cierta manera o para proponer mejoras.