diff options
| author | Goffin Simon <sig@odoo.com> | 2020-11-02 11:39:47 +0000 |
|---|---|---|
| committer | Goffin Simon <sig@odoo.com> | 2020-11-02 12:25:08 +0000 |
| commit | d11fb611fed3a8541d03b7d3e49973ae7c16a768 (patch) | |
| tree | 6b0f17d75ad9f1f123cf6fceda97a2f4d81a64c8 | |
| parent | 7449c8a6643477742616bf236f2f2c90aec68581 (diff) | |
[FIX] crm: Opportunity Smart Button Incorrect Value
Steps to reproduce the bug:
- Let's consider a company contact C with two children CH1 and CH2
- Create an opportunity for CH1 and a subscription for CH2
Bug:
The count of opportunities in C was displaying 0 instead of 2
opw:237344
| -rw-r--r-- | addons/crm/models/res_partner.py | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/addons/crm/models/res_partner.py b/addons/crm/models/res_partner.py index d9430beada2..742b7b3ed88 100644 --- a/addons/crm/models/res_partner.py +++ b/addons/crm/models/res_partner.py @@ -37,25 +37,22 @@ class Partner(models.Model): return rec def _compute_opportunity_count(self): - if self.ids: - lead_group_data = self.env['crm.lead'].read_group( - [('partner_id.commercial_partner_id', 'in', self.ids)], - ['partner_id'], ['partner_id'] - ) - else: - lead_group_data = [] - partners = dict( - (m['partner_id'][0], m['partner_id_count']) - for m in lead_group_data) - commercial_partners = {} - for partner in self.browse(partners.keys()): - commercial_partners.setdefault(partner.commercial_partner_id.id, 0) - commercial_partners[partner.commercial_partner_id.id] += partners[partner.id] - for partner in self: - if partner.is_company: - partner.opportunity_count = commercial_partners.get(partner.id, 0) - else: - partner.opportunity_count = partners.get(partner.id, 0) + # 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'].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 _compute_meeting_count(self): result = self._compute_meeting() |
