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()
+
+
+