more test cases for stock entry
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index 3cd285d..caf3291 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -160,7 +160,21 @@
 			self.assertEquals(expected_gl_entries[i][1], gle.debit)
 			self.assertEquals(expected_gl_entries[i][2], gle.credit)
 	
-	def test_sales_invoice_return_of_non_packing_item(self):
+	def _clear_stock(self):
+		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
+		webnotes.conn.sql("""delete from `tabBin`""")
+	
+	def _insert_material_receipt(self):
+		self._clear_stock()
+		material_receipt = webnotes.bean(copy=test_records[0])
+		material_receipt.insert()
+		material_receipt.submit()
+		
+	def _get_actual_qty(self):
+		return flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
+			"warehouse": "_Test Warehouse"}, "actual_qty"))
+			
+	def _test_sales_invoice_return(self, item_code, delivered_qty, returned_qty):
 		from stock.doctype.stock_entry.stock_entry import NotUpdateStockError
 		
 		from accounts.doctype.sales_invoice.test_sales_invoice \
@@ -174,39 +188,36 @@
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
 		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 2.0
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
 		self.assertRaises(NotUpdateStockError, se.insert)
 		
-		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
-		webnotes.conn.sql("""delete from `tabBin`""")
-		material_receipt = webnotes.bean(copy=test_records[0])
-		material_receipt.insert()
-		material_receipt.submit()
+		self._insert_material_receipt()
 		
 		# check currency available qty in bin
-		actual_qty_0 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
+		actual_qty_0 = self._get_actual_qty()
 		
 		# insert a pos invoice with update stock
 		si = webnotes.bean(copy=sales_invoice_test_records[1])
 		si.doc.is_pos = si.doc.update_stock = 1
 		si.doclist[1].warehouse = "_Test Warehouse"
+		si.doclist[1].item_code = item_code
 		si.insert()
 		si.submit()
 		
 		# check available bin qty after invoice submission
-		actual_qty_1 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_0 - 5, actual_qty_1)
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
 		
 		# check if item is validated
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
 		se.doc.sales_invoice_no = si.doc.name
 		se.doc.posting_date = "2013-03-10"
-		se.doclist[1].item_code = "_Test Item Home Desktop 100"
-		se.doclist[1].qty = 2.0
-		se.doclist[1].transfer_qty = 2.0
+		se.doclist[1].item_code = "_Test Item Home Desktop 200"
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
 		
 		# check if stock entry gets submitted
 		self.assertRaises(webnotes.DoesNotExistError, se.insert)
@@ -216,68 +227,91 @@
 		se.doc.purpose = "Sales Return"
 		se.doc.posting_date = "2013-03-10"
 		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 2.0
-		se.doclist[1].transfer_qty = 2.0
+		se.doclist[1].qty = returned_qty
+		se.doclist[1].transfer_qty = returned_qty
+		# in both cases item code remains _Test Item when returning
 		se.insert()
 		
 		se.submit()
 		
 		# check if available qty is increased
-		actual_qty_2 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_1 + 2, actual_qty_2)
+		actual_qty_2 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
+	
+	def test_sales_invoice_return_of_non_packing_item(self):
+		self._test_sales_invoice_return("_Test Item", 5, 2)
 			
 	def test_sales_invoice_return_of_packing_item(self):
-		webnotes.conn.sql("delete from `tabStock Ledger Entry`")
-		webnotes.conn.sql("""delete from `tabBin`""")
-		material_receipt = webnotes.bean(copy=test_records[0])
-		material_receipt.insert()
-		material_receipt.submit()
+		self._test_sales_invoice_return("_Test Sales BOM Item", 25, 20)
 		
-		# check currency available qty in bin
-		actual_qty_0 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
+	def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty):
+		self._insert_material_receipt()
 		
-		from accounts.doctype.sales_invoice.test_sales_invoice \
-			import test_records as sales_invoice_test_records
-			
-		# insert a pos invoice with update stock
-		si = webnotes.bean(copy=sales_invoice_test_records[1])
-		si.doc.is_pos = si.doc.update_stock = 1
-		si.doclist[1].item_code = "_Test Sales BOM Item"
-		si.doclist[1].warehouse = "_Test Warehouse"
-		si.insert()
-		si.submit()
+		actual_qty_0 = self._get_actual_qty()
 		
-		# check available bin qty after invoice submission
-		actual_qty_1 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_0 - 25, actual_qty_1)
+		# insert and submit delivery note
+		from stock.doctype.delivery_note.test_delivery_note \
+			import test_records as delivery_note_test_records
+		dn = webnotes.bean(copy=delivery_note_test_records[0])
+		dn.doclist[1].item_code = item_code
+		dn.insert()
+		dn.submit()
 		
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
+		
+		# insert and submit stock entry for sales return
 		se = webnotes.bean(copy=test_records[0])
 		se.doc.purpose = "Sales Return"
-		se.doc.posting_date = "2013-03-10"
-		se.doc.sales_invoice_no = si.doc.name
-		se.doclist[1].qty = 20.0
-		se.doclist[1].transfer_qty = 20.0
-		se.insert()
+		se.doc.delivery_note_no = dn.doc.name
+		se.doc.posting_date = "2013-03-01"
+		se.doclist[1].qty = se.doclist[1].transfer_qty = returned_qty
 		
+		se.insert()
 		se.submit()
 		
-		# check if available qty is increased
-		actual_qty_2 = flt(webnotes.conn.get_value("Bin", {"item_code": "_Test Item", 
-			"warehouse": "_Test Warehouse"}, "actual_qty"))
-		self.assertEquals(actual_qty_1 + 20, actual_qty_2)
+		actual_qty_2 = self._get_actual_qty()
+		self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2)
 		
+	def test_delivery_note_return_of_non_packing_item(self):
+		self._test_delivery_note_return("_Test Item", 5, 2)
 		
-	# def test_delivery_note_return_of_non_packing_item(self):
-	# 	pass
-	# 	
-	# def test_delivery_note_return_of_packing_item(self):
-	# 	pass
-	# 	
-	# def test_purchase_receipt_return(self):
-	# 	pass
+	def test_delivery_note_return_of_packing_item(self):
+		self._test_delivery_note_return("_Test Sales BOM Item", 25, 20)
+		
+	def test_purchase_receipt_return(self):
+		self._clear_stock()
+		
+		actual_qty_0 = self._get_actual_qty()
+		
+		from stock.doctype.purchase_receipt.test_purchase_receipt \
+			import test_records as purchase_receipt_test_records
+		
+		# submit purchase receipt
+		pr = webnotes.bean(copy=purchase_receipt_test_records[0])
+		pr.insert()
+		pr.submit()
+		
+		actual_qty_1 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_0 + 10, actual_qty_1)
+		
+		# submit purchase return
+		se = webnotes.bean(copy=test_records[0])
+		se.doc.purpose = "Purchase Return"
+		se.doc.purchase_receipt_no = pr.doc.name
+		se.doc.posting_date = "2013-03-01"
+		se.doclist[1].qty = se.doclist[1].transfer_qty = 5
+		se.doclist[1].s_warehouse = "_Test Warehouse"
+		se.insert()
+		se.submit()
+		
+		actual_qty_2 = self._get_actual_qty()
+		
+		self.assertEquals(actual_qty_1 - 5, actual_qty_2)
+		
 
 test_records = [
 	[