[patch][serial no] for striped serial nos
diff --git a/patches/april_2013/__init__.py b/patches/april_2013/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patches/april_2013/__init__.py
diff --git a/patches/april_2013/p01_update_serial_no_valuation_rate.py b/patches/april_2013/p01_update_serial_no_valuation_rate.py
new file mode 100644
index 0000000..1058473
--- /dev/null
+++ b/patches/april_2013/p01_update_serial_no_valuation_rate.py
@@ -0,0 +1,26 @@
+import webnotes
+from webnotes.utils import cstr
+from stock.stock_ledger import update_entries_after
+
+def execute():
+	pr_items = webnotes.conn.sql("""select item_code, warehouse, serial_no, valuation_rate, name 
+		from `tabPurchase Receipt Item` where ifnull(serial_no, '') != '' and docstatus = 1""", 
+		as_dict=True)
+		
+	item_warehouse = []
+		
+	for item in pr_items:
+		serial_nos = cstr(item.serial_no).strip().split("\n")
+		serial_nos = map(lambda x: x.strip(), serial_nos)
+
+		webnotes.conn.sql("""update `tabPurchase Receipt Item` set serial_no = %s 
+			where name = %s""", ("\n".join(serial_nos), item.name))
+		
+		webnotes.conn.sql("""update `tabSerial No` set purchase_rate = %s where name in (%s)""" % 
+			('%s', ', '.join(['%s']*len(serial_nos))), tuple([item.valuation_rate] + serial_nos))
+
+		if [item.item_code, item.warehouse] not in item_warehouse:
+			item_warehouse.append([item.item_code, item.warehouse])
+
+	for d in item_warehouse:
+		update_entries_after({"item_code": d[0], "warehouse": d[1] })
\ No newline at end of file
diff --git a/patches/march_2013/p07_update_valuation_rate.py b/patches/march_2013/p07_update_valuation_rate.py
index 51e556b..7cc3e11 100644
--- a/patches/march_2013/p07_update_valuation_rate.py
+++ b/patches/march_2013/p07_update_valuation_rate.py
@@ -8,6 +8,6 @@
 		pi.update_raw_material_cost()
 		pi.update_valuation_rate("entries")
 		for item in pi.doclist.get({"parentfield": "entries"}):
-			webnotes.conn.set_value("Purchase Invoice Item", item.name, "valuation_rate",
-				item.valuation_rate)
+			webnotes.conn.sql("""update `tabPurchase Invoice Item` set valuation_rate = %s 
+				where name = %s""", (item.valuation_rate, item.name))
 	
\ No newline at end of file
diff --git a/patches/march_2013/p10_update_against_expense_account.py b/patches/march_2013/p10_update_against_expense_account.py
index d1bad5c..3506ac4 100644
--- a/patches/march_2013/p10_update_against_expense_account.py
+++ b/patches/march_2013/p10_update_against_expense_account.py
@@ -5,7 +5,7 @@
 		where docstatus = 1 and ifnull(against_expense_account, '') = ''""")
 		
 	for pi in pi_list:
-	    pi_obj = get_obj("Purchase Invoice", pi[0], with_children=1)
-	    pi_obj.set_against_expense_account()
-	    webnotes.conn.set_value("Purchase Invoice", pi[0], 
-			"against_expense_account", pi_obj.doc.against_expense_account)
\ No newline at end of file
+		pi_obj = get_obj("Purchase Invoice", pi[0], with_children=1)
+		pi_obj.set_against_expense_account()
+		webnotes.conn.sql("""update `tabPurchase Invoice` set against_expense_account = %s 
+			where name = %s""", (pi_obj.doc.against_expense_account, pi[0]))
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 905ea29..544fc95 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -227,4 +227,5 @@
 	"patches.march_2013.p10_update_against_expense_account",
 	"patches.march_2013.p11_update_attach_files",
 	"patches.march_2013.p12_set_item_tax_rate_in_json",
+	"patches.april_2013.p01_update_serial_no_valuation_rate",
 ]
\ No newline at end of file
diff --git a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index 1fb7b9a..e5fd12c 100644
--- a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -212,7 +212,8 @@
 				if flt(d.qty):
 					d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost)/flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
 					d.save()
-					self.update_serial_no(d.serial_no, d.valuation_rate)
+					if d.serial_no:
+						self.update_serial_no(d.serial_no, d.valuation_rate)
 				sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name))
 				
 				res = sql("""select item_code, warehouse, posting_date, posting_time 
@@ -226,10 +227,10 @@
 	
 	def update_serial_no(self, sr_no, rate):
 		""" update valuation rate in serial no"""
-		sr_no = cstr(sr_no).split('\n')
-		for d in sr_no:
-			sql("update `tabSerial No` set purchase_rate = %s where name = %s", (rate, d))
-
+		sr_no = map(lambda x: x.strip(), cstr(sr_no).split('\n'))
+		
+		webnotes.conn.sql("""update `tabSerial No` set purchase_rate = %s where name in (%s)""" % 
+			('%s', ', '.join(['%s']*len(sr_no))), tuple([rate] + sr_no))
 				
 	def update_landed_cost(self):
 		""" 
diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py
index fcb4a54..a90ed90 100644
--- a/stock/doctype/stock_ledger/stock_ledger.py
+++ b/stock/doctype/stock_ledger/stock_ledger.py
@@ -38,10 +38,10 @@
 		
 		for d in getlist(obj.doclist, table_name):
 			if d.serial_no:
-				d.serial_no = cstr(d.serial_no).strip().replace(',', '\n')
+				serial_nos = cstr(d.serial_no).strip().replace(',', '\n').split('\n')
+				d.serial_nos = ", ".join(map(lambda x: x.strip(), serial_nos))
 				d.save()
 
-
 	def validate_serial_no_warehouse(self, obj, fname):
 		for d in getlist(obj.doclist, fname):
 			wh = d.warehouse or d.s_warehouse
@@ -84,6 +84,7 @@
 		item_details = webnotes.conn.sql("""select item_group, warranty_period 
 			from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or 
 			end_of_life = '0000-00-00' or end_of_life > now()) """ %(d.item_code), as_dict=1)
+		webnotes.errprint([d.item_code, d.valuation_rate])
 		
 		s.purchase_document_type	=	obj.doc.doctype
 		s.purchase_document_no		=	obj.doc.name