test-1 / services /appointment_manager.py
vmoras's picture
Added MongoDB
6854677
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
]