|
|
|
@@ -15,7 +15,7 @@ test_records = frappe.get_test_records('Production Planning Tool')
|
|
|
|
test_dependencies = ["Item","BOM"]
|
|
|
|
test_dependencies = ["Item","BOM"]
|
|
|
|
|
|
|
|
|
|
|
|
class TestEvent(unittest.TestCase):
|
|
|
|
class TestEvent(unittest.TestCase):
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_all_raw_multi_level(self):
|
|
|
|
def test_materials_requests_all_raw_multi_level(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
@@ -23,10 +23,10 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [14,9,36,1,0,0,0,0,0,0]
|
|
|
|
quantities = [14,9,36,1,0,0,0,0,0,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=1, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=1, \
|
|
|
|
include_subcontracted=1)
|
|
|
|
include_subcontracted=1)
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_multi_no_subcontracted(self):
|
|
|
|
def test_materials_requests_multi_no_subcontracted(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
@@ -34,12 +34,12 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [14,5,20,0,0,0,0,0,0,0]
|
|
|
|
quantities = [14,5,20,0,0,0,0,0,0,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
# This one should fail for now
|
|
|
|
# This one should fail for now
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=1, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=1, \
|
|
|
|
include_subcontracted=0)
|
|
|
|
include_subcontracted=0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_manufacture_and_sub_multi_level(self):
|
|
|
|
def test_materials_requests_manufacture_and_sub_multi_level(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
@@ -48,10 +48,10 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [14,9,36,1,2,5,2,1,4,0]
|
|
|
|
quantities = [14,9,36,1,2,5,2,1,4,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=0, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=0, \
|
|
|
|
include_subcontracted=1)
|
|
|
|
include_subcontracted=1)
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_manufacture_multi_level(self):
|
|
|
|
def test_materials_requests_manufacture_multi_level(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
@@ -59,12 +59,12 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [14,5,20,0,2,5,2,1,4,0]
|
|
|
|
quantities = [14,5,20,0,2,5,2,1,4,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=0, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=1, only_raw_materials=0, \
|
|
|
|
include_subcontracted=0)
|
|
|
|
include_subcontracted=0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_single_level_purch_only(self):
|
|
|
|
def test_materials_requests_single_level_purch_only(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
@@ -72,10 +72,10 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [2,0,0,0,0,0,0,1,0,0]
|
|
|
|
quantities = [2,0,0,0,0,0,0,1,0,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=0, only_raw_materials=1, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=0, only_raw_materials=1, \
|
|
|
|
include_subcontracted=0)
|
|
|
|
include_subcontracted=0)
|
|
|
|
|
|
|
|
|
|
|
|
def test_materials_requests_single_level(self):
|
|
|
|
def test_materials_requests_single_level(self):
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
items = ["_Test PPT Item Raw A","_Test PPT Item Raw B","_Test PPT Item Raw C","_Test PPT Item Raw D",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
"_Test PPT Item Sub A","_Test PPT Item Sub B","_Test PPT Item Sub C","_Test PPT Item SC A",
|
|
|
|
@@ -83,32 +83,32 @@ class TestEvent(unittest.TestCase):
|
|
|
|
quantities = [2,0,0,0,2,1,0,1,0,0]
|
|
|
|
quantities = [2,0,0,0,2,1,0,1,0,0]
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
types = ["Purchase","Purchase","Purchase","Purchase","Manufacture","Manufacture","Manufacture","Purchase",
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
"Purchase","Manufacture"]
|
|
|
|
|
|
|
|
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=0, only_raw_materials=0, \
|
|
|
|
self.runtest_materials_requests(items, quantities, types, use_multi_level_bom=0, only_raw_materials=0, \
|
|
|
|
include_subcontracted=0)
|
|
|
|
include_subcontracted=0)
|
|
|
|
|
|
|
|
|
|
|
|
def runtest_materials_requests(self, items, quantities, types,use_multi_level_bom, only_raw_materials, \
|
|
|
|
def runtest_materials_requests(self, items, quantities, types,use_multi_level_bom, only_raw_materials, \
|
|
|
|
include_subcontracted):
|
|
|
|
include_subcontracted):
|
|
|
|
|
|
|
|
|
|
|
|
clear_material_requests()
|
|
|
|
clear_material_requests()
|
|
|
|
create_test_records()
|
|
|
|
create_test_records()
|
|
|
|
|
|
|
|
|
|
|
|
ppt = run_production_planning_tool(use_multi_level_bom=use_multi_level_bom,
|
|
|
|
ppt = run_production_planning_tool(use_multi_level_bom=use_multi_level_bom,
|
|
|
|
only_raw_materials=only_raw_materials, include_subcontracted=include_subcontracted,
|
|
|
|
only_raw_materials=only_raw_materials, include_subcontracted=include_subcontracted,
|
|
|
|
item_code = "_Test PPT Item Master", bom_no = "BOM-_Test PPT Item Master-001",
|
|
|
|
item_code = "_Test PPT Item Master", bom_no = "BOM-_Test PPT Item Master-001",
|
|
|
|
planned_qty = 1, planned_start_date = "5/5/2029",
|
|
|
|
planned_qty = 1, planned_start_date = "5/5/2029",
|
|
|
|
warehouse = "_Test Warehouse - _TC", company = "_Test Company")
|
|
|
|
warehouse = "_Test Warehouse - _TC", company = "_Test Company")
|
|
|
|
|
|
|
|
|
|
|
|
create_material_requests(ppt)
|
|
|
|
create_material_requests(ppt)
|
|
|
|
|
|
|
|
|
|
|
|
for item, qty, type in zip(items, quantities, types):
|
|
|
|
for item, qty, type in zip(items, quantities, types):
|
|
|
|
self.assertEqual(qty, get_requested_qty(item))
|
|
|
|
self.assertEqual(qty, get_requested_qty(item))
|
|
|
|
for mat_req_type in get_requested_types(item):
|
|
|
|
for mat_req_type in get_requested_types(item):
|
|
|
|
self.assertEqual(type, mat_req_type)
|
|
|
|
self.assertEqual(type, mat_req_type)
|
|
|
|
|
|
|
|
|
|
|
|
def create_test_records():
|
|
|
|
def create_test_records():
|
|
|
|
from erpnext.stock.doctype.item.test_item import make_item
|
|
|
|
from erpnext.stock.doctype.item.test_item import make_item
|
|
|
|
|
|
|
|
|
|
|
|
subA = make_item("_Test PPT Item Sub A",{
|
|
|
|
subA = make_item("_Test PPT Item Sub A",{
|
|
|
|
"item_code": "_Test PPT Item Sub A",
|
|
|
|
"item_code": "_Test PPT Item Sub A",
|
|
|
|
"item_name": "_Test PPT Item Sub A",
|
|
|
|
"item_name": "_Test PPT Item Sub A",
|
|
|
|
@@ -119,7 +119,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
subB = make_item("_Test PPT Item Sub B",{
|
|
|
|
subB = make_item("_Test PPT Item Sub B",{
|
|
|
|
"item_code": "_Test PPT Item Sub B",
|
|
|
|
"item_code": "_Test PPT Item Sub B",
|
|
|
|
"item_name": "_Test PPT Item Sub B",
|
|
|
|
"item_name": "_Test PPT Item Sub B",
|
|
|
|
@@ -130,7 +130,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
subC = make_item("_Test PPT Item Sub C",{
|
|
|
|
subC = make_item("_Test PPT Item Sub C",{
|
|
|
|
"item_code": "_Test PPT Item Sub C",
|
|
|
|
"item_code": "_Test PPT Item Sub C",
|
|
|
|
"item_name": "_Test PPT Item Sub C",
|
|
|
|
"item_name": "_Test PPT Item Sub C",
|
|
|
|
@@ -141,7 +141,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
sCA = make_item("_Test PPT Item SC A",{
|
|
|
|
sCA = make_item("_Test PPT Item SC A",{
|
|
|
|
"item_code": "_Test PPT Item SC A",
|
|
|
|
"item_code": "_Test PPT Item SC A",
|
|
|
|
"item_name": "_Test PPT Item SC A",
|
|
|
|
"item_name": "_Test PPT Item SC A",
|
|
|
|
@@ -172,7 +172,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
rawA = make_item("_Test PPT Item Raw A",{
|
|
|
|
rawA = make_item("_Test PPT Item Raw A",{
|
|
|
|
"item_code": "_Test PPT Item Raw A",
|
|
|
|
"item_code": "_Test PPT Item Raw A",
|
|
|
|
"item_name": "_Test PPT Item Raw A",
|
|
|
|
"item_name": "_Test PPT Item Raw A",
|
|
|
|
@@ -183,7 +183,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
rawB = make_item("_Test PPT Item Raw B",{
|
|
|
|
rawB = make_item("_Test PPT Item Raw B",{
|
|
|
|
"item_code": "_Test PPT Item Raw B",
|
|
|
|
"item_code": "_Test PPT Item Raw B",
|
|
|
|
"item_name": "_Test PPT Item Raw B",
|
|
|
|
"item_name": "_Test PPT Item Raw B",
|
|
|
|
@@ -194,7 +194,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
rawC = make_item("_Test PPT Item Raw C",{
|
|
|
|
rawC = make_item("_Test PPT Item Raw C",{
|
|
|
|
"item_code": "_Test PPT Item Raw C",
|
|
|
|
"item_code": "_Test PPT Item Raw C",
|
|
|
|
"item_name": "_Test PPT Item Raw C",
|
|
|
|
"item_name": "_Test PPT Item Raw C",
|
|
|
|
@@ -205,7 +205,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
rawD = make_item("_Test PPT Item Raw D",{
|
|
|
|
rawD = make_item("_Test PPT Item Raw D",{
|
|
|
|
"item_code": "_Test PPT Item Raw D",
|
|
|
|
"item_code": "_Test PPT Item Raw D",
|
|
|
|
"item_name": "_Test PPT Item Raw D",
|
|
|
|
"item_name": "_Test PPT Item Raw D",
|
|
|
|
@@ -216,7 +216,7 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
master = make_item("_Test PPT Item Master",{
|
|
|
|
master = make_item("_Test PPT Item Master",{
|
|
|
|
"item_code": "_Test PPT Item Master",
|
|
|
|
"item_code": "_Test PPT Item Master",
|
|
|
|
"item_name": "_Test PPT Item Master",
|
|
|
|
"item_name": "_Test PPT Item Master",
|
|
|
|
@@ -227,9 +227,9 @@ def create_test_records():
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"stock_uom": "_Test UOM",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"item_group": "_Test Item Group",
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
"default_warehouse": "_Test Warehouse - _TC"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bom_subB = make_bom("BOM-_Test PPT Item Sub B-001",{"quantity":1.0,
|
|
|
|
bom_subB = make_bom("BOM-_Test PPT Item Sub B-001",{"quantity":1.0,
|
|
|
|
"item": "_Test PPT Item Sub B",
|
|
|
|
"item": "_Test PPT Item Sub B",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
@@ -239,39 +239,39 @@ def create_test_records():
|
|
|
|
"rate":100, "amount": 100, "stock_uom": "_Test UOM"},
|
|
|
|
"rate":100, "amount": 100, "stock_uom": "_Test UOM"},
|
|
|
|
{"item_code": "_Test PPT Item Raw C", "doctype":"BOM Item", "stock_qty":4, "rate":100,
|
|
|
|
{"item_code": "_Test PPT Item Raw C", "doctype":"BOM Item", "stock_qty":4, "rate":100,
|
|
|
|
"amount": 400,"stock_uom": "_Test UOM"}])
|
|
|
|
"amount": 400,"stock_uom": "_Test UOM"}])
|
|
|
|
|
|
|
|
|
|
|
|
bom_subC = make_bom("BOM-_Test PPT Item Sub C-001",{"quantity":1,
|
|
|
|
bom_subC = make_bom("BOM-_Test PPT Item Sub C-001",{"quantity":1,
|
|
|
|
"item": "_Test PPT Item Sub C",
|
|
|
|
"item": "_Test PPT Item Sub C",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"with_operations": 0}, [
|
|
|
|
"with_operations": 0}, [
|
|
|
|
{"item_code": "_Test PPT Item Raw A","item_name": "_Test PPT Item Raw A",
|
|
|
|
{"item_code": "_Test PPT Item Raw A","item_name": "_Test PPT Item Raw A",
|
|
|
|
"doctype":"BOM Item", "stock_qty":6, "rate":100, "amount": 600},
|
|
|
|
"doctype":"BOM Item", "stock_qty":6, "rate":100, "amount": 600},
|
|
|
|
{"item_code": "_Test PPT Item Sub B","item_name": "_Test PPT Item Sub B",
|
|
|
|
{"item_code": "_Test PPT Item Sub B","item_name": "_Test PPT Item Sub B",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub B-001", "doctype":"BOM Item", "stock_qty":2,
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub B-001", "doctype":"BOM Item", "stock_qty":2,
|
|
|
|
"rate":100, "amount": 200}])
|
|
|
|
"rate":100, "amount": 200}])
|
|
|
|
|
|
|
|
|
|
|
|
bom_sCA = make_bom("BOM-_Test PPT Item SC A-001",{"quantity":1,
|
|
|
|
bom_sCA = make_bom("BOM-_Test PPT Item SC A-001",{"quantity":1,
|
|
|
|
"item": "_Test PPT Item SC A",
|
|
|
|
"item": "_Test PPT Item SC A",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"with_operations": 0}, [
|
|
|
|
"with_operations": 0}, [
|
|
|
|
{"item_code": "_Test PPT Item Raw D","item_name": "_Test PPT Item Raw D",
|
|
|
|
{"item_code": "_Test PPT Item Raw D","item_name": "_Test PPT Item Raw D",
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100}])
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100}])
|
|
|
|
|
|
|
|
|
|
|
|
bom_sCB = make_bom("BOM-_Test PPT Item SC B-001",{"quantity":1,
|
|
|
|
bom_sCB = make_bom("BOM-_Test PPT Item SC B-001",{"quantity":1,
|
|
|
|
"item": "_Test PPT Item SC B",
|
|
|
|
"item": "_Test PPT Item SC B",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"with_operations": 0}, [
|
|
|
|
"with_operations": 0}, [
|
|
|
|
{"item_code": "_Test PPT Item Raw B","item_name": "_Test PPT Item Raw B",
|
|
|
|
{"item_code": "_Test PPT Item Raw B","item_name": "_Test PPT Item Raw B",
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
{"item_code": "_Test PPT Item Raw C","item_name": "_Test PPT Item Raw C",
|
|
|
|
{"item_code": "_Test PPT Item Raw C","item_name": "_Test PPT Item Raw C",
|
|
|
|
"doctype":"BOM Item", "stock_qty":4, "rate":100, "amount": 400}])
|
|
|
|
"doctype":"BOM Item", "stock_qty":4, "rate":100, "amount": 400}])
|
|
|
|
|
|
|
|
|
|
|
|
bom_subA = make_bom("BOM-_Test PPT Item Sub A-001",{"quantity":1,
|
|
|
|
bom_subA = make_bom("BOM-_Test PPT Item Sub A-001",{"quantity":1,
|
|
|
|
"item": "_Test PPT Item Sub A",
|
|
|
|
"item": "_Test PPT Item Sub A",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
@@ -279,29 +279,29 @@ def create_test_records():
|
|
|
|
"docstatus": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"with_operations": 0}, [
|
|
|
|
"with_operations": 0}, [
|
|
|
|
{"item_code": "_Test PPT Item Sub C","item_name": "_Test PPT Item Sub C",
|
|
|
|
{"item_code": "_Test PPT Item Sub C","item_name": "_Test PPT Item Sub C",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub C-001", "doctype":"BOM Item",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub C-001", "doctype":"BOM Item",
|
|
|
|
"stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
"stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
{"item_code": "_Test PPT Item SC B","item_name": "_Test PPT Item SC B",
|
|
|
|
{"item_code": "_Test PPT Item SC B","item_name": "_Test PPT Item SC B",
|
|
|
|
"bom_no":"BOM-_Test PPT Item SC B-001", "doctype":"BOM Item", "stock_qty":2,
|
|
|
|
"bom_no":"BOM-_Test PPT Item SC B-001", "doctype":"BOM Item", "stock_qty":2,
|
|
|
|
"rate":100, "amount": 200}])
|
|
|
|
"rate":100, "amount": 200}])
|
|
|
|
|
|
|
|
|
|
|
|
bom_master = make_bom("BOM-_Test PPT Item Master-001",{"quantity":1,
|
|
|
|
bom_master = make_bom("BOM-_Test PPT Item Master-001",{"quantity":1,
|
|
|
|
"item": "_Test PPT Item Master",
|
|
|
|
"item": "_Test PPT Item Master",
|
|
|
|
"is_active": 1,
|
|
|
|
"is_active": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"is_default": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"docstatus": 1,
|
|
|
|
"with_operations": 0}, [
|
|
|
|
"with_operations": 0}, [
|
|
|
|
{"item_code": "_Test PPT Item Sub A","item_name": "_Test PPT Item Sub A",
|
|
|
|
{"item_code": "_Test PPT Item Sub A","item_name": "_Test PPT Item Sub A",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub A-001",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub A-001",
|
|
|
|
"doctype":"BOM Item", "stock_qty":2, "rate":100, "amount": 200},
|
|
|
|
"doctype":"BOM Item", "stock_qty":2, "rate":100, "amount": 200},
|
|
|
|
{"item_code": "_Test PPT Item Sub B","item_name": "_Test PPT Item Sub B",
|
|
|
|
{"item_code": "_Test PPT Item Sub B","item_name": "_Test PPT Item Sub B",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub B-001",
|
|
|
|
"bom_no":"BOM-_Test PPT Item Sub B-001",
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100},
|
|
|
|
{"item_code": "_Test PPT Item Raw A","item_name": "_Test PPT Item Raw A",
|
|
|
|
{"item_code": "_Test PPT Item Raw A","item_name": "_Test PPT Item Raw A",
|
|
|
|
"doctype":"BOM Item", "stock_qty":2, "rate":100,
|
|
|
|
"doctype":"BOM Item", "stock_qty":2, "rate":100,
|
|
|
|
"amount": 200},
|
|
|
|
"amount": 200},
|
|
|
|
{"item_code": "_Test PPT Item SC A","item_name": "_Test PPT Item SC A",
|
|
|
|
{"item_code": "_Test PPT Item SC A","item_name": "_Test PPT Item SC A",
|
|
|
|
"bom_no":"BOM-_Test PPT Item SC A-001",
|
|
|
|
"bom_no":"BOM-_Test PPT Item SC A-001",
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100}
|
|
|
|
"doctype":"BOM Item", "stock_qty":1, "rate":100, "amount": 100}
|
|
|
|
])
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
@@ -309,7 +309,7 @@ def create_test_records():
|
|
|
|
def make_bom(name, properties=None, items=None):
|
|
|
|
def make_bom(name, properties=None, items=None):
|
|
|
|
if frappe.db.exists("BOM", name):
|
|
|
|
if frappe.db.exists("BOM", name):
|
|
|
|
return frappe.get_doc("BOM", name)
|
|
|
|
return frappe.get_doc("BOM", name)
|
|
|
|
|
|
|
|
|
|
|
|
bom = frappe.new_doc("BOM")
|
|
|
|
bom = frappe.new_doc("BOM")
|
|
|
|
item = frappe.get_doc({
|
|
|
|
item = frappe.get_doc({
|
|
|
|
"doctype": "BOM",
|
|
|
|
"doctype": "BOM",
|
|
|
|
@@ -317,20 +317,20 @@ def make_bom(name, properties=None, items=None):
|
|
|
|
"quantity": "1",
|
|
|
|
"quantity": "1",
|
|
|
|
"with_operations": 0
|
|
|
|
"with_operations": 0
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if properties:
|
|
|
|
if properties:
|
|
|
|
bom.update(properties)
|
|
|
|
bom.update(properties)
|
|
|
|
|
|
|
|
|
|
|
|
if items:
|
|
|
|
if items:
|
|
|
|
for item in items:
|
|
|
|
for item in items:
|
|
|
|
bom.append("items", item)
|
|
|
|
bom.append("items", item)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bom.insert()
|
|
|
|
bom.insert()
|
|
|
|
bom.submit()
|
|
|
|
bom.submit()
|
|
|
|
|
|
|
|
|
|
|
|
return bom
|
|
|
|
return bom
|
|
|
|
|
|
|
|
|
|
|
|
def clear_material_requests():
|
|
|
|
def clear_material_requests():
|
|
|
|
frappe.db.sql("delete from `tabMaterial Request Item`")
|
|
|
|
frappe.db.sql("delete from `tabMaterial Request Item`")
|
|
|
|
frappe.db.sql("delete from `tabMaterial Request`")
|
|
|
|
frappe.db.sql("delete from `tabMaterial Request`")
|
|
|
|
@@ -339,53 +339,50 @@ def clear_material_requests():
|
|
|
|
def run_production_planning_tool(**args):
|
|
|
|
def run_production_planning_tool(**args):
|
|
|
|
ppt = frappe.new_doc("Production Planning Tool")
|
|
|
|
ppt = frappe.new_doc("Production Planning Tool")
|
|
|
|
args = frappe._dict(args)
|
|
|
|
args = frappe._dict(args)
|
|
|
|
|
|
|
|
|
|
|
|
if args.use_multi_level_bom:
|
|
|
|
if args.use_multi_level_bom:
|
|
|
|
ppt.use_multi_level_bom = args.use_multi_level_bom
|
|
|
|
ppt.use_multi_level_bom = args.use_multi_level_bom
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
ppt.use_multi_level_bom = 0
|
|
|
|
ppt.use_multi_level_bom = 0
|
|
|
|
|
|
|
|
|
|
|
|
if args.only_raw_materials:
|
|
|
|
if args.only_raw_materials:
|
|
|
|
ppt.only_raw_materials = args.only_raw_materials
|
|
|
|
ppt.only_raw_materials = args.only_raw_materials
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
ppt.only_raw_materials = 0
|
|
|
|
ppt.only_raw_materials = 0
|
|
|
|
|
|
|
|
|
|
|
|
if args.include_subcontracted:
|
|
|
|
if args.include_subcontracted:
|
|
|
|
ppt.include_subcontracted = args.include_subcontracted
|
|
|
|
ppt.include_subcontracted = args.include_subcontracted
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
ppt.include_subcontracted = 0
|
|
|
|
ppt.include_subcontracted = 0
|
|
|
|
|
|
|
|
|
|
|
|
if args.warehouse:
|
|
|
|
if args.warehouse:
|
|
|
|
ppt.purchase_request_for_warehouse = args.warehouse
|
|
|
|
ppt.purchase_request_for_warehouse = args.warehouse
|
|
|
|
|
|
|
|
|
|
|
|
if args.company:
|
|
|
|
if args.company:
|
|
|
|
ppt.company = args.company
|
|
|
|
ppt.company = args.company
|
|
|
|
ppt.create_material_requests_for_all_required_qty = 1
|
|
|
|
ppt.create_material_requests_for_all_required_qty = 1
|
|
|
|
|
|
|
|
|
|
|
|
ppt.append("items",{"item_code": args.item_code, "bom_no": args.bom_no, "planned_qty": args.planned_qty,
|
|
|
|
|
|
|
|
"planned_start_date": args.planned_start_date, "warehouse": args.warehouse})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ppt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_production_orders(ppt):
|
|
|
|
ppt.append("items",{"item_code": args.item_code, "bom_no": args.bom_no, "planned_qty": args.planned_qty,
|
|
|
|
raise_production_orders(ppt)
|
|
|
|
"planned_start_date": args.planned_start_date, "warehouse": args.warehouse})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ppt
|
|
|
|
|
|
|
|
|
|
|
|
def create_material_requests(ppt):
|
|
|
|
def create_material_requests(ppt):
|
|
|
|
ppt.raise_material_requests()
|
|
|
|
ppt.raise_material_requests()
|
|
|
|
|
|
|
|
|
|
|
|
def get_requested_qty(item_code):
|
|
|
|
def get_requested_qty(item_code):
|
|
|
|
total_qty = 0
|
|
|
|
total_qty = 0
|
|
|
|
for d in frappe.db.sql("""select item.qty as qty
|
|
|
|
for d in frappe.db.sql("""select item.qty as qty
|
|
|
|
from `tabMaterial Request` mat_req, `tabMaterial Request Item` item
|
|
|
|
from `tabMaterial Request` mat_req, `tabMaterial Request Item` item
|
|
|
|
where item.item_code = %(item_code)s and item.parent = mat_req.name""", {"item_code":item_code}, as_dict=1):
|
|
|
|
where item.item_code = %(item_code)s and item.parent = mat_req.name""", {"item_code":item_code}, as_dict=1):
|
|
|
|
total_qty += d.qty
|
|
|
|
total_qty += d.qty
|
|
|
|
return total_qty
|
|
|
|
return total_qty
|
|
|
|
|
|
|
|
|
|
|
|
def get_requested_types(item_code):
|
|
|
|
def get_requested_types(item_code):
|
|
|
|
types = []
|
|
|
|
types = []
|
|
|
|
for d in frappe.db.sql("""select mat_req.material_request_type as type
|
|
|
|
for d in frappe.db.sql("""select mat_req.material_request_type as type
|
|
|
|
from `tabMaterial Request` mat_req, `tabMaterial Request Item` item
|
|
|
|
from `tabMaterial Request` mat_req, `tabMaterial Request Item` item
|
|
|
|
where item.item_code = %(item_code)s and item.parent = mat_req.name""", {"item_code":item_code}, as_dict=1):
|
|
|
|
where item.item_code = %(item_code)s and item.parent = mat_req.name""", {"item_code":item_code}, as_dict=1):
|
|
|
|
types.append(d.type)
|
|
|
|
types.append(d.type)
|
|
|
|
return types
|
|
|
|
return types
|
|
|
|
|
|
|
|
|
|
|
|
|