Compare commits
18 Commits
a7bf0f2a38
...
7.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4fe42e15a | ||
| d1ad40203b | |||
| 9c368809f9 | |||
| e40991de02 | |||
| b8ba775733 | |||
| 336a266578 | |||
| 22fb3736a7 | |||
| 5cc7ef011d | |||
| 72ae0cfa22 | |||
| 0b7d15f35b | |||
| 8a0aa29368 | |||
| f71e6f4671 | |||
| cf874db55f | |||
| e97e8fa99d | |||
| 5a2c5217a6 | |||
| d50cca2924 | |||
| c1be04d009 | |||
| 214c6fc089 |
@@ -15,6 +15,7 @@ def register():
|
|||||||
user.User,
|
user.User,
|
||||||
pending_call.PendingCall,
|
pending_call.PendingCall,
|
||||||
call.Call,
|
call.Call,
|
||||||
|
call.PendingTask,
|
||||||
department.Department,
|
department.Department,
|
||||||
city.City,
|
city.City,
|
||||||
prospect.ContactMethod,
|
prospect.ContactMethod,
|
||||||
@@ -24,6 +25,7 @@ def register():
|
|||||||
prospect_trace.ScheduleCallStart,
|
prospect_trace.ScheduleCallStart,
|
||||||
prospect_trace.MakeCallStart,
|
prospect_trace.MakeCallStart,
|
||||||
prospect_trace.MakeCallAsk,
|
prospect_trace.MakeCallAsk,
|
||||||
|
prospect_trace.MakeCallAskTask,
|
||||||
prospect.ReassignProspectByOperatorStart,
|
prospect.ReassignProspectByOperatorStart,
|
||||||
prospect.ReassignProspectByProspectStart,
|
prospect.ReassignProspectByProspectStart,
|
||||||
module='sale_opportunity_management', type_='model')
|
module='sale_opportunity_management', type_='model')
|
||||||
|
|||||||
43
call.py
43
call.py
@@ -1,7 +1,6 @@
|
|||||||
from trytond.model import ModelSQL, ModelView, fields
|
from trytond.model import ModelSQL, ModelView, fields
|
||||||
|
from trytond.pyson import Eval
|
||||||
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
|
||||||
@@ -47,3 +46,43 @@ class Call(ModelSQL, ModelView):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def default_date(cls):
|
def default_date(cls):
|
||||||
return date.today()
|
return date.today()
|
||||||
|
|
||||||
|
|
||||||
|
class PendingTask(ModelSQL, ModelView):
|
||||||
|
'Tarea a realizar a un seguimiento de prospecto'
|
||||||
|
__name__ = "sale.pending_task"
|
||||||
|
|
||||||
|
description = fields.Text(
|
||||||
|
'Description', required=True,
|
||||||
|
states={
|
||||||
|
'readonly': Eval('state') == 'done'
|
||||||
|
})
|
||||||
|
|
||||||
|
state = fields.Selection(
|
||||||
|
[('pending', 'Pending'),
|
||||||
|
('done', 'Done')],
|
||||||
|
'State')
|
||||||
|
|
||||||
|
prospect_trace = fields.Many2One(
|
||||||
|
'sale.prospect_trace', 'Prospect trace',
|
||||||
|
required=True, readonly=True)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def __setup__(cls):
|
||||||
|
super(PendingTask, cls).__setup__()
|
||||||
|
cls._buttons.update({
|
||||||
|
'close_task': {
|
||||||
|
'invisible': Eval('state') == 'done'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@ModelView.button
|
||||||
|
def close_task(cls, tasks):
|
||||||
|
for task in tasks:
|
||||||
|
task.state = 'done'
|
||||||
|
task.save()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def default_state(cls):
|
||||||
|
return 'pending'
|
||||||
|
|||||||
66
call.xml
66
call.xml
@@ -23,7 +23,6 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="name">Calls</field>
|
<field name="name">Calls</field>
|
||||||
<field name="res_model">sale.call</field>
|
<field name="res_model">sale.call</field>
|
||||||
</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>
|
||||||
<field name="type">tree</field>
|
<field name="type">tree</field>
|
||||||
@@ -34,7 +33,6 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="type">form</field>
|
<field name="type">form</field>
|
||||||
<field name="name">call_form</field>
|
<field name="name">call_form</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.action.act_window.view" id="act_call_tree_view1">
|
<record model="ir.action.act_window.view" id="act_call_tree_view1">
|
||||||
<field name="sequence" eval="10"/>
|
<field name="sequence" eval="10"/>
|
||||||
<field name="view" ref="call_view_tree"/>
|
<field name="view" ref="call_view_tree"/>
|
||||||
@@ -45,11 +43,6 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="view" ref="call_view_form"/>
|
<field name="view" ref="call_view_form"/>
|
||||||
<field name="act_window" ref="act_call_tree"/>
|
<field name="act_window" ref="act_call_tree"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.icon" id="call_icon">
|
|
||||||
<field name="name">tryton-phone</field>
|
|
||||||
<field name="path">icons/tryton-phone.svg</field>
|
|
||||||
</record>
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Calls"
|
name="Calls"
|
||||||
sequence="10"
|
sequence="10"
|
||||||
@@ -66,7 +59,6 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="menu" ref="menu_calls_tree"/>
|
<field name="menu" ref="menu_calls_tree"/>
|
||||||
<field name="group" ref="group_call"/>
|
<field name="group" ref="group_call"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.model.access" id="access_calls">
|
<record model="ir.model.access" id="access_calls">
|
||||||
<field name="model" search="[('model', '=', 'sale.call')]"/>
|
<field name="model" search="[('model', '=', 'sale.call')]"/>
|
||||||
<field name="perm_read" eval="False"/>
|
<field name="perm_read" eval="False"/>
|
||||||
@@ -74,7 +66,6 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<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_calls_calls">
|
<record model="ir.model.access" id="access_calls_calls">
|
||||||
<field name="model" search="[('model', '=', 'sale.call')]"/>
|
<field name="model" search="[('model', '=', 'sale.call')]"/>
|
||||||
<field name="group" ref="group_call"/>
|
<field name="group" ref="group_call"/>
|
||||||
@@ -83,5 +74,62 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<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>
|
||||||
|
|
||||||
|
<record model="ir.action.act_window" id="act_pending_task_tree">
|
||||||
|
<field name="name">Pending tasks</field>
|
||||||
|
<field name="res_model">sale.pending_task</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.ui.view" id="pending_task_view_tree">
|
||||||
|
<field name="model">sale.pending_task</field>
|
||||||
|
<field name="type">tree</field>
|
||||||
|
<field name="name">pending_task_tree</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.ui.view" id="pending_task_view_form">
|
||||||
|
<field name="model">sale.pending_task</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="name">pending_task_form</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.view" id="act_pending_task_tree_view1">
|
||||||
|
<field name="sequence" eval="30"/>
|
||||||
|
<field name="view" ref="pending_task_view_tree"/>
|
||||||
|
<field name="act_window" ref="act_pending_task_tree"/>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.view" id="act_pending_task_form_view1">
|
||||||
|
<field name="sequence" eval="40"/>
|
||||||
|
<field name="view" ref="pending_task_view_form"/>
|
||||||
|
<field name="act_window" ref="act_pending_task_tree"/>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.domain" id="act_task_domain_pending">
|
||||||
|
<field name="name">Pending</field>
|
||||||
|
<field name="sequence" eval="10"/>
|
||||||
|
<field name="domain" eval="[('state', '=', 'pending')]" pyson="1"/>
|
||||||
|
<field name="count" eval="True"/>
|
||||||
|
<field name="act_window" ref="act_pending_task_tree"/>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.domain" id="act_task_domain_done">
|
||||||
|
<field name="name">Done</field>
|
||||||
|
<field name="sequence" eval="20"/>
|
||||||
|
<field name="domain" eval="[('state', '=', 'done')]" pyson="1"/>
|
||||||
|
<field name="count" eval="True"/>
|
||||||
|
<field name="act_window" ref="act_pending_task_tree"/>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.domain" id="act_task_domain_all">
|
||||||
|
<field name="name">All</field>
|
||||||
|
<field name="sequence" eval="9999"/>
|
||||||
|
<field name="domain"/>
|
||||||
|
<field name="count" eval="True"/>
|
||||||
|
<field name="act_window" ref="act_pending_task_tree"/>
|
||||||
|
</record>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_calls"
|
||||||
|
sequence="60"
|
||||||
|
id="menu_pending_tasks"
|
||||||
|
action="act_pending_task_tree"
|
||||||
|
icon="tryton-graph"/>
|
||||||
|
<record model="ir.model.button" id="close_task_button">
|
||||||
|
<field name="name">close_task</field>
|
||||||
|
<field name="string">Close task</field>
|
||||||
|
<field name="model" search="[('model', '=', 'sale.pending_task')]"/>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
|
|||||||
@@ -27,5 +27,9 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="name">tryton-target</field>
|
<field name="name">tryton-target</field>
|
||||||
<field name="path">icons/tryton-target.svg</field>
|
<field name="path">icons/tryton-target.svg</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record model="ir.ui.icon" id="call_icon">
|
||||||
|
<field name="name">tryton-phone</field>
|
||||||
|
<field name="path">icons/tryton-phone.svg</field>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
79
locale/es.po
79
locale/es.po
@@ -2,10 +2,6 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||||
|
|
||||||
msgctxt "field:res.user,user_admin:"
|
|
||||||
msgid "Is Admin"
|
|
||||||
msgstr "Es Administrador"
|
|
||||||
|
|
||||||
msgctxt "model:res.group,name:group_prospect"
|
msgctxt "model:res.group,name:group_prospect"
|
||||||
msgid "Prospects"
|
msgid "Prospects"
|
||||||
msgstr "Prospectos"
|
msgstr "Prospectos"
|
||||||
@@ -30,6 +26,10 @@ msgctxt "model:res.group,name:group_prospect_trace_admin"
|
|||||||
msgid "Traces Administrator"
|
msgid "Traces Administrator"
|
||||||
msgstr "Administración de Seguimientos"
|
msgstr "Administración de Seguimientos"
|
||||||
|
|
||||||
|
msgctxt "field:res.user,user_admin:"
|
||||||
|
msgid "Is Admin"
|
||||||
|
msgstr "Es Administrador"
|
||||||
|
|
||||||
msgctxt "field:sale.prospect_trace,prospect:"
|
msgctxt "field:sale.prospect_trace,prospect:"
|
||||||
msgid "Prospect"
|
msgid "Prospect"
|
||||||
msgstr "Prospecto"
|
msgstr "Prospecto"
|
||||||
@@ -76,7 +76,11 @@ msgstr "Unidad de negocio"
|
|||||||
|
|
||||||
msgctxt "view:sale.prospect:"
|
msgctxt "view:sale.prospect:"
|
||||||
msgid "Contact methods"
|
msgid "Contact methods"
|
||||||
msgstr "Metodos de contacto"
|
msgstr "Métodos de contacto"
|
||||||
|
|
||||||
|
msgctxt "view:sale.prospect:"
|
||||||
|
msgid "About prospect"
|
||||||
|
msgstr "Tipificación del prospecto"
|
||||||
|
|
||||||
msgctxt "field:sale.prospect,contact_methods:"
|
msgctxt "field:sale.prospect,contact_methods:"
|
||||||
msgid "Contact methods"
|
msgid "Contact methods"
|
||||||
@@ -102,6 +106,14 @@ msgctxt "field:sale.prospect,prospect_trace:"
|
|||||||
msgid "Prospect trace"
|
msgid "Prospect trace"
|
||||||
msgstr "Seguimiento de prospecto"
|
msgstr "Seguimiento de prospecto"
|
||||||
|
|
||||||
|
msgctxt "field:sale.prospect,rating:"
|
||||||
|
msgid "Rating (1-5)"
|
||||||
|
msgstr "Calificación (1-5)"
|
||||||
|
|
||||||
|
msgctxt "field:sale.prospect,comments:"
|
||||||
|
msgid "Comments"
|
||||||
|
msgstr "Comentarios"
|
||||||
|
|
||||||
msgctxt "field:sale.call,date:"
|
msgctxt "field:sale.call,date:"
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Fecha"
|
msgstr "Fecha"
|
||||||
@@ -226,6 +238,21 @@ msgctxt "field:sale.prospect_trace.make_call.ask,datetime:"
|
|||||||
msgid "Date time"
|
msgid "Date time"
|
||||||
msgstr "Fecha y hora"
|
msgstr "Fecha y hora"
|
||||||
|
|
||||||
|
msgctxt "field:sale.pending_task,description:"
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Descripción"
|
||||||
|
|
||||||
|
msgctxt "field:sale.pending_task,prospect_trace:"
|
||||||
|
msgid "Prospect trace"
|
||||||
|
msgstr "Seguimiento de prospecto"
|
||||||
|
|
||||||
|
msgctxt "field:sale.prospect_trace.make_call.start,schedule_task:"
|
||||||
|
msgid "Schedule task?"
|
||||||
|
msgstr "¿Agendar tarea?"
|
||||||
|
|
||||||
|
msgctxt "field:sale.prospect_trace.make_call.ask_task,task_description:"
|
||||||
|
msgid "Task description"
|
||||||
|
msgstr "Descripción de la tarea"
|
||||||
|
|
||||||
msgctxt "selection:sale.prospect,business_unit:"
|
msgctxt "selection:sale.prospect,business_unit:"
|
||||||
msgid "Brigade"
|
msgid "Brigade"
|
||||||
@@ -259,6 +286,10 @@ msgctxt "selection:prospect.contact_method,contact_type:"
|
|||||||
msgid "Mail"
|
msgid "Mail"
|
||||||
msgstr "Correo electrónico"
|
msgstr "Correo electrónico"
|
||||||
|
|
||||||
|
msgctxt "selection:sale.prospect,rating:"
|
||||||
|
msgid "None"
|
||||||
|
msgstr "Sin calificación"
|
||||||
|
|
||||||
msgctxt "selection:sale.prospect.assign.start,business_unit:"
|
msgctxt "selection:sale.prospect.assign.start,business_unit:"
|
||||||
msgid "Brigade"
|
msgid "Brigade"
|
||||||
msgstr "Brigada"
|
msgstr "Brigada"
|
||||||
@@ -387,6 +418,11 @@ msgctxt "selection:sale.call,call_business_unit:"
|
|||||||
msgid "Equipment"
|
msgid "Equipment"
|
||||||
msgstr "Equipos"
|
msgstr "Equipos"
|
||||||
|
|
||||||
|
msgctxt "selection:sale.prospect_trace.make_call.start,schedule_task:"
|
||||||
|
msgid "Yes"
|
||||||
|
msgstr "Si"
|
||||||
|
|
||||||
|
|
||||||
msgctxt "model:ir.ui.menu,name:menu_calls"
|
msgctxt "model:ir.ui.menu,name:menu_calls"
|
||||||
msgid "Calls"
|
msgid "Calls"
|
||||||
msgstr "Llamadas"
|
msgstr "Llamadas"
|
||||||
@@ -419,6 +455,10 @@ msgctxt "model:ir.ui.menu,name:menu_reassign_by_prospect_wizard"
|
|||||||
msgid "Reassign by prospect"
|
msgid "Reassign by prospect"
|
||||||
msgstr "Reasignar por prospecto"
|
msgstr "Reasignar por prospecto"
|
||||||
|
|
||||||
|
msgctxt "model:ir.ui.menu,name:menu_pending_tasks"
|
||||||
|
msgid "Pending tasks"
|
||||||
|
msgstr "Tareas pendientes"
|
||||||
|
|
||||||
|
|
||||||
msgctxt "model:ir.model.button,string:schedule_call_wizard_button"
|
msgctxt "model:ir.model.button,string:schedule_call_wizard_button"
|
||||||
msgid "Schedule call"
|
msgid "Schedule call"
|
||||||
@@ -436,6 +476,10 @@ msgctxt "model:ir.model.button,string:reopen_trace_button"
|
|||||||
msgid "Reopen trace"
|
msgid "Reopen trace"
|
||||||
msgstr "Reabrir seguimiento"
|
msgstr "Reabrir seguimiento"
|
||||||
|
|
||||||
|
msgctxt "model:ir.model.button,string:close_task_button"
|
||||||
|
msgid "Close task"
|
||||||
|
msgstr "Cerrar tarea"
|
||||||
|
|
||||||
|
|
||||||
msgctxt "wizard_button:sale.prospect_trace.make_call,start,end:"
|
msgctxt "wizard_button:sale.prospect_trace.make_call,start,end:"
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
@@ -451,7 +495,7 @@ msgstr "Cancelar"
|
|||||||
|
|
||||||
msgctxt "wizard_button:sale.prospect_trace.make_call,ask,schedule_call:"
|
msgctxt "wizard_button:sale.prospect_trace.make_call,ask,schedule_call:"
|
||||||
msgid "Schedule call"
|
msgid "Schedule call"
|
||||||
msgstr "Agendar"
|
msgstr "Agendar llamada"
|
||||||
|
|
||||||
msgctxt "wizard_button:sale.prospect_trace.schedule,start,end:"
|
msgctxt "wizard_button:sale.prospect_trace.schedule,start,end:"
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
@@ -459,7 +503,15 @@ msgstr "Cancelar"
|
|||||||
|
|
||||||
msgctxt "wizard_button:sale.prospect_trace.schedule,start,schedule:"
|
msgctxt "wizard_button:sale.prospect_trace.schedule,start,schedule:"
|
||||||
msgid "Schedule"
|
msgid "Schedule"
|
||||||
msgstr "Agendar"
|
msgstr "Agendar llamada"
|
||||||
|
|
||||||
|
msgctxt "wizard_button:sale.prospect_trace.make_call,ask_task,end:"
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
msgctxt "wizard_button:sale.prospect_trace.make_call,ask_task,schedule_task:"
|
||||||
|
msgid "Schedule task"
|
||||||
|
msgstr "Agendar tarea"
|
||||||
|
|
||||||
msgctxt "wizard_button:sale.prospect.assign,start,end:"
|
msgctxt "wizard_button:sale.prospect.assign,start,end:"
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
@@ -513,6 +565,19 @@ msgctxt "model:ir.action.act_window.domain,name:act_prospect_domain_assigned"
|
|||||||
msgid "Assigned"
|
msgid "Assigned"
|
||||||
msgstr "Asignado"
|
msgstr "Asignado"
|
||||||
|
|
||||||
|
msgctxt "model:ir.action.act_window.domain,name:act_task_domain_pending"
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr "Pendiente"
|
||||||
|
|
||||||
|
msgctxt "model:ir.action.act_window.domain,name:act_task_domain_done"
|
||||||
|
msgid "Done"
|
||||||
|
msgstr "Completado"
|
||||||
|
|
||||||
|
msgctxt "model:ir.action.act_window.domain,name:act_task_domain_all"
|
||||||
|
msgid "All"
|
||||||
|
msgstr "Todo"
|
||||||
|
|
||||||
|
|
||||||
msgctxt "model:ir.action,name:schedule_call_wizard"
|
msgctxt "model:ir.action,name:schedule_call_wizard"
|
||||||
msgid "Schedule call"
|
msgid "Schedule call"
|
||||||
msgstr "Agendar llamada"
|
msgstr "Agendar llamada"
|
||||||
|
|||||||
18
prospect.py
18
prospect.py
@@ -1,12 +1,12 @@
|
|||||||
# 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 ModelSQL, ModelView, fields
|
from trytond.model import ModelSQL, ModelView, fields, DeactivableMixin
|
||||||
from trytond.pyson import Eval, If
|
from trytond.pyson import Eval, If
|
||||||
from trytond.pool import Pool
|
from trytond.pool import Pool
|
||||||
|
|
||||||
|
|
||||||
class Prospect(ModelSQL, ModelView):
|
class Prospect(ModelSQL, ModelView, DeactivableMixin):
|
||||||
'Prospecto'
|
'Prospecto'
|
||||||
__name__ = 'sale.prospect'
|
__name__ = 'sale.prospect'
|
||||||
_rec_name = 'name'
|
_rec_name = 'name'
|
||||||
@@ -38,10 +38,24 @@ class Prospect(ModelSQL, ModelView):
|
|||||||
|
|
||||||
prospect_trace = fields.Many2One('sale.prospect_trace', 'Prospect trace')
|
prospect_trace = fields.Many2One('sale.prospect_trace', 'Prospect trace')
|
||||||
|
|
||||||
|
rating = fields.Selection(
|
||||||
|
[(None, None),
|
||||||
|
('1', '1'),
|
||||||
|
('2', '2'),
|
||||||
|
('3', '3'),
|
||||||
|
('4', '4'),
|
||||||
|
('5', '5')], 'Rating (1-5)')
|
||||||
|
comments = fields.Text('Comments')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def default_state(cls):
|
def default_state(cls):
|
||||||
return 'unassigned'
|
return 'unassigned'
|
||||||
|
|
||||||
|
@fields.depends('prospect_trace', 'contact_methods')
|
||||||
|
def on_change_contact_methods(self):
|
||||||
|
for contact in self.contact_methods:
|
||||||
|
contact.prospect_trace = self.prospect_trace
|
||||||
|
|
||||||
@fields.depends('city', 'department')
|
@fields.depends('city', 'department')
|
||||||
def on_change_city(self):
|
def on_change_city(self):
|
||||||
if self.city:
|
if self.city:
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
|
|
||||||
<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"
|
||||||
|
eval="[If(Eval('context', {}).get('user_admin', None), (), ('assigned_operator', '=', Eval('_user')))]"
|
||||||
|
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">
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ class ProspectTrace(ModelSQL, ModelView):
|
|||||||
'Business unit', states=_states
|
'Business unit', states=_states
|
||||||
)
|
)
|
||||||
prospect_contacts = fields.One2Many(
|
prospect_contacts = fields.One2Many(
|
||||||
'prospect.contact_method', 'prospect_trace', 'Prospect contacts',
|
'prospect.contact_method', 'prospect_trace',
|
||||||
states=_states)
|
'Prospect contacts', required=True)
|
||||||
prospect_city = fields.Many2One('sale.city', 'City',
|
prospect_city = fields.Many2One('sale.city', 'City',
|
||||||
states=_states)
|
states=_states)
|
||||||
|
|
||||||
@@ -49,6 +49,11 @@ class ProspectTrace(ModelSQL, ModelView):
|
|||||||
], 'State',
|
], 'State',
|
||||||
states=_states)
|
states=_states)
|
||||||
|
|
||||||
|
@fields.depends('prospect_contacts', 'prospect')
|
||||||
|
def on_change_prospect_contacts(self):
|
||||||
|
for contact in self.prospect_contacts:
|
||||||
|
contact.prospect = self.prospect
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __setup__(cls):
|
def __setup__(cls):
|
||||||
super(ProspectTrace, cls).__setup__()
|
super(ProspectTrace, cls).__setup__()
|
||||||
@@ -147,6 +152,10 @@ class MakeCallStart(ModelView):
|
|||||||
[('yes', 'Yes'),
|
[('yes', 'Yes'),
|
||||||
('no', 'No')], 'Schedule call?', required=True)
|
('no', 'No')], 'Schedule call?', required=True)
|
||||||
|
|
||||||
|
schedule_task = fields.Selection(
|
||||||
|
[('yes', 'Yes'),
|
||||||
|
('no', 'No')], 'Schedule task?', required=True)
|
||||||
|
|
||||||
|
|
||||||
class MakeCallAsk(ModelView):
|
class MakeCallAsk(ModelView):
|
||||||
'Posible agendación de llamada luego de hacer llamada actual'
|
'Posible agendación de llamada luego de hacer llamada actual'
|
||||||
@@ -163,6 +172,13 @@ class MakeCallAsk(ModelView):
|
|||||||
return date
|
return date
|
||||||
|
|
||||||
|
|
||||||
|
class MakeCallAskTask(ModelView):
|
||||||
|
'Posible agendación de tarea luego de hacer llamada actual'
|
||||||
|
__name__ = 'sale.prospect_trace.make_call.ask_task'
|
||||||
|
|
||||||
|
task_description = fields.Text('Task description')
|
||||||
|
|
||||||
|
|
||||||
class MakeCall(Wizard):
|
class MakeCall(Wizard):
|
||||||
'Crear llamada a un seguimiento de prospecto'
|
'Crear llamada a un seguimiento de prospecto'
|
||||||
__name__ = 'sale.prospect_trace.make_call'
|
__name__ = 'sale.prospect_trace.make_call'
|
||||||
@@ -182,6 +198,15 @@ class MakeCall(Wizard):
|
|||||||
"Schedule call", 'schedule_call', 'tryton-ok', default=True)])
|
"Schedule call", 'schedule_call', 'tryton-ok', default=True)])
|
||||||
schedule_call = StateTransition()
|
schedule_call = StateTransition()
|
||||||
|
|
||||||
|
ask_task = StateView(
|
||||||
|
'sale.prospect_trace.make_call.ask_task',
|
||||||
|
'sale_opportunity_management.make_call_ask_task_view_form', [
|
||||||
|
Button("Cancel", 'end', 'tryton-cancel'),
|
||||||
|
Button("Schedule task", 'schedule_task', 'tryton-ok', default=True)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
schedule_task = StateTransition()
|
||||||
|
|
||||||
def transition_make_call(self):
|
def transition_make_call(self):
|
||||||
prospect_trace = self.record
|
prospect_trace = self.record
|
||||||
|
|
||||||
@@ -216,12 +241,30 @@ class MakeCall(Wizard):
|
|||||||
|
|
||||||
if self.start.schedule_call == 'yes':
|
if self.start.schedule_call == 'yes':
|
||||||
return 'ask'
|
return 'ask'
|
||||||
|
if self.start.schedule_task == 'yes':
|
||||||
|
return 'ask_task'
|
||||||
|
return 'end'
|
||||||
|
|
||||||
|
def transition_schedule_task(self):
|
||||||
|
self.create_schedule_task(self.ask_task.task_description, self.record)
|
||||||
return 'end'
|
return 'end'
|
||||||
|
|
||||||
def transition_schedule_call(self):
|
def transition_schedule_call(self):
|
||||||
self.create_schedule_call(self.ask.datetime, self.record)
|
self.create_schedule_call(self.ask.datetime, self.record)
|
||||||
|
|
||||||
|
if (self.start.schedule_call and self.start.schedule_task) == 'yes':
|
||||||
|
return 'ask_task'
|
||||||
return 'end'
|
return 'end'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_schedule_task(cls, description, prospect_trace):
|
||||||
|
pool = Pool()
|
||||||
|
Task = pool.get('sale.pending_task')
|
||||||
|
task = Task()
|
||||||
|
task.description = description
|
||||||
|
task.prospect_trace = prospect_trace
|
||||||
|
task.save()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_schedule_call(cls, datetime, prospect_trace):
|
def create_schedule_call(cls, datetime, prospect_trace):
|
||||||
pool = Pool()
|
pool = Pool()
|
||||||
|
|||||||
@@ -132,6 +132,11 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="type">form</field>
|
<field name="type">form</field>
|
||||||
<field name="name">make_call_ask_form</field>
|
<field name="name">make_call_ask_form</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record model="ir.ui.view" id="make_call_ask_task_view_form">
|
||||||
|
<field name="model">sale.prospect_trace.make_call.ask_task</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="name">make_call_ask_task_form</field>
|
||||||
|
</record>
|
||||||
<record model="ir.model.button" id="make_call_wizard_button">
|
<record model="ir.model.button" id="make_call_wizard_button">
|
||||||
<field name="name">wizard_make_call</field>
|
<field name="name">wizard_make_call</field>
|
||||||
<field name="string">Make call</field>
|
<field name="string">Make call</field>
|
||||||
|
|||||||
@@ -95,6 +95,10 @@ Crear tercer prospecto::
|
|||||||
>>> prospect3.business_unit = 'optics'
|
>>> prospect3.business_unit = 'optics'
|
||||||
>>> prospect3.save()
|
>>> prospect3.save()
|
||||||
|
|
||||||
|
Asignar tipificación a un prospecto
|
||||||
|
>>> prospect3.rating = '1'
|
||||||
|
>>> prospect3.comments = 'Calificación al cliente'
|
||||||
|
|
||||||
------------------------------------
|
------------------------------------
|
||||||
Asignación de prospectos a operarios
|
Asignación de prospectos a operarios
|
||||||
------------------------------------
|
------------------------------------
|
||||||
@@ -192,6 +196,11 @@ Verificar creación de seguimiento de prospecto::
|
|||||||
>>> prospect_trace.prospect_contacts
|
>>> prospect_trace.prospect_contacts
|
||||||
[proteus.Model.get('prospect.contact_method')(1), proteus.Model.get('prospect.contact_method')(2), proteus.Model.get('prospect.contact_method')(3)]
|
[proteus.Model.get('prospect.contact_method')(1), proteus.Model.get('prospect.contact_method')(2), proteus.Model.get('prospect.contact_method')(3)]
|
||||||
|
|
||||||
|
Agregar un método de contacto desde el seguimiento de prospecto::
|
||||||
|
>>> contact_method_ = prospect_trace.prospect_contacts.new(value='31231231212', name='Carlos', job='Supervisor')
|
||||||
|
>>> contact_method_.prospect
|
||||||
|
proteus.Model.get('sale.prospect')(1)
|
||||||
|
|
||||||
|
|
||||||
Crear llamadas a un seguimiento de prospecto::
|
Crear llamadas a un seguimiento de prospecto::
|
||||||
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
||||||
@@ -265,6 +274,30 @@ Crear una llamada agendada previamente::
|
|||||||
>>> prospect_trace.state
|
>>> prospect_trace.state
|
||||||
'open'
|
'open'
|
||||||
|
|
||||||
|
Hacer llamada y programar tarea::
|
||||||
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
||||||
|
>>> make_call.form.description = 'Prospect told me to send him an email'
|
||||||
|
>>> make_call.form.interest = '3'
|
||||||
|
>>> make_call.form.schedule_call = 'yes'
|
||||||
|
>>> make_call.form.schedule_task = 'yes'
|
||||||
|
>>> make_call.execute('make_call')
|
||||||
|
>>> make_call.form.datetime = datetime(2023, 8, 14, 15, 30, 30)
|
||||||
|
>>> make_call.execute('schedule_call')
|
||||||
|
>>> make_call.form.task_description = 'I have to send a mail to prospect offering him this services...'
|
||||||
|
>>> make_call.execute('schedule_task')
|
||||||
|
|
||||||
|
>>> Task = Model.get('sale.pending_task')
|
||||||
|
>>> task, = Task.find([('description', '=', 'I have to send a mail to prospect offering him this services...')])
|
||||||
|
>>> task
|
||||||
|
proteus.Model.get('sale.pending_task')(1)
|
||||||
|
|
||||||
|
>>> task.state
|
||||||
|
'pending'
|
||||||
|
|
||||||
|
>>> task.click('close_task')
|
||||||
|
>>> task.state
|
||||||
|
'done'
|
||||||
|
|
||||||
Hacer llamada y cerrar venta (Seguimiento de prospecto)::
|
Hacer llamada y cerrar venta (Seguimiento de prospecto)::
|
||||||
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
||||||
>>> make_call.form.description = 'Closed sale'
|
>>> make_call.form.description = 'Closed sale'
|
||||||
@@ -332,8 +365,14 @@ Crear un usuario de rol administrador::
|
|||||||
>>> admin.user_admin == True
|
>>> admin.user_admin == True
|
||||||
True
|
True
|
||||||
|
|
||||||
|
Agregar un nuevo método de contacto desde prospecto
|
||||||
|
>>> contact_method = prospect1.contact_methods.new(value='0000000000', name='Nuevo', job='Puesto increíble')
|
||||||
|
>>> prospect1.save()
|
||||||
|
|
||||||
|
>>> prospect1.contact_methods[-1].value
|
||||||
|
'0000000000'
|
||||||
|
>>> prospect_trace.prospect_contacts[-1].value
|
||||||
|
'0000000000'
|
||||||
|
|
||||||
--------
|
--------
|
||||||
Reportes
|
Reportes
|
||||||
@@ -367,3 +406,4 @@ Reportes
|
|||||||
* Reporte de prospectos potenciales
|
* Reporte de prospectos potenciales
|
||||||
* llamadas con un nivel de interés alto
|
* llamadas con un nivel de interés alto
|
||||||
* Seguimiento de prospecto al que pertenecen las llamadas
|
* Seguimiento de prospecto al que pertenecen las llamadas
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[tryton]
|
[tryton]
|
||||||
version=6.8.0
|
version=7.0.0
|
||||||
depends:
|
depends:
|
||||||
ir
|
ir
|
||||||
res
|
res
|
||||||
|
|||||||
7
view/make_call_ask_task_form.xml
Normal file
7
view/make_call_ask_task_form.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
this repository contains the full copyright notices and license terms. -->
|
||||||
|
<form>
|
||||||
|
<label name="task_description"/>
|
||||||
|
<field name="task_description"/>
|
||||||
|
</form>
|
||||||
@@ -2,11 +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>
|
<form>
|
||||||
|
<group col="6" id="description">
|
||||||
<label name="description"/>
|
<label name="description"/>
|
||||||
<field name="description" colspan="6"/>
|
<field name="description"/>
|
||||||
|
</group>
|
||||||
<newline/>
|
<newline/>
|
||||||
|
<group col="6" id="call_data">
|
||||||
<label name="interest"/>
|
<label name="interest"/>
|
||||||
<field name="interest"/>
|
<field name="interest" colspan="1"/>
|
||||||
<label name="schedule_call"/>
|
<label name="schedule_call"/>
|
||||||
<field name="schedule_call"/>
|
<field name="schedule_call" colspan="1"/>
|
||||||
|
<label name="schedule_task"/>
|
||||||
|
<field name="schedule_task" colspan="1"/>
|
||||||
|
</group>
|
||||||
</form>
|
</form>
|
||||||
12
view/pending_task_form.xml
Normal file
12
view/pending_task_form.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
this repository contains the full copyright notices and license terms. -->
|
||||||
|
<form>
|
||||||
|
<group col="6" id="content">
|
||||||
|
<label name="prospect_trace"/>
|
||||||
|
<field name="prospect_trace"/>
|
||||||
|
<newline/>
|
||||||
|
<label name="description"/>
|
||||||
|
<field name="description"/>
|
||||||
|
</group>
|
||||||
|
</form>
|
||||||
8
view/pending_task_tree.xml
Normal file
8
view/pending_task_tree.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
this repository contains the full copyright notices and license terms. -->
|
||||||
|
<tree>
|
||||||
|
<field name="prospect_trace" expand="1"/>
|
||||||
|
<field name="description" expand="1"/>
|
||||||
|
<button name="close_task"/>
|
||||||
|
</tree>
|
||||||
@@ -22,13 +22,24 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<page string="Contact methods" id="contact_methods">
|
<page string="Contact methods" id="contact_methods">
|
||||||
<field name="contact_methods" colspan="2"/>
|
<field name="contact_methods" colspan="2"/>
|
||||||
</page>
|
</page>
|
||||||
|
<page string="About prospect" id="contact_methods">
|
||||||
|
<label name="rating"/>
|
||||||
|
<field name="rating"/>
|
||||||
|
<newline/>
|
||||||
|
<label name="comments"/>
|
||||||
|
<field name="comments"/>
|
||||||
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
<newline/>
|
<newline/>
|
||||||
|
|
||||||
<group col="4" id="stated">
|
<group col="6" colspan="5" id="footer" yalign="0">
|
||||||
<label name="assigned_operator"/>
|
<label name="assigned_operator"/>
|
||||||
<field name="assigned_operator"/>
|
<field name="assigned_operator"/>
|
||||||
<label name="state"/>
|
<label name="state"/>
|
||||||
<field name="state"/>
|
<field name="state"/>
|
||||||
|
<group col="-1" colspan="1" id="checkboxes">
|
||||||
|
<label name="active"/>
|
||||||
|
<field name="active" xexpand="0" width="25"/>
|
||||||
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -7,4 +7,5 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
<field name="department" expand="1"/>
|
<field name="department" expand="1"/>
|
||||||
<field name="city" expand="1"/>
|
<field name="city" expand="1"/>
|
||||||
<field name="assigned_operator" expand="1"/>
|
<field name="assigned_operator" expand="1"/>
|
||||||
|
<field name="rating" expand="1"/>
|
||||||
</tree>
|
</tree>
|
||||||
Reference in New Issue
Block a user