From cd5beaae9c87c7fc081e388d8621d4a49f10439d Mon Sep 17 00:00:00 2001 From: kenza Date: Thu, 30 May 2019 09:33:24 +0000 Subject: [PATCH] [ADD] #780370 : Add_module_event_refund --- smile_event_refund_registration/__init__.py | 7 + .../__manifest__.py | 27 ++ .../data/email_template.xml | 76 +++++ smile_event_refund_registration/i18n/fr.po | 275 ++++++++++++++++++ .../models/__init__.py | 5 + .../models/event_registration.py | 62 ++++ .../static/description/icon.png | Bin 0 -> 9433 bytes .../tests/__init__.py | 5 + .../tests/test_event_registration.py | 105 +++++++ .../views/event_registration.xml | 43 +++ .../wizard/__init__.py | 4 + .../wizard/event_refund.py | 42 +++ .../wizard/event_refund_view.xml | 36 +++ 13 files changed, 687 insertions(+) create mode 100644 smile_event_refund_registration/__init__.py create mode 100644 smile_event_refund_registration/__manifest__.py create mode 100644 smile_event_refund_registration/data/email_template.xml create mode 100644 smile_event_refund_registration/i18n/fr.po create mode 100644 smile_event_refund_registration/models/__init__.py create mode 100644 smile_event_refund_registration/models/event_registration.py create mode 100644 smile_event_refund_registration/static/description/icon.png create mode 100644 smile_event_refund_registration/tests/__init__.py create mode 100644 smile_event_refund_registration/tests/test_event_registration.py create mode 100644 smile_event_refund_registration/views/event_registration.xml create mode 100644 smile_event_refund_registration/wizard/__init__.py create mode 100644 smile_event_refund_registration/wizard/event_refund.py create mode 100644 smile_event_refund_registration/wizard/event_refund_view.xml diff --git a/smile_event_refund_registration/__init__.py b/smile_event_refund_registration/__init__.py new file mode 100644 index 000000000..e8d968b06 --- /dev/null +++ b/smile_event_refund_registration/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import models +from . import wizard +from . import tests diff --git a/smile_event_refund_registration/__manifest__.py b/smile_event_refund_registration/__manifest__.py new file mode 100644 index 000000000..0f043f66c --- /dev/null +++ b/smile_event_refund_registration/__manifest__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +{ + 'name': "Smile Event Refund Registration", + + 'description': """ + Cancel and Refund event + """, + 'author': "Smile", + "license": 'LGPL-3', + 'website': "http://www.smile.eu", + 'category': 'tools', + 'version': '0.1', + + 'depends': [ + 'base', + 'website_event', + 'event_sale', + ], + + 'data': [ + 'data/email_template.xml', + 'wizard/event_refund_view.xml', + 'views/event_registration.xml', + ], +} diff --git a/smile_event_refund_registration/data/email_template.xml b/smile_event_refund_registration/data/email_template.xml new file mode 100644 index 000000000..3847da825 --- /dev/null +++ b/smile_event_refund_registration/data/email_template.xml @@ -0,0 +1,76 @@ + + + + + Event: Refund Registration + + Refund ${object.event_id.name}: ${object.get_date_range_str()} + ${(object.event_id.organizer_id.email or object.event_id.user_id.email or '')|safe} + ${('"%s" <%s>' % (object.partner_id.name or object.name, object.partner_id.email or object.email)) | safe} + + + + + + + + + + + + + +
+ + + +
+ Your registration(Refunded)
+ + ${object.name} + +
+ ${'%s' % object.company_id.name} +
+
+
+
+ + + +
+
+ Hello ${object.name},
+ We're sorry to inform you that this event + % if 'website_url' in object.event_id and object.event_id.website_url: + ${object.event_id.name} + % else: + ${object.event_id.name} + % endif + on ${object.get_date_range_str()} has been Refund. +
+ % if 'website_url' in object.event_id and object.event_id.website_url: + + % endif +
+ Do not hesitate to contact us if you have any question. ,
+ + --
+ % if object.event_id.organizer_id: + ${object.event_id.organizer_id.name} + % else: + The organizers. + % endif +
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/smile_event_refund_registration/i18n/fr.po b/smile_event_refund_registration/i18n/fr.po new file mode 100644 index 000000000..3b13a0636 --- /dev/null +++ b/smile_event_refund_registration/i18n/fr.po @@ -0,0 +1,275 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * smile_refund_event_registration +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 14:29+0000\n" +"PO-Revision-Date: 2019-05-23 14:29+0000\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: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_refund +msgid "Are you sure you want to cancel this event? All the linked attendees will be cancelled as well." +msgstr "Etes-vous sûr que vous voulez annuler cet événement? Tous les participants liés seront également annulés." + +#. module: smile_refund_event_registration +#: model:mail.template,body_html:smile_refund_event_registration.refund_event_registration +msgid "\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" Your registration(Refunded)
\n" +" \n" +" ${object.name}\n" +" \n" +"
\n" +" \"${'%s'\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" Hello ${object.name},
\n" +" We're sorry to inform you that this event\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +" ${object.event_id.name}\n" +" % else:\n" +" ${object.event_id.name}\n" +" % endif\n" +" on ${object.get_date_range_str()} has been Refund.\n" +"
\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +"
\n" +" View Event
\n" +"
\n" +" % endif\n" +"
\n" +" Do not hesitate to contact us if you have any question. ,
\n" +" \n" +" --
\n" +" % if object.event_id.organizer_id:\n" +" ${object.event_id.organizer_id.name}\n" +" % else:\n" +" The organizers.\n" +" % endif\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" " +msgstr "\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" Votre inscription(Remboursé)
\n" +" \n" +" ${object.name}\n" +" \n" +"
\n" +" \"${'%s'\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" Bonjour ${object.name},
\n" +" Nous sommes désolés de vous informer que cet événement\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +" ${object.event_id.name}\n" +" % else:\n" +" ${object.event_id.name}\n" +" % endif\n" +" on ${object.get_date_range_str()} a été remboursé.\n" +"
\n" +" % if 'website_url' in object.event_id and object.event_id.website_url:\n" +"
\n" +" View Event
\n" +"
\n" +" % endif\n" +"
\n" +" N'hésitez pas à nous contacter si vous avez la moindre question.,
\n" +" \n" +" --
\n" +" % if object.event_id.organizer_id:\n" +" ${object.event_id.organizer_id.name}\n" +" % else:\n" +" Les organisateurs.\n" +" % endif\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" " + +#. module: smile_refund_event_registration +#: selection:event.registration,state:0 +msgid "Attended" +msgstr "Présent" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_refund +msgid "Cancel" +msgstr "Annuler" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.registration_view_id +msgid "Cancel and Refund" +msgstr "Annuler et rembourser" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_form +msgid "Cancel and Refund Event" +msgstr "Annuler et rembourser l'évenement" + +#. module: smile_refund_event_registration +#: selection:event.registration,state:0 +msgid "Cancelled" +msgstr "Annulé" + +#. module: smile_refund_event_registration +#: model:ir.actions.act_window,name:smile_refund_event_registration.action_event_refund +msgid "Confirmation" +msgstr "Confirmation" + +#. module: smile_refund_event_registration +#: selection:event.registration,state:0 +msgid "Confirmed" +msgstr "Confirmé" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__create_date +msgid "Created on" +msgstr "Nom affiché" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__event_id +msgid "Event" +msgstr "Evènement" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_refund +msgid "Event Refund" +msgstr "Evènement remboursé" + +#. module: smile_refund_event_registration +#: model:ir.model,name:smile_refund_event_registration.model_event_registration +msgid "Event Registration" +msgstr "Inscription à l'évènement" + +#. module: smile_refund_event_registration +#: code:addons/smile_refund_event_registration/models/event_registration.py:27 +#: model:ir.model,name:smile_refund_event_registration.model_event_refund +#, python-format +msgid "Event refund" +msgstr "Remboursement" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__id +msgid "ID" +msgstr "ID" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund____last_update +msgid "Last Modified on" +msgstr "Dernière Modification le" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_refund__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_refund +msgid "Ok" +msgstr "Ok" + +#. module: smile_refund_event_registration +#: model_terms:ir.ui.view,arch_db:smile_refund_event_registration.view_event_refund +msgid "Ok and Refund" +msgstr "Ok et rembourser" + +#. module: smile_refund_event_registration +#: selection:event.registration,state:0 +msgid "Refund" +msgstr "Remboursé" + +#. module: smile_refund_event_registration +#: model:mail.template,subject:smile_refund_event_registration.refund_event_registration +msgid "Refund ${object.event_id.name}: ${object.get_date_range_str()}" +msgstr "Remboursement ${object.event_id.name}: ${object.get_date_range_str()}" + +#. module: smile_refund_event_registration +#: model:ir.model.fields,field_description:smile_refund_event_registration.field_event_registration__state +msgid "Status" +msgstr "Statuts" + +#. module: smile_refund_event_registration +#: code:addons/smile_refund_event_registration/wizard/event_refund.py:31 +#, python-format +msgid "There are already attendees who attended this event. Please reset it to draft if you want to cancel this event." +msgstr "Il y a déjà des participants qui ont assisté à cet événement. S'il vous plaît réinitialiser le brouillon si vous voulez annuler cet événement" + +#. module: smile_refund_event_registration +#: selection:event.registration,state:0 +msgid "Unconfirmed" +msgstr "Non confirmé" + diff --git a/smile_event_refund_registration/models/__init__.py b/smile_event_refund_registration/models/__init__.py new file mode 100644 index 000000000..2a56e2e86 --- /dev/null +++ b/smile_event_refund_registration/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import event_registration diff --git a/smile_event_refund_registration/models/event_registration.py b/smile_event_refund_registration/models/event_registration.py new file mode 100644 index 000000000..57ed70dab --- /dev/null +++ b/smile_event_refund_registration/models/event_registration.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + + +from odoo import models, fields, api, _ + + +class EventRegistration(models.Model): + _inherit = 'event.registration' + + state = fields.Selection(selection_add=[('refund', 'Refund')]) + + @api.multi + def _send_mail(self): + self.ensure_one() + template = self.env.ref( + 'smile_event_refund_registration.refund_event_registration', False) + template.send_mail(self.id, force_send=True) + + @api.model + def prepare_account_invoice(self, invoice_id): + """ + Prepare values + """ + values = invoice_id.copy_data()[0] + values.update({'type': 'out_refund', 'name': _('Event refund')}) + return values + + @api.multi + def button_cancel_refund(self): + """ + Cancel and refund registration + """ + self.ensure_one() + return self._process_event_refund() + + @api.multi + def _process_event_refund(self): + """ + Process event refund + """ + self.ensure_one() + # create refund + state = 'cancel' + order = self.sale_order_id + if order: + if order.state in ('draft', 'sent'): + order.action_cancel() + # when invoicing + for invoice in order.invoice_ids: + if invoice.state == 'draft': + invoice.action_invoice_cancel() + elif invoice.state in ('open', 'paid'): + # Create refund + values = self.prepare_account_invoice(invoice) + self.env['account.invoice'].create(values) + state = 'refund' + # Send mail + self._send_mail() + # Update event + self.state = state diff --git a/smile_event_refund_registration/static/description/icon.png b/smile_event_refund_registration/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..17984e2d08aac83e8271009bdce6cfdd09195231 GIT binary patch literal 9433 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 Ms(LDQN;dEQAN$d}kN^Mx literal 0 HcmV?d00001 diff --git a/smile_event_refund_registration/tests/__init__.py b/smile_event_refund_registration/tests/__init__.py new file mode 100644 index 000000000..45b582c36 --- /dev/null +++ b/smile_event_refund_registration/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import test_event_registration diff --git a/smile_event_refund_registration/tests/test_event_registration.py b/smile_event_refund_registration/tests/test_event_registration.py new file mode 100644 index 000000000..12b6bc998 --- /dev/null +++ b/smile_event_refund_registration/tests/test_event_registration.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# (C) 2019 Smile () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import TransactionCase + + +class TestEventRegistration(TransactionCase): + + def setUp(self): + super(TestEventRegistration, self).setUp() + + self.EventRegistration = self.env['event.registration'] + + # First I create an event product + product = self.env['product.product'].create({ + 'name': 'test_formation', + 'type': 'service', + 'event_ok': True, + }) + + # I create an event from the same type than my product + event = self.env['event.event'].create({ + 'name': 'test_event', + 'event_type_id': 1, + 'date_end': '2012-01-01 19:05:15', + 'date_begin': '2012-01-01 18:05:15' + }) + + ticket = self.env['event.event.ticket'].create({ + 'name': 'test_ticket', + 'product_id': product.id, + 'event_id': event.id, + }) + + # I create a sales order + self.sale_order = self.env['sale.order'].create({ + 'partner_id': self.env.ref('base.res_partner_2').id, + 'note': 'Invoice after delivery', + 'payment_term_id': self.env.ref('account.account_payment_term').id + }) + + # In the sales order I add some sales order lines. i choose + # event product + self.env['sale.order.line'].create({ + 'product_id': product.id, + 'price_unit': 190.50, + 'product_uom': self.env.ref('uom.product_uom_unit').id, + 'product_uom_qty': 8.0, + 'order_id': self.sale_order.id, + 'name': 'sales order line', + 'event_id': event.id, + 'event_ticket_id': ticket.id, + }) + + # In the event registration I add some attendee detail lines. i choose + # event product + self.register_person = self.env['registration.editor'].create({ + 'sale_order_id': self.sale_order.id, + 'event_registration_ids': [(0, 0, { + 'event_id': event.id, + 'name': 'Administrator', + 'email': 'abc@example.com' + })], + }) + self.register_person.action_make_registration() + self.registration = self.EventRegistration.search( + [('origin', '=', self.sale_order.name)]) + self.sale_order.action_confirm() + context = { + 'active_model': 'sale.order', + 'active_ids': [self.sale_order.id], + 'active_id': self.sale_order.id, + } + payment = self.env['sale.advance.payment.inv'].with_context( + context).create({}) + # Create draft invoice to sale order + payment.create_invoices() + self.invoice = self.sale_order.invoice_ids + + def test_01_cancel_and_refund_event_registration_to_cancel(self): + """ + Check cancel & refund event registration + """ + self.registration.button_cancel_refund() + self.assertEqual( + self.registration.state, 'cancel', 'Registration should be cancel') + + def test_02_cancel_and_refund_event_registration_to_refund(self): + """ + Check cancel & refund event registration + """ + self.invoice.action_invoice_open() + self.registration.button_cancel_refund() + self.assertEqual( + self.registration.state, 'refund', 'Registration should be Refund') + + def test_03_cancel_and_refund_event_to_cancel(self): + """ + Check cancel & refund event to cancel + """ + event_refund = self.env['event.refund'].create({'event_id': '1'}) + event_refund.button_cancel_without_refund() + self.assertEqual( + event_refund.event_id.state, 'cancel', 'Event should be Cancel') diff --git a/smile_event_refund_registration/views/event_registration.xml b/smile_event_refund_registration/views/event_registration.xml new file mode 100644 index 000000000..de3e1dbd8 --- /dev/null +++ b/smile_event_refund_registration/views/event_registration.xml @@ -0,0 +1,43 @@ + + + + + + event.registration.form.view + event.registration + + + +