Merge pull request #52640 from ruthra-kumar/use_query_builder_for_sales_person_commision

refactor: use query builder for sales person commission summary
This commit is contained in:
ruthra kumar
2026-02-12 12:36:43 +05:30
committed by GitHub

View File

@@ -3,7 +3,8 @@
import frappe import frappe
from frappe import _, msgprint from frappe import _, msgprint, qb
from frappe.query_builder import Criterion
def execute(filters=None): def execute(filters=None):
@@ -97,45 +98,53 @@ def get_columns(filters):
def get_entries(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) conditions = get_conditions(dt, st, filters, date_field)
entries = frappe.db.sql( entries = (
""" qb.from_(dt)
select .join(st)
dt.name, dt.customer, dt.territory, dt.{} as posting_date,dt.base_net_total as base_net_amount, .on(st.parent.eq(dt.name) & st.parenttype.eq(filters["doc_type"]))
st.commission_rate,st.sales_person, st.allocated_percentage, st.allocated_amount, st.incentives .select(
from dt.name,
`tab{}` dt, `tabSales Team` st dt.customer,
where dt.territory,
st.parent = dt.name and st.parenttype = {} date_field.as_("posting_date"),
and dt.docstatus = 1 {} order by dt.name desc,st.sales_person dt.base_net_total.as_("base_net_amount"),
""".format(date_field, filters["doc_type"], "%s", conditions), st.commission_rate,
tuple([filters["doc_type"], *values]), st.sales_person,
as_dict=1, st.allocated_percentage,
st.allocated_amount,
st.incentives,
)
.where(Criterion.all(conditions))
.orderby(dt.name, st.sales_person)
.run(as_dict=True)
) )
return entries return entries
def get_conditions(filters, date_field): def get_conditions(dt, st, filters, date_field):
conditions = [""] conditions = []
values = []
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"]: for field in ["company", "customer", "territory"]:
if filters.get(field): if filters.get(field):
conditions.append(f"dt.{field}=%s") conditions.append(dt[field].eq(filters.get(field)))
values.append(filters[field])
if filters.get("sales_person"): 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"): return conditions
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