Files

150 lines
6.3 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class HelpdeskTicketToLead(models.TransientModel):
_name = 'helpdesk.ticket.to.lead'
_description = "Convert Ticket to Lead"
@api.model
def default_get(self, fields):
res = super().default_get(fields)
if not res.get('ticket_id') and self.env.context.get('active_id'):
res['ticket_id'] = self.env.context['active_id']
if res.get('ticket_id'):
ticket = self.env['helpdesk.ticket'].browse(res.get('ticket_id'))
if not ticket.active:
raise ValidationError(_('An archived ticket cannot be converted into a lead.'))
return res
convert_to = fields.Selection([
('convert', 'Convert to opportunity'),
], 'Conversion Action')
force_assignment = fields.Boolean(
'Force assignment', default=True,
help='If checked, forces salesman to be updated on updated opportunities even if already set.')
ticket_id = fields.Many2one('helpdesk.ticket', required=True, readonly=False)
action = fields.Selection([
('create', 'Create a new customer'),
('exist', 'Link to an existing customer'),
('nothing', 'Do not link to a customer')
], string='Related Customer', compute='_compute_action', readonly=False, store=True)
partner_id = fields.Many2one('res.partner', string="Customer", compute='_compute_partner_id', store=True, readonly=False)
team_id = fields.Many2one('crm.team', string="Sales Team", compute='_compute_team_id', store=True, readonly=False)
user_id = fields.Many2one('res.users', string="Salesperson", compute='_compute_user_id', store=True, readonly=False)
@api.depends('ticket_id')
def _compute_action(self):
for convert in self:
if not convert.ticket_id:
convert.action = 'nothing'
else:
partner = convert.ticket_id._find_matching_partner()
if partner:
convert.action = 'exist'
elif convert.ticket_id.name:
convert.action = 'create'
else:
convert.action = 'nothing'
@api.depends('action', 'ticket_id')
def _compute_partner_id(self):
for convert in self:
if convert.action == 'exist':
convert.partner_id = convert.ticket_id._find_matching_partner()
else:
convert.partner_id = False
@api.depends('ticket_id.user_id', 'user_id')
def _compute_team_id(self):
""" First, team id is chosen, then, user. If user from ticket have a
team_id, use this user and their team."""
for convert in self:
user = convert.user_id or convert.ticket_id.user_id
if not user or (convert.team_id and user in convert.team_id.member_ids | convert.team_id.user_id):
continue
team = self.env['crm.team']._get_default_team_id(user_id=user.id, domain=None)
convert.team_id = team.id
@api.depends('ticket_id', 'team_id')
def _compute_user_id(self):
for convert in self:
user = convert.ticket_id.user_id
convert.user_id = user if user and user in convert.team_id.member_ids else False
if not convert.user_id and self.team_id and not self.env['crm.lead']._is_rule_based_assignment_activated():
self.user_id = self.team_id.user_id
def action_convert_to_lead(self):
self.ensure_one()
# create partner if needed
if self.action == 'create':
self.partner_id = self.ticket_id._find_matching_partner(force_create=True)
values = {
'name': self.ticket_id.name,
'partner_id': self.partner_id.id,
'team_id': self.team_id.id,
'user_id': self.user_id.id,
'description': self.ticket_id.description,
'email_cc': self.ticket_id.email_cc,
"campaign_id": self.ticket_id.campaign_id.id,
"medium_id": self.ticket_id.medium_id.id,
"source_id": self.ticket_id.source_id.id,
}
ticket_link = self.ticket_id._get_html_link(title=f"{self.ticket_id.name} #({self.ticket_id.ticket_ref})")
if self.env.user.has_group('crm.group_use_lead'):
mail_message = _('This lead has been created from ticket: %s', ticket_link)
mail_thread_message = _('Lead created')
else:
values['type'] = 'opportunity'
mail_message = _('This opportunity has been created from ticket: %s', ticket_link)
mail_thread_message = _('Opportunity created')
lead_sudo = self.env['crm.lead'].with_context(
mail_create_nosubscribe=True,
mail_create_nolog=True,
).sudo().create(values)
lead_sudo.message_post(
body=mail_message,
message_type='comment',
subtype_xmlid='mail.mt_note',
)
# move the mail thread and attachments
self.ticket_id.message_change_thread(lead_sudo)
attachments = self.env['ir.attachment'].search([('res_model', '=', 'helpdesk.ticket'), ('res_id', '=', self.ticket_id.id)])
attachments.sudo().write({'res_model': 'crm.lead', 'res_id': lead_sudo.id})
self.ticket_id.action_archive()
# After mail thread move, add linked lead message to ticket
self.ticket_id.message_post_with_source(
'helpdesk.ticket_conversion_link',
render_values={'created_record': lead_sudo, 'message': mail_thread_message},
subtype_xmlid='mail.mt_note',
)
# return to lead (if can see) or ticket (if cannot)
if not lead_sudo.with_env(self.env).has_access('read'):
return {
'name': _('Ticket Converted'),
'view_mode': 'form',
'res_model': self.ticket_id._name,
'type': 'ir.actions.act_window',
'res_id': self.ticket_id.id
}
# return the action to go to the form view of the new Ticket
action = self.sudo().env.ref('crm.crm_lead_all_leads').read()[0]
action.update({
'res_id': lead_sudo.id,
'view_mode': 'form',
'views': [(False, 'form')],
})
return action