diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 6847a98aa19..113dbe00fef 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -134,6 +134,42 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e } }) }, __("Get items from")); + + // Get items from open Material Requests based on supplier + cur_frm.add_custom_button(__('Possible Supplier'), function() { + // Create a dialog window for the user to pick their supplier + var d = new frappe.ui.Dialog({ + title: __('Select Possible Supplier'), + fields: [ + {fieldname: 'supplier', fieldtype:'Link', options:'Supplier', label:'Supplier', reqd:1}, + {fieldname: 'ok_button', fieldtype:'Button', label:'Get Items from Material Requests'}, + ] + }); + + // On the user clicking the ok button + d.fields_dict.ok_button.input.onclick = function() { + var btn = d.fields_dict.ok_button.input; + var v = d.get_values(); + if(v) { + $(btn).set_working(); + + erpnext.utils.map_current_doc({ + method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_item_from_material_requests_based_on_supplier", + source_name: v.supplier, + get_query_filters: { + material_request_type: "Purchase", + docstatus: 1, + status: ["!=", "Stopped"], + per_ordered: ["<", 99.99], + company: cur_frm.doc.company + } + }); + $(btn).done_working(); + d.hide(); + } + } + d.show(); + }, __("Get items from")); } }, diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 3ff45f55d43..630086436fa 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe, json from frappe import _ from frappe.model.mapper import get_mapped_doc -from frappe.utils import get_url, random_string, cint +from frappe.utils import get_url, cint from frappe.utils.user import get_user_fullname from frappe.utils.print_format import download_pdf from frappe.desk.form.load import get_attachments @@ -244,3 +244,49 @@ def get_rfq_doc(doctype, name, supplier_idx): args = doc.get('suppliers')[cint(supplier_idx) - 1] doc.update_supplier_part_no(args) return doc + +@frappe.whitelist() +def get_item_from_material_requests_based_on_supplier(source_name, target_doc = None): + mr_items_list = frappe.db.sql(""" + SELECT + mr.name, mr_item.item_code + FROM + `tabItem` as item, + `tabItem Supplier` as item_supp, + `tabMaterial Request Item` as mr_item, + `tabMaterial Request` as mr + WHERE item_supp.supplier = %(supplier)s + AND item.name = item_supp.parent + AND mr_item.parent = mr.name + AND mr_item.item_code = item.name + AND mr.status != "Stopped" + AND mr.material_request_type = "Purchase" + AND mr.docstatus = 1 + AND mr.per_ordered < 99.99""", {"supplier": source_name}, as_dict=1) + + material_requests = {} + for d in mr_items_list: + material_requests.setdefault(d.name, []).append(d.item_code) + + for mr, items in material_requests.items(): + target_doc = get_mapped_doc("Material Request", mr, { + "Material Request": { + "doctype": "Request for Quotation", + "validation": { + "docstatus": ["=", 1], + "material_request_type": ["=", "Purchase"], + } + }, + "Material Request Item": { + "doctype": "Request for Quotation Item", + "condition": lambda row: row.item_code in items, + "field_map": [ + ["name", "material_request_item"], + ["parent", "material_request"], + ["uom", "uom"] + ] + } + }, target_doc) + + return target_doc + \ No newline at end of file