diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index f5367b880a6..d5a808171a6 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4171,6 +4171,36 @@ class TestPurchaseReceipt(IntegrationTestCase): self.assertTrue(sles) + def test_validate_recreate_stock_ledgers_for_sn_item(self): + item_code = "Test SN Item for Recreate Stock Ledgers" + make_item(item_code, {"has_serial_no": 1, "serial_no_series": "SN-TRSLR-.#####"}) + + pr = make_purchase_receipt(item_code=item_code, qty=10, rate=100) + pr.submit() + + sles = frappe.get_all( + "Stock Ledger Entry", + filters={"voucher_type": pr.doctype, "voucher_no": pr.name}, + pluck="name", + ) + + self.assertTrue(sles) + + repost_doc = frappe.get_doc( + { + "doctype": "Repost Item Valuation", + "based_on": "Transaction", + "voucher_type": pr.doctype, + "voucher_no": pr.name, + "posting_date": pr.posting_date, + "posting_time": pr.posting_time, + "company": pr.company, + "recreate_stock_ledgers": 1, + } + ) + + self.assertRaises(frappe.ValidationError, repost_doc.save) + def test_internal_pr_qty_change_only_single_batch(self): from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py index a9d9d893061..b7802290262 100644 --- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py +++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py @@ -76,6 +76,27 @@ class RepostItemValuation(Document): self.reset_field_values() self.validate_accounts_freeze() self.reset_recreate_stock_ledgers() + self.validate_recreate_stock_ledgers() + + def validate_recreate_stock_ledgers(self): + if not self.recreate_stock_ledgers: + return + + items = [] + if self.based_on == "Item and Warehouse": + items.append(self.item_code) + else: + items = get_items_to_be_repost(self.voucher_type, self.voucher_no) + items = list(set([d.item_code for d in items])) + + if serial_batch_items := frappe.get_all( + "Item", or_filters={"has_serial_no": 1, "has_batch_no": 1}, filters={"name": ("in", items)} + ): + item_list = ", ".join([d.name for d in serial_batch_items]) + msg = _( + "Since {0} are Serial No/Batch No items, you cannot enable 'Recreate Stock Ledgers' in Repost Item Valuation." + ).format(item_list) + frappe.throw(msg) def validate_period_closing_voucher(self): # Period Closing Voucher