Merge pull request #2139 from nabinhait/hotfix
Repost stock reconciliation and valuation rate in repack entry
This commit is contained in:
commit
714b3ef7f8
31
erpnext/patches/v4_2/repost_stock_reconciliation.py
Normal file
31
erpnext/patches/v4_2/repost_stock_reconciliation.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# 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
|
||||||
|
import json
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
existing_allow_negative_stock = frappe.db.get_default("allow_negative_stock")
|
||||||
|
frappe.db.set_default("allow_negative_stock", 1)
|
||||||
|
|
||||||
|
head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"]
|
||||||
|
stock_reco_to_be_reposted = []
|
||||||
|
for d in frappe.db.sql("""select name, reconciliation_json from `tabStock Reconciliation`
|
||||||
|
where docstatus=1 and creation > '2014-03-01'""", as_dict=1):
|
||||||
|
data = json.loads(d.reconciliation_json)
|
||||||
|
for row in data[data.index(head_row)+1:]:
|
||||||
|
if row[3] in ["", None]:
|
||||||
|
stock_reco_to_be_reposted.append(d.name)
|
||||||
|
break
|
||||||
|
|
||||||
|
for dn in stock_reco_to_be_reposted:
|
||||||
|
reco = frappe.get_doc("Stock Reconciliation", dn)
|
||||||
|
reco.docstatus = 2
|
||||||
|
reco.on_cancel()
|
||||||
|
|
||||||
|
reco.docstatus = 1
|
||||||
|
reco.validate()
|
||||||
|
reco.on_submit()
|
||||||
|
|
||||||
|
frappe.db.set_default("allow_negative_stock", existing_allow_negative_stock)
|
@ -206,7 +206,7 @@ class StockEntry(StockController):
|
|||||||
def set_total_amount(self):
|
def set_total_amount(self):
|
||||||
self.total_amount = sum([flt(item.amount) for item in self.get("mtn_details")])
|
self.total_amount = sum([flt(item.amount) for item in self.get("mtn_details")])
|
||||||
|
|
||||||
def get_stock_and_rate(self):
|
def get_stock_and_rate(self, force=False):
|
||||||
"""get stock and incoming rate on posting date"""
|
"""get stock and incoming rate on posting date"""
|
||||||
|
|
||||||
raw_material_cost = 0.0
|
raw_material_cost = 0.0
|
||||||
@ -237,7 +237,7 @@ class StockEntry(StockController):
|
|||||||
|
|
||||||
# get incoming rate
|
# get incoming rate
|
||||||
if not d.bom_no:
|
if not d.bom_no:
|
||||||
if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return":
|
if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return" or force:
|
||||||
incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
|
incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
|
||||||
if incoming_rate > 0:
|
if incoming_rate > 0:
|
||||||
d.incoming_rate = incoming_rate
|
d.incoming_rate = incoming_rate
|
||||||
@ -247,13 +247,18 @@ class StockEntry(StockController):
|
|||||||
|
|
||||||
# set incoming rate for fg item
|
# set incoming rate for fg item
|
||||||
if self.purpose == "Manufacture/Repack":
|
if self.purpose == "Manufacture/Repack":
|
||||||
|
number_of_fg_items = len([t.t_warehouse for t in self.get("mtn_details")])
|
||||||
|
|
||||||
for d in self.get("mtn_details"):
|
for d in self.get("mtn_details"):
|
||||||
if d.bom_no:
|
if d.bom_no or (d.t_warehouse and number_of_fg_items == 1):
|
||||||
if not flt(d.incoming_rate):
|
if not flt(d.incoming_rate) or force:
|
||||||
bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1)
|
operation_cost_per_unit = 0
|
||||||
operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
|
if d.bom_no:
|
||||||
|
bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1)
|
||||||
|
operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
|
||||||
d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty))
|
d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty))
|
||||||
d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
|
d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
|
||||||
|
break
|
||||||
|
|
||||||
def get_incoming_rate(self, args):
|
def get_incoming_rate(self, args):
|
||||||
incoming_rate = 0
|
incoming_rate = 0
|
||||||
|
@ -22,16 +22,16 @@ class Warehouse(Document):
|
|||||||
self.update_parent_account()
|
self.update_parent_account()
|
||||||
|
|
||||||
def update_parent_account(self):
|
def update_parent_account(self):
|
||||||
|
|
||||||
if not getattr(self, "__islocal", None) \
|
if not getattr(self, "__islocal", None) \
|
||||||
and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):
|
||||||
|
|
||||||
self.validate_parent_account()
|
self.validate_parent_account()
|
||||||
|
|
||||||
warehouse_account = frappe.db.get_value("Account",
|
warehouse_account = frappe.db.get_value("Account",
|
||||||
{"account_type": "Warehouse", "company": self.company, "master_name": self.name},
|
{"account_type": "Warehouse", "company": self.company, "master_name": self.name},
|
||||||
["name", "parent_account"])
|
["name", "parent_account"])
|
||||||
|
|
||||||
if warehouse_account and warehouse_account[1] != self.create_account_under:
|
if warehouse_account and warehouse_account[1] != self.create_account_under:
|
||||||
acc_doc = frappe.get_doc("Account", warehouse_account[0])
|
acc_doc = frappe.get_doc("Account", warehouse_account[0])
|
||||||
acc_doc.parent_account = self.create_account_under
|
acc_doc.parent_account = self.create_account_under
|
||||||
@ -64,19 +64,19 @@ class Warehouse(Document):
|
|||||||
def validate_parent_account(self):
|
def validate_parent_account(self):
|
||||||
if not self.company:
|
if not self.company:
|
||||||
frappe.throw(_("Warehouse {0}: Company is mandatory").format(self.name))
|
frappe.throw(_("Warehouse {0}: Company is mandatory").format(self.name))
|
||||||
|
|
||||||
if not self.create_account_under:
|
if not self.create_account_under:
|
||||||
parent_account = frappe.db.get_value("Account",
|
parent_account = frappe.db.get_value("Account",
|
||||||
{"account_name": "Stock Assets", "company": self.company})
|
{"account_name": "Stock Assets", "company": self.company})
|
||||||
|
|
||||||
if parent_account:
|
if parent_account:
|
||||||
self.create_account_under = parent_account
|
self.create_account_under = parent_account
|
||||||
else:
|
else:
|
||||||
frappe.throw(_("Please enter parent account group for warehouse account"))
|
frappe.throw(_("Please enter parent account group for warehouse {0}").format(self.name))
|
||||||
elif frappe.db.get_value("Account", self.create_account_under, "company") != self.company:
|
elif frappe.db.get_value("Account", self.create_account_under, "company") != self.company:
|
||||||
frappe.throw(_("Warehouse {0}: Parent account {1} does not bolong to the company {2}")
|
frappe.throw(_("Warehouse {0}: Parent account {1} does not bolong to the company {2}")
|
||||||
.format(self.name, self.create_account_under, self.company))
|
.format(self.name, self.create_account_under, self.company))
|
||||||
|
|
||||||
|
|
||||||
def on_trash(self):
|
def on_trash(self):
|
||||||
# delete bin
|
# delete bin
|
||||||
|
Loading…
x
Reference in New Issue
Block a user