From 7b32d07d1cf2b66e71f73656773b5d4689768203 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Tue, 25 Aug 2026 16:09:59 +0530 Subject: [PATCH 1/2] fix(accounts): prevent child table doctypes as accounting dimensions --- .../doctype/accounting_dimension/accounting_dimension.js | 2 ++ .../doctype/accounting_dimension/accounting_dimension.py | 8 ++++++++ .../accounting_dimension/test_accounting_dimension.py | 4 ++++ erpnext/accounts/services/base_gl_composer.py | 7 +++++-- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js index 6f4f9f8d782..c4b3c87387d 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.js @@ -16,6 +16,8 @@ frappe.ui.form.on("Accounting Dimension", { return { filters: { name: ["not in", invalid_doctypes], + istable: 0, + issingle: 0, }, }; }); diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 1505a912eb6..f5b1867fbf9 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -60,6 +60,14 @@ class AccountingDimension(Document): msg = _("Not allowed to create accounting dimension for {0}").format(self.document_type) frappe.throw(msg) + meta = frappe.get_meta(self.document_type) + if meta.istable or meta.issingle: + frappe.throw( + _( + "{0} cannot be used as an accounting dimension as it is not a standalone document type." + ).format(frappe.bold(self.document_type)) + ) + exists = frappe.db.get_value("Accounting Dimension", {"document_type": self.document_type}, ["name"]) if exists and self.is_new(): diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index 1721ebcac68..039e1d2aa34 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -51,6 +51,10 @@ class TestAccountingDimension(ERPNextTestSuite): self.assertEqual(gle.get("department"), "_Test Department - _TC") self.assertEqual(gle1.get("department"), "_Test Department - _TC") + def test_child_table_not_allowed_as_dimension(self): + dimension = frappe.get_doc({"doctype": "Accounting Dimension", "document_type": "Sales Team"}) + self.assertRaises(frappe.ValidationError, dimension.insert) + def test_mandatory(self): location = frappe.get_doc("Accounting Dimension", "Location") location.dimension_defaults[0].mandatory_for_bs = True diff --git a/erpnext/accounts/services/base_gl_composer.py b/erpnext/accounts/services/base_gl_composer.py index 8e4279e7e13..1ec53d07e44 100644 --- a/erpnext/accounts/services/base_gl_composer.py +++ b/erpnext/accounts/services/base_gl_composer.py @@ -67,9 +67,12 @@ def get_gl_dict(doc, args: dict, account_currency: str | None = None, item=None) accounting_dimensions = get_accounting_dimensions() dimension_dict = frappe._dict() for dimension in accounting_dimensions: - dimension_dict[dimension] = doc.get(dimension) + value = doc.get(dimension) if item and item.get(dimension): - dimension_dict[dimension] = item.get(dimension) + value = item.get(dimension) + if isinstance(value, list | dict): + continue + dimension_dict[dimension] = value gl_dict.update(dimension_dict) gl_dict.update(args) From 55dd11f977747470628e622752a2124658f9ec0a Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Wed, 26 Aug 2026 00:36:29 +0530 Subject: [PATCH 2/2] test(accounts): cover single doctype and non-scalar dimension safeguards --- .../test_accounting_dimension.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index 039e1d2aa34..92674a146ba 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -55,6 +55,19 @@ class TestAccountingDimension(ERPNextTestSuite): dimension = frappe.get_doc({"doctype": "Accounting Dimension", "document_type": "Sales Team"}) self.assertRaises(frappe.ValidationError, dimension.insert) + def test_single_doctype_not_allowed_as_dimension(self): + dimension = frappe.get_doc({"doctype": "Accounting Dimension", "document_type": "Selling Settings"}) + self.assertRaises(frappe.ValidationError, dimension.insert) + + def test_non_scalar_dimension_value_skipped_in_gl_dict(self): + si = create_sales_invoice(do_not_save=1) + + si.department = "_Test Department - _TC" + self.assertEqual(si.get_gl_dict({}).get("department"), "_Test Department - _TC") + + si.department = ["_Test Department - _TC"] + self.assertNotIn("department", si.get_gl_dict({})) + def test_mandatory(self): location = frappe.get_doc("Accounting Dimension", "Location") location.dimension_defaults[0].mandatory_for_bs = True