forked from Mapan/odoo17e
134 lines
5.6 KiB
Python
134 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class HelpdeskTicketConvert2Lead(models.TransientModel):
|
|
_name = "helpdesk.ticket.to.lead"
|
|
_description = "Convert Ticket to Lead"
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
res = super(HelpdeskTicketConvert2Lead, self).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(_('The archived ticket can not converted as lead.'))
|
|
return res
|
|
|
|
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.partner_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
|
|
|
|
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).id
|
|
|
|
lead_sudo = self.env['crm.lead'].with_context(
|
|
mail_create_nosubscribe=True,
|
|
mail_create_nolog=True
|
|
).sudo().create({
|
|
'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=self.ticket_id.name +' #({})'.format(self.ticket_id.id))
|
|
lead_sudo.message_post(
|
|
body=_('This lead has been created from ticket: %s', ticket_link),
|
|
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': _('Lead created')},
|
|
subtype_xmlid='mail.mt_note',
|
|
)
|
|
|
|
# return to lead (if can see) or ticket (if cannot)
|
|
try:
|
|
self.env['crm.lead'].check_access_rights('read')
|
|
self.env['crm.lead'].browse(lead_sudo.ids).check_access_rule('read')
|
|
except:
|
|
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
|