| 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 | |
| ] | |