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 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 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.PurchaseEntries) def report_blank( request: Request, user: UserToken = Security(get_user, scopes=["purchase-entries"]), ): return { "startDate": get_start_date(request.session), "finishDate": get_finish_date(request.session), "body": [], } @router.get("/{start}/{finish}", response_model=schemas.PurchaseEntries) def report_data( start: str, finish: str, request: Request, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["purchase-entries"]), ): 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 {"startDate": start, "finishDate": finish, "body": body} def build_report(start_date: date, finish_date, db): body = [] query: List[Voucher] = ( db.query(Voucher) .filter(Voucher.date >= start_date) .filter(Voucher.date <= finish_date) .filter(Voucher.type == VoucherType.by_name("Purchase").id) .order_by(Voucher.date) .all() ) for voucher in query: journal = [j for j in voucher.journals if j.debit == -1] journal = journal[0] for item in voucher.inventories: row = { "date": voucher.date.strftime("%d-%b-%Y"), "supplier": journal.account.name, "url": [ "/", VoucherType.by_id(voucher.type).name.replace(" ", "-").lower(), str(voucher.id), ], "product": item.product.full_name, "quantity": item.quantity, "rate": item.rate, "tax": item.tax, "discount": item.discount, "amount": item.amount, } body.append(row) return body