| from datetime import datetime, timedelta, time |
| import locale |
| from babel.dates import format_date, get_day_names |
|
|
| locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') |
|
|
| def calculate_night_time(start_time: time, end_time: time, pause_time: time, date: datetime) -> float: |
| start_datetime = datetime.combine(date, start_time) |
| end_datetime = datetime.combine(date, end_time) |
|
|
| night_start = datetime.combine(date, datetime.strptime("21:00:00", "%H:%M:%S").time()) |
| night_end = datetime.combine(date, datetime.strptime("06:00:00", "%H:%M:%S").time()) |
| night_worktime = timedelta() |
|
|
| if end_datetime < start_datetime : |
| end_datetime += timedelta(days=1) |
| night_end += timedelta(days=1) |
| night_worktime = min(end_datetime, night_end) - max(start_datetime, night_start) |
| else: |
| if end_datetime >= night_start: |
| night_worktime = max(end_datetime, night_end ) - max(start_datetime, night_start) |
| |
| else: |
| night_worktime = min(end_datetime, night_end) - min(start_datetime, night_start) |
| |
| night_worktime = max(night_worktime, timedelta()) |
| pause_delta = timedelta(hours=pause_time.hour, minutes=pause_time.minute) |
| night_worktime -= pause_delta if night_worktime > pause_delta else night_worktime |
|
|
| total_seconds = night_worktime.total_seconds() |
| hours = float(total_seconds / 3600) |
|
|
| return hours |
|
|
| def calculate_work_time(start_time: time, end_time: time, pause_time: time, date: datetime) -> float: |
| start_datetime = datetime.combine(date, start_time) |
| end_datetime = datetime.combine(date, end_time) |
| |
| if end_datetime < start_datetime: |
| end_datetime += timedelta(days=1) |
|
|
| worktime = end_datetime - start_datetime |
| pause_delta = timedelta(hours=pause_time.hour, minutes=pause_time.minute) |
| worktime -= pause_delta if worktime > pause_delta else worktime |
| |
| total_seconds = worktime.total_seconds() |
| hours = float(total_seconds / 3600) |
| return hours |
|
|
| def date_to_week_number(date: datetime) -> int: |
| return date.isocalendar()[1] |
|
|
| def date_to_week_day(date: datetime) -> int: |
| |
| weekday_french = format_date(date, 'EEEE', locale='fr') |
| return weekday_french |
|
|