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() ]