From a268316322bcc1d2b8a327d9b1161b1e37c1a95c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 20 Jan 2026 13:10:40 +0530 Subject: [PATCH] feat: option to import serial / batches using csv for outward entry --- erpnext/public/js/utils/serial_no_batch_selector.js | 11 ++++++----- erpnext/stock/serial_batch_bundle.py | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js index 5cc7238d6dd..2e02d36528b 100644 --- a/erpnext/public/js/utils/serial_no_batch_selector.js +++ b/erpnext/public/js/utils/serial_no_batch_selector.js @@ -163,7 +163,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { } if (this.item?.type_of_transaction === "Outward") { - fields = [...this.get_filter_fields(), ...fields]; + fields = [...this.get_filter_fields(), ...fields, ...this.get_attach_field()]; } else { fields = [...fields, ...this.get_attach_field()]; } @@ -195,7 +195,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { } let fields = []; - if (this.item.has_serial_no) { + if (this.item.has_serial_no && this.item?.type_of_transaction !== "Outward") { fields.push({ fieldtype: "Check", label: __("Enter Manually"), @@ -217,7 +217,8 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { label: __("Import Using CSV file"), fieldname: "import_using_csv_file", depends_on: "eval:doc.enter_manually !== 1", - default: !this.item.has_serial_no ? 1 : 0, + default: !this.item.has_serial_no || this.item?.type_of_transaction === "Outward" ? 1 : 0, + hidden: this.item?.type_of_transaction === "Outward", change() { if (me.dialog.get_value("import_using_csv_file")) { me.dialog.set_value("enter_manually", 0); @@ -246,7 +247,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { }, ]; - if (this.item?.has_serial_no) { + if (this.item?.has_serial_no && this.item?.type_of_transaction !== "Outward") { fields = [ ...fields, { @@ -267,7 +268,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { ]; } - if (this.item?.has_serial_no) { + if (this.item?.has_serial_no && this.item?.type_of_transaction !== "Outward") { fields = [ ...fields, { diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index a1bd58e3e76..6a63a73158c 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -633,6 +633,9 @@ class SerialNoValuation(DeprecatedSerialNoValuation): self.old_serial_nos = [] serial_nos = self.get_serial_nos() + if not serial_nos: + return + result = self.get_serial_no_wise_incoming_rate(serial_nos) for serial_no in serial_nos: incoming_rate = result.get(serial_no)