From 2e5fc38179f0f40b0ad410541067c596f0fdbd3a Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 24 Jul 2026 18:45:07 +0530 Subject: [PATCH] fix: migrate stored AR/AP ageing filter to renamed field (cherry picked from commit f13cd004945207d724f967b490c6a5952fb7ad15) # Conflicts: # erpnext/patches.txt --- erpnext/patches.txt | 7 +++ .../v16_0/rename_ar_ap_ageing_filter.py | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 erpnext/patches/v16_0/rename_ar_ap_ageing_filter.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index d39fb36c2f6..fb674bbc907 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -491,3 +491,10 @@ erpnext.patches.v15_0.backfill_sla_link_filters_on_docfield erpnext.patches.v16_0.crm_settings_handle_allowed_users_for_frappe_crm erpnext.patches.v16_0.backfill_pick_list_transferred_qty erpnext.patches.v16_0.access_control_for_project_users +<<<<<<< HEAD +======= +erpnext.patches.v16_0.enable_book_stock_expense_gl_entries +execute:frappe.db.set_single_value("Stock Settings", "use_inline_serial_batch_editor", 0) +erpnext.patches.v16_0.recompute_production_plan_reserved_qty +erpnext.patches.v16_0.rename_ar_ap_ageing_filter +>>>>>>> f13cd00494 (fix: migrate stored AR/AP ageing filter to renamed field) diff --git a/erpnext/patches/v16_0/rename_ar_ap_ageing_filter.py b/erpnext/patches/v16_0/rename_ar_ap_ageing_filter.py new file mode 100644 index 00000000000..8252c3b0aac --- /dev/null +++ b/erpnext/patches/v16_0/rename_ar_ap_ageing_filter.py @@ -0,0 +1,45 @@ +import frappe + +REPORTS = ( + "Accounts Receivable", + "Accounts Payable", + "Accounts Receivable Summary", + "Accounts Payable Summary", +) + + +def execute(): + # filter `calculate_ageing_with` -> `age_as_on`, option "Today Date" -> "Today" + _migrate("Auto Email Report", "filters", "report") + _migrate("Dashboard Chart", "filters_json", "report_name", type_field="chart_type") + _migrate("Number Card", "filters_json", "report_name", type_field="type") + + +def _migrate(doctype, filter_field, report_field, type_field=None): + conditions = {report_field: ("in", REPORTS)} + if type_field: + conditions[type_field] = "Report" + + for row in frappe.get_all(doctype, filters=conditions, fields=["name", filter_field]): + updated = _rewrite(row.get(filter_field)) + if updated is not None: + frappe.db.set_value(doctype, row.name, filter_field, updated, update_modified=False) + + +def _rewrite(raw): + if not raw: + return None + + try: + filters = frappe.parse_json(raw) + except ValueError: + return None + + if not isinstance(filters, dict) or "calculate_ageing_with" not in filters: + return None + + filters["age_as_on"] = filters.pop("calculate_ageing_with") + if filters["age_as_on"] == "Today Date": + filters["age_as_on"] = "Today" + + return frappe.as_json(filters, indent=None)