forked from Mapan/odoo17e
77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from markupsafe import Markup
|
|
|
|
from odoo import api, fields, models, Command, _
|
|
|
|
|
|
class CalendarEventCrm(models.Model):
|
|
_inherit = 'calendar.event'
|
|
|
|
opportunity_id = fields.Many2one(compute="_compute_opportunity_id", readonly=False, store=True, tracking=True)
|
|
|
|
@api.depends('appointment_invite_id')
|
|
def _compute_opportunity_id(self):
|
|
for event in self:
|
|
if event.appointment_invite_id.opportunity_id:
|
|
event.opportunity_id = event.appointment_invite_id.opportunity_id
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
events = super().create(vals_list)
|
|
# We want only event with the right appointment type and another attendee than the employee
|
|
events.filtered(
|
|
lambda e: e.appointment_type_id.lead_create and e.partner_ids - e.user_id.partner_id
|
|
).sudo()._create_lead_from_appointment()
|
|
opportunity_field = self.env['ir.model.fields']._get("calendar.event", "opportunity_id")
|
|
for meeting in events.filtered('opportunity_id'):
|
|
meeting._message_log(
|
|
body=Markup("<p>%s</p>") % _(
|
|
"Meeting linked to Lead/Opportunity %s",
|
|
meeting.opportunity_id._get_html_link()),
|
|
tracking_value_ids=[Command.create({
|
|
'field_id': opportunity_field.id,
|
|
'old_value_char': False,
|
|
'new_value_char': meeting.opportunity_id.name,
|
|
})])
|
|
return events
|
|
|
|
def _create_lead_from_appointment(self):
|
|
lead_values = []
|
|
for event in self:
|
|
partner = event.partner_ids - event.user_id.partner_id
|
|
lead_values.append(event._get_lead_values(partner[:1]))
|
|
|
|
# Create leads within the event organizer's company
|
|
leads = self.env['crm.lead'].with_context(mail_create_nosubscribe=True) \
|
|
.with_company(self.user_id.company_id).create(lead_values)
|
|
for event, lead in zip(self, leads):
|
|
event._link_with_lead(lead)
|
|
lead.activity_schedule(
|
|
act_type_xmlid='mail.mail_activity_data_meeting',
|
|
date_deadline=event.start_date,
|
|
summary=event.name,
|
|
user_id=event.user_id.id,
|
|
calendar_event_id=event.id
|
|
)
|
|
return leads
|
|
|
|
def _get_lead_values(self, partner):
|
|
appointment_tag = self.env.ref('appointment_crm.appointment_crm_tag', raise_if_not_found=False)
|
|
return {
|
|
'name': self.name,
|
|
'tag_ids': [Command.link(appointment_tag.id)] if appointment_tag else False,
|
|
'partner_id': partner.id,
|
|
'type': 'opportunity',
|
|
'user_id': self.user_id.id,
|
|
'description': self.description,
|
|
}
|
|
|
|
def _link_with_lead(self, lead):
|
|
self.write({
|
|
'res_model_id': self.env['ir.model']._get(lead._name).id,
|
|
'res_id': lead.id,
|
|
'opportunity_id': lead.id,
|
|
})
|