[IMP] crm: make code of merge opportunities overloadable
This commit is contained in:
parent
e133e5fc36
commit
9ca58db6be
|
@ -29,7 +29,8 @@ from openerp import tools
|
||||||
from openerp.addons.base.res.res_partner import format_address
|
from openerp.addons.base.res.res_partner import format_address
|
||||||
from openerp.osv import fields, osv, orm
|
from openerp.osv import fields, osv, orm
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp.tools import email_re
|
from openerp.tools import email_re, email_split
|
||||||
|
|
||||||
|
|
||||||
CRM_LEAD_FIELDS_TO_MERGE = ['name',
|
CRM_LEAD_FIELDS_TO_MERGE = ['name',
|
||||||
'partner_id',
|
'partner_id',
|
||||||
|
@ -585,6 +586,37 @@ class crm_lead(format_address, osv.osv):
|
||||||
attachment.write(values)
|
attachment.write(values)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def get_duplicated_leads(self, cr, uid, ids, partner_id, include_lost=False, context=None):
|
||||||
|
"""
|
||||||
|
Search for opportunities that have the same partner and that arent done or cancelled
|
||||||
|
"""
|
||||||
|
lead = self.browse(cr, uid, ids[0], context=context)
|
||||||
|
email = lead.partner_id and lead.partner_id.email or lead.email_from
|
||||||
|
return self.pool['crm.lead']._get_duplicated_leads_by_emails(cr, uid, partner_id, email, include_lost=include_lost, context=context)
|
||||||
|
|
||||||
|
def _get_duplicated_leads_by_emails(self, cr, uid, partner_id, email, include_lost=False, context=None):
|
||||||
|
"""
|
||||||
|
Search for opportunities that have the same partner and that arent done or cancelled
|
||||||
|
"""
|
||||||
|
final_stage_domain = [('stage_id.probability', '<', 100), '|', ('stage_id.probability', '>', 0), ('stage_id.sequence', '<=', 1)]
|
||||||
|
partner_match_domain = []
|
||||||
|
for email in set(email_split(email) + [email]):
|
||||||
|
partner_match_domain.append(('email_from', '=ilike', email))
|
||||||
|
if partner_id:
|
||||||
|
partner_match_domain.append(('partner_id', '=', partner_id))
|
||||||
|
partner_match_domain = ['|'] * (len(partner_match_domain) - 1) + partner_match_domain
|
||||||
|
if not partner_match_domain:
|
||||||
|
return []
|
||||||
|
domain = partner_match_domain
|
||||||
|
if not include_lost:
|
||||||
|
domain += final_stage_domain
|
||||||
|
return self.search(cr, uid, domain, context=context)
|
||||||
|
|
||||||
|
def merge_dependences(self, cr, uid, highest, opportunities, context=None):
|
||||||
|
self._merge_notify(cr, uid, highest, opportunities, context=context)
|
||||||
|
self._merge_opportunity_history(cr, uid, highest, opportunities, context=context)
|
||||||
|
self._merge_opportunity_attachments(cr, uid, highest, opportunities, context=context)
|
||||||
|
|
||||||
def merge_opportunity(self, cr, uid, ids, user_id=False, section_id=False, context=None):
|
def merge_opportunity(self, cr, uid, ids, user_id=False, section_id=False, context=None):
|
||||||
"""
|
"""
|
||||||
Different cases of merge:
|
Different cases of merge:
|
||||||
|
@ -627,14 +659,12 @@ class crm_lead(format_address, osv.osv):
|
||||||
if section_id:
|
if section_id:
|
||||||
merged_data['section_id'] = section_id
|
merged_data['section_id'] = section_id
|
||||||
|
|
||||||
# Merge messages and attachements into the first opportunity
|
|
||||||
self._merge_opportunity_history(cr, uid, highest.id, tail_opportunities, context=context)
|
|
||||||
self._merge_opportunity_attachments(cr, uid, highest.id, tail_opportunities, context=context)
|
|
||||||
|
|
||||||
# Merge notifications about loss of information
|
# Merge notifications about loss of information
|
||||||
opportunities = [highest]
|
opportunities = [highest]
|
||||||
opportunities.extend(opportunities_rest)
|
opportunities.extend(opportunities_rest)
|
||||||
self._merge_notify(cr, uid, highest.id, opportunities, context=context)
|
|
||||||
|
self.merge_dependences(cr, uid, highest.id, tail_opportunities, context=context)
|
||||||
|
|
||||||
# Check if the stage is in the stages of the sales team. If not, assign the stage with the lowest sequence
|
# Check if the stage is in the stages of the sales team. If not, assign the stage with the lowest sequence
|
||||||
if merged_data.get('section_id'):
|
if merged_data.get('section_id'):
|
||||||
section_stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('section_ids', 'in', merged_data['section_id']), ('type', '=', merged_data.get('type'))], order='sequence', context=context)
|
section_stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('section_ids', 'in', merged_data['section_id']), ('type', '=', merged_data.get('type'))], order='sequence', context=context)
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
|
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp.tools import email_split
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
class crm_lead2opportunity_partner(osv.osv_memory):
|
class crm_lead2opportunity_partner(osv.osv_memory):
|
||||||
|
@ -46,21 +45,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
|
||||||
"""
|
"""
|
||||||
Search for opportunities that have the same partner and that arent done or cancelled
|
Search for opportunities that have the same partner and that arent done or cancelled
|
||||||
"""
|
"""
|
||||||
lead_obj = self.pool.get('crm.lead')
|
return self.pool.get('crm.lead')._get_duplicated_leads_by_emails(cr, uid, partner_id, email, include_lost=include_lost, context=context)
|
||||||
emails = set(email_split(email) + [email])
|
|
||||||
final_stage_domain = [('stage_id.probability', '<', 100), '|', ('stage_id.probability', '>', 0), ('stage_id.sequence', '<=', 1)]
|
|
||||||
partner_match_domain = []
|
|
||||||
for email in emails:
|
|
||||||
partner_match_domain.append(('email_from', '=ilike', email))
|
|
||||||
if partner_id:
|
|
||||||
partner_match_domain.append(('partner_id', '=', partner_id))
|
|
||||||
partner_match_domain = ['|'] * (len(partner_match_domain) - 1) + partner_match_domain
|
|
||||||
if not partner_match_domain:
|
|
||||||
return []
|
|
||||||
domain = partner_match_domain
|
|
||||||
if not include_lost:
|
|
||||||
domain += final_stage_domain
|
|
||||||
return lead_obj.search(cr, uid, domain)
|
|
||||||
|
|
||||||
def default_get(self, cr, uid, fields, context=None):
|
def default_get(self, cr, uid, fields, context=None):
|
||||||
"""
|
"""
|
||||||
|
@ -243,7 +228,6 @@ class crm_lead2opportunity_mass_convert(osv.osv_memory):
|
||||||
leads_with_duplicates.append(lead.id)
|
leads_with_duplicates.append(lead.id)
|
||||||
return {'value': {'opportunity_ids': leads_with_duplicates}}
|
return {'value': {'opportunity_ids': leads_with_duplicates}}
|
||||||
|
|
||||||
|
|
||||||
def _convert_opportunity(self, cr, uid, ids, vals, context=None):
|
def _convert_opportunity(self, cr, uid, ids, vals, context=None):
|
||||||
"""
|
"""
|
||||||
When "massively" (more than one at a time) converting leads to
|
When "massively" (more than one at a time) converting leads to
|
||||||
|
|
Loading…
Reference in New Issue