sábado, 29 de diciembre de 2012

Festivos de Colombia en Microsoft Project

Es sabido que Colombia es uno de los países que cuentan con mayor número de días no laborales, en total se tienen 20 días.

# Fecha base Celebración Nombre festividad Tipo
01 01-ene Fecha fija Año nuevo Cívica y Religiosa
02 06-ene Siguiente lunes Epifanía Religiosa
03 19-mar Siguiente lunes San José Religiosa
04 Pascua -7 días Domingo de Ramos Religiosa
05 Pascua -3 días Jueves Santo Religiosa
06 Pascua -2 días Viernes Santo Religiosa
07 Pascua El día de Pascua Domingo de Pascua Religiosa
08 01-may Fecha fija Día del Trabajo Cívica
09 Pascua +43 días Ascención de Jesús Religiosa
10 Pascua +64 dias Corpus Christi Religiosa
11 Pascua +71 días Sagrado Corazón de Jesús Religiosa
12 29-jun Siguiente lunes San Pedro y San Pablo Religiosa
13 20-jul Fecha fija Grito de Independencia Cívica
14 07-ago Fecha fija Batalla de Boyacá Cívica
15 15-ago Siguiente lunes Asunción de la Virgen Religiosa
16 12-oct Siguiente lunes Día de la Raza Cívica
17 01-nov Siguiente lunes Todos los Santos Religiosa
18 11-nov Siguiente lunes Independencia de Cartagena Religiosa
19 08-dic Fecha fija Inmaculada Concepción Religiosa
20 25-dic Fecha fija Navidad Religiosa

Como se puede apreciar en la tabla, con relación a la celebración hay tres tipos de festividades:
  1. Las de Fecha fija: Las cuales se celebran todos los años en la fecha base de la festividad.
  2. Las de Siguiente lunes: Las cuales se celebran el siguiente lunes con respecto a la fecha base de la festividad.
  3. Las relacionadas con la Pascua: Las cuales se celebran un cierto número de días con relación a la Pascua.
Cuando se está preparando un cronograma de proyecto se deben tener en cuenta los días festivos, los cuales se deben marcar como días no laborales. Esta labor aparte de ser dispendiosa puede generar errores de programación si se olvidan alguno de los festivos.

Para Colombia, en Microsof Project es posible automatizar esta tarea utilizando un código en Visual Basic que puede ser encontrado a continuación:


Sub FestivosColombia()
' Macro para colocar los festivos de Colombia
' Macro creada el 22/12/2012 por Jairo Bernal.
  Dim i As Integer, dia As Date, d As Integer, calendario As Calendar, dias As Integer
  Dim diasTexto As String, fechaFinEstimada As Date, fechaInicio As Date
  NewTasksStartOn
  OptionsViewEx ProjectSummary:=True
  OptionsViewEx DisplayOutlineNumber:=True
  ActiveProject.BaseCalendars(1).WeekDays(1).Default
  fechaInicio = ActiveProject.ProjectStart
  For i = 2 To 6
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift1.Start = "08:00"
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift1.Finish = "12:00"
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift2.Start = "13:00"
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift2.Finish = "17:00"
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift3.Clear
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift4.Clear
    ActiveProject.BaseCalendars(1).WeekDays(i).Shift5.Clear
  Next i
  ActiveProject.BaseCalendars(1).WeekDays(7).Default
  dias = 0
  Do While dias = 0
    On Error Resume Next
    dias = 0 + InputBox("Ingrese el estimado en días para su Proyecto", "Días del Proyecto", 0)
    On Error GoTo 0
  Loop
  fechaFinEstimada = DateAdd("d", dias, fechaInicio)
  For Each calendario In ActiveProject.BaseCalendars
    i = Year(fechaInicio)
    On Error Resume Next
    For i = i To Year(fechaFinEstimada) + 1
      ' Año Nuevo
      calendario.Exceptions.Add 1, DateSerial(i, 1, 1), DateSerial(i, 1, 1), 1, "Año Nuevo " & i
      ' Epifanía
      dia = DateSerial(i, 1, 6)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "Epifanía " & i
      ' San José
      dia = DateSerial(i, 3, 19)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "San José " & i
      ' Jueves y Viernes Santos
      calendario.Exceptions.Add 1, FestivoComputus(i, -3), FestivoComputus(i, -2), 1, "Jueves y Viernes Santos " & i
      ' Día del Trabajo
      calendario.Exceptions.Add 1, DateSerial(i, 5, 1), DateSerial(i, 5, 1), 1, "Día del Trabajo " & i
      ' Ascención del Señor
      calendario.Exceptions.Add 1, FestivoComputus(i, 43), FestivoComputus(i, 43), 1, "Ascención del Señor " & i
      ' Corpus Christie
      calendario.Exceptions.Add 1, FestivoComputus(i, 64), FestivoComputus(i, 64), 1, "Corpus Christie " & i
      ' Sagrado Corazón
      calendario.Exceptions.Add 1, FestivoComputus(i, 71), FestivoComputus(i, 71), 1, "Sagrado Corazón " & i
      ' San Pedro y San Pablo
      dia = DateSerial(i, 6, 29)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "San Pedro y San Pablo " & i
      ' Grito de Independencia
      calendario.Exceptions.Add 1, DateSerial(i, 7, 20), DateSerial(i, 7, 20), 1, "Grito de Independencia " & i
      ' Batalla de Boyacá
      calendario.Exceptions.Add 1, DateSerial(i, 8, 7), DateSerial(i, 8, 7), 1, "Batalla de Boyacá " & i
      ' Asunción de la Virgen
      dia = DateSerial(i, 8, 15)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "Asunción de la Virgen " & i
      ' Día de la Raza
      dia = DateSerial(i, 10, 12)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "Día de la Raza " & i
      ' Todos los Santos
      dia = DateSerial(i, 11, 1)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "Todos los Santos " & i
      ' Independencia de Cartagena
      dia = DateSerial(i, 11, 11)
      d = (9 - Weekday(dia)) Mod 7
      dia = DateAdd("d", d, dia)
      calendario.Exceptions.Add 1, dia, dia, 1, "Independencia de Cartagena " & i
      ' Inmaculada Concepcion
      calendario.Exceptions.Add 1, DateSerial(i, 12, 8), DateSerial(i, 12, 8), 1, "Inmaculada Concepcion " & i
      ' Navidad
      calendario.Exceptions.Add 1, DateSerial(i, 12, 25), DateSerial(i, 12, 25), 1, "Navidad " & i
    Next i
    On Error GoTo 0
  Next
End Sub

Public Function DomingoPascua(Anio As Integer) As Date
   Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer
   Dim f As Integer, g As Integer, h As Integer, i As Integer
   Dim k As Integer, l As Integer, m As Integer, n As Integer
   Dim mes As Integer, día As Integer
 
   a = Anio Mod 19
   b = Int(Anio / 100)
   c = Anio Mod 100
   d = Int(b / 4)
   e = b Mod 4
   f = Int((b + 8) / 25)
   g = Int((b - f + 1) / 3)
   h = (19 * a + b - d - g + 15) Mod 30
   i = Int(c / 4)
   k = c Mod 4
   l = (32 + 2 * e + 2 * i - h - k) Mod 7
   m = Int((a + 11 * h + 22 * l) / 451)
   n = h + l - 7 * m + 114
   mes = Int(n / 31)
   día = 1 + n Mod 31
   DomingoPascua = DateSerial(Anio, mes, día)
End Function

Public Function FestivoComputus(Anio As Integer, Optional ss As Integer) As Date
  FestivoComputus = DateAdd("d", ss, DomingoPascua(Anio))
End Function