from dotenv import load_dotenv import os from datetime import datetime, timedelta from pymongo import MongoClient from models.client import Client from models.appointment import Appointment class AppointmentManager: def __init__(self, interval_hours=((8, 12), (14, 18))): load_dotenv() mongo_uri = os.getenv("MONGO_URI") mongo_db = os.getenv("MONGO_DB", "barberia") self.client = MongoClient(mongo_uri) self.db = self.client[mongo_db] self.collection = self.db["appointments"] self._opening_hours: list[str] = [] self.set_opening_hours(interval_hours) def set_opening_hours(self, interval_hours: tuple[tuple[int]]) -> None: opening_hours = [] for start, end in interval_hours: current_hour = datetime.strptime(f"{start}:00", '%H:%M') end_hour = datetime.strptime(f"{end}:00", '%H:%M') while current_hour < end_hour: opening_hours.append(current_hour.strftime('%H:%M')) current_hour += timedelta(minutes=30) self._opening_hours = opening_hours def create_appointment(self, user_data: dict, date_data: dict) -> None: client = Client(**user_data) appointment = Appointment(client, **date_data) data = appointment.to_dict() data["date"] = appointment.get_formatted_date() data["hour"] = appointment.get_formatted_hour() self.collection.insert_one(data) def get_available_appointments(self) -> dict[str, list[str]]: today = datetime.now() next_days = [today + timedelta(days=i) for i in range(28)] available_appointments = { day.strftime('%Y-%m-%d'): [hour for hour in self._opening_hours] for day in next_days } current_day = today.strftime('%Y-%m-%d') current_hour = today.strftime('%H:%M') available_appointments[current_day] = [hour for hour in available_appointments[current_day] if hour > current_hour] for record in self.collection.find(): day = record.get("date") hour = record.get("hour") if day in available_appointments and hour in available_appointments[day]: available_appointments[day].remove(hour) return {k: v for k, v in available_appointments.items() if v} def get_reserved_days(self) -> list[str]: return sorted(list(set(doc["date"] for doc in self.collection.find({}, {"date": 1})))) def get_appointments(self, date: str) -> list: results = self.collection.find({"date": date}) return [ { "identification": r["client"]["identification"], "name": f"{r['client']['name']} {r['client']['last_name']}", "hour": r["hour"] } for r in results ]