diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js index c03ccc80da3..8030979f368 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -221,6 +221,44 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ tc_name: function() { this.get_terms(); + }, + link_requests: function() { + + cur_frm.add_custom_button(__("Link to Material Requests"), + function() { + my_items = [] + for (var i in cur_frm.doc.items) { + if(!cur_frm.doc.items[i].material_request){ + my_items.push(cur_frm.doc.items[i].item_code); + } + + } + frappe.call({ + method: "erpnext.buying.doctype.purchase_common.purchase_common.get_linked_material_requests", + args:{ + items: my_items + }, + callback: function(r) { + //frm.reload_doc(); + console.log(r.message); + for (var i in cur_frm.doc.items) { + var qty = cur_frm.doc.items[i].qty; + (r.message || []).forEach(function(d) { + if (d[0].qty > 0 && qty > 0 && cur_frm.doc.items[i].item_code == d[0].item_code) + { + cur_frm.doc.items[i].material_request = d[0].mr_name; + cur_frm.doc.items[i].material_request_item = d[0].mr_item; + my_qty = Math.min(qty, d[0].qty); + qty = qty - my_qty; + d[0].qty = d[0].qty - my_qty; + } + + }); + } + } + }); + }); + } }); diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py index 8435f3b970c..6c10fe1c83c 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.py +++ b/erpnext/buying/doctype/purchase_common/purchase_common.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe +import frappe, json from frappe.utils import flt, cstr, cint from frappe import _ @@ -79,4 +79,28 @@ class PurchaseCommon(BuyingController): status = frappe.db.get_value(doctype, docname, "status") if status == "Closed": - frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError) \ No newline at end of file + frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError) + +@frappe.whitelist() +def get_linked_material_requests(items): + items = json.loads(items) + mr_list = [] + for item in items: + material_request = frappe.db.sql("""SELECT distinct mr.name AS mr_name, + (mr_item.qty - mr_item.ordered_qty) AS qty, + mr_item.item_code AS item_code, + mr_item.name AS mr_item + FROM `tabMaterial Request` mr, `tabMaterial Request Item` mr_item + WHERE mr.name = mr_item.parent + AND mr_item.item_code = %(item)s + AND mr.material_request_type = 'Purchase' + AND mr.per_ordered < 99.99 + AND mr.docstatus = 1 + AND mr.status != 'Stopped' + ORDER BY mr_item.item_code ASC""",{"item": item}, as_dict=1) + if material_request: + mr_list.append(material_request) + + return mr_list + + \ No newline at end of file diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index f2f04fe88cc..2fa38641f32 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -56,6 +56,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( } } else if(doc.docstatus===0) { cur_frm.cscript.add_from_mappers(); + cur_frm.cscript.link_requests(); } if(doc.docstatus == 1 && in_list(["Closed", "Delivered"], doc.status)) { 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 113dbe00fef..6568b6d358c 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -43,6 +43,7 @@ frappe.ui.form.on("Request for Quotation",{ }); }); } + }, make_suppplier_quotation: function(frm) { @@ -134,7 +135,7 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e } }) }, __("Get items from")); - + cur_frm.cscript.link_requests(); // 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 @@ -170,6 +171,7 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e } d.show(); }, __("Get items from")); + } }, diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js index b3bdeb01a7a..5da2d7cb1ac 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js @@ -16,6 +16,7 @@ erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.ext } else if (this.frm.doc.docstatus===0) { + cur_frm.add_custom_button(__('Material Request'), function() { erpnext.utils.map_current_doc({ @@ -30,6 +31,7 @@ erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.ext } }) }, __("Get items from")); + cur_frm.cscript.link_requests(); } },