81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
from datetime import datetime
|
|
|
|
from scheduler.core.enums import DayOfWeek, WorkTime
|
|
from scheduler.database import storage
|
|
from scheduler.database.schedule_repository import ScheduleRepository
|
|
from scheduler.manager.validator import validate_employee_can_join_shift
|
|
|
|
|
|
def define_schedule_fields():
|
|
return {
|
|
"user_id": int,
|
|
"company_id": int,
|
|
"day_of_week": DayOfWeek,
|
|
"shift": WorkTime,
|
|
"enter_time": datetime,
|
|
"out_time": datetime | None,
|
|
}
|
|
|
|
|
|
def _value(value):
|
|
return value.value if hasattr(value, "value") else value
|
|
|
|
|
|
def register_user_enter_and_out(
|
|
connection, user_id, enter_time, day_of_week, out_time, shift
|
|
):
|
|
if not validate_employee_can_join_shift(
|
|
connection, user_id, _value(day_of_week), _value(shift)
|
|
):
|
|
return None
|
|
return storage.add_schedule(
|
|
connection,
|
|
user_id,
|
|
enter_time,
|
|
_value(day_of_week),
|
|
out_time,
|
|
_value(shift),
|
|
)
|
|
|
|
|
|
def output_weekly_schedule(connection=None, company_id=None):
|
|
should_close = False
|
|
if connection is None:
|
|
connection = storage.get_connection()
|
|
should_close = True
|
|
|
|
try:
|
|
repository = ScheduleRepository(connection)
|
|
schedules = repository.list_weekly(company_id)
|
|
|
|
grouped: dict[str, dict[str, list[str]]] = {}
|
|
for schedule in schedules:
|
|
day = _value(schedule["day_of_week"])
|
|
shift = _value(schedule["shift"])
|
|
name = f"{schedule['user']['name']} {schedule['user']['last_name']}"
|
|
grouped.setdefault(day, {}).setdefault(shift, []).append(name)
|
|
|
|
days_order = [d.value for d in DayOfWeek]
|
|
shifts_order = [s.value for s in WorkTime]
|
|
|
|
for day in days_order:
|
|
shifts = grouped.get(day, {})
|
|
if not shifts:
|
|
continue
|
|
print(f"{day}:")
|
|
for shift in shifts_order:
|
|
names = shifts.get(shift, [])
|
|
if not names:
|
|
continue
|
|
print(f" {shift}: {', '.join(names)}")
|
|
if len(names) < 2:
|
|
print(
|
|
f" warning: {shift} on {day} "
|
|
"has fewer than two employees"
|
|
)
|
|
|
|
return grouped
|
|
finally:
|
|
if should_close:
|
|
connection.close()
|