fifo part of stock reconciliation
diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 7db36e7..02a75a8 100644
--- a/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -117,8 +117,11 @@
 			return rate != "" and (flt(rate) - flt(previous_sle.get("valuation_rate"))) or 0.0
 			
 		def _get_incoming_rate(qty, valuation_rate, previous_qty, previous_valuation_rate):
-			return (qty * valuation_rate - previous_qty * previous_valuation_rate) \
-				/ flt(qty - previous_qty)
+			if previous_valuation_rate == 0:
+				return valuation_rate
+			else:
+				return (qty * valuation_rate - previous_qty * previous_valuation_rate) \
+					/ flt(qty - previous_qty)
 			
 		row_template = ["item_code", "warehouse", "qty", "valuation_rate"]
 		
@@ -126,42 +129,69 @@
 		for row_num, row in enumerate(data[1:]):
 			row = webnotes._dict(zip(row_template, row))
 			
-			args = {
+			args = webnotes._dict({
 				"__islocal": 1,
-				"item_code": row[0],
-				"warehouse": row[1],
+				"item_code": row.item_code,
+				"warehouse": row.warehouse,
 				"posting_date": self.doc.posting_date,
 				"posting_time": self.doc.posting_time,
 				"voucher_type": self.doc.doctype,
 				"voucher_no": self.doc.name,
 				"company": webnotes.conn.get_default("company")
-			}
+			})
 			previous_sle = get_previous_sle(args)
 			
-			qty_diff = _qty_diff(row[2], previous_sle)
+			qty_diff = _qty_diff(row.qty, previous_sle)
 						
-			if get_valuation_method(row[0]) == "Moving Average":
-				rate_diff = _rate_diff(row[3], previous_sle)
+			if get_valuation_method(row.item_code) == "Moving Average":
 				if qty_diff:
-					actual_qty = qty_diff,
-					if flt(previous_sle.valuation_rate):
-						incoming_rate = _get_incoming_rate(flt(row[2]), flt(row[3]),
-							flt(previous_sle.qty_after_transaction),
-							flt(previous_sle.valuation_rate))
-					else:
-						incoming_rate = row[3]
+					incoming_rate = _get_incoming_rate(flt(row.qty), flt(row.valuation_rate),
+						flt(previous_sle.qty_after_transaction),
+						flt(previous_sle.valuation_rate))
 					
-					webnotes.model_wrapper([args]).save()
-				elif rate_diff:
+					# create sle
+					webnotes.model_wrapper([args.update({
+						"actual_qty": qty_diff,
+						"incoming_rate": incoming_rate
+					})]).save()
+					
+				elif _rate_diff(row.valuation_rate, previous_sle) and \
+						previous_sle.qty_after_transaction >= 0:
 					# make +1, -1 entry
-					pass
+					incoming_rate = _get_incoming_rate(flt(previous_sle.qty_after_transaction) + 1,
+						flt(row.valuation_rate), flt(previous_sle.qty_after_transaction),
+						flt(previous_sle.valuation_rate))
+					
+					# +1 entry
+					webnotes.model_wrapper([args.copy().update({
+						"actual_qty": 1,
+						"incoming_rate": incoming_rate
+					})]).save()
+					
+					# -1 entry
+					webnotes.model_wrapper([args.update({"actual_qty": -1})]).save()
+				
+				# else:
+				# 	# show message that stock is negative, hence can't update valuation
 					
 			else:
 				# FIFO
-				# Make reverse entry
+				previous_stock_queue = json.loads(previous_sle.stock_queue)
 				
-				# make entry as per attachment
-				pass
+				if previous_stock_queue != [[row.qty, row.valuation_rate]]:
+					# make entry as per attachment
+					sle_wrapper = webnotes.model_wrapper([args.copy().update({
+						"actual_qty": row.qty,
+						"incoming_rate": row.valuation_rate
+					})])
+					sle_wrapper.save()
+				
+					# Make reverse entry
+					qty = sum((flt(fifo_item[0]) for fifo_item in previous_stock_queue))
+					webnotes.model_wrapper([args.update({"actual_qty": -1 * qty})]).save()
+				
+				
+