fix: bom update cost issue (#21372)
* fix: bom update cost is not working * added test case for bom cost
This commit is contained in:
parent
6fa6caf46c
commit
168babfebc
@ -246,12 +246,13 @@ class BOM(WebsiteGenerator):
|
|||||||
if rate:
|
if rate:
|
||||||
d.rate = rate
|
d.rate = rate
|
||||||
d.amount = flt(d.rate) * flt(d.qty)
|
d.amount = flt(d.rate) * flt(d.qty)
|
||||||
|
d.db_update()
|
||||||
|
|
||||||
if self.docstatus == 1:
|
if self.docstatus == 1:
|
||||||
self.flags.ignore_validate_update_after_submit = True
|
self.flags.ignore_validate_update_after_submit = True
|
||||||
self.calculate_cost()
|
self.calculate_cost()
|
||||||
if save:
|
if save:
|
||||||
self.save()
|
self.db_update()
|
||||||
self.update_exploded_items()
|
self.update_exploded_items()
|
||||||
|
|
||||||
# update parent BOMs
|
# update parent BOMs
|
||||||
|
@ -82,7 +82,7 @@ def enqueue_replace_bom(args):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def enqueue_update_cost():
|
def enqueue_update_cost():
|
||||||
frappe.enqueue("erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_cost")
|
frappe.enqueue("erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_cost", timeout=40000)
|
||||||
frappe.msgprint(_("Queued for updating latest price in all Bill of Materials. It may take a few minutes."))
|
frappe.msgprint(_("Queued for updating latest price in all Bill of Materials. It may take a few minutes."))
|
||||||
|
|
||||||
def update_latest_price_in_all_boms():
|
def update_latest_price_in_all_boms():
|
||||||
@ -98,6 +98,9 @@ def replace_bom(args):
|
|||||||
doc.replace_bom()
|
doc.replace_bom()
|
||||||
|
|
||||||
def update_cost():
|
def update_cost():
|
||||||
|
frappe.db.auto_commit_on_many_writes = 1
|
||||||
bom_list = get_boms_in_bottom_up_order()
|
bom_list = get_boms_in_bottom_up_order()
|
||||||
for bom in bom_list:
|
for bom in bom_list:
|
||||||
frappe.get_doc("BOM", bom).update_cost(update_parent=False, from_child_bom=True)
|
frappe.get_doc("BOM", bom).update_cost(update_parent=False, from_child_bom=True)
|
||||||
|
|
||||||
|
frappe.db.auto_commit_on_many_writes = 0
|
@ -5,6 +5,9 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import unittest
|
import unittest
|
||||||
import frappe
|
import frappe
|
||||||
|
from erpnext.stock.doctype.item.test_item import create_item
|
||||||
|
from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
|
||||||
|
from erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool import update_cost
|
||||||
|
|
||||||
test_records = frappe.get_test_records('BOM')
|
test_records = frappe.get_test_records('BOM')
|
||||||
|
|
||||||
@ -28,3 +31,30 @@ class TestBOMUpdateTool(unittest.TestCase):
|
|||||||
update_tool.current_bom = bom_doc.name
|
update_tool.current_bom = bom_doc.name
|
||||||
update_tool.new_bom = current_bom
|
update_tool.new_bom = current_bom
|
||||||
update_tool.replace_bom()
|
update_tool.replace_bom()
|
||||||
|
|
||||||
|
def test_bom_cost(self):
|
||||||
|
for item in ["BOM Cost Test Item 1", "BOM Cost Test Item 2", "BOM Cost Test Item 3"]:
|
||||||
|
item_doc = create_item(item, valuation_rate=100)
|
||||||
|
if item_doc.valuation_rate != 100.00:
|
||||||
|
frappe.db.set_value("Item", item_doc.name, "valuation_rate", 100)
|
||||||
|
|
||||||
|
bom_no = frappe.db.get_value('BOM', {'item': 'BOM Cost Test Item 1'}, "name")
|
||||||
|
if not bom_no:
|
||||||
|
doc = make_bom(item = 'BOM Cost Test Item 1',
|
||||||
|
raw_materials =['BOM Cost Test Item 2', 'BOM Cost Test Item 3'], currency="INR")
|
||||||
|
else:
|
||||||
|
doc = frappe.get_doc("BOM", bom_no)
|
||||||
|
|
||||||
|
self.assertEquals(doc.total_cost, 200)
|
||||||
|
|
||||||
|
frappe.db.set_value("Item", "BOM Cost Test Item 2", "valuation_rate", 200)
|
||||||
|
update_cost()
|
||||||
|
|
||||||
|
doc.load_from_db()
|
||||||
|
self.assertEquals(doc.total_cost, 300)
|
||||||
|
|
||||||
|
frappe.db.set_value("Item", "BOM Cost Test Item 2", "valuation_rate", 100)
|
||||||
|
update_cost()
|
||||||
|
|
||||||
|
doc.load_from_db()
|
||||||
|
self.assertEquals(doc.total_cost, 200)
|
||||||
|
@ -192,9 +192,10 @@ def make_bom(**args):
|
|||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
|
||||||
bom = frappe.get_doc({
|
bom = frappe.get_doc({
|
||||||
'doctype': "BOM",
|
'doctype': 'BOM',
|
||||||
'is_default': 1,
|
'is_default': 1,
|
||||||
'item': args.item,
|
'item': args.item,
|
||||||
|
'currency': args.currency or 'USD',
|
||||||
'quantity': args.quantity or 1,
|
'quantity': args.quantity or 1,
|
||||||
'company': args.company or '_Test Company'
|
'company': args.company or '_Test Company'
|
||||||
})
|
})
|
||||||
@ -212,3 +213,4 @@ def make_bom(**args):
|
|||||||
|
|
||||||
bom.insert(ignore_permissions=True)
|
bom.insert(ignore_permissions=True)
|
||||||
bom.submit()
|
bom.submit()
|
||||||
|
return bom
|
Loading…
Reference in New Issue
Block a user