From 5e7a41fa3baf7ae353c0525483e42d107ac8dacb Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 00:28:30 +0000 Subject: [PATCH 01/17] =?UTF-8?q?Se=20hace=20prueba=20de=20creaci=C3=B3n?= =?UTF-8?q?=20de=20prospecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/scenario_sale_opportunity_management.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 6669776..5528010 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -10,3 +10,13 @@ Imports:: Activate modules:: >>> config = activate_modules('sale_opportunity_management') + +--------------------------------------------------------------------------------------------- +Como administrador quiero poder registrar un prospecto para lugo poder hacerle un seguimiento +--------------------------------------------------------------------------------------------- + +Crear prospecto:: + >>> Prospect = Model.get('call.prospect') + >>> prospect = Prospect() + >>> prospect.name = 'guchito S.A.S' + >>> prospect.save() \ No newline at end of file From 3d5c3e17e096b05c037efa1792a8f6ec2e8bebd7 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 00:30:32 +0000 Subject: [PATCH 02/17] Se crea modelo inicial de prospecto --- prospect.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 prospect.py diff --git a/prospect.py b/prospect.py new file mode 100644 index 0000000..cf1237e --- /dev/null +++ b/prospect.py @@ -0,0 +1,9 @@ +# 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 + +class Prospect(ModelSQL, ModelView): + 'Prospecto' + __name__ = 'call.prospect' + + name = fields.Char('Name') \ No newline at end of file From 76b4485c22bcd744fe67b9759c2dda9214d64041 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 01:09:31 +0000 Subject: [PATCH 03/17] Se crea modelo inicial de prospecto --- __init__.py | 2 ++ prospect.py | 3 ++- tests/scenario_sale_opportunity_management.rst | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index 2759f8e..eb2cb48 100644 --- a/__init__.py +++ b/__init__.py @@ -1,10 +1,12 @@ from trytond.pool import Pool +from . import prospect __all__ = ['register'] def register(): Pool.register( + prospect.Prospect, module='sale_opportunity_management', type_='model') Pool.register( module='sale_opportunity_management', type_='wizard') diff --git a/prospect.py b/prospect.py index cf1237e..2cee49e 100644 --- a/prospect.py +++ b/prospect.py @@ -4,6 +4,7 @@ from trytond.model import ModelSQL, ModelView, fields class Prospect(ModelSQL, ModelView): 'Prospecto' - __name__ = 'call.prospect' + + __name__ = 'sale.prospect' name = fields.Char('Name') \ No newline at end of file diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 5528010..7124b87 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -16,7 +16,7 @@ Como administrador quiero poder registrar un prospecto para lugo poder hacerle u --------------------------------------------------------------------------------------------- Crear prospecto:: - >>> Prospect = Model.get('call.prospect') + >>> Prospect = Model.get('sale.prospect') >>> prospect = Prospect() >>> prospect.name = 'guchito S.A.S' >>> prospect.save() \ No newline at end of file From f9f929ae1e86b030229f5e4fb5b45f6ea85ca51d Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 02:09:17 +0000 Subject: [PATCH 04/17] =?UTF-8?q?Se=20agrega=20seguimiento=20de=20prospect?= =?UTF-8?q?o=20y=20se=20hace=20relaci=C3=B3n=20con=20prospecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 2 ++ prospect.py | 3 ++- prospect_trace.py | 19 +++++++++++++++++++ .../scenario_sale_opportunity_management.rst | 18 +++++++++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 prospect_trace.py diff --git a/__init__.py b/__init__.py index eb2cb48..387eb22 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,6 @@ from trytond.pool import Pool from . import prospect +from . import prospect_trace __all__ = ['register'] @@ -7,6 +8,7 @@ __all__ = ['register'] def register(): Pool.register( prospect.Prospect, + prospect_trace.ProspectTrace, module='sale_opportunity_management', type_='model') Pool.register( module='sale_opportunity_management', type_='wizard') diff --git a/prospect.py b/prospect.py index 2cee49e..d6c7523 100644 --- a/prospect.py +++ b/prospect.py @@ -7,4 +7,5 @@ class Prospect(ModelSQL, ModelView): __name__ = 'sale.prospect' - name = fields.Char('Name') \ No newline at end of file + name = fields.Char('Name') + tel = fields.Integer('Tel') \ No newline at end of file diff --git a/prospect_trace.py b/prospect_trace.py new file mode 100644 index 0000000..a71de0d --- /dev/null +++ b/prospect_trace.py @@ -0,0 +1,19 @@ +# 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 + +class ProspectTrace(ModelSQL, ModelView): + 'Seguimiento de un prospecto' + + __name__ = 'sale.prospect_trace' + + prospect = fields.Many2One('sale.prospect', 'Prospect') + + @fields.depends('prospect') + def on_change_prospect(self): + if self.prospect: + self.prospect_name = self.prospect.name + self.prospect_tel = self.prospect.tel + + prospect_name = fields.Char('Name') + prospect_tel = fields.Integer('Tel') \ No newline at end of file diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 7124b87..9336afa 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -19,4 +19,20 @@ Crear prospecto:: >>> Prospect = Model.get('sale.prospect') >>> prospect = Prospect() >>> prospect.name = 'guchito S.A.S' - >>> prospect.save() \ No newline at end of file + >>> prospect.tel = 3123423422 + >>> prospect.save() + + +----------------------------------------------------------------------------------------- +Como operador quiero poder crear un seguimiento de prospecto para luego hacer una llamada +----------------------------------------------------------------------------------------- + +Crear seguimiento de prospecto:: + >>> ProspectTrace = Model.get('sale.prospect_trace') + >>> prospect_trace = ProspectTrace() + >>> prospect_trace.prospect = prospect + + >>> prospect_trace.prospect_name + 'guchito S.A.S' + >>> prospect_trace.prospect_tel + 3123423422 \ No newline at end of file From d1def24dd63ec1d51574312a403c3441835f5c19 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 03:00:30 +0000 Subject: [PATCH 05/17] Se crea modelo de llamada y se hace valida fecha por defecto = hoy --- __init__.py | 2 ++ call.py | 13 +++++++++++++ tests/scenario_sale_opportunity_management.rst | 14 +++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 call.py diff --git a/__init__.py b/__init__.py index 387eb22..0563194 100644 --- a/__init__.py +++ b/__init__.py @@ -1,12 +1,14 @@ from trytond.pool import Pool from . import prospect from . import prospect_trace +from . import call __all__ = ['register'] def register(): Pool.register( + call.Call, prospect.Prospect, prospect_trace.ProspectTrace, module='sale_opportunity_management', type_='model') diff --git a/call.py b/call.py new file mode 100644 index 0000000..d185354 --- /dev/null +++ b/call.py @@ -0,0 +1,13 @@ +from trytond.model import ModelSQL, ModelView, fields +from datetime import date + +class Call(ModelSQL, ModelView): + 'Llamada' + + __name__ = 'sale.call' + + date = fields.Date('Fecha', ) + + @classmethod + def default_date(cls): + return date.today() \ No newline at end of file diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 9336afa..cd2cd2d 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -6,6 +6,7 @@ Imports:: >>> from proteus import Model, Wizard >>> from trytond.tests.tools import activate_modules + >>> from datetime import date Activate modules:: @@ -35,4 +36,15 @@ Crear seguimiento de prospecto:: >>> prospect_trace.prospect_name 'guchito S.A.S' >>> prospect_trace.prospect_tel - 3123423422 \ No newline at end of file + 3123423422 + +---------------------------------------------------------------------------- +Como operador quiero poder registrar una llamada para luego generar reportes +---------------------------------------------------------------------------- + +Crear llamada a un seguimiento de prospecto:: + >>> Call = Model.get('sale.call') + >>> call = Call() + + >>> call.date == date.today() + True From 6985b5300f2d4283173c609684246c3a525bf15c Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 03:26:38 +0000 Subject: [PATCH 06/17] Se crean relaciones entre llamadas y seguimiento de prospecto --- call.py | 5 +++- prospect_trace.py | 7 +++-- .../scenario_sale_opportunity_management.rst | 28 +++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/call.py b/call.py index d185354..708fb94 100644 --- a/call.py +++ b/call.py @@ -6,7 +6,10 @@ class Call(ModelSQL, ModelView): __name__ = 'sale.call' - date = fields.Date('Fecha', ) + date = fields.Date('Date') + description = fields.Char('Description') + + prospect_trace = fields.Many2One('sale.prospect_trace', 'Prospect trace') @classmethod def default_date(cls): diff --git a/prospect_trace.py b/prospect_trace.py index a71de0d..d203c63 100644 --- a/prospect_trace.py +++ b/prospect_trace.py @@ -8,12 +8,13 @@ class ProspectTrace(ModelSQL, ModelView): __name__ = 'sale.prospect_trace' prospect = fields.Many2One('sale.prospect', 'Prospect') + prospect_name = fields.Char('Name') + prospect_tel = fields.Integer('Tel') + + calls = fields.One2Many('sale.call', 'prospect_trace', "Calls") @fields.depends('prospect') def on_change_prospect(self): if self.prospect: self.prospect_name = self.prospect.name self.prospect_tel = self.prospect.tel - - prospect_name = fields.Char('Name') - prospect_tel = fields.Integer('Tel') \ No newline at end of file diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index cd2cd2d..3e14a95 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -19,6 +19,7 @@ Como administrador quiero poder registrar un prospecto para lugo poder hacerle u Crear prospecto:: >>> Prospect = Model.get('sale.prospect') >>> prospect = Prospect() + >>> prospect.name = 'guchito S.A.S' >>> prospect.tel = 3123423422 >>> prospect.save() @@ -31,7 +32,9 @@ Como operador quiero poder crear un seguimiento de prospecto para luego hacer un Crear seguimiento de prospecto:: >>> ProspectTrace = Model.get('sale.prospect_trace') >>> prospect_trace = ProspectTrace() + >>> prospect_trace.prospect = prospect + >>> prospect_trace.save() >>> prospect_trace.prospect_name 'guchito S.A.S' @@ -46,5 +49,30 @@ Crear llamada a un seguimiento de prospecto:: >>> Call = Model.get('sale.call') >>> call = Call() + >>> call.description = 'Descripción u observaciones de la llamada' + >>> call.prospect_trace = prospect_trace + >>> call.save() + + >>> call.prospect_trace.prospect_name + 'guchito S.A.S' + >>> call.prospect_trace.prospect_tel + 3123423422 >>> call.date == date.today() True + +Crear otra llamada al mismo seguimiento de prospecto:: + >>> Call = Model.get('sale.call') + >>> call = Call() + + >>> call.description = 'Segunda llamada al mismo seguimiento' + >>> call.prospect_trace = prospect_trace + >>> call.save() + + >>> call.prospect_trace.prospect_name + 'guchito S.A.S' + >>> call.prospect_trace.prospect_tel + 3123423422 + >>> call.date == date.today() + True + >>> len(prospect_trace.calls) == 2 + True \ No newline at end of file From 4c6db3959f72b8d026947447f8212127a18043ae Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Fri, 28 Jul 2023 22:50:24 +0000 Subject: [PATCH 07/17] Refactor: rename models --- __init__.py | 4 +-- call.py | 2 +- prospect_trace.py | 8 ++++-- .../scenario_sale_opportunity_management.rst | 28 ++++++++++--------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/__init__.py b/__init__.py index 0563194..f3fc54d 100644 --- a/__init__.py +++ b/__init__.py @@ -1,6 +1,6 @@ from trytond.pool import Pool from . import prospect -from . import prospect_trace +from . import prospect_tracker from . import call __all__ = ['register'] @@ -10,7 +10,7 @@ def register(): Pool.register( call.Call, prospect.Prospect, - prospect_trace.ProspectTrace, + prospect_tracker.ProspectTracker, module='sale_opportunity_management', type_='model') Pool.register( module='sale_opportunity_management', type_='wizard') diff --git a/call.py b/call.py index 708fb94..ea1dcb9 100644 --- a/call.py +++ b/call.py @@ -9,7 +9,7 @@ class Call(ModelSQL, ModelView): date = fields.Date('Date') description = fields.Char('Description') - prospect_trace = fields.Many2One('sale.prospect_trace', 'Prospect trace') + prospect_tracker = fields.Many2One('sale.prospect_tracker', 'Prospect trace') @classmethod def default_date(cls): diff --git a/prospect_trace.py b/prospect_trace.py index d203c63..95d5a68 100644 --- a/prospect_trace.py +++ b/prospect_trace.py @@ -2,19 +2,21 @@ # this repository contains the full copyright notices and license terms. from trytond.model import ModelSQL, ModelView, fields -class ProspectTrace(ModelSQL, ModelView): +class ProspectTracker(ModelSQL, ModelView): 'Seguimiento de un prospecto' - __name__ = 'sale.prospect_trace' + __name__ = 'sale.prospect_tracker' prospect = fields.Many2One('sale.prospect', 'Prospect') prospect_name = fields.Char('Name') prospect_tel = fields.Integer('Tel') + prospect_city = fields.Char('City') - calls = fields.One2Many('sale.call', 'prospect_trace', "Calls") + calls = fields.One2Many('sale.call', 'prospect_tracker', "Calls") @fields.depends('prospect') def on_change_prospect(self): if self.prospect: self.prospect_name = self.prospect.name self.prospect_tel = self.prospect.tel + self.prospect_city = self.prospect.city diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 3e14a95..2759591 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -22,6 +22,7 @@ Crear prospecto:: >>> prospect.name = 'guchito S.A.S' >>> prospect.tel = 3123423422 + >>> prospect.city = 'Bogotá' >>> prospect.save() @@ -30,16 +31,17 @@ Como operador quiero poder crear un seguimiento de prospecto para luego hacer un ----------------------------------------------------------------------------------------- Crear seguimiento de prospecto:: - >>> ProspectTrace = Model.get('sale.prospect_trace') - >>> prospect_trace = ProspectTrace() + >>> ProspectTracker = Model.get('sale.prospect_tracker') + >>> prospect_tracker = ProspectTracker() - >>> prospect_trace.prospect = prospect - >>> prospect_trace.save() + >>> prospect_tracker.prospect = prospect + >>> prospect_tracker.save() - >>> prospect_trace.prospect_name + >>> prospect_tracker.prospect_name 'guchito S.A.S' - >>> prospect_trace.prospect_tel + >>> prospect_tracker.prospect_tel 3123423422 + >>> prospect_tracker.prospect_city ---------------------------------------------------------------------------- Como operador quiero poder registrar una llamada para luego generar reportes @@ -50,12 +52,12 @@ Crear llamada a un seguimiento de prospecto:: >>> call = Call() >>> call.description = 'Descripción u observaciones de la llamada' - >>> call.prospect_trace = prospect_trace + >>> call.prospect_tracker = prospect_tracker >>> call.save() - >>> call.prospect_trace.prospect_name + >>> call.prospect_tracker.prospect_name 'guchito S.A.S' - >>> call.prospect_trace.prospect_tel + >>> call.prospect_tracker.prospect_tel 3123423422 >>> call.date == date.today() True @@ -65,14 +67,14 @@ Crear otra llamada al mismo seguimiento de prospecto:: >>> call = Call() >>> call.description = 'Segunda llamada al mismo seguimiento' - >>> call.prospect_trace = prospect_trace + >>> call.prospect_tracker = prospect_tracker >>> call.save() - >>> call.prospect_trace.prospect_name + >>> call.prospect_tracker.prospect_name 'guchito S.A.S' - >>> call.prospect_trace.prospect_tel + >>> call.prospect_tracker.prospect_tel 3123423422 >>> call.date == date.today() True - >>> len(prospect_trace.calls) == 2 + >>> len(prospect_tracker.calls) == 2 True \ No newline at end of file From 5bcfc87c376e9f82834e6085e2a1755d23c5918d Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 00:55:44 +0000 Subject: [PATCH 08/17] Feat(Vista principal): Se crea vista principal --- call.xml | 67 ++++++++++++++++++++++++++++++++++++++++++++++ tryton.cfg | 1 + view/call_form.xml | 13 +++++++++ view/call_tree.xml | 8 ++++++ 4 files changed, 89 insertions(+) create mode 100644 call.xml create mode 100644 view/call_form.xml create mode 100644 view/call_tree.xml diff --git a/call.xml b/call.xml new file mode 100644 index 0000000..8b99699 --- /dev/null +++ b/call.xml @@ -0,0 +1,67 @@ +<?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> + <!-- Creamos una acción de ventana --> + <!-- En el id va el [id de la acción del menuitem] que va a disparar la acción --> + <record model="ir.action.act_window" id="act_call_tree"> + <!-- El nombre que se le va a ver al usuario en la acción--> + <field name="name">Calls</field> + + <field name="res_model">sale.call</field> + </record> + + <!-- Agregamos la vista de arbol --> + <record model="ir.ui.view" id="call_view_tree"> + <field name="model">sale.call</field> + <field name="type">tree</field> + + <!-- Nombre del archivo de la vista --> + <field name="name">call_tree</field> + </record> + <!-- Agregamos la vista de formulario --> + <record model="ir.ui.view" id="call_view_form"> + <field name="model">sale.call</field> + <field name="type">form</field> + <field name="name">call_form</field> + </record> + + <!-- Indicar que vista va a ser usada en la acción--> + <!-- En "view" -> Indicar cual de las vistas va a tomar esta acción --> + <!-- En "act_window"enlazamos con la acción --> + <record model="ir.action.act_window.view" id="act_call_tree_view1"> + <field name="sequence" eval="10"/> + + <field name="view" ref="call_view_tree"/> + + <field name="act_window" ref="act_call_tree"/> + </record> + + <record model="ir.action.act_window.view" id="act_call_form_view1"> + <field name="sequence" eval="20"/> + + <!-- Indicar cual de las vistas va a tomar esta acción --> + <field name="view" ref="call_view_form"/> + + <!-- enlazamos con la acción --> + <field name="act_window" ref="act_call_tree"/> + </record> + + <!-- Menú principal --> + <!-- Sequence: Orden en el que se va a ver en el menú principal --> + <menuitem + name="Calls" + sequence="10" + id="menu_calls"/> + <!-- Hijo del menú principal -> Menú de arbol--> + <!-- action: Identificación de accion que hace el menú --> + <menuitem + parent="menu_calls" + sequence="10" + id="menu_calls_tree" + action="act_call_tree" + /> + + </data> +</tryton> \ No newline at end of file diff --git a/tryton.cfg b/tryton.cfg index f6aeab7..826e9c0 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -3,3 +3,4 @@ version=6.8.0 depends: ir xml: + call.xml diff --git a/view/call_form.xml b/view/call_form.xml new file mode 100644 index 0000000..e458297 --- /dev/null +++ b/view/call_form.xml @@ -0,0 +1,13 @@ +<?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="date"/> + <field name="date"/> + + <label name="prospect_tracker"/> + <field name="prospect_tracker"/> + + <label name="description"/> + <field name="description"/> +</form> \ No newline at end of file diff --git a/view/call_tree.xml b/view/call_tree.xml new file mode 100644 index 0000000..3227f70 --- /dev/null +++ b/view/call_tree.xml @@ -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="date"/> + <field name="description"/> + <field name="prospect_tracker"/> +</tree> \ No newline at end of file From 9d33b48a5d4ab05cce8b53f9c85309a795b756ef Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:08:24 +0000 Subject: [PATCH 09/17] chore: remove dead code --- call.xml | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/call.xml b/call.xml index 8b99699..92617b3 100644 --- a/call.xml +++ b/call.xml @@ -3,65 +3,41 @@ this repository contains the full copyright notices and license terms. --> <tryton> <data> - <!-- Creamos una acción de ventana --> - <!-- En el id va el [id de la acción del menuitem] que va a disparar la acción --> <record model="ir.action.act_window" id="act_call_tree"> - <!-- El nombre que se le va a ver al usuario en la acción--> <field name="name">Calls</field> - <field name="res_model">sale.call</field> </record> - <!-- Agregamos la vista de arbol --> <record model="ir.ui.view" id="call_view_tree"> <field name="model">sale.call</field> <field name="type">tree</field> - - <!-- Nombre del archivo de la vista --> <field name="name">call_tree</field> </record> - <!-- Agregamos la vista de formulario --> <record model="ir.ui.view" id="call_view_form"> <field name="model">sale.call</field> <field name="type">form</field> <field name="name">call_form</field> </record> - <!-- Indicar que vista va a ser usada en la acción--> - <!-- En "view" -> Indicar cual de las vistas va a tomar esta acción --> - <!-- En "act_window"enlazamos con la acción --> <record model="ir.action.act_window.view" id="act_call_tree_view1"> <field name="sequence" eval="10"/> - <field name="view" ref="call_view_tree"/> - <field name="act_window" ref="act_call_tree"/> </record> - <record model="ir.action.act_window.view" id="act_call_form_view1"> <field name="sequence" eval="20"/> - - <!-- Indicar cual de las vistas va a tomar esta acción --> <field name="view" ref="call_view_form"/> - - <!-- enlazamos con la acción --> <field name="act_window" ref="act_call_tree"/> </record> - <!-- Menú principal --> - <!-- Sequence: Orden en el que se va a ver en el menú principal --> <menuitem name="Calls" sequence="10" id="menu_calls"/> - <!-- Hijo del menú principal -> Menú de arbol--> - <!-- action: Identificación de accion que hace el menú --> <menuitem parent="menu_calls" sequence="10" id="menu_calls_tree" - action="act_call_tree" - /> - + action="act_call_tree"/> </data> </tryton> \ No newline at end of file From b4b5da7e2defd8f2a5e327d212ca9fdd10d18c7e Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:40:37 +0000 Subject: [PATCH 10/17] feat(Vista de seguimiento): Se crea vista de seguimiento a prospecto --- prospect_trace.xml | 39 ++++++++++++++++++++++++++++++++++++ tryton.cfg | 1 + view/prospect_trace_form.xml | 19 ++++++++++++++++++ view/prospect_trace_tree.xml | 9 +++++++++ 4 files changed, 68 insertions(+) create mode 100644 prospect_trace.xml create mode 100644 view/prospect_trace_form.xml create mode 100644 view/prospect_trace_tree.xml diff --git a/prospect_trace.xml b/prospect_trace.xml new file mode 100644 index 0000000..87997b3 --- /dev/null +++ b/prospect_trace.xml @@ -0,0 +1,39 @@ +<?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.act_window" id="act_prospect_trace_tree"> + <field name="name">Prospect Trace</field> + <field name="res_model">sale.prospect_trace</field> + </record> + + <record model="ir.ui.view" id="prospect_trace_view_tree"> + <field name="model">sale.prospect_trace</field> + <field name="type">tree</field> + <field name="name">prospect_trace_tree</field> + </record> + <record model="ir.ui.view" id="prospect_trace_view_form"> + <field name="model">sale.prospect_trace</field> + <field name="type">form</field> + <field name="name">prospect_trace_form</field> + </record> + + <record model="ir.action.act_window.view" id="act_prospect_trace_tree_view1"> + <field name="sequence" eval="10"/> + <field name="view" ref="prospect_trace_view_tree"/> + <field name="act_window" ref="act_prospect_trace_tree"/> + </record> + <record model="ir.action.act_window.view" id="act_prospect_trace_form_view1"> + <field name="sequence" eval="20"/> + <field name="view" ref="prospect_trace_view_form"/> + <field name="act_window" ref="act_prospect_trace_tree"/> + </record> + + <menuitem + parent="menu_calls" + sequence="10" + id="menu_prospect_trace_tree" + action="act_prospect_trace_tree"/> + </data> +</tryton> \ No newline at end of file diff --git a/tryton.cfg b/tryton.cfg index 826e9c0..29ee8c3 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -4,3 +4,4 @@ depends: ir xml: call.xml + prospect_trace.xml \ No newline at end of file diff --git a/view/prospect_trace_form.xml b/view/prospect_trace_form.xml new file mode 100644 index 0000000..5346e07 --- /dev/null +++ b/view/prospect_trace_form.xml @@ -0,0 +1,19 @@ +<?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="prospect"/> + <field name="prospect"/> + + <label name="prospect_name"/> + <field name="prospect_name"/> + + <label name="prospect_contact"/> + <field name="prospect_contact"/> + + <label name="prospect_city"/> + <field name="prospect_city"/> + + <label name="calls"/> + <field name="calls"/> +</form> \ No newline at end of file diff --git a/view/prospect_trace_tree.xml b/view/prospect_trace_tree.xml new file mode 100644 index 0000000..5457511 --- /dev/null +++ b/view/prospect_trace_tree.xml @@ -0,0 +1,9 @@ +<?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"/> + <field name="prospect_name"/> + <field name="prospect_contact"/> + <field name="prospect_city"/> +</tree> \ No newline at end of file From 63fa2b7ebb951ffd1c667fb8ef1ddf2a6948f263 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:41:18 +0000 Subject: [PATCH 11/17] Chore: se actualiza .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 98f5b2d..fa62fc5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ __pycache__/ *$py.class *.bk +/.vscode + # C extensions *.so From a40164d386a108141c7b2800388f29566da21981 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:42:28 +0000 Subject: [PATCH 12/17] fix(call.xml): Se arregla orden de sequencia de items --- call.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/call.xml b/call.xml index 92617b3..6ed94e4 100644 --- a/call.xml +++ b/call.xml @@ -36,7 +36,7 @@ this repository contains the full copyright notices and license terms. --> id="menu_calls"/> <menuitem parent="menu_calls" - sequence="10" + sequence="20" id="menu_calls_tree" action="act_call_tree"/> </data> From 8dc10a78653e1286b172aef2adff7aac9f6bd30a Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:44:46 +0000 Subject: [PATCH 13/17] chore: rename model --- __init__.py | 5 ++- call.py | 2 +- doc/es/calls.rst | 3 +- prospect.py | 24 ++++++++++- prospect_trace.py | 10 ++--- .../scenario_sale_opportunity_management.rst | 43 ++++++++++--------- view/call_form.xml | 4 +- view/call_tree.xml | 2 +- 8 files changed, 58 insertions(+), 35 deletions(-) diff --git a/__init__.py b/__init__.py index f3fc54d..79203eb 100644 --- a/__init__.py +++ b/__init__.py @@ -1,6 +1,6 @@ from trytond.pool import Pool from . import prospect -from . import prospect_tracker +from . import prospect_trace from . import call __all__ = ['register'] @@ -10,7 +10,8 @@ def register(): Pool.register( call.Call, prospect.Prospect, - prospect_tracker.ProspectTracker, + prospect.ContactMethod, + prospect_trace.ProspectTrace, module='sale_opportunity_management', type_='model') Pool.register( module='sale_opportunity_management', type_='wizard') diff --git a/call.py b/call.py index ea1dcb9..57e2d0a 100644 --- a/call.py +++ b/call.py @@ -9,7 +9,7 @@ class Call(ModelSQL, ModelView): date = fields.Date('Date') description = fields.Char('Description') - prospect_tracker = fields.Many2One('sale.prospect_tracker', 'Prospect trace') + prospect_trace = fields.Many2One('sale.prospect_trace', 'Prospect track') @classmethod def default_date(cls): diff --git a/doc/es/calls.rst b/doc/es/calls.rst index e8901e7..0ff7fa2 100644 --- a/doc/es/calls.rst +++ b/doc/es/calls.rst @@ -57,8 +57,7 @@ Seguimiento de prospecto 2 * 1 - total desinterés * 2 - Interés intermedio, brindar mas información * 3 - Interés alto, generar venta - - * Estado (realizada - pendiente) + * Seguimiento de prospecto al que pertence -------- diff --git a/prospect.py b/prospect.py index d6c7523..820d8cc 100644 --- a/prospect.py +++ b/prospect.py @@ -4,8 +4,28 @@ from trytond.model import ModelSQL, ModelView, fields class Prospect(ModelSQL, ModelView): 'Prospecto' - __name__ = 'sale.prospect' name = fields.Char('Name') - tel = fields.Integer('Tel') \ No newline at end of file + city = fields.Char('City') + + # Un prospecto (clase actual) se vincula a Muchos mecanismos de contacto (propiedad actual) + contact_methods = fields.One2Many('prospect.contact_method', 'prospect', 'Contact methods') + + +class ContactMethod(ModelSQL, ModelView): + 'Mecanismo de contacto' + __name__ = 'prospect.contact_method' + + _type = [ + ('phone', 'Phone'), + ('mobile', 'Mobile'), + ('email', 'Email') + ] + contact_type = fields.Selection(_type, 'Contact type') + + value = fields.Char('Value') + + # Muchos mecanismos de contacto (clase actual) se vinculan a un prospecto (propiedad actual) + prospect = fields.Many2One('sale.prospect', 'Prospect') + diff --git a/prospect_trace.py b/prospect_trace.py index 95d5a68..4506e41 100644 --- a/prospect_trace.py +++ b/prospect_trace.py @@ -2,21 +2,21 @@ # this repository contains the full copyright notices and license terms. from trytond.model import ModelSQL, ModelView, fields -class ProspectTracker(ModelSQL, ModelView): +class ProspectTrace(ModelSQL, ModelView): 'Seguimiento de un prospecto' - __name__ = 'sale.prospect_tracker' + __name__ = 'sale.prospect_trace' prospect = fields.Many2One('sale.prospect', 'Prospect') prospect_name = fields.Char('Name') - prospect_tel = fields.Integer('Tel') + prospect_contact = fields.Char('Contact') prospect_city = fields.Char('City') - calls = fields.One2Many('sale.call', 'prospect_tracker', "Calls") + calls = fields.One2Many('sale.call', 'prospect_trace', "Calls") @fields.depends('prospect') def on_change_prospect(self): if self.prospect: self.prospect_name = self.prospect.name - self.prospect_tel = self.prospect.tel + # self.prospect_contact = self.prospect.contact_methods.index('contact_type 'mobile') self.prospect_city = self.prospect.city diff --git a/tests/scenario_sale_opportunity_management.rst b/tests/scenario_sale_opportunity_management.rst index 2759591..32f0888 100644 --- a/tests/scenario_sale_opportunity_management.rst +++ b/tests/scenario_sale_opportunity_management.rst @@ -13,38 +13,43 @@ Activate modules:: >>> config = activate_modules('sale_opportunity_management') --------------------------------------------------------------------------------------------- -Como administrador quiero poder registrar un prospecto para lugo poder hacerle un seguimiento +Como administrador quiero registrar un prospecto para lugo poder hacerle un seguimiento --------------------------------------------------------------------------------------------- +Crear mecanismos de contacto:: + + Crear prospecto:: >>> Prospect = Model.get('sale.prospect') >>> prospect = Prospect() >>> prospect.name = 'guchito S.A.S' - >>> prospect.tel = 3123423422 >>> prospect.city = 'Bogotá' + >>> phone = prospect.contact_methods.new() + >>> phone.contact_type = 'mobile' + >>> phone.value = '3132923938' >>> prospect.save() + ----------------------------------------------------------------------------------------- Como operador quiero poder crear un seguimiento de prospecto para luego hacer una llamada ----------------------------------------------------------------------------------------- Crear seguimiento de prospecto:: - >>> ProspectTracker = Model.get('sale.prospect_tracker') - >>> prospect_tracker = ProspectTracker() + >>> ProspectTrace = Model.get('sale.prospect_trace') + >>> prospect_trace = ProspectTrace() - >>> prospect_tracker.prospect = prospect - >>> prospect_tracker.save() + >>> prospect_trace.prospect = prospect + >>> prospect_trace.save() - >>> prospect_tracker.prospect_name + >>> prospect_trace.prospect_name 'guchito S.A.S' - >>> prospect_tracker.prospect_tel - 3123423422 - >>> prospect_tracker.prospect_city + >>> prospect_trace.prospect_city + 'Bogotá' ---------------------------------------------------------------------------- -Como operador quiero poder registrar una llamada para luego generar reportes +Como operador quiero registrar una llamada para luego generar reportes ---------------------------------------------------------------------------- Crear llamada a un seguimiento de prospecto:: @@ -52,13 +57,11 @@ Crear llamada a un seguimiento de prospecto:: >>> call = Call() >>> call.description = 'Descripción u observaciones de la llamada' - >>> call.prospect_tracker = prospect_tracker + >>> call.prospect_trace = prospect_trace >>> call.save() - >>> call.prospect_tracker.prospect_name + >>> call.prospect_trace.prospect_name 'guchito S.A.S' - >>> call.prospect_tracker.prospect_tel - 3123423422 >>> call.date == date.today() True @@ -67,14 +70,14 @@ Crear otra llamada al mismo seguimiento de prospecto:: >>> call = Call() >>> call.description = 'Segunda llamada al mismo seguimiento' - >>> call.prospect_tracker = prospect_tracker + >>> call.prospect_trace = prospect_trace >>> call.save() - >>> call.prospect_tracker.prospect_name + >>> call.prospect_trace.prospect_name 'guchito S.A.S' - >>> call.prospect_tracker.prospect_tel - 3123423422 + >>> call.prospect_trace.prospect_city + 'Bogotá' >>> call.date == date.today() True - >>> len(prospect_tracker.calls) == 2 + >>> len(prospect_trace.calls) == 2 True \ No newline at end of file diff --git a/view/call_form.xml b/view/call_form.xml index e458297..76a00ab 100644 --- a/view/call_form.xml +++ b/view/call_form.xml @@ -5,8 +5,8 @@ this repository contains the full copyright notices and license terms. --> <label name="date"/> <field name="date"/> - <label name="prospect_tracker"/> - <field name="prospect_tracker"/> + <label name="prospect_trace"/> + <field name="prospect_trace"/> <label name="description"/> <field name="description"/> diff --git a/view/call_tree.xml b/view/call_tree.xml index 3227f70..270b568 100644 --- a/view/call_tree.xml +++ b/view/call_tree.xml @@ -4,5 +4,5 @@ this repository contains the full copyright notices and license terms. --> <tree> <field name="date"/> <field name="description"/> - <field name="prospect_tracker"/> + <field name="prospect_trace"/> </tree> \ No newline at end of file From 4d8c520bb0db9b3e63bf7e7113f21eb7b87f2d22 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:47:09 +0000 Subject: [PATCH 14/17] chore: remove dead code --- prospect.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/prospect.py b/prospect.py index 820d8cc..c605a2a 100644 --- a/prospect.py +++ b/prospect.py @@ -9,7 +9,6 @@ class Prospect(ModelSQL, ModelView): name = fields.Char('Name') city = fields.Char('City') - # Un prospecto (clase actual) se vincula a Muchos mecanismos de contacto (propiedad actual) contact_methods = fields.One2Many('prospect.contact_method', 'prospect', 'Contact methods') @@ -26,6 +25,5 @@ class ContactMethod(ModelSQL, ModelView): value = fields.Char('Value') - # Muchos mecanismos de contacto (clase actual) se vinculan a un prospecto (propiedad actual) prospect = fields.Many2One('sale.prospect', 'Prospect') From 60e0096c061479dd48e328425be5479fba61a189 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 01:55:56 +0000 Subject: [PATCH 15/17] feat(vista de prospectos): Se crea vista de prospectos --- call.xml | 2 +- prospect.xml | 43 ++++++++++++++++++++++++++++++++++++++++++ prospect_trace.xml | 2 +- tryton.cfg | 3 ++- view/prospect_form.xml | 13 +++++++++++++ view/prospect_tree.xml | 8 ++++++++ 6 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 prospect.xml create mode 100644 view/prospect_form.xml create mode 100644 view/prospect_tree.xml diff --git a/call.xml b/call.xml index 6ed94e4..d3ba877 100644 --- a/call.xml +++ b/call.xml @@ -4,7 +4,7 @@ this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.action.act_window" id="act_call_tree"> - <field name="name">Calls</field> + <field name="name">Prospect</field> <field name="res_model">sale.call</field> </record> diff --git a/prospect.xml b/prospect.xml new file mode 100644 index 0000000..cdd107a --- /dev/null +++ b/prospect.xml @@ -0,0 +1,43 @@ +<?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.act_window" id="act_prospect_tree"> + <field name="name">prospect</field> + <field name="res_model">sale.prospect</field> + </record> + + <record model="ir.ui.view" id="prospect_view_tree"> + <field name="model">sale.prospect</field> + <field name="type">tree</field> + <field name="name">prospect_tree</field> + </record> + <record model="ir.ui.view" id="prospect_view_form"> + <field name="model">sale.prospect</field> + <field name="type">form</field> + <field name="name">prospect_form</field> + </record> + + <record model="ir.action.act_window.view" id="act_prospect_tree_view1"> + <field name="sequence" eval="10"/> + <field name="view" ref="prospect_view_tree"/> + <field name="act_window" ref="act_prospect_tree"/> + </record> + <record model="ir.action.act_window.view" id="act_prospect_form_view1"> + <field name="sequence" eval="20"/> + <field name="view" ref="prospect_view_form"/> + <field name="act_window" ref="act_prospect_tree"/> + </record> + + <menuitem + name="prospects" + sequence="10" + id="menu_prospects"/> + <menuitem + parent="menu_prospects" + sequence="20" + id="menu_prospects_tree" + action="act_prospect_tree"/> + </data> +</tryton> \ No newline at end of file diff --git a/prospect_trace.xml b/prospect_trace.xml index 87997b3..b534a16 100644 --- a/prospect_trace.xml +++ b/prospect_trace.xml @@ -4,7 +4,7 @@ this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.action.act_window" id="act_prospect_trace_tree"> - <field name="name">Prospect Trace</field> + <field name="name">Prospect Traces</field> <field name="res_model">sale.prospect_trace</field> </record> diff --git a/tryton.cfg b/tryton.cfg index 29ee8c3..98e91c6 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -4,4 +4,5 @@ depends: ir xml: call.xml - prospect_trace.xml \ No newline at end of file + prospect_trace.xml + prospect.xml \ No newline at end of file diff --git a/view/prospect_form.xml b/view/prospect_form.xml new file mode 100644 index 0000000..84af981 --- /dev/null +++ b/view/prospect_form.xml @@ -0,0 +1,13 @@ +<?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="name"/> + <field name="name"/> + + <label name="city"/> + <field name="city"/> + + <label name="contact_methods"/> + <field name="contact_methods"/> +</form> \ No newline at end of file diff --git a/view/prospect_tree.xml b/view/prospect_tree.xml new file mode 100644 index 0000000..00b9694 --- /dev/null +++ b/view/prospect_tree.xml @@ -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="name"/> + <field name="city"/> + <field name="contact_methods"/> +</tree> \ No newline at end of file From 51dcc6ff5ed744c81a6d89c93eccf071f0be79ff Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 02:00:38 +0000 Subject: [PATCH 16/17] fix: Se arregla secuancia de vistas --- call.xml | 2 +- prospect.xml | 6 +----- prospect_trace.xml | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/call.xml b/call.xml index d3ba877..8d41162 100644 --- a/call.xml +++ b/call.xml @@ -36,7 +36,7 @@ this repository contains the full copyright notices and license terms. --> id="menu_calls"/> <menuitem parent="menu_calls" - sequence="20" + sequence="30" id="menu_calls_tree" action="act_call_tree"/> </data> diff --git a/prospect.xml b/prospect.xml index cdd107a..f254d97 100644 --- a/prospect.xml +++ b/prospect.xml @@ -31,12 +31,8 @@ this repository contains the full copyright notices and license terms. --> </record> <menuitem - name="prospects" + parent="menu_calls" sequence="10" - id="menu_prospects"/> - <menuitem - parent="menu_prospects" - sequence="20" id="menu_prospects_tree" action="act_prospect_tree"/> </data> diff --git a/prospect_trace.xml b/prospect_trace.xml index b534a16..e06663b 100644 --- a/prospect_trace.xml +++ b/prospect_trace.xml @@ -32,7 +32,7 @@ this repository contains the full copyright notices and license terms. --> <menuitem parent="menu_calls" - sequence="10" + sequence="20" id="menu_prospect_trace_tree" action="act_prospect_trace_tree"/> </data> From 0fe8ede9fdd660a3d65dd136c1a62848297afdb8 Mon Sep 17 00:00:00 2001 From: camilogs <camilo.gonzalez.col@gmail.com> Date: Sun, 30 Jul 2023 02:12:57 +0000 Subject: [PATCH 17/17] Chore: Se cambian nombres de vistas --- call.xml | 2 +- prospect.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/call.xml b/call.xml index 8d41162..fbdd32a 100644 --- a/call.xml +++ b/call.xml @@ -4,7 +4,7 @@ this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.action.act_window" id="act_call_tree"> - <field name="name">Prospect</field> + <field name="name">Calls</field> <field name="res_model">sale.call</field> </record> diff --git a/prospect.xml b/prospect.xml index f254d97..3bb663a 100644 --- a/prospect.xml +++ b/prospect.xml @@ -4,7 +4,7 @@ this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.action.act_window" id="act_prospect_tree"> - <field name="name">prospect</field> + <field name="name">Prospects</field> <field name="res_model">sale.prospect</field> </record>