[REF] crm: removed references to base_stage in crm_lead / crm_claim + various pre-cleaning before removing state.
bzr revid: tde@openerp.com-20130708103011-53t1fllmrz0hdq8u
This commit is contained in:
parent
67446c03c8
commit
0aac1c7cb0
|
@ -19,7 +19,6 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from openerp.addons.base_status.base_stage import base_stage
|
|
||||||
import crm
|
import crm
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
@ -68,7 +67,7 @@ CRM_LEAD_PENDING_STATES = (
|
||||||
crm.AVAILABLE_STATES[4][0], # Pending
|
crm.AVAILABLE_STATES[4][0], # Pending
|
||||||
)
|
)
|
||||||
|
|
||||||
class crm_lead(base_stage, format_address, osv.osv):
|
class crm_lead(format_address, osv.osv):
|
||||||
""" CRM Lead Case """
|
""" CRM Lead Case """
|
||||||
_name = "crm.lead"
|
_name = "crm.lead"
|
||||||
_description = "Lead/Opportunity"
|
_description = "Lead/Opportunity"
|
||||||
|
@ -93,18 +92,6 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
context['empty_list_help_document_name'] = _("leads")
|
context['empty_list_help_document_name'] = _("leads")
|
||||||
return super(crm_lead, self).get_empty_list_help(cr, uid, help, context=context)
|
return super(crm_lead, self).get_empty_list_help(cr, uid, help, context=context)
|
||||||
|
|
||||||
def create(self, cr, uid, vals, context=None):
|
|
||||||
if context is None:
|
|
||||||
context = {}
|
|
||||||
if vals.get('type') and not context.get('default_type'):
|
|
||||||
context['default_type'] = vals.get('type')
|
|
||||||
if vals.get('section_id') and not context.get('default_section_id'):
|
|
||||||
context['default_section_id'] = vals.get('section_id')
|
|
||||||
|
|
||||||
# context: no_log, because subtype already handle this
|
|
||||||
create_context = dict(context, mail_create_nolog=True)
|
|
||||||
return super(crm_lead, self).create(cr, uid, vals, context=create_context)
|
|
||||||
|
|
||||||
def _get_default_section_id(self, cr, uid, context=None):
|
def _get_default_section_id(self, cr, uid, context=None):
|
||||||
""" Gives default section by checking if present in the context """
|
""" Gives default section by checking if present in the context """
|
||||||
return self._resolve_section_id_from_context(cr, uid, context=context) or False
|
return self._resolve_section_id_from_context(cr, uid, context=context) or False
|
||||||
|
@ -124,8 +111,7 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
if type(context.get('default_section_id')) in (int, long):
|
if type(context.get('default_section_id')) in (int, long):
|
||||||
return context.get('default_section_id')
|
return context.get('default_section_id')
|
||||||
if isinstance(context.get('default_section_id'), basestring):
|
if isinstance(context.get('default_section_id'), basestring):
|
||||||
section_name = context['default_section_id']
|
section_ids = self.pool.get('crm.case.section').name_search(cr, uid, name=context['default_section_id'], context=context)
|
||||||
section_ids = self.pool.get('crm.case.section').name_search(cr, uid, name=section_name, context=context)
|
|
||||||
if len(section_ids) == 1:
|
if len(section_ids) == 1:
|
||||||
return int(section_ids[0][0])
|
return int(section_ids[0][0])
|
||||||
return None
|
return None
|
||||||
|
@ -324,8 +310,7 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'active': 1,
|
'active': 1,
|
||||||
'type': 'lead',
|
'type': 'lead',
|
||||||
'user_id': lambda s, cr, uid, c: s._get_default_user(cr, uid, c),
|
'user_id': lambda s, cr, uid, c: uid,
|
||||||
'email_from': lambda s, cr, uid, c: s._get_default_email(cr, uid, c),
|
|
||||||
'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c),
|
'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c),
|
||||||
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
|
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
|
||||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
|
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
|
||||||
|
@ -339,30 +324,29 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
|
|
||||||
def onchange_stage_id(self, cr, uid, ids, stage_id, context=None):
|
def onchange_stage_id(self, cr, uid, ids, stage_id, context=None):
|
||||||
if not stage_id:
|
if not stage_id:
|
||||||
return {'value':{}}
|
return {'value': {}}
|
||||||
stage = self.pool.get('crm.case.stage').browse(cr, uid, stage_id, context)
|
stage = self.pool.get('crm.case.stage').browse(cr, uid, stage_id, context)
|
||||||
if not stage.on_change:
|
if not stage.on_change:
|
||||||
return {'value':{}}
|
return {'value': {}}
|
||||||
return {'value':{'probability': stage.probability}}
|
return {'value': {'probability': stage.probability}}
|
||||||
|
|
||||||
def on_change_partner(self, cr, uid, ids, partner_id, context=None):
|
def on_change_partner_id(self, cr, uid, ids, partner_id, context=None):
|
||||||
result = {}
|
|
||||||
values = {}
|
values = {}
|
||||||
if partner_id:
|
if partner_id:
|
||||||
partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
|
partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
|
||||||
values = {
|
values = {
|
||||||
'partner_name' : partner.name,
|
'partner_name': partner.name,
|
||||||
'street' : partner.street,
|
'street': partner.street,
|
||||||
'street2' : partner.street2,
|
'street2': partner.street2,
|
||||||
'city' : partner.city,
|
'city': partner.city,
|
||||||
'state_id' : partner.state_id and partner.state_id.id or False,
|
'state_id': partner.state_id and partner.state_id.id or False,
|
||||||
'country_id' : partner.country_id and partner.country_id.id or False,
|
'country_id': partner.country_id and partner.country_id.id or False,
|
||||||
'email_from' : partner.email,
|
'email_from': partner.email,
|
||||||
'phone' : partner.phone,
|
'phone': partner.phone,
|
||||||
'mobile' : partner.mobile,
|
'mobile': partner.mobile,
|
||||||
'fax' : partner.fax,
|
'fax': partner.fax,
|
||||||
}
|
}
|
||||||
return {'value' : values}
|
return {'value': values}
|
||||||
|
|
||||||
def on_change_user(self, cr, uid, ids, user_id, context=None):
|
def on_change_user(self, cr, uid, ids, user_id, context=None):
|
||||||
""" When changing the user, also set a section_id or restrict section id
|
""" When changing the user, also set a section_id or restrict section id
|
||||||
|
@ -403,7 +387,7 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
# collect all section_ids
|
# collect all section_ids
|
||||||
section_ids = []
|
section_ids = []
|
||||||
types = ['both']
|
types = ['both']
|
||||||
if not cases :
|
if not cases:
|
||||||
type = context.get('default_type')
|
type = context.get('default_type')
|
||||||
types += [type]
|
types += [type]
|
||||||
if section_id:
|
if section_id:
|
||||||
|
@ -431,24 +415,18 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
return stage_ids[0]
|
return stage_ids[0]
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def case_cancel(self, cr, uid, ids, context=None):
|
def stage_set(self, cr, uid, ids, stage_id, context=None):
|
||||||
""" Overrides case_cancel from base_stage to set probability """
|
""" Set the new stage. Now just writes the stage.
|
||||||
res = super(crm_lead, self).case_cancel(cr, uid, ids, context=context)
|
TDE TODO: remove me when removing state
|
||||||
self.write(cr, uid, ids, {'probability' : 0.0}, context=context)
|
"""
|
||||||
return res
|
return self.write(cr, uid, ids, {'stage_id': stage_id}, context=context)
|
||||||
|
|
||||||
def case_reset(self, cr, uid, ids, context=None):
|
|
||||||
""" Overrides case_reset from base_stage to set probability """
|
|
||||||
res = super(crm_lead, self).case_reset(cr, uid, ids, context=context)
|
|
||||||
self.write(cr, uid, ids, {'probability': 0.0}, context=context)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def case_mark_lost(self, cr, uid, ids, context=None):
|
def case_mark_lost(self, cr, uid, ids, context=None):
|
||||||
""" Mark the case as lost: state=cancel and probability=0 """
|
""" Mark the case as lost: state=cancel and probability=0 """
|
||||||
for lead in self.browse(cr, uid, ids):
|
for lead in self.browse(cr, uid, ids):
|
||||||
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 0.0),('on_change','=',True)], context=context)
|
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 0.0),('on_change','=',True)], context=context)
|
||||||
if stage_id:
|
if stage_id:
|
||||||
self.case_set(cr, uid, [lead.id], values_to_update={'probability': 0.0}, new_stage_id=stage_id, context=context)
|
self.stage_set(cr, uid, [lead.id], stage_id, context=context)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def case_mark_won(self, cr, uid, ids, context=None):
|
def case_mark_won(self, cr, uid, ids, context=None):
|
||||||
|
@ -456,7 +434,21 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
for lead in self.browse(cr, uid, ids):
|
for lead in self.browse(cr, uid, ids):
|
||||||
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 100.0),('on_change','=',True)], context=context)
|
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, [('probability', '=', 100.0),('on_change','=',True)], context=context)
|
||||||
if stage_id:
|
if stage_id:
|
||||||
self.case_set(cr, uid, [lead.id], values_to_update={'probability': 100.0}, new_stage_id=stage_id, context=context)
|
self.stage_set(cr, uid, [lead.id], stage_id, context=context)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def case_escalate(self, cr, uid, ids, context=None):
|
||||||
|
""" Escalates case to parent level """
|
||||||
|
for case in self.browse(cr, uid, ids, context=context):
|
||||||
|
data = {'active': True}
|
||||||
|
if case.section_id.parent_id:
|
||||||
|
data['section_id'] = case.section_id.parent_id.id
|
||||||
|
if case.section_id.parent_id.change_responsible:
|
||||||
|
if case.section_id.parent_id.user_id:
|
||||||
|
data['user_id'] = case.section_id.parent_id.user_id.id
|
||||||
|
else:
|
||||||
|
raise osv.except_osv(_('Error!'), _("You are already at the top level of your sales-team category.\nTherefore you cannot escalate furthermore."))
|
||||||
|
self.write(cr, uid, [case.id], data, context=context)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def set_priority(self, cr, uid, ids, priority):
|
def set_priority(self, cr, uid, ids, priority):
|
||||||
|
@ -930,12 +922,22 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def create(self, cr, uid, vals, context=None):
|
||||||
|
if context is None:
|
||||||
|
context = {}
|
||||||
|
if vals.get('type') and not context.get('default_type'):
|
||||||
|
context['default_type'] = vals.get('type')
|
||||||
|
if vals.get('section_id') and not context.get('default_section_id'):
|
||||||
|
context['default_section_id'] = vals.get('section_id')
|
||||||
|
|
||||||
|
# context: no_log, because subtype already handle this
|
||||||
|
create_context = dict(context, mail_create_nolog=True)
|
||||||
|
return super(crm_lead, self).create(cr, uid, vals, context=create_context)
|
||||||
|
|
||||||
def write(self, cr, uid, ids, vals, context=None):
|
def write(self, cr, uid, ids, vals, context=None):
|
||||||
if vals.get('stage_id') and not vals.get('probability'):
|
if vals.get('stage_id') and not vals.get('probability'):
|
||||||
# change probability of lead(s) if required by stage
|
onchange_stage_values = self.onchange_stage_id(cr, uid, ids, vals.get('stage_id'), context=context)['value']
|
||||||
stage = self.pool.get('crm.case.stage').browse(cr, uid, vals['stage_id'], context=context)
|
vals.update(onchange_stage_values)
|
||||||
if stage.on_change:
|
|
||||||
vals['probability'] = stage.probability
|
|
||||||
return super(crm_lead, self).write(cr, uid, ids, vals, context=context)
|
return super(crm_lead, self).write(cr, uid, ids, vals, context=context)
|
||||||
|
|
||||||
def new_mail_send(self, cr, uid, ids, context=None):
|
def new_mail_send(self, cr, uid, ids, context=None):
|
||||||
|
@ -1022,7 +1024,7 @@ class crm_lead(base_stage, format_address, osv.osv):
|
||||||
'user_id': False,
|
'user_id': False,
|
||||||
}
|
}
|
||||||
if msg.get('author_id'):
|
if msg.get('author_id'):
|
||||||
defaults.update(self.on_change_partner(cr, uid, None, msg.get('author_id'), context=context)['value'])
|
defaults.update(self.on_change_partner_id(cr, uid, None, msg.get('author_id'), context=context)['value'])
|
||||||
if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES):
|
if msg.get('priority') in dict(crm.AVAILABLE_PRIORITIES):
|
||||||
defaults['priority'] = msg.get('priority')
|
defaults['priority'] = msg.get('priority')
|
||||||
defaults.update(custom_values)
|
defaults.update(custom_values)
|
||||||
|
|
|
@ -263,13 +263,6 @@ Andrew</field>
|
||||||
<field eval="1" name="active"/>
|
<field eval="1" name="active"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Call Function to Cancel the leads (set as Dead) -->
|
|
||||||
<function model="crm.lead" name="case_cancel"
|
|
||||||
eval="[ ref('crm_case_12'), ref('crm_case_7'),
|
|
||||||
ref('crm_case_3'), ref('crm_case_8')],
|
|
||||||
{'install_mode': True}"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- Call Function to set the leads as Unread -->
|
<!-- Call Function to set the leads as Unread -->
|
||||||
<function model="crm.lead" name="message_mark_as_unread"
|
<function model="crm.lead" name="message_mark_as_unread"
|
||||||
eval="[ ref('crm_case_1'), ref('crm_case_2'),
|
eval="[ ref('crm_case_1'), ref('crm_case_2'),
|
||||||
|
|
|
@ -95,10 +95,6 @@
|
||||||
<header>
|
<header>
|
||||||
<button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action"
|
<button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action"
|
||||||
states="draft,open,pending" help="Convert to Opportunity" class="oe_highlight"/>
|
states="draft,open,pending" help="Convert to Opportunity" class="oe_highlight"/>
|
||||||
<button name="case_reset" string="Reset" type="object"
|
|
||||||
states="cancel"/>
|
|
||||||
<button name="case_cancel" string="Cancel Case" type="object"
|
|
||||||
states="draft,open,pending"/>
|
|
||||||
<field name="stage_id" widget="statusbar" clickable="True"
|
<field name="stage_id" widget="statusbar" clickable="True"
|
||||||
domain="['&', '|', ('case_default', '=', True), ('section_ids', '=', section_id), '|', ('type', '=', type), ('type', '=', 'both')]"
|
domain="['&', '|', ('case_default', '=', True), ('section_ids', '=', section_id), '|', ('type', '=', type), ('type', '=', 'both')]"
|
||||||
on_change="onchange_stage_id(stage_id)"/>
|
on_change="onchange_stage_id(stage_id)"/>
|
||||||
|
@ -118,7 +114,7 @@
|
||||||
<field name="partner_name" string="Company Name"/>
|
<field name="partner_name" string="Company Name"/>
|
||||||
<!-- Preload all the partner's information -->
|
<!-- Preload all the partner's information -->
|
||||||
<field name="partner_id" string="Customer"
|
<field name="partner_id" string="Customer"
|
||||||
on_change="on_change_partner(partner_id)"
|
on_change="on_change_partner_id(partner_id)"
|
||||||
options='{"create_name_field": "name"}'
|
options='{"create_name_field": "name"}'
|
||||||
context="{'default_name': contact_name, 'default_street': street, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_function': function, 'default_phone': phone, 'default_mobile': mobile, 'default_fax': fax, 'default_email': email_from, 'default_user_id': user_id, 'default_section_id': section_id}"/>
|
context="{'default_name': contact_name, 'default_street': street, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_function': function, 'default_phone': phone, 'default_mobile': mobile, 'default_fax': fax, 'default_email': email_from, 'default_user_id': user_id, 'default_section_id': section_id}"/>
|
||||||
<label for="street" string="Address"/>
|
<label for="street" string="Address"/>
|
||||||
|
@ -617,7 +613,7 @@
|
||||||
<field name="state">code</field>
|
<field name="state">code</field>
|
||||||
<field name="code">
|
<field name="code">
|
||||||
if context.get('active_model') == 'crm.lead' and context.get('active_ids'):
|
if context.get('active_model') == 'crm.lead' and context.get('active_ids'):
|
||||||
self.case_cancel(cr, uid, context['active_ids'], context=context)
|
self.case_mark_lost(cr, uid, context['active_ids'], context=context)
|
||||||
</field>
|
</field>
|
||||||
<field name="groups_id" eval="[(4,ref('base.group_sale_salesman'))]"/>
|
<field name="groups_id" eval="[(4,ref('base.group_sale_salesman'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
|
@ -4,37 +4,6 @@
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
section_id = self.pool.get('crm.case.section').create(cr, uid, {'name': "Phone Marketing", 'parent_id': ref("crm.crm_case_section_2")})
|
section_id = self.pool.get('crm.case.section').create(cr, uid, {'name': "Phone Marketing", 'parent_id': ref("crm.crm_case_section_2")})
|
||||||
self.write(cr, uid, [ref("crm_case_1")], {'section_id': section_id})
|
self.write(cr, uid, [ref("crm_case_1")], {'section_id': section_id})
|
||||||
self.case_cancel(cr, uid, [ref("crm_case_1")])
|
|
||||||
-
|
|
||||||
I check cancelled lead.
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
lead = self.browse(cr, uid, ref('crm_case_1'))
|
|
||||||
assert lead.stage_id.id == ref('crm.stage_lead7'), "Stage should be 'Dead' and is %s." % (lead.stage_id.name)
|
|
||||||
assert lead.state == 'cancel', "Opportunity is not in 'cancel' state."
|
|
||||||
assert lead.probability == 0.0, 'Opportunity is probably wrong and should be 0.0.'
|
|
||||||
-
|
|
||||||
I reset cancelled lead into unqualified lead.
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
self.case_reset(cr, uid, [ref("crm_case_1")])
|
|
||||||
-
|
|
||||||
I check unqualified lead after reset.
|
|
||||||
-
|
|
||||||
!assert {model: crm.lead, id: crm.crm_case_1, string: Lead is in draft state}:
|
|
||||||
- state == "draft"
|
|
||||||
-
|
|
||||||
I re-open the lead
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
self.case_open(cr, uid, [ref("crm_case_1")])
|
|
||||||
-
|
|
||||||
I check stage and state of the re-opened lead
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
lead = self.browse(cr, uid, ref('crm.crm_case_1'))
|
|
||||||
assert lead.stage_id.id == ref('crm.stage_lead2'), "Opportunity stage should be 'Qualification'."
|
|
||||||
assert lead.state == 'open', "Opportunity should be in 'open' state."
|
|
||||||
-
|
-
|
||||||
I escalate the lead to parent team.
|
I escalate the lead to parent team.
|
||||||
-
|
-
|
||||||
|
|
|
@ -20,9 +20,4 @@
|
||||||
-
|
-
|
||||||
!record {model: crm.phonecall, id: crm_phonecall_5}:
|
!record {model: crm.phonecall, id: crm_phonecall_5}:
|
||||||
name: 'Bad time'
|
name: 'Bad time'
|
||||||
partner_id: base.res_partner_5
|
partner_id: base.res_partner_5
|
||||||
-
|
|
||||||
I set the next stage to "New" for the lead.
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
self.stage_next(cr, uid, [ref("crm_case_4")], context={'stage_type': 'lead'})
|
|
|
@ -1,25 +1,15 @@
|
||||||
-
|
-
|
||||||
In order to test the conversion of a lead into a opportunity,
|
In order to test the conversion of a lead into a opportunity,
|
||||||
-
|
|
||||||
I open a lead.
|
|
||||||
-
|
|
||||||
!python {model: crm.lead}: |
|
|
||||||
self.case_open(cr, uid, [ref("crm_case_4")])
|
|
||||||
-
|
|
||||||
I check if the lead state is "Open".
|
|
||||||
-
|
|
||||||
!assert {model: crm.lead, id: crm.crm_case_4, string: Lead state is Open}:
|
|
||||||
- state == "open"
|
|
||||||
-
|
-
|
||||||
I convert lead into opportunity for exiting customer.
|
I convert lead into opportunity for exiting customer.
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
self.convert_opportunity(cr, uid ,[ref("crm_case_4")], ref("base.res_partner_2"))
|
self.convert_opportunity(cr, uid ,[ref("crm_case_1")], ref("base.res_partner_2"))
|
||||||
-
|
-
|
||||||
I check details of converted opportunity.
|
I check details of converted opportunity.
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
lead = self.browse(cr, uid, ref('crm_case_4'))
|
lead = self.browse(cr, uid, ref('crm_case_1'))
|
||||||
assert lead.type == 'opportunity', 'Lead is not converted to opportunity!'
|
assert lead.type == 'opportunity', 'Lead is not converted to opportunity!'
|
||||||
assert lead.partner_id.id == ref("base.res_partner_2"), 'Partner mismatch!'
|
assert lead.partner_id.id == ref("base.res_partner_2"), 'Partner mismatch!'
|
||||||
assert lead.stage_id.id == ref("stage_lead1"), 'Stage of opportunity is incorrect!'
|
assert lead.stage_id.id == ref("stage_lead1"), 'Stage of opportunity is incorrect!'
|
||||||
|
@ -28,7 +18,7 @@
|
||||||
-
|
-
|
||||||
!python {model: crm.opportunity2phonecall}: |
|
!python {model: crm.opportunity2phonecall}: |
|
||||||
import time
|
import time
|
||||||
context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_4')]})
|
context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_1')]})
|
||||||
call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||||
'name': "Bonjour M. Jean, Comment allez-vous? J'ai bien reçu votre demande, pourrions-nous en parler quelques minutes?"}, context=context)
|
'name': "Bonjour M. Jean, Comment allez-vous? J'ai bien reçu votre demande, pourrions-nous en parler quelques minutes?"}, context=context)
|
||||||
self.action_schedule(cr, uid, [call_id], context=context)
|
self.action_schedule(cr, uid, [call_id], context=context)
|
||||||
|
@ -36,28 +26,28 @@
|
||||||
I check that phonecall is scheduled for that opportunity.
|
I check that phonecall is scheduled for that opportunity.
|
||||||
-
|
-
|
||||||
!python {model: crm.phonecall}: |
|
!python {model: crm.phonecall}: |
|
||||||
ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_4'))])
|
ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_1'))])
|
||||||
assert len(ids), 'Phonecall is not scheduled'
|
assert len(ids), 'Phonecall is not scheduled'
|
||||||
-
|
-
|
||||||
Now I schedule meeting with customer.
|
Now I schedule meeting with customer.
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
self.action_makeMeeting(cr, uid, [ref('crm_case_4')])
|
self.action_makeMeeting(cr, uid, [ref('crm_case_1')])
|
||||||
-
|
-
|
||||||
After communicated with customer, I put some notes with contract details.
|
After communicated with customer, I put some notes with contract details.
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
self.message_post(cr, uid, [ref('crm_case_4')], subject='Test note', body='Détails envoyés par le client sur le FAX pour la qualité')
|
self.message_post(cr, uid, [ref('crm_case_1')], subject='Test note', body='Détails envoyés par le client sur le FAX pour la qualité')
|
||||||
-
|
-
|
||||||
I win this opportunity
|
I win this opportunity
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
self.case_mark_won(cr, uid, [ref("crm_case_4")])
|
self.case_mark_won(cr, uid, [ref("crm_case_1")])
|
||||||
-
|
-
|
||||||
I check details of the opportunity after having won the opportunity.
|
I check details of the opportunity after having won the opportunity.
|
||||||
-
|
-
|
||||||
!python {model: crm.lead}: |
|
!python {model: crm.lead}: |
|
||||||
lead = self.browse(cr, uid, ref('crm_case_4'))
|
lead = self.browse(cr, uid, ref('crm_case_1'))
|
||||||
assert lead.stage_id.id == ref('crm.stage_lead6'), "Opportunity stage should be 'Won'."
|
assert lead.stage_id.id == ref('crm.stage_lead6'), "Opportunity stage should be 'Won'."
|
||||||
assert lead.state == 'done', "Opportunity is not in 'done' state!"
|
assert lead.state == 'done', "Opportunity is not in 'done' state!"
|
||||||
assert lead.probability == 100.0, "Revenue probability should be 100.0!"
|
assert lead.probability == 100.0, "Revenue probability should be 100.0!"
|
||||||
|
@ -104,7 +94,6 @@
|
||||||
-
|
-
|
||||||
!python {model: crm.meeting}: |
|
!python {model: crm.meeting}: |
|
||||||
context.update({'active_model': 'crm.meeting'})
|
context.update({'active_model': 'crm.meeting'})
|
||||||
self.case_open(cr, uid, [ref('base_calendar.crm_meeting_4')])
|
|
||||||
-
|
-
|
||||||
I invite a user for meeting.
|
I invite a user for meeting.
|
||||||
-
|
-
|
||||||
|
|
|
@ -19,20 +19,12 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from openerp.addons.base_status.base_stage import base_stage
|
|
||||||
import binascii
|
|
||||||
from openerp.addons.crm import crm
|
from openerp.addons.crm import crm
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
import time
|
|
||||||
from openerp import tools
|
from openerp import tools
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp.tools import html2plaintext
|
from openerp.tools import html2plaintext
|
||||||
|
|
||||||
CRM_CLAIM_PENDING_STATES = (
|
|
||||||
crm.AVAILABLE_STATES[2][0], # Cancelled
|
|
||||||
crm.AVAILABLE_STATES[3][0], # Done
|
|
||||||
crm.AVAILABLE_STATES[4][0], # Pending
|
|
||||||
)
|
|
||||||
|
|
||||||
class crm_claim_stage(osv.osv):
|
class crm_claim_stage(osv.osv):
|
||||||
""" Model for claim stages. This models the main stages of a claim
|
""" Model for claim stages. This models the main stages of a claim
|
||||||
|
@ -51,8 +43,6 @@ class crm_claim_stage(osv.osv):
|
||||||
'section_ids':fields.many2many('crm.case.section', 'section_claim_stage_rel', 'stage_id', 'section_id', string='Sections',
|
'section_ids':fields.many2many('crm.case.section', 'section_claim_stage_rel', 'stage_id', 'section_id', string='Sections',
|
||||||
help="Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams."),
|
help="Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams."),
|
||||||
'state': fields.selection(crm.AVAILABLE_STATES, 'Status', required=True, help="The related status for the stage. The status of your document will automatically change regarding the selected stage. For example, if a stage is related to the status 'Close', when your document reaches this stage, it will be automatically have the 'closed' status."),
|
'state': fields.selection(crm.AVAILABLE_STATES, 'Status', required=True, help="The related status for the stage. The status of your document will automatically change regarding the selected stage. For example, if a stage is related to the status 'Close', when your document reaches this stage, it will be automatically have the 'closed' status."),
|
||||||
'case_refused': fields.boolean('Refused stage',
|
|
||||||
help='Refused stages are specific stages for done.'),
|
|
||||||
'case_default': fields.boolean('Common to All Teams',
|
'case_default': fields.boolean('Common to All Teams',
|
||||||
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
|
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
|
||||||
'fold': fields.boolean('Hide in Views when Empty',
|
'fold': fields.boolean('Hide in Views when Empty',
|
||||||
|
@ -63,10 +53,9 @@ class crm_claim_stage(osv.osv):
|
||||||
'sequence': lambda *args: 1,
|
'sequence': lambda *args: 1,
|
||||||
'state': 'draft',
|
'state': 'draft',
|
||||||
'fold': False,
|
'fold': False,
|
||||||
'case_refused': False,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class crm_claim(base_stage, osv.osv):
|
class crm_claim(osv.osv):
|
||||||
""" Crm claim
|
""" Crm claim
|
||||||
"""
|
"""
|
||||||
_name = "crm.claim"
|
_name = "crm.claim"
|
||||||
|
@ -74,6 +63,15 @@ class crm_claim(base_stage, osv.osv):
|
||||||
_order = "priority,date desc"
|
_order = "priority,date desc"
|
||||||
_inherit = ['mail.thread']
|
_inherit = ['mail.thread']
|
||||||
|
|
||||||
|
def _get_default_section_id(self, cr, uid, context=None):
|
||||||
|
""" Gives default section by checking if present in the context """
|
||||||
|
return self.pool.get('crm.lead')._resolve_section_id_from_context(cr, uid, context=context) or False
|
||||||
|
|
||||||
|
def _get_default_stage_id(self, cr, uid, context=None):
|
||||||
|
""" Gives default stage_id """
|
||||||
|
section_id = self._get_default_section_id(cr, uid, context=context)
|
||||||
|
return self.stage_find(cr, uid, [], section_id, [('state', '=', 'draft')], context=context)
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'id': fields.integer('ID', readonly=True),
|
'id': fields.integer('ID', readonly=True),
|
||||||
'name': fields.char('Claim Subject', size=128, required=True),
|
'name': fields.char('Claim Subject', size=128, required=True),
|
||||||
|
@ -117,15 +115,13 @@ class crm_claim(base_stage, osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'user_id': lambda s, cr, uid, c: s._get_default_user(cr, uid, c),
|
'user_id': lambda s, cr, uid, c: uid,
|
||||||
'partner_id': lambda s, cr, uid, c: s._get_default_partner(cr, uid, c),
|
|
||||||
'email_from': lambda s, cr, uid, c: s._get_default_email(cr, uid, c),
|
|
||||||
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
|
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
|
||||||
'date': fields.datetime.now,
|
'date': fields.datetime.now(),
|
||||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
|
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
|
||||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||||
'active': lambda *a: 1,
|
'active': lambda *a: 1,
|
||||||
'stage_id':lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c)
|
'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
def stage_find(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None):
|
def stage_find(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None):
|
||||||
|
@ -158,27 +154,24 @@ class crm_claim(base_stage, osv.osv):
|
||||||
return stage_ids[0]
|
return stage_ids[0]
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def case_refuse(self, cr, uid, ids, context=None):
|
def onchange_partner_id(self, cr, uid, ids, partner_id, email=False, context=None):
|
||||||
""" Mark the case as refused: state=done and case_refused=True """
|
|
||||||
for lead in self.browse(cr, uid, ids):
|
|
||||||
stage_id = self.stage_find(cr, uid, [lead], lead.section_id.id or False, ['&', ('state', '=', 'done'), ('case_refused', '=', True)], context=context)
|
|
||||||
if stage_id:
|
|
||||||
self.case_set(cr, uid, [lead.id], values_to_update={}, new_stage_id=stage_id, context=context)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def onchange_partner_id(self, cr, uid, ids, part, email=False):
|
|
||||||
"""This function returns value of partner address based on partner
|
"""This function returns value of partner address based on partner
|
||||||
:param part: Partner's id
|
|
||||||
:param email: ignored
|
:param email: ignored
|
||||||
"""
|
"""
|
||||||
if not part:
|
if not partner_id:
|
||||||
return {'value': {'email_from': False,
|
return {'value': {'email_from': False, 'partner_phone': False}}
|
||||||
'partner_phone': False
|
address = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
|
||||||
}
|
|
||||||
}
|
|
||||||
address = self.pool.get('res.partner').browse(cr, uid, part)
|
|
||||||
return {'value': {'email_from': address.email, 'partner_phone': address.phone}}
|
return {'value': {'email_from': address.email, 'partner_phone': address.phone}}
|
||||||
|
|
||||||
|
def create(self, cr, uid, vals, context=None):
|
||||||
|
if context is None:
|
||||||
|
context = {}
|
||||||
|
if vals.get('section_id') and not context.get('default_section_id'):
|
||||||
|
context['default_section_id'] = vals.get('section_id')
|
||||||
|
|
||||||
|
# context: no_log, because subtype already handle this
|
||||||
|
return super(crm_claim, self).create(cr, uid, vals, context=context)
|
||||||
|
|
||||||
# -------------------------------------------------------
|
# -------------------------------------------------------
|
||||||
# Mail gateway
|
# Mail gateway
|
||||||
# -------------------------------------------------------
|
# -------------------------------------------------------
|
||||||
|
|
|
@ -52,7 +52,6 @@
|
||||||
<field name="case_default"/>
|
<field name="case_default"/>
|
||||||
<field name="sequence"/>
|
<field name="sequence"/>
|
||||||
<field name="state"/>
|
<field name="state"/>
|
||||||
<field name="case_refused"/>
|
|
||||||
<field name="fold"/>
|
<field name="fold"/>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
|
@ -102,10 +101,6 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Claim" version="7.0">
|
<form string="Claim" version="7.0">
|
||||||
<header>
|
<header>
|
||||||
<button name="case_close" string="Settle" type="object" class="oe_highlight"
|
|
||||||
states="draft,open,pending" groups="base.group_user"/>
|
|
||||||
<button name="case_cancel" string="Reject" type="object" groups="base.group_user"
|
|
||||||
states="draft,open,pending"/>
|
|
||||||
<field name="stage_id" widget="statusbar" clickable="True"/>
|
<field name="stage_id" widget="statusbar" clickable="True"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet string="Claims">
|
<sheet string="Claims">
|
||||||
|
|
|
@ -21,25 +21,9 @@
|
||||||
-
|
-
|
||||||
!python {model: crm.claim}: |
|
!python {model: crm.claim}: |
|
||||||
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
||||||
self.case_open(cr, uid, claim_ids)
|
|
||||||
-
|
-
|
||||||
I check Claim Details after open.
|
I check Claim Details after open.
|
||||||
-
|
-
|
||||||
!python {model: crm.claim}: |
|
!python {model: crm.claim}: |
|
||||||
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
||||||
claim = self.browse(cr, uid, claim_ids[0])
|
claim = self.browse(cr, uid, claim_ids[0])
|
||||||
assert claim.state == "open", "Claim is not in Open state"
|
|
||||||
assert claim.stage_id.id == ref("crm.stage_lead2"), "Claim is not in Qualification stage"
|
|
||||||
-
|
|
||||||
After complete all service from our side, I close this claim.
|
|
||||||
-
|
|
||||||
!python {model: crm.claim}: |
|
|
||||||
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
|
||||||
self.case_close(cr, uid, claim_ids)
|
|
||||||
-
|
|
||||||
I check Claim details after closed.
|
|
||||||
-
|
|
||||||
!python {model: crm.claim}: |
|
|
||||||
claim_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
|
|
||||||
claim = self.browse(cr, uid, claim_ids[0])
|
|
||||||
assert claim.state == "done", "Claim is not in close state"
|
|
||||||
|
|
|
@ -20,20 +20,14 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from openerp.addons.base_status.base_state import base_state
|
from openerp.addons.base_status.base_state import base_state
|
||||||
from openerp.addons.base_status.base_stage import base_stage
|
|
||||||
from openerp.addons.crm import crm
|
from openerp.addons.crm import crm
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp import tools
|
from openerp import tools
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp.tools import html2plaintext
|
from openerp.tools import html2plaintext
|
||||||
|
|
||||||
CRM_HELPDESK_STATES = (
|
|
||||||
crm.AVAILABLE_STATES[2][0], # Cancelled
|
|
||||||
crm.AVAILABLE_STATES[3][0], # Done
|
|
||||||
crm.AVAILABLE_STATES[4][0], # Pending
|
|
||||||
)
|
|
||||||
|
|
||||||
class crm_helpdesk(base_state, base_stage, osv.osv):
|
class crm_helpdesk(base_state, osv.osv):
|
||||||
""" Helpdesk Cases """
|
""" Helpdesk Cases """
|
||||||
|
|
||||||
_name = "crm.helpdesk"
|
_name = "crm.helpdesk"
|
||||||
|
@ -80,9 +74,7 @@ class crm_helpdesk(base_state, base_stage, osv.osv):
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'active': lambda *a: 1,
|
'active': lambda *a: 1,
|
||||||
'user_id': lambda s, cr, uid, c: s._get_default_user(cr, uid, c),
|
'user_id': lambda s, cr, uid, c: uid,
|
||||||
'partner_id': lambda s, cr, uid, c: s._get_default_partner(cr, uid, c),
|
|
||||||
'email_from': lambda s, cr, uid, c: s._get_default_email(cr, uid, c),
|
|
||||||
'state': lambda *a: 'draft',
|
'state': lambda *a: 'draft',
|
||||||
'date': lambda *a: fields.datetime.now(),
|
'date': lambda *a: fields.datetime.now(),
|
||||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
|
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
|
||||||
|
|
Loading…
Reference in New Issue