brewman/brewman/views/reports/net_transactions.py

74 lines
2.3 KiB
Python
Raw Normal View History

import datetime
import pkg_resources
from pyramid.response import FileResponse
from sqlalchemy.sql.expression import func, desc
from pyramid.view import view_config
from brewman.models.master import AccountBase
from brewman.models.voucher import Voucher, Journal, VoucherType
from brewman.views.services.session import session_period_finish, session_period_start
@view_config(
request_method="GET", route_name="net_transactions", permission="Net Transactions"
)
def html(request):
package, resource = "brewman:static/index.html".split(":", 1)
file = pkg_resources.resource_filename(package, resource)
return FileResponse(file, request=request)
@view_config(
request_method="GET",
route_name="api_net_transactions",
renderer="json",
permission="Net Transactions",
)
def report(request):
start_date = request.GET.get("s", None)
finish_date = request.GET.get("f", None)
if start_date and finish_date:
return {
"startDate": start_date,
"finishDate": finish_date,
"body": build_report(start_date, finish_date, request.dbsession),
}
else:
return {
"startDate": session_period_start(request),
"finishDate": session_period_finish(request),
"body": [],
}
def build_report(start_date, finish_date, dbsession):
if not isinstance(start_date, datetime.datetime):
start_date = datetime.datetime.strptime(start_date, "%d-%b-%Y")
if not isinstance(finish_date, datetime.datetime):
finish_date = datetime.datetime.strptime(finish_date, "%d-%b-%Y")
amount_sum = func.sum(Journal.amount * Journal.debit).label("amount")
query = (
dbsession.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"
body.append(
{"type": account.type_object.name, "name": account.name, tag: amount}
)
return body