fix: Patch to set status in old serial no data (#21720)

* fix: Patch to set status in old serial no data

* fix: Avoid get_doc in patch

* fix: fetch all values and check status in one query
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index ebbcccc..4ae591b 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -684,3 +684,4 @@
 execute:frappe.rename_doc("Desk Page", "Getting Started", "Home", force=True)
 erpnext.patches.v12_0.unset_customer_supplier_based_on_type_of_item_price
 erpnext.patches.v12_0.set_valid_till_date_in_supplier_quotation
+erpnext.patches.v12_0.set_serial_no_status
diff --git a/erpnext/patches/v12_0/set_serial_no_status.py b/erpnext/patches/v12_0/set_serial_no_status.py
new file mode 100644
index 0000000..4ec84ef
--- /dev/null
+++ b/erpnext/patches/v12_0/set_serial_no_status.py
@@ -0,0 +1,17 @@
+from __future__ import unicode_literals
+import frappe
+from frappe.utils import getdate, nowdate
+
+def execute():
+	frappe.reload_doc('stock', 'doctype', 'serial_no')
+
+	for serial_no in frappe.db.sql("""select name, delivery_document_type, warranty_expiry_date from `tabSerial No`
+		where (status is NULL OR status='')""", as_dict = 1):
+		if serial_no.get("delivery_document_type"):
+			status = "Delivered"
+		elif serial_no.get("warranty_expiry_date") and getdate(serial_no.get("warranty_expiry_date")) <= getdate(nowdate()):
+			status = "Expired"
+		else:
+			status = "Active"
+
+		frappe.db.set_value("Serial No", serial_no.get("name"), "status", status)
\ No newline at end of file