Adding growth and margin views for P&L and balance sheet financial reports in collaboration with Sapcon Instruments Pvt Ltd
diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js
index 17341d1..df3ff43 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;