14 Commits

Author SHA1 Message Date
b7e06a3408 feat: Se añade workflow a pending_task 2024-02-29 10:52:44 -05:00
9096983ffd feat(call): Se añade dominio de window usuario actual 2024-02-28 22:34:07 -05:00
660ac06c1d fix: Se agregan rutas relativas en importaciones 2024-01-31 18:29:35 +00:00
7b0bafa05f feat: Se añaden archivos __init__.py 2024-01-31 18:09:01 +00:00
4d88f9423d feat: Se agregan traducciones a configuración de operador 2024-01-30 13:16:04 -05:00
e0f3846bb5 chore: Se arregla formato 2024-01-28 17:13:10 -05:00
ef8f45267f chore: Se remueve código duplicado usando asignador genérico 2024-01-28 17:10:27 -05:00
5cc0277db9 chore: Se remueve código muerto 2024-01-28 16:56:00 -05:00
3f7b989781 Merge pull request 'Implementar asignación automática de prospecto al operador que lo creó' (#81) from automaticAssignOperatorWhoCreatedProspect#3 into 6.8
Reviewed-on: #81
2024-01-28 16:46:22 -05:00
6c31dfb64f chore(sale_opportunity): Se remueve código muerto 2024-01-28 16:41:19 -05:00
b1c3b21a9c feat(Asignación de prospectos): Auto-asignar prospectos al operador que lo creó 2024-01-28 16:36:34 -05:00
99de45dd32 Refactor(Asignación de prospectos): Se generaliza método para implementarlo en reassign_by_operator 2024-01-28 15:01:16 -05:00
950b9350cc refactor(Asignación de prospectos a operarios): Se extrae clase 2024-01-28 14:00:01 -05:00
6f69709823 refactor(Asignación de prospectos): se extrae método 2024-01-28 13:54:26 -05:00
22 changed files with 256 additions and 214 deletions

View File

@@ -1,33 +1,33 @@
from trytond.pool import Pool from trytond.pool import Pool
# Prospect Core # Prospect Core
from core.Prospect.models.prospect import Prospect from .core.Prospect.models.prospect import Prospect
from core.Prospect.models.contact_method import ContactMethod from .core.Prospect.models.contact_method import ContactMethod
from core.Prospect.wizards.assign_operator \ from .core.Prospect.wizards.assign_operator \
import AssignOperator, AssignOperatorStart import AssignOperator, AssignOperatorStart
from core.Prospect.wizards.reassign_prospect_by_prospect \ 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
# Prospect Trace Core # Prospect Trace Core
from core.ProspectTrace.wizards.make_call \ from .core.ProspectTrace.wizards.make_call \
import MakeCall, MakeCallAsk, MakeCallAskTask, MakeCallStart import MakeCall, MakeCallAsk, MakeCallAskTask, MakeCallStart
from core.ProspectTrace.wizards.schedule_call \ from .core.ProspectTrace.wizards.schedule_call \
import ScheduleCall, ScheduleCallStart import ScheduleCall, ScheduleCallStart
from core.ProspectTrace.models.prospect_trace \ from .core.ProspectTrace.models.prospect_trace \
import ProspectTrace import ProspectTrace
# Call Core # Call Core
from core.Call.models.call import Call from .core.Call.models.call import Call
from core.Call.models.pending_call import PendingCall from .core.Call.models.pending_call import PendingCall
from core.Call.models.pending_task import PendingTask from .core.Call.models.pending_task import PendingTask
# Role core # Role core
from core.Role.models.user import User from .core.Role.models.user import User
from locations import city from .locations import city
from locations import department from .locations import department
__all__ = ['register'] __all__ = ['register']

View File

@@ -22,6 +22,8 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_call_tree"> <record model="ir.action.act_window" id="act_call_tree">
<field name="name">Calls</field> <field name="name">Calls</field>
<field name="res_model">sale.call</field> <field name="res_model">sale.call</field>
<field name="domain"
eval="[('operator_who_called', '=', Eval('_user'))]" pyson="1"/>
</record> </record>
<record model="ir.ui.view" id="call_view_tree"> <record model="ir.ui.view" id="call_view_tree">
<field name="model">sale.call</field> <field name="model">sale.call</field>
@@ -78,6 +80,9 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_pending_task_tree"> <record model="ir.action.act_window" id="act_pending_task_tree">
<field name="name">Pending tasks</field> <field name="name">Pending tasks</field>
<field name="res_model">sale.pending_task</field> <field name="res_model">sale.pending_task</field>
<field name="domain"
eval="[If(Eval('context', {}).get('user_admin', None), (), ('prospect_trace.prospect_assigned_operator', '=', Eval('_user')))]"
pyson="1"/>
</record> </record>
<record model="ir.ui.view" id="pending_task_view_tree"> <record model="ir.ui.view" id="pending_task_view_tree">
<field name="model">sale.pending_task</field> <field name="model">sale.pending_task</field>

0
core/Call/__init__.py Normal file
View File

View File

@@ -3,9 +3,9 @@
from trytond.model import ModelSQL, ModelView, fields from trytond.model import ModelSQL, ModelView, fields
from datetime import date from datetime import date
from selections.interest import Interest from ....selections.interest import Interest
from selections.call_types import CallTypes from ....selections.call_types import CallTypes
from selections.call_results import CallResults from ....selections.call_results import CallResults
class Call(ModelSQL, ModelView): class Call(ModelSQL, ModelView):

View File

@@ -1,11 +1,10 @@
# 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.
from trytond.model import Workflow, ModelSQL, ModelView, fields
from trytond.model import ModelSQL, ModelView, fields
from trytond.pyson import Eval from trytond.pyson import Eval
class PendingTask(ModelSQL, ModelView): class PendingTask(Workflow, ModelSQL, ModelView):
'Tarea a realizar a un seguimiento de prospecto' 'Tarea a realizar a un seguimiento de prospecto'
__name__ = "sale.pending_task" __name__ = "sale.pending_task"
@@ -27,18 +26,21 @@ class PendingTask(ModelSQL, ModelView):
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):
super(PendingTask, cls).__setup__() super(PendingTask, cls).__setup__()
cls._transitions |= set((
('pending', 'done'),
))
cls._buttons.update({ cls._buttons.update({
'close_task': { 'close_task': {
'invisible': Eval('state') == 'done' 'invisible': ~Eval('state').in_(['pending']),
'depends':['state']
} }
}) })
@classmethod @classmethod
@ModelView.button @ModelView.button
@Workflow.transition('done')
def close_task(cls, tasks): def close_task(cls, tasks):
for task in tasks: pass
task.state = 'done'
task.save()
@classmethod @classmethod
def default_state(cls): def default_state(cls):

View File

View File

@@ -3,6 +3,9 @@
from trytond.model import ModelSQL, ModelView, fields, DeactivableMixin from trytond.model import ModelSQL, ModelView, fields, DeactivableMixin
from trytond.pyson import Eval, If from trytond.pyson import Eval, If
from trytond.transaction import Transaction
from trytond.pool import Pool
from ....core.Prospect.wizards.assign_operator import GenericAssign
class Prospect(ModelSQL, ModelView, DeactivableMixin): class Prospect(ModelSQL, ModelView, DeactivableMixin):
@@ -59,3 +62,19 @@ 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
@classmethod
def create(cls, values):
user_id = Transaction().user
records = super().create(values)
cls.try_assign_to_current_operator(records, user_id)
return records
@classmethod
def try_assign_to_current_operator(cls, prospects, user_id):
User = Pool().get('res.user')
user, = User.search([('id', '=', user_id)])
if user.is_operator:
GenericAssign.assign_prospects_to_operator(prospects, user)

View File

@@ -7,6 +7,29 @@ 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.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
GenericAssign.assign_prospects_to_operator(_prospects, _operator)
return 'end'
class AssignOperatorStart(ModelView): class AssignOperatorStart(ModelView):
'Inicio de asignación de operador' 'Inicio de asignación de operador'
@@ -47,37 +70,39 @@ class AssignOperatorStart(ModelView):
limit=self.prospects_chunk) limit=self.prospects_chunk)
class AssignOperator(Wizard): class GenericAssign():
'Asignar operador a prospecto' @classmethod
__name__ = 'sale.prospect.assign' def assign_prospects_to_operator(cls, prospects, operator):
for prospect in prospects:
start = StateView( prospect.assigned_operator = operator
'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.state = 'assigned'
prospect.prospect_trace = cls._get_prosp_trace(prospect, operator)
prospect.save() prospect.save()
@classmethod
def _get_prosp_trace(cls, prospect, operator):
ProspectTrace = Pool().get('sale.prospect_trace')
prospect_trace = ProspectTrace.search([('prospect', '=', prospect)])
if not prospect_trace:
created_trace = cls._create_base_prospect_trace(prospect, operator)
prospect_trace.append(created_trace)
prospect_trace, = prospect_trace
prospect_trace.prospect_assigned_operator = operator
prospect_trace.save()
return prospect_trace
@staticmethod
def _create_base_prospect_trace(prospect, operator) -> ProspectTrace:
ProspectTrace = Pool().get('sale.prospect_trace')
prospect_trace = ProspectTrace( prospect_trace = ProspectTrace(
prospect=prospect, prospect=prospect,
prospect_city=prospect.city, prospect_city=prospect.city,
prospect_business_unit=prospect.business_unit, prospect_business_unit=prospect.business_unit,
prospect_assigned_operator=prospect.assigned_operator,
prospect_contacts=prospect.contact_methods prospect_contacts=prospect.contact_methods
) )
prospect_trace.save()
prospect.prospect_trace = prospect_trace return prospect_trace
prospect.save()
return 'end'

View File

@@ -6,6 +6,8 @@ from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.model import ModelView, fields from trytond.model import ModelView, fields
from trytond.pool import Pool from trytond.pool import Pool
from ....core.Prospect.wizards.assign_operator import GenericAssign
class ReassignProspectByOperatorStart(ModelView): class ReassignProspectByOperatorStart(ModelView):
'Inicio de reasignación de prospecto por operario' 'Inicio de reasignación de prospecto por operario'
@@ -43,19 +45,9 @@ class ReassignProspectByOperator(Wizard):
reassign_by_operator = StateTransition() reassign_by_operator = StateTransition()
def transition_reassign_by_operator(self): def transition_reassign_by_operator(self):
pool = Pool() _prospects = self.start.prospects
ProspectTrace = pool.get('sale.prospect_trace') _operator = self.start.new_operator
for prospect in self.start.prospects: GenericAssign.assign_prospects_to_operator(_prospects, _operator)
prospect.assigned_operator = self.start.new_operator
if prospect.prospect_trace:
prospect_trace, = ProspectTrace.search(
[('prospect', '=', prospect)])
prospect_trace.prospect_assigned_operator =\
self.start.new_operator
prospect_trace.save()
prospect.save()
return 'end' return 'end'

View File

@@ -1,10 +1,10 @@
# 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.
from trytond.wizard import Wizard, StateView, Button, StateTransition from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.model import ModelView, fields from trytond.model import ModelView, fields
from trytond.pool import Pool
from ....core.Prospect.wizards.assign_operator import GenericAssign
class ReassignProspectByProspectStart(ModelView): class ReassignProspectByProspectStart(ModelView):
@@ -32,17 +32,9 @@ class ReasignProspectByProspect(Wizard):
reassign_by_prospect = StateTransition() reassign_by_prospect = StateTransition()
def transition_reassign_by_prospect(self): def transition_reassign_by_prospect(self):
pool = Pool() _prospect = self.start.prospect
ProspectTrace = pool.get('sale.prospect_trace') _operator = self.start.new_operator
self.start.prospect.assigned_operator = self.start.new_operator GenericAssign.assign_prospects_to_operator([_prospect], _operator)
if self.start.prospect.prospect_trace:
prospect_trace, = ProspectTrace.search(
[('prospect', '=', self.start.prospect)])
prospect_trace.prospect_assigned_operator =\
self.start.new_operator
prospect_trace.save()
self.start.prospect.save()
return 'end' return 'end'

View File

View File

@@ -3,7 +3,7 @@
from trytond.model import ModelSQL, ModelView, fields from trytond.model import ModelSQL, ModelView, fields
from trytond.pyson import Eval from trytond.pyson import Eval
from selections.interest import Interest from ....selections.interest import Interest
class ProspectTrace(ModelSQL, ModelView): class ProspectTrace(ModelSQL, ModelView):

View File

@@ -5,8 +5,8 @@ from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.model import ModelView, fields from trytond.model import ModelView, fields
from trytond.pool import Pool from trytond.pool import Pool
from trytond.pyson import Eval from trytond.pyson import Eval
from selections.call_types import CallTypes from ....selections.call_types import CallTypes
from selections.interest import Interest from ....selections.interest import Interest
from datetime import datetime from datetime import datetime

View File

@@ -5,7 +5,7 @@ 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 datetime import datetime from datetime import datetime
from core.ProspectTrace.wizards.make_call import MakeCall from ....core.ProspectTrace.wizards.make_call import MakeCall
class ScheduleCallStart(ModelView): class ScheduleCallStart(ModelView):

0
core/Role/__init__.py Normal file
View File

View File

@@ -10,6 +10,7 @@ class User(metaclass=PoolMeta):
__name__ = 'res.user' __name__ = 'res.user'
user_admin = fields.Boolean('Is Admin') user_admin = fields.Boolean('Is Admin')
is_operator = fields.Boolean('Is Operator')
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):

0
core/__init__.py Normal file
View File

View File

@@ -30,6 +30,10 @@ msgctxt "field:res.user,user_admin:"
msgid "Is Admin" msgid "Is Admin"
msgstr "Es Administrador" msgstr "Es Administrador"
msgctxt "field:res.user,is_operator:"
msgid "Is Operator"
msgstr "Es Operador"
msgctxt "field:sale.prospect_trace,prospect:" msgctxt "field:sale.prospect_trace,prospect:"
msgid "Prospect" msgid "Prospect"
msgstr "Prospecto" msgstr "Prospecto"

View File

@@ -8,22 +8,22 @@ this repository contains the full copyright notices and license terms. -->
</record> </record>
<record model="res.group" id="group_prospect_admin"> <record model="res.group" id="group_prospect_admin">
<field name="name">Prospect Administrator</field> <field name="name">Prospect Administrator</field>
<field name="parent" ref="group_prospect"/> <field name="parent" ref="group_prospect" />
</record> </record>
<record model="res.user-res.group" id="user_admin_group_prospect"> <record model="res.user-res.group" id="user_admin_group_prospect">
<field name="user" ref="res.user_admin"/> <field name="user" ref="res.user_admin" />
<field name="group" ref="group_prospect"/> <field name="group" ref="group_prospect" />
</record> </record>
<record model="res.user-res.group" id="user_admin_group_prospect_admin"> <record model="res.user-res.group" id="user_admin_group_prospect_admin">
<field name="user" ref="res.user_admin"/> <field name="user" ref="res.user_admin" />
<field name="group" ref="group_prospect_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">
@@ -37,39 +37,39 @@ this repository contains the full copyright notices and license terms. -->
<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">
@@ -87,14 +87,14 @@ this repository contains the full copyright notices and license terms. -->
<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">
@@ -109,17 +109,17 @@ this repository contains the full copyright notices and license terms. -->
<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">
@@ -136,18 +136,18 @@ this repository contains the full copyright notices and license terms. -->
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>
@@ -162,24 +162,24 @@ this repository contains the full copyright notices and license terms. -->
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"> <record model="ir.model.access" id="access_sale">
<field name="model" search="[('model', '=', 'sale.prospect')]"/> <field name="model" search="[('model', '=', 'sale.prospect')]" />
<field name="perm_read" eval="False"/> <field name="perm_read" eval="False" />
<field name="perm_write" eval="False"/> <field name="perm_write" eval="False" />
<field name="perm_create" eval="False"/> <field name="perm_create" eval="False" />
<field name="perm_delete" eval="False"/> <field name="perm_delete" eval="False" />
</record> </record>
<record model="ir.model.access" id="access_sale_prospect"> <record model="ir.model.access" id="access_sale_prospect">
<field name="model" search="[('model', '=', 'sale.prospect')]"/> <field name="model" search="[('model', '=', 'sale.prospect')]" />
<field name="group" ref="group_prospect"/> <field name="group" ref="group_prospect" />
<field name="perm_read" eval="True"/> <field name="perm_read" eval="True" />
<field name="perm_write" eval="True"/> <field name="perm_write" eval="True" />
<field name="perm_create" eval="True"/> <field name="perm_create" eval="True" />
<field name="perm_delete" eval="True"/> <field name="perm_delete" eval="True" />
</record> </record>
</data> </data>
</tryton> </tryton>

View File

@@ -1,35 +1,35 @@
.. Importaciones:: Importaciones::
.. >>> from proteus import Model, Wizard >>> from proteus import Model, Wizard
.. >>> from trytond.tests.tools import activate_modules >>> from trytond.transaction import Transaction
>>> from trytond.tests.tools import activate_modules, set_user
.. Activar módulos:: Activar módulos::
.. >>> config = activate_modules('sale_opportunity_management') >>> config = activate_modules('sale_opportunity_management')
Crear operario::
>>> User = Model.get('res.user')
>>> operator, = User.find([('name', '=', 'Administrator')])
>>> operator.is_operator = True
>>> operator.save()
>>> set_user(operator.id)
Crear prospecto::
>>> Prospect = Model.get('sale.prospect')
>>> prospect = Prospect()
>>> prospect.name = 'Assignable To Me S.A.S'
>>> contact_method = prospect.contact_methods.new(value='123123123', name='Ricardo', job='Infraestructura')
>>> prospect.business_unit = 'brigade'
>>> prospect.save()
.. Crear operario:: [ Se inició seguimiento, asignado al operador que lo creó ]
.. >>> User = Model.get('res.user') >>> ProspectTrace = Model.get('sale.prospect_trace')
.. >>> operator = User(name="Operario", login="operario") >>> prospect_trace, = ProspectTrace.find([('prospect', '=', prospect)])
>>> assigned_operator_id = prospect_trace.prospect_assigned_operator.id
.. Crear prospecto:: >>> assert operator.id == assigned_operator_id
>>> assert prospect.assigned_operator.id == assigned_operator_id
.. >>> Prospect = Model.get('sale.prospect')
.. >>> prospect = Prospect()
.. >>> prospect.name = 'Assignable To Me S.A.S'
.. >>> contact_method = prospect.contact_methods.new(value='123123123', name='Ricardo', job='Infraestructura')
.. >>> 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')
.. [ Se inició seguimiento, asignado al operador que lo creó ]
.. >>> ProspectTrace = Model.get('sale.prospect_trace')
.. >>> prospect_trace, = ProspectTrace.find([('prospect', '=', prospect)])
.. >>> prospect_trace.prospect_assigned_operator.id
.. operator.id

View File

@@ -2,17 +2,17 @@
<!-- 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>

View File

@@ -3,7 +3,9 @@
this repository contains the full copyright notices and license terms. --> this repository contains the full copyright notices and license terms. -->
<data> <data>
<xpath expr="//field[@name='name']" position="after"> <xpath expr="//field[@name='name']" position="after">
<label name="user_admin"/> <label name="user_admin" />
<field name="user_admin"/> <field name="user_admin" />
<label name="is_operator" />
<field name="is_operator" />
</xpath> </xpath>
</data> </data>