288 lines
9.8 KiB
ReStructuredText
288 lines
9.8 KiB
ReStructuredText
====================================
|
|
Sale Opportunity Management Scenario
|
|
====================================
|
|
|
|
|
|
Imports::
|
|
|
|
>>> from proteus import Model, Wizard
|
|
>>> from trytond.tests.tools import activate_modules
|
|
>>> from datetime import date, timedelta, datetime
|
|
>>> import xml.etree.ElementTree as ET
|
|
|
|
Activate modules::
|
|
|
|
>>> config = activate_modules('sale_opportunity_management')
|
|
|
|
|
|
**Cada sección contiene:**
|
|
|
|
1. Encabezado, historia de usuario
|
|
2. Elementos textuales de propuesta final
|
|
3. Descripción detallada
|
|
4. Escenarios de pruebas
|
|
|
|
(Entre [""] estarán los elementos textuales que se acordaron con el cliente en la propuesta final)
|
|
|
|
----------------------
|
|
Registro de prospectos
|
|
----------------------
|
|
**Como administrador quiero registrar un prospecto para lugo poder hacerle un seguimiento**
|
|
|
|
["Crear un Formulario de registro rápido de prospecto, Nombres, Métodos de contacto,Direcciones"]
|
|
|
|
|
|
El administrador deberá poder registrar los contactos de diferentes prospectos, junto con su información básica:
|
|
* Razón social (Nombre de la empresa)
|
|
* Ciudad
|
|
* Metodos de contacto
|
|
* Tercero relacionado
|
|
* Nombre
|
|
* Cargo
|
|
|
|
Crear prospecto::
|
|
>>> Prospect = Model.get('sale.prospect')
|
|
>>> prospect1 = Prospect()
|
|
|
|
>>> prospect1.name = 'guchito S.A.S'
|
|
>>> contact_method = prospect1.contact_methods.new(value='31223425234', name='Roberto', job='Gerente R.H')
|
|
>>> contact_method = prospect1.contact_methods.new(contact_type='mobile', value='12345678910', name='Pancracia', job='Asistente administrativo')
|
|
>>> contact_method = prospect1.contact_methods.new(contact_type='mail', value='peralto@guchitos.org', name='Peralto', job='Administrador')
|
|
|
|
>>> City = Model.get('sale.city')
|
|
>>> medellin, = City.find([('code', '=', 'CO-05001')])
|
|
>>> prospect1.city = medellin
|
|
>>> prospect1.save()
|
|
|
|
Verificar estado final de creación de prospecto::
|
|
>>> prospect1.contact_methods
|
|
[proteus.Model.get('prospect.contact_method')(1), proteus.Model.get('prospect.contact_method')(2), proteus.Model.get('prospect.contact_method')(3)]
|
|
>>> prospect1.contact_methods[0].contact_type
|
|
'mobile'
|
|
>>> prospect1.contact_methods[0].job
|
|
'Gerente R.H'
|
|
>>> prospect1.contact_methods[2].name
|
|
'Peralto'
|
|
>>> prospect1.contact_methods[2].value
|
|
'peralto@guchitos.org'
|
|
|
|
>>> prospect1.city.code
|
|
'CO-05001'
|
|
>>> prospect1.department.code
|
|
'CO-05'
|
|
>>> prospect1.state
|
|
'unassigned'
|
|
|
|
Crear segundo prospecto::
|
|
>>> prospect2 = Prospect()
|
|
|
|
>>> prospect2.name = 'Modernitus S.A.S'
|
|
>>> contact_method = prospect2.contact_methods.new(value='3122390987', name='Pepe', job='Jefe de ventas')
|
|
|
|
>>> City = Model.get('sale.city')
|
|
>>> bogota, = City.find([('code', '=', 'CO-11001')])
|
|
>>> prospect2.city = bogota
|
|
>>> prospect2.save()
|
|
|
|
Asignar operario a un prospecto::
|
|
>>> User = Model.get('res.user')
|
|
>>> user, = User.find([('name', '=', 'Administrator')])
|
|
|
|
>>> assign = Wizard('sale.prospect.assign', [prospect1, prospect2])
|
|
>>> assign.form.prospects_chunk = 2
|
|
>>> assign.form.operator = user
|
|
>>> assign.form.prospects
|
|
[proteus.Model.get('sale.prospect')(1), proteus.Model.get('sale.prospect')(2)]
|
|
>>> assign.execute('assign')
|
|
|
|
>>> prospect1.assigned_operator.name
|
|
'Administrator'
|
|
>>> prospect1.state
|
|
'assigned'
|
|
>>> prospect2.assigned_operator.name
|
|
'Administrator'
|
|
>>> prospect2.state
|
|
'assigned'
|
|
|
|
------------------------------------
|
|
Asignación de prospectos a operarios
|
|
------------------------------------
|
|
**Como administrador, quiero poder asignar diferentes seguimientos de prospectos a diferentes operarios, para dividir el trabajo de una manera efectiva y que cada operario tenga sus propias llamadas y que no se mezcle con las de los demás**
|
|
|
|
TODO
|
|
|
|
|
|
|
|
-----------------------
|
|
Seguimiento de llamadas
|
|
-----------------------
|
|
**Como operador quiero poder crear un seguimiento de prospecto para luego hacer una llamada**
|
|
**Como operador quiero registrar una llamada para luego generar reportes**
|
|
**Como operador quiero programar una llamada para luego obtener un reporte de trabajo pendiente**
|
|
|
|
["Crear Campo para registro de la fecha de la llamada"]
|
|
|
|
["Crear campo de evento de la llamada con primera llamada, segunda llamada"]
|
|
|
|
["Crear Campo llamado potencial en el que se asigne un nivel de interés por parte del prospecto identificado en la llamada realizada"]
|
|
|
|
["Crear campo para asignar descripción ó notas importantes evidenciadas en la llamada"]
|
|
|
|
|
|
El seguimiento de llamadas consiste en realizar llamadas a diferentes contactos con el fin de realizar ofertas de servicios o productos, los cuales pertenecen principalmente a 3 unidades de negocio:
|
|
* Optica
|
|
* Brigada
|
|
* Equipos
|
|
|
|
Luego de realizar estas llamadas, el operador dejará registro sobre aspectos como el interés del prospecto, descripción u observaciones importantes, tipificación del prospecto...
|
|
|
|
Cada conjunto de **llamadas** a un prospecto, se llamará **seguimiento de prospecto**, por lo que este podrá tener varias llamadas, y una llamada solo podrá pertenecer a un seguimiento de prospecto. Ej:
|
|
|
|
Seguimiento de prospecto 1
|
|
* llamada 1
|
|
* llamada 2
|
|
|
|
Seguimiento de prospecto 2
|
|
* llamada 1
|
|
* llamada 2
|
|
* llamada 3
|
|
|
|
**Seguimiento de prospecto**:
|
|
* Razon social del prospecto (Tercero)
|
|
* Metodo de contacto del prospecto
|
|
* Unidad de negocio
|
|
* Estado (Abierto o cerrado)
|
|
* Llamadas
|
|
|
|
**LLamada**:
|
|
* Fecha
|
|
* Descripion o observaciones
|
|
* Nivel de interés (0-3)
|
|
* 0 - No contestó
|
|
* 1 - total desinterés
|
|
* 2 - Interés intermedio, brindar mas información
|
|
* 3 - Interés alto, generar venta
|
|
|
|
* Seguimiento de prospecto al que pertence
|
|
|
|
|
|
Crear seguimiento de prospecto::
|
|
>>> ProspectTrace = Model.get('sale.prospect_trace')
|
|
>>> prospect_trace = ProspectTrace()
|
|
|
|
>>> prospect_trace.prospect = prospect1
|
|
>>> prospect_trace.save()
|
|
|
|
>>> prospect_trace.prospect.name
|
|
'guchito S.A.S'
|
|
>>> prospect_trace.prospect_city.name
|
|
'Medellín'
|
|
>>> prospect_trace.prospect_contact.value
|
|
'31223425234'
|
|
>>> prospect_trace.prospect_contact.contact_type
|
|
'mobile'
|
|
>>> prospect_trace.prospect_contact.job
|
|
'Gerente R.H'
|
|
|
|
Crear llamadas a un seguimiento de prospecto desde el seguimiento de prospecto::
|
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
|
>>> make_call.form.description = 'First call to the prospect'
|
|
>>> make_call.form.interest = '0'
|
|
>>> make_call.execute('make_call')
|
|
|
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
|
>>> make_call.form.description = 'Second call to the prospect'
|
|
>>> make_call.form.interest = '1'
|
|
>>> make_call.execute('make_call')
|
|
|
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
|
>>> make_call.form.description = 'Third call to the prospect'
|
|
>>> make_call.form.interest = '3'
|
|
>>> make_call.execute('make_call')
|
|
|
|
.. >>> prospect_trace.save()
|
|
|
|
Verificar estado final del seguimiento del prospecto y sus llamadas
|
|
>>> prospect_trace.calls[0].call_result
|
|
'missed_call'
|
|
>>> prospect_trace.calls[0].call_type
|
|
'first_call'
|
|
>>> prospect_trace.calls[0].date == date.today()
|
|
True
|
|
|
|
>>> prospect_trace.calls[1].call_result
|
|
'answered_call'
|
|
>>> prospect_trace.calls[1].call_type
|
|
'followup_call'
|
|
|
|
>>> prospect_trace.calls
|
|
[proteus.Model.get('sale.call')(1), proteus.Model.get('sale.call')(2), proteus.Model.get('sale.call')(3)]
|
|
>>> prospect_trace.current_interest
|
|
'3'
|
|
>>> prospect_trace.state
|
|
'open'
|
|
|
|
Programar una próxima llamada pendiente al seguimiento de prospecto::
|
|
>>> PendingCall = Model.get('sale.pending_call')
|
|
|
|
>>> schedule = Wizard('sale.prospect_trace.schedule', [prospect_trace])
|
|
>>> schedule.form.date_time = datetime(2023, 8, 14, 15, 30, 30)
|
|
>>> schedule.execute('schedule')
|
|
|
|
>>> prospect_trace.pending_call.date
|
|
datetime.datetime(2023, 8, 14, 15, 30, 30)
|
|
>>> prospect_trace.state
|
|
'with_pending_calls'
|
|
|
|
Crear una llamada agendada previamente:
|
|
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
|
|
>>> make_call.form.description = 'Fourth call to the prospect'
|
|
>>> make_call.form.interest = '3'
|
|
>>> make_call.execute('make_call')
|
|
|
|
>>> prospect_trace.pending_call
|
|
|
|
>>> prospect_trace.state
|
|
'open'
|
|
|
|
Cuando se asigna prospecto sin método de contacto mobile, el contacto en el seguimiento es vacío::
|
|
>>> prospect3 = Prospect()
|
|
>>> prospect3.name = 'Sin celulares S.A.S'
|
|
>>> contact_method = prospect3.contact_methods.new(contact_type='mail', value='felpucio@sincelulares.org', name='felpucio', job='Supervisor')
|
|
>>> prospect3.save()
|
|
|
|
>>> prospect_trace2 = ProspectTrace()
|
|
>>> prospect_trace2.prospect = prospect2
|
|
|
|
>>> prospect_trace2.save()
|
|
|
|
--------
|
|
Reportes
|
|
--------
|
|
["Crear un reporte en el que evidencie por operario y consolidado"]
|
|
["Cantidad de llamadas realizadas en un período de tiempo"]
|
|
["Crear un reporte para verificar cantidad de llamadas por realizar"]
|
|
["Crear reporte para identificación de clientes potenciales (Cliente que en la llamada fueron marcados con un nivel alto)"]
|
|
|
|
|
|
* Reporte de llamadas realizadas en un periodo de tiempo (Análisis de operarios):
|
|
* Nivel de interés
|
|
* Unidad de negocio
|
|
* Observaciones
|
|
* Operario
|
|
|
|
* Reporte de seguimientos a prospectos (Análisis de prospectos):
|
|
* Interés durante distintas etapas del seguimiento
|
|
|
|
|
|
* Reporte de Llamadas a realizar (Analisis de trabajo pendiente):
|
|
* Llamadas pendientes
|
|
* Seguimientos a prospectos abiertos
|
|
|
|
* Reporte de seguimientos sin asignar - asignados:
|
|
* Seguimientos a prospectos pendientes por asignar a operador
|
|
|
|
* Reporte de prospectos potenciales
|
|
* llamadas con un nivel de interés alto
|
|
* Seguimiento de prospecto al que pertenecen las llamadas
|