from datetime import date, datetime from typing import List import brewman.schemas.reports as schemas from fastapi import APIRouter, Depends, Request, Security from sqlalchemy.orm import Session, joinedload_all 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.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.Daybook) def report_blank( request: Request, user: UserToken = Security(get_user, scopes=["daybook"]), ) -> schemas.Daybook: return schemas.Daybook( startDate=get_start_date(request.session), finishDate=get_finish_date(request.session), body=[], ) @router.get("/{start}/{finish}", response_model=schemas.Daybook) def report_data( start: str, finish: str, request: Request, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["daybook"]), ) -> schemas.Daybook: start_date = datetime.strptime(start, "%d-%b-%Y") finish_date = datetime.strptime(finish, "%d-%b-%Y") body = build_report(start_date, finish_date, db) set_period(start, finish, request.session) return schemas.Daybook(startDate=start_date, finishDate=finish_date, body=body) def build_report(start_date: date, finish_date: date, db: Session) -> List[schemas.DaybookItem]: body = [] query = ( db.query(Voucher) .options(joinedload_all(Voucher.journals, Journal.account, innerjoin=True)) .filter(Voucher.date >= start_date) .filter(Voucher.date <= finish_date) .filter(Voucher.type != VoucherType.by_name("Issue").id) .order_by(Voucher.date) .order_by(Voucher.last_edit_date) .all() ) for voucher in query: debit = 0 credit = 0 name_debit = "" name_credit = "" for journal in voucher.journals: if journal.debit == 1: debit += journal.amount name_debit += "{0} / ".format(journal.account.name) else: credit += journal.amount name_credit += "{0} / ".format(journal.account.name) name_debit = name_debit[:-3] name_credit = name_credit[:-3] body.append( schemas.DaybookItem( id=voucher.id, date=voucher.date.strftime("%d-%b-%Y"), url=[ "/", VoucherType.by_id(voucher.type).name.replace(" ", "-").lower(), str(voucher.id), ], type=VoucherType.by_id(voucher.type).name, narration=voucher.narration, posted=voucher.posted, debitText=name_debit, debitAmount=debit, creditText=name_credit, creditAmount=credit, ) ) return body