from datetime import datetime, timedelta, date from fastapi import APIRouter, Depends, Security from sqlalchemy import func from sqlalchemy.orm import Session from barker.core.config import settings from ...models import Voucher, VoucherType, Settlement, Reprint, SettleOption, Inventory, SaleCategory, Kot, Product 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 discount_report_view( s: str = None, f: str = None, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["discount-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": discount_report(start_date, finish_date, db), } def discount_report(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) amount = func.sum(Inventory.quantity * Inventory.effective_price * Inventory.discount).label("Amount") list_ = ( db.query(SaleCategory.name, amount) .join(Voucher.kots) .join(Kot.inventories) .join(Inventory.product) .join(Product.sale_category) .filter( Inventory.discount != 0, Voucher.date >= start_date, Voucher.date <= finish_date, Voucher.voucher_type.in_([VoucherType.REGULAR_BILL.value, VoucherType.KOT.value]), ) .group_by(SaleCategory.name) .order_by(SaleCategory.name) .all() ) return [{"name": pg, "amount": amt} for pg, amt in list_]