From ecca9cb023f91c7504e53b4f709b01622f156fd9 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 29 Jul 2023 11:52:54 +0530 Subject: [PATCH] fix: Add company filters for account --- .../accounting_dimension.js | 11 +++++++ .../accounting_dimension.py | 10 +++++++ .../purchase_invoice/test_purchase_invoice.py | 29 +++++++++++-------- erpnext/accounts/general_ledger.py | 7 ++++- .../trial_balance/test_trial_balance.py | 3 +- 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js index 2fa1d53c60..2f53f7b640 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js @@ -15,6 +15,17 @@ frappe.ui.form.on('Accounting Dimension', { }; }); + frm.set_query("offsetting_account", "dimension_defaults", function(doc, cdt, cdn) { + let d = locals[cdt][cdn]; + return { + filters: { + company: d.company, + root_type: ["in", ["Asset", "Liability"]], + is_group: 0 + } + } + }); + if (!frm.is_new()) { frm.add_custom_button(__('Show {0}', [frm.doc.document_type]), function () { frappe.set_route("List", frm.doc.document_type); diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 81ff6a52db..ea44734e75 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -39,6 +39,8 @@ class AccountingDimension(Document): if not self.is_new(): self.validate_document_type_change() + self.validate_dimension_defaults() + def validate_document_type_change(self): doctype_before_save = frappe.db.get_value("Accounting Dimension", self.name, "document_type") if doctype_before_save != self.document_type: @@ -46,6 +48,14 @@ class AccountingDimension(Document): message += _("Please create a new Accounting Dimension if required.") frappe.throw(message) + def validate_dimension_defaults(self): + companies = [] + for default in self.get("dimension_defaults"): + if default.company not in companies: + companies.append(default.company) + else: + frappe.throw(_("Company {0} is added more than once").format(frappe.bold(default.company))) + def after_insert(self): if frappe.flags.in_test: make_dimension_in_accounting_doctypes(doc=self) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index d2f19a1b25..486e01e00f 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1774,10 +1774,10 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin): pi.submit() expected_gle = [ - ["_Test Account Cost for Goods Sold - _TC", 1000, 0.0, nowdate(), {"branch": branch2.branch}], - ["Creditors - _TC", 0.0, 1000, nowdate(), {"branch": branch1.branch}], - ["Offsetting - _TC", 1000, 0.0, nowdate(), {"branch": branch1.branch}], - ["Offsetting - _TC", 0.0, 1000, nowdate(), {"branch": branch2.branch}], + ["_Test Account Cost for Goods Sold - _TC", 1000, 0.0, nowdate(), branch2.branch], + ["Creditors - _TC", 0.0, 1000, nowdate(), branch1.branch], + ["Offsetting - _TC", 1000, 0.0, nowdate(), branch1.branch], + ["Offsetting - _TC", 0.0, 1000, nowdate(), branch2.branch], ] check_gl_entries( @@ -1786,7 +1786,7 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin): expected_gle, nowdate(), voucher_type="Purchase Invoice", - check_acc_dimensions=True, + additional_columns=["branch"], ) clear_dimension_defaults("Branch") disable_dimension() @@ -1809,7 +1809,7 @@ def check_gl_entries( expected_gle, posting_date, voucher_type="Purchase Invoice", - check_acc_dimensions=False, + additional_columns=None, ): gl = frappe.qb.DocType("GL Entry") query = ( @@ -1823,9 +1823,11 @@ def check_gl_entries( ) .orderby(gl.posting_date, gl.account, gl.creation) ) - if check_acc_dimensions: - for col in list(expected_gle[0][4].keys()): - query = query.select(col) + + if additional_columns: + for col in additional_columns: + query = query.select(gl[col]) + gl_entries = query.run(as_dict=True) for i, gle in enumerate(gl_entries): @@ -1833,9 +1835,12 @@ def check_gl_entries( doc.assertEqual(expected_gle[i][1], gle.debit) doc.assertEqual(expected_gle[i][2], gle.credit) doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date) - if check_acc_dimensions: - for acc_dimension in expected_gle[i][4]: - doc.assertEqual(expected_gle[i][4][acc_dimension], gle[acc_dimension]) + + if additional_columns: + j = 4 + for col in additional_columns: + doc.assertEqual(expected_gle[i][j], gle[col]) + j += 1 def create_tax_witholding_category(category_name, company, account): diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index a348911f03..addc9d5754 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -30,8 +30,8 @@ def make_gl_entries( from_repost=False, ): if gl_map: - make_acc_dimensions_offsetting_entry(gl_map) if not cancel: + make_acc_dimensions_offsetting_entry(gl_map) validate_accounting_period(gl_map) validate_disabled_accounts(gl_map) gl_map = process_gl_map(gl_map, merge_entries) @@ -64,6 +64,7 @@ def make_acc_dimensions_offsetting_entry(gl_map): return offsetting_entries = [] + for gle in gl_map: for dimension in accounting_dimensions_to_offset: offsetting_entry = gle.copy() @@ -82,12 +83,14 @@ def make_acc_dimensions_offsetting_entry(gl_map): ) offsetting_entry["against_voucher_type"] = None offsetting_entries.append(offsetting_entry) + gl_map += offsetting_entries def get_accounting_dimensions_for_offsetting_entry(gl_map, company): acc_dimension = frappe.qb.DocType("Accounting Dimension") dimension_detail = frappe.qb.DocType("Accounting Dimension Detail") + acc_dimensions = ( frappe.qb.from_(acc_dimension) .inner_join(dimension_detail) @@ -99,11 +102,13 @@ def get_accounting_dimensions_for_offsetting_entry(gl_map, company): & (dimension_detail.automatically_post_balancing_accounting_entry == 1) ) ).run(as_dict=True) + accounting_dimensions_to_offset = [] for acc_dimension in acc_dimensions: values = set([entry.get(acc_dimension.fieldname) for entry in gl_map]) if len(values) > 1: accounting_dimensions_to_offset.append(acc_dimension) + return accounting_dimensions_to_offset diff --git a/erpnext/accounts/report/trial_balance/test_trial_balance.py b/erpnext/accounts/report/trial_balance/test_trial_balance.py index cd0429be4c..4682ac4500 100644 --- a/erpnext/accounts/report/trial_balance/test_trial_balance.py +++ b/erpnext/accounts/report/trial_balance/test_trial_balance.py @@ -91,7 +91,8 @@ def create_accounting_dimension(**args): accounting_dimension = frappe.new_doc("Accounting Dimension") accounting_dimension.document_type = document_type accounting_dimension.insert() - accounting_dimension.save() + + accounting_dimension.set("dimension_defaults", []) accounting_dimension.append( "dimension_defaults", {