2013-11-20 12:59:58 +05:30
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
2013-08-05 14:59:54 +05:30
// License: GNU General Public License v3. See license.txt
2012-02-23 12:35:32 +05:30
2012-04-13 19:04:55 +05:30
// tree of chart of accounts / cost centers
// multiple companies
// add node
// edit node
// see ledger
2012-02-21 17:26:50 +05:30
2012-04-13 19:04:55 +05:30
pscript [ 'onload_Accounts Browser' ] = function ( wrapper ) {
2014-02-14 15:47:51 +05:30
frappe . ui . make _app _page ( {
2013-05-23 16:03:49 +05:30
parent : wrapper ,
single _column : true
} )
2013-06-14 11:33:01 +05:30
2013-05-23 16:03:49 +05:30
wrapper . appframe . add _module _icon ( "Accounts" ) ;
var main = $ ( wrapper ) . find ( ".layout-main" ) ,
chart _area = $ ( "<div>" )
2013-11-02 14:47:11 +05:30
. css ( { "margin-bottom" : "15px" , "min-height" : "200px" } )
2013-05-23 16:03:49 +05:30
. appendTo ( main ) ,
2013-09-30 16:38:30 -03:00
help _area = $ ( '<div class="well">' +
2014-02-14 15:47:51 +05:30
'<h4>' + frappe . _ ( 'Quick Help' ) + '</h4>' +
2013-09-30 16:38:30 -03:00
'<ol>' +
2014-02-14 15:47:51 +05:30
'<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 16:38:30 -03:00
'<li>' +
2014-02-14 15:47:51 +05:30
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 16:38:30 -03:00
'</li>' +
2014-02-14 15:47:51 +05:30
'<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 16:38:30 -03:00
'<li>' +
2014-02-14 15:47:51 +05:30
'<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 16:38:30 -03:00
'</li>' +
'<li>' +
2014-02-14 15:47:51 +05:30
'<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 16:38:30 -03:00
'</li>' +
'</ol>' +
2014-02-14 15:47:51 +05:30
'<p>' + frappe . _ ( 'Please setup your chart of accounts before you start Accounting Entries' ) + '</p></div>' ) . appendTo ( main ) ;
2012-09-10 14:13:01 +05:30
2014-03-11 16:15:05 +05:30
if ( frappe . boot . user . can _create . indexOf ( "Company" ) !== - 1 ) {
2014-02-14 15:47:51 +05:30
wrapper . appframe . add _button ( frappe . _ ( 'New Company' ) , function ( ) { newdoc ( 'Company' ) ; } ,
2012-09-10 14:13:01 +05:30
'icon-plus' ) ;
}
2013-11-13 16:55:38 +05:30
wrapper . appframe . set _title _right ( 'Refresh' , function ( ) {
2012-04-16 18:36:46 +05:30
wrapper . $company _select . change ( ) ;
2013-11-13 16:55:38 +05:30
} ) ;
2012-04-13 12:01:23 +05:30
2012-04-13 19:04:55 +05:30
// company-select
2013-05-23 16:03:49 +05:30
wrapper . $company _select = wrapper . appframe . add _select ( "Company" , [ ] )
2012-04-13 19:04:55 +05:30
. change ( function ( ) {
2014-02-14 15:47:51 +05:30
var ctype = frappe . get _route ( ) [ 1 ] || 'Account' ;
2013-05-23 16:03:49 +05:30
erpnext . account _chart = new erpnext . AccountsChart ( ctype , $ ( this ) . val ( ) ,
chart _area . get ( 0 ) ) ;
2012-12-03 15:45:03 +05:30
pscript . set _title ( wrapper , ctype , $ ( this ) . val ( ) ) ;
2012-04-13 19:04:55 +05:30
} )
// load up companies
2014-02-14 15:47:51 +05:30
return frappe . call ( {
2013-12-12 19:12:19 +05:30
method : 'erpnext.accounts.page.accounts_browser.accounts_browser.get_companies' ,
2012-04-13 19:04:55 +05:30
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 15:47:51 +05:30
wrapper . $company _select . val ( frappe . defaults . get _default ( "company" ) || r [ 0 ] ) . change ( ) ;
2012-04-13 19:04:55 +05:30
}
} ) ;
2011-06-08 14:37:15 +05:30
}
2012-12-03 15:45:03 +05:30
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 19:04:55 +05:30
pscript [ 'onshow_Accounts Browser' ] = function ( wrapper ) {
// set route
2014-02-14 15:47:51 +05:30
var ctype = frappe . get _route ( ) [ 1 ] || 'Account' ;
2012-07-11 13:18:58 +05:30
2012-04-13 19:04:55 +05:30
if ( erpnext . account _chart && erpnext . account _chart . ctype != ctype ) {
wrapper . $company _select . change ( ) ;
2012-12-03 15:45:03 +05:30
}
pscript . set _title ( wrapper , ctype ) ;
2012-04-13 19:04:55 +05:30
}
erpnext . AccountsChart = Class . extend ( {
init : function ( ctype , company , wrapper ) {
2013-05-23 16:03:49 +05:30
$ ( wrapper ) . empty ( ) ;
2012-04-13 19:04:55 +05:30
var me = this ;
me . ctype = ctype ;
2014-02-14 15:47:51 +05:30
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 14:11:24 +05:30
2012-04-16 18:36:46 +05:30
me . company = company ;
2014-02-14 15:47:51 +05:30
this . tree = new frappe . ui . Tree ( {
2013-05-23 16:03:49 +05:30
parent : $ ( wrapper ) ,
2013-06-24 15:43:18 +05:30
label : ctype === "Account" ? "Accounts" : "Cost Centers" ,
2012-05-22 16:54:46 +05:30
args : { ctype : ctype , comp : company } ,
2013-12-12 19:12:19 +05:30
method : 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children' ,
2012-04-13 19:04:55 +05:30
click : function ( link ) {
2012-05-22 16:54:46 +05:30
// bold
2013-12-13 11:51:50 +05:30
$ ( '.bold' ) . removeClass ( 'bold' ) ; // deselect
$ ( link ) . parent ( ) . find ( '.balance-area:first' ) . addClass ( 'bold' ) ; // select
2012-12-06 12:09:52 +05:30
2012-05-22 16:54:46 +05:30
} ,
2014-02-19 12:43:16 +05:30
toolbar : [
{ toggle _btn : true } ,
{
label : _ _ ( "Open" ) ,
condition : function ( node ) { return ! node . root } ,
click : function ( node , btn ) {
frappe . set _route ( "Form" , me . ctype , node . label ) ;
}
} ,
{
condition : function ( node ) { return ! node . root && node . expandable ; } ,
label : _ _ ( "Add Child" ) ,
click : function ( ) {
if ( me . ctype == 'Account' ) {
me . new _account ( ) ;
} else {
me . new _cost _center ( ) ;
}
}
} ,
{
condition : function ( node ) {
return ! node . root && me . ctype === 'Account'
2014-03-11 16:15:05 +05:30
&& frappe . boot . user . can _read . indexOf ( "GL Entry" ) !== - 1
2014-02-19 12:43:16 +05:30
} ,
label : _ _ ( "View Ledger" ) ,
click : function ( node , btn ) {
frappe . route _options = {
"account" : node . label ,
"from_date" : sys _defaults . year _start _date ,
"to_date" : sys _defaults . year _end _date ,
"company" : me . company
} ;
frappe . set _route ( "query-report" , "General Ledger" ) ;
}
} ,
{
condition : function ( node ) { return ! node . root && me . can _write } ,
label : _ _ ( "Rename" ) ,
click : function ( node ) {
frappe . model . rename _doc ( me . ctype , node . label , function ( new _name ) {
node . reload ( ) ;
} ) ;
2012-06-29 19:07:20 +05:30
}
2014-02-19 12:43:16 +05:30
} ,
{
condition : function ( node ) { return ! node . root && me . can _delete } ,
label : _ _ ( "Delete" ) ,
click : function ( node ) {
frappe . model . delete _doc ( me . ctype , node . label , function ( ) {
node . parent . remove ( ) ;
} ) ;
}
}
] ,
onrender : function ( node ) {
if ( me . ctype == 'Account' && node . data && node . data . balance !== undefined ) {
$ ( '<span class="balance-area pull-right text-muted">'
+ format _currency ( node . data . balance , node . data . currency )
+ '</span>' ) . insertBefore ( node . $ul ) ;
2012-05-31 13:32:45 +05:30
}
2012-04-13 19:04:55 +05:30
}
} ) ;
2012-04-16 18:36:46 +05:30
} ,
2012-04-13 19:04:55 +05:30
new _account : function ( ) {
2012-04-16 18:36:46 +05:30
var me = this ;
// the dialog
2014-02-14 15:47:51 +05:30
var d = new frappe . ui . Dialog ( {
title : frappe . _ ( 'New Account' ) ,
2012-04-16 18:36:46 +05:30
fields : [
2014-02-14 15:47:51 +05:30
{ 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 18:36:46 +05:30
options : [ '' , 'Fixed Asset Account' , 'Bank or Cash' , 'Expense Account' , 'Tax' ,
2012-11-15 15:11:15 +05:30
'Income Account' , 'Chargeable' ] . join ( '\n' ) ,
2014-02-14 15:47:51 +05:30
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 18:36:46 +05:30
]
} )
2012-04-13 19:04:55 +05:30
2012-04-16 18:36:46 +05:30
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 18:29:56 +05:30
$ ( fd . tax _rate . wrapper ) . toggle ( true ) ;
2012-04-16 18:36:46 +05:30
} else {
2012-11-29 18:29:56 +05:30
$ ( fd . tax _rate . wrapper ) . toggle ( false ) ;
2012-04-16 18:36:46 +05:30
}
} )
// create
$ ( fd . create _new . input ) . click ( function ( ) {
var btn = this ;
var v = d . get _values ( ) ;
if ( ! v ) return ;
2014-02-19 12:43:16 +05:30
var node = me . tree . get _selected _node ( ) ;
v . parent _account = node . label ;
2012-07-11 14:39:33 +05:30
v . master _type = '' ;
2012-04-16 18:36:46 +05:30
v . company = me . company ;
2014-02-14 15:47:51 +05:30
return frappe . call ( {
2013-01-30 19:16:13 +05:30
args : v ,
2013-12-12 19:12:19 +05:30
method : 'erpnext.accounts.utils.add_ac' ,
2013-01-30 19:16:13 +05:30
callback : function ( r ) {
2012-04-16 18:36:46 +05:30
d . hide ( ) ;
2014-02-19 12:43:16 +05:30
node . reload ;
2013-01-30 19:16:13 +05:30
}
} ) ;
2012-04-16 18:36:46 +05:30
} ) ;
// show
d . onshow = function ( ) {
$ ( fd . group _or _ledger . input ) . change ( ) ;
2012-11-29 18:29:56 +05:30
$ ( fd . account _type . input ) . change ( ) ;
2012-04-16 18:36:46 +05:30
}
2012-12-03 14:11:24 +05:30
$ ( fd . group _or _ledger . input ) . val ( "Ledger" ) . change ( ) ;
2012-04-16 18:36:46 +05:30
d . show ( ) ;
2012-04-13 19:04:55 +05:30
} ,
2012-04-16 18:36:46 +05:30
2012-04-13 19:04:55 +05:30
new _cost _center : function ( ) {
2012-04-16 18:36:46 +05:30
var me = this ;
// the dialog
2014-02-14 15:47:51 +05:30
var d = new frappe . ui . Dialog ( {
title : frappe . _ ( 'New Cost Center' ) ,
2012-04-16 18:36:46 +05:30
fields : [
2014-02-14 15:47:51 +05:30
{ 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 18:36:46 +05:30
]
2012-07-11 14:39:33 +05:30
} ) ;
2012-04-16 18:36:46 +05:30
// create
$ ( d . fields _dict . create _new . input ) . click ( function ( ) {
var v = d . get _values ( ) ;
if ( ! v ) return ;
2014-02-19 12:43:16 +05:30
var node = me . tree . get _selected _node ( ) ;
2012-04-16 18:36:46 +05:30
2014-02-19 12:43:16 +05:30
v . parent _cost _center = node . label ;
2013-07-09 15:45:38 +05:30
v . company = me . company ;
2012-04-16 18:36:46 +05:30
2014-02-14 15:47:51 +05:30
return frappe . call ( {
2013-01-30 19:16:13 +05:30
args : v ,
2013-12-12 19:12:19 +05:30
method : 'erpnext.accounts.utils.add_cc' ,
2013-01-30 19:16:13 +05:30
callback : function ( r ) {
2012-04-16 18:36:46 +05:30
d . hide ( ) ;
2014-02-19 12:43:16 +05:30
node . reload ( ) ;
2013-01-30 19:16:13 +05:30
}
} ) ;
2012-04-16 18:36:46 +05:30
} ) ;
d . show ( ) ;
}
2012-05-22 16:54:46 +05:30
} ) ;