From 283bc27af7ab7eeb5bf269061407770ae180bba6 Mon Sep 17 00:00:00 2001 From: iamtalib13 Date: Sat, 15 Aug 2026 19:35:19 +0530 Subject: [PATCH] fix(trade_in): validate trade-in serial number against active warehouse stock --- av_tools/av_tools_hooks/trade_in.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/av_tools/av_tools_hooks/trade_in.py b/av_tools/av_tools_hooks/trade_in.py index 6800e00..6f40cb5 100644 --- a/av_tools/av_tools_hooks/trade_in.py +++ b/av_tools/av_tools_hooks/trade_in.py @@ -39,7 +39,7 @@ def validate_trade_in_serial_no_and_batch(doc, method): ) ) else: - serial_numbers = row.custom_trade_in_serial_no.split("\n") + serial_numbers = [s.strip() for s in row.custom_trade_in_serial_no.split("\n") if s.strip()] if len(serial_numbers) != row.custom_trade_in_qty: error_messages.append( _( @@ -52,6 +52,20 @@ def validate_trade_in_serial_no_and_batch(doc, method): row.idx, ) ) + else: + for sn in serial_numbers: + existing_sn = frappe.db.get_value( + "Serial No", sn, ["name", "warehouse", "status"], as_dict=True + ) + if existing_sn and ( + existing_sn.get("warehouse") or existing_sn.get("status") == "Active" + ): + wh = existing_sn.get("warehouse") or "Active Stock" + error_messages.append( + _( + "Row {0} ({1}): Serial No {2} is already present in warehouse stock ({3})." + ).format(row.idx, row.custom_trade_in_item, sn, wh) + ) if error_messages: frappe.throw( title=_("Validation Errors"),