import uuid from datetime import datetime, timedelta, date from fastapi import APIRouter, Depends, Security from sqlalchemy import distinct from sqlalchemy.orm import Session, joinedload from ...core.config import settings from ...models import Voucher, Settlement, User from ...schemas.auth import UserToken from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal router = APIRouter() # Dependency def get_db() -> Session: try: db = SessionLocal() yield db finally: db.close() @router.get("/active") def active_cashiers( s: str = None, f: str = None, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cashier-report"]), ): start_date = date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date() finish_date = date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date() if (date.today() - start_date).days > 5 and "accounts-audit" not in user.permissions: raise ValueError("Accounts Audit") users = ( db.query(User) .filter( User.id.in_( db.query(distinct(Voucher.user_id)).filter( Voucher.date >= start_date + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES), Voucher.date <= finish_date + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES), ) ) ) .order_by(User.name) .all() ) return [{"id": u.id, "name": u.name} for u in users] @router.get("/{id_}") def show_id( id_: uuid.UUID, s: str = None, f: str = None, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cashier-report"]), ): start_date = date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date() finish_date = date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date() if (date.today() - start_date).days > 5 and "accounts-audit" not in user.permissions: raise ValueError("Accounts Audit") vouchers = ( db.query(Voucher) .options(joinedload(Voucher.settlements, innerjoin=True).joinedload(Settlement.settle_option, innerjoin=True)) .filter( Voucher.date >= start_date + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES), Voucher.date <= finish_date + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES), Voucher.user_id == id_, ) .order_by(Voucher.voucher_type) .order_by(Voucher.bill_id) .all() ) info = {} amounts = {} for item in vouchers: for so in (so for so in item.settlements if so.settle_option.show_in_choices): if so.settled not in info: info[so.settled] = [] amounts[so.settle_option.name] = 0 info[so.settled].append( { "date": item.date.strftime("%d-%b-%Y %H:%M:%S"), "billId": item.full_bill_id, "customer": item.customer.name if item.customer is not None else "", "amount": so.amount, } ) amounts[so.settle_option.name] += so.amount return { "startDate": start_date.strftime("%d-%b-%Y"), "finishDate": finish_date.strftime("%d-%b-%Y"), "user": {"id": id_}, "amounts": [{"name": key, "amount": value} for key, value in amounts.items()], "info": info, } @router.get("") def show_blank( s: str = None, f: str = None, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["cashier-report"]), ): start_date = date.today() if s is None else datetime.strptime(s, "%d-%b-%Y").date() finish_date = date.today() if f is None else datetime.strptime(f, "%d-%b-%Y").date() if (date.today() - start_date).days > 5 and "accounts-audit" not in user.permissions: raise ValueError("Accounts Audit") return { "startDate": start_date.strftime("%d-%b-%Y"), "finishDate": finish_date.strftime("%d-%b-%Y"), "user": {"id": ""}, "amounts": [], "info": [], }