fix: UX and code cleanup

- Added a small note in muted text at bottom of Dialog
- Dont call 'update_supplier_contact' at the time of preview, its a dummy view anyway
- Renamed `update_contact_of_supplier` to `link_supplier_contact`
- On sending mail, new users and contacts that were created get updated in RFQ doc
- Added docstrings to functions
This commit is contained in:
marination 2020-09-28 20:21:44 +05:30
parent 056c86033d
commit f911228871
3 changed files with 135 additions and 355 deletions

View File

@ -224,8 +224,17 @@ frappe.ui.form.on("Request for Quotation",{
{ {
label: __('Email'), label: __('Email'),
fieldtype: 'HTML', fieldtype: 'HTML',
fieldname: 'email_preview', fieldname: 'email_preview'
}, },
{
fieldtype: 'Section Break',
fieldname: 'sec_break_2'
},
{
label: __('Note'),
fieldtype: 'HTML',
fieldname: 'note'
}
] ]
}); });
@ -237,6 +246,10 @@ frappe.ui.form.on("Request for Quotation",{
}); });
} }
dialog.fields_dict.note.$wrapper.append(`<p class="small text-muted">This is a preview of the email to be sent. A PDF of this document will
automatically be attached with the mail.</p>`);
dialog.set_value("subject", frm.doc.subject); dialog.set_value("subject", frm.doc.subject);
dialog.show(); dialog.show();
} }

View File

@ -51,7 +51,7 @@ class RequestforQuotation(BuyingController):
def validate_email_id(self, args): def validate_email_id(self, args):
if not args.email_id: if not args.email_id:
frappe.throw(_("Row {0}: For Supplier {0}, Email Address is Required to Send Email").format(args.idx, args.supplier)) frappe.throw(_("Row {0}: For Supplier {1}, Email Address is Required to send an email").format(args.idx, frappe.bold(args.supplier)))
def on_submit(self): def on_submit(self):
frappe.db.set(self, 'status', 'Submitted') frappe.db.set(self, 'status', 'Submitted')
@ -63,27 +63,36 @@ class RequestforQuotation(BuyingController):
frappe.db.set(self, 'status', 'Cancelled') frappe.db.set(self, 'status', 'Cancelled')
def get_supplier_email_preview(self, supplier): def get_supplier_email_preview(self, supplier):
# Returns formatted email preview as string '''Returns formatted email preview as string'''
rfq_suppliers = list(filter(lambda row: row.supplier == supplier, self.suppliers)) rfq_suppliers = list(filter(lambda row: row.supplier == supplier, self.suppliers))
rfq_supplier = rfq_suppliers[0] rfq_supplier = rfq_suppliers[0]
update_password_link = self.update_supplier_contact(rfq_supplier, self.get_link()) self.validate_email_id(rfq_supplier)
update_password_link = ""
if not frappe.db.exists("User", rfq_supplier.email_id):
# user doesnt exist
# so (dummy) update password button, should be included for preview
# as it will be included in actual mail, on user creation
update_password_link = "#"
message = self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link(), True) message = self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link(), True)
return message return message
def send_to_supplier(self): def send_to_supplier(self):
'''Sends RFQ mail to involved suppliers'''
for rfq_supplier in self.suppliers: for rfq_supplier in self.suppliers:
if rfq_supplier.send_email: if rfq_supplier.send_email:
self.validate_email_id(rfq_supplier) self.validate_email_id(rfq_supplier)
# make new user if required # make new user if required
update_password_link = self.update_supplier_contact(rfq_supplier, self.get_link()) update_password_link, contact = self.update_supplier_contact(rfq_supplier, self.get_link())
self.update_supplier_part_no(rfq_supplier) self.update_supplier_part_no(rfq_supplier)
self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link()) self.supplier_rfq_mail(rfq_supplier, update_password_link, self.get_link())
rfq_supplier.email_sent = 1 rfq_supplier.email_sent = 1
rfq_supplier.contact = contact
rfq_supplier.save() rfq_supplier.save()
def get_link(self): def get_link(self):
@ -98,18 +107,22 @@ class RequestforQuotation(BuyingController):
def update_supplier_contact(self, rfq_supplier, link): def update_supplier_contact(self, rfq_supplier, link):
'''Create a new user for the supplier if not set in contact''' '''Create a new user for the supplier if not set in contact'''
update_password_link = '' update_password_link, contact = '', ''
if frappe.db.exists("User", rfq_supplier.email_id): if frappe.db.exists("User", rfq_supplier.email_id):
user = frappe.get_doc("User", rfq_supplier.email_id) user = frappe.get_doc("User", rfq_supplier.email_id)
else: else:
user, update_password_link = self.create_user(rfq_supplier, link) user, update_password_link = self.create_user(rfq_supplier, link)
self.update_contact_of_supplier(rfq_supplier, user) contact = self.link_supplier_contact(rfq_supplier, user)
return update_password_link return update_password_link, contact
def update_contact_of_supplier(self, rfq_supplier, user): def link_supplier_contact(self, rfq_supplier, user):
'''
Create a new contact if no contact against Supplier.
If Contact exists, check if email and user id set
'''
if rfq_supplier.contact: if rfq_supplier.contact:
contact = frappe.get_doc("Contact", rfq_supplier.contact) contact = frappe.get_doc("Contact", rfq_supplier.contact)
else: else:
@ -126,6 +139,10 @@ class RequestforQuotation(BuyingController):
contact.save(ignore_permissions=True) contact.save(ignore_permissions=True)
if not rfq_supplier.contact:
# return contact to later update, RFQ supplier row's contact
return contact.name
def create_user(self, rfq_supplier, link): def create_user(self, rfq_supplier, link):
user = frappe.get_doc({ user = frappe.get_doc({
'doctype': 'User', 'doctype': 'User',

View File

@ -1,362 +1,112 @@
{ {
"allow_copy": 0, "actions": [],
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
"creation": "2016-03-29 05:59:11.896885", "creation": "2016-03-29 05:59:11.896885",
"custom": 0,
"docstatus": 0,
"doctype": "DocType", "doctype": "DocType",
"document_type": "",
"editable_grid": 1, "editable_grid": 1,
"engine": "InnoDB", "engine": "InnoDB",
"field_order": [
"send_email",
"email_sent",
"supplier",
"contact",
"no_quote",
"quote_status",
"column_break_3",
"supplier_name",
"email_id",
"download_pdf"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "1", "default": "1",
"fieldname": "send_email", "fieldname": "send_email",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0, "label": "Send Email"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Send Email",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0", "default": "0",
"depends_on": "eval:doc.docstatus >= 1", "depends_on": "eval:doc.docstatus >= 1",
"fieldname": "email_sent", "fieldname": "email_sent",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Email Sent", "label": "Email Sent",
"length": 0,
"no_copy": 1, "no_copy": 1,
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 4, "columns": 4,
"fieldname": "supplier", "fieldname": "supplier",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Supplier", "label": "Supplier",
"length": 0,
"no_copy": 0,
"options": "Supplier", "options": "Supplier",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_on_submit": 1,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 3, "columns": 3,
"fieldname": "contact", "fieldname": "contact",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Contact", "label": "Contact",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Contact", "options": "Contact"
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0, "default": "0",
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.docstatus >= 1 && doc.quote_status != 'Received'", "depends_on": "eval:doc.docstatus >= 1 && doc.quote_status != 'Received'",
"fieldname": "no_quote", "fieldname": "no_quote",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0, "label": "No Quote"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "No Quote",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.docstatus >= 1 && !doc.no_quote", "depends_on": "eval:doc.docstatus >= 1 && !doc.no_quote",
"fieldname": "quote_status", "fieldname": "quote_status",
"fieldtype": "Select", "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Quote Status", "label": "Quote Status",
"length": 0,
"no_copy": 0,
"options": "Pending\nReceived\nNo Quote", "options": "Pending\nReceived\nNo Quote",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_3", "fieldname": "column_break_3",
"fieldtype": "Column Break", "fieldtype": "Column Break"
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 1, "bold": 1,
"collapsible": 0,
"columns": 0,
"fetch_from": "supplier.supplier_name", "fetch_from": "supplier.supplier_name",
"fieldname": "supplier_name", "fieldname": "supplier_name",
"fieldtype": "Read Only", "fieldtype": "Read Only",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 1, "in_global_search": 1,
"in_list_view": 0, "label": "Supplier Name"
"in_standard_filter": 0,
"label": "Supplier Name",
"length": 0,
"no_copy": 0,
"options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 3, "columns": 3,
"fetch_from": "contact.email_id", "fetch_from": "contact.email_id",
"fieldname": "email_id", "fieldname": "email_id",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Email Id", "label": "Email Id",
"length": 0, "no_copy": 1
"no_copy": 1,
"options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "download_pdf", "fieldname": "download_pdf",
"fieldtype": "Button", "fieldtype": "Button",
"hidden": 0, "label": "Download PDF"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Download PDF",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
} }
], ],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1, "istable": 1,
"max_attachments": 0, "links": [],
"modified": "2018-05-16 22:43:30.212408", "modified": "2020-09-28 19:31:11.855588",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Buying", "module": "Buying",
"name": "Request for Quotation Supplier", "name": "Request for Quotation Supplier",
"name_case": "",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1, "track_changes": 1
"track_seen": 0
} }