34
34
from datetime import timedelta
37
# https://fr.wikipedia.org/wiki/F%C3%AAtes_et_jours_f%C3%A9ri%C3%A9s_en_France
38
# DOM-TOM is not implemented
37
40
FR_DAY_OFF_SETTINGS = {
38
'rest_days': [6,7], # iso weekdays list
39
'alsace_lorraine': True,
41
'rest_days': [6,7], # iso weekdays list (1 Monday, 7 Sunday)
42
'region': 'alsace_moselle' # False, '', 'alsace_moselle'
42
45
class fr_dayoff(osv.osv):
49
def _get_easter_hodges(self, year):
51
return easter day from Hodges Algorithm
69
return datetime.date(year, month, day)
71
52
def is_dayoff(self, d):
87
68
def get_period_worked_days(self, d_from, d_to):
89
return (integer) day count of work days for the period
70
return (worked_days, rest_days) (tuple of integers) day count of work days for the period
90
71
d_from: (date) period start date included
91
72
d_to: (date) period end date included
95
78
if self.is_dayoff(d):
96
d = d + timedelta(days=1)
82
d = d + timedelta(days=1)
83
return (worked_days, rest_days)
98
85
def get_year_dayoffs(self, year, filter_rest_days=True):
111
98
days[datetime.date(year, 11, 1)] = "Toussaint"
112
99
days[datetime.date(year, 11, 11)] = "Armistice"
113
100
days[datetime.date(year, 12, 25)] = "Noël"
114
if 'alsace_lorraine' in FR_DAY_OFF_SETTINGS \
115
and FR_DAY_OFF_SETTINGS['alsace_lorraine']:
101
if 'region' in FR_DAY_OFF_SETTINGS \
102
and FR_DAY_OFF_SETTINGS['region'] == 'alsace_moselle':
116
103
days[datetime.date(year, 12, 26)] = "Saint Etienne"
121
108
days[e + timedelta(days=1)] = "Lundi de Pâques"
122
109
days[e + timedelta(days=39)] = "Jeudi de l'Ascension"
123
110
days[e + timedelta(days=50)] = "Lundi de Pentecôte"
111
if 'region' in FR_DAY_OFF_SETTINGS \
112
and FR_DAY_OFF_SETTINGS['region'] == 'alsace_moselle':
114
days[e - timedelta(days=2)] = "Vendredi Saint"
126
117
if filter_rest_days and 'rest_days' in FR_DAY_OFF_SETTINGS \
127
def _get_easter_hodges(self, year):
129
return easter day from Hodges Algorithm
147
return datetime.date(year, month, day)
149
def _unit_test(self):
150
dayoffs = self.get_year_dayoffs(2013, filter_rest_days=True)
153
test = self.is_dayoff(datetime.date(2013, 8, 15))
154
print 'is_dayoff 15 august th (True):', test
155
test = self.is_dayoff(datetime.date(2013, 8, 16))
156
print 'is_dayoff 16 august fr (False):', test
157
test = self.is_dayoff(datetime.date(2013, 8, 17))
158
print 'is_dayoff 17 august sa (True):', test
159
test = self.is_dayoff(datetime.date(2013, 8, 18))
160
print 'is_dayoff 18 august su (True):', test
161
test = self.is_dayoff(datetime.date(2013, 3, 29))
162
print 'is_dayoff 29 March (Vendredi Saint):', test
163
test = self.is_dayoff(datetime.date(2013, 12, 26))
164
print 'is_dayoff 26 December (Saint-Etienne):', test
166
worked, rest = self.get_period_worked_days(datetime.date(2013, 8, 2),
167
datetime.date(2013, 8, 16))
168
print 'get_period_worked_days from 16 august worked days'
169
print '10 work days / 5 rest days'
170
print '(2 weekends and 15 is dayoff):', worked, rest