Merge pull request #3779 from nabinhait/fifo_stack

[fix] Get fifo rate only qty exists in batch
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 961d97e..761f1a9 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -187,3 +187,4 @@
 erpnext.patches.v5_4.set_root_and_report_type
 erpnext.patches.v5_4.notify_system_managers_regarding_wrong_tax_calculation
 erpnext.patches.v5_4.fix_invoice_outstanding
+execute:frappe.db.sql("update `tabStock Ledger Entry` set stock_queue = '[]' where voucher_type = 'Stock Reconciliation' and ifnull(qty_after_transaction, 0) = 0")
\ No newline at end of file
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index a5deb30..c92663f 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -300,22 +300,22 @@
 
 				# 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 ee4303b..4f1e427 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -133,19 +133,20 @@
 		qty_to_pop = abs(qty)
 		while qty_to_pop and previous_stock_queue:
 			batch = previous_stock_queue[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 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
 
 		return outgoing_cost / available_qty_for_outgoing