From 8696ba2f5d9e99c799d4aef577f72f2fae5678e7 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Fri, 15 Aug 2025 00:11:18 +0530 Subject: [PATCH] fix: use query builder instead of raw SQL in get_loyalty_details --- .../loyalty_program/loyalty_program.py | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/erpnext/accounts/doctype/loyalty_program/loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/loyalty_program.py index 17b18c17f23..9237d94053a 100644 --- a/erpnext/accounts/doctype/loyalty_program/loyalty_program.py +++ b/erpnext/accounts/doctype/loyalty_program/loyalty_program.py @@ -5,6 +5,7 @@ import frappe from frappe import _ from frappe.model.document import Document +from frappe.query_builder.functions import Sum from frappe.utils import flt, today @@ -55,26 +56,34 @@ def get_loyalty_details( if not expiry_date: expiry_date = today() - condition = "" - if company: - condition = " and company=%s " % frappe.db.escape(company) - if not include_expired_entry: - condition += " and expiry_date>='%s' " % expiry_date + LoyaltyPointEntry = frappe.qb.DocType("Loyalty Point Entry") - loyalty_point_details = frappe.db.sql( - f"""select sum(loyalty_points) as loyalty_points, - sum(purchase_amount) as total_spent from `tabLoyalty Point Entry` - where customer=%s and loyalty_program=%s and posting_date <= %s - {condition} - group by customer""", - (customer, loyalty_program, expiry_date), - as_dict=1, + query = ( + frappe.qb.from_(LoyaltyPointEntry) + .select( + Sum(LoyaltyPointEntry.loyalty_points).as_("loyalty_points"), + Sum(LoyaltyPointEntry.purchase_amount).as_("total_spent"), + ) + .where( + (LoyaltyPointEntry.customer == customer) + & (LoyaltyPointEntry.loyalty_program == loyalty_program) + & (LoyaltyPointEntry.posting_date <= expiry_date) + ) + .groupby(LoyaltyPointEntry.customer) ) - if loyalty_point_details: - return loyalty_point_details[0] - else: - return {"loyalty_points": 0, "total_spent": 0} + if company: + query = query.where(LoyaltyPointEntry.company == company) + + if not include_expired_entry: + query = query.where(LoyaltyPointEntry.expiry_date >= expiry_date) + + loyalty_point_details = query.run(as_dict=True) + + return { + "loyalty_points": flt(loyalty_point_details[0].loyalty_points), + "total_spent": flt(loyalty_point_details[0].total_spent), + } @frappe.whitelist()