Merge pull request #3807 from nabinhait/hotfix

[fix] fifo in stock ledger
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index d5bdde7..04ef935 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -133,11 +133,12 @@
 		var me = this;
 		this.toggle_enable_bom();
 
-		return this.frm.call({
-			method: "get_production_order_details",
+		return frappe.call({
+			method: "erpnext.stock.doctype.stock_entry.stock_entry.get_production_order_details",
 			args: {production_order: this.frm.doc.production_order},
 			callback: function(r) {
 				if (!r.exc) {
+					me.frm.set_value(r.message);
 					if (me.frm.doc.purpose == "Material Transfer for Manufacture" && !me.frm.doc.to_warehouse)
 						me.frm.set_value("to_warehouse", r.message["wip_warehouse"]);
 					me.frm.set_value("from_bom", 1);
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index c92663f..c0d5cd0 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -300,22 +300,21 @@
 
 				# select first batch or the batch with same rate
 				batch = self.stock_queue[index]
-				if batch[0]:
-					if qty_to_pop >= batch[0]:
-						# consume current batch
-						qty_to_pop = qty_to_pop - batch[0]
-						self.stock_queue.pop(index)
-						if not self.stock_queue and qty_to_pop:
-							# stock finished, qty still remains to be withdrawn
-							# negative stock, keep in as a negative batch
-							self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
-							break
+				if qty_to_pop >= batch[0]:
+					# consume current batch
+					qty_to_pop = qty_to_pop - batch[0]
+					self.stock_queue.pop(index)
+					if not self.stock_queue and qty_to_pop:
+						# stock finished, qty still remains to be withdrawn
+						# negative stock, keep in as a negative batch
+						self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
+						break
 
-					else:
-						# qty found in current batch
-						# consume it and exit
-						batch[0] = batch[0] - qty_to_pop
-						qty_to_pop = 0
+				else:
+					# qty found in current batch
+					# consume it and exit
+					batch[0] = batch[0] - qty_to_pop
+					qty_to_pop = 0
 
 		stock_value = sum((flt(batch[0]) * flt(batch[1]) for batch in self.stock_queue))
 		stock_qty = sum((flt(batch[0]) for batch in self.stock_queue))
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index 4f1e427..ee4303b 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -133,20 +133,19 @@
 		qty_to_pop = abs(qty)
 		while qty_to_pop and previous_stock_queue:
 			batch = previous_stock_queue[0]
-			if batch[0]:
-				if 0 < batch[0] <= qty_to_pop:
-					# if batch qty > 0
-					# not enough or exactly same qty in current batch, clear batch
-					available_qty_for_outgoing += flt(batch[0])
-					outgoing_cost += flt(batch[0]) * flt(batch[1])
-					qty_to_pop -= batch[0]
-					previous_stock_queue.pop(0)
-				else:
-					# all from current batch
-					available_qty_for_outgoing += flt(qty_to_pop)
-					outgoing_cost += flt(qty_to_pop) * flt(batch[1])
-					batch[0] -= qty_to_pop
-					qty_to_pop = 0
+			if 0 < batch[0] <= qty_to_pop:
+				# if batch qty > 0
+				# not enough or exactly same qty in current batch, clear batch
+				available_qty_for_outgoing += flt(batch[0])
+				outgoing_cost += flt(batch[0]) * flt(batch[1])
+				qty_to_pop -= batch[0]
+				previous_stock_queue.pop(0)
+			else:
+				# all from current batch
+				available_qty_for_outgoing += flt(qty_to_pop)
+				outgoing_cost += flt(qty_to_pop) * flt(batch[1])
+				batch[0] -= qty_to_pop
+				qty_to_pop = 0
 
 		return outgoing_cost / available_qty_for_outgoing