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

72 lines
2.3 KiB
Python
Raw Normal View History

2020-06-17 04:27:41 +00:00
from datetime import datetime, timedelta, date
2020-06-17 04:27:41 +00:00
from fastapi import APIRouter, Depends, Security
from sqlalchemy.orm import Session
from sqlalchemy.sql.expression import func
2020-06-17 04:27:41 +00:00
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
2020-06-17 04:27:41 +00:00
router = APIRouter()
2020-06-17 04:27:41 +00:00
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
2020-06-17 04:27:41 +00:00
@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")
2019-08-21 05:42:30 +00:00
sum_ = func.sum(Inventory.quantity * Product.quantity).label("sum")
list_ = (
2020-06-17 04:27:41 +00:00
db.query(day, Product.name, sum_)
2019-08-21 05:42:30 +00:00
.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,]
2019-08-21 05:42:30 +00:00
),
)
.group_by(day, Product.name)
.having(sum_ != 0)
.order_by(day, Product.name)
.all()
)
headers = []
data = []
2020-06-17 04:27:41 +00:00
for date_, name, quantity in list_:
2019-08-21 05:42:30 +00:00
if name not in headers:
headers.append(name)
2020-06-17 04:27:41 +00:00
old = [d for d in data if d["date"] == date_.strftime("%d-%b-%Y")]
2019-08-21 05:42:30 +00:00
if len(old):
old[0][name] = quantity
else:
2020-06-17 04:27:41 +00:00
data.append({"date": date_.strftime("%d-%b-%Y"), name: quantity})
2019-08-21 05:42:30 +00:00
return {
2020-06-17 04:27:41 +00:00
"startDate": start_date.strftime("%d-%b-%Y"),
"finishDate": finish_date.strftime("%d-%b-%Y"),
2019-08-21 05:42:30 +00:00
"headers": headers,
"data": data,
}