2013-11-20 07:29:58 +00:00
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
2013-08-05 09:29:54 +00:00
// License: GNU General Public License v3. See license.txt
2012-02-23 07:05:32 +00:00
2012-04-13 13:34:55 +00:00
// tree of chart of accounts / cost centers
// multiple companies
// add node
// edit node
// see ledger
2012-02-21 11:56:50 +00:00
2012-04-13 13:34:55 +00:00
pscript [ 'onload_Accounts Browser' ] = function ( wrapper ) {
2014-02-14 10:17:51 +00:00
frappe . ui . make _app _page ( {
2013-05-23 10:33:49 +00:00
parent : wrapper ,
single _column : true
} )
2013-06-14 06:03:01 +00:00
2013-05-23 10:33:49 +00:00
wrapper . appframe . add _module _icon ( "Accounts" ) ;
var main = $ ( wrapper ) . find ( ".layout-main" ) ,
chart _area = $ ( "<div>" )
2013-11-02 09:17:11 +00:00
. css ( { "margin-bottom" : "15px" , "min-height" : "200px" } )
2013-05-23 10:33:49 +00:00
. appendTo ( main ) ,
2013-09-30 19:38:30 +00:00
help _area = $ ( '<div class="well">' +
2014-02-14 10:17:51 +00:00
'<h4>' + frappe . _ ( 'Quick Help' ) + '</h4>' +
2013-09-30 19:38:30 +00:00
'<ol>' +
2014-02-14 10:17:51 +00:00
'<li>' + frappe . _ ( 'To add child nodes, explore tree and click on the node under which you want to add more nodes.' ) + '</li>' +
2013-09-30 19:38:30 +00:00
'<li>' +
2014-02-14 10:17:51 +00:00
frappe . _ ( 'Accounting Entries can be made against leaf nodes, called' ) +
'<b>' + frappe . _ ( 'Ledgers' ) + '</b>.' + frappe . _ ( 'Entries against' ) +
'<b>' + frappe . _ ( 'Groups' ) + '</b>' + frappe . _ ( 'are not allowed.' ) +
2013-09-30 19:38:30 +00:00
'</li>' +
2014-02-14 10:17:51 +00:00
'<li>' + frappe . _ ( 'Please do NOT create Account (Ledgers) for Customers and Suppliers. They are created directly from the Customer / Supplier masters.' ) + '</li>' +
2013-09-30 19:38:30 +00:00
'<li>' +
2014-02-14 10:17:51 +00:00
'<b>' + frappe . _ ( 'To create a Bank Account:' ) + '</b>' +
frappe . _ ( 'Go to the appropriate group (usually Application of Funds > Current Assets > Bank Accounts)' ) +
frappe . _ ( 'and create a new Account Ledger (by clicking on Add Child) of type "Bank or Cash"' ) +
2013-09-30 19:38:30 +00:00
'</li>' +
'<li>' +
2014-02-14 10:17:51 +00:00
'<b>' + frappe . _ ( 'To create a Tax Account:' ) + '</b>' +
frappe . _ ( 'Go to the appropriate group (usually Source of Funds > Current Liabilities > Taxes and Duties)' ) +
frappe . _ ( 'and create a new Account Ledger (by clicking on Add Child) of type "Tax" and do mention the Tax rate.' ) +
2013-09-30 19:38:30 +00:00
'</li>' +
'</ol>' +
2014-02-14 10:17:51 +00:00
'<p>' + frappe . _ ( 'Please setup your chart of accounts before you start Accounting Entries' ) + '</p></div>' ) . appendTo ( main ) ;
2012-09-10 08:43:01 +00:00
2014-02-14 10:17:51 +00:00
if ( frappe . boot . profile . can _create . indexOf ( "Company" ) !== - 1 ) {
wrapper . appframe . add _button ( frappe . _ ( 'New Company' ) , function ( ) { newdoc ( 'Company' ) ; } ,
2012-09-10 08:43:01 +00:00
'icon-plus' ) ;
}
2013-11-13 11:25:38 +00:00
wrapper . appframe . set _title _right ( 'Refresh' , function ( ) {
2012-04-16 13:06:46 +00:00
wrapper . $company _select . change ( ) ;
2013-11-13 11:25:38 +00:00
} ) ;
2012-04-13 06:31:23 +00:00
2012-04-13 13:34:55 +00:00
// company-select
2013-05-23 10:33:49 +00:00
wrapper . $company _select = wrapper . appframe . add _select ( "Company" , [ ] )
2012-04-13 13:34:55 +00:00
. change ( function ( ) {
2014-02-14 10:17:51 +00:00
var ctype = frappe . get _route ( ) [ 1 ] || 'Account' ;
2013-05-23 10:33:49 +00:00
erpnext . account _chart = new erpnext . AccountsChart ( ctype , $ ( this ) . val ( ) ,
chart _area . get ( 0 ) ) ;
2012-12-03 10:15:03 +00:00
pscript . set _title ( wrapper , ctype , $ ( this ) . val ( ) ) ;
2012-04-13 13:34:55 +00:00
} )
// load up companies
2014-02-14 10:17:51 +00:00
return frappe . call ( {
2013-12-12 13:42:19 +00:00
method : 'erpnext.accounts.page.accounts_browser.accounts_browser.get_companies' ,
2012-04-13 13:34:55 +00:00
callback : function ( r ) {
wrapper . $company _select . empty ( ) ;
$ . each ( r . message , function ( i , v ) {
$ ( '<option>' ) . html ( v ) . attr ( 'value' , v ) . appendTo ( wrapper . $company _select ) ;
} ) ;
2014-02-14 10:17:51 +00:00
wrapper . $company _select . val ( frappe . defaults . get _default ( "company" ) || r [ 0 ] ) . change ( ) ;
2012-04-13 13:34:55 +00:00
}
} ) ;
2011-06-08 09:07:15 +00:00
}
2012-12-03 10:15:03 +00:00
pscript . set _title = function ( wrapper , ctype , val ) {
if ( val ) {
wrapper . appframe . set _title ( 'Chart of ' + ctype + 's' + " - " + cstr ( val ) ) ;
} else {
wrapper . appframe . set _title ( 'Chart of ' + ctype + 's' ) ;
}
}
2012-04-13 13:34:55 +00:00
pscript [ 'onshow_Accounts Browser' ] = function ( wrapper ) {
// set route
2014-02-14 10:17:51 +00:00
var ctype = frappe . get _route ( ) [ 1 ] || 'Account' ;
2012-07-11 07:48:58 +00:00
2012-04-13 13:34:55 +00:00
if ( erpnext . account _chart && erpnext . account _chart . ctype != ctype ) {
wrapper . $company _select . change ( ) ;
2012-12-03 10:15:03 +00:00
}
pscript . set _title ( wrapper , ctype ) ;
2012-04-13 13:34:55 +00:00
}
erpnext . AccountsChart = Class . extend ( {
init : function ( ctype , company , wrapper ) {
2013-05-23 10:33:49 +00:00
$ ( wrapper ) . empty ( ) ;
2012-04-13 13:34:55 +00:00
var me = this ;
me . ctype = ctype ;
2014-02-14 10:17:51 +00:00
me . can _create = frappe . model . can _create ( this . ctype ) ;
me . can _delete = frappe . model . can _delete ( this . ctype ) ;
me . can _write = frappe . model . can _write ( this . ctype ) ;
2012-12-03 08:41:24 +00:00
2012-04-16 13:06:46 +00:00
me . company = company ;
2014-02-14 10:17:51 +00:00
this . tree = new frappe . ui . Tree ( {
2013-05-23 10:33:49 +00:00
parent : $ ( wrapper ) ,
2013-06-24 10:13:18 +00:00
label : ctype === "Account" ? "Accounts" : "Cost Centers" ,
2012-05-22 11:24:46 +00:00
args : { ctype : ctype , comp : company } ,
2013-12-12 13:42:19 +00:00
method : 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children' ,
2012-04-13 13:34:55 +00:00
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 ;
2012-12-06 06:39:52 +00:00
$ ( me . cur _toolbar ) . toggle ( true ) ;
2012-04-13 13:34:55 +00:00
}
2012-05-22 11:24:46 +00:00
// bold
2013-12-13 06:21:50 +00:00
$ ( '.bold' ) . removeClass ( 'bold' ) ; // deselect
$ ( link ) . parent ( ) . find ( '.balance-area:first' ) . addClass ( 'bold' ) ; // select
2012-12-06 06:39:52 +00:00
2012-05-22 11:24:46 +00:00
} ,
onrender : function ( treenode ) {
2013-03-13 07:23:00 +00:00
if ( ctype == 'Account' && treenode . data ) {
if ( treenode . data . balance ) {
2013-12-13 06:21:50 +00:00
treenode . parent . append ( '<span class="balance-area pull-right">'
2013-03-13 07:23:00 +00:00
+ format _currency ( treenode . data . balance , treenode . data . currency )
+ '</span>' ) ;
2012-06-29 13:37:20 +00:00
}
2012-05-31 08:02:45 +00:00
}
2012-04-13 13:34:55 +00:00
}
} ) ;
2012-05-22 11:24:46 +00:00
this . tree . rootnode . $a . click ( ) ;
2012-04-13 13:34:55 +00:00
} ,
make _link _toolbar : function ( link ) {
var data = $ ( link ) . data ( 'node-data' ) ;
if ( ! data ) return ;
2013-12-13 06:21:50 +00:00
link . toolbar = $ ( '<span class="tree-node-toolbar highlight"></span>' ) . insertAfter ( link ) ;
2012-08-23 13:03:58 +00:00
var node _links = [ ] ;
2012-04-13 13:34:55 +00:00
// edit
2014-02-14 10:17:51 +00:00
if ( frappe . model . can _read ( this . ctype ) !== - 1 ) {
node _links . push ( '<a onclick="erpnext.account_chart.open();">' + frappe . _ ( 'Edit' ) + '</a>' ) ;
2012-04-17 07:10:37 +00:00
}
2014-02-14 10:17:51 +00:00
if ( data . expandable && frappe . boot . profile . in _create . indexOf ( this . ctype ) !== - 1 ) {
node _links . push ( '<a onclick="erpnext.account_chart.new_node();">' + frappe . _ ( 'Add Child' ) + '</a>' ) ;
} else if ( this . ctype === 'Account' && frappe . boot . profile . can _read . indexOf ( "GL Entry" ) !== - 1 ) {
node _links . push ( '<a onclick="erpnext.account_chart.show_ledger();">' + frappe . _ ( 'View Ledger' ) + '</a>' ) ;
2012-08-23 13:03:58 +00:00
}
2012-12-03 08:41:24 +00:00
2012-12-06 06:39:52 +00:00
if ( this . can _write ) {
2014-02-14 10:17:51 +00:00
node _links . push ( '<a onclick="erpnext.account_chart.rename()">' + frappe . _ ( 'Rename' ) + '</a>' ) ;
2012-12-03 08:41:24 +00:00
} ;
2012-12-06 06:39:52 +00:00
if ( this . can _delete ) {
2014-02-14 10:17:51 +00:00
node _links . push ( '<a onclick="erpnext.account_chart.delete()">' + frappe . _ ( 'Delete' ) + '</a>' ) ;
2012-12-03 08:41:24 +00:00
} ;
2012-08-23 13:03:58 +00:00
link . toolbar . append ( node _links . join ( " | " ) ) ;
2012-04-13 13:34:55 +00:00
} ,
2012-12-06 06:39:52 +00:00
open : function ( ) {
var node = this . selected _node ( ) ;
2014-02-14 10:17:51 +00:00
frappe . set _route ( "Form" , this . ctype , node . data ( "label" ) ) ;
2012-12-06 06:39:52 +00:00
} ,
2012-04-16 13:06:46 +00:00
show _ledger : function ( ) {
var me = this ;
var node = me . selected _node ( ) ;
2014-02-14 10:17:51 +00:00
frappe . route _options = {
2013-08-08 13:19:58 +00:00
"account" : node . data ( 'label' ) ,
"from_date" : sys _defaults . year _start _date ,
2013-12-23 11:37:57 +00:00
"to_date" : sys _defaults . year _end _date ,
"company" : me . company
2013-08-08 13:19:58 +00:00
} ;
2014-02-14 10:17:51 +00:00
frappe . set _route ( "query-report" , "General Ledger" ) ;
2012-04-16 13:06:46 +00:00
} ,
2012-12-03 08:41:24 +00:00
rename : function ( ) {
2012-12-06 06:39:52 +00:00
var node = this . selected _node ( ) ;
2014-02-14 10:17:51 +00:00
frappe . model . rename _doc ( this . ctype , node . data ( 'label' ) , function ( new _name ) {
2013-03-26 11:45:49 +00:00
node . parents ( "ul:first" ) . parent ( ) . find ( ".tree-link:first" ) . trigger ( "reload" ) ;
2012-12-06 06:39:52 +00:00
} ) ;
2012-12-03 08:41:24 +00:00
} ,
delete : function ( ) {
2012-12-06 06:39:52 +00:00
var node = this . selected _node ( ) ;
2014-02-14 10:17:51 +00:00
frappe . model . delete _doc ( this . ctype , node . data ( 'label' ) , function ( ) {
2012-12-03 08:41:24 +00:00
node . parent ( ) . remove ( ) ;
} ) ;
} ,
2012-04-16 13:06:46 +00:00
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' ) ;
} ,
2012-04-13 13:34:55 +00:00
new _account : function ( ) {
2012-04-16 13:06:46 +00:00
var me = this ;
// the dialog
2014-02-14 10:17:51 +00:00
var d = new frappe . ui . Dialog ( {
title : frappe . _ ( 'New Account' ) ,
2012-04-16 13:06:46 +00:00
fields : [
2014-02-14 10:17:51 +00:00
{ fieldtype : 'Data' , fieldname : 'account_name' , label : frappe . _ ( 'New Account Name' ) , reqd : true ,
description : frappe . _ ( "Name of new Account. Note: Please don't create accounts for Customers and Suppliers," ) +
frappe . _ ( "they are created automatically from the Customer and Supplier master" ) } ,
{ fieldtype : 'Select' , fieldname : 'group_or_ledger' , label : frappe . _ ( 'Group or Ledger' ) ,
options : 'Group\nLedger' , description : frappe . _ ( 'Further accounts can be made under Groups,' ) +
frappe . _ ( 'but entries can be made against Ledger' ) } ,
{ fieldtype : 'Select' , fieldname : 'account_type' , label : frappe . _ ( 'Account Type' ) ,
2012-04-16 13:06:46 +00:00
options : [ '' , 'Fixed Asset Account' , 'Bank or Cash' , 'Expense Account' , 'Tax' ,
2012-11-15 09:41:15 +00:00
'Income Account' , 'Chargeable' ] . join ( '\n' ) ,
2014-02-14 10:17:51 +00:00
description : frappe . _ ( "Optional. This setting will be used to filter in various transactions." ) } ,
{ fieldtype : 'Float' , fieldname : 'tax_rate' , label : frappe . _ ( 'Tax Rate' ) } ,
{ fieldtype : 'Button' , fieldname : 'create_new' , label : frappe . _ ( 'Create New' ) }
2012-04-16 13:06:46 +00:00
]
} )
2012-04-13 13:34:55 +00:00
2012-04-16 13:06:46 +00:00
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 . tax _rate . wrapper ) . toggle ( false ) ;
} else {
$ ( fd . account _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' ) {
2012-11-29 12:59:56 +00:00
$ ( fd . tax _rate . wrapper ) . toggle ( true ) ;
2012-04-16 13:06:46 +00:00
} else {
2012-11-29 12:59:56 +00:00
$ ( fd . tax _rate . wrapper ) . toggle ( false ) ;
2012-04-16 13:06:46 +00:00
}
} )
// 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' ) ;
2012-07-11 09:09:33 +00:00
v . master _type = '' ;
2012-04-16 13:06:46 +00:00
v . company = me . company ;
2014-02-14 10:17:51 +00:00
return frappe . call ( {
2013-01-30 13:46:13 +00:00
args : v ,
2013-12-12 13:42:19 +00:00
method : 'erpnext.accounts.utils.add_ac' ,
2013-01-30 13:46:13 +00:00
callback : function ( r ) {
2012-04-16 13:06:46 +00:00
$ ( btn ) . done _working ( ) ;
d . hide ( ) ;
2013-01-30 13:46:13 +00:00
node . trigger ( 'reload' ) ;
}
} ) ;
2012-04-16 13:06:46 +00:00
} ) ;
// show
d . onshow = function ( ) {
$ ( fd . group _or _ledger . input ) . change ( ) ;
2012-11-29 12:59:56 +00:00
$ ( fd . account _type . input ) . change ( ) ;
2012-04-16 13:06:46 +00:00
}
2012-12-03 08:41:24 +00:00
$ ( fd . group _or _ledger . input ) . val ( "Ledger" ) . change ( ) ;
2012-04-16 13:06:46 +00:00
d . show ( ) ;
2012-04-13 13:34:55 +00:00
} ,
2012-04-16 13:06:46 +00:00
2012-04-13 13:34:55 +00:00
new _cost _center : function ( ) {
2012-04-16 13:06:46 +00:00
var me = this ;
// the dialog
2014-02-14 10:17:51 +00:00
var d = new frappe . ui . Dialog ( {
title : frappe . _ ( 'New Cost Center' ) ,
2012-04-16 13:06:46 +00:00
fields : [
2014-02-14 10:17:51 +00:00
{ fieldtype : 'Data' , fieldname : 'cost_center_name' , label : frappe . _ ( 'New Cost Center Name' ) , reqd : true } ,
{ fieldtype : 'Select' , fieldname : 'group_or_ledger' , label : frappe . _ ( 'Group or Ledger' ) ,
options : 'Group\nLedger' , description : frappe . _ ( 'Further accounts can be made under Groups,' ) +
frappe . _ ( 'but entries can be made against Ledger' ) } ,
{ fieldtype : 'Button' , fieldname : 'create_new' , label : frappe . _ ( 'Create New' ) }
2012-04-16 13:06:46 +00:00
]
2012-07-11 09:09:33 +00:00
} ) ;
2012-04-16 13:06:46 +00:00
// 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' ) ;
2013-07-09 10:15:38 +00:00
v . company = me . company ;
2012-04-16 13:06:46 +00:00
2014-02-14 10:17:51 +00:00
return frappe . call ( {
2013-01-30 13:46:13 +00:00
args : v ,
2013-12-12 13:42:19 +00:00
method : 'erpnext.accounts.utils.add_cc' ,
2013-01-30 13:46:13 +00:00
callback : function ( r ) {
2012-04-16 13:06:46 +00:00
$ ( btn ) . done _working ( ) ;
d . hide ( ) ;
2013-01-30 13:46:13 +00:00
node . trigger ( 'reload' ) ;
}
} ) ;
2012-04-16 13:06:46 +00:00
} ) ;
d . show ( ) ;
}
2012-05-22 11:24:46 +00:00
} ) ;