This commit does below improvements: 1/ If salesperson and sales team are set on an individual partner, we propagate those to parent company being created from m2o of the form view. 2/ If the existing parent company is manually linked to an individual partner being created, and salesperson and sales team are not set on the individual, we set those values from the linked parent (if set on the parent). Task-2636290 closes odoo/odoo#78696 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
75 lines
3.0 KiB
Python
75 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class Partner(models.Model):
|
|
_name = 'res.partner'
|
|
_inherit = 'res.partner'
|
|
|
|
team_id = fields.Many2one(
|
|
'crm.team', string='Sales Team',
|
|
compute='_compute_team_id',
|
|
precompute=True, # avoid queries post-create
|
|
ondelete='set null', readonly=False, store=True)
|
|
opportunity_ids = fields.One2many('crm.lead', 'partner_id', string='Opportunities', domain=[('type', '=', 'opportunity')])
|
|
opportunity_count = fields.Integer("Opportunity", compute='_compute_opportunity_count')
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
rec = super(Partner, self).default_get(fields)
|
|
active_model = self.env.context.get('active_model')
|
|
if active_model == 'crm.lead' and len(self.env.context.get('active_ids', [])) <= 1:
|
|
lead = self.env[active_model].browse(self.env.context.get('active_id')).exists()
|
|
if lead:
|
|
rec.update(
|
|
phone=lead.phone,
|
|
mobile=lead.mobile,
|
|
function=lead.function,
|
|
title=lead.title.id,
|
|
website=lead.website,
|
|
street=lead.street,
|
|
street2=lead.street2,
|
|
city=lead.city,
|
|
state_id=lead.state_id.id,
|
|
country_id=lead.country_id.id,
|
|
zip=lead.zip,
|
|
)
|
|
return rec
|
|
|
|
@api.depends('parent_id')
|
|
def _compute_team_id(self):
|
|
for partner in self.filtered(lambda partner: not partner.team_id and partner.company_type == 'person' and partner.parent_id.team_id):
|
|
partner.team_id = partner.parent_id.team_id
|
|
|
|
def _compute_opportunity_count(self):
|
|
# retrieve all children partners and prefetch 'parent_id' on them
|
|
all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)])
|
|
all_partners.read(['parent_id'])
|
|
|
|
opportunity_data = self.env['crm.lead'].with_context(active_test=False)._read_group(
|
|
domain=[('partner_id', 'in', all_partners.ids)],
|
|
fields=['partner_id'], groupby=['partner_id']
|
|
)
|
|
|
|
self.opportunity_count = 0
|
|
for group in opportunity_data:
|
|
partner = self.browse(group['partner_id'][0])
|
|
while partner:
|
|
if partner in self:
|
|
partner.opportunity_count += group['partner_id_count']
|
|
partner = partner.parent_id
|
|
|
|
def action_view_opportunity(self):
|
|
'''
|
|
This function returns an action that displays the opportunities from partner.
|
|
'''
|
|
action = self.env['ir.actions.act_window']._for_xml_id('crm.crm_lead_opportunities')
|
|
action['context'] = {'active_test': False}
|
|
if self.is_company:
|
|
action['domain'] = [('partner_id.commercial_partner_id', '=', self.id)]
|
|
else:
|
|
action['domain'] = [('partner_id', '=', self.id)]
|
|
return action
|