From 61b5dd38033c8379faa5fc2226f360c4da8c6b4b Mon Sep 17 00:00:00 2001
From: "Thomas Lefebvre (thle)" <thle@odoo.com>
Date: Mon, 7 Aug 2023 08:53:19 +0000
Subject: [PATCH] [FIX] membership: add payment terms on the invoice

Versions:
---------
- 14.0
- 15.0

Steps to reproduce:
-------------------
- in Members app, add a membership product;
- add a "Payment Terms" on a contact (Sales & Purchase tab);
- in Membership tab click on "Buy Membership";
- add the membership product and invoice;

Issue:
------
There is no payment term on the invoice.

Cause:
------
In the invoice creation flow, the following logic is not triggered:
```py
if self.is_sale_document(include_receipts=True) and self.partner_id:
	self.invoice_payment_term_id = self.partner_id.property_payment_term_id or self.invoice_payment_term_id
```
Consequently, we have no invoice_payment_term_id.

Solution:
---------
Specify `invoice_payment_term_id` in the values used for invoice creation.

Note:
-----
This FIX solution only handles the invoice creation
from the membership module, to be as non-invasive as possible.

In version 16.0, this is handled by the account module,
which has made the `invoice_payment_term_id` field computed and dependent on `partner_id`.

opw-3382398

closes odoo/odoo#130998

Signed-off-by: Andrea Grazioso (agr) <agr@odoo.com>
---
 addons/membership/models/partner.py        |  1 +
 addons/membership/tests/test_membership.py | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/addons/membership/models/partner.py b/addons/membership/models/partner.py
index 30de29f7e2d2..4e23daae713f 100644
--- a/addons/membership/models/partner.py
+++ b/addons/membership/models/partner.py
@@ -109,6 +109,7 @@ class Partner(models.Model):
             invoice_vals_list.append({
                 'move_type': 'out_invoice',
                 'partner_id': partner.id,
+                'invoice_payment_term_id': partner.property_payment_term_id.id,
                 'invoice_line_ids': [
                     (0, None, {'product_id': product.id, 'quantity': 1, 'price_unit': amount, 'tax_ids': [(6, 0, product.taxes_id.ids)]})
                 ]
diff --git a/addons/membership/tests/test_membership.py b/addons/membership/tests/test_membership.py
index 957ca2df8cbc..cb559dda9d5b 100644
--- a/addons/membership/tests/test_membership.py
+++ b/addons/membership/tests/test_membership.py
@@ -158,3 +158,23 @@ class TestMembership(TestMembershipCommon):
         self.partner_1._compute_membership_state()
         self.assertEqual(invoice.state, 'cancel')
         self.assertEqual(self.partner_1.membership_state, 'canceled')
+
+    def test_apply_payment_term(self):
+        """
+            Check if the payment term defined on the partner is applied to the invoice
+        """
+        pay_term_15_days_after_today = self.env['account.payment.term'].create({
+            'name': '15 days after today',
+            'line_ids': [
+                (0, 0, {
+                    'value': 'balance',
+                    'days': 15,
+                    'option': 'day_after_invoice_date',
+                }),
+            ],
+        })
+        self.partner_1.write({
+            'property_payment_term_id': pay_term_15_days_after_today.id,
+        })
+        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)
-- 
GitLab