feat: multi-select customer group in AR Report
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
index 1073be0..393a6ff 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js
@@ -114,10 +114,13 @@
"reqd": 1
},
{
- "fieldname": "customer_group",
+ "fieldname":"customer_group",
"label": __("Customer Group"),
- "fieldtype": "Link",
- "options": "Customer Group"
+ "fieldtype": "MultiSelectList",
+ "options": "Customer Group",
+ get_data: function(txt) {
+ return frappe.db.get_link_options('Customer Group', txt);
+ }
},
{
"fieldname": "payment_terms_template",
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index b9c7a0b..dfe801c 100755
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -823,7 +823,9 @@
self.customer = qb.DocType("Customer")
if self.filters.get("customer_group"):
- self.get_hierarchical_filters("Customer Group", "customer_group")
+ groups = get_customer_group_with_children(self.filters.customer_group)
+ customers = qb.from_(self.customer).select(self.customer.name).where(self.customer['customer_group'].isin(groups))
+ self.qb_selection_filter.append(self.ple.party.isin(customers))
if self.filters.get("territory"):
self.get_hierarchical_filters("Territory", "territory")
@@ -1115,3 +1117,18 @@
.run()
)
self.err_journals = [x[0] for x in results] if results else []
+
+def get_customer_group_with_children(customer_groups):
+ if not isinstance(customer_groups, list):
+ customer_groups = [d.strip() for d in customer_groups.strip().split(",") if d]
+
+ all_customer_groups = []
+ for d in customer_groups:
+ if frappe.db.exists("Customer Group", d):
+ lft, rgt = frappe.db.get_value("Customer Group", d, ["lft", "rgt"])
+ children = frappe.get_all("Customer Group", filters={"lft": [">=", lft], "rgt": ["<=", rgt]})
+ all_customer_groups += [c.name for c in children]
+ else:
+ frappe.throw(_("Customer Group: {0} does not exist").format(d))
+
+ return list(set(all_customer_groups))