From bc4833b3cf4292a6e0d11b77b970e07701e3c036 Mon Sep 17 00:00:00 2001 From: camilogs Date: Tue, 15 Aug 2023 22:33:02 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20Se=20crea=20asistente=20para=20asignaci?= =?UTF-8?q?=C3=B3n=20de=20prospectos=20a=20operarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 3 +- prospect.py | 39 ++++++++++ prospect.xml | 45 ++++++------ .../scenario_sale_opportunity_management.rst | 71 ++++++++++++------- view/assign_start_form.xml | 10 +++ 5 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 view/assign_start_form.xml diff --git a/__init__.py b/__init__.py index 543b655..11c9839 100644 --- a/__init__.py +++ b/__init__.py @@ -18,9 +18,10 @@ def register(): prospect.ContactMethod, prospect.Prospect, prospect_trace.ProspectTrace, - + prospect.AssignOperatorStart, module='sale_opportunity_management', type_='model') Pool.register( + prospect.AssignOperator, module='sale_opportunity_management', type_='wizard') Pool.register( module='sale_opportunity_management', type_='report') diff --git a/prospect.py b/prospect.py index af2310e..fe4997f 100644 --- a/prospect.py +++ b/prospect.py @@ -1,7 +1,9 @@ # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. +from trytond.wizard import Wizard, StateView, Button, StateTransition from trytond.model import ModelSQL, ModelView, fields from trytond.pyson import Eval, If +from trytond.pool import Pool class Prospect(ModelSQL, ModelView): @@ -41,6 +43,7 @@ class Prospect(ModelSQL, ModelView): self.state = 'assigned' else: self.state = 'unassigned' + pass class ContactMethod(ModelSQL, ModelView): @@ -72,3 +75,39 @@ class ContactMethod(ModelSQL, ModelView): contact_rec_name += ' [' + str(field) + '] ' return contact_rec_name + + +class AssignOperatorStart(ModelView): + 'Inicio de asignación de operador' + __name__ = 'sale.prospect.assign.start' + + prospects_chunk = fields.Integer('Prospects chunk') + operator = fields.Many2One('res.user', 'Operator') + + +class AssignOperator(Wizard): + 'Asignar operador a prospecto' + __name__ = 'sale.prospect.assign' + + start = StateView( + 'sale.prospect.assign.start', + 'sale_opportunity_management.assign_start_view_form', [ + Button("Cancel", 'end', 'tryton-cancel'), + Button("Assign", 'assign', 'tryton-ok', default=True)]) + + assign = StateTransition() + + def transition_assign(self): + pool = Pool() + Prospect = pool.get('sale.prospect') + + prospects = Prospect.search( + [('state', '=', 'unassigned')], + limit=self.start.prospects_chunk) + + for prospect in prospects: + prospect.assigned_operator = self.start.operator + prospect.state = 'assigned' + prospect.save() + + return 'end' diff --git a/prospect.xml b/prospect.xml index 079735f..5f97b52 100644 --- a/prospect.xml +++ b/prospect.xml @@ -7,7 +7,6 @@ this repository contains the full copyright notices and license terms. --> Prospects sale.prospect - sale.prospect tree @@ -18,7 +17,6 @@ this repository contains the full copyright notices and license terms. --> form prospect_form - @@ -29,19 +27,17 @@ this repository contains the full copyright notices and license terms. --> - - + Unassigned sale.prospect - + - sale.prospect tree @@ -52,7 +48,6 @@ this repository contains the full copyright notices and license terms. --> form prospect_form - @@ -63,19 +58,17 @@ this repository contains the full copyright notices and license terms. --> + - - - + Assigned sale.prospect - + - sale.prospect tree @@ -86,7 +79,6 @@ this repository contains the full copyright notices and license terms. --> form prospect_form - @@ -97,18 +89,16 @@ this repository contains the full copyright notices and license terms. --> - - + Contact method prospect.contact_method - prospect.contact_method tree @@ -119,7 +109,6 @@ this repository contains the full copyright notices and license terms. --> form contact_method_form - @@ -130,5 +119,11 @@ this repository contains the full copyright notices and license terms. --> + + + sale.prospect.assign.start + form + assign_start_form + diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 0940da2..7498bd7 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -42,50 +42,71 @@ El administrador deberá poder registrar los contactos de diferentes prospectos, Crear prospecto:: >>> Prospect = Model.get('sale.prospect') - >>> prospect = Prospect() + >>> prospect1 = Prospect() - >>> prospect.name = 'guchito S.A.S' - >>> contact_method = prospect.contact_methods.new(value='31223425234', name='Roberto', job='Gerente R.H') - >>> contact_method = prospect.contact_methods.new(contact_type='mobile', value='12345678910', name='Pancracia', job='Asistente administrativo') - >>> contact_method = prospect.contact_methods.new(contact_type='mail', value='peralto@guchitos.org', name='Peralto', job='Administrador') + >>> prospect1.name = 'guchito S.A.S' + >>> contact_method = prospect1.contact_methods.new(value='31223425234', name='Roberto', job='Gerente R.H') + >>> contact_method = prospect1.contact_methods.new(contact_type='mobile', value='12345678910', name='Pancracia', job='Asistente administrativo') + >>> contact_method = prospect1.contact_methods.new(contact_type='mail', value='peralto@guchitos.org', name='Peralto', job='Administrador') >>> City = Model.get('sale.city') >>> medellin, = City.find([('code', '=', 'CO-05001')]) - >>> prospect.city = medellin - >>> prospect.save() + >>> prospect1.city = medellin + >>> prospect1.save() Verificar estado final de creación de prospecto:: - >>> prospect.contact_methods + >>> prospect1.contact_methods [proteus.Model.get('prospect.contact_method')(1), proteus.Model.get('prospect.contact_method')(2), proteus.Model.get('prospect.contact_method')(3)] - >>> prospect.contact_methods[0].contact_type + >>> prospect1.contact_methods[0].contact_type 'mobile' - >>> prospect.contact_methods[0].job + >>> prospect1.contact_methods[0].job 'Gerente R.H' - >>> prospect.contact_methods[2].name + >>> prospect1.contact_methods[2].name 'Peralto' - >>> prospect.contact_methods[2].value + >>> prospect1.contact_methods[2].value 'peralto@guchitos.org' - >>> prospect.city.code + >>> prospect1.city.code 'CO-05001' - >>> prospect.department.code + >>> prospect1.department.code 'CO-05' - >>> prospect.state + >>> prospect1.state 'unassigned' +Crear segundo prospecto:: + >>> prospect2 = Prospect() + + >>> prospect2.name = 'Modernitus S.A.S' + >>> contact_method = prospect2.contact_methods.new(value='3122390987', name='Pepe', job='Jefe de ventas') + + >>> City = Model.get('sale.city') + >>> bogota, = City.find([('code', '=', 'CO-11001')]) + >>> prospect2.city = bogota + >>> prospect2.save() + Asignar operario a un prospecto:: >>> User = Model.get('res.user') >>> user, = User.find([('name', '=', 'Administrator')]) - >>> prospect.assigned_operator = user - >>> prospect.assigned_operator.name + .. >>> prospect1.assigned_operator = user + + >>> assign = Wizard('sale.prospect.assign', [prospect1, prospect2]) + >>> assign.form.prospects_chunk = 2 + >>> assign.form.operator = user + >>> assign.execute('assign') + + >>> prospect1.assigned_operator.name 'Administrator' - >>> prospect.state + >>> prospect1.state + 'assigned' + >>> prospect2.assigned_operator.name + 'Administrator' + >>> prospect2.state 'assigned' Remover operario asignado de un prospecto:: - >>> prospect.assigned_operator = None - >>> prospect.state + >>> prospect1.assigned_operator = None + >>> prospect1.state 'unassigned' @@ -155,7 +176,7 @@ Crear seguimiento de prospecto:: >>> ProspectTrace = Model.get('sale.prospect_trace') >>> prospect_trace = ProspectTrace() - >>> prospect_trace.prospect = prospect + >>> prospect_trace.prospect = prospect1 >>> prospect_trace.save() >>> prospect_trace.prospect.name @@ -215,10 +236,10 @@ Crear una llamada agendada previamente: 'open' Cuando se asigna prospecto sin método de contacto mobile, el contacto en el seguimiento es vacío:: - >>> prospect2 = Prospect() - >>> prospect2.name = 'Sin celulares S.A.S' - >>> contact_method = prospect2.contact_methods.new(contact_type='mail', value='felpucio@sincelulares.org', name='felpucio', job='Supervisor') - >>> prospect2.save() + >>> prospect3 = Prospect() + >>> prospect3.name = 'Sin celulares S.A.S' + >>> contact_method = prospect3.contact_methods.new(contact_type='mail', value='felpucio@sincelulares.org', name='felpucio', job='Supervisor') + >>> prospect3.save() >>> prospect_trace2 = ProspectTrace() >>> prospect_trace2.prospect = prospect2 diff --git a/view/assign_start_form.xml b/view/assign_start_form.xml new file mode 100644 index 0000000..ce83300 --- /dev/null +++ b/view/assign_start_form.xml @@ -0,0 +1,10 @@ + + +
+