updates to general ledger, todo
diff --git a/erpnext/accounts/page/general_ledger/general_ledger.js b/erpnext/accounts/page/general_ledger/general_ledger.js
index 3a17f5c0..163306a 100644
--- a/erpnext/accounts/page/general_ledger/general_ledger.js
+++ b/erpnext/accounts/page/general_ledger/general_ledger.js
@@ -43,23 +43,23 @@
filters: [
{fieldtype:"Select", label: "Company", options:"Company", default_value: "Select Company...",
filter: function(val, item, opts) {
- return item.company == val || val == opts.default_value;
+ return item.company == val || val == opts.default_value || item._show;
}},
{fieldtype:"Select", label: "Account", options:"Account", default_value: "Select Account...",
filter: function(val, item, opts) {
- return item.account == val || val == opts.default_value;
+ return item.account == val || val == opts.default_value || item._show;
}},
{fieldtype:"Data", label: "Voucher No",
filter: function(val, item, opts) {
if(!val) return true;
- return item.voucher_no.indexOf(val)!=-1;
+ return (item.voucher_no && item.voucher_no.indexOf(val)!=-1) || item._show;
}},
{fieldtype:"Date", label: "From Date", filter: function(val, item) {
- return dateutil.user_to_obj(val) <= dateutil.str_to_obj(item.posting_date);
+ return item._show || dateutil.user_to_obj(val) <= dateutil.str_to_obj(item.posting_date);
}},
{fieldtype:"Label", label: "To"},
{fieldtype:"Date", label: "To Date", filter: function(val, item) {
- return dateutil.user_to_obj(val) >= dateutil.str_to_obj(item.posting_date);
+ return item._show || dateutil.user_to_obj(val) >= dateutil.str_to_obj(item.posting_date);
}},
{fieldtype:"Button", label: "Refresh", icon:"icon-refresh icon-white", cssClass:"btn-info"},
{fieldtype:"Button", label: "Reset Filters"}
@@ -79,7 +79,58 @@
this.filter_inputs.account.get(0).selectedIndex = 0;
},
prepare_data: function() {
- this.prepare_data_view(wn.report_dump.data["GL Entry"]);
+ // add Opening, Closing, Totals rows
+ // if filtered by account and / or voucher
+ var data = wn.report_dump.data["GL Entry"];
+
+ var account = this.filter_inputs.account.val();
+ var from_date = dateutil.user_to_obj(this.filter_inputs.from_date.val());
+ var to_date = dateutil.user_to_obj(this.filter_inputs.to_date.val());
+ var voucher_no = this.filter_inputs.voucher_no.val();
+ var default_account = this.filter_inputs.account.get(0).opts.default_value;
+
+ if(to_date < from_date) {
+ msgprint("From Date must be before To Date");
+ return;
+ }
+
+ var opening = {
+ account: "Opening", debit: 0.0, credit: 0.0,
+ id:"_opening", _show: true, _style: "font-weight: bold"
+ }
+ var totals = {
+ account: "Totals", debit: 0.0, credit: 0.0,
+ id:"_totals", _show: true, _style: "font-weight: bold"
+ }
+
+ $.each(data, function(i, item) {
+ if((account!=default_account ? item.account==account : true) &&
+ (voucher_no ? item.voucher_no==voucher_no : true)) {
+ var date = dateutil.str_to_obj(item.posting_date);
+ if(date < from_date) {
+ opening.debit += item.debit;
+ opening.credit += item.credit;
+ } else if(date <= to_date) {
+ totals.debit += item.debit;
+ totals.credit += item.credit;
+ }
+ }
+ })
+
+ var closing = {
+ account: "Closing (Opening + Totals)", debit: opening.debit + totals.debit,
+ credit: opening.credit + totals.credit,
+ id:"_closing", _show: true, _style: "font-weight: bold"
+ }
+
+
+ if(account != default_account) {
+ var out = [opening].concat(data).concat([totals, closing]);
+ } else {
+ var out = data.concat([totals]);
+ }
+
+ this.prepare_data_view(out);
},
});
diff --git a/erpnext/accounts/page/general_ledger/general_ledger.py b/erpnext/accounts/page/general_ledger/general_ledger.py
deleted file mode 100644
index f351978..0000000
--- a/erpnext/accounts/page/general_ledger/general_ledger.py
+++ /dev/null
@@ -1,10 +0,0 @@
-import webnotes
-
-@webnotes.whitelist()
-def get_chart():
- company = webnotes.form_dict.get('company')
- res = {}
- res["chart"] = webnotes.conn.sql("""select name, parent_account,
- if(debit_or_credit="Debit", "D", ""),
- if(is_pl_account="Yes", "Y", "") from
- tabAccount where company=%s and docstatus < 2 order by lft""", (company, ))
\ No newline at end of file
diff --git a/public/js/all-app.js b/public/js/all-app.js
index 60a4393..1d839b1 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -1082,12 +1082,16 @@
<a href="#" class="grid-report-export"><i class="icon icon-download-alt"></i> Export</a> \
</div>').appendTo(this.wrapper);this.wrapper.find(".grid-report-export").click(function(){return me.export();});this.grid_wrapper=$("<div style='height: 500px; border: 1px solid #aaa; \
background-color: #eee; margin-top: 15px;'>").appendTo(this.wrapper);this.id=wn.dom.set_unique_id(this.grid_wrapper.get(0));var me=this;$(wn.container.page).bind('show',function(){wn.cur_grid_report=me;me.apply_filters_from_route();me.refresh();});this.apply_filters_from_route();},load_filters:function(callback){callback();},make_filters:function(){var me=this;$.each(this.filters,function(i,v){v.fieldname=v.fieldname||v.label.replace(/ /g,'_').toLowerCase();var input=null;if(v.fieldtype=='Select'){input=me.appframe.add_select(v.label,[v.default_value]);}else if(v.fieldtype=='Button'){input=me.appframe.add_button(v.label);if(v.icon){$('<i class="icon '+v.icon+'"></i>').prependTo(input);}}else if(v.fieldtype=='Date'){input=me.appframe.add_date(v.label);}else if(v.fieldtype=='Label'){input=me.appframe.add_label(v.label);}else if(v.fieldtype=='Data'){input=me.appframe.add_data(v.label);}
-if(v.cssClass){input&&input.addClass(v.cssClass);}
-input&&(input.get(0).opts=v);me.filter_inputs[v.fieldname]=input;});},import_slickgrid:function(){wn.require('js/lib/slickgrid/slick.grid.css');wn.require('js/lib/slickgrid/slick-default-theme.css');wn.require('js/lib/slickgrid/jquery.event.drag.min.js');wn.require('js/lib/slickgrid/slick.core.js');wn.require('js/lib/slickgrid/slick.grid.js');wn.require('js/lib/slickgrid/slick.dataview.js');wn.dom.set_style('.slick-cell { font-size: 12px; }');},refresh:function(){this.render();},apply_filters_from_route:function(){var hash=window.location.hash;var me=this;if(hash.indexOf('/')!=-1){$.each(hash.split('/').splice(1).join('/').split('&'),function(i,f){var f=f.split("=");me.filter_inputs[f[0]].val(decodeURIComponent(f[1]));});}},set_route:function(){wn.set_route(wn.container.page.page_name,$.map(this.filter_inputs,function(v){var val=v.val();var opts=v.get(0).opts;if(val&&val!=opts.default_value)
+if(input){input&&(input.get(0).opts=v);if(v.cssClass){input.addClass(v.cssClass);}
+input.keypress(function(e){if(e.which==13){me.refresh();}})}
+me.filter_inputs[v.fieldname]=input;});},import_slickgrid:function(){wn.require('js/lib/slickgrid/slick.grid.css');wn.require('js/lib/slickgrid/slick-default-theme.css');wn.require('js/lib/slickgrid/jquery.event.drag.min.js');wn.require('js/lib/slickgrid/slick.core.js');wn.require('js/lib/slickgrid/slick.grid.js');wn.require('js/lib/slickgrid/slick.dataview.js');wn.dom.set_style('.slick-cell { font-size: 12px; }');},refresh:function(){this.render();},apply_filters_from_route:function(){var hash=window.location.hash;var me=this;if(hash.indexOf('/')!=-1){$.each(hash.split('/').splice(1).join('/').split('&'),function(i,f){var f=f.split("=");me.filter_inputs[f[0]].val(decodeURIComponent(f[1]));});}},set_route:function(){wn.set_route(wn.container.page.page_name,$.map(this.filter_inputs,function(v){var val=v.val();var opts=v.get(0).opts;if(val&&val!=opts.default_value)
return encodeURIComponent(opts.fieldname)
-+'='+encodeURIComponent(val);}).join('&'))},render:function(){this.waiting.toggle(false);if(!this.grid_wrapper)this.make_grid_wrapper();this.apply_link_formatters();this.prepare_data();this.grid=new Slick.Grid("#"+this.id,this.dataView,this.columns,this.options);this.dataView.onRowsChanged.subscribe(function(e,args){grid.invalidateRows(args.rows);grid.render();});this.dataView.onRowCountChanged.subscribe(function(e,args){grid.updateRowCount();grid.render();});},prepare_data_view:function(items){this.dataView=new Slick.Data.DataView({inlineFilters:true});this.dataView.beginUpdate();this.dataView.setItems(items);this.dataView.setFilter(this.dataview_filter);this.dataView.endUpdate();},export:function(){var me=this;var res=[$.map(this.columns,function(v){return v.name;})];var col_map=$.map(this.columns,function(v){return v.field;});for(var i=0,len=this.dataView.getLength();i<len;i++){var d=this.dataView.getItem(i);var row=$.map(col_map,function(col){return d[col];});res.push(row);}
++'='+encodeURIComponent(val);}).join('&'))},render:function(){this.waiting.toggle(false);if(!this.grid_wrapper)this.make_grid_wrapper();this.apply_link_formatters();this.prepare_data();this.grid=new Slick.Grid("#"+this.id,this.dataView,this.columns,this.options);this.dataView.onRowsChanged.subscribe(function(e,args){grid.invalidateRows(args.rows);grid.render();});this.dataView.onRowCountChanged.subscribe(function(e,args){grid.updateRowCount();grid.render();});},prepare_data_view:function(items){this.dataView=new Slick.Data.DataView({inlineFilters:true});this.dataView.beginUpdate();this.dataView.setItems(items);this.dataView.setFilter(this.dataview_filter);this.dataView.endUpdate();},export:function(){var me=this;var res=[$.map(this.columns,function(v){return v.name;})];var col_map=$.map(this.columns,function(v){return v.field;});for(var i=0,len=this.dataView.getLength();i<len;i++){var d=this.dataView.getItem(i);var row=[];$.each(col_map,function(i,col){var val=d[col];if(val===null||val===undefined){val=""}
+row.push(val);})
+res.push(row);}
wn.require("js/lib/downloadify/downloadify.min.js");wn.require("js/lib/downloadify/swfobject.js");var id=wn.dom.set_unique_id();var msgobj=msgprint('<p id="'+id+'">You must have Flash 10 installed to download this file.</p>');Downloadify.create(id,{filename:function(){return me.title+'.csv';},data:function(){return wn.to_csv(res);},swf:'js/lib/downloadify/downloadify.swf',downloadImage:'js/lib/downloadify/download.png',onComplete:function(){msgobj.hide();},onCancel:function(){msgobj.hide();},onError:function(){msgobj.hide();},width:100,height:30,transparent:true,append:false});return false;},options:{editable:false,enableColumnReorder:false},dataview_filter:function(item){var filters=wn.cur_grid_report.filter_inputs;for(i in filters){var filter=filters[i].get(0);if(filter.opts.filter&&!filter.opts.filter($(filter).val(),item,filter.opts)){return false;}}
-return true;},date_formatter:function(row,cell,value,columnDef,dataContext){return dateutil.str_to_user(value);},currency_formatter:function(row,cell,value,columnDef,dataContext){return"<div style='text-align: right;'>"+fmt_money(value)+"</div>";},text_formatter:function(row,cell,value,columnDef,dataContext){return"<span title='"+value+"'>"+value+"</div>";},apply_link_formatters:function(){var me=this;$.each(this.columns,function(i,col){if(col.link_formatter){col.formatter=function(row,cell,value,columnDef,dataContext){var link_formatter=wn.cur_grid_report.columns[cell].link_formatter;var html=repl('<a href="#" \
+return true;},date_formatter:function(row,cell,value,columnDef,dataContext){return dateutil.str_to_user(value);},currency_formatter:function(row,cell,value,columnDef,dataContext){return repl('<div style="text-align: right; %(_style)s">%(value)s</div>',{_style:dataContext._style||"",value:fmt_money(value)});},text_formatter:function(row,cell,value,columnDef,dataContext){return repl('<span style="%(_style)s" title="%(esc_value)s">%(value)s</span>',{_style:dataContext._style||"",esc_value:cstr(value).replace(/"/g,'\"'),value:cstr(value)});},apply_link_formatters:function(){var me=this;$.each(this.columns,function(i,col){if(col.link_formatter){col.formatter=function(row,cell,value,columnDef,dataContext){if(!value)return"";if(dataContext._show){return repl('<span style="%(_style)s">%(value)s</span>',{_style:dataContext._style||"",value:value});}
+var link_formatter=wn.cur_grid_report.columns[cell].link_formatter;var html=repl('<a href="#" \
onclick="wn.cur_grid_report.filter_inputs.%(col_name)s.val(\'%(value)s\'); \
wn.cur_grid_report.set_route(); return false;">\
%(value)s</a>',{value:value,col_name:link_formatter.filter_input,page_name:wn.container.page.page_name})