Calendario
El módulo de Calendario es el registro central de GCM de cuándo pasan las cosas. Cubre eventos únicos (un concierto de Navidad, un retiro de líderes), servicios semanales recurrentes, cumpleaños de miembros jalados del directorio y las plantillas de reunión que impulsan cada lista de asistencia.

Eventos vs reuniones
Estos dos conceptos a menudo se confunden porque ambos aparecen en la cuadrícula del calendario. Se almacenan por separado y cumplen funciones diferentes:
| Evento | Reunión | |
|---|---|---|
| Dónde vive | Tabla events | Tabla meetings |
| Propósito | Una ocurrencia específica (fecha + hora + lugar) | Una plantilla recurrente que impulsa asistencia (ej. "Servicio Dominical") |
| Configurado en | Calendario → Agregar evento | Configuración → Reuniones |
| Recurrencia | RRULE en el evento mismo | Implícita — cada vez que marcas asistencia, eliges una reunión |
| Alcance | Filtro opcional de unidad org | scope_level requerido (org / sede / centro / célula) |
Una regla útil: si tiene un volante publicado, es un evento. Si es "lo que hacemos cada domingo a las 10am", es una reunión.
Ve Reuniones y niveles de alcance para el modelo de reunión, Crear un evento para eventos únicos.
Lo que muestra el calendario
La cuadrícula del mes superpone tres capas:
- Eventos — puntos codificados por color, con tarjeta de vista previa al pasar el cursor.
- Cumpleaños — un ícono de pastel, jalado en vivo del directorio de miembros.
- Expansiones recurrentes — un solo evento semanal se renderiza como 4 o 5 puntos en un mes, calculado en el navegador desde la cadena RRULE.
El panel del día a la derecha lista todo lo que pasa en la fecha seleccionada. La pestaña Próximos alterna a una lista cronológica de los próximos veinte eventos desde hoy en adelante.
Ve Vistas del calendario y detalle del día para los patrones de navegación.
Cómo funciona la recurrencia
GCM almacena recurrencia usando el estándar iCalendar RRULE (RFC 5545). Cuando eliges "Semanal en Lun, Mié, Vie hasta 31 Dic" en el formulario de evento, eso se guarda como:
FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20261231T235959ZDos campos adicionales cubren las brechas:
exception_dates— un array de cadenas de fechas a omitir (ej. cancelar un domingo específico).recurrence_end_date— una columna de fecha-fin redundante para filtrado SQL rápido.
Por compatibilidad hacia atrás también hay una columna heredada recurrence_rule que acepta weekly / monthly / yearly. Los eventos nuevos siempre escriben ambos — la RRULE es autoritativa.
Ve Patrones recurrentes y RRULE para la especificación completa del selector.
Excepciones
El array exception_dates maneja el caso simple ("solo omitir esta fecha"). Para anulaciones más ricas — cambiar el título por una ocurrencia, mover hora de inicio por una hora, cancelar solo esta fecha — hay una tabla event_exceptions:
event_exceptions(
event_id, exception_date,
is_cancelled, override_title,
override_start_time, override_end_time,
override_location
)Esto te permite convertir un Servicio Dominical regular en un "Servicio de Nochebuena" sin bifurcar todo el evento recurrente. Ve Excepciones de eventos.
Recordatorios
Cada org tiene una fila event_reminder_config que controla cuándo y cómo salen los recordatorios. Los offsets se almacenan como horas-antes, así que [24, 1] significa "24 horas antes y una hora antes." Los canales se eligen por slug — email, sms, whatsapp, push — y se rastrean por-ocurrencia en event_reminders_sent para prevenir doble-envío de eventos recurrentes.
Alcance y sedes
Los eventos pueden filtrarse a una sola unidad organizacional (sede, centro, célula) vía org_unit_id. Un valor nulo significa todas las sedes lo ven — útil para anuncios de toda la org como Navidad.
El filtro de sede en la barra de herramientas del calendario aplica un SQL OR org_unit_id IS NULL para que los eventos globales sigan visibles mientras los específicos de sede tienen su alcance limitado. Los usuarios cuyo rol no abarca todas las sedes solo ven las opciones del menú desplegable a las que están asignados.
Permisos
| Acción | Admin | Pastor | Líder | Miembro |
|---|---|---|---|---|
| Ver calendario | sí | sí | sí | sí |
| Crear evento | sí | sí | sí | no |
| Editar evento | sí | sí | la propia unidad org | no |
| Eliminar evento | sí | sí | la propia unidad org | no |
| Configurar reuniones | sí | sí | no | no |
| Configurar recordatorios | sí | no | no | no |
Las claves de permisos son events.view, events.create, events.edit, events.delete. Los miembros siempre pueden ver el calendario pero no pueden agregar a él a menos que se les otorgue explícitamente events.create.
Próximos pasos
- Crear un evento — tu primera fecha única.
- Reuniones y niveles de alcance — configura el Servicio Dominical.
- Patrones recurrentes y RRULE — más allá del simple semanal.
- Excepciones de eventos — cuando una ocurrencia difiere.
- Recordatorios de eventos — empujones automatizados por correo / SMS / WhatsApp.
- Vistas del calendario y detalle del día — cuadrícula del mes vs lista próxima.
- Vinculando eventos a asistencia — cómo el calendario alimenta la estación de check-in.
