diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index 9f94ca70e19..fd589e41e8a 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -47,6 +47,10 @@ class SaleOrder(models.Model): for sale_order in self: sale_order.attendee_count = attendee_count_data.get(sale_order.id, 0) + def unlink(self): + self.order_line._unlink_associated_registrations() + return super(SaleOrder, self).unlink() + class SaleOrderLine(models.Model): @@ -120,6 +124,13 @@ class SaleOrderLine(models.Model): # we call this to force update the default name self.product_id_change() + def unlink(self): + self._unlink_associated_registrations() + return super(SaleOrderLine, self).unlink() + + def _unlink_associated_registrations(self): + self.env['event.registration'].search([('sale_order_line_id', 'in', self.ids)]).unlink() + def get_sale_order_line_multiline_description_sale(self, product): """ We override this method because we decided that: The default description of a sales order line containing a ticket must be different than the default description when no ticket is present. diff --git a/addons/event_sale/tests/test_event_sale.py b/addons/event_sale/tests/test_event_sale.py index 8b8ab6c7d92..65a777ef6b0 100644 --- a/addons/event_sale/tests/test_event_sale.py +++ b/addons/event_sale/tests/test_event_sale.py @@ -2,6 +2,8 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.event_sale.tests.common import TestEventSaleCommon +from odoo.addons.mail.tests.common import mail_new_test_user + from odoo.tests import tagged from odoo.tests.common import users @@ -13,20 +15,59 @@ class TestEventSale(TestEventSaleCommon): def setUpClass(cls): super(TestEventSale, cls).setUpClass() + product = cls.env['product.product'].create({ + 'name': 'Event', + 'type': 'service', + 'event_ok': True, + }) + + cls.user_salesperson = mail_new_test_user(cls.env, login='user_salesman', groups='sales_team.group_sale_salesman') + + cls.ticket = cls.env['event.event.ticket'].create({ + 'name': 'First Ticket', + 'product_id': cls.event_product.id, + 'seats_max': 30, + 'event_id': cls.event_0.id, + }) + cls.event_0.write({ 'event_ticket_ids': [ - (5, 0), + (6, 0, cls.ticket.ids), (0, 0, { - 'name': 'First Ticket', - 'product_id': cls.event_product.id, - 'seats_max': 30, - }), (0, 0, { 'name': 'Second Ticket', 'product_id': cls.event_product.id, }) ], }) + cls.sale_order = cls.env['sale.order'].create({ + 'partner_id': cls.env.ref('base.res_partner_2').id, + 'note': 'Invoice after delivery', + 'payment_term_id': cls.env.ref('account.account_payment_term_end_following_month').id + }) + + # In the sales order I add some sales order lines. i choose event product + cls.env['sale.order.line'].create({ + 'product_id': product.id, + 'price_unit': 190.50, + 'product_uom': cls.env.ref('uom.product_uom_unit').id, + 'product_uom_qty': 1.0, + 'order_id': cls.sale_order.id, + 'name': 'sales order line', + 'event_id': cls.event_0.id, + 'event_ticket_id': cls.ticket.id, + }) + + cls.register_person = cls.env['registration.editor'].create({ + 'sale_order_id': cls.sale_order.id, + 'event_registration_ids': [(0, 0, { + 'event_id': cls.event_0.id, + 'name': 'Administrator', + 'email': 'abc@example.com', + 'sale_order_line_id': cls.sale_order.order_line.id, + })], + }) + # make a SO for a customer, selling some tickets cls.customer_so = cls.env['sale.order'].with_user(cls.user_sales_salesman).create({ 'partner_id': cls.event_customer.id, @@ -209,3 +250,23 @@ class TestEventSale(TestEventSaleCommon): }) sol.product_id_change() self.assertEqual(so.amount_total, 660.0, "Ticket is $1000 but the event product is on a pricelist 10 -> 6. So, $600 + a 10% tax.") + + @users('user_salesman') + def test_unlink_so(self): + """ This test ensures that when deleting a sale order, if the latter is linked to an event registration, + the number of expected seats will be correctly updated """ + event = self.env['event.event'].browse(self.event_0.ids) + self.register_person.action_make_registration() + self.assertEqual(event.seats_expected, 1) + self.sale_order.unlink() + self.assertEqual(event.seats_expected, 0) + + @users('user_salesman') + def test_unlink_soline(self): + """ This test ensures that when deleting a sale order line, if the latter is linked to an event registration, + the number of expected seats will be correctly updated """ + event = self.env['event.event'].browse(self.event_0.ids) + self.register_person.action_make_registration() + self.assertEqual(event.seats_expected, 1) + self.sale_order.order_line.unlink() + self.assertEqual(event.seats_expected, 0) diff --git a/addons/event_sale/wizard/event_edit_registration.py b/addons/event_sale/wizard/event_edit_registration.py index 9db556ba804..575bb1af4bd 100644 --- a/addons/event_sale/wizard/event_edit_registration.py +++ b/addons/event_sale/wizard/event_edit_registration.py @@ -7,7 +7,7 @@ class RegistrationEditor(models.TransientModel): _name = "registration.editor" _description = 'Edit Attendee Details on Sales Confirmation' - sale_order_id = fields.Many2one('sale.order', 'Sales Order', required=True) + sale_order_id = fields.Many2one('sale.order', 'Sales Order', required=True, ondelete='cascade') event_registration_ids = fields.One2many('registration.editor.line', 'editor_id', string='Registrations to Edit') @api.model