forked from Mapan/odoo17e
104 lines
4.1 KiB
Python
104 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class CrmLeadConvert2Ticket(models.TransientModel):
|
|
""" wizard to convert a Lead into a Helpdesk ticket and move the Mail Thread """
|
|
_name = "crm.lead.convert2ticket"
|
|
_description = 'Lead convert to Ticket'
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
result = super(CrmLeadConvert2Ticket, self).default_get(fields)
|
|
if 'partner_id' in fields:
|
|
lead_id = result.get('lead_id')
|
|
if lead_id:
|
|
lead = self.env['crm.lead'].browse(lead_id)
|
|
result['partner_id'] = lead._find_matching_partner().id
|
|
if 'team_id' in fields:
|
|
team_ids = self.env['helpdesk.team'].search([], limit=2)
|
|
result['team_id'] = team_ids[0].id if len(team_ids) == 1 else None
|
|
return result
|
|
|
|
lead_id = fields.Many2one(
|
|
'crm.lead', string='Lead', domain=[('type', '=', 'lead')],
|
|
default=lambda self: self.env.context.get('active_id', None),
|
|
)
|
|
partner_id = fields.Many2one('res.partner', 'Customer')
|
|
team_id = fields.Many2one('helpdesk.team', string='Team', required=True)
|
|
ticket_type_id = fields.Many2one('helpdesk.ticket.type', "Ticket Type")
|
|
|
|
def action_lead_to_helpdesk_ticket(self):
|
|
self.ensure_one()
|
|
# get the lead to transform
|
|
lead = self.lead_id
|
|
partner = self.partner_id
|
|
if not partner and (lead.partner_name or lead.contact_name):
|
|
lead._handle_partner_assignment(create_missing=True)
|
|
partner = lead.partner_id
|
|
|
|
# prepare new helpdesk.ticket values
|
|
vals = {
|
|
"name": lead.name,
|
|
"description": lead.description,
|
|
"team_id": self.team_id.id,
|
|
"ticket_type_id": self.ticket_type_id.id,
|
|
"partner_id": partner.id,
|
|
"user_id": None,
|
|
"campaign_id": lead.campaign_id.id,
|
|
"medium_id": lead.medium_id.id,
|
|
"source_id": lead.source_id.id,
|
|
}
|
|
if lead.contact_name:
|
|
vals["partner_name"] = lead.contact_name
|
|
if lead.phone: # lead phone is always sync with partner phone
|
|
vals["partner_phone"] = lead.phone
|
|
else: # if partner is not on lead -> take partner phone first
|
|
vals["partner_phone"] = partner.phone or lead.mobile or partner.mobile
|
|
if lead.email_from:
|
|
vals['partner_email'] = lead.email_from
|
|
|
|
# create and add a specific creation message
|
|
ticket_sudo = self.env['helpdesk.ticket'].with_context(
|
|
mail_create_nosubscribe=True, mail_create_nolog=True
|
|
).sudo().create(vals)
|
|
ticket_sudo.message_post_with_source(
|
|
'mail.message_origin_link',
|
|
render_values={'self': ticket_sudo, 'origin': lead},
|
|
subtype_xmlid='mail.mt_note',
|
|
)
|
|
|
|
# move the mail thread
|
|
lead.message_change_thread(ticket_sudo)
|
|
# move attachments
|
|
attachments = self.env['ir.attachment'].search([('res_model', '=', 'crm.lead'), ('res_id', '=', lead.id)])
|
|
attachments.sudo().write({'res_model': 'helpdesk.ticket', 'res_id': ticket_sudo.id})
|
|
# archive the lead
|
|
lead.action_archive()
|
|
|
|
# return to ticket (if can see) or lead (if cannot)
|
|
try:
|
|
self.env['helpdesk.ticket'].browse(ticket_sudo.ids).check_access_rule('read')
|
|
except:
|
|
return {
|
|
'name': _('Lead Converted'),
|
|
'view_mode': 'form',
|
|
'res_model': lead._name,
|
|
'type': 'ir.actions.act_window',
|
|
'res_id': lead.id
|
|
}
|
|
|
|
# return the action to go to the form view of the new Ticket
|
|
view = self.env.ref('helpdesk.helpdesk_ticket_view_form')
|
|
return {
|
|
'name': _('Ticket created'),
|
|
'view_mode': 'form',
|
|
'view_id': view.id,
|
|
'res_model': 'helpdesk.ticket',
|
|
'type': 'ir.actions.act_window',
|
|
'res_id': ticket_sudo.id,
|
|
'context': self.env.context
|
|
}
|