[fixes] email notifications by email alert on training event and result

This commit is contained in:
Rushabh Mehta 2017-08-11 17:31:42 +05:30
parent 35a4e587ee
commit 550b0fab84
21 changed files with 232 additions and 207 deletions

View File

@ -289,3 +289,13 @@ def create_user(employee, user = None):
})
user.insert()
return user.name
def get_employee_emails(employee_list):
'''Returns list of employee emails either based on user_id or company_email'''
employee_emails = []
for employee in employee_list:
user, email = frappe.db.get_value('Employee', employee, ['user_id', 'company_email'])
if user or email:
employee_emails.append(user or email)
return employee_emails

View File

@ -17,36 +17,5 @@ frappe.ui.form.on('Training Event', {
frappe.set_route("List", "Training Feedback");
});
}
},
onload: function(frm) {
var params = get_search_parameters();
if (params.hasOwnProperty('employee') && params.hasOwnProperty('status')) {
var newTemp = frm.doc.employees.filter(function(obj) {
return obj.name == params.employee;
});
if (newTemp) {
newTemp[0].status = params.status;
frm.refresh_field("employees");
frappe.msgprint(__('{0}: Status for {1} is updated to {2}', [frm.doc.name, newTemp[0].employee_name, newTemp[0].status]));
frappe.route_options = {};
frappe.set_route("List", "Training Event");
}
}
}
});
function get_search_parameters() {
var prmstr = window.location.href.split('?')[2];
return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
}
function transformToAssocArray( prmstr ) {
var params = {};
var prmarr = prmstr.split("&");
for ( var i = 0; i < prmarr.length; i++) {
var tmparr = prmarr[i].split("=");
params[tmparr[0]] = tmparr[1];
}
return params;
}
});

View File

@ -581,68 +581,6 @@
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "Will send an email about the event to employees with status 'Open'",
"fieldname": "send_email",
"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": "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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.send_email",
"fieldname": "include_attachments",
"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": "Include Attachments",
"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,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 1,
@ -703,6 +641,37 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "employee_emails",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Employee Emails",
"length": 0,
"no_copy": 0,
"options": "Email",
"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,
"unique": 0
}
],
"has_web_view": 0,
@ -715,7 +684,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-07-25 01:43:53.189382",
"modified": "2017-08-11 03:11:25.768563",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Event",

View File

@ -3,82 +3,10 @@
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.model.document import Document
from frappe.desk.form.load import get_attachments
from frappe.core.doctype.communication.email import make
from frappe.utils.user import get_user_fullname
from frappe.utils import get_url_to_form
STANDARD_USERS = ("Guest", "Administrator")
from erpnext.hr.doctype.employee.employee import get_employee_emails
class TrainingEvent(Document):
def on_update(self):
if self.docstatus == 1:
self.invite_employee()
def on_update_after_submit(self):
self.invite_employee()
def invite_employee(self):
if self.event_status == "Scheduled" and self.send_email:
subject = _("""You are invited for to attend {0} - {1} scheduled from {2} to {3} at {4}."""\
.format(self.type, self.event_name, self.start_time, self.end_time, self.location))
for emp in self.employees:
if emp.status== "Open":
self.send_training_mail(emp)
emp.status= "Invited"
def get_link(self, employee, status):
return get_url_to_form("Training Event",self.name) + "?employee=" + employee + "&status=" + status
def send_training_mail(self, data):
full_name = get_user_fullname(frappe.session['user'])
if full_name == "Guest":
full_name = "Administrator"
args = {
'message': frappe.render_template(self.introduction, data.as_dict()),
'confirm_link': self.get_link(data.name, "Confirmed"),
'reject_link': self.get_link(data.name, "Withdrawn"),
'complete_link': self.get_link(data.name, "Attended"),
'event_link': get_url_to_form("Training Event",self.name),
'self_study': 1 if self.type == "Self-Study" else 0,
'attendance': data.attendance,
'user_fullname': full_name
}
args.update(self.as_dict())
subject = _("Training Event")
template = "templates/emails/training_event.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_invitation_email(data, sender, subject, message, attachments)
def send_invitation_email(self, data, sender, subject, message, attachments):
email = frappe.db.get_value("Employee", data.employee, "company_email")
if email:
make(subject=subject, content=message, recipients=email,
sender=sender, attachments=attachments, send_email=True,
doctype=self.doctype, name=self.name)
frappe.msgprint(_("Email sent to {0}").format(data.employee_name))
def get_attachments(self):
if self.include_attachments:
attachments = [d.name for d in get_attachments(self.doctype, self.name)]
else:
attachments = []
return attachments
@frappe.whitelist(allow_guest=True)
def set_response(event, response):
doc = frappe.get_doc('Training Event Employee', event)
if doc:
doc.status = response
doc.save()
frappe.msgprint(_("Status for this training event as been updated"))
def validate(self):
self.employee_emails = ', '.join(get_employee_emails([d.employee
for d in self.employees]))

View File

@ -121,7 +121,7 @@
"label": "Status",
"length": 0,
"no_copy": 1,
"options": "Open\nInvited\nConfirmed\nAttended\nWithdrawn",
"options": "Open\nInvited\nCompleted\nFeedback Submitted",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@ -176,7 +176,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2017-07-25 01:41:28.915089",
"modified": "2017-08-11 03:36:22.738253",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Event Employee",

View File

@ -5,6 +5,19 @@
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe import _
class TrainingFeedback(Document):
pass
def validate(self):
training_event = frappe.get_doc("Training Event", self.training_event)
if training_event.docstatus != 1:
frappe.throw(_('{0} must be submitted').format(_('Training Event')))
def on_submit(self):
training_event = frappe.get_doc("Training Event", self.training_event)
for e in training_event.employees:
if e.employee == self.employee:
training_event.status = 'Feedback Submitted'
break
training_event.update_after_submit()

View File

@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: Training Result", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new Training Result
() => frappe.tests.make('Training Result', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@ -26,7 +26,7 @@
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Training Event",
"length": 0,
@ -133,6 +133,37 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "employee_emails",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Employee Emails",
"length": 0,
"no_copy": 0,
"options": "Email",
"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,
"unique": 0
}
],
"has_web_view": 0,
@ -145,7 +176,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2017-06-15 08:16:01.566531",
"modified": "2017-08-11 03:53:21.283968",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Result",

View File

@ -6,19 +6,27 @@ from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.model.document import Document
from erpnext.hr.doctype.employee.employee import get_employee_emails
class TrainingResult(Document):
def validate(self):
training_event = frappe.get_doc("Training Event", self.training_event)
if training_event.docstatus != 1:
frappe.throw(_('{0} must be submitted').format(_('Training Event')))
self.employee_emails = ', '.join(get_employee_emails([d.employee
for d in self.employees]))
def on_submit(self):
self.send_result()
def send_result(self):
for emp in self.employees:
message = "Thank You for attending {0}.".format(self.training_event)
if emp.grade:
message = message + "Your grade: {0}".format(emp.grade)
frappe.sendmail(frappe.db.get_value("Employee", emp.employee, "company_email"), \
subject=_("{0} Results".format(self.training_event)), \
content=message)
training_event = frappe.get_doc("Training Event", self.training_event)
training_event.status = 'Completed'
for e in self.employees:
for e1 in training_event.employees:
if e1.employee == e.employee:
e1.status = 'Completed'
break
training_event.save()
@frappe.whitelist()
def get_employees(training_event):

View File

View File

@ -0,0 +1,6 @@
<p>{{ _("Hello") }},</p>
<p>You attended training {{ frappe.utils.get_link_to_form(
"Training Event", doc.training_event) }}</p>
<p>{{ _("Please share your feedback to the training by clicking on 'Training Feedback' and then 'New'") }}</p>

View File

@ -0,0 +1,24 @@
{
"attach_print": 0,
"creation": "2017-08-11 03:17:11.769210",
"days_in_advance": 0,
"docstatus": 0,
"doctype": "Email Alert",
"document_type": "Training Result",
"enabled": 1,
"event": "Submit",
"idx": 0,
"is_standard": 1,
"message": "<h3>{{_(\"Training Event\")}}</h3>\n<p>{{ message }}</p>\n\n<h4>{{_(\"Details\")}}</h4>\n{{_(\"Event Name\")}}: <a href=\"{{ event_link }}\">{{ name }}</a>\n<br>{{_(\"Event Location\")}}: {{ location }}\n<br>{{_(\"Start Time\")}}: {{ start_time }}\n<br>{{_(\"End Time\")}}: {{ end_time }}\n<br>{{_(\"Attendance\")}}: {{ attendance }}\n",
"modified": "2017-08-11 03:27:45.876483",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Feedback",
"owner": "Administrator",
"recipients": [
{
"email_by_document_field": "employee_emails"
}
],
"subject": "{{ _(\"Please Share your Feedback For {0}\") + doc.training_event }}"
}

View File

@ -0,0 +1,9 @@
<h3>{{_("Training Event")}}</h3>
<p>{{ message }}</p>
<h4>{{_("Details")}}</h4>
{{_("Event Name")}}: <a href="{{ event_link }}">{{ name }}</a>
<br>{{_("Event Location")}}: {{ location }}
<br>{{_("Start Time")}}: {{ start_time }}
<br>{{_("End Time")}}: {{ end_time }}
<br>{{_("Attendance")}}: {{ attendance }}

View File

@ -0,0 +1,7 @@
from __future__ import unicode_literals
import frappe
def get_context(context):
# do your magic here
pass

View File

@ -0,0 +1,9 @@
<h3>{{_("Training Event")}}</h3>
<p>{{ doc.introduction }}</p>
<h4>{{_("Details")}}</h4>
{{_("Event Name")}}: {{ frappe.utils.get_link_to_form(doc.doctype, doc.name) }}
<br>{{_("Event Location")}}: {{ doc.location }}
<br>{{_("Start Time")}}: {{ doc.start_time }}
<br>{{_("End Time")}}: {{ doc.end_time }}

View File

@ -0,0 +1,24 @@
{
"attach_print": 0,
"creation": "2017-08-11 03:13:40.519614",
"days_in_advance": 0,
"docstatus": 0,
"doctype": "Email Alert",
"document_type": "Training Event",
"enabled": 1,
"event": "Submit",
"idx": 0,
"is_standard": 1,
"message": "<h3>{{_(\"Training Event\")}}</h3>\n<p>{{ message }}</p>\n\n<h4>{{_(\"Details\")}}</h4>\n{{_(\"Event Name\")}}: <a href=\"{{ event_link }}\">{{ name }}</a>\n<br>{{_(\"Event Location\")}}: {{ location }}\n<br>{{_(\"Start Time\")}}: {{ start_time }}\n<br>{{_(\"End Time\")}}: {{ end_time }}\n<br>{{_(\"Attendance\")}}: {{ attendance }}\n",
"modified": "2017-08-11 03:13:40.519614",
"modified_by": "Administrator",
"module": "HR",
"name": "Training Scheduled",
"owner": "Administrator",
"recipients": [
{
"email_by_document_field": "employee_emails"
}
],
"subject": "{{ _(\"Training Scheduled\") }}"
}

View File

@ -0,0 +1,9 @@
<h3>{{_("Training Event")}}</h3>
<p>{{ message }}</p>
<h4>{{_("Details")}}</h4>
{{_("Event Name")}}: <a href="{{ event_link }}">{{ name }}</a>
<br>{{_("Event Location")}}: {{ location }}
<br>{{_("Start Time")}}: {{ start_time }}
<br>{{_("End Time")}}: {{ end_time }}
<br>{{_("Attendance")}}: {{ attendance }}

View File

@ -0,0 +1,7 @@
from __future__ import unicode_literals
import frappe
def get_context(context):
# do your magic here
pass

View File

@ -1,21 +0,0 @@
<h3>{{_("Training Event")}}</h3>
<p>{{ message }}</p>
<h4>{{_("Details")}}</h4>
{{_("Event Name")}}: <a href="{{ event_link }}">{{ name }}</a>
<br>{{_("Event Location")}}: {{ location }}
<br>{{_("Start Time")}}: {{ start_time }}
<br>{{_("End Time")}}: {{ end_time }}
<br>{{_("Attendance")}}: {{ attendance }}
<h4>{{_("Update Response")}}</h4>
{% if not self_study %}
<p>{{_("Please update your status for this training event")}}:</p>
<form action="{{ confirm_link }}"><input style="display:inline-block" type="submit" value="Confirm Attendance" /></form>
<form action="{{ reject_link }}"><input style="display:inline-block" type="submit" value="Reject Invitation" /></form>
{% else %}
<p>{{_("Please confirm once you have completed your training")}}:</p>
<form action="{{ complete_link }}"><input style="display:inline-block" type="submit" value="Completed Training" /></form>
{% endif %}
<p>{{_("Thank you")}},<br>
{{ user_fullname }}</p>