diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1ecd440054..7c9da34d14 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -249,4 +249,5 @@ erpnext.patches.v6_20.set_party_account_currency_in_orders erpnext.patches.v6_19.comment_feed_communication erpnext.patches.v6_21.fix_reorder_level erpnext.patches.v6_21.rename_material_request_fields -erpnext.patches.v6_23.update_stopped_status_to_closed \ No newline at end of file +erpnext.patches.v6_23.update_stopped_status_to_closed +erpnext.patches.v6_24.repost_valuation_rate_for_serialized_items \ No newline at end of file diff --git a/erpnext/patches/v6_24/__init__.py b/erpnext/patches/v6_24/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py b/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py new file mode 100644 index 0000000000..3b157a3e36 --- /dev/null +++ b/erpnext/patches/v6_24/repost_valuation_rate_for_serialized_items.py @@ -0,0 +1,28 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import today +from erpnext.accounts.utils import get_fiscal_year +from erpnext.stock.stock_ledger import update_entries_after + +def execute(): + try: + year_start_date = get_fiscal_year(today())[1] + except: + return + + if year_start_date: + items = frappe.db.sql("""select distinct item_code, warehouse from `tabStock Ledger Entry` + where ifnull(serial_no, '') != '' and actual_qty > 0 and incoming_rate=0""", as_dict=1) + + for d in items: + try: + update_entries_after({ + "item_code": d.item_code, + "warehouse": d.warehouse, + "posting_date": year_start_date + }, allow_zero_rate=True) + except: + pass \ No newline at end of file diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index c47ecabceb..d3fa4823cd 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -211,25 +211,24 @@ class update_entries_after(object): if incoming_rate < 0: # wrong incoming rate incoming_rate = self.valuation_rate + + stock_value_change = 0 + if incoming_rate: + stock_value_change = actual_qty * incoming_rate + elif actual_qty < 0: + # In case of delivery/stock issue, get average purchase rate + # of serial nos of current entry + stock_value_change = -1 * flt(frappe.db.sql("""select sum(purchase_rate) + from `tabSerial No` where name in (%s)""" % (", ".join(["%s"]*len(serial_no))), + tuple(serial_no))[0][0]) - elif incoming_rate == 0: - if flt(sle.actual_qty) < 0: - # In case of delivery/stock issue, get average purchase rate - # of serial nos of current entry - incoming_rate = flt(frappe.db.sql("""select avg(purchase_rate) - from `tabSerial No` where name in (%s)""" % (", ".join(["%s"]*len(serial_no))), - tuple(serial_no))[0][0]) - - if incoming_rate and not self.valuation_rate: - self.valuation_rate = incoming_rate - else: - new_stock_qty = self.qty_after_transaction + actual_qty - if new_stock_qty > 0: - new_stock_value = self.qty_after_transaction * self.valuation_rate + actual_qty * incoming_rate - if new_stock_value > 0: - # calculate new valuation rate only if stock value is positive - # else it remains the same as that of previous entry - self.valuation_rate = new_stock_value / new_stock_qty + new_stock_qty = self.qty_after_transaction + actual_qty + if new_stock_qty > 0: + new_stock_value = (self.qty_after_transaction * self.valuation_rate) + stock_value_change + if new_stock_value > 0: + # calculate new valuation rate only if stock value is positive + # else it remains the same as that of previous entry + self.valuation_rate = new_stock_value / new_stock_qty def get_moving_average_values(self, sle): actual_qty = flt(sle.actual_qty)