From acb28954ffc04ebb391ea4c76b96af5df7941018 Mon Sep 17 00:00:00 2001 From: Nabin Hait <nabinhait@gmail.com> Date: Fri, 4 Mar 2016 12:32:33 +0530 Subject: [PATCH] [fix][report] Show group rows with zero values if there are values against children --- .../report/balance_sheet/balance_sheet.py | 8 ++-- .../accounts/report/financial_statements.py | 42 +++++++++++++------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py index fd88afd9fe..7e05b9519b 100644 --- a/erpnext/accounts/report/balance_sheet/balance_sheet.py +++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py @@ -19,7 +19,7 @@ def execute(filters=None): data = [] data.extend(asset or []) - data.extend(liability or []) + data.extend(liability or []) data.extend(equity or []) if provisional_profit_loss: data.append(provisional_profit_loss) @@ -43,11 +43,11 @@ def get_provisional_profit_loss(asset, liability, equity, period_list, company): for period in period_list: effective_liability = 0.0 if liability: - effective_liability += flt(liability[-2][period.key]) + effective_liability += flt(liability[-2].get(period.key)) if equity: - effective_liability += flt(equity[-2][period.key]) + effective_liability += flt(equity[-2].get(period.key)) - provisional_profit_loss[period.key] = flt(asset[-2][period.key]) - effective_liability + provisional_profit_loss[period.key] = flt(asset[-2].get(period.key)) - effective_liability if provisional_profit_loss[period.key]: has_value = True diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index d84f18fc6a..0f10b946d1 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -92,7 +92,7 @@ def get_data(company, root_type, balance_must_be, period_list, if not accounts: return None - accounts, accounts_by_name = filter_accounts(accounts) + accounts, accounts_by_name, parent_children_map = filter_accounts(accounts) company_currency = frappe.db.get_value("Company", company, "default_currency") @@ -109,6 +109,7 @@ def get_data(company, root_type, balance_must_be, period_list, calculate_values(accounts_by_name, gl_entries_by_account, period_list, accumulated_values) accumulate_values_into_parents(accounts, accounts_by_name, period_list, accumulated_values) out = prepare_data(accounts, balance_must_be, period_list, company_currency) + out = filter_out_zero_value_rows(out, parent_children_map) if out: add_total_row(out, balance_must_be, period_list, company_currency) @@ -134,15 +135,15 @@ def accumulate_values_into_parents(accounts, accounts_by_name, period_list, accu d.get(period.key, 0.0) def prepare_data(accounts, balance_must_be, period_list, company_currency): - out = [] + data = [] year_start_date = period_list[0]["year_start_date"].strftime("%Y-%m-%d") year_end_date = period_list[-1]["year_end_date"].strftime("%Y-%m-%d") - + for d in accounts: # add to output has_value = False total = 0 - row = { + row = frappe._dict({ "account_name": d.account_name, "account": d.name, "parent_account": d.parent_account, @@ -150,7 +151,7 @@ def prepare_data(accounts, balance_must_be, period_list, company_currency): "year_start_date": year_start_date, "year_end_date": year_end_date, "currency": company_currency - } + }) for period in period_list: if d.get(period.key): # change sign based on Debit or Credit, since calculation is done using (debit - credit) @@ -163,11 +164,25 @@ def prepare_data(accounts, balance_must_be, period_list, company_currency): has_value = True total += flt(row[period.key]) - if has_value: - row["total"] = total - out.append(row) + row["has_value"] = has_value + row["total"] = total + data.append(row) + + return data + +def filter_out_zero_value_rows(data, parent_children_map): + data_with_value = [] + for d in data: + if d.get("has_value"): + data_with_value.append(d) + else: + children = [child.name for child in parent_children_map.get(d.account) or []] + for row in data: + if row.account in children and row.get("has_value"): + data_with_value.append(d) + break - return out + return data_with_value def add_total_row(out, balance_must_be, period_list, company_currency): total_row = { @@ -187,10 +202,11 @@ def add_total_row(out, balance_must_be, period_list, company_currency): total_row["total"] += flt(row["total"]) row["total"] = "" - out.append(total_row) + if total_row.has_key("total"): + out.append(total_row) - # blank row after Total - out.append({}) + # blank row after Total + out.append({}) def get_accounts(company, root_type): return frappe.db.sql("""select name, parent_account, lft, rgt, root_type, report_type, account_name from `tabAccount` @@ -218,7 +234,7 @@ def filter_accounts(accounts, depth=10): add_to_list(None, 0) - return filtered_accounts, accounts_by_name + return filtered_accounts, accounts_by_name, parent_children_map def sort_root_accounts(roots): """Sort root types as Asset, Liability, Equity, Income, Expense"""