From 095b5586a23ba1cfad12f77ef81d1bef4dba8c83 Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 4 May 2020 11:12:14 +0530 Subject: [PATCH] fix: Accounting Dimensions in Period Closing Voucher (#21564) --- .../accounting_dimension.py | 9 ++--- .../period_closing_voucher.py | 33 ++++++++++++++----- .../public/js/utils/dimension_tree_filter.js | 2 +- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 14fdffc0a78..7a85bfb26b6 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -206,12 +206,13 @@ def get_dimension_filters(): WHERE disabled = 0 """, as_dict=1) - default_dimensions = frappe.db.sql("""SELECT parent, company, default_dimension - FROM `tabAccounting Dimension Detail`""", as_dict=1) + default_dimensions = frappe.db.sql("""SELECT p.fieldname, c.company, c.default_dimension + FROM `tabAccounting Dimension Detail` c, `tabAccounting Dimension` p + WHERE c.parent = p.name""", as_dict=1) default_dimensions_map = {} for dimension in default_dimensions: - default_dimensions_map.setdefault(dimension['company'], {}) - default_dimensions_map[dimension['company']][dimension['parent']] = dimension['default_dimension'] + default_dimensions_map.setdefault(dimension.company, {}) + default_dimensions_map[dimension.company][dimension.fieldname] = dimension.default_dimension return dimension_filters, default_dimensions_map diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py index bd8d8bd86dc..7dd5b017703 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py @@ -7,6 +7,8 @@ from frappe.utils import flt from frappe import _ from erpnext.accounts.utils import get_account_currency from erpnext.controllers.accounts_controller import AccountsController +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (get_accounting_dimensions, + get_dimension_filters) class PeriodClosingVoucher(AccountsController): def validate(self): @@ -50,7 +52,15 @@ class PeriodClosingVoucher(AccountsController): def make_gl_entries(self): gl_entries = [] net_pl_balance = 0 - pl_accounts = self.get_pl_balances() + dimension_fields = ['t1.cost_center'] + + accounting_dimensions = get_accounting_dimensions() + for dimension in accounting_dimensions: + dimension_fields.append('t1.{0}'.format(dimension)) + + dimension_filters, default_dimensions = get_dimension_filters() + + pl_accounts = self.get_pl_balances(dimension_fields) for acc in pl_accounts: if flt(acc.balance_in_company_currency): @@ -66,34 +76,41 @@ class PeriodClosingVoucher(AccountsController): if flt(acc.balance_in_account_currency) > 0 else 0, "credit": abs(flt(acc.balance_in_company_currency)) \ if flt(acc.balance_in_company_currency) > 0 else 0 - })) + }, item=acc)) net_pl_balance += flt(acc.balance_in_company_currency) if net_pl_balance: cost_center = frappe.db.get_value("Company", self.company, "cost_center") - gl_entries.append(self.get_gl_dict({ + gl_entry = self.get_gl_dict({ "account": self.closing_account_head, "debit_in_account_currency": abs(net_pl_balance) if net_pl_balance > 0 else 0, "debit": abs(net_pl_balance) if net_pl_balance > 0 else 0, "credit_in_account_currency": abs(net_pl_balance) if net_pl_balance < 0 else 0, "credit": abs(net_pl_balance) if net_pl_balance < 0 else 0, "cost_center": cost_center - })) + }) + + for dimension in accounting_dimensions: + gl_entry.update({ + dimension: default_dimensions.get(self.company, {}).get(dimension) + }) + + gl_entries.append(gl_entry) from erpnext.accounts.general_ledger import make_gl_entries make_gl_entries(gl_entries) - def get_pl_balances(self): + def get_pl_balances(self, dimension_fields): """Get balance for pl accounts""" return frappe.db.sql(""" select - t1.account, t1.cost_center, t2.account_currency, + t1.account, t2.account_currency, {dimension_fields}, sum(t1.debit_in_account_currency) - sum(t1.credit_in_account_currency) as balance_in_account_currency, sum(t1.debit) - sum(t1.credit) as balance_in_company_currency from `tabGL Entry` t1, `tabAccount` t2 where t1.account = t2.name and t2.report_type = 'Profit and Loss' and t2.docstatus < 2 and t2.company = %s and t1.posting_date between %s and %s - group by t1.account, t1.cost_center - """, (self.company, self.get("year_start_date"), self.posting_date), as_dict=1) + group by t1.account, {dimension_fields} + """.format(dimension_fields = ', '.join(dimension_fields)), (self.company, self.get("year_start_date"), self.posting_date), as_dict=1) diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js index b223fc557be..b6720c05cb2 100644 --- a/erpnext/public/js/utils/dimension_tree_filter.js +++ b/erpnext/public/js/utils/dimension_tree_filter.js @@ -46,7 +46,7 @@ doctypes_with_dimensions.forEach((doctype) => { if(frm.doc.company && Object.keys(default_dimensions || {}).length > 0 && default_dimensions[frm.doc.company]) { - let default_dimension = default_dimensions[frm.doc.company][dimension['document_type']]; + let default_dimension = default_dimensions[frm.doc.company][dimension['fieldname']]; if(default_dimension) { if (frappe.meta.has_field(doctype, dimension['fieldname'])) {