Skip to content

Commit

Permalink
Rating module for helpdesk
Browse files Browse the repository at this point in the history
  • Loading branch information
samuel-domatix authored and carolinafernandez-tecnativa committed Mar 27, 2024
1 parent 51874a8 commit 7c67d0e
Show file tree
Hide file tree
Showing 12 changed files with 327 additions and 0 deletions.
1 change: 1 addition & 0 deletions helpdesk_mgmt_rating/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
23 changes: 23 additions & 0 deletions helpdesk_mgmt_rating/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
'name': 'Helpdesk Management Rating',
'summary': """
This module allows the customer to rate the assistance received
on a ticket.
""",
'version': '11.0.1.0.0',
'license': 'AGPL-3',
'author': 'Domatix',
'website': 'https://www.domatix.com',
'category': 'Productivity',
'depends': ['helpdesk_mgmt', 'rating'],
'data': [
'data/helpdesk_data.xml',
'views/helpdesk_ticket_menu.xml',
'views/helpdesk_ticket_view.xml',
'views/helpdesk_ticket_stage_view.xml',
],
'qweb': [],
'demo': [],
'test': [],
'installable': True,
}
90 changes: 90 additions & 0 deletions helpdesk_mgmt_rating/data/helpdesk_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<record id="mt_ticket_rating" model="mail.message.subtype">
<field name="name">Ticket Rating</field>
<field name="res_model">helpdesk.ticket</field>
<field name="default" eval="True"/>
<field name="description">Ratings</field>
</record>

<record id="rating_ticket_email_template" model="mail.template">
<field name="name">Helpdesk Ticket: Rating Request</field>
<field name="model_id" ref="helpdesk_mgmt.model_helpdesk_ticket"/>
<field name="email_from">${object.rating_get_rated_partner_id().email or '' | safe}</field>
<field name="email_to">${object.rating_get_partner_id().email or '' | safe}</field>
<field name="subject">Satisfaction Survey of the ticket ${object.number} - ${object.name}</field>
<field name="partner_to">${object.rating_get_partner_id().id}</field>
<field name="auto_delete" eval="True"/>
<field name="body_html"><![CDATA[
% set access_token = object.rating_get_access_token()
<div style="background:#F0F0F0;color:#515166;padding:10px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;">
<table style="width:600px;margin:5px auto;">
<tbody>
<tr><td>
<a href="/"><img src="/web/binary/company_logo" style="vertical-align:baseline;max-width:100px;" /></a>
</td><td style="text-align:right;vertical-align:middle;">
Satisfaction Survey
</td></tr>
</tbody>
</table>
<table style="width:600px;margin:0px auto;background:white;border:1px solid #e1e1e1;">
<tbody>
<tr><td style="padding:15px 20px 10px 20px;">
<p>Hello,</p>
<p>Please take a moment to rate our services related to the ticket "<strong>${object.number} - ${object.name}</strong>"
assigned to <strong>${object.rating_get_rated_partner_id().name}</strong>.</p>
<p>We appreciate your feedback. It helps us to improve continuously.</p>
</td></tr>
<tr><td style="padding:10px 20px">
<table summary="o_mail_notification" style="width:100%;border-top:1px solid #e1e1e1;">
<tr>
<td style="text-align:center;">
<h2 style="font-weight:300;font-size:18px;">
Tell us how you feel about our service:
</h2>
<div style="text-color: #888888">(click on one of these smileys)</div>
</td>
</tr>
<tr>
<td style="padding:10px 10px;">
<table style="width:100%;text-align:center;">
<tr>
<td>
<a href="/rating/${access_token}/10">
<img alt="Satisfied" src="/rating/static/src/img/rating_10.png" title="Satisfied"/>
</a>
</td>
<td>
<a href="/rating/${access_token}/5">
<img alt="Not satisfied" src="/rating/static/src/img/rating_5.png" title="Not satisfied"/>
</a>
</td>
<td>
<a href="/rating/${access_token}/1">
<img alt="Highly Dissatisfied" src="/rating/static/src/img/rating_1.png" title="Highly Dissatisfied"/>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td></tr>
<tr><td style="padding:15px 20px 10px 20px;">${(object.user_id.signature or '')| safe}</td></tr>
</tbody>
</table>
<table style="width:600px;margin:auto;text-align:center;font-size:12px;">
<tbody>
<tr><td style="padding-top:10px;color:#afafaf;">
% if object.rating_status == 'stage_change':
<p>This customer survey has been sent because your ticket has been moved to the stage <b>${object.stage_id.name}</b></p>
% endif
</td></tr>
</tbody>
</table>
</div>
]]></field>
</record>
</data>
</odoo>
2 changes: 2 additions & 0 deletions helpdesk_mgmt_rating/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import helpdesk_ticket
from . import helpdesk_ticket_stage
70 changes: 70 additions & 0 deletions helpdesk_mgmt_rating/models/helpdesk_ticket.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from openerp import models, api, fields, _
from odoo.tools.safe_eval import safe_eval


class HelpdeskTicket(models.Model):
_name = 'helpdesk.ticket'
_inherit = ['helpdesk.ticket', 'rating.mixin']

positive_rate_percentage = fields.Integer(
string='Positive Rates Percentage',
compute="_compute_percentage",
store=True,
default=-1)

rating_status = fields.Selection(
[('stage_change', 'Rating when changing stage'),
('no_rate', 'No rating')],
string='Customer Rating', default="stage_change", require=True)

@api.depends('rating_ids.rating')
def _compute_percentage(self):
for ticket in self:
activity = ticket.rating_get_grades()
ticket.positive_rate_percentage = activity['great'] * 100 / \
sum(activity.values()) if sum(activity.values()) else -1

@api.multi
def write(self, vals):
res = super(HelpdeskTicket, self).write(vals)
if 'stage_id' in vals and vals.get('stage_id'):
stage = self.env['helpdesk.ticket.stage'].search([('id', '=', vals.get('stage_id'))])
if(stage.rating_mail_template_id):
self._send_ticket_rating_mail(force_send=False)
return res

def _send_ticket_rating_mail(self, force_send=False):
# for ticket in self:
if self.rating_status == 'stage_change':
survey_template = self.stage_id.rating_mail_template_id
if survey_template:
self.rating_send_request(survey_template,
lang=self.partner_id.lang,
force_send=force_send)

@api.multi
def rating_apply(self, rate, token=None, feedback=None, subtype=None):
return super(HelpdeskTicket, self).rating_apply(rate, token=token, feedback=feedback, subtype="helpdesk_mgmt_rating.mt_ticket_rating")

def rating_get_partner_id(self):
res = super(HelpdeskTicket, self).rating_get_partner_id()
if not res and self.partner_id:
return self.partner_id
return res

def rating_get_parent_model_name(self, vals):
return 'helpdesk.ticket'

def rating_get_ticket_id(self):
return self.id

@api.multi
def action_view_ticket_rating(self):
action = self.env['ir.actions.act_window'].for_xml_id(
'helpdesk_mgmt_rating', 'helpdesk_ticket_rating_action')
action['name'] = _('Ticket Rating')
action_context = safe_eval(action['context']) \
if action['context'] else {}
action_context.update(self._context)
action_context.pop('group_by', None)
return dict(action, context=action_context)
12 changes: 12 additions & 0 deletions helpdesk_mgmt_rating/models/helpdesk_ticket_stage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from openerp import models, api, fields, _


class HelpdeskTicketStage(models.Model):
_inherit = 'helpdesk.ticket.stage'

rating_mail_template_id = fields.Many2one(
'mail.template',
string="Rating Email Template",
domain=[('model', '=', 'helpdesk.ticket')],
help="If set, an email will be sent to the customer "
"with a rating survey when the ticket reaches this stage.")
17 changes: 17 additions & 0 deletions helpdesk_mgmt_rating/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
To configure this module, you need to:
#. Edit or create stages.
#. Edit or create tickets.

Stages
~~~~~~
#. Go to *Helpdesk > Configuration > Stages* to edit or create new stages.
#. Edit or create a new stage.
#. Set the name for the stage.
#. You can select the Email template for rating.

Tickets
~~~~~~~
#. Go to *Helpdesk > Ticket* to edit or create new tickets.
#. Edit or create a new ticket.
#. Set the name for the ticket.
#. Select if the ticket should be qualified or not.
3 changes: 3 additions & 0 deletions helpdesk_mgmt_rating/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* `Domatix <https://www.domatix.com>`_:

* Samuel Calvo
1 change: 1 addition & 0 deletions helpdesk_mgmt_rating/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module adds the posibility to rate the assistance received through helpdesk tickets.
35 changes: 35 additions & 0 deletions helpdesk_mgmt_rating/views/helpdesk_ticket_menu.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<record id="all_helpdesk_ticket_rating_action" model="ir.actions.act_window">
<field name="name">Customer Rating</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">rating.rating</field>
<field name="view_mode">kanban</field>
<field name="view_type">form</field>
<field name="domain">[('res_model', '=', 'helpdesk.ticket'), ('consumed', '=', True)]</field>
<field name="help" type="html">
<p>
There are no rated tickets at this moment.
</p>
</field>
</record>

<record id="helpdesk_ticket_rating_action" model="ir.actions.act_window">
<field name="name"></field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">rating.rating</field>
<field name="view_mode">kanban</field>
<field name="view_type">form</field>
<field name="domain">[('consumed','=',True), ('res_model','=','helpdesk.ticket'), ('res_id', '=', active_id)]</field>
<field name="help" type="html">
<p>
There are no ratings for this ticket at the moment.
</p>
</field>
</record>

<menuitem id="helpdesk_ticket_rating_menu" name="Customer Rating" parent="helpdesk_mgmt.helpdesk_ticket_reporting_menu"
action="all_helpdesk_ticket_rating_action" sequence="50"/>
</data>
</odoo>
24 changes: 24 additions & 0 deletions helpdesk_mgmt_rating/views/helpdesk_ticket_stage_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_helpdesk_ticket_stage_form_inherit" model="ir.ui.view">
<field name="name">view.helpdesk.ticket.stage.form.inherit</field>
<field name="model">helpdesk.ticket.stage</field>
<field name="inherit_id" ref="helpdesk_mgmt.view_helpdesk_ticket_stage_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='mail_template_id']" position="after">
<field name="rating_mail_template_id"/>
</xpath>
</field>
</record>

<record id="view_helpdesk_ticket_stage_tree_inherit" model="ir.ui.view">
<field name="name">view.helpdesk.ticket.stage.tree.inherit</field>
<field name="model">helpdesk.ticket.stage</field>
<field name="inherit_id" ref="helpdesk_mgmt.view_helpdesk_ticket_stage_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='mail_template_id']" position="after">
<field name="rating_mail_template_id"/>
</xpath>
</field>
</record>
</odoo>
49 changes: 49 additions & 0 deletions helpdesk_mgmt_rating/views/helpdesk_ticket_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_helpdesk_ticket_kanban_inherit" model="ir.ui.view">
<field name="name">view.helpdesk.ticket.kanban.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk_mgmt.view_helpdesk_ticket_kanban"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_kanban_bottom_left')]" position="inside">
<field name="positive_rate_percentage" invisible="1"/>
<b>
<t t-if="record.positive_rate_percentage.value == -1">
<i class="fa fa-smile-o"/> No rating yet
</t>
<t t-if="record.positive_rate_percentage.value != -1">
<a name="action_view_ticket_rating" type="object">
<i class="fa fa-smile-o"/> <t t-esc="record.positive_rate_percentage.value"/>%
</a>
</t>
</b>
</xpath>
<xpath expr="//ul[hasclass('dropdown-menu')]/li[2]" position="after">
<li><a name="action_view_ticket_rating" type="object">Customer Rating</a></li>
</xpath>
</field>
</record>

<record id="ticket_view_form_inherit" model="ir.ui.view">
<field name="name">ticket.view.form.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk_mgmt.ticket_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_title')]" position="before">
<field name="positive_rate_percentage" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="action_view_ticket_rating" type="object" class="oe_stat_button" icon="fa fa-smile-o"
attrs="{'invisible': [('positive_rate_percentage', '=', -1)]}">
<field name="rating_count" widget="statinfo" string="Ratings"/>
</button>
</div>
</xpath>
<xpath expr="//group[@name='main']/group[2]" position="after">
<group>
<field name="rating_status" widget="radio"/>
</group>
</xpath>
</field>
</record>

</odoo>

0 comments on commit 7c67d0e

Please sign in to comment.