fix in get_value_diff of stock grid report: case for serialized items
diff --git a/public/js/stock_analytics.js b/public/js/stock_analytics.js
index d6a994c..c3ed1cb 100644
--- a/public/js/stock_analytics.js
+++ b/public/js/stock_analytics.js
@@ -134,6 +134,7 @@
 		var data = wn.report_dump.data["Stock Ledger Entry"];
 
 		this.item_warehouse = {};
+		this.serialized_buying_rates = this.get_serialized_buying_rates();
 
 		for(var i=0, j=data.length; i<j; i++) {
 			var sl = data[i];
diff --git a/public/js/stock_grid_report.js b/public/js/stock_grid_report.js
index 2f81999..6c43d82 100644
--- a/public/js/stock_grid_report.js
+++ b/public/js/stock_grid_report.js
@@ -44,8 +44,9 @@
 				wh.fifo_stack.push([add_qty, sl.incoming_rate, sl.posting_date]);
 		} else {
 			// outgoing
-					
-			if(is_fifo)	{
+			if(sl.serial_no) {
+				var value_diff = -1 * this.get_serialized_value_diff(sl);
+			} else if(is_fifo) {
 				var value_diff = this.get_fifo_value_diff(wh, sl);
 			} else {
 				// average rate for weighted average
@@ -102,4 +103,34 @@
 		wh.fifo_stack = fifo_stack.reverse();
 		return -fifo_value_diff;
 	},
+	
+	get_serialized_value_diff: function(sl) {
+		var me = this;
+		
+		var value_diff = 0.0;
+		
+		$.each(sl.serial_no.trim().split("\n"), function(i, serial_no) {
+			if(serial_no) {
+				value_diff += flt(me.serialized_buying_rates[serial_no]);
+			}
+		});
+		
+		return value_diff;
+	},
+	
+	get_serialized_buying_rates: function() {
+		var serialized_buying_rates = {};
+		
+		$.each(wn.report_dump.data["Stock Ledger Entry"], function(i, sle) {
+			if(sle.qty > 0 && sle.serial_no) {
+				$.each(sle.serial_no.trim().split("\n"), function(i, sr) {
+					if(sr && sle.incoming_rate !== undefined) {
+						serialized_buying_rates[sr] = flt(sle.incoming_rate);
+					}
+				});
+			}
+		});
+		
+		return serialized_buying_rates;
+	},
 });
\ No newline at end of file
diff --git a/startup/report_data_map.py b/startup/report_data_map.py
index ba3b546..f914277 100644
--- a/startup/report_data_map.py
+++ b/startup/report_data_map.py
@@ -86,8 +86,9 @@
 		"order_by": "name"
 	},
 	"Stock Ledger Entry": {
-		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse", "actual_qty as qty",
-			"voucher_type", "voucher_no", "ifnull(incoming_rate,0) as incoming_rate", "stock_uom"],
+		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse", 
+			"actual_qty as qty", "voucher_type", "voucher_no", 
+			"ifnull(incoming_rate,0) as incoming_rate", "stock_uom", "serial_no"],
 		"conditions": ["ifnull(is_cancelled, 'No')='No'"],
 		"order_by": "posting_date, posting_time, name",
 		"links": {
diff --git a/stock/page/stock_balance/stock_balance.js b/stock/page/stock_balance/stock_balance.js
index 9494f0d..47a3344 100644
--- a/stock/page/stock_balance/stock_balance.js
+++ b/stock/page/stock_balance/stock_balance.js
@@ -99,6 +99,7 @@
 		var data = wn.report_dump.data["Stock Ledger Entry"];
 
 		this.item_warehouse = {};
+		this.serialized_buying_rates = this.get_serialized_buying_rates();
 
 		for(var i=0, j=data.length; i<j; i++) {
 			var sl = data[i];
diff --git a/stock/page/stock_ledger/stock_ledger.js b/stock/page/stock_ledger/stock_ledger.js
index 9af8894..a37ea1c 100644
--- a/stock/page/stock_ledger/stock_ledger.js
+++ b/stock/page/stock_ledger/stock_ledger.js
@@ -155,6 +155,7 @@
 		
 		// initialize warehouse-item map
 		this.item_warehouse = {};
+		this.serialized_buying_rates = this.get_serialized_buying_rates();
 		var from_datetime = dateutil.str_to_obj(me.from_date + " 00:00:00");
 		var to_datetime = dateutil.str_to_obj(me.to_date + " 23:59:59");