from datetime import date, datetime import brewman.schemas.reports as schemas from fastapi import APIRouter, Depends, Request, Security from sqlalchemy.orm import Session from sqlalchemy.sql.expression import desc, func from ...core.security import get_current_active_user as get_user from ...core.session import get_finish_date, get_start_date, set_period from ...db.session import SessionLocal from ...models.master import AccountBase from ...models.voucher import Journal, Voucher, VoucherType from ...schemas.auth import UserToken router = APIRouter() # Dependency def get_db() -> Session: try: db = SessionLocal() yield db finally: db.close() @router.get("", response_model=schemas.NetTransactions) def show_blank( request: Request, user: UserToken = Security(get_user, scopes=["net-transactions"]), ): return { "startDate": get_start_date(request.session), "finishDate": get_finish_date(request.session), "body": [], } @router.get("/{start}/{finish}", response_model=schemas.NetTransactions) def show_data( start: str, finish: str, request: Request, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["net-transactions"]), ): set_period(start, finish, request.session) return { "startDate": start, "finishDate": finish, "body": build_report( datetime.strptime(start, "%d-%b-%Y"), datetime.strptime(finish, "%d-%b-%Y"), db, ), } def build_report(start_date: date, finish_date: date, db: Session): amount_sum = func.sum(Journal.amount * Journal.debit).label("amount") query = ( db.query(AccountBase, amount_sum) .join(Journal.voucher) .join(Journal.account) .filter(Voucher.date >= start_date) .filter(Voucher.date <= finish_date) .filter(Voucher.type != VoucherType.by_name("Issue").id) .group_by(AccountBase) .order_by(AccountBase.type) .order_by(desc(func.abs(amount_sum))) .all() ) body = [] for account, amount in query: if amount != 0: tag = "debit" if amount > 0 else "credit" body.append( {"type": account.type_object.name, "name": account.name, tag: amount} ) return body