12 Commits

20 changed files with 240 additions and 205 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']

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

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()
prospect_trace = ProspectTrace( @classmethod
prospect=prospect, def _get_prosp_trace(cls, prospect, operator):
prospect_city=prospect.city, ProspectTrace = Pool().get('sale.prospect_trace')
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_trace = ProspectTrace.search([('prospect', '=', prospect)])
prospect.save()
return 'end' 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=prospect,
prospect_city=prospect.city,
prospect_business_unit=prospect.business_unit,
prospect_contacts=prospect.contact_methods
)
return prospect_trace

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

@@ -3,27 +3,27 @@
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">
@@ -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,20 +87,20 @@ 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">
<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>
@@ -109,23 +109,23 @@ 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">
<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>
@@ -136,50 +136,50 @@ 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>
<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')]"/>
<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"> <record model="ir.model.access" id="access_sale">
<field name="model" search="[('model', '=', 'sale.prospect')]"/> <field name="model" search="[('model', '=', 'sale.prospect')]" />
<field name="group" ref="group_prospect"/> <field name="perm_read" eval="False" />
<field name="perm_read" eval="True"/> <field name="perm_write" eval="False" />
<field name="perm_write" eval="True"/> <field name="perm_create" eval="False" />
<field name="perm_create" eval="True"/> <field name="perm_delete" eval="False" />
<field name="perm_delete" eval="True"/>
</record> </record>
</data>
<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> </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,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

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