diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 292169404a3..fdcd7a1a52a 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -258,7 +258,26 @@ class crm_base(object): data.update(self.onchange_partner_address_id(cr, uid, ids, addr['contact'])['value']) return {'value': data} + def _case_opportunity_meeting_notification(self, cr, uid, ids, context=None): + return True + def _case_open_notification(self, case, context=None): + return True + + def _case_close_notification(self, case, context=None): + return True + + def _case_cancel_notification(self, case, context=None): + return True + + def _case_pending_notification(self, case, context=None): + return True + + def _case_escalate_notification(self, case, context=None): + return True + + def _case_phonecall_notification(self, case, action, context=None): + return True def case_open(self, cr, uid, ids, context=None): """Opens Case @@ -269,7 +288,7 @@ class crm_base(object): data = {'state': 'open', 'active': True} if not case.user_id: data['user_id'] = uid - self.write(cr, uid, case.id, data) + self.write(cr, uid, [case.id], data) self._case_open_notification(case, context=context) self._action(cr, uid, cases, 'open') @@ -283,6 +302,7 @@ class crm_base(object): cases[0].state # to fill the browse record cache self.write(cr, uid, ids, {'state': 'done', 'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), }) # We use the cache of cases to keep the old case state + self._case_close_notification(cases, context=context) self._action(cr, uid, cases, 'done') return True @@ -294,6 +314,7 @@ class crm_base(object): cases[0].state # to fill the browse record cache self.write(cr, uid, ids, {'state': 'cancel', 'active': True}) # We use the cache of cases to keep the old case state + self._case_cancel_notification(cases, context=context) self._action(cr, uid, cases, 'cancel') return True @@ -304,6 +325,7 @@ class crm_base(object): cases = self.browse(cr, uid, ids) cases[0].state # to fill the browse record cache self.write(cr, uid, ids, {'state': 'pending', 'active': True}) + self._case_pending_notification(cases, context=context) self._action(cr, uid, cases, 'pending') return True @@ -392,21 +414,6 @@ class crm_case(crm_base): default.update({ 'date_open': False }) return super(crm_case, self).copy(cr, uid, id, default, context=context) - def _case_open_notification(self, case, context=None): - return True - - def _case_close_notification(self, case, context=None): - return True - - def _case_cancel_notification(self, case, context=None): - return True - - def _case_pending_notification(self, case, context=None): - return True - - def _case_escalate_notification(self, case, context=None): - return True - def case_open(self, cr, uid, ids, context=None): """Opens Case""" cases = self.browse(cr, uid, ids) @@ -414,7 +421,7 @@ class crm_case(crm_base): data = {'state': 'open', 'active': True } if not case.user_id: data['user_id'] = uid - self.write(cr, uid, case.id, data) + self.write(cr, uid, [case.id], data) self._case_open_notification(case, context=context) self._action(cr, uid, cases, 'open') return True diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 4a3ae69fba7..18f746880ca 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -189,9 +189,9 @@ class crm_lead(crm_case, osv.osv): \nIf the case is in progress the state is set to \'Open\'.\ \nWhen the case is over, the state is set to \'Done\'.\ \nIf the case needs to be reviewed then the state is set to \'Pending\'.'), + 'message_ids': fields.one2many('mail.message', 'res_id', 'Messages', domain=[('model','=',_name)]), 'subjects': fields.function(_get_email_subject, fnct_search=_history_search, string='Subject of Email', type='char', size=64), - # Only used for type opportunity 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', domain="[('partner_id','=',partner_id)]"), 'probability': fields.float('Probability (%)',group_operator="avg"), @@ -224,6 +224,12 @@ class crm_lead(crm_case, osv.osv): 'color': 0, } + def create(self, cr, uid, vals, context=None): + obj_id = super(crm_lead, self).create(cr, uid, vals, context) + self._case_create_notification(cr, uid, [obj_id], context=context) + return obj_id + + def onchange_partner_address_id(self, cr, uid, ids, add, email=False): """This function returns value of partner email based on Partner Address """ @@ -265,44 +271,78 @@ class crm_lead(crm_case, osv.osv): def stage_find_won(self, cr, uid, section_id): return self.stage_find_percent(cr, uid, 100.0, section_id) + def _case_create_notification(self, cr, uid, ids, context=None): + for obj in self.browse(cr, uid, ids, context=context): + self.message_subscribe(cr, uid, ids, [obj.user_id.id], context=context) + if obj.type=="opportunity" and obj.state=="draft": + message = _("Opportunity is created.") + elif obj.type=="lead" : + message = _("Lead is created.") + else: + message = _("The case has been created.") + self.message_append_note(cr, uid, ids, _('System notification'), + message, type='notification', need_action_user_id=obj.user_id.id, context=context) + return True + def _case_open_notification(self, lead, context=None): - if lead.state != 'draft': + if lead.state != 'draft' and lead.state != 'pending': return False if lead.type == 'lead': - message = _("The lead %s has been opened and its state is now in progress. Salesman %s can now set this lead as pending, close it to mark it as done, or cancel it. If there is an opportunity to create from this lead, click on Convert to Opportunity.") % (lead.name, lead.user_id.name) + message = _("The lead has been opened.") elif lead.type == 'opportunity': - message = _("The opportunity %s has been opened.") % lead.name + message = _("The opportunity has been opened.") else: - message = _("The case %s has been opened.") % lead.name + message = _("The case has been opened.") lead.message_append_note('' ,message, need_action_user_id=lead.user_id.id) def _case_close_notification(self, lead, context=None): + lead[0].message_mark_done(context) if lead[0].type == 'lead': - message = _("The lead %s has been closed.") % lead[0].name + message = _("The lead has been closed.") + elif lead[0].type == 'opportunity': + message = _("The opportunity has been closed.") else: - message = _("The case %s has been closed.") % lead[0].name - - lead[0].message_append_note('' ,message, need_action_user_id=lead[0].user_id.id) + message = _("The case has been closed.") + lead[0].message_append_note('' ,message) def _case_mark_lost_notification(self, lead, context=None): - message = _("The opportunity %s has been marked as lost.") % lead.name - lead.message_append_note('' ,message, need_action_user_id=lead.user_id.id) + lead.message_mark_done(context) + message = _("The opportunity has been marked as lost.") + lead.message_append_note('' ,message) def _case_mark_won_notification(self, lead, context=None): - message = _("The opportunity %s has been been won.") % lead.name - lead.message_append_note('' ,message, need_action_user_id=lead.user_id.id) + lead.message_mark_done(context) + message = _("The opportunity has been won.") + lead.message_append_note('' ,message) def _case_cancel_notification(self, lead, context=None): - message = _("The lead %s has been cancelled.") % (lead[0].name) - lead[0].message_append_note('' ,message, need_action_user_id=lead[0].user_id.id) + lead[0].message_mark_done(context) + if lead[0].type == 'lead': + message = _("The lead has been cancelled.") + elif lead[0].type == 'opportunity': + message = _("The opportunity has been cancelled.") + lead[0].message_append_note('' ,message) def _case_pending_notification(self, case, context=None): - message = _("The lead %s is pending.") % (case[0].name,) - case[0].message_append_note('' ,message, need_action_user_id=case[0].user_id.id) + if case[0].type == 'lead': + message = _("The lead is pending.") + elif case[0].type == 'opportunity': + message = _("The opportunity is pending.") + case[0].message_append_note('' ,message) def _case_escalate_notification(self, case, context=None): - message = _("The lead %s is pending.") % (case.name,) - case.message_append_note('' ,message, need_action_user_id=case.user_id.id) + message = _("The lead is escalated.") + case.message_append_note('' ,message) + + def _case_phonecall_notification(self, cr, uid, ids, case, phonecall, action, context=None): + for obj in phonecall.browse(cr, uid, ids, context=context): + if action == "schedule" : + message = _("%s a call for the %s.") % (action, obj.date) + else : + message = _("%s a call.") % (action) + case.message_append_note('', message) + if action == "schedule" : + phonecall.message_append_note(cr, uid, ids, '', message, need_action_user_id=obj.user_id.id) def case_open(self, cr, uid, ids, context=None): res = super(crm_lead, self).case_open(cr, uid, ids, context) @@ -343,7 +383,6 @@ class crm_lead(crm_case, osv.osv): stage_id = self.stage_find_lost(cr, uid, lead.section_id.id or False) if stage_id: self.stage_set(cr, uid, [lead.id], stage_id) - self._case_mark_lost_notification(lead, context=context) return res def case_mark_won(self, cr, uid, ids, context=None): @@ -461,7 +500,7 @@ class crm_lead(crm_case, osv.osv): subject = subject[0] + ", ".join(subject[1:]) details = "\n\n".join(details) - return self.message_append(cr, uid, [opportunity_id], subject, body_text=details, context=context) + return opportunity.message_append_note(subject, body=details, need_action_user_id=opportunity.user_id.id) def _merge_opportunity_history(self, cr, uid, opportunity_id, opportunities, context=None): message = self.pool.get('mail.message') @@ -571,10 +610,8 @@ class crm_lead(crm_case, osv.osv): } def _convert_opportunity_notification(self, cr, uid, lead, context=None): - success_message = _("Lead '%s' has been converted to an opportunity.") % lead.name - self.message_append(cr, uid, [lead.id], success_message, body_text=success_message, context=context) - self.log(cr, uid, lead.id, success_message) - self._send_mail_to_salesman(cr, uid, lead, context=context) + success_message = _("Lead is converted to an opportunity.") + lead.message_append_note(success_message ,success_message, need_action_user_id=lead.user_id.id) return True def convert_opportunity(self, cr, uid, ids, partner_id, user_ids=False, section_id=False, context=None): @@ -726,6 +763,7 @@ class crm_lead(crm_case, osv.osv): if action == 'log': phonecall.case_close(cr, uid, [new_id]) phonecall_dict[lead.id] = new_id + self._case_phonecall_notification(cr, uid, [new_id], lead, phonecall, action, context=context) return phonecall_dict @@ -868,14 +906,14 @@ class crm_lead(crm_case, osv.osv): if not vals.get('probability') and stage.on_change: vals['probability'] = stage.probability text = _("Changed Stage to: %s") % stage.name - self.message_append(cr, uid, ids, text, body_text=text, context=context) + for case in self.browse(cr, uid, ids, context=context): if case.type == 'lead' or context.get('stage_type') == 'lead': - message = _("The stage of lead '%s' has been changed to '%s'.") % (case.name, stage.name) - self.log(cr, uid, case.id, message) + message = _("The stage of lead has been changed to %s.") % (stage.name) + case.message_append_note(text, message) elif case.type == 'opportunity': - message = _("The stage of opportunity '%s' has been changed to '%s'.") % (case.name, stage.name) - self.log(cr, uid, case.id, message) + message = _("The stage of opportunity has been changed to %s.") % (stage.name) + case.message_append_note(text, message) return super(crm_lead,self).write(cr, uid, ids, vals, context) diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index efeda5ac5fc..185f9f55ef8 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -77,6 +77,9 @@ icon="gtk-go-forward" context="{'stage_type': 'lead'}" /> +