[RFQ] Enhancement and minor fixes
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 aab006f..f35c3b7 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 @@
 		];
 		
 		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 7f1988a..2ce5c5c 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, 
@@ -70,6 +71,33 @@
    "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, 
+   "collapsible": 0, 
    "fieldname": "column_break1", 
    "fieldtype": "Column Break", 
    "hidden": 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 b02c22e..3099fe6 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.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 @@
 			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 @@
 		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 @@
 		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()
 
-		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)])
+		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.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 7a23f43..8c6ac91 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
@@ -42,6 +42,31 @@
    "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, 
+   "collapsible": 0, 
    "fieldname": "column_break_3", 
    "fieldtype": "Column Break", 
    "hidden": 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 3399b51..5fe7456 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
@@ -10,6 +10,32 @@
  "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, 
    "collapsible": 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",