// ERPNext - web based ERP (http://erpnext.com)
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
// tree of chart of accounts / cost centers
// multiple companies
// add node
// edit node
// see ledger
pscript['onload_Accounts Browser'] = function(wrapper){
wn.require('lib/js/wn/ui/tree.js');
wrapper.appframe = new wn.ui.AppFrame($(wrapper).find('.appframe-area'));
wrapper.appframe.add_button('New Company', function() { newdoc('Company'); }, 'icon-plus');
wrapper.appframe.add_button('Refresh', function() {
wrapper.$company_select.change();
}, 'icon-refresh');
// company-select
wrapper.$company_select = $(' ')
.change(function() {
var ctype = wn.get_route()[1] || 'Account';
erpnext.account_chart = new erpnext.AccountsChart(ctype, $(this).val(), wrapper);
})
.appendTo(wrapper.appframe.$w.find('.appframe-toolbar'));
// default company
if(sys_defaults.company) {
$('')
.html(sys_defaults.company)
.attr('value', sys_defaults.company)
.appendTo(wrapper.$company_select);
wrapper.$company_select
.val(sys_defaults.company).change();
}
// load up companies
wn.call({
method:'accounts.page.accounts_browser.accounts_browser.get_companies',
callback: function(r) {
wrapper.$company_select.empty();
$.each(r.message, function(i, v) {
$(' ').html(v).attr('value', v).appendTo(wrapper.$company_select);
});
wrapper.$company_select.val(sys_defaults.company || r[0]);
}
});
}
pscript['onshow_Accounts Browser'] = function(wrapper){
// set route
var ctype = wn.get_route()[1] || 'Account';
wrapper.appframe.title('Chart of '+ctype+'s');
if(erpnext.account_chart && erpnext.account_chart.ctype != ctype) {
wrapper.$company_select.change();
}
}
erpnext.AccountsChart = Class.extend({
init: function(ctype, company, wrapper) {
$(wrapper).find('.tree-area').empty();
var me = this;
me.ctype = ctype;
me.company = company;
this.tree = new wn.ui.Tree({
parent: $(wrapper).find('.tree-area'),
label: company,
args: {ctype: ctype},
method: 'accounts.page.accounts_browser.accounts_browser.get_children',
click: function(link) {
if(me.cur_toolbar)
$(me.cur_toolbar).toggle(false);
if(!link.toolbar)
me.make_link_toolbar(link);
if(link.toolbar) {
me.cur_toolbar = link.toolbar;
$(me.cur_toolbar).toggle(true);
}
}
});
this.tree.rootnode.$a.click();
},
make_link_toolbar: function(link) {
var data = $(link).data('node-data');
if(!data) return;
link.toolbar = $(' ').insertAfter(link);
// edit
$('Edit ').appendTo(link.toolbar);
if(data.expandable) {
link.toolbar.append(' | Add Child ');
} else if(this.ctype=='Account') {
link.toolbar.append(' | View Ledger ');
}
},
show_ledger: function() {
var me = this;
var node = me.selected_node();
wn.set_route('Report', 'GL Entry', 'General Ledger',
this.ctype + '=' + node.data('label'));
},
new_node: function() {
if(this.ctype=='Account') {
this.new_account();
} else {
this.new_cost_center();
}
},
selected_node: function() {
return this.tree.$w.find('.tree-link.selected');
},
new_account: function() {
var me = this;
// the dialog
var d = new wn.ui.Dialog({
title:'New Account',
fields: [
{fieldtype:'Data', fieldname:'account_name', label:'New Account Name', reqd:true},
{fieldtype:'Select', fieldname:'group_or_ledger', label:'Group or Ledger',
options:'Group\nLedger'},
{fieldtype:'Select', fieldname:'account_type', label:'Account Type',
options: ['', 'Fixed Asset Account', 'Bank or Cash', 'Expense Account', 'Tax',
'Income Account', 'Chargeable'].join('\n') },
{fieldtype:'Float', fieldname:'tax_rate', label:'Tax Rate'},
{fieldtype:'Select', fieldname:'master_type', label:'Master Type',
options: ['NA', 'Supplier', 'Customer', 'Employee'].join('\n') },
{fieldtype:'Button', fieldname:'create_new', label:'Create New' }
]
})
var fd = d.fields_dict;
// account type if ledger
$(fd.group_or_ledger.input).change(function() {
if($(this).val()=='Group') {
$(fd.account_type.wrapper).toggle(false);
$(fd.master_type.wrapper).toggle(false);
$(fd.tax_rate.wrapper).toggle(false);
} else {
$(fd.account_type.wrapper).toggle(true);
$(fd.master_type.wrapper).toggle(true);
if(fd.account_type.get_value()=='Tax') {
$(fd.tax_rate.wrapper).toggle(true);
}
}
});
// tax rate if tax
$(fd.account_type.input).change(function() {
if($(this).val()=='Tax') {
$(fd.tax_rate.wrapper).toggle(true);
} else {
$(fd.tax_rate.wrapper).toggle(false);
}
})
// create
$(fd.create_new.input).click(function() {
var btn = this;
$(btn).set_working();
var v = d.get_values();
if(!v) return;
var node = me.selected_node();
v.parent_account = node.data('label');
v.company = me.company;
$c_obj('GL Control', 'add_ac', v,
function(r,rt) {
$(btn).done_working();
d.hide();
node.trigger('reload');
});
});
// show
d.onshow = function() {
$(fd.group_or_ledger.input).change();
}
d.show();
},
new_cost_center: function(){
var me = this;
// the dialog
var d = new wn.ui.Dialog({
title:'New Cost Center',
fields: [
{fieldtype:'Data', fieldname:'cost_center_name', label:'New Cost Center Name', reqd:true},
{fieldtype:'Select', fieldname:'group_or_ledger', label:'Group or Ledger',
options:'Group\nLedger'},
{fieldtype:'Button', fieldname:'create_new', label:'Create New' }
]
})
// create
$(d.fields_dict.create_new.input).click(function() {
var btn = this;
$(btn).set_working();
var v = d.get_values();
if(!v) return;
var node = me.selected_node();
v.parent_cost_center = node.data('label');
v.company_name = me.company;
$c_obj('GL Control', 'add_cc', v,
function(r,rt) {
$(btn).done_working();
d.hide();
node.trigger('reload');
});
});
d.show();
}
});
/*
pscript.make_chart = function(b, wrapper) {
pscript.ctype = b;
$(wrapper).find('.tree-area').empty()
$(wrapper).find('.layout-sidesection').empty()
//================== table body======================================
var ac_main_grid = make_table($i('ab_body'),1,2,'100%',['60%','40%'],{border:"0px", padding:"4px",tableLayout: "fixed", borderCollapse: "collapse"});
$y($td(ac_main_grid,0,0),{border: "1px solid #dddddd", padding: "8px"});
pscript.account_tree = $a($td(ac_main_grid,0,0),'div', '',{minHeight:'400px'});
$y($td(ac_main_grid,0,1),{border: "1px solid #DDD"});
pscript.la = $a($td(ac_main_grid,0,1),'div');
pscript.acc_period_bal = $a($td(ac_main_grid,0,1),'div');
//=====================footer area ==================================
if (pscript.ctype == 'Account') {
var footer = $a($i('ab_body'),'div','',{backgroundColor: "#FFD", padding: "8px", color: "#444", fontSize: "12px", marginTop: "14px"});
var help1 = $a(footer,'span');
help1.innerHTML = "Note: To create accounts for Customers and Suppliers, please create Customer and Supplier "
+ " Masters. This will ensure that the accounts are linked to your Selling and Buying Processes. The Account Heads for Customer and Supplier will automatically be created."
}
// header and toolbar
// ------------------
wrapper.appframe.$titlebar.find('.appframe-title').html('Chart of '+pscript.ctype+'s');
// select company
// --------------
var tab = make_table(select_area, 1, 2, null, [], {verticalAlign:'middle', padding: '2px'});
$td(tab,0,0).innerHTML = 'Select Company'.bold();
var sel = $a($td(tab,0,1),'select','',{width:'160px'});
// set tree
var set_tree = function() {
if(pscript.ac_tree) {
pscript.ac_tree.body.innerHTML = '';
}
pscript.make_ac_tree();
var cn = sel_val(sel);
var n = pscript.ac_tree.addNode(null, cn, null,pscript.ac_tree.std_onclick, pscript.ac_tree.std_onexp);
n.rec = {};
n.rec.name = 'Root Node';
n.rec.account_name = cn;
n.rec.cost_center_name = cn;
pscript.set_ac_head('',n.rec);
$ds(pscript.ac_head_area);
}
// select company
add_sel_options(sel, ['Loading...']);
var callback = function(r,rt) {
empty_select(sel);
add_sel_options(sel,r.message.cl,sys_defaults.company);
set_tree();
sel.onchange = function() { set_tree(); }
}
$c_obj('GL Control', 'get_companies', '', callback);
pscript.ab_company_sel = sel;
pscript.make_ac_head();
pscript.make_group_area();
pscript.make_ledger_area();
pscript.make_new_acc_dialog();
pscript.make_new_cost_center_dialog();
}
pscript.make_ac_tree = function() {
//var type= sel_val($i('ctype'))
var type= pscript.ctype;
var tree = new Tree(pscript.account_tree, '90%');
pscript.ac_tree = tree;
// on click
tree.std_onclick = function(node) {
pscript.cur_node = node;
// show ledger
pscript.set_ac_head(node.parent_account, node.rec,type);
}
// on expand
tree.std_onexp = function(node) {
if(node.expanded_once)return;
$ds(node.loading_div);
//set_ac_head
var callback = function(r,rt) {
$dh(node.loading_div);
var n = tree.allnodes[r.message.parent_acc_name];
var cl = r.message.cl;
if(type=='Account'){
for(var i=0;i