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

93 lines
3.2 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
2020-06-17 04:27:41 +00:00
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
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()
@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 {
2020-06-17 04:27:41 +00:00
"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),
}
2020-06-17 04:27:41 +00:00
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 = (
2020-06-17 04:27:41 +00:00
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
2020-06-17 04:27:41 +00:00
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,
),
}
2020-06-17 04:27:41 +00:00
for item in db.query(Reprint).filter(Reprint.date >= start_date, Reprint.date <= finish_date).all()
]