Files
manager_employees_python/src/scheduler/models/schedule.py
T
2026-09-18 20:46:32 -04:00

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()