Files
brewman/brewman/views/reports/trial_balance.py
2014-05-27 12:18:09 +05:30

47 lines
1.9 KiB
Python

import datetime
import pkg_resources
from pyramid.response import FileResponse
from sqlalchemy.sql.expression import func
from pyramid.view import view_config
from brewman.models import DBSession
from brewman.models.master import LedgerBase
from brewman.models.voucher import Voucher, Journal, VoucherType
from brewman.views.services.session import session_period_finish
@view_config(request_method='GET', route_name='trial_balance', permission='Trial Balance')
@view_config(request_method='GET', route_name='trial_balance_date', permission='Trial Balance')
def html(request):
package, resource = 'brewman:static/base.html'.split(':', 1)
file = pkg_resources.resource_filename(package, resource)
return FileResponse(file, request=request)
@view_config(request_method='GET', route_name='api_trial_balance', renderer='json', permission='Trial Balance')
def report_blank(request):
return {'Date': session_period_finish(request), 'Body': []}
@view_config(request_method='GET', route_name='api_trial_balance_date', renderer='json', permission='Trial Balance')
def report_data(request):
date = request.matchdict.get('date', None)
return {'Date': date, 'Body': build_report(date)}
def build_report(date):
date = datetime.datetime.strptime(date, '%d-%b-%Y')
amount_sum = func.sum(Journal.amount * Journal.debit).label('amount')
query = DBSession.query(LedgerBase, amount_sum)\
.join(Journal.voucher).join(Journal.ledger)\
.filter(Voucher.date <= date).filter(Voucher.type != VoucherType.by_name('Issue').id).group_by(LedgerBase)\
.order_by(LedgerBase.type).order_by(func.abs(amount_sum).desc()).all()
body = []
for ledger, amount in query:
if amount != 0:
tag = 'Debit' if amount > 0 else 'Credit'
body.append({'Type': ledger.type_object.name, 'Name': ledger.name, tag:amount})
return body