Compare commits
14 Commits
cd0564c95f
...
6.8
| Author | SHA1 | Date | |
|---|---|---|---|
| b7e06a3408 | |||
| 9096983ffd | |||
| 660ac06c1d | |||
| 7b0bafa05f | |||
| 4d88f9423d | |||
| e0f3846bb5 | |||
| ef8f45267f | |||
| 5cc0277db9 | |||
| 3f7b989781 | |||
| 6c31dfb64f | |||
| b1c3b21a9c | |||
| 99de45dd32 | |||
| 950b9350cc | |||
| 6f69709823 |
28
__init__.py
28
__init__.py
@@ -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']
|
||||||
|
|
||||||
|
|||||||
9
call.xml
9
call.xml
@@ -21,7 +21,9 @@ 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>
|
||||||
@@ -77,7 +79,10 @@ 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
0
core/Call/__init__.py
Normal 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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
0
core/Prospect/__init__.py
Normal file
0
core/Prospect/__init__.py
Normal 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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
0
core/ProspectTrace/__init__.py
Normal file
0
core/ProspectTrace/__init__.py
Normal 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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
0
core/Role/__init__.py
Normal 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
0
core/__init__.py
Normal 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"
|
||||||
|
|||||||
170
prospect.xml
170
prospect.xml
@@ -3,183 +3,183 @@
|
|||||||
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.model.access" id="access_sale">
|
||||||
<field name="perm_read" eval="False"/>
|
<field name="model" search="[('model', '=', 'sale.prospect')]" />
|
||||||
<field name="perm_write" eval="False"/>
|
<field name="perm_read" eval="False" />
|
||||||
<field name="perm_create" eval="False"/>
|
<field name="perm_write" eval="False" />
|
||||||
<field name="perm_delete" eval="False"/>
|
<field name="perm_create" eval="False" />
|
||||||
</record>
|
<field name="perm_delete" eval="False" />
|
||||||
|
|
||||||
<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>
|
</record>
|
||||||
</data>
|
|
||||||
|
|
||||||
</tryton>
|
<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>
|
||||||
@@ -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
|
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user