diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json index 2bd6c12a0a3..260bcd11db5 100644 --- a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json +++ b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json @@ -7,6 +7,7 @@ "engine": "InnoDB", "field_order": [ "accounting_dimension", + "fieldname", "disabled", "column_break_2", "company", @@ -90,11 +91,17 @@ "fieldname": "apply_restriction_on_values", "fieldtype": "Check", "label": "Apply restriction on dimension values" + }, + { + "fieldname": "fieldname", + "fieldtype": "Data", + "hidden": 1, + "label": "Fieldname" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-06-07 14:59:41.869117", + "modified": "2025-08-08 14:13:22.203011", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Dimension Filter", @@ -139,8 +146,8 @@ } ], "quick_entry": 1, - "sort_field": "modified", + "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py index 7c843cf552e..040583a2847 100644 --- a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py +++ b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.py @@ -17,17 +17,16 @@ class AccountingDimensionFilter(Document): from frappe.types import DF from erpnext.accounts.doctype.allowed_dimension.allowed_dimension import AllowedDimension - from erpnext.accounts.doctype.applicable_on_account.applicable_on_account import ( - ApplicableOnAccount, - ) + from erpnext.accounts.doctype.applicable_on_account.applicable_on_account import ApplicableOnAccount - accounting_dimension: DF.Literal + accounting_dimension: DF.Literal[None] accounts: DF.Table[ApplicableOnAccount] allow_or_restrict: DF.Literal["Allow", "Restrict"] apply_restriction_on_values: DF.Check company: DF.Link dimensions: DF.Table[AllowedDimension] disabled: DF.Check + fieldname: DF.Data | None # end: auto-generated types def before_save(self): @@ -37,6 +36,10 @@ class AccountingDimensionFilter(Document): self.set("dimensions", []) def validate(self): + self.fieldname = frappe.db.get_value( + "Accounting Dimension", {"document_type": self.accounting_dimension}, "fieldname" + ) or frappe.scrub(self.accounting_dimension) # scrub to handle default accounting dimension + self.validate_applicable_accounts() def validate_applicable_accounts(self): @@ -72,7 +75,7 @@ def get_dimension_filter_map(): """ SELECT a.applicable_on_account, d.dimension_value, p.accounting_dimension, - p.allow_or_restrict, a.is_mandatory + p.allow_or_restrict, p.fieldname, a.is_mandatory FROM `tabApplicable On Account` a, `tabAccounting Dimension Filter` p @@ -87,8 +90,6 @@ def get_dimension_filter_map(): dimension_filter_map = {} for f in filters: - f.fieldname = scrub(f.accounting_dimension) - build_map( dimension_filter_map, f.fieldname, diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1087f64276d..ae52e1e3a09 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -420,3 +420,4 @@ erpnext.patches.v15_0.repost_gl_entries_with_no_account_subcontracting #2025-08- execute:frappe.db.set_single_value("Accounts Settings", "fetch_valuation_rate_for_internal_transaction", 1) erpnext.patches.v15_0.add_company_payment_gateway_account erpnext.patches.v15_0.update_uae_zero_rated_fetch +erpnext.patches.v15_0.update_fieldname_in_accounting_dimension_filter diff --git a/erpnext/patches/v15_0/update_fieldname_in_accounting_dimension_filter.py b/erpnext/patches/v15_0/update_fieldname_in_accounting_dimension_filter.py new file mode 100644 index 00000000000..25a35bc87fc --- /dev/null +++ b/erpnext/patches/v15_0/update_fieldname_in_accounting_dimension_filter.py @@ -0,0 +1,36 @@ +import frappe +from frappe.query_builder import DocType + + +def execute(): + default_accounting_dimension() + ADF = DocType("Accounting Dimension Filter") + AD = DocType("Accounting Dimension") + + accounting_dimension_filter = ( + frappe.qb.from_(ADF) + .join(AD) + .on(AD.document_type == ADF.accounting_dimension) + .select(ADF.name, AD.fieldname, ADF.accounting_dimension) + ).run(as_dict=True) + + for doc in accounting_dimension_filter: + value = doc.fieldname or frappe.scrub(doc.accounting_dimension) + frappe.db.set_value( + "Accounting Dimension Filter", + doc.name, + "fieldname", + value, + update_modified=False, + ) + + +def default_accounting_dimension(): + ADF = DocType("Accounting Dimension Filter") + for dim in ("Cost Center", "Project"): + ( + frappe.qb.update(ADF) + .set(ADF.fieldname, frappe.scrub(dim)) + .where(ADF.accounting_dimension == dim) + .run() + )