From 44d0449895a88937766393e2291aa81087bf82f4 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 3 Mar 2016 14:00:35 +0530 Subject: [PATCH 1/3] [enhancement] request for quotation --- .../doctype/purchase_order/purchase_order.js | 2 +- .../doctype/request_for_quotation/__init__.py | 0 .../request_for_quotation.js | 69 ++ .../request_for_quotation.json | 791 ++++++++++++++++++ .../request_for_quotation.py | 51 ++ .../test_request_for_quotation.py | 64 ++ .../request_for_quotation_item/__init__.py | 0 .../request_for_quotation_item.json | 638 ++++++++++++++ .../request_for_quotation_item.py | 10 + .../buying/doctype/rfq_supplier/__init__.py | 0 .../doctype/rfq_supplier/rfq_supplier.json | 84 ++ .../doctype/rfq_supplier/rfq_supplier.py | 10 + .../supplier_quotation_item.json | 51 ++ erpnext/config/buying.py | 5 + .../make-supplier-quotation-from-rfq.png | Bin 0 -> 69233 bytes .../img/buying/request-for-quotation.png | Bin 0 -> 88371 bytes erpnext/docs/user/manual/en/buying/index.txt | 1 + .../manual/en/buying/request-for-quotation.md | 14 + .../material_request/material_request.js | 10 + .../material_request/material_request.py | 24 + 20 files changed, 1823 insertions(+), 1 deletion(-) create mode 100644 erpnext/buying/doctype/request_for_quotation/__init__.py create mode 100644 erpnext/buying/doctype/request_for_quotation/request_for_quotation.js create mode 100644 erpnext/buying/doctype/request_for_quotation/request_for_quotation.json create mode 100644 erpnext/buying/doctype/request_for_quotation/request_for_quotation.py create mode 100644 erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py create mode 100644 erpnext/buying/doctype/request_for_quotation_item/__init__.py create mode 100644 erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json create mode 100644 erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.py create mode 100644 erpnext/buying/doctype/rfq_supplier/__init__.py create mode 100644 erpnext/buying/doctype/rfq_supplier/rfq_supplier.json create mode 100644 erpnext/buying/doctype/rfq_supplier/rfq_supplier.py create mode 100644 erpnext/docs/assets/img/buying/make-supplier-quotation-from-rfq.png create mode 100644 erpnext/docs/assets/img/buying/request-for-quotation.png create mode 100644 erpnext/docs/user/manual/en/buying/request-for-quotation.md diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 617befff29..78924e9233 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -47,7 +47,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( if(is_drop_ship && doc.status!="Delivered"){ cur_frm.add_custom_button(__('Delivered'), - this.delivered_by_supplier, __("Status")); + this.delivered_by_supplier, __("Status")); cur_frm.page.set_inner_btn_group_as_primary(__("Status")); } diff --git a/erpnext/buying/doctype/request_for_quotation/__init__.py b/erpnext/buying/doctype/request_for_quotation/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js new file mode 100644 index 0000000000..f4fb5e269b --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -0,0 +1,69 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + + +{% include 'buying/doctype/purchase_common/purchase_common.js' %}; + +frappe.require("assets/erpnext/js/utils.js"); + +erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({ + refresh: function() { + this._super(); + + if (this.frm.doc.docstatus === 1) { + cur_frm.add_custom_button(__("Supplier Quotation"), this.make_suppplier_quotation, + __("Make")); + cur_frm.page.set_inner_btn_group_as_primary(__("Make")); + } + }, + + calculate_taxes_and_totals: function() { + return; + }, + + tc_name: function() { + this.get_terms(); + }, + + make_suppplier_quotation: function() { + var dialog = new frappe.ui.Dialog({ + title: __("For Supplier"), + fields: [ + {"fieldtype": "Link", "label": __("Supplier"), "fieldname": "supplier", "options":"Supplier", + "get_query": function () { + return { + query:"erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_supplier", + filters: {'parent': cur_frm.doc.name} + } + }, "reqd": 1 }, + {"fieldtype": "Button", "label": __("Make Supplier Quotation"), "fieldname": "make_supplier_quotation", "cssClass": "btn-primary"}, + ] + }); + + dialog.fields_dict.make_supplier_quotation.$input.click(function(){ + args = dialog.get_values(); + if(!args) return; + dialog.hide(); + return frappe.call({ + type: "GET", + method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.make_supplier_quotation", + args: { + "source_name": cur_frm.doc.name, + "for_supplier": args.supplier + }, + freeze: true, + callback: function(r) { + if(!r.exc) { + var doc = frappe.model.sync(r.message); + frappe.set_route("Form", r.message.doctype, r.message.name); + } + } + }); + }); + dialog.show() + } + +}); + +// for backward compatibility: combine new and previous states +$.extend(cur_frm.cscript, new erpnext.buying.RequestforQuotationController({frm: cur_frm})); diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json new file mode 100644 index 0000000000..d46bbff183 --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -0,0 +1,791 @@ +{ + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "naming_series:", + "creation": "2016-02-25 01:24:07.224790", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_1", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "RFQ-", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "company", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Company", + "length": 0, + "no_copy": 0, + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "50%", + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "50%" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "transaction_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "oldfieldname": "transaction_date", + "oldfieldtype": "Date", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_2", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Detail", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "suppliers", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Detail", + "length": 0, + "no_copy": 0, + "options": "RFQ Supplier", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "items_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Items", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-shopping-cart", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "items", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Items", + "length": 0, + "no_copy": 0, + "oldfieldname": "po_details", + "oldfieldtype": "Table", + "options": "Request for Quotation Item", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_3", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "message_for_supplier", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Message for Supplier", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "terms", + "fieldname": "terms_section_break", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-legal", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "tc_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Terms", + "length": 0, + "no_copy": 0, + "oldfieldname": "tc_name", + "oldfieldtype": "Link", + "options": "Terms and Conditions", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "terms", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Terms and Conditions", + "length": 0, + "no_copy": 0, + "oldfieldname": "terms", + "oldfieldtype": "Text Editor", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "printing_settings", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Printing Settings", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "select_print_heading", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Print Heading", + "length": 0, + "no_copy": 1, + "oldfieldname": "select_print_heading", + "oldfieldtype": "Link", + "options": "Print Heading", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "letter_head", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Letter Head", + "length": 0, + "no_copy": 0, + "oldfieldname": "letter_head", + "oldfieldtype": "Select", + "options": "Letter Head", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "more_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "More Information", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-file-text", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Status", + "length": 0, + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nSubmitted\nCancelled", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Fiscal Year", + "length": 0, + "no_copy": 0, + "oldfieldname": "fiscal_year", + "oldfieldtype": "Select", + "options": "Fiscal Year", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Request for Quotation", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-shopping-cart", + "idx": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-03-02 18:50:02.603258", + "modified_by": "Administrator", + "module": "Buying", + "name": "Request for Quotation", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Manufacturing Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + }, + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Supplier", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "All", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + } + ], + "read_only": 0, + "read_only_onload": 1, + "search_fields": "status, transaction_date", + "sort_field": "modified", + "sort_order": "DESC", + "timeline_field": "", + "title_field": "" +} \ No newline at end of file diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py new file mode 100644 index 0000000000..63b0357091 --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.model.mapper import get_mapped_doc +from erpnext.stock.doctype.material_request.material_request import set_missing_values +from frappe.model.document import Document + +class RequestforQuotation(Document): + def validate(self): + self.validate_duplicate_supplier() + + def validate_duplicate_supplier(self): + supplier_list = [d.supplier for d in self.suppliers] + if len(supplier_list) != len(set(supplier_list)): + frappe.throw(_("Same supplier has been entered multiple times")) + +@frappe.whitelist() +def get_supplier(doctype, txt, searchfield, start, page_len, filters): + query = """ Select supplier from `tabRFQ Supplier` where parent = '{parent}' and supplier like %s + limit {start}, {page_len} """ + + return frappe.db.sql(query.format(parent=filters.get('parent'), start=start, page_len=page_len), '%{0}%'.format(txt)) + +@frappe.whitelist() +def make_supplier_quotation(source_name, for_supplier, target_doc=None): + def postprocess(source, target_doc): + target_doc.supplier = for_supplier + set_missing_values(source, target_doc) + + doclist = get_mapped_doc("Request for Quotation", source_name, { + "Request for Quotation": { + "doctype": "Supplier Quotation", + "validation": { + "docstatus": ["=", 1] + } + }, + "Request for Quotation Item": { + "doctype": "Supplier Quotation Item", + "field_map": [ + ["name", "request_for_quotation_item"], + ["parent", "request_for_quotation"], + ["uom", "uom"] + ], + } + }, target_doc, postprocess) + + return doclist diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py new file mode 100644 index 0000000000..db828b842c --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from frappe.utils import nowdate + +class TestRequestforQuotation(unittest.TestCase): + def test_make_supplier_quotation(self): + from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation + rfq = make_request_for_quotation() + + sq = make_supplier_quotation(rfq.name) + sq.supplier = rfq.get('supplier_detail')[0].supplier + sq.submit() + + sq1 = make_supplier_quotation(rfq.name) + sq1.supplier = rfq.get('supplier_detail')[1].supplier + sq1.submit() + + self.assertEquals(sq.supplier, rfq.get('supplier_detail')[0].supplier) + self.assertEquals(sq.get('items')[0].request_for_quotation, rfq.name) + self.assertEquals(sq.get('items')[0].item_code, "_Test Item") + self.assertEquals(sq.get('items')[0].qty, 5) + + self.assertEquals(sq1.supplier, rfq.get('supplier_detail')[1].supplier) + self.assertEquals(sq1.get('items')[0].request_for_quotation, rfq.name) + self.assertEquals(sq1.get('items')[0].item_code, "_Test Item") + self.assertEquals(sq1.get('items')[0].qty, 5) + +def make_request_for_quotation(): + supplier_data = get_supplier_data() + rfq = frappe.new_doc('Request for Quotation') + rfq.transaction_date = nowdate() + rfq.status = 'Draft' + rfq.company = '_Test Company' + + for data in supplier_data: + rfq.append('supplier_detail', data) + + rfq.append("items", { + "item_code": "_Test Item", + "description": "_Test Item", + "uom": "_Test UOM", + "qty": 5, + "warehouse": "_Test Warehouse - _TC", + "schedule_date": nowdate() + }) + + rfq.submit() + + return rfq + +def get_supplier_data(): + return [{ + "supplier": "_Test Supplier", + "supplier_name": "_Test Supplier" + }, + { + "supplier": "_Test Supplier 1", + "supplier_name": "_Test Supplier 1" + }] \ No newline at end of file diff --git a/erpnext/buying/doctype/request_for_quotation_item/__init__.py b/erpnext/buying/doctype/request_for_quotation_item/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json new file mode 100644 index 0000000000..08bc16d91e --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json @@ -0,0 +1,638 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "hash", + "creation": "2016-02-25 08:04:02.452958", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "fields": [ + { + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "fieldname": "item_code", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Item Code", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_code", + "oldfieldtype": "Link", + "options": "Item", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "supplier_part_no", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Part Number", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "item_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Item Name", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_name", + "oldfieldtype": "Data", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "section_break_5", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "description", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "oldfieldname": "description", + "oldfieldtype": "Small Text", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "300px", + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "300px" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "col_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "image", + "fieldtype": "Attach", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Image", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "image_view", + "fieldtype": "Image", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Image View", + "length": 0, + "no_copy": 0, + "options": "image", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "quantity", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Quantity", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "fieldname": "qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Quantity", + "length": 0, + "no_copy": 0, + "oldfieldname": "qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "60px", + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "60px" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "col_break2", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "schedule_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Required Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "uom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "UOM", + "length": 0, + "no_copy": 0, + "oldfieldname": "uom", + "oldfieldtype": "Link", + "options": "UOM", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": "100px", + "read_only": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0, + "width": "100px" + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "warehouse_and_reference", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Warehouse and Reference", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "warehouse", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Warehouse", + "length": 0, + "no_copy": 0, + "oldfieldname": "warehouse", + "oldfieldtype": "Link", + "options": "Warehouse", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "project_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Project Name", + "length": 0, + "no_copy": 0, + "options": "Project", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "material_request", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Material Request", + "length": 0, + "no_copy": 1, + "options": "Material Request", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "col_break4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "material_request_item", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Material Request Item", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "brand", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Brand", + "length": 0, + "no_copy": 0, + "oldfieldname": "brand", + "oldfieldtype": "Link", + "options": "Brand", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "", + "fieldname": "item_group", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Item Group", + "length": 0, + "no_copy": 0, + "oldfieldname": "item_group", + "oldfieldtype": "Link", + "options": "Item Group", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "page_break", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Page Break", + "length": 0, + "no_copy": 1, + "oldfieldname": "page_break", + "oldfieldtype": "Check", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2016-03-03 13:42:11.020082", + "modified_by": "Administrator", + "module": "Buying", + "name": "Request for Quotation Item", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "read_only": 0, + "read_only_onload": 0, + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.py b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.py new file mode 100644 index 0000000000..cc897af944 --- /dev/null +++ b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class RequestforQuotationItem(Document): + pass diff --git a/erpnext/buying/doctype/rfq_supplier/__init__.py b/erpnext/buying/doctype/rfq_supplier/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json new file mode 100644 index 0000000000..b4a3f6884b --- /dev/null +++ b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json @@ -0,0 +1,84 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "creation": "2016-02-29 17:31:02.993221", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "supplier", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "options": "Supplier", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "supplier_name", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Name", + "length": 0, + "no_copy": 0, + "options": "supplier.supplier_name", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2016-03-03 12:52:45.937140", + "modified_by": "Administrator", + "module": "Buying", + "name": "RFQ Supplier", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "read_only": 0, + "read_only_onload": 0, + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/buying/doctype/rfq_supplier/rfq_supplier.py b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.py new file mode 100644 index 0000000000..a7ba65c673 --- /dev/null +++ b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class RFQSupplier(Document): + pass diff --git a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json index b09667ba96..2999b07120 100644 --- a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json +++ b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -928,6 +928,57 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "request_for_quotation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Request for Quotation", + "length": 0, + "no_copy": 1, + "options": "Request for Quotation", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "request_for_quotation_item", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Request for Quotation Item", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, diff --git a/erpnext/config/buying.py b/erpnext/config/buying.py index c259f06428..0dc51f6df0 100644 --- a/erpnext/config/buying.py +++ b/erpnext/config/buying.py @@ -12,6 +12,11 @@ def get_data(): "name": "Material Request", "description": _("Request for purchase."), }, + { + "type": "doctype", + "name": "Request for Quotation", + "description": _("Request for quotation."), + }, { "type": "doctype", "name": "Supplier Quotation", diff --git a/erpnext/docs/assets/img/buying/make-supplier-quotation-from-rfq.png b/erpnext/docs/assets/img/buying/make-supplier-quotation-from-rfq.png new file mode 100644 index 0000000000000000000000000000000000000000..135e9fc62db8973adfbaa8136cb162a0e78c2c30 GIT binary patch literal 69233 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/buying/request-for-quotation.png b/erpnext/docs/assets/img/buying/request-for-quotation.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b1ec2deda77f9060a976d4189d1879e4a6b6df GIT binary patch literal 88371 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/user/manual/en/buying/index.txt b/erpnext/docs/user/manual/en/buying/index.txt index a12bb06462..25c8797e18 100644 --- a/erpnext/docs/user/manual/en/buying/index.txt +++ b/erpnext/docs/user/manual/en/buying/index.txt @@ -1,4 +1,5 @@ supplier +request-for-quotation supplier-quotation purchase-order setup diff --git a/erpnext/docs/user/manual/en/buying/request-for-quotation.md b/erpnext/docs/user/manual/en/buying/request-for-quotation.md new file mode 100644 index 0000000000..379cdb543e --- /dev/null +++ b/erpnext/docs/user/manual/en/buying/request-for-quotation.md @@ -0,0 +1,14 @@ +A Request for Quotation is a document that an organization submits to one or more suppliers eliciting quotation for items. + +In ERPNext, You can create request for quotation directly by going to: + +`Buying > Documents > Request for Quotation > New Request for Quotation` + +Create Request for Quotation: + +![Request For Quotation]({{docs_base_url}}/assets/img/buying/request-for-quotation.png) + +Create Supplier Quotation from Request for Quotation form: + +![Request For Quotation]({{docs_base_url}}/assets/img/buying/make-supplier-quotation-from-rfq.png) + \ No newline at end of file diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index c4b4b0e7ed..72f2060ca7 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -48,6 +48,8 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__('Purchase Order'), this.make_purchase_order, __("Make")); + cur_frm.add_custom_button(__("Request for Quotation"), + this.make_request_for_quotation, __("Make")) if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__("Supplier Quotation"), @@ -158,6 +160,14 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten run_link_triggers: true }); }, + + make_request_for_quotation: function(){ + frappe.model.open_mapped_doc({ + method: "erpnext.stock.doctype.material_request.material_request.make_request_for_quotation", + frm: cur_frm, + run_link_triggers: true + }); + }, make_supplier_quotation: function() { frappe.model.open_mapped_doc({ diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 679bd2d89d..73034d1335 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -212,6 +212,30 @@ def make_purchase_order(source_name, target_doc=None): }, target_doc, postprocess) return doclist + +@frappe.whitelist() +def make_request_for_quotation(source_name, target_doc=None): + doclist = get_mapped_doc("Material Request", source_name, { + "Material Request": { + "doctype": "Request for Quotation", + "validation": { + "docstatus": ["=", 1], + "material_request_type": ["=", "Purchase"] + } + }, + "Material Request Item": { + "doctype": "Request for Quotation Item", + "field_map": [ + ["name", "material_request_item"], + ["parent", "material_request"], + ["uom", "uom"] + ], + "postprocess": update_item, + "condition": lambda doc: doc.ordered_qty < doc.qty + } + }, target_doc) + + return doclist @frappe.whitelist() def make_purchase_order_based_on_supplier(source_name, target_doc=None): From 6d1b5d618a97be2ba9d507b964ddc792dc116c12 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 3 Mar 2016 14:00:35 +0530 Subject: [PATCH 2/3] [enhancement] request for quotation --- erpnext/stock/doctype/material_request/material_request.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 73034d1335..6456d03342 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -229,9 +229,7 @@ def make_request_for_quotation(source_name, target_doc=None): ["name", "material_request_item"], ["parent", "material_request"], ["uom", "uom"] - ], - "postprocess": update_item, - "condition": lambda doc: doc.ordered_qty < doc.qty + ] } }, target_doc) From a1064a6149d82d18fe5423274091986186a81c58 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 3 Mar 2016 14:00:35 +0530 Subject: [PATCH 3/3] [enhancement] request for quotation --- erpnext/accounts/party.py | 4 +- .../request_for_quotation.js | 54 ++++--- .../request_for_quotation.json | 54 ++----- .../request_for_quotation.py | 144 ++++++++++++++++-- .../test_request_for_quotation.py | 29 +++- .../request_for_quotation_item.json | 34 +---- .../doctype/rfq_supplier/rfq_supplier.json | 133 +++++++++++++++- .../supplier_quotation.json | 20 +++ .../supplier_quotation_item.json | 58 +++---- erpnext/controllers/buying_controller.py | 7 +- .../controllers/website_list_for_contact.py | 30 +++- erpnext/hooks.py | 7 + erpnext/shopping_cart/utils.py | 27 ++++ erpnext/startup/notifications.py | 3 + .../material_request/material_request.js | 4 +- .../emails/request_for_quotation.html | 12 ++ erpnext/templates/includes/rfq.js | 84 ++++++++++ erpnext/templates/includes/rfq/rfq_items.html | 30 ++++ .../templates/includes/rfq/rfq_macros.html | 21 +++ erpnext/templates/pages/rfq.html | 83 ++++++++++ erpnext/templates/pages/rfq.py | 31 ++++ 21 files changed, 722 insertions(+), 147 deletions(-) create mode 100644 erpnext/templates/emails/request_for_quotation.html create mode 100644 erpnext/templates/includes/rfq.js create mode 100644 erpnext/templates/includes/rfq/rfq_items.html create mode 100644 erpnext/templates/includes/rfq/rfq_macros.html create mode 100644 erpnext/templates/pages/rfq.html create mode 100644 erpnext/templates/pages/rfq.py diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 0c8d999a98..244d39e1b6 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -16,7 +16,7 @@ class DuplicatePartyAccountError(frappe.ValidationError): pass @frappe.whitelist() def get_party_details(party=None, account=None, party_type="Customer", company=None, - posting_date=None, price_list=None, currency=None, doctype=None): + posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False): if not party: return {} @@ -25,7 +25,7 @@ def get_party_details(party=None, account=None, party_type="Customer", company=N frappe.throw(_("{0}: {1} does not exists").format(party_type, party)) return _get_party_details(party, account, party_type, - company, posting_date, price_list, currency, doctype) + company, posting_date, price_list, currency, doctype, ignore_permissions) def _get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False): 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 f4fb5e269b..0d509e2498 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -6,26 +6,30 @@ frappe.require("assets/erpnext/js/utils.js"); -erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({ - refresh: function() { - this._super(); - - if (this.frm.doc.docstatus === 1) { - cur_frm.add_custom_button(__("Supplier Quotation"), this.make_suppplier_quotation, - __("Make")); - cur_frm.page.set_inner_btn_group_as_primary(__("Make")); +frappe.ui.form.on("Request for Quotation",{ + setup: function(frm){ + frm.fields_dict["suppliers"].grid.get_field("contact_person").get_query = function(doc, cdt, cdn){ + var d =locals[cdt][cdn]; + return { + filters: {'supplier': d.supplier} + } } }, - - calculate_taxes_and_totals: function() { - return; + + onload: function(frm){ + frm.add_fetch('standard_reply', 'response', 'response'); }, - tc_name: function() { - this.get_terms(); + refresh: function(frm, cdt, cdn){ + if (frm.doc.docstatus === 1) { + frm.add_custom_button(__("Supplier Quotation"), function(){ frm.trigger("make_suppplier_quotation") }, + __("Make")); + frm.page.set_inner_btn_group_as_primary(__("Make")); + } }, - - make_suppplier_quotation: function() { + + make_suppplier_quotation: function(frm){ + var doc = frm.doc; var dialog = new frappe.ui.Dialog({ title: __("For Supplier"), fields: [ @@ -33,13 +37,13 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e "get_query": function () { return { query:"erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_supplier", - filters: {'parent': cur_frm.doc.name} + filters: {'parent': doc.name} } }, "reqd": 1 }, {"fieldtype": "Button", "label": __("Make Supplier Quotation"), "fieldname": "make_supplier_quotation", "cssClass": "btn-primary"}, ] }); - + dialog.fields_dict.make_supplier_quotation.$input.click(function(){ args = dialog.get_values(); if(!args) return; @@ -48,7 +52,7 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e type: "GET", method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.make_supplier_quotation", args: { - "source_name": cur_frm.doc.name, + "source_name": doc.name, "for_supplier": args.supplier }, freeze: true, @@ -62,8 +66,22 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e }); dialog.show() } +}) +erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({ + refresh: function() { + this._super(); + }, + + calculate_taxes_and_totals: function() { + return; + }, + + tc_name: function() { + this.get_terms(); + } }); + // for backward compatibility: combine new and previous states $.extend(cur_frm.cscript, new erpnext.buying.RequestforQuotationController({frm: cur_frm})); diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json index d46bbff183..88a91a0a37 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -9,32 +9,6 @@ "doctype": "DocType", "document_type": "Document", "fields": [ - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_1", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -150,14 +124,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "section_break_2", + "fieldname": "suppliers_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Supplier Detail", + "label": "", "length": 0, "no_copy": 0, "permlevel": 0, @@ -188,7 +162,7 @@ "options": "RFQ Supplier", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, @@ -208,7 +182,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Items", + "label": "", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", @@ -256,7 +230,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "section_break_3", + "fieldname": "supplier_response_section", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, @@ -281,16 +255,17 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "message_for_supplier", - "fieldtype": "Small Text", + "fieldname": "standard_reply", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Message for Supplier", + "label": "Standard Reply", "length": 0, "no_copy": 0, + "options": "Standard Reply", "permlevel": 0, "precision": "", "print_hide": 0, @@ -306,22 +281,23 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "column_break2", - "fieldtype": "Column Break", + "fieldname": "response", + "fieldtype": "Text Editor", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "label": "Message for Supplier", "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, - "reqd": 0, + "reqd": 1, "search_index": 0, "set_only_once": 0, "unique": 0 @@ -633,7 +609,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-03-02 18:50:02.603258", + "modified": "2016-03-25 01:14:01.194848", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", 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 63b0357091..92089e4a16 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -3,28 +3,107 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe +import frappe, json from frappe import _ +from frappe.utils import get_url, cint +from frappe.utils.user import get_user_fullname from frappe.model.mapper import get_mapped_doc from erpnext.stock.doctype.material_request.material_request import set_missing_values -from frappe.model.document import Document +from erpnext.controllers.buying_controller import BuyingController -class RequestforQuotation(Document): +STANDARD_USERS = ("Guest", "Administrator") + +class RequestforQuotation(BuyingController): def validate(self): self.validate_duplicate_supplier() - + self.validate_common() + def validate_duplicate_supplier(self): supplier_list = [d.supplier for d in self.suppliers] if len(supplier_list) != len(set(supplier_list)): frappe.throw(_("Same supplier has been entered multiple times")) - + + def validate_common(self): + pc = frappe.get_doc('Purchase Common') + pc.validate_for_items(self) + + def on_submit(self): + frappe.db.set(self, 'status', 'Submitted') + self.send_to_supplier() + + def on_cancel(self): + frappe.db.set(self, 'status', 'Cancelled') + + def send_to_supplier(self): + link = get_url("/rfq/" + self.name) + for supplier_data in self.suppliers: + if supplier_data.email_id and cint(supplier_data.sent_email_to_supplier)==1: + update_password_link = self.create_supplier_user(supplier_data, link) + self.supplier_rfq_mail(supplier_data, update_password_link, link) + + def create_supplier_user(self, supplier_data, link): + from frappe.utils import random_string, get_url + + update_password_link = '' + if not supplier_data.user_id: + user = self.create_user(supplier_data) + key = random_string(32) + user.reset_password_key = key + user.redirect_url = link + user.save(ignore_permissions=True) + + update_password_link = get_url("/update-password?key=" + key) + frappe.get_doc('Contact', supplier_data.contact_person).save() + + return update_password_link + + def create_user(self, supplier_data): + user = frappe.get_doc({ + 'doctype': 'User', + 'send_welcome_email': 0, + 'email': supplier_data.email_id, + 'first_name': supplier_data.supplier_name, + 'user_type': 'Website User' + }) + + return user + + def supplier_rfq_mail(self, data, update_password_link, rfq_link): + full_name = get_user_fullname(frappe.session['user']) + if full_name == "Guest": + full_name = "Administrator" + + args = { + 'update_password_link': update_password_link, + 'message': frappe.render_template(self.response, data.as_dict()), + 'rfq_link': rfq_link, + 'user_fullname': full_name + } + + subject = _("Request for Quotation") + template = "templates/emails/request_for_quotation.html" + sender = frappe.session.user not in STANDARD_USERS and frappe.session.user or None + + frappe.sendmail(recipients=data.email_id, sender=sender, subject=subject, + message=frappe.get_template(template).render(args), + attachments = [frappe.attach_print('Request for Quotation', self.name)],as_bulk=True) + + frappe.msgprint(_("Email sent to supplier {0}").format(data.supplier)) + +def get_list_context(context=None): + from erpnext.controllers.website_list_for_contact import get_list_context + list_context = get_list_context(context) + return list_context + @frappe.whitelist() def get_supplier(doctype, txt, searchfield, start, page_len, filters): - query = """ Select supplier from `tabRFQ Supplier` where parent = '{parent}' and supplier like %s - limit {start}, {page_len} """ + query = """Select supplier from `tabRFQ Supplier` where parent = %(parent)s and supplier like %(txt)s + limit %(start)s, %(page_len)s """ - return frappe.db.sql(query.format(parent=filters.get('parent'), start=start, page_len=page_len), '%{0}%'.format(txt)) - + return frappe.db.sql(query, {'parent': filters.get('parent'), + 'start': start, 'page_len': page_len, 'txt': "%%%s%%" % frappe.db.escape(txt)}) + +# This method is used to make supplier quotation from material request form. @frappe.whitelist() def make_supplier_quotation(source_name, for_supplier, target_doc=None): def postprocess(source, target_doc): @@ -49,3 +128,50 @@ def make_supplier_quotation(source_name, for_supplier, target_doc=None): }, target_doc, postprocess) return doclist + +# This method is used to make supplier quotation from supplier's portal. +@frappe.whitelist() +def create_supplier_quotation(doc): + if isinstance(doc, basestring): + doc = json.loads(doc) + + supplier = frappe.get_doc('Supplier', doc.get('supplier')) + + try: + sq_doc = frappe.get_doc({ + "doctype": "Supplier Quotation", + "supplier": supplier.name, + "terms": doc.get("terms"), + "company": doc.get("company"), + "currency": supplier.default_currency, + "buying_price_list": supplier.default_price_list or frappe.db.get_value('Buying Settings', None, 'buying_price_list') + }) + add_items(sq_doc, supplier, doc.get('items')) + sq_doc.flags.ignore_permissions = True + sq_doc.run_method("set_missing_values") + sq_doc.save() + frappe.msgprint(_("Supplier Quotation {0} created").format(sq_doc.name)) + return sq_doc.name + except Exception: + return + +def add_items(sq_doc, supplier, items): + for data in items: + if data.get("qty") > 0: + if isinstance(data, dict): + data = frappe._dict(data) + + create_rfq_items(sq_doc, supplier, data) + +def create_rfq_items(sq_doc, supplier, data): + sq_doc.append('items', { + "item_code": data.item_code, + "item_name": data.item_name, + "description": data.description, + "qty": data.qty, + "rate": data.rate, + "supplier_part_no": frappe.db.get_value("Item Supplier", {'parent': data.item_code, 'supplier': supplier}, "supplier_part_no"), + "warehouse": data.warehouse or '', + "request_for_quotation_item": data.name, + "request_for_quotation": data.parent + }) diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index db828b842c..d643a051ba 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -12,33 +12,48 @@ class TestRequestforQuotation(unittest.TestCase): from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation rfq = make_request_for_quotation() - sq = make_supplier_quotation(rfq.name) - sq.supplier = rfq.get('supplier_detail')[0].supplier + sq = make_supplier_quotation(rfq.name, rfq.get('suppliers')[0].supplier) sq.submit() - sq1 = make_supplier_quotation(rfq.name) - sq1.supplier = rfq.get('supplier_detail')[1].supplier + sq1 = make_supplier_quotation(rfq.name, rfq.get('suppliers')[1].supplier) sq1.submit() - self.assertEquals(sq.supplier, rfq.get('supplier_detail')[0].supplier) + self.assertEquals(sq.supplier, rfq.get('suppliers')[0].supplier) self.assertEquals(sq.get('items')[0].request_for_quotation, rfq.name) self.assertEquals(sq.get('items')[0].item_code, "_Test Item") self.assertEquals(sq.get('items')[0].qty, 5) - self.assertEquals(sq1.supplier, rfq.get('supplier_detail')[1].supplier) + self.assertEquals(sq1.supplier, rfq.get('suppliers')[1].supplier) self.assertEquals(sq1.get('items')[0].request_for_quotation, rfq.name) self.assertEquals(sq1.get('items')[0].item_code, "_Test Item") self.assertEquals(sq1.get('items')[0].qty, 5) + + def test_make_supplier_quotation_from_portal(self): + from erpnext.buying.doctype.request_for_quotation.request_for_quotation import create_supplier_quotation + rfq = make_request_for_quotation() + rfq.get('items')[0].rate = 100 + rfq.supplier = rfq.suppliers[0].supplier + supplier_quotation_name = create_supplier_quotation(rfq) + supplier_quotation_doc = frappe.get_doc('Supplier Quotation', supplier_quotation_name) + + self.assertEquals(supplier_quotation_doc.supplier, rfq.get('suppliers')[0].supplier) + self.assertEquals(supplier_quotation_doc.get('items')[0].request_for_quotation, rfq.name) + self.assertEquals(supplier_quotation_doc.get('items')[0].item_code, "_Test Item") + self.assertEquals(supplier_quotation_doc.get('items')[0].qty, 5) + self.assertEquals(supplier_quotation_doc.get('items')[0].amount, 500) + + def make_request_for_quotation(): supplier_data = get_supplier_data() rfq = frappe.new_doc('Request for Quotation') rfq.transaction_date = nowdate() rfq.status = 'Draft' rfq.company = '_Test Company' + rfq.response = 'Test Data' for data in supplier_data: - rfq.append('supplier_detail', data) + rfq.append('suppliers', data) rfq.append("items", { "item_code": "_Test Item", diff --git a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json index 08bc16d91e..305253c193 100644 --- a/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json +++ b/erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json @@ -28,7 +28,7 @@ "options": "Item", "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, @@ -37,32 +37,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "", - "fieldname": "supplier_part_no", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Supplier Part Number", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -105,7 +79,7 @@ "oldfieldtype": "Data", "permlevel": 0, "precision": "", - "print_hide": 1, + "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, @@ -474,7 +448,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -624,7 +598,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-03-03 13:42:11.020082", + "modified": "2016-03-25 01:14:38.490488", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation Item", diff --git a/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json index b4a3f6884b..02a6f0ba33 100644 --- a/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json +++ b/erpnext/buying/doctype/rfq_supplier/rfq_supplier.json @@ -29,6 +29,83 @@ "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "contact_person", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Contact Person", + "length": 0, + "no_copy": 1, + "options": "Contact", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "1", + "description": "Send Request for Quotation to Supplier", + "fieldname": "sent_email_to_supplier", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Sent Email to Supplier", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, @@ -45,7 +122,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "label": "Name", + "label": "Supplier Name", "length": 0, "no_copy": 0, "options": "supplier.supplier_name", @@ -59,6 +136,58 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "email_id", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Email Id", + "length": 0, + "no_copy": 1, + "options": "contact_person.email_id", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "fieldname": "user_id", + "fieldtype": "Read Only", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User Id", + "length": 0, + "no_copy": 1, + "options": "contact_person.user", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "hide_heading": 0, @@ -70,7 +199,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-03-03 12:52:45.937140", + "modified": "2016-03-25 13:18:11.017660", "modified_by": "Administrator", "module": "Buying", "name": "RFQ Supplier", diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index e12c9fff6f..c9bcc46214 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -1885,6 +1885,26 @@ "share": 0, "submit": 0, "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 1, + "print": 0, + "read": 1, + "report": 0, + "role": "All", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 } ], "read_only": 0, diff --git a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json index 2999b07120..1275fcdf31 100644 --- a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json +++ b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -879,6 +879,32 @@ "unique": 0, "width": "120px" }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "request_for_quotation", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Request for Quotation", + "length": 0, + "no_copy": 1, + "options": "Request for Quotation", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -928,32 +954,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "request_for_quotation", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Request for Quotation", - "length": 0, - "no_copy": 1, - "options": "Request for Quotation", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -970,9 +970,9 @@ "no_copy": 1, "permlevel": 0, "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -1097,7 +1097,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-03-18 05:15:03.936587", + "modified": "2016-03-25 17:01:59.632826", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation Item", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index c9b660db4c..536112662d 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -20,8 +20,9 @@ class BuyingController(StockController): } def get_feed(self): - return _("From {0} | {1} {2}").format(self.supplier_name, self.currency, - self.grand_total) + if self.get("supplier_name"): + return _("From {0} | {1} {2}").format(self.supplier_name, self.currency, + self.grand_total) def validate(self): super(BuyingController, self).validate() @@ -40,7 +41,7 @@ class BuyingController(StockController): # set contact and address details for supplier, if they are not mentioned if getattr(self, "supplier", None): - self.update_if_missing(get_party_details(self.supplier, party_type="Supplier")) + self.update_if_missing(get_party_details(self.supplier, party_type="Supplier", ignore_permissions=self.flags.ignore_permissions)) self.set_missing_item_details() diff --git a/erpnext/controllers/website_list_for_contact.py b/erpnext/controllers/website_list_for_contact.py index ae6e9e4362..588257828f 100644 --- a/erpnext/controllers/website_list_for_contact.py +++ b/erpnext/controllers/website_list_for_contact.py @@ -28,15 +28,14 @@ def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_p filters.append((doctype, "docstatus", "=", 1)) if user != "Guest" and is_website_user(): + parties_doctype = 'RFQ Supplier' if doctype == 'Request for Quotation' else doctype # find party for this contact - customers, suppliers = get_customers_suppliers(doctype, user) + customers, suppliers = get_customers_suppliers(parties_doctype, user) + key, parties = get_party_details(customers, suppliers) - if customers: - key, parties = "customer", customers - elif suppliers: - key, parties = "supplier", suppliers - else: - key, parties = "customer", [] + if doctype == 'Request for Quotation': + if key == 'customer': frappe.throw(_("Not Permitted"), frappe.PermissionError) + return rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length) filters.append((doctype, key, "in", parties)) @@ -52,6 +51,23 @@ def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_p return post_process(doctype, get_list(doctype, txt, filters, limit_start, limit_page_length, fields="name", order_by = "modified desc")) +def get_party_details(customers, suppliers): + if customers: + key, parties = "customer", customers + elif suppliers: + key, parties = "supplier", suppliers + else: + key, parties = "customer", [] + + return key, parties + +def rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length): + data = frappe.db.sql("""select distinct parent as name, supplier from `tab{doctype}` + where supplier = '{supplier}' and docstatus=1 order by modified desc limit {start}, {len}""". + format(doctype=parties_doctype, supplier=parties[0], start=limit_start, len = limit_page_length), as_dict=1) + + return post_process(doctype, data) + def post_process(doctype, data): result = [] for d in data: diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 6e86d84b17..01104b8335 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -71,6 +71,13 @@ website_route_rules = [ "parents": [{"title": _("Shipments"), "name": "shipments"}] } }, + {"from_route": "/rfq", "to_route": "Request for Quotation"}, + {"from_route": "/rfq/", "to_route": "rfq", + "defaults": { + "doctype": "Request for Quotation", + "parents": [{"title": _("Request for Quotation"), "name": "rfq"}] + } + }, {"from_route": "/jobs", "to_route": "Job Opening"}, ] diff --git a/erpnext/shopping_cart/utils.py b/erpnext/shopping_cart/utils.py index 3e1afe27fa..7cd269d0ce 100644 --- a/erpnext/shopping_cart/utils.py +++ b/erpnext/shopping_cart/utils.py @@ -16,6 +16,8 @@ def show_cart_count(): return False def set_cart_count(login_manager): + role, parties = check_customer_or_supplier() + if role == 'Supplier': return if show_cart_count(): from erpnext.shopping_cart.cart import set_cart_count set_cart_count() @@ -29,6 +31,19 @@ def update_website_context(context): context["shopping_cart_enabled"] = cart_enabled def update_my_account_context(context): + check_user_role, parties = check_customer_or_supplier() + + if check_user_role == 'Supplier': + get_supplier_context(context) + else: + get_customer_context(context) + +def get_supplier_context(context): + context["my_account_list"].extend([ + {"label": _("Request for Quotations"), "url": "rfq"}, + ]) + +def get_customer_context(context): context["my_account_list"].extend([ {"label": _("Projects"), "url": "project"}, {"label": _("Orders"), "url": "orders"}, @@ -37,3 +52,15 @@ def update_my_account_context(context): {"label": _("Issues"), "url": "issues"}, {"label": _("Addresses"), "url": "addresses"} ]) + +def check_customer_or_supplier(): + if frappe.session.user: + contacts = frappe.get_all("Contact", fields=["customer", "supplier", "email_id"], + filters={"email_id": frappe.session.user}) + + customer = [d.customer for d in contacts if d.customer] or None + supplier = [d.supplier for d in contacts if d.supplier] or None + + if customer: return 'Customer', customer + if supplier : return 'Supplier', supplier + return 'Customer', None \ No newline at end of file diff --git a/erpnext/startup/notifications.py b/erpnext/startup/notifications.py index 75553122c8..75e55b51f6 100644 --- a/erpnext/startup/notifications.py +++ b/erpnext/startup/notifications.py @@ -32,6 +32,9 @@ def get_notification_config(): "status": ("not in", ("Stopped",)), "per_ordered": ("<", 100) }, + "Request for Quotation": { + "docstatus": 0 + }, "Purchase Order": { "status": ("not in", ("Completed", "Closed")), "docstatus": ("<", 2) diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index 72f2060ca7..982534de6b 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -48,8 +48,10 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__('Purchase Order'), this.make_purchase_order, __("Make")); + + if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__("Request for Quotation"), - this.make_request_for_quotation, __("Make")) + this.make_request_for_quotation, __("Make")); if(doc.material_request_type === "Purchase") cur_frm.add_custom_button(__("Supplier Quotation"), diff --git a/erpnext/templates/emails/request_for_quotation.html b/erpnext/templates/emails/request_for_quotation.html new file mode 100644 index 0000000000..91bdd6b782 --- /dev/null +++ b/erpnext/templates/emails/request_for_quotation.html @@ -0,0 +1,12 @@ +

{{_("Request for Quotation")}}

+
+

{{ message }}

+{% if update_password_link %} +

{{_("Please click on the following link to set your new password")}}:

+

{{ update_password_link }}

+{% else %} +

{{_("Request for quotation can be access by clicking following link")}}:

+

{{ rfq_link }}

+{% endif %} +

{{_("Thank you")}},
+{{ user_fullname }}

\ No newline at end of file diff --git a/erpnext/templates/includes/rfq.js b/erpnext/templates/includes/rfq.js new file mode 100644 index 0000000000..3623d77932 --- /dev/null +++ b/erpnext/templates/includes/rfq.js @@ -0,0 +1,84 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + +window.doc={{ doc.as_json() }}; + +$(document).ready(function() { + new rfq(); + doc.supplier = "{{ doc.supplier }}" +}); + +rfq = Class.extend({ + init: function(){ + this.onfocus_select_all(); + this.change_qty(); + this.change_rate(); + this.terms(); + this.submit_rfq(); + }, + + onfocus_select_all: function(){ + $("input").click(function(){ + $(this).select(); + }) + }, + + change_qty: function(){ + var me = this; + $('.rfq-items').on("change", ".rfq-qty", function(){ + me.idx = parseFloat($(this).attr('data-idx')); + me.qty = parseFloat($(this).val()); + me.rate = parseFloat($(repl('.rfq-rate[data-idx=%(idx)s]',{'idx': me.idx})).val()); + me.update_qty_rate(); + }) + }, + + change_rate: function(){ + var me = this; + $(".rfq-items").on("change", ".rfq-rate", function(){ + me.idx = parseFloat($(this).attr('data-idx')); + me.rate = parseFloat($(this).val()); + me.qty = parseFloat($(repl('.rfq-qty[data-idx=%(idx)s]',{'idx': me.idx})).val()); + me.update_qty_rate(); + }) + }, + + terms: function(){ + $(".terms").on("change", ".terms-feedback", function(){ + doc.terms = $(this).val(); + }) + }, + + update_qty_rate: function(){ + var me = this; + doc.grand_total = 0.0; + $.each(doc.items, function(idx, data){ + if(data.idx == me.idx){ + data.qty = me.qty; + data.rate = me.rate; + data.amount = (me.rate * me.qty) || 0.0; + $(repl('.rfq-amount[data-idx=%(idx)s]',{'idx': me.idx})).text(data.amount.toFixed(2)); + } + + doc.grand_total += flt(data.amount); + $('.tax-grand-total').text(doc.grand_total.toFixed(2)); + }) + }, + + submit_rfq: function(){ + $('.btn-sm').click(function(){ + frappe.freeze(); + frappe.call({ + type: "POST", + method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.create_supplier_quotation", + args: { + doc: doc + }, + btn: this, + callback: function(r){ + frappe.unfreeze(); + } + }) + }) + } +}) diff --git a/erpnext/templates/includes/rfq/rfq_items.html b/erpnext/templates/includes/rfq/rfq_items.html new file mode 100644 index 0000000000..de9a95fdaa --- /dev/null +++ b/erpnext/templates/includes/rfq/rfq_items.html @@ -0,0 +1,30 @@ +{% from "erpnext/templates/includes/rfq/rfq_macros.html" import item_name_and_description %} + +{% for d in doc.items %} +
+
+
+ {{ item_name_and_description(d, doc) }} +
+ +
+ +

+ {{_("UOM") + ": "+ d.uom}} +

+
+
+ +
+
+ 0.00 +
+
+
+{% endfor %} \ No newline at end of file diff --git a/erpnext/templates/includes/rfq/rfq_macros.html b/erpnext/templates/includes/rfq/rfq_macros.html new file mode 100644 index 0000000000..95bbcfec3f --- /dev/null +++ b/erpnext/templates/includes/rfq/rfq_macros.html @@ -0,0 +1,21 @@ +{% from "erpnext/templates/includes/macros.html" import product_image_square %} + +{% macro item_name_and_description(d, doc) %} +
+
+
+ {{ product_image_square(d.image) }} +
+
+
+ {{ d.item_code }} +

{{ d.description }}

+ {% set supplier_part_no = frappe.db.get_value("Item Supplier", {'parent': d.item_code, 'supplier': doc.supplier}, "supplier_part_no") %} +

+ {% if supplier_part_no %} + {{_("Supplier Part No") + ": "+ supplier_part_no}} + {% endif %} +

+
+
+{% endmacro %} diff --git a/erpnext/templates/pages/rfq.html b/erpnext/templates/pages/rfq.html new file mode 100644 index 0000000000..5556d26d96 --- /dev/null +++ b/erpnext/templates/pages/rfq.html @@ -0,0 +1,83 @@ +{% extends "templates/web.html" %} + +{% block header %} +

{{ doc.name }}

+{% endblock %} + +{% block script %} + +{% endblock %} + +{% block breadcrumbs %} + {% include "templates/includes/breadcrumbs.html" %} +{% endblock %} + +{% block style %} + +{% endblock %} + +{% block header_actions %} +{% if doc.items %} + +{% endif %} +{% endblock %} + +{% block page_content %} +
+
+
{{ doc.supplier }}
+
+
+ {{ doc.get_formatted("transaction_date") }} +
+
+ +
+
+
+
+
+ Items +
+
+ Qty +
+
+ Rate +
+
+ Amount +
+
+
+ {% if doc.items %} +
+ {% include "templates/includes/rfq/rfq_items.html" %} +
+ {% endif %} +
+ {% if doc.items %} +
+
{{ _("Grand Total") }}
+
+ 0.0 +
+
+ {% endif %} +
+
{{ _("Terms and Conditions: ") }}
+
+
+
+ +
+
+
+
+ + +{% endblock %} diff --git a/erpnext/templates/pages/rfq.py b/erpnext/templates/pages/rfq.py new file mode 100644 index 0000000000..fbdd6dbd96 --- /dev/null +++ b/erpnext/templates/pages/rfq.py @@ -0,0 +1,31 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ + +def get_context(context): + context.no_cache = 1 + context.doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) + context.parents = frappe.form_dict.parents + context.doc.supplier = get_supplier() + unauthrized_user(context.doc.supplier) + context["title"] = frappe.form_dict.name + +def unauthrized_user(supplier): + status = check_supplier_has_docname_access(supplier) + if status == False: + frappe.throw(_("Not Permitted"), frappe.PermissionError) + +def get_supplier(): + from erpnext.shopping_cart.utils import check_customer_or_supplier + key, parties = check_customer_or_supplier() + return parties[0] if key == 'Supplier' else '' + +def check_supplier_has_docname_access(supplier): + status = True + if frappe.form_dict.name not in frappe.db.sql_list("""select parent from `tabRFQ Supplier` + where supplier = '{supplier}'""".format(supplier=supplier)): + status = False + return status