Merge pull request #4899 from nabinhait/seriailized_stock_valuation

Seriailized stock valuation
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 1ecd440..7c9da34 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -249,4 +249,5 @@
 erpnext.patches.v6_19.comment_feed_communication
 erpnext.patches.v6_21.fix_reorder_level
 erpnext.patches.v6_21.rename_material_request_fields
-erpnext.patches.v6_23.update_stopped_status_to_closed
\ No newline at end of file
+erpnext.patches.v6_23.update_stopped_status_to_closed
+erpnext.patches.v6_24.repost_valuation_rate_for_serialized_items
\ No newline at end of file
diff --git a/erpnext/patches/v6_24/__init__.py b/erpnext/patches/v6_24/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/patches/v6_24/__init__.py
diff --git a/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py b/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py
new file mode 100644
index 0000000..3b157a3
--- /dev/null
+++ b/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py
@@ -0,0 +1,28 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.utils import today
+from erpnext.accounts.utils import get_fiscal_year
+from erpnext.stock.stock_ledger import update_entries_after
+
+def execute():
+	try:
+		year_start_date = get_fiscal_year(today())[1]
+	except:
+		return
+	
+	if year_start_date:
+		items = frappe.db.sql("""select distinct item_code, warehouse from `tabStock Ledger Entry` 
+			where ifnull(serial_no, '') != '' and actual_qty > 0 and incoming_rate=0""", as_dict=1)
+		
+		for d in items:
+			try:
+				update_entries_after({
+					"item_code": d.item_code, 
+					"warehouse": d.warehouse,
+					"posting_date": year_start_date
+				}, allow_zero_rate=True)
+			except:
+				pass
\ No newline at end of file
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index c47ecab..d3fa482 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -211,25 +211,24 @@
 		if incoming_rate < 0:
 			# wrong incoming rate
 			incoming_rate = self.valuation_rate
+			
+		stock_value_change = 0
+		if incoming_rate:
+			stock_value_change = actual_qty * incoming_rate
+		elif actual_qty < 0:
+			# In case of delivery/stock issue, get average purchase rate
+			# of serial nos of current entry
+			stock_value_change = -1 * flt(frappe.db.sql("""select sum(purchase_rate)
+				from `tabSerial No` where name in (%s)""" % (", ".join(["%s"]*len(serial_no))),
+				tuple(serial_no))[0][0])
 
-		elif incoming_rate == 0:
-			if flt(sle.actual_qty) < 0:
-				# In case of delivery/stock issue, get average purchase rate
-				# of serial nos of current entry
-				incoming_rate = flt(frappe.db.sql("""select avg(purchase_rate)
-					from `tabSerial No` where name in (%s)""" % (", ".join(["%s"]*len(serial_no))),
-					tuple(serial_no))[0][0])
-
-		if incoming_rate and not self.valuation_rate:
-			self.valuation_rate = incoming_rate
-		else:
-			new_stock_qty = self.qty_after_transaction + actual_qty
-			if new_stock_qty > 0:
-				new_stock_value = self.qty_after_transaction * self.valuation_rate + actual_qty * incoming_rate
-				if new_stock_value > 0:
-					# calculate new valuation rate only if stock value is positive
-					# else it remains the same as that of previous entry
-					self.valuation_rate = new_stock_value / new_stock_qty
+		new_stock_qty = self.qty_after_transaction + actual_qty
+		if new_stock_qty > 0:
+			new_stock_value = (self.qty_after_transaction * self.valuation_rate) + stock_value_change
+			if new_stock_value > 0:
+				# calculate new valuation rate only if stock value is positive
+				# else it remains the same as that of previous entry
+				self.valuation_rate = new_stock_value / new_stock_qty
 
 	def get_moving_average_values(self, sle):
 		actual_qty = flt(sle.actual_qty)