150 lines
6.3 KiB
Python
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
|