11 Commits

22 changed files with 232 additions and 197 deletions

View File

@@ -1,30 +1,30 @@
from trytond.pool import Pool
# Prospect Core
from core.Prospect.models.prospect import Prospect
from core.Prospect.models.contact_method import ContactMethod
from core.Prospect.wizards.assign_operator \
from source.models.prospect import Prospect
from source.models.contact_method import ContactMethod
from source.wizards.assign_operator \
import AssignOperator, AssignOperatorStart
from core.Prospect.wizards.reassign_prospect_by_prospect \
from source.wizards.reassign_prospect_by_prospect \
import ReasignProspectByProspect, ReassignProspectByProspectStart
from core.Prospect.wizards.reassign_prospect_by_operator \
from source.wizards.reassign_prospect_by_operator \
import ReassignProspectByOperator, ReassignProspectByOperatorStart
# Prospect Trace Core
from core.ProspectTrace.wizards.make_call \
from source.wizards.make_call \
import MakeCall, MakeCallAsk, MakeCallAskTask, MakeCallStart
from core.ProspectTrace.wizards.schedule_call \
from source.wizards.schedule_call \
import ScheduleCall, ScheduleCallStart
from core.ProspectTrace.models.prospect_trace \
from source.models.prospect_trace \
import ProspectTrace
# Call Core
from core.Call.models.call import Call
from core.Call.models.pending_call import PendingCall
from core.Call.models.pending_task import PendingTask
from source.models.call import Call
from source.models.pending_call import PendingCall
from source.models.pending_task import PendingTask
# Role core
from core.Role.models.user import User
from source.models.user import User
from locations import city
from locations import department

View File

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

View File

@@ -164,6 +164,7 @@ this repository contains the full copyright notices and license terms. -->
id="menu_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" />
@@ -181,5 +182,4 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_delete" eval="True" />
</record>
</data>
</tryton>

View File

@@ -3,6 +3,9 @@
from trytond.model import ModelSQL, ModelView, fields, DeactivableMixin
from trytond.pyson import Eval, If
from trytond.transaction import Transaction
from trytond.pool import Pool
from source.wizards.assign_operator import GenericAssign
class Prospect(ModelSQL, ModelView, DeactivableMixin):
@@ -59,3 +62,19 @@ class Prospect(ModelSQL, ModelView, DeactivableMixin):
def on_change_city(self):
if self.city:
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

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

View File

@@ -7,6 +7,29 @@ from trytond.model import ModelView, fields
from trytond.pyson import Eval
from trytond.pool import Pool
from source.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):
'Inicio de asignación de operador'
@@ -47,37 +70,39 @@ class AssignOperatorStart(ModelView):
limit=self.prospects_chunk)
class AssignOperator(Wizard):
'Asignar operador a prospecto'
__name__ = 'sale.prospect.assign'
start = StateView(
'sale.prospect.assign.start',
'sale_opportunity_management.assign_start_view_form', [
Button("Cancel", 'end', 'tryton-cancel'),
Button("Assign", 'assign', 'tryton-ok', default=True)])
assign = StateTransition()
def transition_assign(self):
pool = Pool()
ProspectTrace = pool.get('sale.prospect_trace')
for prospect in self.start.prospects:
prospect.assigned_operator = self.start.operator
class GenericAssign():
@classmethod
def assign_prospects_to_operator(cls, prospects, operator):
for prospect in prospects:
prospect.assigned_operator = operator
prospect.state = 'assigned'
prospect.prospect_trace = cls._get_prosp_trace(prospect, operator)
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=prospect,
prospect_city=prospect.city,
prospect_business_unit=prospect.business_unit,
prospect_assigned_operator=prospect.assigned_operator,
prospect_contacts=prospect.contact_methods
)
prospect_trace.save()
prospect.prospect_trace = prospect_trace
prospect.save()
return 'end'
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.pool import Pool
from source.wizards.assign_operator import GenericAssign
class ReassignProspectByOperatorStart(ModelView):
'Inicio de reasignación de prospecto por operario'
@@ -43,19 +45,9 @@ class ReassignProspectByOperator(Wizard):
reassign_by_operator = StateTransition()
def transition_reassign_by_operator(self):
pool = Pool()
ProspectTrace = pool.get('sale.prospect_trace')
_prospects = self.start.prospects
_operator = self.start.new_operator
for prospect in self.start.prospects:
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()
GenericAssign.assign_prospects_to_operator(_prospects, _operator)
return 'end'

View File

@@ -1,10 +1,10 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.model import ModelView, fields
from trytond.pool import Pool
from source.wizards.assign_operator import GenericAssign
class ReassignProspectByProspectStart(ModelView):
@@ -32,17 +32,9 @@ class ReasignProspectByProspect(Wizard):
reassign_by_prospect = StateTransition()
def transition_reassign_by_prospect(self):
pool = Pool()
ProspectTrace = pool.get('sale.prospect_trace')
_prospect = self.start.prospect
_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'

View File

@@ -5,7 +5,7 @@ from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.model import ModelView, fields
from trytond.pyson import Eval
from datetime import datetime
from core.ProspectTrace.wizards.make_call import MakeCall
from source.wizards.make_call import MakeCall
class ScheduleCallStart(ModelView):

View File

@@ -1,35 +1,35 @@
.. Importaciones::
Importaciones::
.. >>> from proteus import Model, Wizard
.. >>> from trytond.tests.tools import activate_modules
>>> from proteus import Model, Wizard
>>> 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::
.. >>> User = Model.get('res.user')
.. >>> operator = User(name="Operario", login="operario")
.. 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()
.. [ 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
[ Se inició seguimiento, asignado al operador que lo creó ]
>>> ProspectTrace = Model.get('sale.prospect_trace')
>>> prospect_trace, = ProspectTrace.find([('prospect', '=', prospect)])
>>> assigned_operator_id = prospect_trace.prospect_assigned_operator.id
>>> assert operator.id == assigned_operator_id
>>> assert prospect.assigned_operator.id == assigned_operator_id

View File

@@ -5,5 +5,7 @@
<xpath expr="//field[@name='name']" position="after">
<label name="user_admin" />
<field name="user_admin" />
<label name="is_operator" />
<field name="is_operator" />
</xpath>
</data>