mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-24 04:26:38 +00:00
test: raw material dialog adds a row for its operation despite duplicates
(cherry picked from commit 0aec62a8dd)
This commit is contained in:
@@ -7,7 +7,7 @@ from functools import partial
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.tests import timeout
|
from frappe.tests import timeout
|
||||||
from frappe.utils import cstr, flt
|
from frappe.utils import cint, cstr, flt
|
||||||
|
|
||||||
from erpnext.controllers.tests.test_subcontracting_controller import (
|
from erpnext.controllers.tests.test_subcontracting_controller import (
|
||||||
set_backflush_based_on,
|
set_backflush_based_on,
|
||||||
@@ -858,6 +858,64 @@ class TestBOM(ERPNextTestSuite):
|
|||||||
# the final operation's FG item is derived from the BOM's own item
|
# the final operation's FG item is derived from the BOM's own item
|
||||||
self.assertEqual(bom.operations[1].finished_good, fg_item)
|
self.assertEqual(bom.operations[1].finished_good, fg_item)
|
||||||
|
|
||||||
|
@timeout
|
||||||
|
def test_add_raw_materials_when_item_is_used_by_another_operation(self):
|
||||||
|
from erpnext.manufacturing.doctype.operation.test_operation import make_operation
|
||||||
|
from erpnext.manufacturing.doctype.workstation.test_workstation import make_workstation
|
||||||
|
|
||||||
|
fg_item = make_item(properties={"is_stock_item": 1}).name
|
||||||
|
sfg_item = make_item(properties={"is_stock_item": 1}).name
|
||||||
|
rm_item = make_item(properties={"is_stock_item": 1, "valuation_rate": 100.0}).name
|
||||||
|
make_workstation({"workstation": "_Test SFG Workstation"})
|
||||||
|
for operation in ("_Test SFG Operation", "_Test SFG Final Operation"):
|
||||||
|
make_operation({"operation": operation, "workstation": "_Test SFG Workstation"})
|
||||||
|
|
||||||
|
bom = frappe.new_doc("BOM")
|
||||||
|
bom.company = "_Test Company"
|
||||||
|
bom.item = fg_item
|
||||||
|
bom.quantity = 1
|
||||||
|
bom.with_operations = 1
|
||||||
|
bom.track_semi_finished_goods = 1
|
||||||
|
bom.append(
|
||||||
|
"operations",
|
||||||
|
{
|
||||||
|
"operation": "_Test SFG Operation",
|
||||||
|
"workstation": "_Test SFG Workstation",
|
||||||
|
"time_in_mins": 30,
|
||||||
|
"finished_good": sfg_item,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
bom.append(
|
||||||
|
"operations",
|
||||||
|
{
|
||||||
|
"operation": "_Test SFG Final Operation",
|
||||||
|
"workstation": "_Test SFG Workstation",
|
||||||
|
"time_in_mins": 30,
|
||||||
|
"is_final_finished_good": 1,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
bom.append("items", {"item_code": rm_item, "qty": 1, "operation_row_id": 1})
|
||||||
|
bom.append("items", {"item_code": sfg_item, "qty": 1, "operation_row_id": 2})
|
||||||
|
bom.insert()
|
||||||
|
|
||||||
|
def rows_for(item_code, operation_row_id):
|
||||||
|
return [
|
||||||
|
row
|
||||||
|
for row in bom.items
|
||||||
|
if row.item_code == item_code and cint(row.operation_row_id) == operation_row_id
|
||||||
|
]
|
||||||
|
|
||||||
|
# the item already used by operation 1 gets its own new row under operation 2
|
||||||
|
bom.add_raw_materials(2, [{"item_code": rm_item, "qty": 3}])
|
||||||
|
self.assertEqual(len(rows_for(rm_item, 2)), 1)
|
||||||
|
self.assertEqual(flt(rows_for(rm_item, 2)[0].qty), 3.0)
|
||||||
|
self.assertEqual(flt(rows_for(rm_item, 1)[0].qty), 1.0)
|
||||||
|
|
||||||
|
# adding it again for the same operation updates the row instead of stacking another
|
||||||
|
bom.add_raw_materials(2, [{"item_code": rm_item, "qty": 5}])
|
||||||
|
self.assertEqual(len(rows_for(rm_item, 2)), 1)
|
||||||
|
self.assertEqual(flt(rows_for(rm_item, 2)[0].qty), 5.0)
|
||||||
|
|
||||||
|
|
||||||
def get_default_bom(item_code="_Test FG Item 2"):
|
def get_default_bom(item_code="_Test FG Item 2"):
|
||||||
return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1})
|
return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1})
|
||||||
|
|||||||
Reference in New Issue
Block a user