[fix] fifo in stock ledger

This commit is contained in:
Nabin Hait 2015-08-05 18:57:26 +05:30
parent ed3a6cf748
commit 8142cd2865
3 changed files with 30 additions and 31 deletions

View File

@ -133,11 +133,12 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
var me = this; var me = this;
this.toggle_enable_bom(); this.toggle_enable_bom();
return this.frm.call({ return frappe.call({
method: "get_production_order_details", method: "erpnext.stock.doctype.stock_entry.stock_entry.get_production_order_details",
args: {production_order: this.frm.doc.production_order}, args: {production_order: this.frm.doc.production_order},
callback: function(r) { callback: function(r) {
if (!r.exc) { if (!r.exc) {
me.frm.set_value(r.message);
if (me.frm.doc.purpose == "Material Transfer for Manufacture" && !me.frm.doc.to_warehouse) 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("to_warehouse", r.message["wip_warehouse"]);
me.frm.set_value("from_bom", 1); me.frm.set_value("from_bom", 1);

View File

@ -300,22 +300,21 @@ class update_entries_after(object):
# select first batch or the batch with same rate # select first batch or the batch with same rate
batch = self.stock_queue[index] batch = self.stock_queue[index]
if batch[0]: if qty_to_pop >= batch[0]:
if qty_to_pop >= batch[0]: # consume current batch
# consume current batch qty_to_pop = qty_to_pop - batch[0]
qty_to_pop = qty_to_pop - batch[0] self.stock_queue.pop(index)
self.stock_queue.pop(index) if not self.stock_queue and qty_to_pop:
if not self.stock_queue and qty_to_pop: # stock finished, qty still remains to be withdrawn
# stock finished, qty still remains to be withdrawn # negative stock, keep in as a negative batch
# negative stock, keep in as a negative batch self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
self.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]]) break
break
else: else:
# qty found in current batch # qty found in current batch
# consume it and exit # consume it and exit
batch[0] = batch[0] - qty_to_pop batch[0] = batch[0] - qty_to_pop
qty_to_pop = 0 qty_to_pop = 0
stock_value = sum((flt(batch[0]) * flt(batch[1]) for batch in self.stock_queue)) 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)) stock_qty = sum((flt(batch[0]) for batch in self.stock_queue))

View File

@ -133,20 +133,19 @@ def get_fifo_rate(previous_stock_queue, qty):
qty_to_pop = abs(qty) qty_to_pop = abs(qty)
while qty_to_pop and previous_stock_queue: while qty_to_pop and previous_stock_queue:
batch = previous_stock_queue[0] batch = previous_stock_queue[0]
if batch[0]: if 0 < batch[0] <= qty_to_pop:
if 0 < batch[0] <= qty_to_pop: # if batch qty > 0
# if batch qty > 0 # not enough or exactly same qty in current batch, clear batch
# not enough or exactly same qty in current batch, clear batch available_qty_for_outgoing += flt(batch[0])
available_qty_for_outgoing += flt(batch[0]) outgoing_cost += flt(batch[0]) * flt(batch[1])
outgoing_cost += flt(batch[0]) * flt(batch[1]) qty_to_pop -= batch[0]
qty_to_pop -= batch[0] previous_stock_queue.pop(0)
previous_stock_queue.pop(0) else:
else: # all from current batch
# all from current batch available_qty_for_outgoing += flt(qty_to_pop)
available_qty_for_outgoing += flt(qty_to_pop) outgoing_cost += flt(qty_to_pop) * flt(batch[1])
outgoing_cost += flt(qty_to_pop) * flt(batch[1]) batch[0] -= qty_to_pop
batch[0] -= qty_to_pop qty_to_pop = 0
qty_to_pop = 0
return outgoing_cost / available_qty_for_outgoing return outgoing_cost / available_qty_for_outgoing