refactor(supplier): Using query builder for get_total_rejected_amount (#54871)

Use the query builder for get_total_rejected_amount to assure compatibility with PostgreSQL.
This commit is contained in:
Loïc Oberle
2026-05-12 19:05:47 +02:00
committed by GitHub
parent 7a292f9ea6
commit 573e37a78d

View File

@@ -296,28 +296,21 @@ def get_total_received_items(scorecard):
def get_total_rejected_amount(scorecard):
"""Gets the total amount (in company currency) rejected in the period (based on Purchase Receipts)"""
supplier = frappe.get_doc("Supplier", scorecard.supplier)
pr = frappe.qb.DocType("Purchase Receipt")
pr_item = frappe.qb.DocType("Purchase Receipt Item")
# Look up all PO Items with delivery dates between our dates
data = frappe.db.sql(
"""
SELECT
SUM(pr_item.rejected_qty * pr_item.base_rate)
FROM
`tabPurchase Receipt Item` pr_item,
`tabPurchase Receipt` pr
WHERE
pr.supplier = %(supplier)s
AND pr.posting_date BETWEEN %(start_date)s AND %(end_date)s
AND pr_item.docstatus = 1
AND pr_item.parent = pr.name""",
{"supplier": supplier.name, "start_date": scorecard.start_date, "end_date": scorecard.end_date},
as_dict=0,
)[0][0]
query = (
frappe.qb.from_(pr)
.join(pr_item)
.on(pr_item.parent == pr.name)
.select(frappe.qb.fn.Sum(pr_item.rejected_qty * pr_item.base_rate))
.where(pr.supplier == scorecard.supplier)
.where(pr.posting_date[scorecard.start_date : scorecard.end_date])
.where(pr_item.docstatus == 1)
)
if not data:
data = 0
return data
result = query.run()
return frappe.utils.flt(result[0][0]) if result else 0.0
def get_total_rejected_items(scorecard):