Merge pull request #39588 from CitrusLeafSoft/New-Financial-report-views

feat: New financial views - Growth and margin views for P&L and balance sheet
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.js b/erpnext/accounts/report/balance_sheet/balance_sheet.js
index b05e744..5525024 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.js
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.js
@@ -8,6 +8,20 @@
 
 erpnext.utils.add_dimensions("Balance Sheet", 10);
 
+frappe.query_reports["Balance Sheet"]["filters"].push(
+	{
+		"fieldname": "selected_view",
+		"label": __("Select View"),
+		"fieldtype": "Select",
+		"options": [
+			{ "value": "Report", "label": __("Report View") },
+			{ "value": "Growth", "label": __("Growth View") }
+		],
+		"default": "Report",
+		"reqd": 1
+	},
+);
+
 frappe.query_reports["Balance Sheet"]["filters"].push({
 	fieldname: "accumulated_values",
 	label: __("Accumulated Values"),
diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js
index e5898bf..a2f0fde 100644
--- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js
+++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js
@@ -8,6 +8,21 @@
 
 erpnext.utils.add_dimensions("Profit and Loss Statement", 10);
 
+frappe.query_reports["Profit and Loss Statement"]["filters"].push(
+	{
+		"fieldname": "selected_view",
+		"label": __("Select View"),
+		"fieldtype": "Select",
+		"options": [
+			{ "value": "Report", "label": __("Report View") },
+			{ "value": "Growth", "label": __("Growth View") },
+			{ "value": "Margin", "label": __("Margin View") },
+		],
+		"default": "Report",
+		"reqd": 1
+	},
+);
+
 frappe.query_reports["Profit and Loss Statement"]["filters"].push({
 	fieldname: "accumulated_values",
 	label: __("Accumulated Values"),
diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js
index e7743e0..43e58c2 100644
--- a/erpnext/public/js/financial_statements.js
+++ b/erpnext/public/js/financial_statements.js
@@ -2,7 +2,58 @@
 
 erpnext.financial_statements = {
 	"filters": get_filters(),
+	"baseData": null,
 	"formatter": function(value, row, column, data, default_formatter, filter) {
+		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;
+			}
+
+		}
+
 		if (data && column.fieldname=="account") {
 			value = data.account_name || value;