1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
# -*- coding: utf-8 -*-
# Part of Softhealer Technologies.
from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
from datetime import timedelta
class TicketAlarm(models.Model):
_name = "sh.ticket.alarm"
_description = "Ticket Reminder"
name = fields.Char(string="Name", readonly=True)
type = fields.Selection([('email', 'Email'), (
'popup', 'Popup')], string="Type", required=True, default='email')
sh_remind_before = fields.Integer(
string="Reminder Before")
sh_reminder_unit = fields.Selection([('Hour(s)', 'Hour(s)'), (
'Minute(s)', 'Minute(s)'), ('Second(s)', 'Second(s)')], string="Reminder Unit", default='Hour(s)',required=True)
company_id = fields.Many2one(
'res.company', 'Company', default=lambda self: self.env.company)
@api.constrains('sh_remind_before')
def _check_sh_reminder_unit(self):
if self.filtered(lambda c: c.sh_reminder_unit == 'Minute(s)' and c.sh_remind_before < 5):
raise ValidationError(_("Reminder Before can't set less than 5 Minutes."))
elif self.filtered(lambda c: c.sh_reminder_unit == 'Second(s)' and c.sh_remind_before < 300):
raise ValidationError(_("Reminder Before can't set less than 300 Seconds."))
elif self.filtered(lambda c: c.sh_reminder_unit == 'Hour(s)' and c.sh_remind_before < 1):
raise ValidationError(_("Reminder Before can't set less than 1 Hour."))
def name_get(self):
# Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields
self.browse(self.ids).read(['sh_remind_before', 'sh_reminder_unit','type'])
return [(alarm.id, '%s%s%s' % (str(alarm.sh_remind_before)+' ',str(alarm.sh_reminder_unit)+' ','['+str(alarm.type)+']'))
for alarm in self]
@api.onchange('sh_remind_before','type','sh_reminder_unit')
def _onchange_name(self):
for rec in self:
rec.name = rec.name_get()[0][1]
@api.model
def _run_ticket_reminder(self):
if self.env.company.sh_display_ticket_reminder:
alarm_ids = self.env['sh.ticket.alarm'].sudo().search([])
if alarm_ids:
for alarm in alarm_ids:
ticket_ids = self.env['helpdesk.ticket'].sudo().search([('sh_ticket_alarm_ids','in',[alarm.id])])
if ticket_ids:
for ticket in ticket_ids:
deadline_date = False
if alarm.sh_reminder_unit == 'Hour(s)' and ticket.sh_due_date:
deadline_date_hours_added = ticket.sh_due_date + timedelta(hours = 5,minutes=30,seconds=0)
deadline_date = deadline_date_hours_added - timedelta(hours = alarm.sh_remind_before)
elif alarm.sh_reminder_unit == 'Minute(s)' and ticket.sh_due_date:
deadline_date_minutes_added = ticket.sh_due_date + timedelta(hours = 5,minutes=30,seconds=0)
deadline_date = deadline_date_minutes_added - timedelta(minutes = alarm.sh_remind_before)
elif alarm.sh_reminder_unit == 'Second(s)' and ticket.sh_due_date:
deadline_date_seconds_added = ticket.sh_due_date + timedelta(hours = 5,minutes=30,seconds=0)
deadline_date = deadline_date_seconds_added - timedelta(seconds = alarm.sh_remind_before)
if deadline_date and deadline_date != False:
if alarm.type == 'popup':
now = fields.Datetime.now() + timedelta(hours = 5,minutes=30,seconds=0)
if fields.Date.today() == deadline_date.date() and deadline_date.hour == now.hour and deadline_date.minute == now.minute:
notifications = []
message="<h2><u>Ticket Information</u></h2></br>"
if ticket.create_date:
message+="<strong>Create Date :</strong>"+str(ticket.create_date) + "</br>"
if ticket.sh_due_date:
message+="<strong>Due Date :</strong>"+str(ticket.sh_due_date) + "</br>"
if ticket.subject_id:
message+="<strong>Subject :</strong>"+str(ticket.subject_id.name) + "</br>"
if ticket.ticket_type:
message+="<strong>Type :</strong>"+str(ticket.ticket_type.name) + "</br>"
if ticket.category_id:
message+="<strong>Category :</strong>"+str(ticket.category_id.name) + "</br>"
if ticket.sub_category_id:
message+="<strong>Sub Category :</strong>"+str(ticket.sub_category_id.name) + "</br>"
if ticket.priority:
message+="<strong>Priority :</strong>"+str(ticket.priority.name) + "</br>"
if ticket.team_id:
message+="<strong>Team :</strong>"+str(ticket.team_id.name) + "</br>"
if ticket.team_head:
message+="<strong>Team Head :</strong>"+str(ticket.team_head.name) + "</br>"
if ticket.user_id:
message+="<strong>Assigned To :</strong>"+str(ticket.user_id.name) + "</br>"
multi_users = []
if ticket.sh_user_ids:
for user in ticket.sh_user_ids:
if user.name not in multi_users:
multi_users.append(user.name)
if len(multi_users) > 0:
message+='<strong>Assigned Users : </strong>'
for user_name in multi_users:
message+='<span class="badge badge-info" style="padding-right:5px">'+str(user_name) +'</span>'
message+='</br>'
tags = []
if ticket.tag_ids:
for tag in ticket.tag_ids:
if tag.name not in tags:
tags.append(tag.name)
if len(tags) > 0:
message+='<strong>Tags : </strong>'
for tag_name in tags:
message+='<span class="badge badge-info" style="padding-right:5px">'+str(tag_name) +'</span>'
message+='</br>'
products = []
if ticket.product_ids:
for product in ticket.product_ids:
if product.name_get()[0][1] not in products:
products.append(product.name_get()[0][1])
if len(products) > 0:
message+='<strong>Products : </strong>'
for product_name in products:
message+='<span class="badge badge-info" style="padding-right:5px">'+str(product_name) +'</span>'
message+='</br>'
if ticket.partner_id:
message+="<strong>Partner :</strong>"+str(ticket.partner_id.name) + "</br>"
if ticket.person_name:
message+="<strong>Person Name :</strong>"+str(ticket.person_name) + "</br>"
if ticket.email:
message+="<strong>Email :</strong>"+str(ticket.email) + "</br>"
model_href = str(self.env['ir.config_parameter'].sudo().get_param('web.base.url')) + '/web#id='+str(ticket.id)+'&model=helpdesk.ticket&view_type=form'
message+="<a style='color:#7C7BAD;padding-right:10px' class='btn btn-link' data-dismiss='toast'>Close</a>"
message+="<a href="+str(model_href)+" target='_blank' class='btn btn-link' style='padding-right:10px;'>Ticket</a>"
partners=[]
if ticket.team_head:
if ticket.team_head.partner_id.id not in partners:
partners.append(ticket.team_head.partner_id.id)
if ticket.user_id:
if ticket.user_id.partner_id.id not in partners:
partners.append(ticket.user_id.partner_id.id)
if ticket.sh_user_ids:
for user_id in ticket.sh_user_ids:
if user_id.partner_id.id not in partners:
partners.append(user_id.partner_id.id)
if len(partners) > 0:
for partner_id in partners:
notifications.append([
(self._cr.dbname, 'res.partner', partner_id),
{'type': 'user_connection', 'title': _('Ticket Reminder '+'('+str(ticket.name)+')'), 'message': message, 'sticky': True, 'warning': False}
])
self.env['bus.bus'].sendmany(notifications)
elif alarm.type == 'email':
now = fields.Datetime.now() + timedelta(hours = 5,minutes=30,seconds=0)
email_formatted=[]
if ticket.team_head:
if str(ticket.team_head.partner_id.email_formatted) not in email_formatted:
email_formatted.append(str(ticket.team_head.email_formatted))
if ticket.user_id:
if str(ticket.user_id.partner_id.email_formatted) not in email_formatted:
email_formatted.append(str(ticket.user_id.email_formatted))
if ticket.sh_user_ids:
for user_id in ticket.sh_user_ids:
if str(user_id.partner_id.email_formatted) not in email_formatted:
email_formatted.append(str(user_id.partner_id.email_formatted))
if fields.Date.today() == deadline_date.date() and deadline_date.hour == now.hour and deadline_date.minute == now.minute:
reminder_template = self.env.ref('sh_helpdesk.sh_ticket_reminder_mail_template')
if reminder_template and len(email_formatted) > 0:
emails = ','.join(email_formatted)
email_values = {'email_to':emails}
reminder_template.sudo().send_mail(ticket.id, force_send=True,email_values=email_values)
|