diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index a53eb2130a8..f1184851c20 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -936,7 +936,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 54e4c4b2f56..ace7fdcdf7c 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 @@ -718,10 +718,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 @@ -788,11 +791,21 @@ class SerialandBatchBundle(Document): if not self.voucher_detail_no or self.voucher_detail_no != row.name: values_to_set["voucher_detail_no"] = row.name +<<<<<<< HEAD if parent.get("posting_date") and (not self.posting_date or self.posting_date != parent.posting_date): values_to_set["posting_date"] = parent.posting_date or today() if parent.get("posting_time") and (not self.posting_time or self.posting_time != parent.posting_time): values_to_set["posting_time"] = parent.posting_time +======= + 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: + values_to_set["posting_datetime"] = posting_datetime +>>>>>>> c37a56ec89 (fix: voucher detail no in SABB) if parent.doctype in [ "Delivery Note", @@ -1329,7 +1342,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 4d7b3d4aaa4..92dc2942250 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -382,6 +382,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