From a314872cb582fe45898c80fec0b355d400afb7f4 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 30 Jun 2016 00:00:42 +0530 Subject: [PATCH] [RFQ] Enhancement and minor fixes --- .../request_for_quotation.js | 4 +- .../request_for_quotation.json | 32 +++++++- .../request_for_quotation.py | 79 +++++++++++++------ .../request_for_quotation_item.json | 29 ++++++- .../request_for_quotation_supplier.json | 29 ++++++- 5 files changed, 145 insertions(+), 28 deletions(-) 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 aab006f862..f35c3b7a3a 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -4,7 +4,7 @@ {% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; - +cur_frm.add_fetch('contact', 'email_id', 'email_id') frappe.ui.form.on("Request for Quotation",{ setup: function(frm){ @@ -23,7 +23,7 @@ frappe.ui.form.on("Request for Quotation",{ ]; frm.get_field('suppliers').grid.editable_fields = [ - {fieldname: 'supplier', columns: 5}, + {fieldname: 'supplier', columns: 4}, {fieldname: 'contact', columns: 3}, {fieldname: 'email_id', columns: 3} ]; 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 7f1988a8b5..2ce5c5c7be 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -3,6 +3,7 @@ "allow_import": 1, "allow_rename": 0, "autoname": "naming_series:", + "beta": 0, "creation": "2016-02-25 01:24:07.224790", "custom": 0, "docstatus": 0, @@ -66,6 +67,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "For individual supplier", + "fieldname": "vendor", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier", + "length": 0, + "no_copy": 1, + "options": "Supplier", + "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, @@ -603,13 +631,14 @@ "hide_toolbar": 0, "icon": "icon-shopping-cart", "idx": 0, + "image_view": 0, "in_create": 0, "in_dialog": 0, "is_submittable": 1, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-03-29 06:18:26.398938", + "modified": "2016-06-30 01:57:49.233065", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", @@ -757,6 +786,7 @@ "write": 0 } ], + "quick_entry": 0, "read_only": 0, "read_only_onload": 1, "search_fields": "status, transaction_date", 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 b02c22ed90..3099fe63b9 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -8,6 +8,8 @@ from frappe import _ from frappe.model.mapper import get_mapped_doc from frappe.utils import get_url, random_string from frappe.utils.user import get_user_fullname +from frappe.desk.form.load import get_attachments +from frappe.core.doctype.communication.email import make from erpnext.accounts.party import get_party_account_currency, get_party_details from erpnext.stock.doctype.material_request.material_request import set_missing_values from erpnext.controllers.buying_controller import BuyingController @@ -34,6 +36,10 @@ class RequestforQuotation(BuyingController): if not rfq_supplier.email_id: rfq_supplier.email_id = frappe.db.get_value("Contact", rfq_supplier.contact, "email_id") + def validate_email_id(self, args): + if not args.email_id: + frappe.throw(_("Row {0}: For supplier {0} email id is required to send email").format(args.idx, args.supplier)) + def on_submit(self): frappe.db.set(self, 'status', 'Submitted') @@ -41,42 +47,61 @@ class RequestforQuotation(BuyingController): frappe.db.set(self, 'status', 'Cancelled') def send_to_supplier(self): - link = get_url("/rfq/" + self.name) for rfq_supplier in self.suppliers: - if rfq_supplier.email_id: + if rfq_supplier.send_email: + self.validate_email_id(rfq_supplier) # make new user if required - update_password_link = self.create_supplier_user(rfq_supplier, link) + update_password_link = self.update_supplier_contact(rfq_supplier, self.get_link()) - self.supplier_rfq_mail(rfq_supplier, update_password_link, link) - else: - frappe.throw(_("For supplier {0} email id is required to send email").format(rfq_supplier.supplier)) + self.update_supplier_part_no(rfq_supplier) + self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link()) - def create_supplier_user(self, rfq_supplier, link): + def get_link(self): + # RFQ link for supplier portal + return get_url("/rfq/" + self.name) + + def update_supplier_part_no(self, args): + self.vendor = args.supplier + for item in self.items: + item.supplier_part_no = frappe.db.get_value('Item Supplier', + {'parent': item.item_code, 'supplier': args.supplier}, 'supplier_part_no') + + def update_supplier_contact(self, rfq_supplier, link): '''Create a new user for the supplier if not set in contact''' update_password_link = '' - contact = frappe.get_doc("Contact", rfq_supplier.contact) - if not contact.user: - if frappe.db.exists("User", rfq_supplier.email_id): - user = frappe.get_doc("User", rfq_supplier.email_id) - else: - user, update_password_link = self.create_user(rfq_supplier, link) + if frappe.db.exists("User", rfq_supplier.email_id): + user = frappe.get_doc("User", rfq_supplier.email_id) + else: + user, update_password_link = self.create_user(rfq_supplier, link) - # set user_id in contact - contact = frappe.get_doc('Contact', rfq_supplier.contact) - contact.user = user.name - contact.save() + self.update_contact_of_supplier(rfq_supplier, user) return update_password_link + def update_contact_of_supplier(self, rfq_supplier, user): + if rfq_supplier.contact: + contact = frappe.get_doc("Contact", rfq_supplier.contact) + else: + contact = frappe.new_doc("Contact") + contact.first_name = rfq_supplier.supplier_name or rfq_supplier.supplier + contact.supplier = rfq_supplier.supplier + + if not contact.email_id and not contact.user: + contact.email_id = user.name + contact.user = user.name + + contact.save(ignore_permissions=True) + def create_user(self, rfq_supplier, link): user = frappe.get_doc({ 'doctype': 'User', 'send_welcome_email': 0, 'email': rfq_supplier.email_id, - 'first_name': rfq_supplier.supplier_name, - 'user_type': 'Website User' + 'first_name': rfq_supplier.supplier_name or rfq_supplier.supplier, + 'user_type': 'Website User', + 'redirect_url': link }) user.save(ignore_permissions=True) update_password_link = user.reset_password() @@ -98,12 +123,22 @@ class RequestforQuotation(BuyingController): 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 + message = frappe.get_template(template).render(args) + attachments = self.get_attachments() + + self.send_email(data, sender, subject, message, attachments) + + def send_email(self, data, sender, subject, message, attachments): + make(subject = subject, content=message,recipients=data.email_id, + sender=sender,attachments = attachments, send_email=True)["name"] - 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)]) frappe.msgprint(_("Email sent to supplier {0}").format(data.supplier)) + def get_attachments(self): + attachments = [d.name for d in get_attachments(self.doctype, self.name)] + attachments.append(frappe.attach_print('Request for Quotation', self.name, doc=self)) + return attachments + @frappe.whitelist() def send_supplier_emails(rfq_name): rfq = frappe.get_doc("Request for Quotation", rfq_name) 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 7a23f43ad9..8c6ac91866 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 @@ -38,6 +38,31 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "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 No", + "length": 0, + "no_copy": 1, + "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, @@ -601,8 +626,8 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-06-17 12:25:37.655901", - "modified_by": "umair@erpnext.com", + "modified": "2016-06-28 14:25:08.330508", + "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation Item", "name_case": "", diff --git a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json index 3399b51aef..5fe74560d9 100644 --- a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json +++ b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json @@ -9,6 +9,32 @@ "doctype": "DocType", "document_type": "", "fields": [ + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "default": "1", + "fieldname": "send_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Send Email", + "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, @@ -141,13 +167,14 @@ "hide_heading": 0, "hide_toolbar": 0, "idx": 0, + "image_view": 0, "in_create": 0, "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-05-31 19:08:15.397706", + "modified": "2016-06-30 02:01:54.130809", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation Supplier",