brewman/brewman/brewman/routers/reports/net_transactions.py

84 lines
2.3 KiB
Python
Raw Normal View History

2020-10-07 15:18:43 +00:00
from datetime import date, datetime
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
2020-10-07 15:18:43 +00:00
from sqlalchemy.sql.expression import desc, func
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.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()
2020-05-14 07:04:27 +00:00
@router.get("", response_model=schemas.NetTransactions)
def show_blank(
2020-10-07 15:18:43 +00:00
request: Request,
user: UserToken = Security(get_user, scopes=["net-transactions"]),
):
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 07:04:27 +00:00
@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"]),
):
2020-05-12 04:25:33 +00:00
set_period(start, finish, request.session)
return {
"startDate": start,
"finishDate": finish,
2020-10-07 15:18:43 +00:00
"body": build_report(
datetime.strptime(start, "%d-%b-%Y"),
datetime.strptime(finish, "%d-%b-%Y"),
db,
),
}
2020-05-14 07:04:27 +00:00
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"
2020-10-07 16:59:24 +00:00
body.append(
{"type": account.type_object.name, "name": account.name, tag: amount}
)
return body