from datetime import datetime, timedelta, date from fastapi import APIRouter, Depends, Security from sqlalchemy.orm import Session from sqlalchemy.sql.expression import func from barker.core.config import settings from ...models import Inventory, Product, Kot, Voucher, VoucherType 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("") def beer_consumption( s: str = None, f: str = None, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["beer-consumption-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") day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day") sum_ = func.sum(Inventory.quantity * Product.quantity).label("sum") list_ = ( db.query(day, Product.name, sum_) .join(Voucher.kots) .join(Kot.inventories) .join(Inventory.product) .filter( day >= start_date, day <= finish_date, Voucher.voucher_type.in_( [VoucherType.REGULAR_BILL.value, VoucherType.NO_CHARGE.value, VoucherType.STAFF.value,] ), ) .group_by(day, Product.name) .having(sum_ != 0) .order_by(day, Product.name) .all() ) headers = [] data = [] for date_, name, quantity in list_: if name not in headers: headers.append(name) old = [d for d in data if d["date"] == date_.strftime("%d-%b-%Y")] if len(old): old[0][name] = quantity else: data.append({"date": date_.strftime("%d-%b-%Y"), name: quantity}) return { "startDate": start_date.strftime("%d-%b-%Y"), "finishDate": finish_date.strftime("%d-%b-%Y"), "headers": headers, "data": data, }