From 764c71d3e16cf7c1b22e81351e63b439d5ef8385 Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Wed, 18 Jun 2025 18:13:54 +0530 Subject: [PATCH 1/3] fix: modify query to fetch valid return qty --- .../stock/doctype/delivery_note/delivery_note.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 2d44293d66f..7b9ddb7a129 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -793,13 +793,15 @@ def get_returned_qty_map(delivery_note): """returns a map: {so_detail: returned_qty}""" returned_qty_map = frappe._dict( frappe.db.sql( - """select dn_item.dn_detail, 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 - """, + """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, ) ) From 4576fcd96f48c61f1c5f02f89a1e1376ca039c0a Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Wed, 18 Jun 2025 18:14:43 +0530 Subject: [PATCH 2/3] test: add test for validating sales invoice qty after return --- .../delivery_note/test_delivery_note.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index f34ebe4cd87..c39c5427ff0 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -6,6 +6,7 @@ import json from collections import defaultdict import frappe +from frappe.tests import change_settings from frappe.tests.utils import FrappeTestCase from frappe.utils import add_days, cstr, flt, getdate, nowdate, nowtime, today @@ -1022,6 +1023,30 @@ class TestDeliveryNote(FrappeTestCase): self.assertEqual(dn2.per_billed, 100) self.assertEqual(dn2.status, "Completed") + @change_settings("Accounts Settings", {"delete_linked_ledger_entries": True}) + def test_sales_invoice_qty_after_return(self): + from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return + + dn = create_delivery_note(qty=10) + + dnr1 = make_sales_return(dn.name) + dnr1.get("items")[0].qty = -3 + dnr1.save().submit() + + dnr2 = make_sales_return(dn.name) + dnr2.get("items")[0].qty = -2 + dnr2.save().submit() + + si = make_sales_invoice(dn.name) + si.save().submit() + + self.assertEqual(si.get("items")[0].qty, 5) + + si.reload().cancel().delete() + dnr1.reload().cancel().delete() + dnr2.reload().cancel().delete() + dn.reload().cancel().delete() + def test_dn_billing_status_case3(self): # SO -> DN1 -> SI and SO -> SI and SO -> DN2 from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note From 9146bd95a455e5b9ee63090c4406c3cac1bfd8c0 Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Wed, 18 Jun 2025 18:41:01 +0530 Subject: [PATCH 3/3] test: update import for change_settings --- erpnext/stock/doctype/delivery_note/test_delivery_note.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index c39c5427ff0..00ce64b614c 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -6,8 +6,7 @@ import json from collections import defaultdict import frappe -from frappe.tests import change_settings -from frappe.tests.utils import FrappeTestCase +from frappe.tests.utils import FrappeTestCase, change_settings from frappe.utils import add_days, cstr, flt, getdate, nowdate, nowtime, today from erpnext.accounts.doctype.account.test_account import get_inventory_account