From f98e53692e388be76b089ed773b719b877fa25a4 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 12 Feb 2026 12:02:44 +0530 Subject: [PATCH] refactor: use query builder for sales person commission summary (cherry picked from commit 7105e3fb69b0b2e2ed28fbdcc674231e7aecc3c0) --- .../sales_person_commission_summary.py | 71 +++++++++++-------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py b/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py index 16b2d499af2..b0e611589eb 100644 --- a/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py +++ b/erpnext/selling/report/sales_person_commission_summary/sales_person_commission_summary.py @@ -3,7 +3,8 @@ import frappe -from frappe import _, msgprint +from frappe import _, msgprint, qb +from frappe.query_builder import Criterion def execute(filters=None): @@ -97,45 +98,53 @@ def get_columns(filters): def get_entries(filters): - date_field = filters["doc_type"] == "Sales Order" and "transaction_date" or "posting_date" + dt = qb.DocType(filters["doc_type"]) + st = qb.DocType("Sales Team") + date_field = dt["transaction_date"] if filters["doc_type"] == "Sales Order" else dt["posting_date"] - conditions, values = get_conditions(filters, date_field) - entries = frappe.db.sql( - """ - select - dt.name, dt.customer, dt.territory, dt.{} as posting_date,dt.base_net_total as base_net_amount, - st.commission_rate,st.sales_person, st.allocated_percentage, st.allocated_amount, st.incentives - from - `tab{}` dt, `tabSales Team` st - where - st.parent = dt.name and st.parenttype = {} - and dt.docstatus = 1 {} order by dt.name desc,st.sales_person - """.format(date_field, filters["doc_type"], "%s", conditions), - tuple([filters["doc_type"], *values]), - as_dict=1, + conditions = get_conditions(dt, st, filters, date_field) + entries = ( + qb.from_(dt) + .join(st) + .on(st.parent.eq(dt.name) & st.parenttype.eq(filters["doc_type"])) + .select( + dt.name, + dt.customer, + dt.territory, + date_field.as_("posting_date"), + dt.base_net_total.as_("base_net_amount"), + st.commission_rate, + st.sales_person, + st.allocated_percentage, + st.allocated_amount, + st.incentives, + ) + .where(Criterion.all(conditions)) + .orderby(dt.name, st.sales_person) + .run(as_dict=True) ) return entries -def get_conditions(filters, date_field): - conditions = [""] - values = [] +def get_conditions(dt, st, filters, date_field): + conditions = [] + + conditions.append(dt.docstatus.eq(1)) + from_dt = filters.get("from_date") + to_dt = filters.get("to_date") + if from_dt and to_dt: + conditions.append(date_field.between(from_dt, to_dt)) + elif from_dt and not to_dt: + conditions.append(date_field.gte(from_dt)) + elif not from_dt and to_dt: + conditions.append(date_field.lte(to_dt)) for field in ["company", "customer", "territory"]: if filters.get(field): - conditions.append(f"dt.{field}=%s") - values.append(filters[field]) + conditions.append(dt[field].eq(filters.get(field))) if filters.get("sales_person"): - conditions.append("st.sales_person = '{}'".format(filters.get("sales_person"))) + conditions.append(st["sales_person"].eq(filters.get("sales_person"))) - if filters.get("from_date"): - conditions.append(f"dt.{date_field}>=%s") - values.append(filters["from_date"]) - - if filters.get("to_date"): - conditions.append(f"dt.{date_field}<=%s") - values.append(filters["to_date"]) - - return " and ".join(conditions), values + return conditions