Merge pull request #50084 from frappe/mergify/bp/version-15-hotfix/pr-50004

fix: add GROUP BY for dn_detail and convert SQL query to QB (backport #50004)
This commit is contained in:
Mihir Kandoi
2025-10-14 15:13:59 +05:30
committed by GitHub
2 changed files with 28 additions and 21 deletions

View File

@@ -334,6 +334,7 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends (
if ( if (
doc.docstatus == 1 && doc.docstatus == 1 &&
!doc.is_return && !doc.is_return &&
doc.per_returned != 100 &&
doc.status != "Closed" && doc.status != "Closed" &&
flt(doc.per_billed) < 100 && flt(doc.per_billed) < 100 &&
frappe.model.can_create("Sales Invoice") frappe.model.can_create("Sales Invoice")

View File

@@ -10,6 +10,8 @@ from frappe.contacts.doctype.address.address import get_company_address
from frappe.desk.notifications import clear_doctype_notifications from frappe.desk.notifications import clear_doctype_notifications
from frappe.model.mapper import get_mapped_doc from frappe.model.mapper import get_mapped_doc
from frappe.model.utils import get_fetch_values from frappe.model.utils import get_fetch_values
from frappe.query_builder import DocType
from frappe.query_builder.functions import Abs, Sum
from frappe.utils import cint, flt from frappe.utils import cint, flt
from erpnext.accounts.party import get_due_date from erpnext.accounts.party import get_due_date
@@ -790,35 +792,39 @@ def get_list_context(context=None):
def get_invoiced_qty_map(delivery_note): def get_invoiced_qty_map(delivery_note):
"""returns a map: {dn_detail: invoiced_qty}""" """returns a map: {dn_detail: invoiced_qty}"""
invoiced_qty_map = {} sii = DocType("Sales Invoice Item")
for dn_detail, qty in frappe.db.sql( invoiced_qty_map = frappe._dict(
"""select dn_detail, qty from `tabSales Invoice Item` (
where delivery_note=%s and docstatus=1""", frappe.qb.from_(sii)
delivery_note, .select(sii.dn_detail, Sum(sii.qty).as_("qty"))
): .where((sii.delivery_note == delivery_note) & (sii.docstatus == 1))
if not invoiced_qty_map.get(dn_detail): .groupby(sii.dn_detail)
invoiced_qty_map[dn_detail] = 0 ).run()
invoiced_qty_map[dn_detail] += qty )
return invoiced_qty_map return invoiced_qty_map
def get_returned_qty_map(delivery_note): def get_returned_qty_map(delivery_note):
"""returns a map: {so_detail: returned_qty}""" """returns a map: {so_detail: returned_qty}"""
dn = DocType("Delivery Note")
dni = DocType("Delivery Note Item")
returned_qty_map = frappe._dict( returned_qty_map = frappe._dict(
frappe.db.sql( (
"""select dn_item.dn_detail, sum(abs(dn_item.qty)) as qty frappe.qb.from_(dni)
from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn .join(dn)
where dn.name = dn_item.parent .on(dn.name == dni.parent)
and dn.docstatus = 1 .select(dni.dn_detail, Sum(Abs(dni.qty)).as_("qty"))
and dn.is_return = 1 .where(
and dn.return_against = %s (dn.docstatus == 1)
and dn_item.qty <= 0 & (dn.is_return == 1)
group by dn_item.item_code & (dn.return_against == delivery_note)
""", & (dni.qty <= 0)
delivery_note, )
) .groupby(dni.dn_detail)
).run()
) )
return returned_qty_map return returned_qty_map