2013-07-11 12:25:51 +00:00
|
|
|
import datetime
|
2014-04-29 10:08:44 +00:00
|
|
|
import pkg_resources
|
|
|
|
from pyramid.response import FileResponse
|
2013-07-11 12:25:51 +00:00
|
|
|
from sqlalchemy.sql.expression import func, desc
|
|
|
|
|
|
|
|
from pyramid.view import view_config
|
|
|
|
|
2018-07-07 11:01:44 +00:00
|
|
|
from brewman.models.master import AccountBase
|
2013-07-11 12:25:51 +00:00
|
|
|
|
|
|
|
from brewman.models.voucher import Voucher, Journal, VoucherType
|
|
|
|
from brewman.views.services.session import session_period_finish, session_period_start
|
|
|
|
|
|
|
|
|
2019-04-06 04:13:12 +00:00
|
|
|
@view_config(
|
|
|
|
request_method="GET", route_name="net_transactions", permission="Net Transactions"
|
|
|
|
)
|
2013-07-11 12:25:51 +00:00
|
|
|
def html(request):
|
2019-04-06 04:13:12 +00:00
|
|
|
package, resource = "brewman:static/index.html".split(":", 1)
|
2014-04-29 10:08:44 +00:00
|
|
|
file = pkg_resources.resource_filename(package, resource)
|
|
|
|
return FileResponse(file, request=request)
|
2013-07-11 12:25:51 +00:00
|
|
|
|
|
|
|
|
2019-04-06 04:13:12 +00:00
|
|
|
@view_config(
|
|
|
|
request_method="GET",
|
|
|
|
route_name="api_net_transactions",
|
|
|
|
renderer="json",
|
|
|
|
permission="Net Transactions",
|
|
|
|
)
|
2013-07-11 12:25:51 +00:00
|
|
|
def report(request):
|
2019-04-06 04:13:12 +00:00
|
|
|
start_date = request.GET.get("s", None)
|
|
|
|
finish_date = request.GET.get("f", None)
|
2013-07-11 12:25:51 +00:00
|
|
|
if start_date and finish_date:
|
2019-04-06 04:13:12 +00:00
|
|
|
return {
|
|
|
|
"startDate": start_date,
|
|
|
|
"finishDate": finish_date,
|
|
|
|
"body": build_report(start_date, finish_date, request.dbsession),
|
|
|
|
}
|
2013-07-11 12:25:51 +00:00
|
|
|
else:
|
2019-04-06 04:13:12 +00:00
|
|
|
return {
|
|
|
|
"startDate": session_period_start(request),
|
|
|
|
"finishDate": session_period_finish(request),
|
|
|
|
"body": [],
|
|
|
|
}
|
2013-07-11 12:25:51 +00:00
|
|
|
|
|
|
|
|
2016-12-24 11:41:01 +00:00
|
|
|
def build_report(start_date, finish_date, dbsession):
|
2013-07-11 12:25:51 +00:00
|
|
|
if not isinstance(start_date, datetime.datetime):
|
2019-04-06 04:13:12 +00:00
|
|
|
start_date = datetime.datetime.strptime(start_date, "%d-%b-%Y")
|
2013-07-11 12:25:51 +00:00
|
|
|
if not isinstance(finish_date, datetime.datetime):
|
2019-04-06 04:13:12 +00:00
|
|
|
finish_date = datetime.datetime.strptime(finish_date, "%d-%b-%Y")
|
2013-07-11 12:25:51 +00:00
|
|
|
|
2019-04-06 04:13:12 +00:00
|
|
|
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()
|
|
|
|
)
|
2013-07-11 12:25:51 +00:00
|
|
|
|
|
|
|
body = []
|
2018-07-07 11:01:44 +00:00
|
|
|
for account, amount in query:
|
2013-07-11 12:25:51 +00:00
|
|
|
if amount != 0:
|
2019-04-06 04:13:12 +00:00
|
|
|
tag = "debit" if amount > 0 else "credit"
|
|
|
|
body.append(
|
|
|
|
{"type": account.type_object.name, "name": account.name, tag: amount}
|
|
|
|
)
|
2013-07-11 12:25:51 +00:00
|
|
|
return body
|