From e5e3b8a6ae7dbd89493a7721ca79c01d6a2f2b26 Mon Sep 17 00:00:00 2001 From: Dharanidharan2813 Date: Thu, 22 Jan 2026 15:48:28 +0530 Subject: [PATCH] feat(delivery-note): add status indicator when document is partially billed (cherry picked from commit 7767000ccf3a8e4afaf1d4b52f806e6053b086bf) # Conflicts: # erpnext/stock/doctype/delivery_note/delivery_note.json --- erpnext/controllers/status_updater.py | 3 ++- erpnext/stock/doctype/delivery_note/delivery_note.json | 4 ++-- erpnext/stock/doctype/delivery_note/delivery_note.py | 10 +++++++++- .../stock/doctype/delivery_note/delivery_note_list.js | 6 ++++-- .../stock/doctype/delivery_note/test_delivery_note.py | 3 ++- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index cc821b22272..dcecd995a48 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -83,7 +83,8 @@ status_map = { ], "Delivery Note": [ ["Draft", None], - ["To Bill", "eval:self.per_billed < 100 and self.docstatus == 1"], + ["To Bill", "eval:self.per_billed == 0 and self.docstatus == 1"], + ["Partially Billed", "eval:self.per_billed < 100 and self.per_billed > 0 and self.docstatus == 1"], ["Completed", "eval:self.per_billed == 100 and self.docstatus == 1"], ["Return Issued", "eval:self.per_returned == 100 and self.docstatus == 1"], ["Return", "eval:self.is_return == 1 and self.per_billed == 0 and self.docstatus == 1"], diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 97873234dcf..06623192797 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -1091,7 +1091,7 @@ "no_copy": 1, "oldfieldname": "status", "oldfieldtype": "Select", - "options": "\nDraft\nTo Bill\nCompleted\nReturn\nReturn Issued\nCancelled\nClosed", + "options": "\nDraft\nTo Bill\nPartially Billed\nCompleted\nReturn\nReturn Issued\nCancelled\nClosed", "print_hide": 1, "print_width": "150px", "read_only": 1, @@ -1404,7 +1404,7 @@ "idx": 146, "is_submittable": 1, "links": [], - "modified": "2025-12-02 23:55:25.415443", + "modified": "2026-02-03 12:27:19.055918", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index f2c6be169be..b2dd23f80bd 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -127,7 +127,15 @@ class DeliveryNote(SellingController): shipping_rule: DF.Link | None source: DF.Link | None status: DF.Literal[ - "", "Draft", "To Bill", "Completed", "Return", "Return Issued", "Cancelled", "Closed" + "", + "Draft", + "To Bill", + "Partially Billed", + "Completed", + "Return", + "Return Issued", + "Cancelled", + "Closed", ] tax_category: DF.Link | None tax_id: DF.Data | None diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_list.js b/erpnext/stock/doctype/delivery_note/delivery_note_list.js index 0f045bf405d..914063e1041 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_list.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note_list.js @@ -18,8 +18,10 @@ frappe.listview_settings["Delivery Note"] = { return [__("Closed"), "green", "status,=,Closed"]; } else if (doc.status === "Return Issued") { return [__("Return Issued"), "grey", "status,=,Return Issued"]; - } else if (flt(doc.per_billed, 2) < 100) { - return [__("To Bill"), "orange", "per_billed,<,100|docstatus,=,1"]; + } else if (flt(doc.per_billed) == 0) { + return [__("To Bill"), "orange", "per_billed,=,0|docstatus,=,1"]; + } else if (flt(doc.per_billed, 2) > 0 && flt(doc.per_billed, 2) < 100) { + return [__("Partially Billed"), "yellow", "per_billed,<,100|docstatus,=,1"]; } else if (flt(doc.per_billed, 2) === 100) { return [__("Completed"), "green", "per_billed,=,100|docstatus,=,1"]; } diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 4c6c4be2a52..90bae7f68f5 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -1093,7 +1093,8 @@ class TestDeliveryNote(FrappeTestCase): self.assertEqual(dn2.get("items")[0].billed_amt, 400) self.assertEqual(dn2.per_billed, 80) - self.assertEqual(dn2.status, "To Bill") + # Since 20% of DN2 is yet to be billed, it should be classified as partially billed. + self.assertEqual(dn2.status, "Partially Billed") def test_dn_billing_status_case4(self): # SO -> SI -> DN