1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/crm_helpdesk/wizard/helpdesk_ticket_to_lead.py
2024-12-10 09:04:09 +07:00

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