diff --git a/addons/membership/models/account_move.py b/addons/membership/models/account_move.py index 83f1a4f7a867e..568b2ac203d20 100644 --- a/addons/membership/models/account_move.py +++ b/addons/membership/models/account_move.py @@ -42,6 +42,22 @@ def write(self, vals): class AccountMoveLine(models.Model): _inherit = 'account.move.line' + def _prepare_membership_line_data(self): + self.ensure_one() + date_from = self.product_id.membership_date_from + date_to = self.product_id.membership_date_to + if (date_from and date_from < (self.move_id.invoice_date or date.min) < (date_to or date.min)): + date_from = self.move_id.invoice_date + return { + 'partner': self.move_id.partner_id.id, + 'membership_id': self.product_id.id, + 'member_price': self.price_unit, + 'date': fields.Date.today(), + 'date_from': date_from, + 'date_to': date_to, + 'account_invoice_line': self.id, + } + def write(self, vals): # OVERRIDE res = super(AccountMoveLine, self).write(vals) @@ -54,28 +70,18 @@ def write(self, vals): existing_memberships = self.env['membership.membership_line'].search([ ('account_invoice_line', 'in', to_process.ids)]) - to_process = to_process - existing_memberships.mapped('account_invoice_line') - - # All memberships already exist, break. - if not to_process: - return res + to_create = to_process - existing_memberships.mapped('account_invoice_line') memberships_vals = [] - for line in to_process: - date_from = line.product_id.membership_date_from - date_to = line.product_id.membership_date_to - if (date_from and date_from < (line.move_id.invoice_date or date.min) < (date_to or date.min)): - date_from = line.move_id.invoice_date - memberships_vals.append({ - 'partner': line.move_id.partner_id.id, - 'membership_id': line.product_id.id, - 'member_price': line.price_unit, - 'date': fields.Date.today(), - 'date_from': date_from, - 'date_to': date_to, - 'account_invoice_line': line.id, - }) - self.env['membership.membership_line'].create(memberships_vals) + for line in to_create: + memberships_vals.append(line._prepare_membership_line_data()) + + if memberships_vals: + self.env['membership.membership_line'].create(memberships_vals) + + for membership in existing_memberships: + membership.write(membership.account_invoice_line._prepare_membership_line_data()) + return res @api.model_create_multi @@ -98,18 +104,6 @@ def create(self, vals_list): memberships_vals = [] for line in to_process: - date_from = line.product_id.membership_date_from - date_to = line.product_id.membership_date_to - if (date_from and date_from < (line.move_id.invoice_date or date.min) < (date_to or date.min)): - date_from = line.move_id.invoice_date - memberships_vals.append({ - 'partner': line.move_id.partner_id.id, - 'membership_id': line.product_id.id, - 'member_price': line.price_unit, - 'date': fields.Date.today(), - 'date_from': date_from, - 'date_to': date_to, - 'account_invoice_line': line.id, - }) + memberships_vals.append(line._prepare_membership_line_data()) self.env['membership.membership_line'].create(memberships_vals) return lines diff --git a/addons/membership/tests/common.py b/addons/membership/tests/common.py index a7845fa8c71a4..1d50a775b908b 100644 --- a/addons/membership/tests/common.py +++ b/addons/membership/tests/common.py @@ -13,6 +13,14 @@ def setUpClass(cls, chart_template_ref=None): super().setUpClass(chart_template_ref=chart_template_ref) # Test memberships + cls.membership = cls.env['product.product'].create({ + 'membership': True, + 'membership_date_from': datetime.date.today() + relativedelta(months=-1), + 'membership_date_to': datetime.date.today() + relativedelta(days=-2), + 'name': 'Basic Limited', + 'type': 'service', + 'list_price': 90.00, + }) cls.membership_1 = cls.env['product.product'].create({ 'membership': True, 'membership_date_from': datetime.date.today() + relativedelta(days=-2), diff --git a/addons/membership/tests/test_membership.py b/addons/membership/tests/test_membership.py index cb559dda9d5bb..a3bbc77a07d60 100644 --- a/addons/membership/tests/test_membership.py +++ b/addons/membership/tests/test_membership.py @@ -6,7 +6,7 @@ import time from odoo.addons.membership.tests.common import TestMembershipCommon -from odoo.tests import tagged +from odoo.tests import tagged, Form from odoo import fields @@ -178,3 +178,37 @@ def test_apply_payment_term(self): }) invoice = self.partner_1.create_membership_invoice(self.membership_1, 100.0) self.assertEqual(invoice.invoice_payment_term_id, pay_term_15_days_after_today) + + def test_change_membership_on_account_move_line(self): + invoice = self.partner_1.create_membership_invoice( + self.membership, self.membership.list_price + ) + with Form(invoice) as invoice_form: + line_form = invoice_form.invoice_line_ids.edit(0) + line_form.product_id = self.membership_1 + line_form.save() + + invoice_line = invoice.invoice_line_ids[0] + self.assertEqual( + invoice_line.price_unit, + self.membership_1.list_price + ) + membership_line = self.env["membership.membership_line"].search( + [("account_invoice_line", "=", invoice_line.id)] + ) + self.assertEqual( + membership_line.membership_id, + self.membership_1 + ) + self.assertEqual( + membership_line.member_price, + self.membership_1.list_price + ) + self.assertEqual( + membership_line.date_from, + self.membership_1.membership_date_from + ) + self.assertEqual( + membership_line.date_to, + self.membership_1.membership_date_to + )