barker/barker/barker/routers/reports/cashier_report.py

125 lines
4.1 KiB
Python

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": [],
}