Patrones recurrentes y RRULE
La mayoría de las cosas que pones en el calendario pasan más de una vez. Una reunión semanal de jóvenes, un almuerzo mensual de líderes, un domingo anual de bautismos — GCM los maneja todos a través de un selector en el formulario de evento, respaldado por el estándar iCalendar RRULE (RFC 5545).
El selector de recurrencia aparece cuando cambias el menú desplegable de Frecuencia de Ninguna.

Qué se almacena
Cuando guardas un evento recurrente, GCM escribe tres columnas en la fila de events:
rrule_string— la cadena de recurrencia autoritativa, comoFREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20261231T235959Z.recurrence_rule— un código corto heredado (weekly,monthly,yearly) mantenido para compatibilidad hacia atrás con consultas más viejas.recurrence_end_date— una columnadateredundante que refleja el valorUNTIL, usada para filtrado SQL rápido.
El navegador parsea rrule_string y expande las ocurrencias directamente en la vista de calendario — no hay un cron en el servidor llenando una tabla de fechas. Eso mantiene la base de datos pequeña (una fila por serie, no una fila por domingo) y significa que las ediciones a la regla se propagan instantáneamente a cada fecha futura.
Opciones de frecuencia
El selector ofrece cinco opciones:
Diaria
FREQ=DAILY. Úsalo con moderación — los eventos diarios llenan rápidamente el calendario. El caso común es una campaña a corto plazo: Oración matutina diaria durante Cuaresma. Acompáñalo con una fecha de fin para que termine en Pascua.
Semanal
FREQ=WEEKLY más una lista BYDAY opcional. Las casillas de día te permiten elegir múltiples días de la semana a la vez: un grupo de oración de lunes/miércoles/viernes es un evento con BYDAY=MO,WE,FR, no tres eventos separados.
Si dejas vacías las casillas de día, GCM repite en el mismo día de la semana que la fecha de inicio. Así un evento que empieza un martes sin BYDAY seleccionado se vuelve "cada martes."
Quincenal
FREQ=WEEKLY;INTERVAL=2. Mismo selector que semanal, pero el evento omite cada otra semana. Común para células que se reúnen en domingos alternos, o para reuniones de personal con un ritmo quincenal.
Mensual
FREQ=MONTHLY con elección de dos modos:
- Día del mes (
BYMONTHDAY=15) — el 15 de cada mes, sin importar el día de la semana. Toma el número de día de tu fecha de inicio. - Día-de-semana enésimo (
BYDAY=3SU) — el 3er domingo de cada mes. Útil para reuniones de líderes o servicios de unción que siguen un patrón de domingo en lugar de una fecha de calendario.
El selector muestra ambas opciones como botones de radio. Elige día del mes para eventos de estilo financiero ("el 1ro de cada mes"); elige día-de-semana enésimo para eventos de estilo servicio ("primer domingo del mes").
Anual
FREQ=YEARLY. La misma fecha de calendario una vez al año — aniversarios, servicios del día de fundación, conferencias anuales. GCM deriva el mes y el día de la fecha de inicio del evento, así que no tienes que tipearlos de nuevo.
Condiciones de fin
Cada recurrencia elige uno de tres modos de fin:
- Nunca — sin
UNTIL, sinCOUNT. El evento se repite indefinidamente. Bueno para servicios semanales en curso. - Después de N ocurrencias —
COUNT=10. Útil para campañas con límite de tiempo ("clase de discipulado de diez semanas"). - En una fecha específica —
UNTIL=20261231T235959Z. Común para temporadas de ministerio que terminan a fin de año.
Si eliges nunca, el calendario aún expande ocurrencias hasta el final del mes actualmente visible — no hay bucle infinito porque la expansión está acotada por la ventana de vista.
Eligiendo el patrón correcto
Algunos ejemplos del mundo real y los ajustes del selector que coinciden:
| Evento | Frecuencia | Ajustes extras |
|---|---|---|
| Servicio Dominical | Semanal | BYDAY=SU, fin nunca |
| Oración miércoles + viernes | Semanal | BYDAY=WE,FR, fin nunca |
| Comunión del primer domingo | Mensual | Día-de-semana enésimo (1er domingo), fin nunca |
| Ofrenda de líderes del 15 | Mensual | Día del mes (15), fin nunca |
| Serie de Pascua de seis semanas | Semanal | BYDAY=SU, fin después de 6 ocurrencias |
| Día de fundadores anual | Anual | fin nunca |
| Devocional diario de Adviento | Diaria | fin en fecha (25 Dic) |
Para servicios con asistencia rastreada como el domingo en la mañana, no necesitas un evento de calendario recurrente en absoluto — ve Reuniones y niveles de alcance para el patrón correcto. Los eventos de calendario con recurrencia son para cosas de las que la gente necesita un recordatorio visual; las reuniones son para cosas contra las que registras una lista.
Compatibilidad hacia atrás
GCM aún entiende la columna heredada recurrence_rule (weekly / monthly / yearly) para eventos creados antes de que se lanzara el selector RRULE. Cuando editas uno de esos eventos heredados, el selector mapea el código corto a su equivalente RRULE más cercano y escribe ambos campos de vuelta. Los eventos nuevos siempre escriben ambos; la RRULE es autoritativa cuando ambos están presentes.
Si el parseo de RRULE alguna vez falla — una cadena corrupta de una edición manual, por ejemplo — el calendario cae de vuelta a la interpretación heredada de recurrence_rule. No perderás fechas, pero puedes perder el matiz (un evento heredado de diario-con-fecha-fin se vuelve un respaldo diario-para-siempre).
Qué hacer cuando una fecha es diferente
La recurrencia elige el patrón. Cuando una ocurrencia específica necesita ser cancelada o movida — el servicio de Nochebuena reemplazando el horario habitual del domingo en la mañana, por ejemplo — no reescribas la RRULE. Usa excepciones de eventos en su lugar. Anulan una sola fecha sin perturbar el resto de la serie.
