Skip to content

Commit ef660df

Browse files
committed
[FIX] membership: writing account.move.line update membership lines
Impacted versions: - 14.0 - 15.0 - 16.0 - 17.0 - 18.0 Steps To reproduce: * create 2 membership product * create an invoice for a partner with a membership line for the first product * you will see membership line exist while invoice is draft * change product on the invoice to use the other member ship product Current behavior: - membership line is not updated: membership product / dates / member_price are those from the initial definition Expected behavior: - membership line updated to reflected changed on the draft invoice before it becomes confirmed
1 parent 1bbabff commit ef660df

3 files changed

Lines changed: 70 additions & 34 deletions

File tree

addons/membership/models/account_move.py

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ def write(self, vals):
4242
class AccountMoveLine(models.Model):
4343
_inherit = 'account.move.line'
4444

45+
def _prepare_membership_line_data(self):
46+
self.ensure_one()
47+
date_from = self.product_id.membership_date_from
48+
date_to = self.product_id.membership_date_to
49+
if (date_from and date_from < (self.move_id.invoice_date or date.min) < (date_to or date.min)):
50+
date_from = self.move_id.invoice_date
51+
return {
52+
'partner': self.move_id.partner_id.id,
53+
'membership_id': self.product_id.id,
54+
'member_price': self.price_unit,
55+
'date': fields.Date.today(),
56+
'date_from': date_from,
57+
'date_to': date_to,
58+
'account_invoice_line': self.id,
59+
}
60+
4561
def write(self, vals):
4662
# OVERRIDE
4763
res = super(AccountMoveLine, self).write(vals)
@@ -54,28 +70,18 @@ def write(self, vals):
5470

5571
existing_memberships = self.env['membership.membership_line'].search([
5672
('account_invoice_line', 'in', to_process.ids)])
57-
to_process = to_process - existing_memberships.mapped('account_invoice_line')
58-
59-
# All memberships already exist, break.
60-
if not to_process:
61-
return res
73+
to_create = to_process - existing_memberships.mapped('account_invoice_line')
6274

6375
memberships_vals = []
64-
for line in to_process:
65-
date_from = line.product_id.membership_date_from
66-
date_to = line.product_id.membership_date_to
67-
if (date_from and date_from < (line.move_id.invoice_date or date.min) < (date_to or date.min)):
68-
date_from = line.move_id.invoice_date
69-
memberships_vals.append({
70-
'partner': line.move_id.partner_id.id,
71-
'membership_id': line.product_id.id,
72-
'member_price': line.price_unit,
73-
'date': fields.Date.today(),
74-
'date_from': date_from,
75-
'date_to': date_to,
76-
'account_invoice_line': line.id,
77-
})
78-
self.env['membership.membership_line'].create(memberships_vals)
76+
for line in to_create:
77+
memberships_vals.append(line._prepare_membership_line_data())
78+
79+
if memberships_vals:
80+
self.env['membership.membership_line'].create(memberships_vals)
81+
82+
for membership in existing_memberships:
83+
membership.write(membership.account_invoice_line._prepare_membership_line_data())
84+
7985
return res
8086

8187
@api.model_create_multi
@@ -98,18 +104,6 @@ def create(self, vals_list):
98104

99105
memberships_vals = []
100106
for line in to_process:
101-
date_from = line.product_id.membership_date_from
102-
date_to = line.product_id.membership_date_to
103-
if (date_from and date_from < (line.move_id.invoice_date or date.min) < (date_to or date.min)):
104-
date_from = line.move_id.invoice_date
105-
memberships_vals.append({
106-
'partner': line.move_id.partner_id.id,
107-
'membership_id': line.product_id.id,
108-
'member_price': line.price_unit,
109-
'date': fields.Date.today(),
110-
'date_from': date_from,
111-
'date_to': date_to,
112-
'account_invoice_line': line.id,
113-
})
107+
memberships_vals.append(line._prepare_membership_line_data())
114108
self.env['membership.membership_line'].create(memberships_vals)
115109
return lines

addons/membership/tests/common.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ def setUpClass(cls, chart_template_ref=None):
1313
super().setUpClass(chart_template_ref=chart_template_ref)
1414

1515
# Test memberships
16+
cls.membership = cls.env['product.product'].create({
17+
'membership': True,
18+
'membership_date_from': datetime.date.today() + relativedelta(months=-1),
19+
'membership_date_to': datetime.date.today() + relativedelta(days=-2),
20+
'name': 'Basic Limited',
21+
'type': 'service',
22+
'list_price': 90.00,
23+
})
1624
cls.membership_1 = cls.env['product.product'].create({
1725
'membership': True,
1826
'membership_date_from': datetime.date.today() + relativedelta(days=-2),

addons/membership/tests/test_membership.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import time
88
from odoo.addons.membership.tests.common import TestMembershipCommon
9-
from odoo.tests import tagged
9+
from odoo.tests import tagged, Form
1010
from odoo import fields
1111

1212

@@ -178,3 +178,37 @@ def test_apply_payment_term(self):
178178
})
179179
invoice = self.partner_1.create_membership_invoice(self.membership_1, 100.0)
180180
self.assertEqual(invoice.invoice_payment_term_id, pay_term_15_days_after_today)
181+
182+
def test_change_membership_on_account_move_line(self):
183+
invoice = self.partner_1.create_membership_invoice(
184+
self.membership, self.membership.list_price
185+
)
186+
with Form(invoice) as invoice_form:
187+
line_form = invoice_form.invoice_line_ids.edit(0)
188+
line_form.product_id = self.membership_1
189+
line_form.save()
190+
191+
invoice_line = invoice.invoice_line_ids[0]
192+
self.assertEqual(
193+
invoice_line.price_unit,
194+
self.membership_1.list_price
195+
)
196+
membership_line = self.env["membership.membership_line"].search(
197+
[("account_invoice_line", "=", invoice_line.id)]
198+
)
199+
self.assertEqual(
200+
membership_line.membership_id,
201+
self.membership_1
202+
)
203+
self.assertEqual(
204+
membership_line.member_price,
205+
self.membership_1.list_price
206+
)
207+
self.assertEqual(
208+
membership_line.date_from,
209+
self.membership_1.membership_date_from
210+
)
211+
self.assertEqual(
212+
membership_line.date_to,
213+
self.membership_1.membership_date_to
214+
)

0 commit comments

Comments
 (0)