import sys from fastapi import HTTPException from schemas.ReservaSh import * from models.ReservaM import Reserva from sqlalchemy.orm import Session from sqlalchemy import asc,between from datetime import date,time from datetime import datetime from core.utils import get_list_reserve,sort_object_by_index list_reserve = get_list_reserve() def create_new_reserve(reserve:ReserveCreate, id_usuario:str,created_at:datetime,db:Session): isExistReserve = get_reserve_by_time_date(reserve.hora,reserve.fecha,id_usuario,db) if isExistReserve != None: raise HTTPException(status_code=409, detail="Conflict:The reserve already exist.") db_reserve = Reserva( id_usuario = id_usuario, cliente = reserve.cliente, fecha = reserve.fecha, hora = reserve.hora, created_at = created_at ) try: db.add(db_reserve) db.commit() db.refresh(db_reserve) db.close() return db_reserve except Exception as e: db.rollback() print(f"error creating reserve: {str(e)}",file=sys.stderr) raise HTTPException(status_code=500,detail=f"error creating reserve: {str(e)}") def update_reserve(reserve:ReserveUpdate, user_id:str, db:Session): reserve_db = get_reserve_by_id(reserve.id_reserva, user_id, db) if reserve_db.estado_reserva == 0: try: reserve_db.cliente = reserve.cliente reserve_db.fecha = reserve.fecha reserve_db.hora = reserve.hora db.add(reserve_db) db.commit() db.refresh(reserve_db) db.close() return reserve_db except Exception as e: db.rollback() print(f"error updating reserve: {str(e)}",file=sys.stderr) raise HTTPException(status_code=500,detail=f"error updating reserve: {str(e)} ") else: return None def update_reserve_tarifa(reserve:ReserveUpdateTarifa, user_id:str, db:Session): reserve_db = get_reserve_by_id(reserve.id_reserva, user_id, db) if reserve_db: try: reserve_db.estado_reserva = 1 reserve_db.id_tarifa = reserve.id_tarifa db.add(reserve_db) db.commit() db.refresh(reserve_db) db.close() return reserve_db except Exception as e: db.rollback() print(f"error updating reserve: {str(e)}",file=sys.stderr) raise HTTPException(status_code=500,detail=f"error updating reserve: {str(e)} ") else: return None def get_reserve_by_id(id_reserve:int, user_id:str, db:Session): reserve_db = db.query(Reserva).filter((Reserva.id_reserva == id_reserve) & (Reserva.id_usuario == user_id) ).first() return reserve_db def get_reserve_by_time_date(time:time,date:date, user_id:str, db:Session): reserve_db = db.query(Reserva).filter( Reserva.hora == time, Reserva.fecha == date, Reserva.id_usuario == user_id ).first() if reserve_db is None: return None return reserve_db def update_status_reserve(reserve:ReserveUpdateStatus,db:Session,id_user:str): reserve_db = get_reserve_by_id(reserve.id_reserva,id_user,db) if reserve_db: try: reserve_db.estado_reserva = reserve.estado_reserva db.add(reserve_db) db.commit() return reserve_db except Exception as e: db.rollback() print(f"Error al update una reserva {str(e)}",file=sys.stderr) raise HTTPException(status_code=500,detail=f"Error al update una reserva: {str(e)} ") raise HTTPException(status_code=500,detail="No se encontro nada") def get_reserve_false(id_user:str,db): fecha = str(date.today()) reserve_db = db.query(Reserva).filter((Reserva.id_usuario == id_user ) & (Reserva.fecha == fecha) & (Reserva.estado_reserva == 0)).order_by(asc(Reserva.hora)).all() return reserve_db def get_reserve_all(id_user:str,db,fecha_inicio:date = None,fecha_fin:date = None): if fecha_inicio is None or fecha_fin is None: fecha_inicio = str(date.today()) fecha_fin = str(date.today()) reserve_db = db.query(Reserva).filter( Reserva.id_usuario == id_user, between(Reserva.fecha, fecha_inicio, fecha_fin) ).order_by(asc(Reserva.hora)).all() return reserve_db def get_reservations_by_date(id_user:str,db,fecha:date = None): if (fecha is None): fecha = str(date.today()) reservations_db = db.query(Reserva).filter( Reserva.id_usuario == id_user, Reserva.fecha == fecha ).all() return reservations_db def get_reservations_available(id_user:str,db,fecha:date = None): list_reservations = get_reservations_by_date(id_user,db,fecha) object_reservations = {} for reserva_db in list_reservations: time_reserve = reserva_db.hora.strftime('%H:%M:%S') if time_reserve in list_reserve: object_reservations[time_reserve] = reserva_db.cliente; for time_reserve in list_reserve: # bueno mi so el setdefault lo que hace es que si el objeto tiene esa clave no lo modifica de lo contrario coloca el valor Disponible object_reservations.setdefault(time_reserve, "Disponible") object_sort = sort_object_by_index(object_reservations) reservations_available = list(object_sort.items()) return reservations_available