From 744d7a2793abeb5a5dff836618499d84243043e6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 1 Mar 2026 13:32:00 +0530 Subject: [PATCH] fix: voucher detail no in SABB (cherry picked from commit c37a56ec899f30638fb1f489e28a7e33b346c81d) --- .../controllers/sales_and_purchase_return.py | 9 ++++++- .../serial_and_batch_bundle.py | 24 +++++++++++++++++-- erpnext/stock/serial_batch_bundle.py | 3 +++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 5deaeca975c..e3c571e71d8 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -1012,7 +1012,14 @@ def get_serial_batches_based_on_bundle(doctype, field, _bundle_ids): if doctype == "Packed Item": if key is None: - key = frappe.get_cached_value("Packed Item", row.voucher_detail_no, field) + key = frappe.get_cached_value( + "Packed Item", + {"parent_detail_docname": row.voucher_detail_no, "item_code": row.item_code}, + field, + ) + if key is None: + key = frappe.get_cached_value("Packed Item", row.voucher_detail_no, field) + if row.voucher_type == "Delivery Note": key = frappe.get_cached_value("Delivery Note Item", key, "dn_detail") elif row.voucher_type == "Sales Invoice": diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index 012503a3d9c..ba332231951 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -717,10 +717,13 @@ class SerialandBatchBundle(Document): if rate is None and child_table in ["Delivery Note Item", "Sales Invoice Item"]: rate = frappe.db.get_value( "Packed Item", - self.voucher_detail_no, + {"parent_detail_docname": self.voucher_detail_no, "item_code": self.item_code}, "incoming_rate", ) + if rate is None: + rate = frappe.db.get_value("Packed Item", self.voucher_detail_no, "incoming_rate") + if rate is not None: is_packed_item = True @@ -787,6 +790,9 @@ class SerialandBatchBundle(Document): if not self.voucher_detail_no or self.voucher_detail_no != row.name: values_to_set["voucher_detail_no"] = row.name + if row.get("doctype") == "Packed Item" and row.get("parent_detail_docname"): + values_to_set["voucher_detail_no"] = row.get("parent_detail_docname") + if parent.get("posting_date") and parent.get("posting_time"): posting_datetime = combine_datetime(parent.posting_date, parent.posting_time) if not self.posting_datetime or self.posting_datetime != posting_datetime: @@ -1325,7 +1331,21 @@ class SerialandBatchBundle(Document): ) if not vouchers and self.voucher_type == "Delivery Note": - frappe.db.set_value("Packed Item", self.voucher_detail_no, "serial_and_batch_bundle", None) + if frappe.db.exists("Packed Item", self.voucher_detail_no): + frappe.db.set_value("Packed Item", self.voucher_detail_no, "serial_and_batch_bundle", None) + else: + packed_items = frappe.get_all( + "Packed Item", + filters={ + "parent_detail_docname": self.voucher_detail_no, + "serial_and_batch_bundle": self.name, + }, + pluck="name", + ) + + for packed_item in packed_items: + frappe.db.set_value("Packed Item", packed_item, "serial_and_batch_bundle", None) + return for voucher in vouchers: diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 199672871dc..5e37aea5498 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -401,6 +401,9 @@ class SerialBatchBundle: def submit_serial_and_batch_bundle(self): doc = frappe.get_doc("Serial and Batch Bundle", self.sle.serial_and_batch_bundle) + if self.sle.voucher_detail_no and doc.voucher_detail_no != self.sle.voucher_detail_no: + doc.voucher_detail_no = self.sle.voucher_detail_no + self.validate_actual_qty(doc) doc.flags.ignore_voucher_validation = True