refactor(Asignación de prospectos): se extrae método

This commit is contained in:
Camilo Gonzalez 2024-01-28 13:54:26 -05:00
parent cd0564c95f
commit 6f69709823
8 changed files with 212 additions and 137 deletions

View File

@ -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')

View File

@ -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)

View File

@ -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'

View File

@ -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?")

View File

@ -3,27 +3,27 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="res.group" id="group_prospect">
<field name="name">Prospects</field>
</record>
<record model="res.group" id="group_prospect_admin">
<field name="name">Prospect Administrator</field>
<field name="parent" ref="group_prospect"/>
</record>
<record model="res.user-res.group" id="user_admin_group_prospect">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_prospect"/>
<record model="res.group" id="group_prospect">
<field name="name">Prospects</field>
</record>
<record model="res.user-res.group" id="user_admin_group_prospect_admin">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_prospect_admin"/>
<record model="res.group" id="group_prospect_admin">
<field name="name">Prospect Administrator</field>
<field name="parent" ref="group_prospect" />
</record>
<record model="res.user-res.group" id="user_admin_group_prospect">
<field name="user" ref="res.user_admin" />
<field name="group" ref="group_prospect" />
</record>
<record model="res.user-res.group" id="user_admin_group_prospect_admin">
<field name="user" ref="res.user_admin" />
<field name="group" ref="group_prospect_admin" />
</record>
<record model="ir.action.act_window" id="act_prospect_tree">
<field name="name">Prospects</field>
<field name="domain"
eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]"
pyson="1"/>
eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]"
pyson="1" />
<field name="res_model">sale.prospect</field>
</record>
<record model="ir.ui.view" id="prospect_view_tree">
@ -37,39 +37,39 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">prospect_form</field>
</record>
<record model="ir.action.act_window.view" id="act_prospect_tree_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="prospect_view_tree"/>
<field name="act_window" ref="act_prospect_tree"/>
<field name="sequence" eval="10" />
<field name="view" ref="prospect_view_tree" />
<field name="act_window" ref="act_prospect_tree" />
</record>
<record model="ir.action.act_window.view" id="act_prospect_form_view1">
<field name="sequence" eval="20"/>
<field name="view" ref="prospect_view_form"/>
<field name="act_window" ref="act_prospect_tree"/>
<field name="sequence" eval="20" />
<field name="view" ref="prospect_view_form" />
<field name="act_window" ref="act_prospect_tree" />
</record>
<record model="ir.action.act_window.domain" id="act_prospect_domain_unassigned">
<field name="name">Unassigned</field>
<field name="sequence" eval="10"/>
<field name="domain" eval="[('state', '=', 'unassigned')]" pyson="1"/>
<field name="count" eval="True"/>
<field name="act_window" ref="act_prospect_tree"/>
<field name="sequence" eval="10" />
<field name="domain" eval="[('state', '=', 'unassigned')]" pyson="1" />
<field name="count" eval="True" />
<field name="act_window" ref="act_prospect_tree" />
</record>
<record model="ir.action.act_window.domain" id="act_prospect_domain_assigned">
<field name="name">Assigned</field>
<field name="sequence" eval="10"/>
<field name="domain" eval="[('state', '=', 'assigned')]" pyson="1"/>
<field name="count" eval="True"/>
<field name="act_window" ref="act_prospect_tree"/>
<field name="sequence" eval="10" />
<field name="domain" eval="[('state', '=', 'assigned')]" pyson="1" />
<field name="count" eval="True" />
<field name="act_window" ref="act_prospect_tree" />
</record>
<menuitem
parent="menu_calls"
sequence="10"
id="menu_prospects_tree"
icon="tryton-party"
action="act_prospect_tree"/>
action="act_prospect_tree" />
<record model="ir.ui.menu-res.group" id="menu_prospects_group_prospect">
<field name="menu" ref="menu_prospects_tree"/>
<field name="group" ref="group_prospect"/>
<record model="ir.ui.menu-res.group" id="menu_prospects_group_prospect">
<field name="menu" ref="menu_prospects_tree" />
<field name="group" ref="group_prospect" />
</record>
<record model="ir.action.act_window" id="act_contact_method_tree">
@ -87,20 +87,20 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">contact_method_form</field>
</record>
<record model="ir.action.act_window.view" id="act_contact_method_tree_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="contact_method_view_tree"/>
<field name="act_window" ref="act_contact_method_tree"/>
<field name="sequence" eval="10" />
<field name="view" ref="contact_method_view_tree" />
<field name="act_window" ref="act_contact_method_tree" />
</record>
<record model="ir.action.act_window.view" id="act_contact_method_form_view1">
<field name="sequence" eval="20"/>
<field name="view" ref="contact_method_view_form"/>
<field name="act_window" ref="act_contact_method_tree"/>
<field name="sequence" eval="20" />
<field name="view" ref="contact_method_view_form" />
<field name="act_window" ref="act_contact_method_tree" />
</record>
<record model="ir.action.wizard" id="assign_operator_wizard">
<field name="name">Assign Operator</field>
<field name="wiz_name">sale.prospect.assign</field>
</record>
</record>
<record model="ir.ui.view" id="assign_start_view_form">
<field name="model">sale.prospect.assign.start</field>
<field name="type">form</field>
@ -109,23 +109,23 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword" id="assign_operator_wizard_keyword">
<field name="keyword">form_action</field>
<field name="model">sale.prospect, -1</field>
<field name="action" ref="assign_operator_wizard"/>
<field name="action" ref="assign_operator_wizard" />
</record>
<menuitem
parent="menu_prospects_tree"
sequence="40"
id="menu_prospects_assigned_wizard"
action="assign_operator_wizard"/>
parent="menu_prospects_tree"
sequence="40"
id="menu_prospects_assigned_wizard"
action="assign_operator_wizard" />
<record model="ir.ui.menu-res.group" id="menu_prospect_assigned_group_prospect">
<field name="menu" ref="menu_prospects_assigned_wizard"/>
<field name="group" ref="group_prospect_admin"/>
<record model="ir.ui.menu-res.group" id="menu_prospect_assigned_group_prospect">
<field name="menu" ref="menu_prospects_assigned_wizard" />
<field name="group" ref="group_prospect_admin" />
</record>
<record model="ir.action.wizard" id="reassign_by_operator_wizard">
<field name="name">Reassign by operator</field>
<field name="wiz_name">sale.prospect.reassign_by_operator</field>
</record>
</record>
<record model="ir.ui.view" id="reassign_by_operator_start_view_form">
<field name="model">sale.prospect.reassign_by_operator.start</field>
<field name="type">form</field>
@ -136,50 +136,61 @@ this repository contains the full copyright notices and license terms. -->
parent="menu_prospects_tree"
sequence="50"
id="menu_reassign"
icon='tryton-refresh'/>
icon='tryton-refresh' />
<record model="ir.ui.menu-res.group" id="menu_prospect_reassigned_group_prospect">
<field name="menu" ref="menu_reassign"/>
<field name="group" ref="group_prospect_admin"/>
<record model="ir.ui.menu-res.group" id="menu_prospect_reassigned_group_prospect">
<field name="menu" ref="menu_reassign" />
<field name="group" ref="group_prospect_admin" />
</record>
<menuitem
parent="menu_reassign"
sequence="10"
id="menu_reassign_by_operator_wizard"
action="reassign_by_operator_wizard"/>
action="reassign_by_operator_wizard" />
<record model="ir.action.wizard" id="reassign_by_prospect_wizard">
<field name="name">Reassign by prospect</field>
<field name="wiz_name">sale.prospect.reassign_by_prospect</field>
</record>
</record>
<record model="ir.ui.view" id="reassign_by_prospect_start_view_form">
<field name="model">sale.prospect.reassign_by_prospect.start</field>
<field name="type">form</field>
<field name="name">reassign_by_prospect_form</field>
</record>
<menuitem
<menuitem
parent="menu_reassign"
sequence="20"
id="menu_reassign_by_prospect_wizard"
action="reassign_by_prospect_wizard"/>
action="reassign_by_prospect_wizard" />
<record model="ir.model.access" id="access_sale">
<field name="model" search="[('model', '=', 'sale.prospect')]"/>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_sale_prospect">
<field name="model" search="[('model', '=', 'sale.prospect')]"/>
<field name="group" ref="group_prospect"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
<record model="ir.action.wizard" id="assign_to_me_wizard">
<field name="name">Assign to me</field>
<field name="wiz_name">sale.prospect.assign_to_me</field>
</record>
<record model="ir.ui.view" id="assign_to_me_start_view_form">
<field name="model">sale.prospect.assign_to_me.start</field>
<field name="type">form</field>
<field name="name">assign_to_me_form</field>
</record>
</data>
<record model="ir.model.access" id="access_sale">
<field name="model" search="[('model', '=', 'sale.prospect')]" />
<field name="perm_read" eval="False" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_delete" eval="False" />
</record>
<record model="ir.model.access" id="access_sale_prospect">
<field name="model" search="[('model', '=', 'sale.prospect')]" />
<field name="group" ref="group_prospect" />
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_delete" eval="True" />
</record>
</data>
</tryton>

View File

@ -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)])

View File

@ -2,18 +2,18 @@
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form col="6">
<label name="operator"/>
<field name="operator"/>
<label name="business_unit"/>
<field name="business_unit"/>
<label name="prospects_chunk"/>
<field name="prospects_chunk"/>
<label name="operator" />
<field name="operator" />
<label name="business_unit" />
<field name="business_unit" />
<label name="prospects_chunk" />
<field name="prospects_chunk" />
<notebook colspan="6">
<page string="Prospects" id="prospects_to_assign" col="6">
<group col="2" id="prospects">
<field name="prospects"/>
</group>
</page>
<page string="Prospects" id="prospects_to_assign" col="6">
<group col="2" id="prospects">
<field name="prospects" />
</group>
</page>
</notebook>
</form>

View File

@ -0,0 +1,5 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
</form>