diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 7f12edb099c..a78f3cdde1f 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -683,16 +683,20 @@ def update_billed_amount_based_on_so(so_detail, update_modified=True): from frappe.query_builder.functions import Sum # Billed against Sales Order directly + si = frappe.qb.DocType("Sales Invoice").as_("si") si_item = frappe.qb.DocType("Sales Invoice Item").as_("si_item") sum_amount = Sum(si_item.amount).as_("amount") billed_against_so = ( frappe.qb.from_(si_item) + .join(si) + .on(si.name == si_item.parent) .select(sum_amount) .where( (si_item.so_detail == so_detail) & ((si_item.dn_detail.isnull()) | (si_item.dn_detail == "")) & (si_item.docstatus == 1) + & (si.update_stock == 0) ) .run() ) diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 165a40b1e12..ebaeac7049a 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -1105,6 +1105,28 @@ class TestDeliveryNote(IntegrationTestCase): self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed") + def test_dn_billing_status_case5(self): + # SO -> SI(with update stock partial invoice) + # SO -> DN + from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note, make_sales_invoice + + so = make_sales_order(po_no="12345") + + si = make_sales_invoice(so.name) + si.get("items")[0].qty = 5 + si.update_stock = 1 + si.submit() + + # Testing if Customer's Purchase Order No was rightly copied + self.assertEqual(so.po_no, si.po_no) + + dn = make_delivery_note(so.name) + dn.submit() + + self.assertEqual(dn.get("items")[0].billed_amt, 0) + self.assertEqual(dn.per_billed, 0) + self.assertEqual(dn.status, "To Bill") + def test_delivery_trip(self): dn = create_delivery_note() dt = make_delivery_trip(dn.name)