diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js index ad8b7760c32..399d576a6bc 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.js +++ b/erpnext/manufacturing/doctype/production_order/production_order.js @@ -139,16 +139,18 @@ erpnext.production_order = { }, set_default_warehouse: function(frm) { - frappe.call({ - method: "erpnext.manufacturing.doctype.production_order.production_order.get_default_warehouse", + if (!(frm.doc.wip_warehouse || frm.doc.fg_warehouse)) { + frappe.call({ + method: "erpnext.manufacturing.doctype.production_order.production_order.get_default_warehouse", - callback: function(r) { - if(!r.exe) { - frm.set_value("wip_warehouse", r.message.wip_warehouse); - frm.set_value("fg_warehouse", r.message.fg_warehouse) + callback: function(r) { + if(!r.exe) { + frm.set_value("wip_warehouse", r.message.wip_warehouse); + frm.set_value("fg_warehouse", r.message.fg_warehouse) + } } - } - }); + }); + } } } diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index 922eb5a4352..29968d8d68b 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -52,7 +52,11 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__("Supplier Quotation"), this.make_supplier_quotation, __("Make")); - + + if(doc.material_request_type === "Manufacture" && doc.status === "Submitted") + cur_frm.add_custom_button(__("Production Order"), + this.make_production_order, __("Make")); + cur_frm.page.set_inner_btn_group_as_primary(__("Make")); // stop @@ -165,6 +169,64 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten method: "erpnext.stock.doctype.material_request.material_request.make_stock_entry", frm: cur_frm }); + }, + + + make_production_order: function() { + var items = [] + $.each(cur_frm.doc["items"] || [], function(i, d) { + items.push(d.item_code); + }); + var d = new frappe.ui.Dialog({ + title: __("Production Order"), + fields: [ + { + "fieldtype": "Link", + "label": __("Production Item"), + "fieldname": "item", + "options": "Item", + "reqd": 1, + "get_query": function() { + return { + "filters": [ + ['item_code', 'in', items], + ] + } + } + } + ] + + }); + + d.set_primary_action(__("Make"), function() { + frappe.call({ + method:"erpnext.stock.doctype.material_request.material_request.validate_production_item", + args: { + "item_code": d.get_values().item + }, + callback: function(r) { + if(!r.message) { + msgprint("Cannot create Production Order for selected Item.") + } + else { + frappe.call({ + method:"erpnext.stock.doctype.material_request.material_request.make_production_order", + args: { + "source_name": cur_frm.doc.name, + "item_code": d.get_values().item, + }, + callback: function(r) { + if(!r.exe) { + var doclist = frappe.model.sync(r.message); + frappe.set_route("Form", doclist[0].doctype, doclist[0].name); + } + } + }); + } + } + }); + }); + d.show(); } }); diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index bd1f4d9c276..2fcf91d9a2d 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -327,3 +327,23 @@ def make_stock_entry(source_name, target_doc=None): }, target_doc, set_missing_values) return doclist + + +@frappe.whitelist() +def validate_production_item(item_code): + return frappe.db.get_value("Item", item_code, "is_pro_applicable") + +@frappe.whitelist() +def make_production_order(source_name, item_code): + material_request= frappe.get_doc("Material Request", source_name) + prod_order = frappe.new_doc("Production Order") + prod_order.production_item = item_code + prod_order.qty = 0 + for d in material_request.items: + if d.item_code == item_code: + prod_order.qty = d.qty - d.ordered_qty + prod_order.fg_warehouse = d.warehouse + prod_order.expected_delivery_date = d.schedule_date + prod_order.sales_order = d.sales_order_no + prod_order.material_request = material_request.name + return prod_order