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..92674a146ba 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -51,6 +51,23 @@ 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_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 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)