barker/barker/barker/routers/reports/beer_consumption_report.py

72 lines
2.3 KiB
Python

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,
}