From 6f69709823975456d2401733db4a6b1c73c93397 Mon Sep 17 00:00:00 2001 From: camilogs Date: Sun, 28 Jan 2024 13:54:26 -0500 Subject: [PATCH] =?UTF-8?q?refactor(Asignaci=C3=B3n=20de=20prospectos):=20?= =?UTF-8?q?se=20extrae=20m=C3=A9todo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 3 + core/Prospect/models/prospect.py | 10 ++ core/Prospect/wizards/assign_operator.py | 86 ++++++----- core/Prospect/wizards/assign_to_me.py | 28 ++++ prospect.xml | 181 ++++++++++++----------- tests/scenario_assign_prospect_to_me.rst | 12 +- view/assign_start_form.xml | 24 +-- view/assign_to_me_form.xml | 5 + 8 files changed, 212 insertions(+), 137 deletions(-) create mode 100644 core/Prospect/wizards/assign_to_me.py create mode 100644 view/assign_to_me_form.xml diff --git a/__init__.py b/__init__.py index d14612d..fc774be 100644 --- a/__init__.py +++ b/__init__.py @@ -9,6 +9,7 @@ from core.Prospect.wizards.reassign_prospect_by_prospect \ import ReasignProspectByProspect, ReassignProspectByProspectStart from core.Prospect.wizards.reassign_prospect_by_operator \ import ReassignProspectByOperator, ReassignProspectByOperatorStart +from core.Prospect.wizards.assign_to_me import AssignToMe, AssignToMeStart # Prospect Trace Core from core.ProspectTrace.wizards.make_call \ @@ -50,6 +51,7 @@ def register(): MakeCallAskTask, ReassignProspectByOperatorStart, ReassignProspectByProspectStart, + AssignToMeStart, module='sale_opportunity_management', type_='model') Pool.register( ScheduleCall, @@ -57,6 +59,7 @@ def register(): MakeCall, ReassignProspectByOperator, ReasignProspectByProspect, + AssignToMe, module='sale_opportunity_management', type_='wizard') Pool.register( module='sale_opportunity_management', type_='report') diff --git a/core/Prospect/models/prospect.py b/core/Prospect/models/prospect.py index d08095b..c1f5eb6 100644 --- a/core/Prospect/models/prospect.py +++ b/core/Prospect/models/prospect.py @@ -59,3 +59,13 @@ class Prospect(ModelSQL, ModelView, DeactivableMixin): def on_change_city(self): if self.city: self.department = self.city.parent + + # TODO assign to current user if is operator + # @classmethod + # def create(cls, values): + # records = super().create(values) + # Transaction.atexit( + # lambda: cls.try_assign_to_current_operator(records)) + + # @classmethod + # def try_assign_to_current_operator(cls, prospect, user) diff --git a/core/Prospect/wizards/assign_operator.py b/core/Prospect/wizards/assign_operator.py index 1789cb4..a3492bd 100644 --- a/core/Prospect/wizards/assign_operator.py +++ b/core/Prospect/wizards/assign_operator.py @@ -6,6 +6,56 @@ from trytond.wizard import Wizard, StateView, Button, StateTransition from trytond.model import ModelView, fields from trytond.pyson import Eval from trytond.pool import Pool +from core.Prospect.models.prospect import Prospect + +from core.ProspectTrace.models.prospect_trace import ProspectTrace + + +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): + _prospects = self.start.prospects + _operator = self.start.operator + + self._assign_operator(_prospects, _operator) + + return 'end' + + def _assign_operator(self, prospects, operator): + + for prospect in prospects: + prospect.assigned_operator = operator + prospect.state = 'assigned' + + prospect_trace = self._create_prospect_trace(prospect) + + prospect.prospect_trace = prospect_trace + prospect.save() + + def _create_prospect_trace(self, prospect: Prospect) -> ProspectTrace: + pool = Pool() + ProspectTrace = pool.get('sale.prospect_trace') + + prospect_trace = ProspectTrace( + prospect=prospect, + prospect_city=prospect.city, + prospect_business_unit=prospect.business_unit, + prospect_assigned_operator=prospect.assigned_operator, + prospect_contacts=prospect.contact_methods + ) + + prospect_trace.save() + return prospect_trace class AssignOperatorStart(ModelView): @@ -45,39 +95,3 @@ class AssignOperatorStart(ModelView): [('state', '=', 'unassigned'), ('business_unit', '=', self.business_unit)], limit=self.prospects_chunk) - - -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() - ProspectTrace = pool.get('sale.prospect_trace') - - for prospect in self.start.prospects: - prospect.assigned_operator = self.start.operator - prospect.state = 'assigned' - prospect.save() - - prospect_trace = ProspectTrace( - prospect=prospect, - prospect_city=prospect.city, - prospect_business_unit=prospect.business_unit, - prospect_assigned_operator=prospect.assigned_operator, - prospect_contacts=prospect.contact_methods - ) - prospect_trace.save() - - prospect.prospect_trace = prospect_trace - prospect.save() - - return 'end' diff --git a/core/Prospect/wizards/assign_to_me.py b/core/Prospect/wizards/assign_to_me.py new file mode 100644 index 0000000..5e0fe6a --- /dev/null +++ b/core/Prospect/wizards/assign_to_me.py @@ -0,0 +1,28 @@ +# 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 ModelView, fields + + +class AssignToMe(Wizard): + 'Asignar un prospecto al usuario actual' + __name__ = 'sale.prospect.assign_to_me' + + start = StateView( + model_name='sale.prospect.assign_to_me.start', + view='sale_opportunity_management.assign_to_me_start_view_form', + buttons=[ + Button("Cancel", 'end', 'tryton-cancel'), + Button("Confirm", 'confirm', 'tryton-ok', default=True) + ] + ) + + start = StateTransition() + + +class AssignToMeStart(ModelView): + 'Inicio de asignación de un prospecto al usuario actual' + __name__ = 'sale.prospect.assign_to_me.start' + + assign_to_me = fields.Boolean("Assign to me?") diff --git a/prospect.xml b/prospect.xml index ebfebe1..76d08ae 100644 --- a/prospect.xml +++ b/prospect.xml @@ -3,183 +3,194 @@ this repository contains the full copyright notices and license terms. --> - - Prospects - - - Prospect Administrator - - - - - + + Prospects - - - + + Prospect Administrator + + + + + + + + + - Prospects + Prospects - sale.prospect + eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]" + pyson="1" /> + sale.prospect - sale.prospect + sale.prospect tree prospect_tree - sale.prospect + sale.prospect form prospect_form - - - + + + - - - + + + Unassigned - - - - + + + + Assigned - - - - + + + + + action="act_prospect_tree" /> - - - + + + - Contact method - prospect.contact_method + Contact method + prospect.contact_method - prospect.contact_method + prospect.contact_method tree contact_method_tree - prospect.contact_method + prospect.contact_method form contact_method_form - - - + + + - - - + + + Assign Operator sale.prospect.assign - + sale.prospect.assign.start form assign_start_form - + form_action sale.prospect, -1 - + + parent="menu_prospects_tree" + sequence="40" + id="menu_prospects_assigned_wizard" + action="assign_operator_wizard" /> - - - + + + Reassign by operator sale.prospect.reassign_by_operator - + sale.prospect.reassign_by_operator.start form reassign_by_operator_form - + + icon='tryton-refresh' /> - - - + + + + action="reassign_by_operator_wizard" /> Reassign by prospect sale.prospect.reassign_by_prospect - + sale.prospect.reassign_by_prospect.start form reassign_by_prospect_form - - + + action="reassign_by_prospect_wizard" /> - - - - - - - - - - - - - - - + + + Assign to me + sale.prospect.assign_to_me + + + sale.prospect.assign_to_me.start + form + assign_to_me_form - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/scenario_assign_prospect_to_me.rst b/tests/scenario_assign_prospect_to_me.rst index d41ae3a..12afc0c 100644 --- a/tests/scenario_assign_prospect_to_me.rst +++ b/tests/scenario_assign_prospect_to_me.rst @@ -22,11 +22,15 @@ .. >>> prospect.business_unit = 'brigade' .. >>> prospect.save() -.. [ Se abre una ventana preguntandole al usuario si quiere asignarse a sí mismo el prospecto recién creado ] -.. >>> assign_to_me_wizard = Wizard('sale.prospect.assign_to_me', [prospect]) -.. >>> assign_to_me_wizard.form.assign_to_me = true -.. >>> assign_to_me_wizard.execute('assign_to_me') +.. .. Opción 1: +.. .. [ Se abre una ventana preguntandole al usuario si quiere asignarse a sí mismo el prospecto recién creado ] +.. .. >>> assign_to_me_wizard = Wizard('sale.prospect.assign_to_me', [prospect]) +.. .. >>> assign_to_me_wizard.form.assign_to_me = True +.. .. >>> assign_to_me_wizard.execute('assign_to_me') + +.. ..Opcion2: +.. .. [Se evalua si el usuario actual es operador, de ser el caso se le asigna este prospecto] .. [ Se inició seguimiento, asignado al operador que lo creó ] .. >>> ProspectTrace = Model.get('sale.prospect_trace') .. >>> prospect_trace, = ProspectTrace.find([('prospect', '=', prospect)]) diff --git a/view/assign_start_form.xml b/view/assign_start_form.xml index b08bab5..25cdda3 100644 --- a/view/assign_start_form.xml +++ b/view/assign_start_form.xml @@ -2,18 +2,18 @@
-