How To: Add Holidays Using a Script
The following example shows how you could automatically insert floating and fixed holidays using an IronPython script.
# ########################################################################################################
# Floating Holidays
# ########################################################################################################
# ##########################
# Easter Sunday
# Ostersonntag
# Taken from: http://www.codeproject.com/KB/datetime/christianholidays.aspx
# ##########################
def easterDay(year):
#This algorithm is based in part on the algorithm of Oudin (1940) as quoted in
#"Explanatory Supplement to the Astronomical Almanac", P. Kenneth Seidelmann.
#G is the Golden Number-1
#H is 23-Epact (modulo 30)
#I is the number of days from 21 March to the Paschal full moon
#J is the weekday for the Paschal full moon (0=Sunday, 1=Monday, etc.)
#L is the number of days from 21 March to the Sunday on or before the Paschal full moon (a number between -6 and 28)
#C is then Century
G = year % 19
C = year / 100
X = C / 4
Y = (8 * C + 13) / 25
Z = 19 * G
H = (C - X - Y + Z + 15) % 30
X = H / 28
Y = 29 / (H + 1)
Z = (21 - G) / 11
I = H - X * (1 - Y * Z)
X = year / 4
Y = C / 4
J = (year + X + I + 2 - C + Y) % 7
L = I - J
X = (L + 40) / 44
EasterMonth = 3 + X
X = EasterMonth / 4
EasterDay = L + 28 - 31 * X
return DateTime(year, EasterMonth, EasterDay)
# ##########################
# Palm Sunday
# Palmsonntag
# ##########################
def palmSunday(year):
return easterDay(year).AddDays(-7);
# ##########################
# Good Friday
# Karfreitag
# ##########################
def goodFriday(year):
return easterDay(year).AddDays(-2);
# ##########################
# Easter Monday
# Ostermontag
# ##########################
def easterMonday(year):
return easterDay(year).AddDays(1);
# ##########################
# Ascension Day
# Christi Himmelfahrt
# ##########################
def ascensionDay(year):
return easterDay(year).AddDays(39)
# ##########################
# Whit Sunday
# Pfingstsonntag
# ##########################
def whitSunday(year):
return easterDay(year).AddDays(49);
# ##########################
# Whit Monday
# Pfingstsonntag
# ##########################
def whitMonday(year):
return easterDay(year).AddDays(50);
# ##########################
# Trinity Sunday
# Trinity Sunday
# ##########################
def trinitySunday(year):
return easterDay(year).AddDays(56);
# ##########################
# Corpus Christi
# Fronleichnam
# ##########################
def corpusChristi(year):
return trinitySunday(year).AddDays(4)
# ##########################
# Add Floating Holidays
# ##########################
def addFloatingHolidays(dc, holidayCalendar, year):
dc.BeginTransaction()
try:
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Palmsonntag"
holiday.LegalHolidayDate = palmSunday(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Ostersonntag"
holiday.LegalHolidayDate = easterDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Ostermontag"
holiday.LegalHolidayDate = easterMonday(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Christi Himmelfahrt"
holiday.LegalHolidayDate = ascensionDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Pfingstsonntag"
holiday.LegalHolidayDate = whitSunday(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Pfingstmontag"
holiday.LegalHolidayDate = whitMonday(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Fronleichnam"
holiday.LegalHolidayDate = corpusChristi(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
dc.TryCommitTransaction()
except:
dc.TryRollbackTransaction()
raise
# ########################################################################################################
# Fixed Holidays
# ########################################################################################################
# ##########################
# New Years Day
# Neujahr
# ##########################
def newYearsDay(year):
return DateTime(year, 1, 1)
# ##########################
# Epiphany
# Heiligen 3 Könige
# ##########################
def epiphanyDay(year):
return DateTime(year, 1, 6)
# ##########################
# Labor Day
# Staatsfeiertag (Tag der Arbeit)
# ##########################
def laborDay(year):
return DateTime(year, 5, 1)
# ##########################
# Assumption of Mary
# Maria Himmelfahrt
# ##########################
def assumptionOfMaryDay(year):
return DateTime(year, 8, 15)
# ##########################
# Austrian National Day
# Nationalfeiertag
# ##########################
def nationalDay(year):
return DateTime(year, 10, 26)
# ##########################
# All Saints Day
# Allerheiligen
# ##########################
def allSaintsDay(year):
return DateTime(year, 11, 1)
# ##########################
# Feast of the Immaculate Conception
# Maria Empfängnis
# ##########################
def immaculateConceptionDay(year):
return DateTime(year, 12, 8)
# ##########################
# Christmas Day
# Christtag
# ##########################
def christmasDay(year):
return DateTime(year, 12, 25)
# ##########################
# St Stephen's Day
# Stefanitag
# ##########################
def stStepanDay(year):
return DateTime(year, 12, 26)
# ##########################
# Add Fixed Holidays
# ##########################
def addFixedHolidays(dc, holidayCalendar, year):
dc.BeginTransaction()
try:
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Neujahr"
holiday.LegalHolidayDate = newYearsDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Heilige 3 Könige"
holiday.LegalHolidayDate = epiphanyDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Staatsfeiertag (Tag der Arbeit)"
holiday.LegalHolidayDate = laborDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Maria Himmelfahrt"
holiday.LegalHolidayDate = assumptionOfMaryDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Nationalfeiertag"
holiday.LegalHolidayDate = nationalDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Allerheiligen"
holiday.LegalHolidayDate = allSaintsDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Maria Empfängnis"
holiday.LegalHolidayDate = immaculateConceptionDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Christtag"
holiday.LegalHolidayDate = christmasDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
holiday = dc.CreateLegalHoliday()
holiday.LegalHolidayName = "Stefanitag"
holiday.LegalHolidayDate = stStepanDay(year)
holiday.LegalHolidayCalendar = holidayCalendar
dc.SaveObject(holiday)
dc.TryCommitTransaction()
except:
dc.TryRollbackTransaction()
raise
# choose between case-1 or case-2
# --- case-1: create a new holiday calendar (if you use time cockpit the first year)
#holidayCalendar = Context.CreateLegalHolidayCalendar()
#holidayCalendar.LegalHolidayCalendarName = 'Austrian Legal Holidays'
#Context.SaveObject(holidayCalendar)
# --- end case-1
# --- case-2: add holidays for the next year to an existing holiday calendar
#existingCalendar = 'Austrian Legal Holidays' # set existing calendar to the appropriate name in your time cockpit environment
#holidayCalendar = Context.SelectSingleWithParams({
# "Query": "From C In LegalHolidayCalendar Where C.LegalHolidayCalendarName=@CalendarName Select C",
# "@CalendarName" : existingCalendar
# });
# --- end case-2
addFloatingHolidays(Context, holidayCalendar, 2017)
addFixedHolidays(Context, holidayCalendar, 2017)
print "DONE!"