diff --git a/__init__.py b/__init__.py index f5066d6..d6b1a60 100644 --- a/__init__.py +++ b/__init__.py @@ -28,6 +28,7 @@ def register(): prospect_trace.MakeCallAskTask, prospect.ReassignProspectByOperatorStart, prospect.ReassignProspectByProspectStart, + call.PendingTask_ContactMethod, module='sale_opportunity_management', type_='model') Pool.register( prospect_trace.ScheduleCall, diff --git a/call.py b/call.py index f8f36f7..162970f 100644 --- a/call.py +++ b/call.py @@ -67,12 +67,18 @@ class PendingTask(ModelSQL, ModelView): 'sale.prospect_trace', 'Prospect trace', required=True, readonly=True) + contacts = fields.Many2Many( + 'sale.pendingtask_contactmethod', + 'pending_task_id', 'contact_method_id', + 'Contact Methods') + @classmethod def __setup__(cls): super(PendingTask, cls).__setup__() cls._buttons.update({ 'close_task': { - 'invisible': Eval('state') == 'done' + 'invisible': Eval('state') == 'done', + 'depends': ['state'], } }) @@ -86,3 +92,12 @@ class PendingTask(ModelSQL, ModelView): @classmethod def default_state(cls): return 'pending' + + +class PendingTask_ContactMethod(ModelSQL): + 'Relacion muchos a muchos entre tareas pendientes y mecanismos de contacto' + __name__ = "sale.pendingtask_contactmethod" + + pending_task_id = fields.Many2One('sale.pending_task', 'Pending task id') + contact_method_id = fields.Many2One( + 'prospect.contact_method', 'Contact method id') diff --git a/locale/es.po b/locale/es.po index c19f8a1..c1f3f06 100644 --- a/locale/es.po +++ b/locale/es.po @@ -246,6 +246,10 @@ msgctxt "field:sale.pending_task,prospect_trace:" msgid "Prospect trace" msgstr "Seguimiento de prospecto" +msgctxt "field:sale.pending_task,contacts:" +msgid "Contact Methods" +msgstr "Métodos de Contacto" + msgctxt "field:sale.prospect_trace.make_call.start,schedule_task:" msgid "Schedule task?" msgstr "¿Agendar tarea?" diff --git a/prospect.py b/prospect.py index e06a180..2b4150c 100644 --- a/prospect.py +++ b/prospect.py @@ -54,7 +54,7 @@ class Prospect(ModelSQL, ModelView, DeactivableMixin): @fields.depends('prospect_trace', 'contact_methods') def on_change_contact_methods(self): for contact in self.contact_methods: - contact.prospect_trace = self.prospect_trace + contact.update_collaborators(changed_from='prospect') @fields.depends('city', 'department') def on_change_city(self): @@ -80,10 +80,24 @@ class ContactMethod(ModelSQL, ModelView): prospect_trace = fields.Many2One( 'sale.prospect_trace', 'Prospect Trace', required=False) + tasks = fields.Many2Many( + 'sale.pendingtask_contactmethod', + 'contact_method_id', 'pending_task_id', + 'Tasks') + @classmethod def default_contact_type(cls): return 'mobile' + def update_collaborators(self, changed_from): + if (changed_from == 'prospect'): + self.prospect_trace = self.prospect.prospect_trace + if (self.prospect_trace): + self.tasks = self.prospect.prospect_trace.tasks + if (changed_from == 'prospect_trace'): + self.prospect = self.prospect_trace.prospect + self.tasks = self.prospect_trace.tasks + def get_rec_name(self, name): fields = [self.name, self.job, self.value] contact_rec_name = '' diff --git a/prospect_trace.py b/prospect_trace.py index 2ba4d60..04c2cfb 100644 --- a/prospect_trace.py +++ b/prospect_trace.py @@ -36,6 +36,9 @@ class ProspectTrace(ModelSQL, ModelView): 'sale.call', 'prospect_trace', 'Calls', states=_states) pending_call = fields.Many2One( 'sale.pending_call', 'Pending call', states=_states) + tasks = fields.One2Many( + 'sale.pending_task', 'prospect_trace', + 'Pending Tasks', states=_states) current_interest = fields.Selection( Interest.get_interest_levels(), 'Current interest', @@ -52,7 +55,7 @@ class ProspectTrace(ModelSQL, ModelView): @fields.depends('prospect_contacts', 'prospect') def on_change_prospect_contacts(self): for contact in self.prospect_contacts: - contact.prospect = self.prospect + contact.update_collaborators(changed_from='prospect_trace') @classmethod def __setup__(cls): @@ -263,6 +266,7 @@ class MakeCall(Wizard): task = Task() task.description = description task.prospect_trace = prospect_trace + task.contacts = prospect_trace.prospect_contacts task.save() @classmethod diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 8296ce7..de3da3b 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -287,16 +287,42 @@ Hacer llamada y programar tarea:: >>> make_call.execute('schedule_task') >>> Task = Model.get('sale.pending_task') - >>> task, = Task.find([('description', '=', 'I have to send a mail to prospect offering him this services...')]) - >>> task - proteus.Model.get('sale.pending_task')(1) + >>> task1, = Task.find([('description', '=', 'I have to send a mail to prospect offering him this services...')]) - >>> task.state + >>> task1 + proteus.Model.get('sale.pending_task')(1) + >>> task1.state 'pending' - >>> task.click('close_task') - >>> task.state + >>> task1.click('close_task') + + >>> task1.state 'done' + >>> task1.contacts[0].value + '12345678910' + +Programar segunda tarea al mismo seguimiento:: + >>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace]) + >>> make_call.form.description = 'Prospect told me to send him an SMS' + >>> make_call.form.interest = '3' + >>> make_call.form.schedule_call = 'no' + >>> make_call.form.schedule_task = 'yes' + >>> make_call.execute('make_call') + >>> make_call.form.task_description = 'I have to send a SMS to prospect offering him this services...' + >>> make_call.execute('schedule_task') + + >>> task1.save() + >>> Task = Model.get('sale.pending_task') + >>> task2, = Task.find([('description', '=', 'I have to send a SMS to prospect offering him this services...')]) + >>> task2 + proteus.Model.get('sale.pending_task')(2) + + >>> task2.state + 'pending' + >>> task2.contacts[0].value + '12345678910' + >>> task1.contacts[0].value + '12345678910' Hacer llamada y cerrar venta (Seguimiento de prospecto):: >>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace]) @@ -347,7 +373,6 @@ Reasignar prospectos por prospecto:: >>> reassign_by_prospect.form.prospect = prospect1 >>> reassign_by_prospect.form.new_operator = user >>> reassign_by_prospect.execute('reassign_by_prospect') - >>> prospect1.reload() >>> prospect1.assigned_operator.name @@ -364,7 +389,7 @@ Crear un usuario de rol administrador:: >>> admin.save() >>> admin.user_admin == True True - + Agregar un nuevo método de contacto desde prospecto >>> contact_method = prospect1.contact_methods.new(value='0000000000', name='Nuevo', job='Puesto increíble') >>> prospect1.save() diff --git a/view/pending_task_form.xml b/view/pending_task_form.xml index 6e67eac..1950f87 100644 --- a/view/pending_task_form.xml +++ b/view/pending_task_form.xml @@ -8,5 +8,8 @@ this repository contains the full copyright notices and license terms. -->