[fix] [minor] insert cancelled sl entry for serialized inventory and at the end delete
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 6b6472a..b97ca3a 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -111,7 +111,7 @@
 
 	def on_cancel(self):
 		if cint(self.doc.update_stock) == 1:
-			self.delete_and_repost_sle()
+			self.update_stock_ledger()
 			self.update_serial_nos(cancel = True)
 		
 		sales_com_obj = get_obj(dt = 'Sales Common')
diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py
index c54fbb4..0ed2e2e 100644
--- a/controllers/stock_controller.py
+++ b/controllers/stock_controller.py
@@ -75,6 +75,7 @@
 			"batch_no": cstr(d.batch_no).strip(),
 			"serial_no": d.serial_no,
 			"project": d.project_name,
+			"is_cancelled": self.doc.docstatus==2 and "Yes" or "No"
 		}
 		
 		sl_dict.update(args)
@@ -84,29 +85,6 @@
 		from stock.stock_ledger import make_sl_entries
 		make_sl_entries(sl_entries, is_amended)
 		
-	def delete_and_repost_sle(self):
-		"""	Delete Stock Ledger Entries related to this voucher
-			and repost future Stock Ledger Entries"""
-		
-		from stock.stock_ledger import update_entries_after
-		
-		existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse 
-			from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", 
-			(self.doc.doctype, self.doc.name), as_dict=1)
-				
-		# delete entries
-		webnotes.conn.sql("""delete from `tabStock Ledger Entry` 
-			where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
-		
-		# repost future entries for selected item_code, warehouse
-		for entries in existing_entries:
-			update_entries_after({
-				"item_code": entries.item_code,
-				"warehouse": entries.warehouse,
-				"posting_date": self.doc.posting_date,
-				"posting_time": self.doc.posting_time
-			})
-		
 	def get_stock_ledger_entries(self, item_list=None, warehouse_list=None):
 		out = {}
 		
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index 227d773..9e32f2a 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -292,15 +292,11 @@
 					and d.warehouse:
 				self.update_reserved_qty(d)
 										
-				if self.doc.docstatus == 1:
-					sl_entries.append(self.get_sl_entries(d, {
-						"actual_qty": -1*flt(d['qty']),
-					}))
+				sl_entries.append(self.get_sl_entries(d, {
+					"actual_qty": -1*flt(d['qty']),
+				}))
 					
-		if self.doc.docstatus == 1:
-			self.make_sl_entries(sl_entries)
-		else:
-			self.delete_and_repost_sle()
+		self.make_sl_entries(sl_entries)
 			
 	def update_reserved_qty(self, d):
 		if d['reserved_qty'] < 0 :
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index e8d468f..3ce0a48 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -153,27 +153,23 @@
 				pr_qty = flt(d.qty) * flt(d.conversion_factor)
 				self.update_ordered_qty(pr_qty, d)
 				
-				if self.doc.docstatus == 1:
-					if pr_qty:
-						sl_entries.append(self.get_sl_entries(d, {
-							"actual_qty": flt(pr_qty),
-							"serial_no": cstr(d.serial_no).strip(),
-							"incoming_rate": d.valuation_rate
-						}))
-					
-					if flt(d.rejected_qty) > 0:
-						sl_entries.append(self.get_sl_entries(d, {
-							"warehouse": self.doc.rejected_warehouse,
-							"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
-							"serial_no": cstr(d.rejected_serial_no).strip(),
-							"incoming_rate": d.valuation_rate
-						}))
+				if pr_qty:
+					sl_entries.append(self.get_sl_entries(d, {
+						"actual_qty": flt(pr_qty),
+						"serial_no": cstr(d.serial_no).strip(),
+						"incoming_rate": d.valuation_rate
+					}))
+				
+				if flt(d.rejected_qty) > 0:
+					sl_entries.append(self.get_sl_entries(d, {
+						"warehouse": self.doc.rejected_warehouse,
+						"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor),
+						"serial_no": cstr(d.rejected_serial_no).strip(),
+						"incoming_rate": d.valuation_rate
+					}))
 						
-		if self.doc.docstatus == 1:
-			self.bk_flush_supp_wh(sl_entries)
-			self.make_sl_entries(sl_entries)
-		else:
-			self.delete_and_repost_sle()
+		self.bk_flush_supp_wh(sl_entries)
+		self.make_sl_entries(sl_entries)
 		
 	def update_ordered_qty(self, pr_qty, d):
 		pc_obj = get_obj('Purchase Common')
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index c3b9a15..3371a5a 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -56,7 +56,7 @@
 		self.make_gl_entries()
 
 	def on_cancel(self):
-		self.delete_and_repost_sle()
+		self.update_stock_ledger()
 		self.update_serial_no(0)
 		self.update_production_order(0)
 		self.make_cancel_gl_entries()
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
index cee1d0e..047f778 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-29 19:25:42", 
   "docstatus": 0, 
-  "modified": "2013-08-20 11:56:25", 
+  "modified": "2013-08-20 15:02:48", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -273,6 +273,15 @@
   "width": "150px"
  }, 
  {
+  "doctype": "DocField", 
+  "fieldname": "is_cancelled", 
+  "fieldtype": "Select", 
+  "hidden": 1, 
+  "label": "Is Cancelled", 
+  "options": "\nNo\nYes", 
+  "report_hide": 1
+ }, 
+ {
   "amend": 0, 
   "cancel": 0, 
   "create": 0, 
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 6bbfe8b..c5fb552 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -252,6 +252,27 @@
 
 		# append to entries
 		self.entries.append(args)
+		
+	def delete_and_repost_sle(self):
+		"""	Delete Stock Ledger Entries related to this voucher
+			and repost future Stock Ledger Entries"""
+				
+		existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse 
+			from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", 
+			(self.doc.doctype, self.doc.name), as_dict=1)
+				
+		# delete entries
+		webnotes.conn.sql("""delete from `tabStock Ledger Entry` 
+			where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name))
+		
+		# repost future entries for selected item_code, warehouse
+		for entries in existing_entries:
+			update_entries_after({
+				"item_code": entries.item_code,
+				"warehouse": entries.warehouse,
+				"posting_date": self.doc.posting_date,
+				"posting_time": self.doc.posting_time
+			})
 			
 	def set_stock_value_difference(self):
 		"""stock_value_difference is the increment in the stock value"""
diff --git a/stock/stock_ledger.py b/stock/stock_ledger.py
index 3bb3a00..740120c 100644
--- a/stock/stock_ledger.py
+++ b/stock/stock_ledger.py
@@ -12,7 +12,16 @@
 
 def make_sl_entries(sl_entries, is_amended=None):
 	from stock.utils import update_bin
+	
+	cancel = True if sl_entries[0].get("is_cancelled") == "Yes" else False
+	if cancel:
+		set_as_cancel(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type'))
+	
 	for sle in sl_entries:
+		sle_id = None
+		if sle.get('is_cancelled') == 'Yes':
+			sle['actual_qty'] = -flt(sle['actual_qty'])
+		
 		if sle.get("actual_qty"):
 			sle_id = make_entry(sle)
 			
@@ -23,6 +32,15 @@
 		})
 		update_bin(args)
 		
+	if cancel:
+		delete_cancelled_entry(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type'))
+			
+def set_as_cancel(voucher_type, voucher_no):
+	webnotes.conn.sql("""update `tabStock Ledger Entry` set is_cancelled='Yes',
+		modified=%s, modified_by=%s
+		where voucher_no=%s and voucher_type=%s""", 
+		(now(), webnotes.session.user, voucher_type, voucher_no))
+		
 def make_entry(args):
 	args.update({"doctype": "Stock Ledger Entry"})
 	sle = webnotes.bean([args])
@@ -30,6 +48,10 @@
 	sle.insert()
 	# sle.submit()
 	return sle.doc.name
+	
+def delete_cancelled_entry(voucher_type, voucher_no):
+	webnotes.conn.sql("""delete from `tabStock Ledger Entry` 
+		where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no))
 
 _exceptions = []
 def update_entries_after(args, verbose=1):