10 Commits

Author SHA1 Message Date
f00e849ab9 feat: Se agrega traducción
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed
2023-11-02 13:31:03 -05:00
30a37af5de fix: Se añade depends al botón de cerrar tareas
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed
2023-11-02 13:17:19 -05:00
2ee22b1c0c fix: Si se agrega o modifica un método de contacto luego de que se haya generado la tarea, esta no se actualiza
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline failed
2023-10-28 21:41:09 -05:00
f4566b7db4 chore(ContactMethod): refactor - se centraliza lógica de actualización de colaboradores
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-28 20:20:32 -05:00
a1d1e019ec fix: al crear segunda tarea al mismo seguimiento se pierden los contact_methods de la anterior
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-20 17:50:44 -05:00
3be97677a7 Merge branch '6.8' of https://gitea.onecluster.org/OneTeam/trytondo-sale_opportunity_management into pantallaDeTareasNoMuestraContactMethod_#74 2023-10-20 16:31:17 -05:00
d1ad40203b Merge pull request 'fix: al crear mecanismo de contacto desde prospecto no se actualiza correctamente en seguimiento de prospecto' (#77) from NoSeActualizaContactMethodEnProspectTrace_#76 into 6.8
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Se replica error en las pruebas y se soluciona con un on_change
2023-10-20 16:19:03 -05:00
9c368809f9 fix: al crear mecanismo de contacto desde prospecto no se actualiza correctamente en seguimiento de prospecto
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
2023-10-20 15:27:51 -05:00
5873d35f12 feat(Pantalla Tareas pendientes): Se agregan vistas de método de contacto, #74
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-19 19:58:46 -05:00
85d5f714ef feat: Se implementa en las pruebas metodos de contacto dentro de PendingTask
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2023-10-19 19:52:40 -05:00
11 changed files with 89 additions and 67 deletions

View File

@@ -4,7 +4,6 @@ from . import prospect_trace
from . import call
from . import pending_call
from . import user
from . import print_report_by_operator
from .locations import city
from .locations import department
@@ -29,7 +28,7 @@ def register():
prospect_trace.MakeCallAskTask,
prospect.ReassignProspectByOperatorStart,
prospect.ReassignProspectByProspectStart,
print_report_by_operator.PrintReportByOperatorStart,
call.PendingTask_ContactMethod,
module='sale_opportunity_management', type_='model')
Pool.register(
prospect_trace.ScheduleCall,
@@ -37,7 +36,6 @@ def register():
prospect_trace.MakeCall,
prospect.ReassignProspectByOperator,
prospect.ReasignProspectByProspect,
print_report_by_operator.PrintReportByOperator,
module='sale_opportunity_management', type_='wizard')
Pool.register(
module='sale_opportunity_management', type_='report')

17
call.py
View File

@@ -67,12 +67,18 @@ class PendingTask(ModelSQL, ModelView):
'sale.prospect_trace', 'Prospect trace',
required=True, readonly=True)
contacts = fields.Many2Many(
'sale.pendingtask_contactmethod',
'pending_task_id', 'contact_method_id',
'Contact Methods')
@classmethod
def __setup__(cls):
super(PendingTask, cls).__setup__()
cls._buttons.update({
'close_task': {
'invisible': Eval('state') == 'done'
'invisible': Eval('state') == 'done',
'depends': ['state'],
}
})
@@ -86,3 +92,12 @@ class PendingTask(ModelSQL, ModelView):
@classmethod
def default_state(cls):
return 'pending'
class PendingTask_ContactMethod(ModelSQL):
'Relacion muchos a muchos entre tareas pendientes y mecanismos de contacto'
__name__ = "sale.pendingtask_contactmethod"
pending_task_id = fields.Many2One('sale.pending_task', 'Pending task id')
contact_method_id = fields.Many2One(
'prospect.contact_method', 'Contact method id')

View File

@@ -246,6 +246,10 @@ msgctxt "field:sale.pending_task,prospect_trace:"
msgid "Prospect trace"
msgstr "Seguimiento de prospecto"
msgctxt "field:sale.pending_task,contacts:"
msgid "Contact Methods"
msgstr "Métodos de Contacto"
msgctxt "field:sale.prospect_trace.make_call.start,schedule_task:"
msgid "Schedule task?"
msgstr "¿Agendar tarea?"

View File

@@ -1,24 +0,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.
# from trytond.model import ModelSQL, ModelView, fields
from trytond.wizard import Wizard, StateView, Button # , StateReport
from trytond.model import fields, ModelView
class PrintReportByOperatorStart(ModelView):
'Vista inicial de reporte por operario'
__name__ = 'sale.print_report_by_operator.start'
start_date = fields.Date('Start date')
end_date = fields.Date('End date')
class PrintReportByOperator(Wizard):
'Generar reporte por operario'
__name__ = 'sale.print_report_by_operator'
start = StateView(
'sale.print_report_by_operator.start',
'sale_opportunity_management.print_report_by_operator_start_view_form',
[Button("Cancel", "end", "tryton-cancel"),
Button("Print Report", "print_report", "tryton-ok", default=True)])

View File

@@ -1,16 +0,0 @@
<!-- <?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. -->
<tryton>
<data>
<record model="ir.action.wizard" id="print_report_by_operator_wizard">
<field name="name">Print report by operator</field>
<field name="wiz_name">sale.print_report_by_operator</field>
</record>
<record model="ir.ui.view" id="print_report_by_operator_start_view_form">
<field name="model">sale.print_report_by_operator.start</field>
<field name="type">form</field>
<field name="name">print_report_by_operator_start_form</field>
</record>
<data>
<tryton/> -->

View File

@@ -51,6 +51,11 @@ class Prospect(ModelSQL, ModelView, DeactivableMixin):
def default_state(cls):
return 'unassigned'
@fields.depends('prospect_trace', 'contact_methods')
def on_change_contact_methods(self):
for contact in self.contact_methods:
contact.update_collaborators(changed_from='prospect')
@fields.depends('city', 'department')
def on_change_city(self):
if self.city:
@@ -75,10 +80,24 @@ class ContactMethod(ModelSQL, ModelView):
prospect_trace = fields.Many2One(
'sale.prospect_trace', 'Prospect Trace', required=False)
tasks = fields.Many2Many(
'sale.pendingtask_contactmethod',
'contact_method_id', 'pending_task_id',
'Tasks')
@classmethod
def default_contact_type(cls):
return 'mobile'
def update_collaborators(self, changed_from):
if (changed_from == 'prospect'):
self.prospect_trace = self.prospect.prospect_trace
if (self.prospect_trace):
self.tasks = self.prospect.prospect_trace.tasks
if (changed_from == 'prospect_trace'):
self.prospect = self.prospect_trace.prospect
self.tasks = self.prospect_trace.tasks
def get_rec_name(self, name):
fields = [self.name, self.job, self.value]
contact_rec_name = ''

View File

@@ -36,6 +36,9 @@ class ProspectTrace(ModelSQL, ModelView):
'sale.call', 'prospect_trace', 'Calls', states=_states)
pending_call = fields.Many2One(
'sale.pending_call', 'Pending call', states=_states)
tasks = fields.One2Many(
'sale.pending_task', 'prospect_trace',
'Pending Tasks', states=_states)
current_interest = fields.Selection(
Interest.get_interest_levels(), 'Current interest',
@@ -52,7 +55,7 @@ class ProspectTrace(ModelSQL, ModelView):
@fields.depends('prospect_contacts', 'prospect')
def on_change_prospect_contacts(self):
for contact in self.prospect_contacts:
contact.prospect = self.prospect
contact.update_collaborators(changed_from='prospect_trace')
@classmethod
def __setup__(cls):
@@ -263,6 +266,7 @@ class MakeCall(Wizard):
task = Task()
task.description = description
task.prospect_trace = prospect_trace
task.contacts = prospect_trace.prospect_contacts
task.save()
@classmethod

View File

@@ -287,16 +287,42 @@ Hacer llamada y programar tarea::
>>> 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)
>>> task1, = Task.find([('description', '=', 'I have to send a mail to prospect offering him this services...')])
>>> task.state
>>> task1
proteus.Model.get('sale.pending_task')(1)
>>> task1.state
'pending'
>>> task.click('close_task')
>>> task.state
>>> task1.click('close_task')
>>> task1.state
'done'
>>> task1.contacts[0].value
'12345678910'
Programar segunda tarea al mismo seguimiento::
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
>>> make_call.form.description = 'Prospect told me to send him an SMS'
>>> make_call.form.interest = '3'
>>> make_call.form.schedule_call = 'no'
>>> make_call.form.schedule_task = 'yes'
>>> make_call.execute('make_call')
>>> make_call.form.task_description = 'I have to send a SMS to prospect offering him this services...'
>>> make_call.execute('schedule_task')
>>> task1.save()
>>> Task = Model.get('sale.pending_task')
>>> task2, = Task.find([('description', '=', 'I have to send a SMS to prospect offering him this services...')])
>>> task2
proteus.Model.get('sale.pending_task')(2)
>>> task2.state
'pending'
>>> task2.contacts[0].value
'12345678910'
>>> task1.contacts[0].value
'12345678910'
Hacer llamada y cerrar venta (Seguimiento de prospecto)::
>>> make_call = Wizard('sale.prospect_trace.make_call', [prospect_trace])
@@ -347,7 +373,6 @@ Reasignar prospectos por prospecto::
>>> reassign_by_prospect.form.prospect = prospect1
>>> reassign_by_prospect.form.new_operator = user
>>> reassign_by_prospect.execute('reassign_by_prospect')
>>> prospect1.reload()
>>> prospect1.assigned_operator.name
@@ -364,15 +389,15 @@ Crear un usuario de rol administrador::
>>> admin.save()
>>> admin.user_admin == True
True
.. Generar reporte por operario y consolidado::
.. >>> PrintReportByOperator = Model.get('sale.print_report_by_operato`r', type='wizard')
.. >>> session_id, _, _ = PrintReportByOperator.create()
.. >>> print_report_by_operator = Wizard('sale.print_report_by_operator', [])
.. >>> print_report_by_operator.form.start_date = date.today()
.. >>> print_report_by_operator.form.end_date = date.today()
.. >>> print_report_by_operator.execute('print_report')
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

View File

@@ -8,5 +8,8 @@ this repository contains the full copyright notices and license terms. -->
<newline/>
<label name="description"/>
<field name="description"/>
<newline/>
<label name="contacts"/>
<field name="contacts"/>
</group>
</form>

View File

@@ -4,5 +4,6 @@ this repository contains the full copyright notices and license terms. -->
<tree>
<field name="prospect_trace" expand="1"/>
<field name="description" expand="1"/>
<field name="contacts" expand="1"/>
<button name="close_task"/>
</tree>

View File

@@ -1,7 +0,0 @@
<?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="start_date" expand="1"/>
<field name="end_date" expand="1"/>
</tree>