Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -211,16 +211,27 @@ frappe.ui.form.on('Production Plan', {
});
},

get_items: function(frm) {
get_items: function (frm) {
frm.clear_table('prod_plan_references');

frappe.call({
method: "get_items",
freeze: true,
doc: frm.doc,
callback: function() {
callback: function () {
refresh_field('po_items');
}
});
},
combine_items: function (frm) {
frm.clear_table('prod_plan_references');

frappe.call({
method: "get_items",
freeze: true,
doc: frm.doc,
});
},

get_items_for_mr: function(frm) {
if (!frm.doc.for_warehouse) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@
"material_requests",
"select_items_to_manufacture_section",
"get_items",
"combine_items",
"po_items",
"section_break_25",
"prod_plan_references",
"material_request_planning",
"include_non_stock_items",
"include_subcontracted_items",
Expand Down Expand Up @@ -316,13 +319,31 @@
"fieldname": "include_safety_stock",
"fieldtype": "Check",
"label": "Include Safety Stock in Required Qty Calculation"
},
{
"default": "0",
"depends_on": "eval:doc.get_items_from == 'Sales Order'",
"fieldname": "combine_items",
"fieldtype": "Check",
"label": "Consolidate Items"
},
{
"fieldname": "section_break_25",
"fieldtype": "Section Break"
},
{
"fieldname": "prod_plan_references",
"fieldtype": "Table",
"hidden": 1,
"label": "Production Plan Item Reference",
"options": "Production Plan Item Reference"
}
],
"icon": "fa fa-calendar",
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2021-03-08 11:17:25.470147",
"modified": "2021-05-24 16:59:03.643211",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Plan",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,10 @@ def add_mr_in_table(self, pending_mr):

@frappe.whitelist()
def get_items(self):
self.set('po_items', [])
if self.get_items_from == "Sales Order":
self.get_so_items()
self.get_so_items()

elif self.get_items_from == "Material Request":
self.get_mr_items()

Expand Down Expand Up @@ -165,9 +167,31 @@ def get_mr_items(self):
self.calculate_total_planned_qty()

def add_items(self, items):
self.set('po_items', [])
refs = {}
for data in items:
item_details = get_item_details(data.item_code)
if self.combine_items:
if item_details.bom_no in refs:
refs[item_details.bom_no]['so_details'].append({
'sales_order': data.parent,
'sales_order_item': data.name,
'qty': data.pending_qty
})
refs[item_details.bom_no]['qty'] += data.pending_qty
continue

else:
refs[item_details.bom_no] = {
'qty': data.pending_qty,
'po_item_ref': data.name,
'so_details': []
}
refs[item_details.bom_no]['so_details'].append({
'sales_order': data.parent,
'sales_order_item': data.name,
'qty': data.pending_qty
})

pi = self.append('po_items', {
'include_exploded_items': 1,
'warehouse': data.warehouse,
Expand All @@ -185,11 +209,28 @@ def add_items(self, items):
pi.sales_order = data.parent
pi.sales_order_item = data.name
pi.description = data.description

elif self.get_items_from == "Material Request":
pi.material_request = data.parent
pi.material_request_item = data.name
pi.description = data.description

if refs:
for po_item in self.po_items:
po_item.planned_qty = refs[po_item.bom_no]['qty']
po_item.pending_qty = refs[po_item.bom_no]['qty']
po_item.sales_order = ''
self.add_pp_ref(refs)

def add_pp_ref(self, refs):
for bom_no in refs:
for so_detail in refs[bom_no]['so_details']:
self.append('prod_plan_references', {
'item_reference': refs[bom_no]['po_item_ref'],
'sales_order': so_detail['sales_order'],
'sales_order_item': so_detail['sales_order_item'],
'qty': so_detail['qty']
})

def calculate_total_planned_qty(self):
self.total_planned_qty = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def test_production_plan_without_multi_level_for_existing_ordered_qty(self):

def test_production_plan_sales_orders(self):
item = 'Test Production Item 1'
so = make_sales_order(item_code=item, qty=5)
so = make_sales_order(item_code=item, qty=1)
sales_order = so.name
sales_order_item = so.items[0].name

Expand All @@ -124,8 +124,8 @@ def test_production_plan_sales_orders(self):

wo_doc = frappe.get_doc('Work Order', work_order)
wo_doc.update({
'wip_warehouse': '_Test Warehouse 1 - _TC',
'fg_warehouse': '_Test Warehouse - _TC'
'wip_warehouse': 'Work In Progress - _TC',
'fg_warehouse': 'Finished Goods - _TC'
})
wo_doc.submit()

Expand All @@ -145,6 +145,58 @@ def test_production_plan_sales_orders(self):

self.assertEqual(sales_orders, [])

def test_production_plan_combine_items(self):
item = 'Test Production Item 1'
so = make_sales_order(item_code=item, qty=1)

pln = frappe.new_doc('Production Plan')
pln.company = so.company
pln.get_items_from = 'Sales Order'
pln.append('sales_orders', {
'sales_order': so.name,
'sales_order_date': so.transaction_date,
'customer': so.customer,
'grand_total': so.grand_total
})
so = make_sales_order(item_code=item, qty=2)
pln.append('sales_orders', {
'sales_order': so.name,
'sales_order_date': so.transaction_date,
'customer': so.customer,
'grand_total': so.grand_total
})
pln.combine_items = 1
pln.get_items()
pln.submit()

self.assertTrue(pln.po_items[0].planned_qty, 3)

pln.make_work_order()
work_order = frappe.db.get_value('Work Order', {
'production_plan_item': pln.po_items[0].name,
'production_plan': pln.name
}, 'name')

wo_doc = frappe.get_doc('Work Order', work_order)
wo_doc.update({
'wip_warehouse': 'Work In Progress - _TC',
})

wo_doc.submit()
so_items = []
for plan_reference in pln.prod_plan_references:
so_items.append(plan_reference.sales_order_item)
so_wo_qty = frappe.db.get_value('Sales Order Item', plan_reference.sales_order_item, 'work_order_qty')
self.assertEqual(so_wo_qty, plan_reference.qty)

wo_doc.cancel()
for so_item in so_items:
so_wo_qty = frappe.db.get_value('Sales Order Item', so_item, 'work_order_qty')
self.assertEqual(so_wo_qty, 0.0)

latest_plan = frappe.get_doc('Production Plan', pln.name)
latest_plan.cancel()

def test_pp_to_mr_customer_provided(self):
#Material Request from Production Plan for Customer Provided
create_item('CUST-0987', is_customer_provided_item = 1, customer = '_Test Customer', is_purchase_item = 0)
Expand Down
Loading