Skip to content

Commit

Permalink
Merge pull request #38013 from frappe/mergify/bp/version-15-hotfix/pr…
Browse files Browse the repository at this point in the history
…-37716

feat: multi-select customer group in AR Report (backport #37716)
  • Loading branch information
ruthra-kumar authored Nov 9, 2023
2 parents b23fa1f + b1714ec commit 54bed25
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,13 @@ frappe.query_reports["Accounts Receivable"] = {
"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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,13 @@ def add_customer_filters(
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")
Expand Down Expand Up @@ -1132,3 +1138,19 @@ def get_exchange_rate_revaluations(self):
.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))
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,30 @@ def test_customer_group_filter(self):
report = execute(filters)[1]
self.assertEqual(len(report), 0)

def test_multi_customer_group_filter(self):
si = self.create_sales_invoice()
cus_group = frappe.db.get_value("Customer", self.customer, "customer_group")
# Create a list of customer groups, e.g., ["Group1", "Group2"]
cus_groups_list = [cus_group, "_Test Customer Group 1"]

filters = {
"company": self.company,
"report_date": today(),
"range1": 30,
"range2": 60,
"range3": 90,
"range4": 120,
"customer_group": cus_groups_list, # Use the list of customer groups
}
report = execute(filters)[1]

# Assert that the report contains data for the specified customer groups
self.assertTrue(len(report) > 0)

for row in report:
# Assert that the customer group of each row is in the list of customer groups
self.assertIn(row.customer_group, cus_groups_list)

def test_party_account_filter(self):
si1 = self.create_sales_invoice()
self.customer2 = (
Expand Down

0 comments on commit 54bed25

Please sign in to comment.