brewman/brewman/brewman/routers/reports/purchase_entries.py

87 lines
2.5 KiB
Python
Raw Normal View History

2020-10-07 15:18:43 +00:00
from datetime import date, datetime
2020-05-14 09:09:19 +00:00
from typing import List
2020-10-07 15:18:43 +00:00
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
2020-10-07 15:18:43 +00:00
from ...core.session import get_finish_date, get_start_date, set_period
from ...db.session import SessionLocal
2020-10-07 15:18:43 +00:00
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()
2020-05-14 09:09:19 +00:00
@router.get("", response_model=schemas.PurchaseEntries)
def report_blank(
2020-10-07 15:18:43 +00:00
request: Request,
user: UserToken = Security(get_user, scopes=["purchase-entries"]),
):
return {
2020-05-12 04:25:33 +00:00
"startDate": get_start_date(request.session),
"finishDate": get_finish_date(request.session),
"body": [],
}
2020-05-14 09:09:19 +00:00
@router.get("/{start}/{finish}", response_model=schemas.PurchaseEntries)
def report_data(
start: str,
finish: str,
request: Request,
db: Session = Depends(get_db),
2020-05-14 09:09:19 +00:00
user: UserToken = Security(get_user, scopes=["purchase-entries"]),
):
2020-05-14 09:09:19 +00:00
start_date = datetime.strptime(start, "%d-%b-%Y")
finish_date = datetime.strptime(finish, "%d-%b-%Y")
body = build_report(start_date, finish_date, db)
2020-05-12 04:25:33 +00:00
set_period(start, finish, request.session)
return {"startDate": start, "finishDate": finish, "body": body}
2020-05-14 09:09:19 +00:00
def build_report(start_date: date, finish_date, db):
body = []
2020-05-14 09:09:19 +00:00
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,
2020-10-07 15:18:43 +00:00
"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,
2020-05-14 09:09:19 +00:00
"discount": item.discount,
"amount": item.amount,
}
body.append(row)
return body