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 import ReasignProspectByProspect, ReassignProspectByProspectStart
from core.Prospect.wizards.reassign_prospect_by_operator \ from core.Prospect.wizards.reassign_prospect_by_operator \
import ReassignProspectByOperator, ReassignProspectByOperatorStart import ReassignProspectByOperator, ReassignProspectByOperatorStart
from core.Prospect.wizards.assign_to_me import AssignToMe, AssignToMeStart
# Prospect Trace Core # Prospect Trace Core
from core.ProspectTrace.wizards.make_call \ from core.ProspectTrace.wizards.make_call \
@ -50,6 +51,7 @@ def register():
MakeCallAskTask, MakeCallAskTask,
ReassignProspectByOperatorStart, ReassignProspectByOperatorStart,
ReassignProspectByProspectStart, ReassignProspectByProspectStart,
AssignToMeStart,
module='sale_opportunity_management', type_='model') module='sale_opportunity_management', type_='model')
Pool.register( Pool.register(
ScheduleCall, ScheduleCall,
@ -57,6 +59,7 @@ def register():
MakeCall, MakeCall,
ReassignProspectByOperator, ReassignProspectByOperator,
ReasignProspectByProspect, ReasignProspectByProspect,
AssignToMe,
module='sale_opportunity_management', type_='wizard') module='sale_opportunity_management', type_='wizard')
Pool.register( Pool.register(
module='sale_opportunity_management', type_='report') module='sale_opportunity_management', type_='report')

View File

@ -59,3 +59,13 @@ class Prospect(ModelSQL, ModelView, DeactivableMixin):
def on_change_city(self): def on_change_city(self):
if self.city: if self.city:
self.department = self.city.parent 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.model import ModelView, fields
from trytond.pyson import Eval from trytond.pyson import Eval
from trytond.pool import Pool 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): class AssignOperatorStart(ModelView):
@ -45,39 +95,3 @@ class AssignOperatorStart(ModelView):
[('state', '=', 'unassigned'), [('state', '=', 'unassigned'),
('business_unit', '=', self.business_unit)], ('business_unit', '=', self.business_unit)],
limit=self.prospects_chunk) 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,183 +3,194 @@
this repository contains the full copyright notices and license terms. --> this repository contains the full copyright notices and license terms. -->
<tryton> <tryton>
<data> <data>
<record model="res.group" id="group_prospect"> <record model="res.group" id="group_prospect">
<field name="name">Prospects</field> <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> </record>
<record model="res.user-res.group" id="user_admin_group_prospect_admin"> <record model="res.group" id="group_prospect_admin">
<field name="user" ref="res.user_admin"/> <field name="name">Prospect Administrator</field>
<field name="group" ref="group_prospect_admin"/> <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>
<record model="ir.action.act_window" id="act_prospect_tree"> <record model="ir.action.act_window" id="act_prospect_tree">
<field name="name">Prospects</field> <field name="name">Prospects</field>
<field name="domain" <field name="domain"
eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]" eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]"
pyson="1"/> pyson="1" />
<field name="res_model">sale.prospect</field> <field name="res_model">sale.prospect</field>
</record> </record>
<record model="ir.ui.view" id="prospect_view_tree"> <record model="ir.ui.view" id="prospect_view_tree">
<field name="model">sale.prospect</field> <field name="model">sale.prospect</field>
<field name="type">tree</field> <field name="type">tree</field>
<field name="name">prospect_tree</field> <field name="name">prospect_tree</field>
</record> </record>
<record model="ir.ui.view" id="prospect_view_form"> <record model="ir.ui.view" id="prospect_view_form">
<field name="model">sale.prospect</field> <field name="model">sale.prospect</field>
<field name="type">form</field> <field name="type">form</field>
<field name="name">prospect_form</field> <field name="name">prospect_form</field>
</record> </record>
<record model="ir.action.act_window.view" id="act_prospect_tree_view1"> <record model="ir.action.act_window.view" id="act_prospect_tree_view1">
<field name="sequence" eval="10"/> <field name="sequence" eval="10" />
<field name="view" ref="prospect_view_tree"/> <field name="view" ref="prospect_view_tree" />
<field name="act_window" ref="act_prospect_tree"/> <field name="act_window" ref="act_prospect_tree" />
</record> </record>
<record model="ir.action.act_window.view" id="act_prospect_form_view1"> <record model="ir.action.act_window.view" id="act_prospect_form_view1">
<field name="sequence" eval="20"/> <field name="sequence" eval="20" />
<field name="view" ref="prospect_view_form"/> <field name="view" ref="prospect_view_form" />
<field name="act_window" ref="act_prospect_tree"/> <field name="act_window" ref="act_prospect_tree" />
</record> </record>
<record model="ir.action.act_window.domain" id="act_prospect_domain_unassigned"> <record model="ir.action.act_window.domain" id="act_prospect_domain_unassigned">
<field name="name">Unassigned</field> <field name="name">Unassigned</field>
<field name="sequence" eval="10"/> <field name="sequence" eval="10" />
<field name="domain" eval="[('state', '=', 'unassigned')]" pyson="1"/> <field name="domain" eval="[('state', '=', 'unassigned')]" pyson="1" />
<field name="count" eval="True"/> <field name="count" eval="True" />
<field name="act_window" ref="act_prospect_tree"/> <field name="act_window" ref="act_prospect_tree" />
</record> </record>
<record model="ir.action.act_window.domain" id="act_prospect_domain_assigned"> <record model="ir.action.act_window.domain" id="act_prospect_domain_assigned">
<field name="name">Assigned</field> <field name="name">Assigned</field>
<field name="sequence" eval="10"/> <field name="sequence" eval="10" />
<field name="domain" eval="[('state', '=', 'assigned')]" pyson="1"/> <field name="domain" eval="[('state', '=', 'assigned')]" pyson="1" />
<field name="count" eval="True"/> <field name="count" eval="True" />
<field name="act_window" ref="act_prospect_tree"/> <field name="act_window" ref="act_prospect_tree" />
</record> </record>
<menuitem <menuitem
parent="menu_calls" parent="menu_calls"
sequence="10" sequence="10"
id="menu_prospects_tree" id="menu_prospects_tree"
icon="tryton-party" icon="tryton-party"
action="act_prospect_tree"/> action="act_prospect_tree" />
<record model="ir.ui.menu-res.group" id="menu_prospects_group_prospect"> <record model="ir.ui.menu-res.group" id="menu_prospects_group_prospect">
<field name="menu" ref="menu_prospects_tree"/> <field name="menu" ref="menu_prospects_tree" />
<field name="group" ref="group_prospect"/> <field name="group" ref="group_prospect" />
</record> </record>
<record model="ir.action.act_window" id="act_contact_method_tree"> <record model="ir.action.act_window" id="act_contact_method_tree">
<field name="name">Contact method</field> <field name="name">Contact method</field>
<field name="res_model">prospect.contact_method</field> <field name="res_model">prospect.contact_method</field>
</record> </record>
<record model="ir.ui.view" id="contact_method_view_tree"> <record model="ir.ui.view" id="contact_method_view_tree">
<field name="model">prospect.contact_method</field> <field name="model">prospect.contact_method</field>
<field name="type">tree</field> <field name="type">tree</field>
<field name="name">contact_method_tree</field> <field name="name">contact_method_tree</field>
</record> </record>
<record model="ir.ui.view" id="contact_method_view_form"> <record model="ir.ui.view" id="contact_method_view_form">
<field name="model">prospect.contact_method</field> <field name="model">prospect.contact_method</field>
<field name="type">form</field> <field name="type">form</field>
<field name="name">contact_method_form</field> <field name="name">contact_method_form</field>
</record> </record>
<record model="ir.action.act_window.view" id="act_contact_method_tree_view1"> <record model="ir.action.act_window.view" id="act_contact_method_tree_view1">
<field name="sequence" eval="10"/> <field name="sequence" eval="10" />
<field name="view" ref="contact_method_view_tree"/> <field name="view" ref="contact_method_view_tree" />
<field name="act_window" ref="act_contact_method_tree"/> <field name="act_window" ref="act_contact_method_tree" />
</record> </record>
<record model="ir.action.act_window.view" id="act_contact_method_form_view1"> <record model="ir.action.act_window.view" id="act_contact_method_form_view1">
<field name="sequence" eval="20"/> <field name="sequence" eval="20" />
<field name="view" ref="contact_method_view_form"/> <field name="view" ref="contact_method_view_form" />
<field name="act_window" ref="act_contact_method_tree"/> <field name="act_window" ref="act_contact_method_tree" />
</record> </record>
<record model="ir.action.wizard" id="assign_operator_wizard"> <record model="ir.action.wizard" id="assign_operator_wizard">
<field name="name">Assign Operator</field> <field name="name">Assign Operator</field>
<field name="wiz_name">sale.prospect.assign</field> <field name="wiz_name">sale.prospect.assign</field>
</record> </record>
<record model="ir.ui.view" id="assign_start_view_form"> <record model="ir.ui.view" id="assign_start_view_form">
<field name="model">sale.prospect.assign.start</field> <field name="model">sale.prospect.assign.start</field>
<field name="type">form</field> <field name="type">form</field>
<field name="name">assign_start_form</field> <field name="name">assign_start_form</field>
</record> </record>
<record model="ir.action.keyword" id="assign_operator_wizard_keyword"> <record model="ir.action.keyword" id="assign_operator_wizard_keyword">
<field name="keyword">form_action</field> <field name="keyword">form_action</field>
<field name="model">sale.prospect, -1</field> <field name="model">sale.prospect, -1</field>
<field name="action" ref="assign_operator_wizard"/> <field name="action" ref="assign_operator_wizard" />
</record> </record>
<menuitem <menuitem
parent="menu_prospects_tree" parent="menu_prospects_tree"
sequence="40" sequence="40"
id="menu_prospects_assigned_wizard" id="menu_prospects_assigned_wizard"
action="assign_operator_wizard"/> action="assign_operator_wizard" />
<record model="ir.ui.menu-res.group" id="menu_prospect_assigned_group_prospect"> <record model="ir.ui.menu-res.group" id="menu_prospect_assigned_group_prospect">
<field name="menu" ref="menu_prospects_assigned_wizard"/> <field name="menu" ref="menu_prospects_assigned_wizard" />
<field name="group" ref="group_prospect_admin"/> <field name="group" ref="group_prospect_admin" />
</record> </record>
<record model="ir.action.wizard" id="reassign_by_operator_wizard"> <record model="ir.action.wizard" id="reassign_by_operator_wizard">
<field name="name">Reassign by operator</field> <field name="name">Reassign by operator</field>
<field name="wiz_name">sale.prospect.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"> <record model="ir.ui.view" id="reassign_by_operator_start_view_form">
<field name="model">sale.prospect.reassign_by_operator.start</field> <field name="model">sale.prospect.reassign_by_operator.start</field>
<field name="type">form</field> <field name="type">form</field>
<field name="name">reassign_by_operator_form</field> <field name="name">reassign_by_operator_form</field>
</record> </record>
<menuitem <menuitem
name="Reassign" name="Reassign"
parent="menu_prospects_tree" parent="menu_prospects_tree"
sequence="50" sequence="50"
id="menu_reassign" id="menu_reassign"
icon='tryton-refresh'/> icon='tryton-refresh' />
<record model="ir.ui.menu-res.group" id="menu_prospect_reassigned_group_prospect"> <record model="ir.ui.menu-res.group" id="menu_prospect_reassigned_group_prospect">
<field name="menu" ref="menu_reassign"/> <field name="menu" ref="menu_reassign" />
<field name="group" ref="group_prospect_admin"/> <field name="group" ref="group_prospect_admin" />
</record> </record>
<menuitem <menuitem
parent="menu_reassign" parent="menu_reassign"
sequence="10" sequence="10"
id="menu_reassign_by_operator_wizard" 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"> <record model="ir.action.wizard" id="reassign_by_prospect_wizard">
<field name="name">Reassign by prospect</field> <field name="name">Reassign by prospect</field>
<field name="wiz_name">sale.prospect.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"> <record model="ir.ui.view" id="reassign_by_prospect_start_view_form">
<field name="model">sale.prospect.reassign_by_prospect.start</field> <field name="model">sale.prospect.reassign_by_prospect.start</field>
<field name="type">form</field> <field name="type">form</field>
<field name="name">reassign_by_prospect_form</field> <field name="name">reassign_by_prospect_form</field>
</record> </record>
<menuitem <menuitem
parent="menu_reassign" parent="menu_reassign"
sequence="20" sequence="20"
id="menu_reassign_by_prospect_wizard" 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')]"/> <record model="ir.action.wizard" id="assign_to_me_wizard">
<field name="perm_read" eval="False"/> <field name="name">Assign to me</field>
<field name="perm_write" eval="False"/> <field name="wiz_name">sale.prospect.assign_to_me</field>
<field name="perm_create" eval="False"/> </record>
<field name="perm_delete" eval="False"/> <record model="ir.ui.view" id="assign_to_me_start_view_form">
</record> <field name="model">sale.prospect.assign_to_me.start</field>
<field name="type">form</field>
<record model="ir.model.access" id="access_sale_prospect"> <field name="name">assign_to_me_form</field>
<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> </record>
</data>
</tryton>
<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.business_unit = 'brigade'
.. >>> prospect.save() .. >>> prospect.save()
.. [ Se abre una ventana preguntandole al usuario si quiere asignarse a sí mismo el prospecto recién creado ] .. .. Opción 1:
.. >>> assign_to_me_wizard = Wizard('sale.prospect.assign_to_me', [prospect]) .. .. [ Se abre una ventana preguntandole al usuario si quiere asignarse a sí mismo el prospecto recién creado ]
.. >>> assign_to_me_wizard.form.assign_to_me = true .. .. >>> assign_to_me_wizard = Wizard('sale.prospect.assign_to_me', [prospect])
.. >>> assign_to_me_wizard.execute('assign_to_me') .. .. >>> 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ó ] .. [ Se inició seguimiento, asignado al operador que lo creó ]
.. >>> ProspectTrace = Model.get('sale.prospect_trace') .. >>> ProspectTrace = Model.get('sale.prospect_trace')
.. >>> prospect_trace, = ProspectTrace.find([('prospect', '=', prospect)]) .. >>> 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 file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. --> this repository contains the full copyright notices and license terms. -->
<form col="6"> <form col="6">
<label name="operator"/> <label name="operator" />
<field name="operator"/> <field name="operator" />
<label name="business_unit"/> <label name="business_unit" />
<field name="business_unit"/> <field name="business_unit" />
<label name="prospects_chunk"/> <label name="prospects_chunk" />
<field name="prospects_chunk"/> <field name="prospects_chunk" />
<notebook colspan="6"> <notebook colspan="6">
<page string="Prospects" id="prospects_to_assign" col="6"> <page string="Prospects" id="prospects_to_assign" col="6">
<group col="2" id="prospects"> <group col="2" id="prospects">
<field name="prospects"/> <field name="prospects" />
</group> </group>
</page> </page>
</notebook> </notebook>
</form> </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>