[fix] [minor] serial no status update for material transfer
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 320614a..ff28031 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -259,4 +259,5 @@
 	"execute:webnotes.bean('Style Settings').save() #2013-08-20",
 	"patches.september_2013.p01_fix_buying_amount_gl_entries",
 	"patches.september_2013.p01_update_communication",
+	"patches.september_2013.p02_fix_serial_no_status",
 ]
\ No newline at end of file
diff --git a/patches/september_2013/p02_fix_serial_no_status.py b/patches/september_2013/p02_fix_serial_no_status.py
new file mode 100644
index 0000000..8c91d72
--- /dev/null
+++ b/patches/september_2013/p02_fix_serial_no_status.py
@@ -0,0 +1,28 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	stock_entries = webnotes.conn.sql("""select ste_item.serial_no, ste.name 
+		from `tabStock Entry Detail` ste_item, `tabStock Entry` ste
+		where ste.name = ste_item.parent
+		and ifnull(ste_item.serial_no, '') != '' 
+		and ste.purpose='Material Transfer'
+		and ste.modified>='2013-08-14'
+		order by ste.posting_date desc, ste.posting_time desc, ste.name desc""", as_dict=1)
+		
+	for d in stock_entries:
+		serial_nos = d.serial_no.split("\n")
+		for serial_no in serial_nos:
+			serial_bean = webnotes.bean("Serial No", serial_no)
+			if serial_bean.doc.status == "Not Available":
+				latest_sle = webnotes.conn.sql("""select voucher_no from `tabStock Ledger Entry`
+					where item_code=%s and warehouse=%s and serial_no like %s 
+					order by name desc limit 1""", 
+					(serial_bean.doc.item_code, serial_bean.doc.warehouse, "%%%s%%" % serial_no))
+					
+				if latest_sle and latest_sle[0][0] == d.name:
+					serial_bean.doc.status = "Available"
+					serial_bean.save()
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index e3fc67e..6a61461 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -343,10 +343,14 @@
 	def update_stock_ledger(self, is_cancelled=0):
 		self.values = []			
 		for d in getlist(self.doclist, 'mtn_details'):
-			if cstr(d.s_warehouse):
+			if cstr(d.s_warehouse) and not is_cancelled:
 				self.add_to_values(d, cstr(d.s_warehouse), -flt(d.transfer_qty), is_cancelled)
+				
 			if cstr(d.t_warehouse):
 				self.add_to_values(d, cstr(d.t_warehouse), flt(d.transfer_qty), is_cancelled)
+				
+			if cstr(d.s_warehouse) and is_cancelled:
+				self.add_to_values(d, cstr(d.s_warehouse), -flt(d.transfer_qty), is_cancelled)
 		
 		get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values, 
 			self.doc.amended_from and 'Yes' or 'No')
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 58fc828..2f36538 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -119,13 +119,14 @@
 
 						if self.doc.actual_qty < 0:
 							if sr.doc.warehouse!=self.doc.warehouse:
-								webnotes.throw(_("Warehouse does not belong to Item") + \
-									(": %s (%s)" % (self.doc.item_code, serial_no)), SerialNoWarehouseError)
+								webnotes.throw(_("Serial No") + ": " + serial_no + 
+									_(" does not belong to Warehouse") + ": " + self.doc.warehouse, 
+									SerialNoWarehouseError)
 								
 							if self.doc.voucher_type in ("Delivery Note", "Sales Invoice") \
 								and sr.doc.status != "Available":
-								webnotes.throw(_("Serial No status must be 'Available' to Deliver") + \
-									": " + serial_no, SerialNoStatusError)
+								webnotes.throw(_("Serial No status must be 'Available' to Deliver") 
+									+ ": " + serial_no, SerialNoStatusError)
 								
 									
 							sr.doc.warehouse = None