# -*- 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="
Ticket Information
"
if ticket.create_date:
message+="Create Date :"+str(ticket.create_date) + ""
if ticket.sh_due_date:
message+="Due Date :"+str(ticket.sh_due_date) + ""
if ticket.subject_id:
message+="Subject :"+str(ticket.subject_id.name) + ""
if ticket.ticket_type:
message+="Type :"+str(ticket.ticket_type.name) + ""
if ticket.category_id:
message+="Category :"+str(ticket.category_id.name) + ""
if ticket.sub_category_id:
message+="Sub Category :"+str(ticket.sub_category_id.name) + ""
if ticket.priority:
message+="Priority :"+str(ticket.priority.name) + ""
if ticket.team_id:
message+="Team :"+str(ticket.team_id.name) + ""
if ticket.team_head:
message+="Team Head :"+str(ticket.team_head.name) + ""
if ticket.user_id:
message+="Assigned To :"+str(ticket.user_id.name) + ""
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+='Assigned Users : '
for user_name in multi_users:
message+=''+str(user_name) +''
message+=''
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+='Tags : '
for tag_name in tags:
message+=''+str(tag_name) +''
message+=''
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+='Products : '
for product_name in products:
message+=''+str(product_name) +''
message+=''
if ticket.partner_id:
message+="Partner :"+str(ticket.partner_id.name) + ""
if ticket.person_name:
message+="Person Name :"+str(ticket.person_name) + ""
if ticket.email:
message+="Email :"+str(ticket.email) + ""
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+="Close"
message+="Ticket"
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)