From b426b8c07f92a06a1c2f62a0fc4776755b2cb205 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Fri, 10 Oct 2025 13:31:57 +0530 Subject: [PATCH 1/3] fix: hide sales invoice creation for fully returned delivery notes (cherry picked from commit 1f831d87834aeb455f6ecd612f4b4b7671a675f6) --- erpnext/stock/doctype/delivery_note/delivery_note.js | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 0cd4e24ff93..527d672cc6a 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -334,6 +334,7 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends ( if ( doc.docstatus == 1 && !doc.is_return && + doc.per_returned != 100 && doc.status != "Closed" && flt(doc.per_billed) < 100 && frappe.model.can_create("Sales Invoice") From 9aa9b181e5b44eed49ccb0b1fa3428246febcea8 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Mon, 13 Oct 2025 11:22:29 +0530 Subject: [PATCH 2/3] fix: add GROUP BY for dn_detail and convert SQL query to QB (cherry picked from commit fd9167f2af2ff74a71c81f9b71372653f909365f) # Conflicts: # erpnext/stock/doctype/delivery_note/delivery_note.py --- .../doctype/delivery_note/delivery_note.py | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 6cadbdc5e47..da80b829f4b 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -10,6 +10,8 @@ from frappe.contacts.doctype.address.address import get_company_address from frappe.desk.notifications import clear_doctype_notifications from frappe.model.mapper import get_mapped_doc 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 erpnext.accounts.party import get_due_date @@ -790,23 +792,27 @@ def get_list_context(context=None): def get_invoiced_qty_map(delivery_note): """returns a map: {dn_detail: invoiced_qty}""" - invoiced_qty_map = {} + sii = DocType("Sales Invoice Item") - for dn_detail, qty in frappe.db.sql( - """select dn_detail, qty from `tabSales Invoice Item` - where delivery_note=%s and docstatus=1""", - delivery_note, - ): - if not invoiced_qty_map.get(dn_detail): - invoiced_qty_map[dn_detail] = 0 - invoiced_qty_map[dn_detail] += qty + invoiced_qty_map = frappe._dict( + ( + frappe.qb.from_(sii) + .select(sii.dn_detail, Sum(sii.qty).as_("qty")) + .where((sii.delivery_note == delivery_note) & (sii.docstatus == 1)) + .groupby(sii.dn_detail) + ).run() + ) return invoiced_qty_map def get_returned_qty_map(delivery_note): """returns a map: {so_detail: returned_qty}""" + dn = DocType("Delivery Note") + dni = DocType("Delivery Note Item") + returned_qty_map = frappe._dict( +<<<<<<< HEAD frappe.db.sql( """select dn_item.dn_detail, sum(abs(dn_item.qty)) as qty from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn @@ -819,6 +825,21 @@ def get_returned_qty_map(delivery_note): """, delivery_note, ) +======= + ( + frappe.qb.from_(dni) + .join(dn) + .on(dn.name == dni.parent) + .select(dni.dn_detail, Sum(Abs(dni.qty)).as_("qty")) + .where( + (dn.docstatus == 1) + & (dn.is_return == 1) + & (dn.return_against == delivery_note) + & (dni.qty <= 0) + ) + .groupby(dni.dn_detail) + ).run() +>>>>>>> fd9167f2af (fix: add GROUP BY for dn_detail and convert SQL query to QB) ) return returned_qty_map From 7d533b7086e498229f79c54c3759f12cc90fc53b Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 14 Oct 2025 14:57:28 +0530 Subject: [PATCH 3/3] chore: resolve conflicts --- .../stock/doctype/delivery_note/delivery_note.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index da80b829f4b..d2a15c2bd66 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -812,20 +812,6 @@ def get_returned_qty_map(delivery_note): dni = DocType("Delivery Note Item") returned_qty_map = frappe._dict( -<<<<<<< HEAD - frappe.db.sql( - """select dn_item.dn_detail, sum(abs(dn_item.qty)) as qty - from `tabDelivery Note Item` dn_item, `tabDelivery Note` dn - where dn.name = dn_item.parent - and dn.docstatus = 1 - and dn.is_return = 1 - and dn.return_against = %s - and dn_item.qty <= 0 - group by dn_item.item_code - """, - delivery_note, - ) -======= ( frappe.qb.from_(dni) .join(dn) @@ -839,7 +825,6 @@ def get_returned_qty_map(delivery_note): ) .groupby(dni.dn_detail) ).run() ->>>>>>> fd9167f2af (fix: add GROUP BY for dn_detail and convert SQL query to QB) ) return returned_qty_map