Skip to content

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.

Diálogo de nuevo evento

Qué se almacena

Cuando guardas un evento recurrente, GCM escribe tres columnas en la fila de events:

  • rrule_string — la cadena de recurrencia autoritativa, como FREQ=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 columna date redundante que refleja el valor UNTIL, 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, sin COUNT. El evento se repite indefinidamente. Bueno para servicios semanales en curso.
  • Después de N ocurrenciasCOUNT=10. Útil para campañas con límite de tiempo ("clase de discipulado de diez semanas").
  • En una fecha específicaUNTIL=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:

EventoFrecuenciaAjustes extras
Servicio DominicalSemanalBYDAY=SU, fin nunca
Oración miércoles + viernesSemanalBYDAY=WE,FR, fin nunca
Comunión del primer domingoMensualDía-de-semana enésimo (1er domingo), fin nunca
Ofrenda de líderes del 15MensualDía del mes (15), fin nunca
Serie de Pascua de seis semanasSemanalBYDAY=SU, fin después de 6 ocurrencias
Día de fundadores anualAnualfin nunca
Devocional diario de AdvientoDiariafin 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.