feat: Add weekly and monthly point summary report

This commit is contained in:
Suraj Shetty 2019-04-10 11:30:12 +05:30
parent 62d865bf74
commit 9a2495e421
3 changed files with 111 additions and 15 deletions

View file

@ -186,10 +186,12 @@ scheduler_events = {
"frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_weekly",
"frappe.utils.change_log.check_for_update",
"frappe.desk.doctype.route_history.route_history.flush_old_route_records",
"frappe.desk.form.document_follow.send_weekly_updates"
"frappe.desk.form.document_follow.send_weekly_updates",
"frappe.social.doctype.energy_point_log.energy_point_log.send_weekly_report"
],
"monthly": [
"frappe.email.doctype.auto_email_report.auto_email_report.send_monthly"
"frappe.social.doctype.energy_point_log.energy_point_log.send_monthly_report"
],
"monthly_long": [
"frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_monthly"

View file

@ -7,7 +7,9 @@ import frappe
from frappe import _
import json
from frappe.model.document import Document
from frappe.utils import cint, get_fullname
from frappe.utils import cint, get_fullname, getdate
from frappe.utils.user import get_enabled_system_users
from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled
class EnergyPointLog(Document):
def validate(self):
@ -34,23 +36,23 @@ def get_alert_dict(doc):
if doc.type == 'Auto':
alert_dict.message=_('You gained {} points').format(points)
elif doc.type == 'Appreciation':
alert_dict.message = _('{} appreciated your work on {} with {} points'.format(
alert_dict.message = _('{} appreciated your work on {} with {} points').format(
owner_name,
doc_link,
points
))
)
elif doc.type == 'Criticism':
alert_dict.message = _('{} criticized your work on {} with {} points'.format(
alert_dict.message = _('{} criticized your work on {} with {} points').format(
owner_name,
doc_link,
points
))
)
alert_dict.indicator = 'red'
elif doc.type == 'Revert':
alert_dict.message = _('{} reverted your points on {}'.format(
alert_dict.message = _('{} reverted your points on {}').format(
owner_name,
doc_link,
))
)
alert_dict.indicator = 'red'
else:
alert_dict = {}
@ -107,11 +109,16 @@ def get_energy_points(user):
return frappe._dict(points.get(user, {}))
@frappe.whitelist()
def get_user_energy_and_review_points(user=None):
def get_user_energy_and_review_points(user=None, from_date=None, as_dict=True):
conditions = ''
values = []
if user:
where_user = 'WHERE `user` = %s'
else:
where_user = ''
conditions = 'WHERE `user` = %s'
values.append(user)
if from_date:
conditions += 'WHERE' if not conditions else 'AND'
conditions += ' `creation` >= %s'
values.append(conditions)
points_list = frappe.db.sql("""
SELECT
@ -120,9 +127,13 @@ def get_user_energy_and_review_points(user=None):
SUM(CASE WHEN `type`='Review' and `points` < 0 THEN ABS(`points`) ELSE 0 END) as given_points,
`user`
FROM `tabEnergy Point Log`
{where_user}
{conditions}
GROUP BY `user`
""".format(where_user=where_user), values=user or (), as_dict=1)
ORDER BY `energy_points` DESC
""".format(conditions=conditions), values=values or (), as_dict=1)
if not as_dict:
return points_list
dict_to_return = frappe._dict()
for d in points_list:
@ -187,4 +198,46 @@ def revert(name, reason):
'revert_of': doc_to_revert.name
}).insert()
return revert_log
return revert_log
def send_weekly_summary():
send_summary('Weekly')
def send_monthly_summary():
send_summary('Monthly')
def send_summary(timespan):
if not is_energy_point_enabled():
return
from_date = frappe.utils.add_days(None, -7)
if timespan == 'Monthly':
from_date = frappe.utils.add_days(None, -30)
user_points = get_user_energy_and_review_points(from_date=from_date, as_dict=False)
# do not send report if no activity found
if not user_points or not user_points[0].energy_points: return
from_date = getdate(from_date)
to_date = getdate()
all_users = [user.email for user in get_enabled_system_users()]
frappe.sendmail(
subject='{} energy points summary'.format(timespan),
recipients=all_users,
template="energy_points_summary",
args={
'top_performer': user_points[0],
'top_reviewer': max(user_points, key=lambda x:x['given_points']),
'standings': user_points,
'footer_message': get_footer_message(timespan).format(from_date, to_date)
}
)
def get_footer_message(timespan):
if timespan == 'Monthly':
return _("Stats based on last month's performance (from {} to {})")
else:
return _("Stats based on last week's performance (from {} to {})")

View file

@ -0,0 +1,41 @@
{% if top_performer.energy_points %}
<h3>{{ _('Top Performer') }} 🏆 </h3>
<p> {{ frappe.get_fullname(top_performer.user) }}
<span class="text-muted">
{{ frappe._('gained {} points'.format(frappe.utils.cint(top_performer.energy_points))) }}
</span>
</p>
{% endif %}
{% if top_reviewer.given_points %}
<h3>{{ _('Top Reviewer') }} ❤️ </h3>
<p> {{ frappe.get_fullname(top_reviewer.user) }}
<span class="text-muted">
{{ frappe._('gave {} points'.format(frappe.utils.cint(top_reviewer.given_points))) }}
</span>
</p>
<hr style='margin: 20px 0px'>
{% endif %}
<h3>{{ _('Standings') }}</h3>
<table class='table table-bordered'>
<tr>
<th style='width: 70%'>{{ frappe._('User') }}</th>
<th style='width: 15%'>{{ frappe._('Energy Points') }}</th>
<th style='width: 15%'>{{ frappe._('Points Given') }}</th>
</tr>
{% for user in standings %}
<tr>
<td>{{ frappe.get_fullname(user.user) }}</td>
<td>{{ frappe.utils.cint(user.energy_points) }}</td>
<td>{{ frappe.utils.cint(user.given_points) }}</td>
</tr>
{% endfor %}
</table>
<p class="text-muted">
{{ footer_message }}
</p>