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 d9071c406a2..690e3c81c92 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 @@ -2297,7 +2297,11 @@ def get_auto_batch_nos(kwargs): stock_ledgers_batches = get_stock_ledgers_batches(kwargs) pos_invoice_batches = get_reserved_batches_for_pos(kwargs) - sre_reserved_batches = get_reserved_batches_for_sre(kwargs) + + sre_reserved_batches = frappe._dict() + if not kwargs.ignore_reserved_stock: + sre_reserved_batches = get_reserved_batches_for_sre(kwargs) + picked_batches = frappe._dict() if kwargs.get("is_pick_list"): picked_batches = get_picked_batches(kwargs) diff --git a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py index ddbf0b2dc25..942c7f482ae 100644 --- a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py +++ b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py @@ -678,6 +678,36 @@ class TestStockReservationEntry(FrappeTestCase): # Test - 1: ValidationError should be thrown as the inwarded stock is reserved. self.assertRaises(frappe.ValidationError, se.cancel) + @change_settings("Stock Settings", {"allow_negative_stock": 0, "enable_stock_reservation": 1}) + def test_reserved_stock_validation_for_batch_item(self): + item_properties = { + "is_stock_item": 1, + "valuation_rate": 100, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "SRBV-.#####.", + } + sr_item = make_item(item_code="Test Reserve Item", properties=item_properties) + # inward 100 qty of stock + create_material_receipt(items={sr_item.name: sr_item}, warehouse=self.warehouse, qty=100) + + # reserve 80 qty from sales order + so = make_sales_order(item_code=sr_item.name, warehouse=self.warehouse, qty=80) + so.create_stock_reservation_entries() + + # create a material issue entry including the reserved qty 10 + se = make_stock_entry( + item_code=sr_item.name, + qty=30, + from_warehouse=self.warehouse, + rate=100, + purpose="Material Issue", + do_not_submit=True, + ) + + # validation for reserved stock should be thrown + self.assertRaises(frappe.ValidationError, se.submit) + def tearDown(self) -> None: cancel_all_stock_reservation_entries() return super().tearDown() diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index f4956e1b600..8b61ca56983 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -2313,6 +2313,7 @@ def validate_reserved_batch_nos(kwargs): "posting_date": kwargs.posting_date, "posting_time": kwargs.posting_time, "ignore_voucher_nos": kwargs.ignore_voucher_nos, + "ignore_reserved_stock": True, } ) )