stock reco and repost vouchers

This commit is contained in:
Nabin Hait 2014-10-08 18:06:14 +05:30
parent 6c48ef781b
commit e96e83d557
8 changed files with 53 additions and 42 deletions

View File

@ -256,8 +256,6 @@ class BuyingController(StockController):
rm.required_qty = required_qty rm.required_qty = required_qty
rm.conversion_factor = item.conversion_factor rm.conversion_factor = item.conversion_factor
rm.rate = bom_item.rate
rm.amount = required_qty * flt(bom_item.rate)
rm.idx = rm_supplied_idx rm.idx = rm_supplied_idx
if self.doctype == "Purchase Receipt": if self.doctype == "Purchase Receipt":
@ -268,7 +266,20 @@ class BuyingController(StockController):
rm_supplied_idx += 1 rm_supplied_idx += 1
raw_materials_cost += required_qty * flt(bom_item.rate) # get raw materials rate
from erpnext.stock.utils import get_incoming_rate
item_rate = get_incoming_rate({
"item_code": bom_item.item_code,
"warehouse": self.supplier_warehouse,
"posting_date": self.posting_date,
"posting_time": self.posting_time,
"qty": -1 * required_qty,
"serial_no": rm.serial_no
})
rm.rate = item_rate
rm.amount = required_qty * flt(item_rate)
raw_materials_cost += flt(rm.amount)
if self.doctype == "Purchase Receipt": if self.doctype == "Purchase Receipt":
item.rm_supp_cost = raw_materials_cost item.rm_supp_cost = raw_materials_cost

View File

@ -30,7 +30,7 @@ class StockController(AccountsController):
def get_gl_entries(self, warehouse_account=None, default_expense_account=None, def get_gl_entries(self, warehouse_account=None, default_expense_account=None,
default_cost_center=None, allow_negative_stock=False): default_cost_center=None, allow_negative_stock=False):
# block_negative_stock(allow_negative_stock) block_negative_stock(allow_negative_stock)
if not warehouse_account: if not warehouse_account:
warehouse_account = get_warehouse_account() warehouse_account = get_warehouse_account()
@ -51,7 +51,7 @@ class StockController(AccountsController):
stock_value_difference = flt(sle.stock_value_difference, 2) stock_value_difference = flt(sle.stock_value_difference, 2)
if not stock_value_difference: if not stock_value_difference:
valuation_rate = get_valuation_rate(sle.item_code, sle.warehouse, sle.posting_date) valuation_rate = get_valuation_rate(sle.item_code, sle.warehouse)
stock_value_difference = flt(sle.actual_qty)*flt(valuation_rate) stock_value_difference = flt(sle.actual_qty)*flt(valuation_rate)
gl_list.append(self.get_gl_dict({ gl_list.append(self.get_gl_dict({
@ -301,12 +301,12 @@ def block_negative_stock(allow_negative_stock=False):
if cint(frappe.db.get_value("Stock Settings", None, "allow_negative_stock")): if cint(frappe.db.get_value("Stock Settings", None, "allow_negative_stock")):
frappe.throw(_("Negative stock is not allowed in case of Perpetual Inventory, please disable it from Stock Settings")) frappe.throw(_("Negative stock is not allowed in case of Perpetual Inventory, please disable it from Stock Settings"))
def get_valuation_rate(item_code, warehouse, posting_date): def get_valuation_rate(item_code, warehouse):
last_valuation_rate = frappe.db.sql("""select valuation_rate last_valuation_rate = frappe.db.sql("""select valuation_rate
from `tabStock Ledger Entry` from `tabStock Ledger Entry`
where item_code = %s and warehouse = %s where item_code = %s and warehouse = %s
and ifnull(qty_after_transaction, 0) > 0 and posting_date < %s and ifnull(qty_after_transaction, 0) > 0
order by posting_date desc limit 1""", (item_code, warehouse, posting_date)) order by posting_date desc, posting_time desc, name desc limit 1""", (item_code, warehouse))
valuation_rate = flt(last_valuation_rate[0][0]) if last_valuation_rate else 0 valuation_rate = flt(last_valuation_rate[0][0]) if last_valuation_rate else 0

View File

@ -140,6 +140,9 @@ erpnext.StockAnalytics = erpnext.StockGridReport.extend({
if(sl.voucher_type=="Stock Reconciliation") { if(sl.voucher_type=="Stock Reconciliation") {
var diff = (sl.qty_after_transaction * sl.valuation_rate) - item.closing_qty_value; var diff = (sl.qty_after_transaction * sl.valuation_rate) - item.closing_qty_value;
wh.fifo_stack.push([sl.qty_after_transaction, sl.valuation_rate, sl.posting_date]);
wh.balance_qty = sl.qty_after_transaction;
wh.balance_value = sl.valuation_rate * sl.qty_after_transaction;
} else { } else {
var diff = me.get_value_diff(wh, sl, is_fifo); var diff = me.get_value_diff(wh, sl, is_fifo);
} }

View File

@ -9,8 +9,8 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
}; };
return this.item_warehouse[item][warehouse]; return this.item_warehouse[item][warehouse];
}, },
get_value_diff: function(wh, sl, is_fifo) { get_value_diff: function(wh, sl, is_fifo) {
// value // value
if(sl.qty > 0) { if(sl.qty > 0) {
// incoming - rate is given // incoming - rate is given
@ -30,9 +30,9 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
} else { } else {
var value_diff = (rate * add_qty); var value_diff = (rate * add_qty);
} }
if(add_qty) if(add_qty)
wh.fifo_stack.push([add_qty, sl.incoming_rate, sl.posting_date]); wh.fifo_stack.push([add_qty, sl.incoming_rate, sl.posting_date]);
} else { } else {
// called everytime for maintaining fifo stack // called everytime for maintaining fifo stack
var fifo_value_diff = this.get_fifo_value_diff(wh, sl); var fifo_value_diff = this.get_fifo_value_diff(wh, sl);
@ -44,13 +44,13 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
var value_diff = fifo_value_diff; var value_diff = fifo_value_diff;
} else { } else {
// average rate for weighted average // average rate for weighted average
var rate = (wh.balance_qty.toFixed(2) == 0.00 ? 0 : var rate = (wh.balance_qty.toFixed(2) == 0.00 ? 0 :
flt(wh.balance_value) / flt(wh.balance_qty)); flt(wh.balance_value) / flt(wh.balance_qty));
// no change in value if negative qty // no change in value if negative qty
if((wh.balance_qty + sl.qty).toFixed(2) >= 0.00) if((wh.balance_qty + sl.qty).toFixed(2) >= 0.00)
var value_diff = (rate * sl.qty); var value_diff = (rate * sl.qty);
else else
var value_diff = -wh.balance_value; var value_diff = -wh.balance_value;
} }
} }
@ -58,7 +58,6 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
// update balance (only needed in case of valuation) // update balance (only needed in case of valuation)
wh.balance_qty += sl.qty; wh.balance_qty += sl.qty;
wh.balance_value += value_diff; wh.balance_value += value_diff;
return value_diff; return value_diff;
}, },
get_fifo_value_diff: function(wh, sl) { get_fifo_value_diff: function(wh, sl) {
@ -66,19 +65,19 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
var fifo_stack = (wh.fifo_stack || []).reverse(); var fifo_stack = (wh.fifo_stack || []).reverse();
var fifo_value_diff = 0.0; var fifo_value_diff = 0.0;
var qty = -sl.qty; var qty = -sl.qty;
for(var i=0, j=fifo_stack.length; i<j; i++) { for(var i=0, j=fifo_stack.length; i<j; i++) {
var batch = fifo_stack.pop(); var batch = fifo_stack.pop();
if(batch[0] >= qty) { if(batch[0] >= qty) {
batch[0] = batch[0] - qty; batch[0] = batch[0] - qty;
fifo_value_diff += (qty * batch[1]); fifo_value_diff += (qty * batch[1]);
qty = 0.0; qty = 0.0;
if(batch[0]) { if(batch[0]) {
// batch still has qty put it back // batch still has qty put it back
fifo_stack.push(batch); fifo_stack.push(batch);
} }
// all qty found // all qty found
break; break;
} else { } else {
@ -87,35 +86,34 @@ erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
qty = qty - batch[0]; qty = qty - batch[0];
} }
} }
// reset the updated stack // reset the updated stack
wh.fifo_stack = fifo_stack.reverse(); wh.fifo_stack = fifo_stack.reverse();
return -fifo_value_diff; return -fifo_value_diff;
}, },
get_serialized_value_diff: function(sl) { get_serialized_value_diff: function(sl) {
var me = this; var me = this;
var value_diff = 0.0; var value_diff = 0.0;
$.each(sl.serial_no.trim().split("\n"), function(i, sr) { $.each(sl.serial_no.trim().split("\n"), function(i, sr) {
if(sr) { if(sr) {
value_diff += flt(me.serialized_buying_rates[sr.trim().toLowerCase()]); value_diff += flt(me.serialized_buying_rates[sr.trim().toLowerCase()]);
} }
}); });
return value_diff; return value_diff;
}, },
get_serialized_buying_rates: function() { get_serialized_buying_rates: function() {
var serialized_buying_rates = {}; var serialized_buying_rates = {};
if (frappe.report_dump.data["Serial No"]) { if (frappe.report_dump.data["Serial No"]) {
$.each(frappe.report_dump.data["Serial No"], function(i, sn) { $.each(frappe.report_dump.data["Serial No"], function(i, sn) {
serialized_buying_rates[sn.name.toLowerCase()] = flt(sn.incoming_rate); serialized_buying_rates[sn.name.toLowerCase()] = flt(sn.incoming_rate);
}); });
} }
return serialized_buying_rates; return serialized_buying_rates;
}, },
}); });

View File

@ -527,7 +527,7 @@ class StockEntry(StockController):
} }
}, bom_no=self.bom_no) }, bom_no=self.bom_no)
self.e() self.get_stock_and_rate()
def get_bom_raw_materials(self, qty): def get_bom_raw_materials(self, qty):
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict

View File

@ -16,8 +16,6 @@ class StockReconciliation(StockController):
self.head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"] self.head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"]
def validate(self): def validate(self):
self.entries = []
self.validate_data() self.validate_data()
self.validate_expense_account() self.validate_expense_account()
@ -179,9 +177,6 @@ class StockReconciliation(StockController):
}) })
self.make_sl_entries([args]) self.make_sl_entries([args])
# append to entries
self.entries.append(args)
def delete_and_repost_sle(self): def delete_and_repost_sle(self):
""" Delete Stock Ledger Entries related to this voucher """ Delete Stock Ledger Entries related to this voucher
and repost future Stock Ledger Entries""" and repost future Stock Ledger Entries"""

View File

@ -107,6 +107,9 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({
if(sl.voucher_type=="Stock Reconciliation") { if(sl.voucher_type=="Stock Reconciliation") {
var qty_diff = sl.qty_after_transaction - (item.temp_closing_qty || 0.0); var qty_diff = sl.qty_after_transaction - (item.temp_closing_qty || 0.0);
var value_diff = (sl.valuation_rate * sl.qty_after_transaction) - (item.temp_closing_value || 0.0); var value_diff = (sl.valuation_rate * sl.qty_after_transaction) - (item.temp_closing_value || 0.0);
wh.fifo_stack.push([sl.qty_after_transaction, sl.valuation_rate, sl.posting_date]);
wh.balance_qty = sl.qty_after_transaction;
wh.balance_value = sl.valuation_rate * sl.qty_after_transaction;
} else { } else {
var qty_diff = sl.qty; var qty_diff = sl.qty;
var value_diff = me.get_value_diff(wh, sl, is_fifo); var value_diff = me.get_value_diff(wh, sl, is_fifo);

View File

@ -214,9 +214,8 @@ def repost_all_stock_vouchers():
from `tabStock Ledger Entry` order by posting_date, posting_time, name""") from `tabStock Ledger Entry` order by posting_date, posting_time, name""")
rejected = [] rejected = []
i = 0 # vouchers = [["Purchase Receipt", "GRN00062"]]
for voucher_type, voucher_no in vouchers: for voucher_type, voucher_no in vouchers:
i += 1
print voucher_type, voucher_no print voucher_type, voucher_no
try: try:
for dt in ["Stock Ledger Entry", "GL Entry"]: for dt in ["Stock Ledger Entry", "GL Entry"]:
@ -226,13 +225,15 @@ def repost_all_stock_vouchers():
doc = frappe.get_doc(voucher_type, voucher_no) doc = frappe.get_doc(voucher_type, voucher_no)
if voucher_type=="Stock Entry" and doc.purpose in ["Manufacture", "Repack"]: if voucher_type=="Stock Entry" and doc.purpose in ["Manufacture", "Repack"]:
doc.get_stock_and_rate(force=1) doc.get_stock_and_rate(force=1)
# elif voucher_type=="Purchase Receipt":
# doc.create_raw_materials_supplied("pr_raw_material_details")
doc.update_stock_ledger() doc.update_stock_ledger()
doc.make_gl_entries() doc.make_gl_entries(repost_future_gle=False, allow_negative_stock=True)
if i%100 == 0: frappe.db.commit()
frappe.db.commit() except Exception, e:
except: print frappe.get_traceback()
rejected.append([voucher_type, voucher_no]) rejected.append([voucher_type, voucher_no])
pass frappe.db.rollback()
print rejected print rejected