import uuid from typing import Optional, List from fastapi import APIRouter, HTTPException, status, Depends, Security from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from ..models import Overview from ..schemas.auth import UserToken import barker.schemas.master as schemas from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal from ..models.master import FoodTable router = APIRouter() # Dependency def get_db(): try: db = SessionLocal() yield db finally: db.close() @router.post("/list", response_model=List[schemas.Table]) def sort_order( data: List[schemas.Table], db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): try: for index, item in enumerate(data): db.query(FoodTable).filter(FoodTable.id == item.id_).update( {FoodTable.sort_order: index} ) db.commit() return [ { "id": item.id, "name": item.name, "seats": item.seats, "section": {"id": item.section_id, "name": item.section.name}, "isActive": item.is_active, "sortOrder": item.sort_order, } for item in db.query(FoodTable).order_by(FoodTable.sort_order).all() ] except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.post("", response_model=schemas.Table) def save( data: schemas.TableIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): try: item = FoodTable(name=data.name, seats=data.seats, section_id=data.section.id_, is_active=data.is_active) db.add(item) db.commit() return food_table_info(item) except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.put("/{id_}", response_model=schemas.Table) def update( id_: uuid.UUID, data: schemas.TableIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): try: item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() item.name = data.name item.seats = data.seats item.section_id = data.section.id_ item.is_active = data.is_active db.commit() return food_table_info(item) except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.delete("/{id_}") def delete( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): try: item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() db.delete(item) db.commit() return food_table_info(item) except SQLAlchemyError as e: db.rollback() raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) except Exception: db.rollback() raise @router.get("") def show_blank( db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): return food_table_info(None) @router.get("/list") def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): return [ { "id": item.id, "name": item.name, "seats": item.seats, "section": {"id": item.section_id, "name": item.section.name}, "isActive": item.is_active, "sortOrder": item.sort_order, } for item in db.query(FoodTable).order_by(FoodTable.sort_order).all() ] @router.get("/running") def show_running(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): list_ = db.query(FoodTable).filter(FoodTable.is_active == True).order_by(FoodTable.sort_order).all() food_tables = [] for item in list_: ft = { "id": item.id, "name": item.name, "seats": item.seats, "section": {"id": item.section_id, "name": item.section.name}, "isActive": item.is_active, "sortOrder": item.sort_order, } if item.status is not None: ft["status"] = item.status.status ft["voucherId"] = item.status.voucher_id ft["pax"] = item.status.voucher.pax ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M") ft["amount"] = item.status.voucher.amount if item.status.guest is not None: ft["guest"] = item.status.guest.customer.name food_tables.append(ft) return food_tables @router.get("/from-voucher/{id_}") def show_voucher( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user), ): overview: Overview = db.query(Overview).filter(Overview.voucher_id == id_).first() if overview is not None: return food_table_info(overview.food_table) return food_table_info(None) @router.get("/{id_}") def show_id( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), ): item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() return food_table_info(item) def food_table_info(item: Optional[FoodTable]): if item is None: return {"name": "", "seats": 0, "section": {}, "isActive": True, "sortOrder": 0} return { "id": item.id, "name": item.name, "seats": item.seats, "section": {"id": item.section_id, "name": item.section.name}, "isActive": item.is_active, "status": "" if item.status is None else item.status.status, "sortOrder": item.sort_order, "voucherId": None if item.status is None else item.status.voucher_id, }