barker/barker/barker/routers/reports/beer_sale_report.py

87 lines
2.7 KiB
Python

from datetime import date, timedelta
from operator import or_
from fastapi import APIRouter, Depends, Security
from sqlalchemy.orm import Session
from sqlalchemy.sql.expression import func
from ...core.config import settings
from ...core.security import get_current_active_user as get_user
from ...db.session import SessionLocal
from ...models.inventory import Inventory
from ...models.kot import Kot
from ...models.product_version import ProductVersion
from ...models.voucher import Voucher
from ...models.voucher_type import VoucherType
from ...schemas.user_token import UserToken
from . import check_audit_permission, report_finish_date, report_start_date
router = APIRouter()
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.get("")
def beer_consumption(
start_date: date = Depends(report_start_date),
finish_date: date = Depends(report_finish_date),
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["beer-sale-report"]),
):
check_audit_permission(start_date, user.permissions)
day = func.date_trunc("day", Voucher.date - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).label("day")
sum_ = func.sum(Inventory.quantity * ProductVersion.quantity).label("sum")
list_ = (
db.query(day, ProductVersion.name, sum_)
.join(Voucher.kots)
.join(Kot.inventories)
.join(Inventory.product)
.filter(
day >= start_date,
day <= finish_date,
or_(
ProductVersion.valid_from == None, # noqa: E711
ProductVersion.valid_from <= day,
),
or_(
ProductVersion.valid_till == None, # noqa: E711
ProductVersion.valid_till >= day,
),
Voucher.voucher_type.in_(
[
VoucherType.REGULAR_BILL,
VoucherType.NO_CHARGE,
VoucherType.STAFF,
]
),
)
.group_by(day, ProductVersion.name)
.having(sum_ != 0)
.order_by(day, ProductVersion.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,
}