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 95dd735ec57..ef4d475dca4 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 @@ -92,8 +92,10 @@ class SerialandBatchBundle(Document): if self.type_of_transaction == "Maintenance": return - self.validate_serial_nos_duplicate() - self.check_future_entries_exists() + if not self.flags.ignore_validate_serial_batch or frappe.flags.in_test: + self.validate_serial_nos_duplicate() + self.check_future_entries_exists() + self.set_is_outward() self.calculate_total_qty() self.set_warehouse() @@ -340,6 +342,9 @@ class SerialandBatchBundle(Document): rate = frappe.db.get_value(child_table, self.voucher_detail_no, valuation_field) for d in self.entries: + if (d.incoming_rate == rate) and d.qty and d.stock_value_difference: + continue + d.incoming_rate = flt(rate, precision) if d.qty: d.stock_value_difference = flt(d.qty) * flt(d.incoming_rate) @@ -841,6 +846,9 @@ class SerialandBatchBundle(Document): self.validate_serial_nos_inventory() def set_purchase_document_no(self): + if self.flags.ignore_validate_serial_batch: + return + if not self.has_serial_no: return diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index 431fdf681ff..11c4b1c14f7 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -434,7 +434,6 @@ }, { "default": "1", - "depends_on": "use_serial_batch_fields", "description": "If enabled, do not update serial / batch values in the stock transactions on creation of auto Serial \n / Batch Bundle. ", "fieldname": "do_not_update_serial_batch_on_creation_of_auto_bundle", "fieldtype": "Check", @@ -460,7 +459,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-07-15 17:18:23.872161", + "modified": "2024-07-29 14:55:19.093508", "modified_by": "Administrator", "module": "Stock", "name": "Stock Settings", diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index aafa04ae52c..07e46312d3e 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -110,6 +110,7 @@ class SerialBatchBundle: "type_of_transaction": "Inward" if self.sle.actual_qty > 0 else "Outward", "company": self.company, "is_rejected": self.is_rejected_entry(), + "make_bundle_from_sle": 1, } ).make_serial_and_batch_bundle() @@ -160,12 +161,13 @@ class SerialBatchBundle: if msg: error_msg = ( - f"Serial and Batch Bundle not set for item {self.item_code} in warehouse {self.warehouse}." + f"Serial and Batch Bundle not set for item {self.item_code} in warehouse {self.warehouse}" + msg ) frappe.throw(_(error_msg)) def set_serial_and_batch_bundle(self, sn_doc): + self.sle.auto_created_serial_and_batch_bundle = 1 self.sle.db_set({"serial_and_batch_bundle": sn_doc.name, "auto_created_serial_and_batch_bundle": 1}) if sn_doc.is_rejected: @@ -324,6 +326,9 @@ class SerialBatchBundle: def set_warehouse_and_status_in_serial_nos(self): from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos as get_parsed_serial_nos + if self.sle.auto_created_serial_and_batch_bundle and self.sle.actual_qty > 0: + return + serial_nos = get_serial_nos(self.sle.serial_and_batch_bundle) if not self.sle.serial_and_batch_bundle and self.sle.serial_no: serial_nos = get_parsed_serial_nos(self.sle.serial_no) @@ -928,6 +933,10 @@ class SerialBatchCreation: if doc.voucher_no and frappe.get_cached_value(doc.voucher_type, doc.voucher_no, "docstatus") == 2: doc.voucher_no = "" + doc.flags.ignore_validate_serial_batch = False + if self.get("make_bundle_from_sle") and self.type_of_transaction == "Inward": + doc.flags.ignore_validate_serial_batch = True + doc.save() self.validate_qty(doc) @@ -1120,6 +1129,10 @@ class SerialBatchCreation: msg = f"Please set Serial No Series in the item {self.item_code} or create Serial and Batch Bundle manually." frappe.throw(_(msg)) + voucher_no = "" + if self.get("voucher_no"): + voucher_no = self.get("voucher_no") + for _i in range(abs(cint(self.actual_qty))): serial_no = make_autoname(self.serial_no_series, "Serial No") sr_nos.append(serial_no) @@ -1137,6 +1150,7 @@ class SerialBatchCreation: self.item_name, self.description, "Active", + voucher_no, self.batch_no, ) ) @@ -1155,6 +1169,7 @@ class SerialBatchCreation: "item_name", "description", "status", + "purchase_document_no", "batch_no", ]