87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
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
|