martes, 16 de noviembre de 2010

iCalendar (II)

En la entrada anterior sobre iCalendar, trate de explicar los principales elementos de un archivo iCalendar, en esta entrada explicare como describir eventos periódicos.

Eventos periódicos

Los eventos periódicos son eventos que no poseen una fecha de inicio o final concreta, si no una regla descriptiva. Este tipo de eventos la mayoría de las veces son explicados de formas como “este evento se repite el tercer sábado de cada mes”, “el evento X se repite cada 4 días 10 veces” o “el eventos se repite el ultimo día de la semana de cada mes”. Si desea ver un ejemplo mas claro de esto, trate de crear un evento periódico en Google Calendar (aqui tiene una explicación de como hacerlo) y si desea ver muchas mas opciones (pero no todas) de iCalendar le recomiendo que lo haga en MS Outlook.

Este tipo de eventos se declaran en iCalendar con la propiedad RRULE del componente VEVENT, a esta propiedad se le debe añadir la información de frecuencia de la regla, en función de la frecuencia deberemos suministrar días, meses, intervalos, etc. Veamos uno ejemplo para poder entenderlo mejor

RRULE:FREQ=DAILY;COUNT=10;INTERVAL=4

Con esta regla estamos indicando que este evento posee una frecuencia diaria (FREQ), con intervalo (INTERVAL) de 4 días (note que el intervalo esta en función del tipo de frecuencia, el valor por defecto es 1) y se repetirá 10 veces (note la propiedad COUNT).

Veamos otro ejemplo esta vez crearemos una repetición de tipo semanal

DTSTART:19970902T090000
RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z

En esta regla estamos indicando una frecuencia semanal que inicia el 02/09/1997 09:00 y termina el (UNTIL) 24/12/1997 00:00
Esta regla se ejecutara los días:

2, 9, 16, 23 y 30 de septiembre
7,14, 21 y 28 de octubre
4, 11, 18 y 25 de noviembre
2,9,16 y 23 de diciembre

Los tipos de frecuencia que se puede indicar en la propiedad RRULE son:

  1. SECONDLY: Utilizado para repeticiones con intervalos de segundos
  2. MINUTELY: Utilizado para repeticiones con intervalos de minutos
  3. HOURLY: Utilizado para repeticiones con intervalos de horas
  4. DAILY: Utilizado para repeticiones con intervalos de días
  5. WEEKLY: Utilizado para repeticiones con intervalos semanales
  6. MONTHLY: Utilizado para repeticiones con intervalos mensuales
  7. YEARLY: Utilizado para repeticiones con intervalos anuales


Según la frecuencia que indique tendrá que suministrar una información u otra, por lo que si desea profundizar en este tema lea la sección 4.3.10 del RFC2445.

Modificaciones de instancias en eventos periódicos

En el apartado anterior explicamos como declarar eventos periódicos en un iCalendar, este tipo de eventos a pesar de declarar un solo evento generan varios eventos (instancias de eventos) que pertenecen a la definición de la periodicidad, dichas instancias pueden sufrir modificaciones en sus propiedades, cuando esto ocurre debemos indicar las propiedades que se modifican y sobre que instancia o instancias de eventos se deben aplicar.

Tomemos la ultima periodicidad de ejemplo:

DTSTART:19970902T090000
RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z

Recodemos que esta periodicidad generaba las siguientes instancias de eventos:

2, 9, 16, 23 y 30 de septiembre
7,14, 21 y 28 de octubre
4, 11, 18 y 25 de noviembre
2,9,16 y 23 de diciembre

Ahora imagine que el usuario desea pasar la instancia de evento que se ejecuta el 16 de septiembre al 15 de septiembre del mismo año, en nuestro archivo iCalendar debemos especificar ese cambio creando una nueva definición de evento (un componente VEVENT) indicando que instancia de la periodicidad sustituye. Veamos un ejemplo:

BEGIN:VEVENT
...
UID:
SEQUENCE:
DTSTART:19970902T090000
RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
END:VEVENT
(Definimos la periodicidad)


BEGIN:VEVENT
...
UID:
SEQUENCE:
RECURRENCE-ID:19970916T090000//Fecha de la instancia que se modifica
DTSTART:19970915T090000 //La nueva fecha de la instancia
END:VEVENT
(Declaramos la modificación de una instancia)

En este ejemplo el primer evento declara la periodicidad, con la regla de repetición que se debe aplicar y en la segunda definición de evento se indica, que el evento sustituye a la instancia con fecha 16/09/1997 de la periodicidad que posee el identificador y numero de revisión indicados por las propiedades UID y SEQUENCE respectivamente.

Eliminar instancias en eventos periódicos

Para eliminar una o varias instancias de un evento periódico, solo tenemos que indicar las fechas separadas por comas en la propiedad EXDATE del componente VEVENT donde declaramos la definición de la repetición.

Volvamos a tomar el ejemplo anterior, pero esta vez no modificaremos la instancia de fecha 16 de septiembre sino que la eliminaremos.

BEGIN:VEVENT
...
UID:
SEQUENCE:
DTSTART:19970902T090000
RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
EXDATE:19970915T090000
END:VEVENT

No hay comentarios: