From f9b325fe230ea4ecba4074604435dfcc8ab95d0e Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Fri, 5 Feb 2021 16:42:41 +0000 Subject: [PATCH 01/23] [ADD] sale_crm_event_reservation: sell events like a boss This module extends the functionality of *crm_event*, *event_sale_reservation* and *sale_crm* to support fast generation of event quotations from opportunities and to allow you to sell events like a boss. @Tecnativa TT27664 [UPD] Update sale_crm_event_reservation.pot [UPD] README.rst --- sale_crm_event_reservation/README.rst | 124 +++++ sale_crm_event_reservation/__init__.py | 2 + sale_crm_event_reservation/__manifest__.py | 22 + sale_crm_event_reservation/i18n/es.po | 146 ++++++ .../i18n/sale_crm_event_reservation.pot | 145 ++++++ .../readme/CONFIGURE.rst | 4 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 + sale_crm_event_reservation/readme/INSTALL.rst | 4 + sale_crm_event_reservation/readme/USAGE.rst | 21 + .../reports/__init__.py | 1 + .../reports/event_type_report.py | 14 + .../reports/event_type_report_views.xml | 28 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 466 ++++++++++++++++++ sale_crm_event_reservation/tests/__init__.py | 1 + .../tests/test_wizard.py | 127 +++++ .../views/crm_lead_views.xml | 18 + .../wizards/__init__.py | 1 + .../wizards/crm_lead_event_sale_wizard.py | 128 +++++ .../crm_lead_event_sale_wizard_views.xml | 43 ++ 21 files changed, 1299 insertions(+) create mode 100644 sale_crm_event_reservation/README.rst create mode 100644 sale_crm_event_reservation/__init__.py create mode 100644 sale_crm_event_reservation/__manifest__.py create mode 100644 sale_crm_event_reservation/i18n/es.po create mode 100644 sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot create mode 100644 sale_crm_event_reservation/readme/CONFIGURE.rst create mode 100644 sale_crm_event_reservation/readme/CONTRIBUTORS.rst create mode 100644 sale_crm_event_reservation/readme/DESCRIPTION.rst create mode 100644 sale_crm_event_reservation/readme/INSTALL.rst create mode 100644 sale_crm_event_reservation/readme/USAGE.rst create mode 100644 sale_crm_event_reservation/reports/__init__.py create mode 100644 sale_crm_event_reservation/reports/event_type_report.py create mode 100644 sale_crm_event_reservation/reports/event_type_report_views.xml create mode 100644 sale_crm_event_reservation/static/description/icon.png create mode 100644 sale_crm_event_reservation/static/description/index.html create mode 100644 sale_crm_event_reservation/tests/__init__.py create mode 100644 sale_crm_event_reservation/tests/test_wizard.py create mode 100644 sale_crm_event_reservation/views/crm_lead_views.xml create mode 100644 sale_crm_event_reservation/wizards/__init__.py create mode 100644 sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py create mode 100644 sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml diff --git a/sale_crm_event_reservation/README.rst b/sale_crm_event_reservation/README.rst new file mode 100644 index 000000000..a310062f1 --- /dev/null +++ b/sale_crm_event_reservation/README.rst @@ -0,0 +1,124 @@ +========================================== +Create event quotations from opportunities +========================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fevent-lightgray.png?logo=github + :target: https://github.com/OCA/event/tree/12.0/sale_crm_event_reservation + :alt: OCA/event +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/event-12-0/event-12-0-sale_crm_event_reservation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/199/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of *crm_event*, *event_sale_reservation* +and *sale_crm* to support fast generation of event quotations from +opportunities and to allow you to sell events like a boss. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +To install this module, you need to: + +#. Install *crm_event* and *event_sale_reservation* from + https://github.com/OCA/event. + +Configuration +============= + +To make use of this module, a user needs these minimal permissions: + +- Sales / User: Own Documents Only +- Events / User + +Usage +===== + +To use this module, you need to: + +#. Go to *CRM > My Pipeline*. +#. Create one opportunity. +#. Set basic fields. +#. Set *Customer*, *Event type* and *Seats Wanted*. +#. Click on *New Event Quotation*. + +A wizard will open. If you want to register the customer in an scheduled event: + +#. Select *Mode = Register in scheduled event*. +#. Select *Event* and *Ticket* +#. Click on *Generate quotation* + +Instead, if you want to reserve some seats for the customer in some upcoming event: + +#. Select *Mode = Reserve upcoming event*. +#. Select *Product*, which must be a reservation product for the chosen event type. +#. Click on *Generate quotation* + +In either case, you will be presented with a sale order created just for you. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* Jairo Llopis (https://www.tecnativa.com) + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-Yajo| image:: https://github.com/Yajo.png?size=40px + :target: https://github.com/Yajo + :alt: Yajo + +Current `maintainer `__: + +|maintainer-Yajo| + +This module is part of the `OCA/event `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_crm_event_reservation/__init__.py b/sale_crm_event_reservation/__init__.py new file mode 100644 index 000000000..8b31d3971 --- /dev/null +++ b/sale_crm_event_reservation/__init__.py @@ -0,0 +1,2 @@ +from . import reports +from . import wizards diff --git a/sale_crm_event_reservation/__manifest__.py b/sale_crm_event_reservation/__manifest__.py new file mode 100644 index 000000000..ebcfe70fa --- /dev/null +++ b/sale_crm_event_reservation/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Create event quotations from opportunities", + "summary": "Combine event reservations, opportunities and quotations", + "version": "12.0.1.0.0", + "development_status": "Production/Stable", + "category": "Marketing", + "website": "https://github.com/OCA/event", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["Yajo"], + "license": "AGPL-3", + "application": False, + "installable": True, + "auto_install": True, + "depends": ["crm_event", "event_sale_reservation", "sale_crm"], + "data": [ + "reports/event_type_report_views.xml", + "wizards/crm_lead_event_sale_wizard_views.xml", + "views/crm_lead_views.xml", + ], +} diff --git a/sale_crm_event_reservation/i18n/es.po b/sale_crm_event_reservation/i18n/es.po new file mode 100644 index 000000000..d976ee432 --- /dev/null +++ b/sale_crm_event_reservation/i18n/es.po @@ -0,0 +1,146 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_crm_event_reservation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-02-05 16:37+0000\n" +"PO-Revision-Date: 2021-02-05 16:38+0000\n" +"Last-Translator: Jairo Llopis \n" +"Language-Team: \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_lead_event_sale_wizard_view_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_id +msgid "Event" +msgstr "Evento" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id +msgid "Event type" +msgstr "Categoría de evento" + +#. module: sale_crm_event_reservation +#: model:ir.actions.act_window,name:sale_crm_event_reservation.crm_lead_event_sale_wizard_action +msgid "Generate event quotation" +msgstr "Generar presupuesto para evento" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_lead_event_sale_wizard_view_form +msgid "Generate quotation" +msgstr "Generar presupuesto" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__mode +msgid "How to create the event quotation?" +msgstr "¿Cómo presupuestar el evento?" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__id +msgid "ID" +msgstr "ID" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted +msgid "" +"If this lead/opportunity is related to a specific event type, indicate how " +"many seats would you sell if won." +msgstr "" +"Si esta iniciativa u oportunidad está relacionada con una categoría " +"específica de evento, indique cuántas plazas vendería si se gana." + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id +msgid "" +"If this lead/opportunity is related to a specific event type, indicate it " +"here." +msgstr "" +"Si esta iniciativa u oportunidad está relacionada con una categoría " +"específica de evento, indíquelo aquí." + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__mode +msgid "Mode" +msgstr "Modo" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_case_form_view_oppor +msgid "New Event Quotation" +msgstr "Presupuestar evento" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__opportunity_id +msgid "Opportunity" +msgstr "Oportunidad" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__product_id +msgid "Product" +msgstr "Producto" + +#. module: sale_crm_event_reservation +#: selection:crm.lead.event.sale.wizard,mode:0 +msgid "Register in scheduled event" +msgstr "Registrar en un evento ya programado" + +#. module: sale_crm_event_reservation +#: selection:crm.lead.event.sale.wizard,mode:0 +msgid "Reserve upcoming event" +msgstr "Reservar un evento futuro" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted +msgid "Seats Wanted" +msgstr "Asientos deseados" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_ticket_id +msgid "Ticket" +msgstr "Ticket" + +#. module: sale_crm_event_reservation +#: model:ir.model,name:sale_crm_event_reservation.model_crm_lead_event_sale_wizard +msgid "Wizard to generate event quotation from event opportunity" +msgstr "Asistente para presupuestar eventos desde una oportunidad de evento" diff --git a/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot new file mode 100644 index 000000000..cb696e052 --- /dev/null +++ b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot @@ -0,0 +1,145 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_crm_event_reservation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_lead_event_sale_wizard_view_form +msgid "Cancel" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_id +msgid "Event" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model,name:sale_crm_event_reservation.model_event_type_report +msgid "Event categories analysis report" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id +msgid "Event category" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.actions.act_window,name:sale_crm_event_reservation.crm_lead_event_sale_wizard_action +msgid "Generate event quotation" +msgstr "" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_lead_event_sale_wizard_view_form +msgid "Generate quotation" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__mode +msgid "How to create the event quotation?" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__id +msgid "ID" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted +msgid "If this lead/opportunity is related to a specific event category, indicate how many seats would you sell if won." +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id +msgid "If this lead/opportunity is related to a specific event category, indicate it here." +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__mode +msgid "Mode" +msgstr "" + +#. module: sale_crm_event_reservation +#: model_terms:ir.ui.view,arch_db:sale_crm_event_reservation.crm_case_form_view_oppor +msgid "New Event Quotation" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__opportunity_id +msgid "Opportunity" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__product_id +msgid "Product" +msgstr "" + +#. module: sale_crm_event_reservation +#: selection:crm.lead.event.sale.wizard,mode:0 +msgid "Register in scheduled event" +msgstr "" + +#. module: sale_crm_event_reservation +#: selection:crm.lead.event.sale.wizard,mode:0 +msgid "Reserve upcoming event" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_event_type_report__seats_reservation_total +msgid "Reserved seats" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted +msgid "Seats Wanted" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_ticket_id +msgid "Ticket" +msgstr "" + +#. module: sale_crm_event_reservation +#: model:ir.model,name:sale_crm_event_reservation.model_crm_lead_event_sale_wizard +msgid "Wizard to generate event quotation from event opportunity" +msgstr "" + diff --git a/sale_crm_event_reservation/readme/CONFIGURE.rst b/sale_crm_event_reservation/readme/CONFIGURE.rst new file mode 100644 index 000000000..3e1ff454b --- /dev/null +++ b/sale_crm_event_reservation/readme/CONFIGURE.rst @@ -0,0 +1,4 @@ +To make use of this module, a user needs these minimal permissions: + +- Sales / User: Own Documents Only +- Events / User diff --git a/sale_crm_event_reservation/readme/CONTRIBUTORS.rst b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..cfe37df6a --- /dev/null +++ b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Jairo Llopis (https://www.tecnativa.com) diff --git a/sale_crm_event_reservation/readme/DESCRIPTION.rst b/sale_crm_event_reservation/readme/DESCRIPTION.rst new file mode 100644 index 000000000..b5856b162 --- /dev/null +++ b/sale_crm_event_reservation/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module extends the functionality of *crm_event*, *event_sale_reservation* +and *sale_crm* to support fast generation of event quotations from +opportunities and to allow you to sell events like a boss. diff --git a/sale_crm_event_reservation/readme/INSTALL.rst b/sale_crm_event_reservation/readme/INSTALL.rst new file mode 100644 index 000000000..49a1ab408 --- /dev/null +++ b/sale_crm_event_reservation/readme/INSTALL.rst @@ -0,0 +1,4 @@ +To install this module, you need to: + +#. Install *crm_event* and *event_sale_reservation* from + https://github.com/OCA/event. diff --git a/sale_crm_event_reservation/readme/USAGE.rst b/sale_crm_event_reservation/readme/USAGE.rst new file mode 100644 index 000000000..d78b722ef --- /dev/null +++ b/sale_crm_event_reservation/readme/USAGE.rst @@ -0,0 +1,21 @@ +To use this module, you need to: + +#. Go to *CRM > My Pipeline*. +#. Create one opportunity. +#. Set basic fields. +#. Set *Customer*, *Event type* and *Seats Wanted*. +#. Click on *New Event Quotation*. + +A wizard will open. If you want to register the customer in an scheduled event: + +#. Select *Mode = Register in scheduled event*. +#. Select *Event* and *Ticket* +#. Click on *Generate quotation* + +Instead, if you want to reserve some seats for the customer in some upcoming event: + +#. Select *Mode = Reserve upcoming event*. +#. Select *Product*, which must be a reservation product for the chosen event type. +#. Click on *Generate quotation* + +In either case, you will be presented with a sale order created just for you. diff --git a/sale_crm_event_reservation/reports/__init__.py b/sale_crm_event_reservation/reports/__init__.py new file mode 100644 index 000000000..1274103c2 --- /dev/null +++ b/sale_crm_event_reservation/reports/__init__.py @@ -0,0 +1 @@ +from . import event_type_report diff --git a/sale_crm_event_reservation/reports/event_type_report.py b/sale_crm_event_reservation/reports/event_type_report.py new file mode 100644 index 000000000..03dfc6ad9 --- /dev/null +++ b/sale_crm_event_reservation/reports/event_type_report.py @@ -0,0 +1,14 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class EventTypeReport(models.Model): + _inherit = "event.type.report" + + seats_reservation_total = fields.Integer(string="Reserved seats", readonly=True) + + def _select(self, fields_=()): + fields_ += (("seats_reservation_total", "et.seats_reservation_total"),) + return super()._select(fields_) diff --git a/sale_crm_event_reservation/reports/event_type_report_views.xml b/sale_crm_event_reservation/reports/event_type_report_views.xml new file mode 100644 index 000000000..c1c84feb5 --- /dev/null +++ b/sale_crm_event_reservation/reports/event_type_report_views.xml @@ -0,0 +1,28 @@ + + + + + + Add reservations to event category pivot + event.type.report + + + + + + + + + + Add reservations to event category graph + event.type.report + + + + + + + + + diff --git a/sale_crm_event_reservation/static/description/icon.png b/sale_crm_event_reservation/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_crm_event_reservation/static/description/index.html b/sale_crm_event_reservation/static/description/index.html new file mode 100644 index 000000000..e0fbe7224 --- /dev/null +++ b/sale_crm_event_reservation/static/description/index.html @@ -0,0 +1,466 @@ + + + + + + +Create event quotations from opportunities + + + +
+

Create event quotations from opportunities

+ + +

Production/Stable License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

+

This module extends the functionality of crm_event, event_sale_reservation +and sale_crm to support fast generation of event quotations from +opportunities and to allow you to sell events like a boss.

+

Table of contents

+ +
+

Installation

+

To install this module, you need to:

+
    +
  1. Install crm_event and event_sale_reservation from +https://github.com/OCA/event.
  2. +
+
+
+

Configuration

+

To make use of this module, a user needs these minimal permissions:

+
    +
  • Sales / User: Own Documents Only
  • +
  • Events / User
  • +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to CRM > My Pipeline.
  2. +
  3. Create one opportunity.
  4. +
  5. Set basic fields.
  6. +
  7. Set Customer, Event type and Seats Wanted.
  8. +
  9. Click on New Event Quotation.
  10. +
+

A wizard will open. If you want to register the customer in an scheduled event:

+
    +
  1. Select Mode = Register in scheduled event.
  2. +
  3. Select Event and Ticket
  4. +
  5. Click on Generate quotation
  6. +
+

Instead, if you want to reserve some seats for the customer in some upcoming event:

+
    +
  1. Select Mode = Reserve upcoming event.
  2. +
  3. Select Product, which must be a reservation product for the chosen event type.
  4. +
  5. Click on Generate quotation
  6. +
+

In either case, you will be presented with a sale order created just for you.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

Yajo

+

This module is part of the OCA/event project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/sale_crm_event_reservation/tests/__init__.py b/sale_crm_event_reservation/tests/__init__.py new file mode 100644 index 000000000..d74b9f7a1 --- /dev/null +++ b/sale_crm_event_reservation/tests/__init__.py @@ -0,0 +1 @@ +from . import test_wizard diff --git a/sale_crm_event_reservation/tests/test_wizard.py b/sale_crm_event_reservation/tests/test_wizard.py new file mode 100644 index 000000000..0784db086 --- /dev/null +++ b/sale_crm_event_reservation/tests/test_wizard.py @@ -0,0 +1,127 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from datetime import datetime, timedelta +from odoo.tests.common import Form, SavepointCase + + +class OpportunityCase(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.pricelist = cls.env["product.pricelist"].create( + { + "name": "Test pricelist", + "currency_id": cls.env.user.company_id.currency_id.id, + "item_ids": [ + ( + 0, + 0, + { + "applied_on": "3_global", + "compute_price": "formula", + "base": "list_price", + }, + ) + ], + } + ) + cls.partner_1 = cls.env["res.partner"].create( + [{"name": "Fulanito", "property_product_pricelist": cls.pricelist.id}] + ) + cls.event_type_1 = cls.env["event.type"].create({"name": "Ev. Type 1"}) + cls.product_reservation_1 = cls.env["product.product"].create( + { + "event_reservation_ok": True, + "event_reservation_type_id": cls.event_type_1.id, + "lst_price": 11, + "name": "reservation for ev. type 1", + } + ) + cls.product_ticket_1 = cls.env["product.product"].create( + {"name": "events ticket", "event_ok": True, "lst_price": 10} + ) + cls.event_1 = cls.env["event.event"].create( + { + "name": "Ev. 1", + "date_begin": datetime.now() + timedelta(days=1), + "date_end": datetime.now() + timedelta(days=2), + "event_ticket_ids": [ + ( + 0, + 0, + { + "name": "ticket 1", + "product_id": cls.product_ticket_1.id, + "price": 2, # Differs from product price + }, + ) + ], + } + ) + cls.opportunity_1 = cls.env["crm.lead"].create( + { + "partner_id": cls.partner_1.id, + "name": "I'm selling an event!", + "event_type_id": cls.event_type_1.id, + "seats_wanted": 3, + } + ) + + def test_register(self): + """Generate event registration quotation.""" + wiz_form = Form( + self.env["crm.lead.event.sale.wizard"].with_context( + default_opportunity_id=self.opportunity_1.id + ) + ) + wiz_form.mode = "register" + wiz_form.event_id = self.event_1 + wiz_form.event_ticket_id = self.event_1.event_ticket_ids[0] + action = wiz_form.save().action_generate() + self.assertEqual(action["res_model"], "sale.order") + so = self.env["sale.order"].browse(action["res_id"]) + self.assertEqual(so.order_line.product_id, self.product_ticket_1) + self.assertEqual(so.order_line.event_id, self.event_1) + self.assertEqual( + so.order_line.event_ticket_id, self.event_1.event_ticket_ids[0] + ) + self.assertTrue(so.order_line.event_ok) + self.assertEqual( + so.order_line.product_uom_qty, + 3, + "SO line qty = opportunity.seats_wanted", + ) + self.assertAlmostEqual( + so.amount_untaxed, + 6, + msg="Amount = opportunity.seats_wanted * ticket.price", + ) + self.assertEqual(so.state, "draft") + + def test_reserve(self): + """Generate event reservation quotation.""" + wiz_form = Form( + self.env["crm.lead.event.sale.wizard"].with_context( + default_opportunity_id=self.opportunity_1.id + ) + ) + wiz_form.mode = "reserve" + wiz_form.product_id = self.product_reservation_1 + action = wiz_form.save().action_generate() + self.assertEqual(action["res_model"], "sale.order") + so = self.env["sale.order"].browse(action["res_id"]) + self.assertEqual(so.order_line.product_id, self.product_reservation_1) + self.assertFalse(so.order_line.event_id) + self.assertFalse(so.order_line.event_ticket_id) + self.assertFalse(so.order_line.event_ok) + self.assertEqual( + so.order_line.product_uom_qty, + 3, + "SO line qty = opportunity.seats_wanted", + ) + self.assertAlmostEqual( + so.amount_untaxed, + 33, + msg="Amount = opportunity.seats_wanted * reservation.price", + ) + self.assertEqual(so.state, "draft") diff --git a/sale_crm_event_reservation/views/crm_lead_views.xml b/sale_crm_event_reservation/views/crm_lead_views.xml new file mode 100644 index 000000000..b0ff6d020 --- /dev/null +++ b/sale_crm_event_reservation/views/crm_lead_views.xml @@ -0,0 +1,18 @@ + + + + + + + Add button to create event quotation + crm.lead + + + + + + + diff --git a/sale_crm_event_reservation/wizards/__init__.py b/sale_crm_event_reservation/wizards/__init__.py new file mode 100644 index 000000000..17b6e4f62 --- /dev/null +++ b/sale_crm_event_reservation/wizards/__init__.py @@ -0,0 +1 @@ +from . import crm_lead_event_sale_wizard diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py new file mode 100644 index 000000000..3f5cda628 --- /dev/null +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py @@ -0,0 +1,128 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models +from odoo.tests.common import Form + + +class CRMLeadEventSale(models.TransientModel): + _name = "crm.lead.event.sale.wizard" + _description = "Wizard to generate event quotation from event opportunity" + + opportunity_id = fields.Many2one( + comodel_name="crm.lead", + index=True, + ondelete="cascade", + readonly=True, + required=True, + string="Opportunity", + ) + event_type_id = fields.Many2one( + readonly=True, + related="opportunity_id.event_type_id", + ) + mode = fields.Selection( + required=True, + selection=[ + ("register", "Register in scheduled event"), + ("reserve", "Reserve upcoming event"), + ], + help="How to create the event quotation?", + ) + seats_wanted = fields.Integer( + readonly=True, + related="opportunity_id.seats_wanted", + ) + product_id = fields.Many2one( + comodel_name="product.product", + domain=""" + [ + ("event_reservation_ok", "=", True), + ("event_reservation_type_id", "=", event_type_id), + ] + """, + context=""" + { + "default_event_reservation_ok": True, + "default_event_reservation_type_id": event_type_id, + } + """, + index=True, + ondelete="cascade", + string="Product", + ) + event_id = fields.Many2one( + comodel_name="event.event", + domain=""" + [ + ("event_type_id", "=", event_type_id), + ("date_end", ">=", datetime.date.today().strftime("%Y-%m-%d")), + ("state", "!=", "cancel"), + "|", + ("seats_availability", "=", "unlimited"), + ("seats_available", ">=", seats_wanted), + ] + """, + context=""" + { + "default_event_type_id": event_type_id, + } + """, + index=True, + ondelete="cascade", + string="Event", + ) + event_ticket_id = fields.Many2one( + comodel_name="event.event.ticket", + domain=""" + [ + ("event_id", "=", event_id), + "|", + ("deadline", "=", False), + ("deadline", ">=", datetime.date.today().strftime("%Y-%m-%d")), + "|", + ("seats_availability", "=", "unlimited"), + ("seats_available", ">=", seats_wanted), + ] + """, + context=""" + { + "default_event_id": event_id, + } + """, + index=True, + ondelete="cascade", + string="Ticket", + ) + + def action_generate(self): + """Create an event reservation sales order.""" + # Creating a sale order properly involves lots of onchanges, so here it + # is better to use `Form` to make sure we forget none + so_form = Form(self.env["sale.order"]) + so_form.campaign_id = self.opportunity_id.campaign_id + so_form.medium_id = self.opportunity_id.medium_id + so_form.opportunity_id = self.opportunity_id + so_form.origin = self.opportunity_id.name + so_form.partner_id = self.opportunity_id.partner_id + so_form.source_id = self.opportunity_id.source_id + so_form.team_id = self.opportunity_id.team_id + with so_form.order_line.new() as so_line: + if self.mode == "reserve": + assert self.product_id + so_line.product_id = self.product_id + so_line.product_uom_qty = self.opportunity_id.seats_wanted + elif self.mode == "register": + assert self.event_id + assert self.event_ticket_id + so_line.product_id = self.event_ticket_id.product_id + so_line.product_uom_qty = self.opportunity_id.seats_wanted + so_line.event_id = self.event_id + so_line.event_ticket_id = self.event_ticket_id + so = so_form.save() + return { + "res_id": so.id, + "res_model": "sale.order", + "type": "ir.actions.act_window", + "view_mode": "form", + } diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml new file mode 100644 index 000000000..3f08d2523 --- /dev/null +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml @@ -0,0 +1,43 @@ + + + + + + + Wizard to generate event quotation from event opportunity + crm.lead.event.sale.wizard + +
+ + + + + + + + + + + + + + + +
+
+
+
+
+ + + Generate event quotation + crm.lead.event.sale.wizard + form + form + new + + +
From 6e4ce3c7431caa1ca32655c1475bb7a7139c22da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Tue, 25 Jan 2022 12:54:58 +0100 Subject: [PATCH 02/23] [IMP] sale_crm_event_reservation: black, isort, prettier --- .../reports/event_type_report_views.xml | 9 ++-- .../tests/test_wizard.py | 9 ++-- .../views/crm_lead_views.xml | 14 ++++--- .../wizards/crm_lead_event_sale_wizard.py | 8 +--- .../crm_lead_event_sale_wizard_views.xml | 42 +++++++++++++------ 5 files changed, 47 insertions(+), 35 deletions(-) diff --git a/sale_crm_event_reservation/reports/event_type_report_views.xml b/sale_crm_event_reservation/reports/event_type_report_views.xml index c1c84feb5..fa184dd77 100644 --- a/sale_crm_event_reservation/reports/event_type_report_views.xml +++ b/sale_crm_event_reservation/reports/event_type_report_views.xml @@ -1,28 +1,25 @@ - + - Add reservations to event category pivot event.type.report - + - Add reservations to event category graph event.type.report - + - diff --git a/sale_crm_event_reservation/tests/test_wizard.py b/sale_crm_event_reservation/tests/test_wizard.py index 0784db086..2c9493940 100644 --- a/sale_crm_event_reservation/tests/test_wizard.py +++ b/sale_crm_event_reservation/tests/test_wizard.py @@ -1,6 +1,7 @@ # Copyright 2021 Tecnativa - Jairo Llopis # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from datetime import datetime, timedelta + from odoo.tests.common import Form, SavepointCase @@ -87,9 +88,7 @@ def test_register(self): ) self.assertTrue(so.order_line.event_ok) self.assertEqual( - so.order_line.product_uom_qty, - 3, - "SO line qty = opportunity.seats_wanted", + so.order_line.product_uom_qty, 3, "SO line qty = opportunity.seats_wanted", ) self.assertAlmostEqual( so.amount_untaxed, @@ -115,9 +114,7 @@ def test_reserve(self): self.assertFalse(so.order_line.event_ticket_id) self.assertFalse(so.order_line.event_ok) self.assertEqual( - so.order_line.product_uom_qty, - 3, - "SO line qty = opportunity.seats_wanted", + so.order_line.product_uom_qty, 3, "SO line qty = opportunity.seats_wanted", ) self.assertAlmostEqual( so.amount_untaxed, diff --git a/sale_crm_event_reservation/views/crm_lead_views.xml b/sale_crm_event_reservation/views/crm_lead_views.xml index b0ff6d020..5c7e2502c 100644 --- a/sale_crm_event_reservation/views/crm_lead_views.xml +++ b/sale_crm_event_reservation/views/crm_lead_views.xml @@ -1,18 +1,22 @@ - + - - Add button to create event quotation crm.lead - diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py index 3f5cda628..53a03b6c1 100644 --- a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py @@ -18,8 +18,7 @@ class CRMLeadEventSale(models.TransientModel): string="Opportunity", ) event_type_id = fields.Many2one( - readonly=True, - related="opportunity_id.event_type_id", + readonly=True, related="opportunity_id.event_type_id", ) mode = fields.Selection( required=True, @@ -29,10 +28,7 @@ class CRMLeadEventSale(models.TransientModel): ], help="How to create the event quotation?", ) - seats_wanted = fields.Integer( - readonly=True, - related="opportunity_id.seats_wanted", - ) + seats_wanted = fields.Integer(readonly=True, related="opportunity_id.seats_wanted",) product_id = fields.Many2one( comodel_name="product.product", domain=""" diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml index 3f08d2523..1d8ccc0b9 100644 --- a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml @@ -1,11 +1,11 @@ - + - - - Wizard to generate event quotation from event opportunity + Wizard to generate event quotation from event opportunity crm.lead.event.sale.wizard
@@ -16,22 +16,41 @@ - - - + + + - - + +
-
- Generate event quotation crm.lead.event.sale.wizard @@ -39,5 +58,4 @@ form new -
From eee8d25a783ee2e04eebe3e2b8f6eb7aed446258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Tue, 25 Jan 2022 13:00:40 +0100 Subject: [PATCH 03/23] [MIG] sale_crm_event_reservation: Migration to 13.0 TT31323 --- sale_crm_event_reservation/README.rst | 14 ++++++++------ sale_crm_event_reservation/__manifest__.py | 2 +- .../i18n/sale_crm_event_reservation.pot | 19 +++++++++++-------- .../readme/CONTRIBUTORS.rst | 4 +++- .../static/description/index.html | 11 +++++++---- .../tests/test_wizard.py | 2 +- .../crm_lead_event_sale_wizard_views.xml | 1 - 7 files changed, 31 insertions(+), 22 deletions(-) diff --git a/sale_crm_event_reservation/README.rst b/sale_crm_event_reservation/README.rst index a310062f1..99be2c37b 100644 --- a/sale_crm_event_reservation/README.rst +++ b/sale_crm_event_reservation/README.rst @@ -14,13 +14,13 @@ Create event quotations from opportunities :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fevent-lightgray.png?logo=github - :target: https://github.com/OCA/event/tree/12.0/sale_crm_event_reservation + :target: https://github.com/OCA/event/tree/13.0/sale_crm_event_reservation :alt: OCA/event .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/event-12-0/event-12-0-sale_crm_event_reservation + :target: https://translation.odoo-community.org/projects/event-13-0/event-13-0-sale_crm_event_reservation :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/199/12.0 + :target: https://runbot.odoo-community.org/runbot/199/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -81,7 +81,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -96,7 +96,9 @@ Authors Contributors ~~~~~~~~~~~~ -* Jairo Llopis (https://www.tecnativa.com) +* `Tecnativa `_: + + * Jairo Llopis Maintainers ~~~~~~~~~~~ @@ -119,6 +121,6 @@ Current `maintainer `__: |maintainer-Yajo| -This module is part of the `OCA/event `_ project on GitHub. +This module is part of the `OCA/event `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_crm_event_reservation/__manifest__.py b/sale_crm_event_reservation/__manifest__.py index ebcfe70fa..a934d7351 100644 --- a/sale_crm_event_reservation/__manifest__.py +++ b/sale_crm_event_reservation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Create event quotations from opportunities", "summary": "Combine event reservations, opportunities and quotations", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "development_status": "Production/Stable", "category": "Marketing", "website": "https://github.com/OCA/event", diff --git a/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot index cb696e052..84f1e9bee 100644 --- a/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot +++ b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * sale_crm_event_reservation +# * sale_crm_event_reservation # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,12 +70,16 @@ msgstr "" #. module: sale_crm_event_reservation #: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted -msgid "If this lead/opportunity is related to a specific event category, indicate how many seats would you sell if won." +msgid "" +"If this lead/opportunity is related to a specific event category, indicate " +"how many seats would you sell if won." msgstr "" #. module: sale_crm_event_reservation #: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id -msgid "If this lead/opportunity is related to a specific event category, indicate it here." +msgid "" +"If this lead/opportunity is related to a specific event category, indicate " +"it here." msgstr "" #. module: sale_crm_event_reservation @@ -114,12 +118,12 @@ msgid "Product" msgstr "" #. module: sale_crm_event_reservation -#: selection:crm.lead.event.sale.wizard,mode:0 +#: model:ir.model.fields.selection,name:sale_crm_event_reservation.selection__crm_lead_event_sale_wizard__mode__register msgid "Register in scheduled event" msgstr "" #. module: sale_crm_event_reservation -#: selection:crm.lead.event.sale.wizard,mode:0 +#: model:ir.model.fields.selection,name:sale_crm_event_reservation.selection__crm_lead_event_sale_wizard__mode__reserve msgid "Reserve upcoming event" msgstr "" @@ -142,4 +146,3 @@ msgstr "" #: model:ir.model,name:sale_crm_event_reservation.model_crm_lead_event_sale_wizard msgid "Wizard to generate event quotation from event opportunity" msgstr "" - diff --git a/sale_crm_event_reservation/readme/CONTRIBUTORS.rst b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst index cfe37df6a..8c4d96846 100644 --- a/sale_crm_event_reservation/readme/CONTRIBUTORS.rst +++ b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Jairo Llopis (https://www.tecnativa.com) +* `Tecnativa `_: + + * Jairo Llopis diff --git a/sale_crm_event_reservation/static/description/index.html b/sale_crm_event_reservation/static/description/index.html index e0fbe7224..00b8dc201 100644 --- a/sale_crm_event_reservation/static/description/index.html +++ b/sale_crm_event_reservation/static/description/index.html @@ -367,7 +367,7 @@

Create event quotations from opportunities

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

+

Production/Stable License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

This module extends the functionality of crm_event, event_sale_reservation and sale_crm to support fast generation of event quotations from opportunities and to allow you to sell events like a boss.

@@ -431,7 +431,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -445,7 +445,10 @@

Authors

@@ -457,7 +460,7 @@

Maintainers

promote its widespread use.

Current maintainer:

Yajo

-

This module is part of the OCA/event project on GitHub.

+

This module is part of the OCA/event project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/sale_crm_event_reservation/tests/test_wizard.py b/sale_crm_event_reservation/tests/test_wizard.py index 2c9493940..553a39439 100644 --- a/sale_crm_event_reservation/tests/test_wizard.py +++ b/sale_crm_event_reservation/tests/test_wizard.py @@ -12,7 +12,7 @@ def setUpClass(cls): cls.pricelist = cls.env["product.pricelist"].create( { "name": "Test pricelist", - "currency_id": cls.env.user.company_id.currency_id.id, + "currency_id": cls.env.company.currency_id.id, "item_ids": [ ( 0, diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml index 1d8ccc0b9..6392c2bd7 100644 --- a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard_views.xml @@ -54,7 +54,6 @@ Generate event quotation crm.lead.event.sale.wizard - form form new From d0b34dcaea0954a93708b6d653b4db414818af46 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 27 Apr 2022 08:32:10 +0200 Subject: [PATCH 04/23] [FIX] sale_crm_event_reservation: Downgrade to beta For complying with manifestoo requirements. --- sale_crm_event_reservation/README.rst | 4 ++-- sale_crm_event_reservation/__manifest__.py | 2 +- sale_crm_event_reservation/static/description/index.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sale_crm_event_reservation/README.rst b/sale_crm_event_reservation/README.rst index 99be2c37b..2121bf6eb 100644 --- a/sale_crm_event_reservation/README.rst +++ b/sale_crm_event_reservation/README.rst @@ -7,9 +7,9 @@ Create event quotations from opportunities !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status - :alt: Production/Stable + :alt: Beta .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 diff --git a/sale_crm_event_reservation/__manifest__.py b/sale_crm_event_reservation/__manifest__.py index a934d7351..cc754b24e 100644 --- a/sale_crm_event_reservation/__manifest__.py +++ b/sale_crm_event_reservation/__manifest__.py @@ -4,7 +4,7 @@ "name": "Create event quotations from opportunities", "summary": "Combine event reservations, opportunities and quotations", "version": "13.0.1.0.0", - "development_status": "Production/Stable", + "development_status": "Beta", "category": "Marketing", "website": "https://github.com/OCA/event", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/sale_crm_event_reservation/static/description/index.html b/sale_crm_event_reservation/static/description/index.html index 00b8dc201..0e3e6f426 100644 --- a/sale_crm_event_reservation/static/description/index.html +++ b/sale_crm_event_reservation/static/description/index.html @@ -367,7 +367,7 @@

Create event quotations from opportunities

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Production/Stable License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

This module extends the functionality of crm_event, event_sale_reservation and sale_crm to support fast generation of event quotations from opportunities and to allow you to sell events like a boss.

From a3e6732ff71eaac0e7ef5f38447d570c106d579c Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 27 Apr 2022 06:46:14 +0000 Subject: [PATCH 05/23] sale_crm_event_reservation 13.0.1.0.1 --- sale_crm_event_reservation/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_crm_event_reservation/__manifest__.py b/sale_crm_event_reservation/__manifest__.py index cc754b24e..9be4bfbe3 100644 --- a/sale_crm_event_reservation/__manifest__.py +++ b/sale_crm_event_reservation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Create event quotations from opportunities", "summary": "Combine event reservations, opportunities and quotations", - "version": "13.0.1.0.0", + "version": "13.0.1.0.1", "development_status": "Beta", "category": "Marketing", "website": "https://github.com/OCA/event", From 433844b01828fbd4301f62fa41615e895fa4198b Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 6 Mar 2023 16:36:29 +0100 Subject: [PATCH 06/23] [IMP] sale_crm_event_reservation: black, isort, prettier --- sale_crm_event_reservation/tests/test_wizard.py | 8 ++++++-- .../wizards/crm_lead_event_sale_wizard.py | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/sale_crm_event_reservation/tests/test_wizard.py b/sale_crm_event_reservation/tests/test_wizard.py index 553a39439..4e9309822 100644 --- a/sale_crm_event_reservation/tests/test_wizard.py +++ b/sale_crm_event_reservation/tests/test_wizard.py @@ -88,7 +88,9 @@ def test_register(self): ) self.assertTrue(so.order_line.event_ok) self.assertEqual( - so.order_line.product_uom_qty, 3, "SO line qty = opportunity.seats_wanted", + so.order_line.product_uom_qty, + 3, + "SO line qty = opportunity.seats_wanted", ) self.assertAlmostEqual( so.amount_untaxed, @@ -114,7 +116,9 @@ def test_reserve(self): self.assertFalse(so.order_line.event_ticket_id) self.assertFalse(so.order_line.event_ok) self.assertEqual( - so.order_line.product_uom_qty, 3, "SO line qty = opportunity.seats_wanted", + so.order_line.product_uom_qty, + 3, + "SO line qty = opportunity.seats_wanted", ) self.assertAlmostEqual( so.amount_untaxed, diff --git a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py index 53a03b6c1..3f5cda628 100644 --- a/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py +++ b/sale_crm_event_reservation/wizards/crm_lead_event_sale_wizard.py @@ -18,7 +18,8 @@ class CRMLeadEventSale(models.TransientModel): string="Opportunity", ) event_type_id = fields.Many2one( - readonly=True, related="opportunity_id.event_type_id", + readonly=True, + related="opportunity_id.event_type_id", ) mode = fields.Selection( required=True, @@ -28,7 +29,10 @@ class CRMLeadEventSale(models.TransientModel): ], help="How to create the event quotation?", ) - seats_wanted = fields.Integer(readonly=True, related="opportunity_id.seats_wanted",) + seats_wanted = fields.Integer( + readonly=True, + related="opportunity_id.seats_wanted", + ) product_id = fields.Many2one( comodel_name="product.product", domain=""" From 17ab191760651158b7da4378eb9c4b8a9e77c6d5 Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 7 Mar 2023 14:40:34 +0100 Subject: [PATCH 07/23] [MIG] sale_crm_event_reservation: Migration to 15.0 --- sale_crm_event_reservation/README.rst | 11 +++-- sale_crm_event_reservation/__manifest__.py | 3 +- sale_crm_event_reservation/i18n/es.po | 47 ++++++++++++++----- .../i18n/sale_crm_event_reservation.pot | 2 +- .../readme/CONTRIBUTORS.rst | 1 + .../security/ir.model.access.csv | 2 + .../static/description/index.html | 7 +-- .../tests/test_wizard.py | 9 ++-- .../views/crm_lead_views.xml | 1 + .../wizards/crm_lead_event_sale_wizard.py | 12 ++--- 10 files changed, 63 insertions(+), 32 deletions(-) create mode 100644 sale_crm_event_reservation/security/ir.model.access.csv diff --git a/sale_crm_event_reservation/README.rst b/sale_crm_event_reservation/README.rst index 2121bf6eb..d37df1576 100644 --- a/sale_crm_event_reservation/README.rst +++ b/sale_crm_event_reservation/README.rst @@ -14,13 +14,13 @@ Create event quotations from opportunities :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fevent-lightgray.png?logo=github - :target: https://github.com/OCA/event/tree/13.0/sale_crm_event_reservation + :target: https://github.com/OCA/event/tree/15.0/sale_crm_event_reservation :alt: OCA/event .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/event-13-0/event-13-0-sale_crm_event_reservation + :target: https://translation.odoo-community.org/projects/event-15-0/event-15-0-sale_crm_event_reservation :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/199/13.0 + :target: https://runbot.odoo-community.org/runbot/199/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -81,7 +81,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -99,6 +99,7 @@ Contributors * `Tecnativa `_: * Jairo Llopis + * Stefan Ungureanu Maintainers ~~~~~~~~~~~ @@ -121,6 +122,6 @@ Current `maintainer `__: |maintainer-Yajo| -This module is part of the `OCA/event `_ project on GitHub. +This module is part of the `OCA/event `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_crm_event_reservation/__manifest__.py b/sale_crm_event_reservation/__manifest__.py index 9be4bfbe3..972576274 100644 --- a/sale_crm_event_reservation/__manifest__.py +++ b/sale_crm_event_reservation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Create event quotations from opportunities", "summary": "Combine event reservations, opportunities and quotations", - "version": "13.0.1.0.1", + "version": "15.0.1.0.0", "development_status": "Beta", "category": "Marketing", "website": "https://github.com/OCA/event", @@ -16,6 +16,7 @@ "depends": ["crm_event", "event_sale_reservation", "sale_crm"], "data": [ "reports/event_type_report_views.xml", + "security/ir.model.access.csv", "wizards/crm_lead_event_sale_wizard_views.xml", "views/crm_lead_views.xml", ], diff --git a/sale_crm_event_reservation/i18n/es.po b/sale_crm_event_reservation/i18n/es.po index d976ee432..083d74b83 100644 --- a/sale_crm_event_reservation/i18n/es.po +++ b/sale_crm_event_reservation/i18n/es.po @@ -42,10 +42,15 @@ msgstr "Nombre mostrado" msgid "Event" msgstr "Evento" +#. module: sale_crm_event_reservation +#: model:ir.model,name:sale_crm_event_reservation.model_event_type_report +msgid "Event categories analysis report" +msgstr "" + #. module: sale_crm_event_reservation #: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id -msgid "Event type" -msgstr "Categoría de evento" +msgid "Event category" +msgstr "" #. module: sale_crm_event_reservation #: model:ir.actions.act_window,name:sale_crm_event_reservation.crm_lead_event_sale_wizard_action @@ -70,20 +75,16 @@ msgstr "ID" #. module: sale_crm_event_reservation #: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted msgid "" -"If this lead/opportunity is related to a specific event type, indicate how " -"many seats would you sell if won." +"If this lead/opportunity is related to a specific event category, indicate " +"how many seats would you sell if won." msgstr "" -"Si esta iniciativa u oportunidad está relacionada con una categoría " -"específica de evento, indique cuántas plazas vendería si se gana." #. module: sale_crm_event_reservation #: model:ir.model.fields,help:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__event_type_id msgid "" -"If this lead/opportunity is related to a specific event type, indicate it " -"here." +"If this lead/opportunity is related to a specific event category, indicate " +"it here." msgstr "" -"Si esta iniciativa u oportunidad está relacionada con una categoría " -"específica de evento, indíquelo aquí." #. module: sale_crm_event_reservation #: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard____last_update @@ -121,15 +122,20 @@ msgid "Product" msgstr "Producto" #. module: sale_crm_event_reservation -#: selection:crm.lead.event.sale.wizard,mode:0 +#: model:ir.model.fields.selection,name:sale_crm_event_reservation.selection__crm_lead_event_sale_wizard__mode__register msgid "Register in scheduled event" msgstr "Registrar en un evento ya programado" #. module: sale_crm_event_reservation -#: selection:crm.lead.event.sale.wizard,mode:0 +#: model:ir.model.fields.selection,name:sale_crm_event_reservation.selection__crm_lead_event_sale_wizard__mode__reserve msgid "Reserve upcoming event" msgstr "Reservar un evento futuro" +#. module: sale_crm_event_reservation +#: model:ir.model.fields,field_description:sale_crm_event_reservation.field_event_type_report__seats_reservation_total +msgid "Reserved seats" +msgstr "" + #. module: sale_crm_event_reservation #: model:ir.model.fields,field_description:sale_crm_event_reservation.field_crm_lead_event_sale_wizard__seats_wanted msgid "Seats Wanted" @@ -144,3 +150,20 @@ msgstr "Ticket" #: model:ir.model,name:sale_crm_event_reservation.model_crm_lead_event_sale_wizard msgid "Wizard to generate event quotation from event opportunity" msgstr "Asistente para presupuestar eventos desde una oportunidad de evento" + +#~ msgid "Event type" +#~ msgstr "Categoría de evento" + +#~ msgid "" +#~ "If this lead/opportunity is related to a specific event type, indicate " +#~ "how many seats would you sell if won." +#~ msgstr "" +#~ "Si esta iniciativa u oportunidad está relacionada con una categoría " +#~ "específica de evento, indique cuántas plazas vendería si se gana." + +#~ msgid "" +#~ "If this lead/opportunity is related to a specific event type, indicate it " +#~ "here." +#~ msgstr "" +#~ "Si esta iniciativa u oportunidad está relacionada con una categoría " +#~ "específica de evento, indíquelo aquí." diff --git a/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot index 84f1e9bee..c197292f3 100644 --- a/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot +++ b/sale_crm_event_reservation/i18n/sale_crm_event_reservation.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/sale_crm_event_reservation/readme/CONTRIBUTORS.rst b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst index 8c4d96846..bdf9d224a 100644 --- a/sale_crm_event_reservation/readme/CONTRIBUTORS.rst +++ b/sale_crm_event_reservation/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `Tecnativa `_: * Jairo Llopis + * Stefan Ungureanu diff --git a/sale_crm_event_reservation/security/ir.model.access.csv b/sale_crm_event_reservation/security/ir.model.access.csv new file mode 100644 index 000000000..b2b46276c --- /dev/null +++ b/sale_crm_event_reservation/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +sale_crm_event_reservation.access_crm_lead_event_sale_wizard,access_crm_lead_event_sale_wizard,sale_crm_event_reservation.model_crm_lead_event_sale_wizard,event.group_event_user,1,1,1,1 diff --git a/sale_crm_event_reservation/static/description/index.html b/sale_crm_event_reservation/static/description/index.html index 0e3e6f426..1cf691d37 100644 --- a/sale_crm_event_reservation/static/description/index.html +++ b/sale_crm_event_reservation/static/description/index.html @@ -367,7 +367,7 @@

Create event quotations from opportunities

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/event Translate me on Weblate Try me on Runbot

This module extends the functionality of crm_event, event_sale_reservation and sale_crm to support fast generation of event quotations from opportunities and to allow you to sell events like a boss.

@@ -431,7 +431,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -447,6 +447,7 @@

Contributors

@@ -460,7 +461,7 @@

Maintainers

promote its widespread use.

Current maintainer:

Yajo

-

This module is part of the OCA/event project on GitHub.

+

This module is part of the OCA/event project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/sale_crm_event_reservation/tests/test_wizard.py b/sale_crm_event_reservation/tests/test_wizard.py index 4e9309822..e3a975a3c 100644 --- a/sale_crm_event_reservation/tests/test_wizard.py +++ b/sale_crm_event_reservation/tests/test_wizard.py @@ -2,10 +2,10 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from datetime import datetime, timedelta -from odoo.tests.common import Form, SavepointCase +from odoo.tests.common import Form, TransactionCase -class OpportunityCase(SavepointCase): +class OpportunityCase(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -32,14 +32,15 @@ def setUpClass(cls): cls.event_type_1 = cls.env["event.type"].create({"name": "Ev. Type 1"}) cls.product_reservation_1 = cls.env["product.product"].create( { - "event_reservation_ok": True, + "sale_ok": True, + "detailed_type": "event_reservation", "event_reservation_type_id": cls.event_type_1.id, "lst_price": 11, "name": "reservation for ev. type 1", } ) cls.product_ticket_1 = cls.env["product.product"].create( - {"name": "events ticket", "event_ok": True, "lst_price": 10} + {"name": "events ticket", "detailed_type": "event", "lst_price": 10} ) cls.event_1 = cls.env["event.event"].create( { diff --git a/sale_crm_event_reservation/views/crm_lead_views.xml b/sale_crm_event_reservation/views/crm_lead_views.xml index 5c7e2502c..2999b3710 100644 --- a/sale_crm_event_reservation/views/crm_lead_views.xml +++ b/sale_crm_event_reservation/views/crm_lead_views.xml @@ -6,6 +6,7 @@ Add button to create event quotation crm.lead +