2014-07-18 18:05:26 +05:30
frappe . provide ( "erpnext.financial_statements" ) ;
erpnext . financial _statements = {
2016-08-19 11:48:58 +05:30
"filters" : get _filters ( ) ,
2024-01-28 13:48:55 +05:30
"baseData" : null ,
2023-12-07 19:39:24 +05:30
"formatter" : function ( value , row , column , data , default _formatter , filter ) {
2024-01-28 13:48:55 +05:30
if ( frappe . query _report . get _filter _value ( "selected_view" ) == "Growth" && data && column . colIndex >= 3 ) {
//Assuming that the first three columns are s.no, account name and the very first year of the accounting values, to calculate the relative percentage values of the successive columns.
const lastAnnualValue = row [ column . colIndex - 1 ] . content ;
const currentAnnualvalue = data [ column . fieldname ] ;
if ( currentAnnualvalue == undefined ) return 'NA' ; //making this not applicable for undefined/null values
let annualGrowth = 0 ;
if ( lastAnnualValue == 0 && currentAnnualvalue > 0 ) {
//If the previous year value is 0 and the current value is greater than 0
annualGrowth = 1 ;
}
else if ( lastAnnualValue > 0 ) {
annualGrowth = ( currentAnnualvalue - lastAnnualValue ) / lastAnnualValue ;
}
const growthPercent = ( Math . round ( annualGrowth * 10000 ) / 100 ) ; //calculating the rounded off percentage
value = $ ( ` <span> ${ ( ( growthPercent >= 0 ) ? '+' : '' ) + growthPercent + '%' } </span> ` ) ;
if ( growthPercent < 0 ) {
value = $ ( value ) . addClass ( "text-danger" ) ;
}
else {
value = $ ( value ) . addClass ( "text-success" ) ;
}
value = $ ( value ) . wrap ( "<p></p>" ) . parent ( ) . html ( ) ;
return value ;
}
else if ( frappe . query _report . get _filter _value ( "selected_view" ) == "Margin" && data ) {
if ( column . fieldname == "account" && data . account _name == _ _ ( "Income" ) ) {
//Taking the total income from each column (for all the financial years) as the base (100%)
this . baseData = row ;
}
if ( column . colIndex >= 2 ) {
//Assuming that the first two columns are s.no and account name, to calculate the relative percentage values of the successive columns.
const currentAnnualvalue = data [ column . fieldname ] ;
const baseValue = this . baseData [ column . colIndex ] . content ;
if ( currentAnnualvalue == undefined || baseValue <= 0 ) return 'NA' ;
const marginPercent = Math . round ( ( currentAnnualvalue / baseValue ) * 10000 ) / 100 ;
value = $ ( ` <span> ${ marginPercent + '%' } </span> ` ) ;
if ( marginPercent < 0 )
value = $ ( value ) . addClass ( "text-danger" ) ;
else
value = $ ( value ) . addClass ( "text-success" ) ;
value = $ ( value ) . wrap ( "<p></p>" ) . parent ( ) . html ( ) ;
return value ;
}
}
2020-07-21 17:35:10 +05:30
if ( data && column . fieldname == "account" ) {
2019-12-04 09:46:42 +05:30
value = data . account _name || value ;
2014-07-18 18:05:26 +05:30
2023-12-07 19:39:24 +05:30
if ( filter && filter ? . text && filter ? . type == "contains" ) {
if ( ! value . toLowerCase ( ) . includes ( filter . text ) ) {
return value ;
}
}
2023-09-27 12:34:40 +05:30
if ( data . account ) {
column . link _onclick =
"erpnext.financial_statements.open_general_ledger(" + JSON . stringify ( data ) + ")" ;
}
2018-07-20 15:11:55 +05:30
column . is _tree = true ;
2014-07-18 18:05:26 +05:30
}
2018-07-20 15:11:55 +05:30
value = default _formatter ( value , row , column , data ) ;
2020-07-21 17:35:10 +05:30
if ( data && ! data . parent _account ) {
2018-07-20 15:11:55 +05:30
value = $ ( ` <span> ${ value } </span> ` ) ;
2014-07-22 19:02:11 +05:30
2014-07-21 16:13:06 +05:30
var $value = $ ( value ) . css ( "font-weight" , "bold" ) ;
2018-07-20 15:11:55 +05:30
if ( data . warn _if _negative && data [ column . fieldname ] < 0 ) {
2014-07-21 16:13:06 +05:30
$value . addClass ( "text-danger" ) ;
}
value = $value . wrap ( "<p></p>" ) . parent ( ) . html ( ) ;
2014-07-18 18:05:26 +05:30
}
return value ;
} ,
2014-07-21 16:13:06 +05:30
"open_general_ledger" : function ( data ) {
if ( ! data . account ) return ;
2022-10-19 23:14:10 +05:30
let project = $ . grep ( frappe . query _report . filters , function ( e ) { return e . df . fieldname == 'project' ; } ) ;
2014-07-18 18:05:26 +05:30
frappe . route _options = {
2014-07-21 16:13:06 +05:30
"account" : data . account ,
2018-07-18 09:28:44 +05:30
"company" : frappe . query _report . get _filter _value ( 'company' ) ,
2016-02-16 11:56:53 +05:30
"from_date" : data . from _date || data . year _start _date ,
2017-01-24 06:42:24 -03:00
"to_date" : data . to _date || data . year _end _date ,
2017-04-19 17:53:31 +05:30
"project" : ( project && project . length > 0 ) ? project [ 0 ] . $input . val ( ) : ""
2014-07-18 18:05:26 +05:30
} ;
2022-10-19 23:14:10 +05:30
let report = "General Ledger" ;
if ( [ "Payable" , "Receivable" ] . includes ( data . account _type ) ) {
report = data . account _type == "Payable" ? "Accounts Payable" : "Accounts Receivable" ;
frappe . route _options [ "party_account" ] = data . account ;
frappe . route _options [ "report_date" ] = data . year _end _date ;
}
frappe . set _route ( "query-report" , report ) ;
2014-07-22 19:02:11 +05:30
} ,
"tree" : true ,
"name_field" : "account" ,
"parent_field" : "parent_account" ,
2016-04-18 19:27:36 +05:30
"initial_depth" : 3 ,
onload : function ( report ) {
// dropdown for links to other financial statements
2016-08-19 11:48:58 +05:30
erpnext . financial _statements . filters = get _filters ( )
2023-07-16 12:58:42 +05:30
let fiscal _year = erpnext . utils . get _fiscal _year ( frappe . datetime . get _today ( ) ) ;
2020-05-28 18:36:21 +05:30
frappe . model . with _doc ( "Fiscal Year" , fiscal _year , function ( r ) {
var fy = frappe . model . get _doc ( "Fiscal Year" , fiscal _year ) ;
frappe . query _report . set _filter _value ( {
period _start _date : fy . year _start _date ,
period _end _date : fy . year _end _date
} ) ;
} ) ;
2024-01-27 23:30:17 +05:30
if ( report . page ) {
const views _menu = report . page . add _custom _button _group ( _ _ ( 'Financial Statements' ) ) ;
2020-07-09 16:51:36 +05:30
2024-01-27 23:30:17 +05:30
report . page . add _custom _menu _item ( views _menu , _ _ ( "Balance Sheet" ) , function ( ) {
var filters = report . get _values ( ) ;
frappe . set _route ( 'query-report' , 'Balance Sheet' , { company : filters . company } ) ;
} ) ;
2020-07-09 16:51:36 +05:30
2024-01-27 23:30:17 +05:30
report . page . add _custom _menu _item ( views _menu , _ _ ( "Profit and Loss" ) , function ( ) {
var filters = report . get _values ( ) ;
frappe . set _route ( 'query-report' , 'Profit and Loss Statement' , { company : filters . company } ) ;
} ) ;
2020-07-09 16:51:36 +05:30
2024-01-27 23:30:17 +05:30
report . page . add _custom _menu _item ( views _menu , _ _ ( "Cash Flow Statement" ) , function ( ) {
var filters = report . get _values ( ) ;
frappe . set _route ( 'query-report' , 'Cash Flow' , { company : filters . company } ) ;
} ) ;
}
2016-05-20 11:44:08 +05:30
}
2014-07-18 18:05:26 +05:30
} ;
2016-08-19 11:48:58 +05:30
2020-05-26 19:23:45 +05:30
function get _filters ( ) {
2019-05-12 18:34:23 +05:30
let filters = [
2016-08-19 11:48:58 +05:30
{
"fieldname" : "company" ,
"label" : _ _ ( "Company" ) ,
"fieldtype" : "Link" ,
"options" : "Company" ,
"default" : frappe . defaults . get _user _default ( "Company" ) ,
"reqd" : 1
} ,
2018-04-23 03:36:02 +05:30
{
"fieldname" : "finance_book" ,
"label" : _ _ ( "Finance Book" ) ,
"fieldtype" : "Link" ,
2018-05-09 15:10:29 +05:30
"options" : "Finance Book"
2018-04-23 03:36:02 +05:30
} ,
2020-04-07 12:16:25 +05:30
{
"fieldname" : "filter_based_on" ,
"label" : _ _ ( "Filter Based On" ) ,
"fieldtype" : "Select" ,
"options" : [ "Fiscal Year" , "Date Range" ] ,
"default" : [ "Fiscal Year" ] ,
"reqd" : 1 ,
on _change : function ( ) {
let filter _based _on = frappe . query _report . get _filter _value ( 'filter_based_on' ) ;
frappe . query _report . toggle _filter _display ( 'from_fiscal_year' , filter _based _on === 'Date Range' ) ;
frappe . query _report . toggle _filter _display ( 'to_fiscal_year' , filter _based _on === 'Date Range' ) ;
frappe . query _report . toggle _filter _display ( 'period_start_date' , filter _based _on === 'Fiscal Year' ) ;
frappe . query _report . toggle _filter _display ( 'period_end_date' , filter _based _on === 'Fiscal Year' ) ;
frappe . query _report . refresh ( ) ;
}
} ,
{
"fieldname" : "period_start_date" ,
"label" : _ _ ( "Start Date" ) ,
"fieldtype" : "Date" ,
2021-10-27 19:39:18 +05:30
"reqd" : 1 ,
"depends_on" : "eval:doc.filter_based_on == 'Date Range'"
2020-04-07 12:16:25 +05:30
} ,
{
"fieldname" : "period_end_date" ,
"label" : _ _ ( "End Date" ) ,
"fieldtype" : "Date" ,
2021-10-27 19:39:18 +05:30
"reqd" : 1 ,
"depends_on" : "eval:doc.filter_based_on == 'Date Range'"
2020-04-07 12:16:25 +05:30
} ,
2016-08-19 11:48:58 +05:30
{
"fieldname" : "from_fiscal_year" ,
2016-08-21 17:14:12 +05:30
"label" : _ _ ( "Start Year" ) ,
2016-08-19 11:48:58 +05:30
"fieldtype" : "Link" ,
"options" : "Fiscal Year" ,
2021-10-27 19:39:18 +05:30
"reqd" : 1 ,
"depends_on" : "eval:doc.filter_based_on == 'Fiscal Year'"
2016-08-19 11:48:58 +05:30
} ,
{
"fieldname" : "to_fiscal_year" ,
2016-08-21 17:14:12 +05:30
"label" : _ _ ( "End Year" ) ,
2016-08-19 11:48:58 +05:30
"fieldtype" : "Link" ,
"options" : "Fiscal Year" ,
2021-10-27 19:39:18 +05:30
"reqd" : 1 ,
"depends_on" : "eval:doc.filter_based_on == 'Fiscal Year'"
2016-08-19 11:48:58 +05:30
} ,
{
"fieldname" : "periodicity" ,
"label" : _ _ ( "Periodicity" ) ,
"fieldtype" : "Select" ,
"options" : [
{ "value" : "Monthly" , "label" : _ _ ( "Monthly" ) } ,
{ "value" : "Quarterly" , "label" : _ _ ( "Quarterly" ) } ,
{ "value" : "Half-Yearly" , "label" : _ _ ( "Half-Yearly" ) } ,
{ "value" : "Yearly" , "label" : _ _ ( "Yearly" ) }
] ,
2018-08-30 18:42:35 +05:30
"default" : "Yearly" ,
2016-08-19 11:48:58 +05:30
"reqd" : 1
2018-02-12 10:34:50 +01:00
} ,
// Note:
// If you are modifying this array such that the presentation_currency object
// is no longer the last object, please make adjustments in cash_flow.js
// accordingly.
{
"fieldname" : "presentation_currency" ,
"label" : _ _ ( "Currency" ) ,
"fieldtype" : "Select" ,
"options" : erpnext . get _presentation _currency _list ( )
2019-05-28 12:15:56 +05:30
} ,
{
2019-06-19 12:15:37 +05:30
"fieldname" : "cost_center" ,
2019-05-28 12:15:56 +05:30
"label" : _ _ ( "Cost Center" ) ,
2019-06-19 12:15:37 +05:30
"fieldtype" : "MultiSelectList" ,
get _data : function ( txt ) {
return frappe . db . get _link _options ( 'Cost Center' , txt , {
company : frappe . query _report . get _filter _value ( "company" )
2019-05-28 12:15:56 +05:30
} ) ;
}
2023-07-12 15:49:17 +05:30
} ,
{
"fieldname" : "project" ,
"label" : _ _ ( "Project" ) ,
"fieldtype" : "MultiSelectList" ,
get _data : function ( txt ) {
return frappe . db . get _link _options ( 'Project' , txt , {
company : frappe . query _report . get _filter _value ( "company" )
} ) ;
} ,
2016-08-19 11:48:58 +05:30
}
]
2019-05-12 18:34:23 +05:30
2023-11-14 06:44:49 +05:30
// Dynamically set 'default' values for fiscal year filters
let fy _filters = filters . filter ( x => { return [ "from_fiscal_year" , "to_fiscal_year" ] . includes ( x . fieldname ) ; } )
let fiscal _year = erpnext . utils . get _fiscal _year ( frappe . datetime . get _today ( ) , false , true ) ;
if ( fiscal _year ) {
let fy = erpnext . utils . get _fiscal _year ( frappe . datetime . get _today ( ) , false , false ) ;
fy _filters . forEach ( x => { x . default = fy ; } )
}
2019-05-12 18:34:23 +05:30
return filters ;
}