import uuid from typing import Optional from datetime import date, timedelta, datetime from fastapi import APIRouter, HTTPException, status, Depends, Security from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from ..core.config import settings 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 Customer from ..models.voucher import GuestBook router = APIRouter() # Dependency def get_db(): try: db = SessionLocal() yield db finally: db.close() @router.post("", response_model=schemas.GuestBook) def save( data: schemas.GuestBookIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["guest-book"]), ): try: customer: Customer = db.query(Customer).filter(Customer.phone == data.phone).first() if customer is None: customer = Customer(company=data.company, name=data.name, phone=data.phone, address=data.address,) db.add(customer) else: customer.name = data.name or customer.name customer.company = data.company or customer.company customer.address = data.address or customer.address item = GuestBook(pax=data.pax, customer=customer) db.add(item) db.commit() return guest_book_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.GuestBook) def update( id_: uuid.UUID, data: schemas.GuestBookIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["guest-book"]), ): try: item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first() item.customer.company = data.company item.customer.name = data.name item.customer.phone = data.phone item.customer.address = data.address item.pax = data.pax db.commit() return guest_book_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=["guest-book"]), ): try: item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first() db.delete(item) db.commit() return guest_book_info(None) 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=["guest-book"]), ): return guest_book_info(None) @router.get("/list") def show_list(q: Optional[str] = None, db: Session = Depends(get_db), user: UserToken = Depends(get_user)): if q is None or q == "": q = date.today() else: q = datetime.strptime(q, "%d-%b-%Y") list_ = ( db.query(GuestBook) .filter( GuestBook.date >= q + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES) ) .filter( GuestBook.date < q + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES, days=1) ) .order_by(GuestBook.date) .all() ) guest_book = [] for i, item in enumerate(list_): guest_book.insert( 0, { "id": item.id, "serial": i + 1, "company": item.customer.company, "name": item.customer.name, "phone": item.customer.phone, "pax": item.pax, "date": item.date.strftime("%d-%b-%Y %H:%M"), "status": "" if item.status is None else item.status.status, }, ) return {"date": q.strftime("%d-%b-%Y"), "list": guest_book} @router.get("/{id_}") def show_id( id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["guest-book"]), ): item: GuestBook = db.query(GuestBook).filter(GuestBook.id == id_).first() return guest_book_info(item) def guest_book_info(item: Optional[GuestBook]): if item is not None: return { "id": item.id, "company": item.customer.company, "name": item.customer.name, "phone": item.customer.phone, "pax": item.pax, "address": item.customer.address, "date": item.date.strftime("%d-%b-%Y %H:%M"), } else: return {"company": "", "name": "", "phone": "", "pax": 0, "address": ""}