From ffdcb608f50320111c6e958718098172ad650a5b Mon Sep 17 00:00:00 2001 From: Daniel Gergely Date: Wed, 16 Sep 2026 07:44:31 +0200 Subject: [PATCH 1/2] [T3411] FIX: create the billing group when none is selected --- .../models/recurring_contract.py | 19 +++++++++++++++++++ .../views/recurring_contract_view.xml | 2 ++ 2 files changed, 21 insertions(+) diff --git a/recurring_contract/models/recurring_contract.py b/recurring_contract/models/recurring_contract.py index b7b2368f..3058e771 100644 --- a/recurring_contract/models/recurring_contract.py +++ b/recurring_contract/models/recurring_contract.py @@ -370,9 +370,28 @@ def create(self, vals_list): vals["reference"] = self.env["ir.sequence"].next_by_code( "recurring.contract.ref" ) + if not vals.get("group_id") and vals.get("partner_id"): + vals["group_id"] = self._default_group(vals["partner_id"]).id res = super().create(vals_list) return res + def _default_group(self, partner_id): + """Billing group to use when none was picked on the contract (T3411). + + The payment mode is left empty on purpose: it is set later, once the + collection method is agreed with the sponsor. + """ + group_model = self.env["recurring.contract.group"] + company = self.env.company + group = group_model.search( + [("partner_id", "=", partner_id), ("company_id", "=", company.id)], + order="id desc", + limit=1, + ) + return group or group_model.create( + {"partner_id": partner_id, "company_id": company.id} + ) + def write(self, vals): """Perform various checks when a contract is modified.""" res = super().write(vals) diff --git a/recurring_contract/views/recurring_contract_view.xml b/recurring_contract/views/recurring_contract_view.xml index df70ebaa..9884104c 100644 --- a/recurring_contract/views/recurring_contract_view.xml +++ b/recurring_contract/views/recurring_contract_view.xml @@ -114,6 +114,8 @@ domain="[('partner_id', '=', partner_id)]" context="{'default_partner_id': partner_id, 'contract_id': id,}" options="{'no_quick_create': True}" + required="0" + placeholder="Created automatically if left empty" /> Date: Wed, 16 Sep 2026 08:11:14 +0200 Subject: [PATCH 2/2] [T3411] FIX: only default to a group without a payment mode --- recurring_contract/models/recurring_contract.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/recurring_contract/models/recurring_contract.py b/recurring_contract/models/recurring_contract.py index 3058e771..fd528a0a 100644 --- a/recurring_contract/models/recurring_contract.py +++ b/recurring_contract/models/recurring_contract.py @@ -378,13 +378,19 @@ def create(self, vals_list): def _default_group(self, partner_id): """Billing group to use when none was picked on the contract (T3411). - The payment mode is left empty on purpose: it is set later, once the - collection method is agreed with the sponsor. + Restricted to groups without a payment mode: no collection method was + chosen here, so we must not attach the contract to an existing + arrangement (LSV, Permanent Order, ...) the sponsor never agreed to. + The mode is set later, once it is. """ group_model = self.env["recurring.contract.group"] company = self.env.company group = group_model.search( - [("partner_id", "=", partner_id), ("company_id", "=", company.id)], + [ + ("partner_id", "=", partner_id), + ("company_id", "=", company.id), + ("payment_mode_id", "=", False), + ], order="id desc", limit=1, )