barker/barker/barker/routers/reports/bill_settlement_report.py

93 lines
3.2 KiB
Python

from datetime import datetime, timedelta, date
from fastapi import APIRouter, Depends, Security
from sqlalchemy.orm import Session
from barker.core.config import settings
from ...models import Voucher, VoucherType, Settlement, Reprint, SettleOption
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 bill_details(
s: str = None,
f: str = None,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["bill-settlement-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"),
"amounts": settlements(start_date, finish_date, db)
+ reprints(start_date, finish_date, db),
}
def settlements(s: date, f: date, db: Session):
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES)
vouchers = (
db.query(Voucher)
.join(Voucher.settlements)
.join(Settlement.settle_option)
.filter(Voucher.date >= start_date, Voucher.date <= finish_date)
.order_by(Voucher.voucher_type)
.order_by(Voucher.bill_id)
.all()
)
report = []
for item in vouchers:
for so in (so for so in item.settlements if so.settle_option.show_in_choices):
if item.voucher_type == VoucherType.VOID:
details = f"Void: {item.reason}"
elif item.voucher_type == VoucherType.STAFF:
details = f"Staff: {item.reason}"
elif item.voucher_type == VoucherType.NO_CHARGE:
details = f"NC: {item.reason}"
else:
details = so.settle_option.name
report.append(
{
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.full_bill_id,
"settlement": details,
"amount": round(so.amount, 2),
}
)
return report
def reprints(s: date, f: date, db: Session):
start_date = s + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)
finish_date = f + timedelta(days=1, minutes=settings.NEW_DAY_OFFSET_MINUTES)
return [
{
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.voucher.full_bill_id,
"settlement": f"Reprinted by {item.user.name}",
"Amount": round(
next(s.amount for s in item.voucher.settlements if s.settled == SettleOption.AMOUNT()) * -1, 2,
),
}
for item in db.query(Reprint).filter(Reprint.date >= start_date, Reprint.date <= finish_date).all()
]