Daybook done.
Unposted Entries done.
This commit is contained in:
@ -94,9 +94,6 @@ def main(global_config, **settings):
|
|||||||
config.add_route('issue', '/Issue')
|
config.add_route('issue', '/Issue')
|
||||||
config.add_route('issues_grid', '/Issues/Services/{date}')
|
config.add_route('issues_grid', '/Issues/Services/{date}')
|
||||||
|
|
||||||
config.add_route('day_book', '/Reports/DayBook')
|
|
||||||
config.add_route('unposted', '/Reports/Unposted')
|
|
||||||
|
|
||||||
config.add_route('ledger_id', '/Ledger/{id}')
|
config.add_route('ledger_id', '/Ledger/{id}')
|
||||||
config.add_route('ledger', '/Ledger')
|
config.add_route('ledger', '/Ledger')
|
||||||
|
|
||||||
@ -109,6 +106,9 @@ def main(global_config, **settings):
|
|||||||
config.add_route('cash_flow_id', '/CashFlow/{id}')
|
config.add_route('cash_flow_id', '/CashFlow/{id}')
|
||||||
config.add_route('cash_flow', '/CashFlow')
|
config.add_route('cash_flow', '/CashFlow')
|
||||||
|
|
||||||
|
config.add_route('daybook', '/Daybook')
|
||||||
|
config.add_route('unposted', '/Unposted')
|
||||||
|
|
||||||
config.add_route('profit_loss', '/Reports/ProfitLoss')
|
config.add_route('profit_loss', '/Reports/ProfitLoss')
|
||||||
|
|
||||||
config.add_route('group_roles_id', '/Admin/GroupRoles/{id}')
|
config.add_route('group_roles_id', '/Admin/GroupRoles/{id}')
|
||||||
|
|||||||
42
brewman/brewman/static/partial/daybook.html
Normal file
42
brewman/brewman/static/partial/daybook.html
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="DaybookCtrl">
|
||||||
|
<legend>Daybook</legend>
|
||||||
|
<div class="control-group">
|
||||||
|
<label for="txtStartDate" class="control-label">Date</label>
|
||||||
|
|
||||||
|
<div class="controls">
|
||||||
|
<datepicker id="txtStartDate" model="info" prop="StartDate" ng-model="info.StartDate"></datepicker>
|
||||||
|
<datepicker id="txtFinishDate" model="info" prop="FinishDate" ng-model="info.FinishDate"></datepicker>
|
||||||
|
<button ng-click="show()">Show</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="control-group">
|
||||||
|
<label for="gvGrid" class="control-label"></label>
|
||||||
|
|
||||||
|
<div class="controls">
|
||||||
|
<table id="gvGrid" class="clean-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Narration</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th class="right">Amount</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
<th class="right">Amount</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat="item in info.Body" ng-class="{true:'', false:'unposted'}[item.Posted]">
|
||||||
|
<td><a href="{{item.Url}}">{{item.Date}}</a></td>
|
||||||
|
<td>{{item.Type}}</td>
|
||||||
|
<td>{{item.Narration}}</td>
|
||||||
|
<td class="right">{{item.DebitN}}</td>
|
||||||
|
<td class="right">{{item.DebitA}}</td>
|
||||||
|
<td class="right">{{item.CreditN}}</td>
|
||||||
|
<td class="right">{{item.CreditA}}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
35
brewman/brewman/static/partial/unposted.html
Normal file
35
brewman/brewman/static/partial/unposted.html
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<form method="post" autocomplete="off" class="horizontal-form" ng-controller="UnpostedCtrl">
|
||||||
|
<legend>Unposted Entries</legend>
|
||||||
|
<div class="control-group">
|
||||||
|
<label for="gvGrid" class="control-label"></label>
|
||||||
|
|
||||||
|
<div class="controls">
|
||||||
|
<table id="gvGrid" class="clean-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Select</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Narration</th>
|
||||||
|
<th>Debit</th>
|
||||||
|
<th class="right">Amount</th>
|
||||||
|
<th>Credit</th>
|
||||||
|
<th class="right">Amount</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat="item in info">
|
||||||
|
<td></td>
|
||||||
|
<td><a href="{{item.Url}}">{{item.Date}}</a></td>
|
||||||
|
<td>{{item.Type}}</td>
|
||||||
|
<td>{{item.Narration}}</td>
|
||||||
|
<td class="right">{{item.DebitN}}</td>
|
||||||
|
<td class="right">{{item.DebitA}}</td>
|
||||||
|
<td class="right">{{item.CreditN}}</td>
|
||||||
|
<td class="right">{{item.CreditA}}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
@ -92,6 +92,16 @@ overlord_service.factory('CashFlow', ['$resource', function ($resource) {
|
|||||||
return $resource('/CashFlow/:id');
|
return $resource('/CashFlow/:id');
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
|
// TODO: Replace hardcoded url with route_url
|
||||||
|
overlord_service.factory('Daybook', ['$resource', function ($resource) {
|
||||||
|
return $resource('/Daybook');
|
||||||
|
}]);
|
||||||
|
|
||||||
|
// TODO: Replace hardcoded url with route_url
|
||||||
|
overlord_service.factory('Unposted', ['$resource', function ($resource) {
|
||||||
|
return $resource('/Unposted');
|
||||||
|
}]);
|
||||||
|
|
||||||
// TODO: Replace hardcoded url with route_url
|
// TODO: Replace hardcoded url with route_url
|
||||||
overlord_service.factory('LedgerService', ['$resource', function ($resource) {
|
overlord_service.factory('LedgerService', ['$resource', function ($resource) {
|
||||||
return $resource('/Services/Accounts/:type');
|
return $resource('/Services/Accounts/:type');
|
||||||
|
|||||||
@ -1,27 +1,15 @@
|
|||||||
function Populate(response) {
|
function DaybookCtrl($scope, $routeParams, $location, Daybook) {
|
||||||
if (response != null) {
|
if (typeof $routeParams.StartDate === 'undefined') {
|
||||||
var stateObj = { 'StartDate': response.start_date, 'FinishDate': response.finish_date };
|
$scope.info = Daybook.get({});
|
||||||
history.pushState(stateObj, 'Display', response.url);
|
} else if (typeof $routeParams.id === 'undefined') {
|
||||||
var $table = $('#tbodyMain')
|
$scope.info = Daybook.get({StartDate:$routeParams.StartDate, FinishDate:$routeParams.FinishDate});
|
||||||
$table.html(response.body);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Show(startDate, finishDate) {
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
contentType: "application/json; charset=utf-8",
|
|
||||||
url: show_url,
|
|
||||||
data: JSON.stringify({ startDate: startDate, finishDate: finishDate }),
|
|
||||||
dataType: "json",
|
|
||||||
success: function(response) {
|
|
||||||
Populate(response);
|
|
||||||
},
|
|
||||||
error: function(jqXHR, textStatus) {
|
|
||||||
$("#ctl00_statusDiv").removeClass().addClass("error");
|
|
||||||
var msg = $.parseJSON(jqXHR.responseText).Message;
|
|
||||||
$("#ctl00_statusDiv").html(msg);
|
|
||||||
}
|
}
|
||||||
|
$scope.show = function () {
|
||||||
|
$scope.info = Daybook.get({StartDate:$scope.info.StartDate, FinishDate:$scope.info.FinishDate}, function (u, putResponseHeaders) {
|
||||||
|
$location.path('/Daybook').search({StartDate:u.StartDate, FinishDate:u.FinishDate});
|
||||||
|
}, function (data, status) {
|
||||||
|
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||||
});
|
});
|
||||||
return false;
|
};
|
||||||
|
$('#txtStartDate').focus();
|
||||||
}
|
}
|
||||||
@ -32,6 +32,9 @@ var overlord = angular.module('overlord', ['overlord.directive', 'overlord.filte
|
|||||||
// when('/Ledger', {templateUrl:'/partial/ledger.html', controller:LedgerCtrl, resolve: LedgerCtrl.resolve}).
|
// when('/Ledger', {templateUrl:'/partial/ledger.html', controller:LedgerCtrl, resolve: LedgerCtrl.resolve}).
|
||||||
// when('/Ledger/:id', {templateUrl:'/partial/ledger.html', controller:LedgerCtrl, resolve: LedgerCtrl.resolve}).
|
// when('/Ledger/:id', {templateUrl:'/partial/ledger.html', controller:LedgerCtrl, resolve: LedgerCtrl.resolve}).
|
||||||
|
|
||||||
|
when('/Daybook', {templateUrl:'/partial/daybook.html', controller:DaybookCtrl}).
|
||||||
|
when('/Unposted', {templateUrl:'/partial/unposted.html', controller:UnpostedCtrl}).
|
||||||
|
|
||||||
when('/TrialBalance', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
|
when('/TrialBalance', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
|
||||||
when('/TrialBalance/:date', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
|
when('/TrialBalance/:date', {templateUrl:'/partial/trial-balance.html', controller:TrialBalanceCtrl}).
|
||||||
|
|
||||||
|
|||||||
3
brewman/brewman/static/scripts/unposted.js
Normal file
3
brewman/brewman/static/scripts/unposted.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
function UnpostedCtrl($scope, Unposted) {
|
||||||
|
$scope.info = Unposted.query();
|
||||||
|
}
|
||||||
@ -42,6 +42,8 @@
|
|||||||
${h.ScriptLink(request, 'product-ledger.js')}
|
${h.ScriptLink(request, 'product-ledger.js')}
|
||||||
${h.ScriptLink(request, 'trial-balance.js')}
|
${h.ScriptLink(request, 'trial-balance.js')}
|
||||||
${h.ScriptLink(request, 'cash-flow.js')}
|
${h.ScriptLink(request, 'cash-flow.js')}
|
||||||
|
${h.ScriptLink(request, 'daybook.js')}
|
||||||
|
${h.ScriptLink(request, 'unposted.js')}
|
||||||
|
|
||||||
${h.ScriptLink(request, 'account.js')}
|
${h.ScriptLink(request, 'account.js')}
|
||||||
${h.ScriptLink(request, 'user.js')}
|
${h.ScriptLink(request, 'user.js')}
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<li><a href="${request.route_url('product_ledger')}">Product Ledger</a></li>
|
<li><a href="${request.route_url('product_ledger')}">Product Ledger</a></li>
|
||||||
## <li><a href="/AccountsTesting/Reports/RawMaterialCost.aspx">Raw Material Cost</a></li>
|
## <li><a href="/AccountsTesting/Reports/RawMaterialCost.aspx">Raw Material Cost</a></li>
|
||||||
<li><a href="${request.route_url('cash_flow')}">Cash Flow</a></li>
|
<li><a href="${request.route_url('cash_flow')}">Cash Flow</a></li>
|
||||||
<li><a href="${request.route_url('day_book')}">Day Book</a></li>
|
<li><a href="${request.route_url('daybook')}">Day Book</a></li>
|
||||||
<li><a href="">Purchases</a>
|
<li><a href="">Purchases</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="/AccountsTesting/Reports/PurchaseEntry.aspx">Purchase Entry</a></li>
|
<li><a href="/AccountsTesting/Reports/PurchaseEntry.aspx">Purchase Entry</a></li>
|
||||||
|
|||||||
@ -1,69 +0,0 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
|
||||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
|
||||||
metal:use-macro="base">
|
|
||||||
<tal:block metal:fill-slot="content">
|
|
||||||
${h.JsLink(request, 'daybook.js')}
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() {
|
|
||||||
AutoComplete('#txtLedger', '${request.route_url('services_account_list')}');
|
|
||||||
|
|
||||||
$('#txtStartDate').datepicker({ dateFormat: 'dd-M-yy' });
|
|
||||||
${startDate}
|
|
||||||
$('#txtFinishDate').datepicker({ dateFormat: 'dd-M-yy'});
|
|
||||||
${finishDate}
|
|
||||||
|
|
||||||
show_url = '${request.route_url('day_book')}';
|
|
||||||
$("#btnSubmit").click(function() { return Show($('#txtStartDate').val(), $('#txtFinishDate').val()); });
|
|
||||||
|
|
||||||
window.onpopstate = function(event) {
|
|
||||||
var state = event.state;
|
|
||||||
if (state != null) {
|
|
||||||
$('#txtStartDate').val(state.StartDate);
|
|
||||||
$('#txtFinishDate').val(state.FinishDate);
|
|
||||||
Show(state.StartDate, state.FinishDate);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<article tal:attributes="class pagecontentclass">
|
|
||||||
<section>
|
|
||||||
<h2 class="ribbon-header">Display Ledger</h2>
|
|
||||||
<form method="post" autocomplete="off">
|
|
||||||
${h.CsrfToken(request.session)}
|
|
||||||
<p>
|
|
||||||
${h.Label('Start Date:', 'txtStartDate')}
|
|
||||||
${h.TextInput('txtStartDate', css_class = 'non-search-box', autocomplete='off')}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
${h.Label('Finish Date:', 'txtFinishDate')}
|
|
||||||
${h.TextInput('txtFinishDate', css_class = 'non-search-box', autocomplete='off')}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
${h.SubmitButton('btnSubmit', 'Submit')}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<table id="gvGrid" class="clean-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="Date">Date</th>
|
|
||||||
<th class="VoucherType">Type</th>
|
|
||||||
<th class="NameDebit">Debit</th>
|
|
||||||
<th class="Debit right">Amount</th>
|
|
||||||
<th class="NameCredit">Credit</th>
|
|
||||||
<th class="Credit right">Amount</th>
|
|
||||||
<th class="Narration">Narration</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbodyMain">
|
|
||||||
${body}
|
|
||||||
</tbody>
|
|
||||||
<tfoot id="tfootMain">
|
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
</p>
|
|
||||||
${h.EndForm()}
|
|
||||||
</section>
|
|
||||||
</article>
|
|
||||||
</tal:block>
|
|
||||||
</html>
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
|
||||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
|
||||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
|
||||||
metal:use-macro="base">
|
|
||||||
<tal:block metal:fill-slot="content">
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() {
|
|
||||||
$(document).ready(function() {
|
|
||||||
$('#gvGrid').dataTable({
|
|
||||||
"bInfo": false,
|
|
||||||
"bPaginate": false
|
|
||||||
});
|
|
||||||
} );
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
<article tal:attributes="class pagecontentclass">
|
|
||||||
<section>
|
|
||||||
<h2 class="ribbon-header">Unposted Entries</h2>
|
|
||||||
<table id="gvGrid" class="clean-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="Date">Date</th>
|
|
||||||
<th class="VoucherType">Type</th>
|
|
||||||
<th class="NameDebit">Debit</th>
|
|
||||||
<th class="Debit right">Amount</th>
|
|
||||||
<th class="NameCredit">Credit</th>
|
|
||||||
<th class="Credit right">Amount</th>
|
|
||||||
<th class="Narration">Narration</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbodyMain">
|
|
||||||
${body}
|
|
||||||
</tbody>
|
|
||||||
<tfoot id="tfootMain">
|
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
</section>
|
|
||||||
</article>
|
|
||||||
</tal:block>
|
|
||||||
</html>
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
import datetime
|
|
||||||
from sqlalchemy.orm import joinedload_all
|
|
||||||
|
|
||||||
from pyramid.view import view_config
|
|
||||||
from brewman.helpers import Literal
|
|
||||||
|
|
||||||
from brewman.models.voucher import Voucher, Journal, VoucherType
|
|
||||||
|
|
||||||
@view_config(request_method='GET', route_name='day_book', permission='DayBook', renderer='brewman:templates/reports/day_book.pt')
|
|
||||||
def day_book_get(request):
|
|
||||||
startDate = request.GET.get('startDate', None)
|
|
||||||
finishDate = request.GET.get('finishDate', None)
|
|
||||||
should_build_report = False if startDate is None else True
|
|
||||||
|
|
||||||
if not should_build_report:
|
|
||||||
body = ""
|
|
||||||
else:
|
|
||||||
report = build_report(request, startDate, finishDate)
|
|
||||||
body = Literal(report['body'])
|
|
||||||
|
|
||||||
if startDate == None:
|
|
||||||
startDate = Literal(
|
|
||||||
"StartDate('#txtStartDate', '{0}');".format(request.route_url('services_session_period_start')))
|
|
||||||
finishDate = Literal(
|
|
||||||
"FinishDate('#txtFinishDate', '{0}');".format(request.route_url('services_session_period_finish')))
|
|
||||||
else:
|
|
||||||
startDate = Literal("$('#txtStartDate').val('{0}');".format(startDate))
|
|
||||||
finishDate = Literal("$('#txtFinishDate').val('{0}');".format(finishDate))
|
|
||||||
|
|
||||||
return {'title': 'Day Book - Hops n Grains',
|
|
||||||
'pageclass': "page-blogpost page-sidebar-right",
|
|
||||||
'pagecontentclass': "page-content grid_12",
|
|
||||||
'page_header': '',
|
|
||||||
'body': body,
|
|
||||||
'startDate': startDate,
|
|
||||||
'finishDate': finishDate}
|
|
||||||
|
|
||||||
|
|
||||||
@view_config(request_method='POST', route_name='day_book', permission='DayBook', renderer='json', xhr=True)
|
|
||||||
def day_book_post(request):
|
|
||||||
startDate = request.json_body['startDate']
|
|
||||||
finishDate = request.json_body['finishDate']
|
|
||||||
return build_report(request, startDate, finishDate)
|
|
||||||
|
|
||||||
|
|
||||||
def build_report(request, startDate, finishDate):
|
|
||||||
editUrl = ''
|
|
||||||
body = ''
|
|
||||||
|
|
||||||
query = Voucher.query().options(joinedload_all(Voucher.journals, Journal.ledger, innerjoin=True))\
|
|
||||||
.filter(Voucher.date >= datetime.datetime.strptime(startDate, '%d-%b-%Y'))\
|
|
||||||
.filter(Voucher.date <= datetime.datetime.strptime(finishDate, '%d-%b-%Y'))\
|
|
||||||
.filter(Voucher.type != VoucherType.by_name('Issue').id)\
|
|
||||||
.order_by(Voucher.date).order_by(Voucher.last_edit_date).all()
|
|
||||||
|
|
||||||
for voucher in query:
|
|
||||||
debit = 0
|
|
||||||
credit = 0
|
|
||||||
nameDebit = ""
|
|
||||||
nameCredit = ""
|
|
||||||
for journal in voucher.journals:
|
|
||||||
if journal.debit == 1:
|
|
||||||
debit += journal.amount
|
|
||||||
nameDebit += "{0} / ".format(journal.ledger.name)
|
|
||||||
else:
|
|
||||||
credit += journal.amount
|
|
||||||
nameCredit += "{0} / ".format(journal.ledger.name)
|
|
||||||
nameDebit = nameDebit[:-3]
|
|
||||||
nameCredit = nameCredit[:-3]
|
|
||||||
|
|
||||||
nameDebit = '<a href="' + get_edit_url(request, voucher) + '">' + nameDebit + '</a>'
|
|
||||||
nameCredit = '<a href="' + get_edit_url(request, voucher) + '">' + nameCredit + '</a>'
|
|
||||||
|
|
||||||
body += '<tr class="Voucher{0}" id="{1}"><td class="Date">{2}</td><td class="VoucherType">{3}</td>' \
|
|
||||||
'<td class="NameDebit">{4}</td><td class="Debit right">\u20B9 {5:.2f}</td><td class="NameCredit">{6}' \
|
|
||||||
'</td><td class="Credit right">\u20B9 {7:.2f}</td><td class="Narration">{8}</td></tr>'.format(
|
|
||||||
('' if voucher.posted else ' unposted'), str(voucher.id),
|
|
||||||
voucher.date.strftime('%d-%b-%Y'), VoucherType.by_id(voucher.type).name, nameDebit, debit,
|
|
||||||
nameCredit, credit, voucher.narration)
|
|
||||||
return {'body': body, 'start_date': startDate, 'finish_date': finishDate,
|
|
||||||
'url': request.route_url('day_book', _query={'startDate': startDate, 'finishDate': finishDate})}
|
|
||||||
56
brewman/brewman/views/reports/daybook.py
Normal file
56
brewman/brewman/views/reports/daybook.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import datetime
|
||||||
|
from sqlalchemy.orm import joinedload_all
|
||||||
|
|
||||||
|
from pyramid.view import view_config
|
||||||
|
|
||||||
|
from brewman.models.voucher import Voucher, Journal, VoucherType
|
||||||
|
from brewman.views.services.session import services_session_period_finish, services_session_period_start
|
||||||
|
from brewman.views.transactions import get_edit_url
|
||||||
|
|
||||||
|
@view_config(request_method='GET', route_name='daybook', renderer='brewman:templates/angular_base.mako',
|
||||||
|
xhr=False)
|
||||||
|
def daybook_get(request):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
@view_config(request_method='GET', route_name='daybook', renderer='json', xhr=True)
|
||||||
|
def daybook_report(request):
|
||||||
|
start_date = request.GET.get('StartDate', None)
|
||||||
|
finish_date = request.GET.get('FinishDate', None)
|
||||||
|
if start_date and finish_date:
|
||||||
|
return build_report(request, start_date, finish_date)
|
||||||
|
else:
|
||||||
|
return {'StartDate': services_session_period_start(request),
|
||||||
|
'FinishDate': services_session_period_finish(request), 'Body': []}
|
||||||
|
|
||||||
|
|
||||||
|
def build_report(request, start_date, finish_date):
|
||||||
|
report = {'StartDate': start_date, 'FinishDate': finish_date, 'Body': []}
|
||||||
|
|
||||||
|
query = Voucher.query().options(joinedload_all(Voucher.journals, Journal.ledger, innerjoin=True))\
|
||||||
|
.filter(Voucher.date >= datetime.datetime.strptime(start_date, '%d-%b-%Y'))\
|
||||||
|
.filter(Voucher.date <= datetime.datetime.strptime(finish_date, '%d-%b-%Y'))\
|
||||||
|
.filter(Voucher.type != VoucherType.by_name('Issue').id)\
|
||||||
|
.order_by(Voucher.date).order_by(Voucher.last_edit_date).all()
|
||||||
|
|
||||||
|
for voucher in query:
|
||||||
|
debit = 0
|
||||||
|
credit = 0
|
||||||
|
nameDebit = ""
|
||||||
|
nameCredit = ""
|
||||||
|
for journal in voucher.journals:
|
||||||
|
if journal.debit == 1:
|
||||||
|
debit += journal.amount
|
||||||
|
nameDebit += "{0} / ".format(journal.ledger.name)
|
||||||
|
else:
|
||||||
|
credit += journal.amount
|
||||||
|
nameCredit += "{0} / ".format(journal.ledger.name)
|
||||||
|
nameDebit = nameDebit[:-3]
|
||||||
|
nameCredit = nameCredit[:-3]
|
||||||
|
|
||||||
|
report['Body'].append({'Date': voucher.date.strftime('%d-%b-%Y'), 'Url': get_edit_url(request, voucher),
|
||||||
|
'Type': VoucherType.by_id(voucher.type).name,
|
||||||
|
'Narration': voucher.narration, 'Posted': voucher.posted,
|
||||||
|
'DebitN': nameDebit, 'DebitA': "\u20B9\u00A0{0:.2f}".format(debit),
|
||||||
|
'CreditN': nameCredit,'CreditA': "\u20B9\u00A0{0:.2f}".format(credit)})
|
||||||
|
return report
|
||||||
@ -1,26 +1,22 @@
|
|||||||
import datetime
|
|
||||||
from sqlalchemy.orm import joinedload_all
|
from sqlalchemy.orm import joinedload_all
|
||||||
|
|
||||||
from pyramid.view import view_config
|
from pyramid.view import view_config
|
||||||
from brewman.helpers import Literal
|
|
||||||
|
|
||||||
from brewman.models.voucher import Voucher, Journal, VoucherType
|
from brewman.models.voucher import Voucher, Journal, VoucherType
|
||||||
from brewman.views.transactions import get_edit_url
|
from brewman.views.transactions import get_edit_url
|
||||||
|
|
||||||
@view_config(request_method='GET', route_name='unposted', renderer='brewman:templates/reports/unposted.pt')
|
@view_config(request_method='GET', route_name='unposted', renderer='brewman:templates/angular_base.mako',
|
||||||
def unposted(request):
|
xhr=False)
|
||||||
body = Literal(build_report(request))
|
def unposted_get(request):
|
||||||
|
return {}
|
||||||
|
|
||||||
return {'title': 'Day Book - Hops n Grains',
|
|
||||||
'pageclass': "page-blogpost page-sidebar-right",
|
|
||||||
'pagecontentclass': "page-content grid_12",
|
|
||||||
'page_header': '',
|
|
||||||
'body': body}
|
|
||||||
|
|
||||||
|
@view_config(request_method='GET', route_name='unposted', renderer='json', xhr=True)
|
||||||
|
def unposted_report(request):
|
||||||
|
return build_report(request)
|
||||||
|
|
||||||
def build_report(request):
|
def build_report(request):
|
||||||
editUrl = ''
|
body = []
|
||||||
body = ''
|
|
||||||
|
|
||||||
query = Voucher.query().options(joinedload_all(Voucher.journals, Journal.ledger, innerjoin=True))\
|
query = Voucher.query().options(joinedload_all(Voucher.journals, Journal.ledger, innerjoin=True))\
|
||||||
.filter(Voucher.posted == False)\
|
.filter(Voucher.posted == False)\
|
||||||
@ -42,12 +38,10 @@ def build_report(request):
|
|||||||
nameDebit = nameDebit[:-3]
|
nameDebit = nameDebit[:-3]
|
||||||
nameCredit = nameCredit[:-3]
|
nameCredit = nameCredit[:-3]
|
||||||
|
|
||||||
nameDebit = '<a href="' + get_edit_url(request, voucher) + '">' + nameDebit + '</a>'
|
body.append({'Date': voucher.date.strftime('%d-%b-%Y'), 'Url': get_edit_url(request, voucher),
|
||||||
nameCredit = '<a href="' + get_edit_url(request, voucher) + '">' + nameCredit + '</a>'
|
'Type': VoucherType.by_id(voucher.type).name,
|
||||||
|
'Narration': voucher.narration, 'Posted': voucher.posted,
|
||||||
|
'DebitN': nameDebit, 'DebitA': "\u20B9 {0:.2f}".format(debit),
|
||||||
|
'CreditN': nameCredit,'CreditA': "\u20B9 {0:.2f}".format(credit)})
|
||||||
|
|
||||||
body += '<tr class="Voucher" id="{0}"><td class="Date">{1}</td><td class="VoucherType">{2}</td>'\
|
|
||||||
'<td class="NameDebit">{3}</td><td class="Debit right">\u20B9 {4:.2f}</td><td class="NameCredit">{5}'\
|
|
||||||
'</td><td class="Credit right">\u20B9 {6:.2f}</td><td class="Narration">{7}</td></tr>'.format(
|
|
||||||
str(voucher.id), voucher.date.strftime('%d-%b-%Y'), VoucherType.by_id(voucher.type).name, nameDebit, debit,
|
|
||||||
nameCredit, credit, voucher.narration)
|
|
||||||
return body
|
return body
|
||||||
Reference in New Issue
Block a user