Stock Ledger Report
This commit is contained in:
parent
4156523175
commit
2ad0d424a9
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
@ -29,12 +29,26 @@ wn.pages['financial-analytics'].onload = function(wrapper) {
|
|||||||
erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
||||||
filters: [
|
filters: [
|
||||||
{fieldtype:"Select", label: "PL or BS", options:["Profit and Loss", "Balance Sheet"],
|
{fieldtype:"Select", label: "PL or BS", options:["Profit and Loss", "Balance Sheet"],
|
||||||
filter: function(val, item, opts) {
|
filter: function(val, item, opts, me) {
|
||||||
if(val=='Profit and Loss') {
|
if(item._show) return true;
|
||||||
return item.is_pl_account=='Yes' || item._show;
|
|
||||||
} else {
|
// pl or bs
|
||||||
return item.is_pl_account=='No' || item._show;
|
var out = (val=='Profit and Loss') ? item.is_pl_account=='Yes' : item.is_pl_account!='Yes';
|
||||||
}
|
if(!out) return false;
|
||||||
|
|
||||||
|
// show only non-zero values
|
||||||
|
if(!me.show_zero) {
|
||||||
|
for(var i=0, j=me.columns.length; i<j; i++) {
|
||||||
|
var col = me.columns[i];
|
||||||
|
if(col.formatter==me.currency_formatter) {
|
||||||
|
if(flt(item[col.field]) > 0.001) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}},
|
}},
|
||||||
{fieldtype:"Select", label: "Company", link:"Company", default_value: "Select Company...",
|
{fieldtype:"Select", label: "Company", link:"Company", default_value: "Select Company...",
|
||||||
filter: function(val, item, opts) {
|
filter: function(val, item, opts) {
|
||||||
@ -51,18 +65,15 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
{fieldtype:"Button", label: "Reset Filters"}
|
{fieldtype:"Button", label: "Reset Filters"}
|
||||||
],
|
],
|
||||||
setup_columns: function() {
|
setup_columns: function() {
|
||||||
this.columns = [
|
var std_columns = [
|
||||||
{id: "check", name: "Plot", field: "check", width: 30,
|
{id: "check", name: "Plot", field: "check", width: 30,
|
||||||
formatter: function(row, cell, value, columnDef, dataContext) {
|
formatter: this.check_formatter},
|
||||||
return repl("<input type='checkbox' account='%(name)s' \
|
|
||||||
class='plot-check' %(checked)s>", {
|
|
||||||
"name": dataContext.name,
|
|
||||||
"checked": dataContext.checked ? "checked" : ""
|
|
||||||
})
|
|
||||||
}},
|
|
||||||
{id: "name", name: "Account", field: "name", width: 300,
|
{id: "name", name: "Account", field: "name", width: 300,
|
||||||
formatter: this.account_formatter},
|
formatter: this.account_formatter},
|
||||||
|
{id: "opening", name: "Opening", field: "opening", hidden: true,
|
||||||
|
formatter: this.currency_formatter}
|
||||||
];
|
];
|
||||||
|
this.columns = [];
|
||||||
|
|
||||||
var me = this;
|
var me = this;
|
||||||
var range = this.filter_inputs.range.val();
|
var range = this.filter_inputs.range.val();
|
||||||
@ -70,27 +81,34 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
this.to_date = dateutil.user_to_str(this.filter_inputs.to_date.val());
|
this.to_date = dateutil.user_to_str(this.filter_inputs.to_date.val());
|
||||||
var date_diff = dateutil.get_diff(this.to_date, this.from_date);
|
var date_diff = dateutil.get_diff(this.to_date, this.from_date);
|
||||||
|
|
||||||
me.column_map = {};
|
me.column_map = {};
|
||||||
|
|
||||||
|
var add_column = function(date) {
|
||||||
|
me.columns.push({
|
||||||
|
id: date,
|
||||||
|
name: dateutil.str_to_user(date),
|
||||||
|
field: date,
|
||||||
|
formatter: me.currency_formatter,
|
||||||
|
width: 100
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var build_columns = function(condition) {
|
var build_columns = function(condition) {
|
||||||
|
// add column for each date range
|
||||||
for(var i=0; i < date_diff; i++) {
|
for(var i=0; i < date_diff; i++) {
|
||||||
var date = dateutil.add_days(me.from_date, i);
|
var date = dateutil.add_days(me.from_date, i);
|
||||||
if(!condition) condition = function() { return true; }
|
if(!condition) condition = function() { return true; }
|
||||||
|
|
||||||
if(condition(date)) {
|
if(condition(date)) add_column(date);
|
||||||
me.columns.push({
|
|
||||||
from_date: date,
|
|
||||||
id: date,
|
|
||||||
name: dateutil.str_to_user(date),
|
|
||||||
field: date,
|
|
||||||
formatter: me.currency_formatter,
|
|
||||||
width: 100
|
|
||||||
});
|
|
||||||
}
|
|
||||||
me.last_date = date;
|
me.last_date = date;
|
||||||
me.column_map[date] = me.columns[me.columns.length-1];
|
|
||||||
|
if(me.columns.length) {
|
||||||
|
me.column_map[date] = me.columns[me.columns.length-1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make columns for all date ranges
|
||||||
if(range=='Daily') {
|
if(range=='Daily') {
|
||||||
build_columns();
|
build_columns();
|
||||||
} else if(range=='Weekly') {
|
} else if(range=='Weekly') {
|
||||||
@ -110,13 +128,38 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
});
|
});
|
||||||
} else if(range=='Yearly') {
|
} else if(range=='Yearly') {
|
||||||
build_columns(function(date) {
|
build_columns(function(date) {
|
||||||
if(!me.last_date) return true;
|
if(!me.last_date) return true;
|
||||||
return $.map(wn.report_dump.data['Fiscal Year'], function(v) {
|
return $.map(wn.report_dump.data['Fiscal Year'], function(v) {
|
||||||
return date==v.year_start_date ? true : null;
|
return date==v.year_start_date ? true : null;
|
||||||
}).length;
|
}).length;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set label as last date of period
|
||||||
|
$.each(this.columns, function(i, col) {
|
||||||
|
col.name = me.columns[i+1]
|
||||||
|
? dateutil.str_to_user(dateutil.add_days(me.columns[i+1].id, -1))
|
||||||
|
: dateutil.str_to_user(me.to_date);
|
||||||
|
});
|
||||||
|
|
||||||
|
me.columns = std_columns.concat(me.columns);
|
||||||
|
},
|
||||||
|
setup_filters: function() {
|
||||||
|
var me = this;
|
||||||
|
this._super();
|
||||||
|
this.filter_inputs.pl_or_bs.change(function() {
|
||||||
|
me.filter_inputs.refresh.click();
|
||||||
|
});
|
||||||
|
this.wrapper.bind('make', function() {
|
||||||
|
me.wrapper.find('.show-zero').toggle(true).find('input').click(function(){
|
||||||
|
me.refresh();
|
||||||
|
});
|
||||||
|
me.wrapper.on("click", ".plot-check", function() {
|
||||||
|
var checked = $(this).attr("checked");
|
||||||
|
me.account_by_name[$(this).attr("data-id")].checked = checked ? true : false;
|
||||||
|
me.render_plot();
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
init_filter_values: function() {
|
init_filter_values: function() {
|
||||||
this._super();
|
this._super();
|
||||||
@ -127,7 +170,7 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
|
|
||||||
$.each(wn.report_dump.data['GL Entry'], function(i, gl) {
|
$.each(wn.report_dump.data['GL Entry'], function(i, gl) {
|
||||||
var posting_date = dateutil.str_to_obj(gl.posting_date);
|
var posting_date = dateutil.str_to_obj(gl.posting_date);
|
||||||
var account = me.accounts_by_name[gl.account];
|
var account = me.account_by_name[gl.account];
|
||||||
var col = me.column_map[gl.posting_date];
|
var col = me.column_map[gl.posting_date];
|
||||||
|
|
||||||
if(col) {
|
if(col) {
|
||||||
@ -162,38 +205,27 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
this.update_groups();
|
this.update_groups();
|
||||||
|
this.accounts_initialized = true;
|
||||||
|
this.show_zero = $('.show-zero input:checked').length;
|
||||||
},
|
},
|
||||||
add_balance: function(field, account, gl) {
|
add_balance: function(field, account, gl) {
|
||||||
account[field] = flt(account[field]) +
|
account[field] = flt(account[field]) +
|
||||||
((account.debit_or_credit == "Debit" ? 1 : -1) * (gl.debit - gl.credit))
|
((account.debit_or_credit == "Debit" ? 1 : -1) * (flt(gl.debit) - flt(gl.credit)))
|
||||||
},
|
},
|
||||||
init_account: function(d) {
|
init_account: function(d) {
|
||||||
|
// set 0 values for all columns
|
||||||
var me = this;
|
var me = this;
|
||||||
$.each(this.columns, function(i, col) {
|
$.each(this.columns, function(i, col) {
|
||||||
if (col.formatter==me.currency_formatter) {
|
if (col.formatter==me.currency_formatter) {
|
||||||
d[col.from_date] = 0;
|
d[col.id] = 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
|
||||||
init_refresh: function() {
|
// check for default graphs
|
||||||
var me = this;
|
if(!this.accounts_initialized && !d.parent_account) {
|
||||||
$.each(this.accounts || [], function(i, account) {
|
d.checked = true;
|
||||||
account.checked && me.preset_checks.push(account.name);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
init_plot: function() {
|
|
||||||
var me = this;
|
|
||||||
if(this.preset_checks.length) {
|
|
||||||
$.each(me.preset_checks, function(i, name) {
|
|
||||||
me.accounts_by_name[name].checked = true;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$.each(this.accounts, function(i, account) {
|
|
||||||
if(!account.parent_account) {
|
|
||||||
account.checked = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
get_plot_data: function() {
|
get_plot_data: function() {
|
||||||
var data = [];
|
var data = [];
|
||||||
@ -205,22 +237,35 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({
|
|||||||
data.push({
|
data.push({
|
||||||
label: account.name,
|
label: account.name,
|
||||||
data: $.map(me.columns, function(col, idx) {
|
data: $.map(me.columns, function(col, idx) {
|
||||||
if(col.formatter==me.currency_formatter)
|
if(col.formatter==me.currency_formatter && !col.hidden) {
|
||||||
return [[idx, account[col.field]]]
|
if (pl_or_bs == "Profit and Loss") {
|
||||||
})
|
return [[dateutil.str_to_obj(col.id).getTime(), account[col.field]],
|
||||||
|
[dateutil.user_to_obj(col.name).getTime(), account[col.field]]];
|
||||||
|
} else {
|
||||||
|
return [[dateutil.user_to_obj(col.name).getTime(), account[col.field]]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
points: {show: true},
|
||||||
|
lines: {show: true, fill: true},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(pl_or_bs == "Balance Sheet") {
|
||||||
|
// prepend opening for balance sheet accounts
|
||||||
|
data[data.length-1].data = [[dateutil.str_to_obj(me.from_date).getTime(),
|
||||||
|
account.opening]].concat(data[data.length-1].data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
add_grid_events: function() {
|
get_plot_options: function() {
|
||||||
this._super();
|
return {
|
||||||
var me = this;
|
grid: { hoverable: true, clickable: true },
|
||||||
this.wrapper.find('.plot-check').click(function() {
|
xaxis: { mode: "time",
|
||||||
var checked = $(this).attr("checked");
|
min: dateutil.str_to_obj(this.from_date).getTime(),
|
||||||
me.accounts_by_name[$(this).attr("account")].checked = checked ? true : false;
|
max: dateutil.str_to_obj(this.to_date).getTime() }
|
||||||
me.render_plot();
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
})
|
})
|
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
@ -1,3 +1,4 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
def execute():
|
def execute():
|
||||||
import webnotes
|
import webnotes
|
||||||
from webnotes.model.doc import addchild
|
from webnotes.model.doc import addchild
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
def execute():
|
def execute():
|
||||||
import webnotes
|
import webnotes
|
||||||
from webnotes.modules import reload_doc
|
from webnotes.modules import reload_doc
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
def execute():
|
def execute():
|
||||||
import webnotes
|
import webnotes
|
||||||
from webnotes.model.doc import addchild
|
from webnotes.model.doc import addchild
|
||||||
|
@ -38,5 +38,28 @@ data_map = {
|
|||||||
"Fiscal Year": {
|
"Fiscal Year": {
|
||||||
"columns": ["name", "year_start_date",
|
"columns": ["name", "year_start_date",
|
||||||
"adddate(adddate(year_start_date, interval 1 year), interval -1 day) as year_end_date"]
|
"adddate(adddate(year_start_date, interval 1 year), interval -1 day) as year_end_date"]
|
||||||
|
},
|
||||||
|
"Stock Ledger Entry": {
|
||||||
|
"columns": ["posting_date", "posting_time", "item_code", "warehouse", "actual_qty as qty",
|
||||||
|
"voucher_type", "voucher_no"],
|
||||||
|
"condition": ["ifnull(is_cancelled, 'No')='No'"],
|
||||||
|
"order_by": "posting_date, posting_time, name",
|
||||||
|
"links": {
|
||||||
|
"item_code": ["Item", "name"],
|
||||||
|
"warehouse": ["Warehouse", "name"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Item": {
|
||||||
|
"columns": ["name", "if(item_name=name, '', item_name) as item_name",
|
||||||
|
"item_group", "stock_uom", "brand"],
|
||||||
|
"order_by": "name"
|
||||||
|
},
|
||||||
|
"Item Group": {
|
||||||
|
"columns": ["name", "lft", "rgt", "parent_item_group"],
|
||||||
|
"order_by": "lft"
|
||||||
|
},
|
||||||
|
"Warehouse": {
|
||||||
|
"columns": ["name"],
|
||||||
|
"order_by": "name"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
def get_unread_messages():
|
def get_unread_messages():
|
||||||
|
1
erpnext/stock/page/stock_ledger/__init__.py
Normal file
1
erpnext/stock/page/stock_ledger/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
150
erpnext/stock/page/stock_ledger/stock_ledger.js
Normal file
150
erpnext/stock/page/stock_ledger/stock_ledger.js
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
wn.pages['stock-ledger'].onload = function(wrapper) {
|
||||||
|
wn.ui.make_app_page({
|
||||||
|
parent: wrapper,
|
||||||
|
title: 'Stock Ledger',
|
||||||
|
single_column: true
|
||||||
|
});
|
||||||
|
|
||||||
|
erpnext.stock_ledger = new wn.views.GridReport({
|
||||||
|
title: "Stock Ledger",
|
||||||
|
page: wrapper,
|
||||||
|
parent: $(wrapper).find('.layout-main'),
|
||||||
|
appframe: wrapper.appframe,
|
||||||
|
doctypes: ["Item", "Item Group", "Warehouse", "Stock Ledger Entry"],
|
||||||
|
|
||||||
|
setup_columns: function() {
|
||||||
|
this.columns = [
|
||||||
|
{id: "posting_datetime", name: "Posting Date", field: "posting_datetime", width: 120,
|
||||||
|
formatter: this.date_formatter},
|
||||||
|
{id: "item_code", name: "Item Code", field: "item_code", width: 160,
|
||||||
|
link_formatter: {
|
||||||
|
filter_input: "item_code",
|
||||||
|
open_btn: true,
|
||||||
|
doctype: '"Item"'
|
||||||
|
}},
|
||||||
|
{id: "warehouse", name: "Warehouse", field: "warehouse", width: 100,
|
||||||
|
link_formatter: {filter_input: "warehouse"}},
|
||||||
|
{id: "qty", name: "Qty", field: "qty", width: 100,
|
||||||
|
formatter: this.currency_formatter},
|
||||||
|
{id: "balance", name: "Balance", field: "balance", width: 100,
|
||||||
|
formatter: this.currency_formatter},
|
||||||
|
{id: "voucher_type", name: "Voucher Type", field: "voucher_type", width: 120},
|
||||||
|
{id: "voucher_no", name: "Voucher No", field: "voucher_no", width: 160,
|
||||||
|
link_formatter: {
|
||||||
|
filter_input: "voucher_no",
|
||||||
|
open_btn: true,
|
||||||
|
doctype: "dataContext.voucher_type"
|
||||||
|
}},
|
||||||
|
{id: "description", name: "Description", field: "description", width: 200,
|
||||||
|
formatter: this.text_formatter},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
filters: [
|
||||||
|
{fieldtype:"Select", label: "Warehouse", link:"Warehouse", default_value: "Select Warehouse...",
|
||||||
|
filter: function(val, item, opts) {
|
||||||
|
return item.warehouse == val || val == opts.default_value;
|
||||||
|
}},
|
||||||
|
{fieldtype:"Select", label: "Item Code", link:"Item", default_value: "Select Item...",
|
||||||
|
filter: function(val, item, opts) {
|
||||||
|
return item.item_code == val || val == opts.default_value;
|
||||||
|
}},
|
||||||
|
{fieldtype:"Data", label: "Voucher No",
|
||||||
|
filter: function(val, item, opts) {
|
||||||
|
if(!val) return true;
|
||||||
|
return (item.voucher_no && item.voucher_no.indexOf(val)!=-1);
|
||||||
|
}},
|
||||||
|
{fieldtype:"Date", label: "From Date", filter: function(val, item) {
|
||||||
|
return dateutil.str_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.str_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"}
|
||||||
|
],
|
||||||
|
init_filter_values: function() {
|
||||||
|
this.filter_inputs.warehouse.get(0).selectedIndex = 0;
|
||||||
|
this.filter_inputs.item_code.get(0).selectedIndex = 0;
|
||||||
|
this.filter_inputs.from_date.val(dateutil.str_to_user(sys_defaults.year_start_date));
|
||||||
|
this.filter_inputs.to_date.val(dateutil.str_to_user(sys_defaults.year_end_date));
|
||||||
|
this.filter_inputs.voucher_no.val("");
|
||||||
|
},
|
||||||
|
prepare_data: function() {
|
||||||
|
var me = this;
|
||||||
|
if(!this.item_by_name)
|
||||||
|
this.item_by_name = this.make_name_map(wn.report_dump.data["Item"]);
|
||||||
|
var data = wn.report_dump.data["Stock Ledger Entry"];
|
||||||
|
var out = [];
|
||||||
|
|
||||||
|
if(this.to_date < this.from_date) {
|
||||||
|
msgprint("From Date must be before To Date");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var opening = {
|
||||||
|
item_code: "On " + dateutil.str_to_user(this.from_date), qty: 0.0, balance: 0.0,
|
||||||
|
id:"_opening", _show: true, _style: "font-weight: bold"
|
||||||
|
}
|
||||||
|
var total_in = {
|
||||||
|
item_code: "Total In", qty: 0.0, balance: 0.0,
|
||||||
|
id:"_total_in", _show: true, _style: "font-weight: bold"
|
||||||
|
}
|
||||||
|
var total_out = {
|
||||||
|
item_code: "Total Out", qty: 0.0, balance: 0.0,
|
||||||
|
id:"_total_out", _show: true, _style: "font-weight: bold"
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear balance
|
||||||
|
$.each(wn.report_dump.data["Item"], function(i, item) { item.balance = 0.0; });
|
||||||
|
|
||||||
|
//
|
||||||
|
var t = new Date();
|
||||||
|
for(var i=0, j=data.length; i<j; i++) {
|
||||||
|
var sl = data[i];
|
||||||
|
sl.description = me.item_by_name[sl.item_code].description;
|
||||||
|
sl.posting_datetime = sl.posting_date + " " + sl.posting_time;
|
||||||
|
var posting_datetime = dateutil.str_to_obj(sl.posting_datetime);
|
||||||
|
|
||||||
|
// opening, transactions, closing, total in, total out
|
||||||
|
var before_end = posting_datetime <= dateutil.str_to_obj(me.to_date + " 23:59:59");
|
||||||
|
if((!me.is_default("item_code") ? me.apply_filter(sl, "item_code") : true)
|
||||||
|
&& me.apply_filter(sl, "warehouse") && me.apply_filter(sl, "voucher_no")) {
|
||||||
|
if(posting_datetime < dateutil.str_to_obj(me.from_date)) {
|
||||||
|
opening.balance += sl.qty;
|
||||||
|
} else if(before_end) {
|
||||||
|
if(sl.qty > 0) total_in.qty += sl.qty;
|
||||||
|
else total_out.qty += (-1 * sl.qty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!before_end) break;
|
||||||
|
|
||||||
|
// apply filters
|
||||||
|
if(me.dataview_filter(sl)) {
|
||||||
|
out.push(sl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update balance
|
||||||
|
if((!me.is_default("warehouse") ? me.apply_filter(sl, "warehouse") : true)) {
|
||||||
|
sl.balance = me.item_by_name[sl.item_code].balance + sl.qty;
|
||||||
|
me.item_by_name[sl.item_code].balance = sl.balance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(new Date() - t);
|
||||||
|
|
||||||
|
if(me.item_code != me.item_code_default && !me.voucher_no) {
|
||||||
|
var closing = {
|
||||||
|
item_code: "On " + dateutil.str_to_user(this.to_date),
|
||||||
|
balane: me.item_by_name[sl.item_code].balance, qty: 0,
|
||||||
|
id:"_closing", _show: true, _style: "font-weight: bold"
|
||||||
|
};
|
||||||
|
var out = [opening].concat(out).concat([total_in, total_out, closing]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.data = out;
|
||||||
|
this.prepare_data_view(out);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
28
erpnext/stock/page/stock_ledger/stock_ledger.txt
Normal file
28
erpnext/stock/page/stock_ledger/stock_ledger.txt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Page, stock-ledger
|
||||||
|
[
|
||||||
|
|
||||||
|
# These values are common in all dictionaries
|
||||||
|
{
|
||||||
|
u'creation': '2012-09-18 14:55:15',
|
||||||
|
u'docstatus': 0,
|
||||||
|
u'modified': '2012-09-18 14:55:15',
|
||||||
|
u'modified_by': u'Administrator',
|
||||||
|
u'owner': u'Administrator'
|
||||||
|
},
|
||||||
|
|
||||||
|
# These values are common for all Page
|
||||||
|
{
|
||||||
|
u'doctype': u'Page',
|
||||||
|
'module': u'Stock',
|
||||||
|
u'name': u'__common__',
|
||||||
|
'page_name': u'stock-ledger',
|
||||||
|
'standard': u'Yes',
|
||||||
|
'title': u'Stock Ledger'
|
||||||
|
},
|
||||||
|
|
||||||
|
# Page, stock-ledger
|
||||||
|
{
|
||||||
|
u'doctype': u'Page',
|
||||||
|
u'name': u'stock-ledger'
|
||||||
|
}
|
||||||
|
]
|
@ -0,0 +1 @@
|
|||||||
|
from __future__ import unicode_literals
|
@ -1072,28 +1072,36 @@ me.list.run();});this.dialog.show();},add_column:function(c){var w=$('<div style
|
|||||||
* lib/js/wn/views/grid_report.js
|
* lib/js/wn/views/grid_report.js
|
||||||
*/
|
*/
|
||||||
wn.provide("wn.report_dump");$.extend(wn.report_dump,{data:{},with_data:function(doctypes,callback,progress_bar){var missing=[];$.each(doctypes,function(i,v){if(!wn.report_dump.data[v])missing.push(v);})
|
wn.provide("wn.report_dump");$.extend(wn.report_dump,{data:{},with_data:function(doctypes,callback,progress_bar){var missing=[];$.each(doctypes,function(i,v){if(!wn.report_dump.data[v])missing.push(v);})
|
||||||
if(missing.length){wn.call({method:"webnotes.widgets.report_dump.get_data",args:{doctypes:missing},callback:function(r){$.each(r.message,function(doctype,doctype_data){var data=[];$.each(doctype_data.data,function(i,d){var row={};$.each(doctype_data.columns,function(idx,col){row[col]=d[idx];});row.id=doctype+"-"+i;data.push(row);});wn.report_dump.data[doctype]=data;});callback();},progress_bar:progress_bar})}else{callback();}}});wn.provide("wn.views");wn.views.GridReport=Class.extend({init:function(opts){this.filter_inputs={};this.preset_checks=[];$.extend(this,opts);this.wrapper=$('<div>').appendTo(this.parent);if(this.filters){this.make_filters();}
|
if(missing.length){wn.call({method:"webnotes.widgets.report_dump.get_data",args:{doctypes:missing},callback:function(r){$.each(r.message,function(doctype,doctype_data){var data=[];$.each(doctype_data.data,function(i,d){var row={};$.each(doctype_data.columns,function(idx,col){row[col]=d[idx];});row.id=row.name||doctype+"-"+i
|
||||||
this.make_waiting();this.import_slickgrid();var me=this;this.get_data();},get_data:function(){var me=this;wn.report_dump.with_data(this.doctypes,function(){me.setup_filters();me.init_filter_values();me.refresh();},this.wrapper.find(".progress .bar"));},setup_filters:function(){var me=this;$.each(me.filter_inputs,function(i,v){var opts=v.get(0).opts;if(opts.fieldtype=="Select"&&inList(me.doctypes,opts.link)){$(v).add_options($.map(wn.report_dump.data[opts.link],function(d){return d.name;}));}});this.filter_inputs.refresh&&this.filter_inputs.refresh.click(function(){me.set_route();});this.filter_inputs.reset_filters&&this.filter_inputs.reset_filters.click(function(){me.init_filter_values();me.set_route();});},make_waiting:function(){this.waiting=$('<div class="well" style="width: 63%; margin: 30px auto;">\
|
data.push(row);});wn.report_dump.data[doctype]=data;});$.each(r.message,function(doctype,doctype_data){if(doctype_data.links){$.each(wn.report_dump.data[doctype],function(row_idx,row){$.each(doctype_data.links,function(link_key,link){row[link_key]=wn.report_dump.data[link[0]][row[link_key]][link[1]];})})}});callback();},progress_bar:progress_bar})}else{callback();}}});wn.provide("wn.views");wn.views.GridReport=Class.extend({init:function(opts){this.filter_inputs={};this.preset_checks=[];$.extend(this,opts);this.wrapper=$('<div>').appendTo(this.parent);if(this.filters){this.make_filters();}
|
||||||
|
this.make_waiting();this.import_slickgrid();var me=this;this.get_data();},bind_show:function(){var me=this;$(this.page).bind('show',function(){wn.cur_grid_report=me;me.apply_filters_from_route();me.refresh();});},get_data:function(){var me=this;wn.report_dump.with_data(this.doctypes,function(){me.setup_filters();me.init_filter_values();me.refresh();},this.wrapper.find(".progress .bar"));},setup_filters:function(){var me=this;$.each(me.filter_inputs,function(i,v){var opts=v.get(0).opts;if(opts.fieldtype=="Select"&&inList(me.doctypes,opts.link)){$(v).add_options($.map(wn.report_dump.data[opts.link],function(d){return d.name;}));}});this.filter_inputs.refresh&&this.filter_inputs.refresh.click(function(){me.set_route();});this.filter_inputs.reset_filters&&this.filter_inputs.reset_filters.click(function(){me.init_filter_values();me.set_route();});},make_waiting:function(){this.waiting=$('<div class="well" style="width: 63%; margin: 30px auto;">\
|
||||||
<p style="text-align: center;">Loading Report...</p>\
|
<p style="text-align: center;">Loading Report...</p>\
|
||||||
<div class="progress progress-striped active">\
|
<div class="progress progress-striped active">\
|
||||||
<div class="bar" style="width: 10%"></div></div>').appendTo(this.wrapper);},make_grid_wrapper:function(){$('<div class="plot" style="margin-bottom: 15px; display: none; \
|
<div class="bar" style="width: 10%"></div></div>').appendTo(this.wrapper);},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.options||[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(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;});},load_filter_values:function(){var me=this;$.each(this.filter_inputs,function(i,f){var opts=f.get(0).opts;if(opts.fieldtype!='Button'){me[opts.fieldname]=f.val();if(opts.fieldtype=="Date"){me[opts.fieldname]=dateutil.user_to_str(me[opts.fieldname]);}else if(opts.fieldtype=="Select"){me[opts.fieldname+'_default']=opts.default_value;}}});},make_name_map:function(data,key){var map={};key=key||"name";$.each(data,function(i,v){map[v[key]]=v;})
|
||||||
|
return map;},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.waiting.toggle(false);if(!this.grid_wrapper)
|
||||||
|
this.make();this.setup_columns();this.apply_link_formatters();this.load_filter_values();this.prepare_data();this.render();this.render_plot();},make:function(){$('<div class="plot" style="margin-bottom: 15px; display: none; \
|
||||||
height: 300px; width: 100%;"></div>').appendTo(this.wrapper);$('<div style="text-align: right;"> \
|
height: 300px; width: 100%;"></div>').appendTo(this.wrapper);$('<div style="text-align: right;"> \
|
||||||
<a href="#" class="grid-report-print"><i class="icon icon-print"></i> Print</a> \
|
<a href="#" class="grid-report-print"><i class="icon icon-print"></i> Print</a> \
|
||||||
<span style="color: #aaa; margin: 0px 10px;"> | </span> \
|
<span style="color: #aaa; margin: 0px 10px;"> | </span> \
|
||||||
<a href="#" class="grid-report-export"><i class="icon icon-download-alt"></i> Export</a> \
|
<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; \
|
</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;$(this.page).bind('show',function(){wn.cur_grid_report=me;me.apply_filters_from_route();me.refresh();});wn.cur_grid_report=this;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.options||[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);}
|
background-color: #eee; margin-top: 15px;'>").appendTo(this.wrapper);this.id=wn.dom.set_unique_id(this.grid_wrapper.get(0));$('<div style="margin: 10px 0px; text-align: right; display: none" class="show-zero">\
|
||||||
if(input){input&&(input.get(0).opts=v);if(v.cssClass){input.addClass(v.cssClass);}
|
<input type="checkbox"> Show rows with zero values\
|
||||||
input.keypress(function(e){if(e.which==13){me.refresh();}})}
|
</div>').appendTo(this.wrapper);this.bind_show();wn.cur_grid_report=this;this.apply_filters_from_route();$(this.wrapper).trigger('make');},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("=");if(me.filter_inputs[f[0]]){me.filter_inputs[f[0]].val(decodeURIComponent(f[1]));}else{console.log("Invalid filter: "+f[0]);}});}},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)
|
||||||
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.init_refresh&&this.init_refresh();this.waiting.toggle(false);if(!this.grid_wrapper)
|
|
||||||
this.make_grid_wrapper();this.setup_columns();this.apply_link_formatters();this.prepare_data();this.init_plot&&this.init_plot();this.render();this.render_plot();},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("=");if(me.filter_inputs[f[0]]){me.filter_inputs[f[0]].val(decodeURIComponent(f[1]));}else{console.log("Invalid filter: "+f[0]);}});}},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)
|
return encodeURIComponent(opts.fieldname)
|
||||||
+'='+encodeURIComponent(val);}).join('&'))},render:function(){this.grid=new Slick.Grid("#"+this.id,this.dataView,this.columns,this.options);var me=this;this.dataView.onRowsChanged.subscribe(function(e,args){me.grid.invalidateRows(args.rows);me.grid.render();});this.dataView.onRowCountChanged.subscribe(function(e,args){me.grid.updateRowCount();me.grid.render();});this.add_grid_events&&this.add_grid_events();},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;})].concat(this.get_view_data());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;},render_plot:function(){if(!this.get_plot_data)return;wn.require('js/lib/flot/jquery.flot.js');$.plot(this.wrapper.find('.plot').toggle(true),this.get_plot_data());},get_view_data:function(){var res=[];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=""}
|
+'='+encodeURIComponent(val);}).join('&'))},render:function(){this.grid=new Slick.Grid("#"+this.id,this.dataView,$.map(this.columns,function(col){return!col.hidden?col:null;}),this.options);var me=this;this.dataView.onRowsChanged.subscribe(function(e,args){me.grid.invalidateRows(args.rows);me.grid.render();});this.dataView.onRowCountChanged.subscribe(function(e,args){me.grid.updateRowCount();me.grid.render();});this.add_grid_events&&this.add_grid_events();},prepare_data_view:function(items){this.dataView=new Slick.Data.DataView({inlineFilters:true});this.dataView.beginUpdate();this.dataView.setItems(items);this.dataView.endUpdate();},export:function(){var me=this;var res=[$.map(this.columns,function(v){return v.name;})].concat(this.get_view_data());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;},render_plot:function(){if(!this.get_plot_data)return;wn.require('js/lib/flot/jquery.flot.js');$.plot(this.wrapper.find('.plot').toggle(true),this.get_plot_data(),this.get_plot_options());this.setup_plot_hover();},setup_plot_hover:function(){var me=this;this.tooltip_id=wn.dom.set_unique_id();function showTooltip(x,y,contents){$('<div id="'+me.tooltip_id+'">'+contents+'</div>').css({position:'absolute',display:'none',top:y+5,left:x+5,border:'1px solid #fdd',padding:'2px','background-color':'#fee',opacity:0.80}).appendTo("body").fadeIn(200);}
|
||||||
|
this.previousPoint=null;this.wrapper.find('.plot').bind("plothover",function(event,pos,item){if(item){if(me.previousPoint!=item.dataIndex){me.previousPoint=item.dataIndex;$("#"+me.tooltip_id).remove();var x=dateutil.obj_to_user(new Date(item.datapoint[0])),y=fmt_money(item.datapoint[1]);showTooltip(item.pageX,item.pageY,item.series.label+" on "+x+" = "+y);}}
|
||||||
|
else{$("#"+me.tooltip_id).remove();me.previousPoint=null;}});},get_view_data:function(){var res=[];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);})
|
row.push(val);})
|
||||||
res.push(row);}
|
res.push(row);}
|
||||||
return res;},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,wn.cur_grid_report)){return false;}}
|
return res;},options:{editable:false,enableColumnReorder:false},dataview_filter:function(item){var filters=this.filter_inputs;if(item._show)return true;for(i in filters){if(!this.apply_filter(item,i))return false;}
|
||||||
if(wn.cur_grid_report.custom_dataview_filter){return wn.cur_grid_report.custom_dataview_filter(item);}
|
if(this.custom_dataview_filter){return this.custom_dataview_filter(item);}
|
||||||
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});}
|
return true;},apply_filter:function(item,fieldname){var filter=this.filter_inputs[fieldname].get(0);if(filter.opts.filter){if(!filter.opts.filter(this[filter.opts.fieldname],item,filter.opts,this)){return false;}}
|
||||||
|
return true;},is_default:function(fieldname){return this[fieldname]==this[fieldname+"_default"];},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)});},check_formatter:function(row,cell,value,columnDef,dataContext){return repl("<input type='checkbox' data-id='%(id)s' \
|
||||||
|
class='plot-check' %(checked)s>",{"id":dataContext.id,"checked":dataContext.checked?"checked":""})},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="#" \
|
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\'); \
|
onclick="wn.cur_grid_report.filter_inputs.%(col_name)s.val(\'%(value)s\'); \
|
||||||
wn.cur_grid_report.set_route(); return false;">\
|
wn.cur_grid_report.set_route(); return false;">\
|
||||||
@ -2272,7 +2280,7 @@ me.dialog.clear();me.dialog.show();}});
|
|||||||
*/
|
*/
|
||||||
wn.Application=Class.extend({init:function(){var me=this;if(window.app){wn.call({method:'startup',callback:function(r,rt){wn.provide('wn.boot');wn.boot=r;if(wn.boot.profile.name=='Guest'){window.location='index.html';return;}
|
wn.Application=Class.extend({init:function(){var me=this;if(window.app){wn.call({method:'startup',callback:function(r,rt){wn.provide('wn.boot');wn.boot=r;if(wn.boot.profile.name=='Guest'){window.location='index.html';return;}
|
||||||
me.startup();}})}else{this.startup();}},startup:function(){this.load_bootinfo();this.make_page_container();this.make_nav_bar();this.set_favicon();$(document).trigger('startup');if(wn.boot){wn.route();}
|
me.startup();}})}else{this.startup();}},startup:function(){this.load_bootinfo();this.make_page_container();this.make_nav_bar();this.set_favicon();$(document).trigger('startup');if(wn.boot){wn.route();}
|
||||||
$(document).trigger('app_ready');},load_bootinfo:function(){if(wn.boot){LocalDB.sync(wn.boot.docs);wn.control_panel=wn.boot.control_panel;this.set_globals();if(wn.boot.developer_mode){(console.warn||console.log)("LocalStorage is OFF for developer mode. Please build before going live.");}}else{this.set_as_guest();}},set_globals:function(){profile=wn.boot.profile;user=wn.boot.profile.name;user_fullname=wn.user_info(user).fullname;user_defaults=profile.defaults;user_roles=profile.roles;user_email=profile.email;sys_defaults=wn.boot.sysdefaults;},set_as_guest:function(){profile={name:'Guest'};user='Guest';user_fullname='Guest';user_defaults={};user_roles=['Guest'];user_email='';sys_defaults={};},make_page_container:function(){wn.container=new wn.views.Container();wn.views.make_403();wn.views.make_404();},make_nav_bar:function(){if(wn.boot){wn.container.wntoolbar=new wn.ui.toolbar.Toolbar();}},logout:function(){var me=this;me.logged_out=true;wn.call({method:'logout',callback:function(r){if(r.exc){console.log(r.exc);}
|
$(document).trigger('app_ready');},load_bootinfo:function(){if(wn.boot){LocalDB.sync(wn.boot.docs);wn.control_panel=wn.boot.control_panel;this.set_globals();if(wn.boot.developer_mode){console.log("LocalStorage is OFF for developer mode. Please build before going live.");}}else{this.set_as_guest();}},set_globals:function(){profile=wn.boot.profile;user=wn.boot.profile.name;user_fullname=wn.user_info(user).fullname;user_defaults=profile.defaults;user_roles=profile.roles;user_email=profile.email;sys_defaults=wn.boot.sysdefaults;},set_as_guest:function(){profile={name:'Guest'};user='Guest';user_fullname='Guest';user_defaults={};user_roles=['Guest'];user_email='';sys_defaults={};},make_page_container:function(){wn.container=new wn.views.Container();wn.views.make_403();wn.views.make_404();},make_nav_bar:function(){if(wn.boot){wn.container.wntoolbar=new wn.ui.toolbar.Toolbar();}},logout:function(){var me=this;me.logged_out=true;wn.call({method:'logout',callback:function(r){if(r.exc){console.log(r.exc);}
|
||||||
me.redirect_to_login();}})},redirect_to_login:function(){window.location.href='index.html';},set_favicon:function(){var link=$('link[type="image/x-icon"]').remove().attr("href");var favicon='\
|
me.redirect_to_login();}})},redirect_to_login:function(){window.location.href='index.html';},set_favicon:function(){var link=$('link[type="image/x-icon"]').remove().attr("href");var favicon='\
|
||||||
<link rel="shortcut icon" href="'+link+'" type="image/x-icon"> \
|
<link rel="shortcut icon" href="'+link+'" type="image/x-icon"> \
|
||||||
<link rel="icon" href="'+link+'" type="image/x-icon">'
|
<link rel="icon" href="'+link+'" type="image/x-icon">'
|
||||||
|
@ -699,7 +699,7 @@ if(errfld.length)msgprint('<b>Mandatory fields required in '+
|
|||||||
*/
|
*/
|
||||||
wn.Application=Class.extend({init:function(){var me=this;if(window.app){wn.call({method:'startup',callback:function(r,rt){wn.provide('wn.boot');wn.boot=r;if(wn.boot.profile.name=='Guest'){window.location='index.html';return;}
|
wn.Application=Class.extend({init:function(){var me=this;if(window.app){wn.call({method:'startup',callback:function(r,rt){wn.provide('wn.boot');wn.boot=r;if(wn.boot.profile.name=='Guest'){window.location='index.html';return;}
|
||||||
me.startup();}})}else{this.startup();}},startup:function(){this.load_bootinfo();this.make_page_container();this.make_nav_bar();this.set_favicon();$(document).trigger('startup');if(wn.boot){wn.route();}
|
me.startup();}})}else{this.startup();}},startup:function(){this.load_bootinfo();this.make_page_container();this.make_nav_bar();this.set_favicon();$(document).trigger('startup');if(wn.boot){wn.route();}
|
||||||
$(document).trigger('app_ready');},load_bootinfo:function(){if(wn.boot){LocalDB.sync(wn.boot.docs);wn.control_panel=wn.boot.control_panel;this.set_globals();if(wn.boot.developer_mode){(console.warn||console.log)("LocalStorage is OFF for developer mode. Please build before going live.");}}else{this.set_as_guest();}},set_globals:function(){profile=wn.boot.profile;user=wn.boot.profile.name;user_fullname=wn.user_info(user).fullname;user_defaults=profile.defaults;user_roles=profile.roles;user_email=profile.email;sys_defaults=wn.boot.sysdefaults;},set_as_guest:function(){profile={name:'Guest'};user='Guest';user_fullname='Guest';user_defaults={};user_roles=['Guest'];user_email='';sys_defaults={};},make_page_container:function(){wn.container=new wn.views.Container();wn.views.make_403();wn.views.make_404();},make_nav_bar:function(){if(wn.boot){wn.container.wntoolbar=new wn.ui.toolbar.Toolbar();}},logout:function(){var me=this;me.logged_out=true;wn.call({method:'logout',callback:function(r){if(r.exc){console.log(r.exc);}
|
$(document).trigger('app_ready');},load_bootinfo:function(){if(wn.boot){LocalDB.sync(wn.boot.docs);wn.control_panel=wn.boot.control_panel;this.set_globals();if(wn.boot.developer_mode){console.log("LocalStorage is OFF for developer mode. Please build before going live.");}}else{this.set_as_guest();}},set_globals:function(){profile=wn.boot.profile;user=wn.boot.profile.name;user_fullname=wn.user_info(user).fullname;user_defaults=profile.defaults;user_roles=profile.roles;user_email=profile.email;sys_defaults=wn.boot.sysdefaults;},set_as_guest:function(){profile={name:'Guest'};user='Guest';user_fullname='Guest';user_defaults={};user_roles=['Guest'];user_email='';sys_defaults={};},make_page_container:function(){wn.container=new wn.views.Container();wn.views.make_403();wn.views.make_404();},make_nav_bar:function(){if(wn.boot){wn.container.wntoolbar=new wn.ui.toolbar.Toolbar();}},logout:function(){var me=this;me.logged_out=true;wn.call({method:'logout',callback:function(r){if(r.exc){console.log(r.exc);}
|
||||||
me.redirect_to_login();}})},redirect_to_login:function(){window.location.href='index.html';},set_favicon:function(){var link=$('link[type="image/x-icon"]').remove().attr("href");var favicon='\
|
me.redirect_to_login();}})},redirect_to_login:function(){window.location.href='index.html';},set_favicon:function(){var link=$('link[type="image/x-icon"]').remove().attr("href");var favicon='\
|
||||||
<link rel="shortcut icon" href="'+link+'" type="image/x-icon"> \
|
<link rel="shortcut icon" href="'+link+'" type="image/x-icon"> \
|
||||||
<link rel="icon" href="'+link+'" type="image/x-icon">'
|
<link rel="icon" href="'+link+'" type="image/x-icon">'
|
||||||
|
@ -75,24 +75,31 @@ erpnext.AccountTreeGrid = wn.views.GridReport.extend({
|
|||||||
this.filter_inputs.to_date.val(dateutil.str_to_user(sys_defaults.year_end_date));
|
this.filter_inputs.to_date.val(dateutil.str_to_user(sys_defaults.year_end_date));
|
||||||
},
|
},
|
||||||
prepare_data: function() {
|
prepare_data: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
var data = [];
|
if(this.accounts) {
|
||||||
var parent_map = {};
|
// refresh -- only initialize
|
||||||
var data_by_name = {};
|
$.each(this.accounts, function(i, d) {
|
||||||
$.each(wn.report_dump.data["Account"], function(i, v) {
|
me.init_account(d);
|
||||||
var d = copy_dict(v);
|
})
|
||||||
me.init_account(d);
|
} else {
|
||||||
|
// make accounts list
|
||||||
|
me.accounts = [];
|
||||||
|
me.parent_map = {};
|
||||||
|
me.account_by_name = {};
|
||||||
|
|
||||||
data.push(d);
|
$.each(wn.report_dump.data["Account"], function(i, v) {
|
||||||
data_by_name[d.name] = d;
|
var d = copy_dict(v);
|
||||||
if(d.parent_account) {
|
|
||||||
parent_map[d.name] = d.parent_account;
|
me.accounts.push(d);
|
||||||
}
|
me.account_by_name[d.name] = d;
|
||||||
});
|
if(d.parent_account) {
|
||||||
this.set_indent(data, parent_map);
|
me.parent_map[d.name] = d.parent_account;
|
||||||
this.accounts = data;
|
}
|
||||||
this.parent_map = parent_map;
|
|
||||||
this.accounts_by_name = data_by_name;
|
me.init_account(d);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.set_indent();
|
||||||
this.prepare_balances();
|
this.prepare_balances();
|
||||||
this.prepare_data_view(this.accounts);
|
this.prepare_data_view(this.accounts);
|
||||||
},
|
},
|
||||||
@ -122,7 +129,7 @@ erpnext.AccountTreeGrid = wn.views.GridReport.extend({
|
|||||||
|
|
||||||
$.each(gl, function(i, v) {
|
$.each(gl, function(i, v) {
|
||||||
var posting_date = dateutil.str_to_obj(v.posting_date);
|
var posting_date = dateutil.str_to_obj(v.posting_date);
|
||||||
var account = me.accounts_by_name[v.account];
|
var account = me.account_by_name[v.account];
|
||||||
me.update_balances(account, posting_date, v)
|
me.update_balances(account, posting_date, v)
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -159,16 +166,20 @@ erpnext.AccountTreeGrid = wn.views.GridReport.extend({
|
|||||||
var me= this;
|
var me= this;
|
||||||
$.each(this.accounts, function(i, account) {
|
$.each(this.accounts, function(i, account) {
|
||||||
// update groups
|
// update groups
|
||||||
var parent = me.parent_map[account.name];
|
if(account.rgt - account.lft == 1) {
|
||||||
while(parent) {
|
var parent = me.parent_map[account.name];
|
||||||
parent_account = me.accounts_by_name[parent];
|
while(parent) {
|
||||||
$.each(me.columns, function(c, col) {
|
parent_account = me.account_by_name[parent];
|
||||||
if (col.formatter == me.currency_formatter) {
|
$.each(me.columns, function(c, col) {
|
||||||
parent_account[col.field] += account[col.field];
|
if (col.formatter == me.currency_formatter) {
|
||||||
}
|
parent_account[col.field] =
|
||||||
});
|
flt(parent_account[col.field])
|
||||||
parent = me.parent_map[parent];
|
+ flt(account[col.field]);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
parent = me.parent_map[parent];
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -192,14 +203,15 @@ erpnext.AccountTreeGrid = wn.views.GridReport.extend({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
set_indent: function(data, parent_map) {
|
set_indent: function() {
|
||||||
$.each(data, function(i, d) {
|
var me = this;
|
||||||
|
$.each(this.accounts, function(i, d) {
|
||||||
var indent = 0;
|
var indent = 0;
|
||||||
var parent = parent_map[d.name];
|
var parent = me.parent_map[d.name];
|
||||||
if(parent) {
|
if(parent) {
|
||||||
while(parent) {
|
while(parent) {
|
||||||
indent++;
|
indent++;
|
||||||
parent = parent_map[parent];
|
parent = me.parent_map[parent];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d.indent = indent;
|
d.indent = indent;
|
||||||
@ -248,7 +260,7 @@ erpnext.AccountTreeGrid = wn.views.GridReport.extend({
|
|||||||
if (item.parent_account) {
|
if (item.parent_account) {
|
||||||
var parent = item.parent_account;
|
var parent = item.parent_account;
|
||||||
while (parent) {
|
while (parent) {
|
||||||
if (wn.cur_grid_report.accounts_by_name[parent]._collapsed) {
|
if (wn.cur_grid_report.account_by_name[parent]._collapsed) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
parent = wn.cur_grid_report.parent_map[parent];
|
parent = wn.cur_grid_report.parent_map[parent];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user