diff --git a/modules/sale_subscription/CHANGELOG b/modules/sale_subscription/CHANGELOG
index fb0e880c79..bd2c6d2862 100644
--- a/modules/sale_subscription/CHANGELOG
+++ b/modules/sale_subscription/CHANGELOG
@@ -1,3 +1,4 @@
+* Permit the selection of companies for which to create invoices and consumptions
Version 8.0.0 - 2026-04-20
--------------------------
diff --git a/modules/sale_subscription/subscription.py b/modules/sale_subscription/subscription.py
index 7f0adfc1f6..fe5fdbb23d 100644
--- a/modules/sale_subscription/subscription.py
+++ b/modules/sale_subscription/subscription.py
@@ -18,7 +18,7 @@ from trytond.modules.product import price_digits
from trytond.pool import Pool
from trytond.pyson import Bool, Eval, If
from trytond.tools import firstline, sortable_values
-from trytond.transaction import Transaction
+from trytond.transaction import Transaction, check_access
from trytond.wizard import (
Button, StateAction, StateTransition, StateView, Wizard)
@@ -430,17 +430,16 @@ class Subscription(Workflow, ModelSQL, ModelView, ChatMixin):
if date is None:
date = Date.today()
- company_id = Transaction().context.get('company', -1)
- consumptions = Consumption.search([
- ('invoice_line', '=', None),
- ('line.subscription.next_invoice_date', '<=', date),
- ('line.subscription.state', 'in', ['running', 'closed']),
- ('line.subscription.company', '=', company_id),
- ],
- order=[
- ('line.subscription.id', 'DESC'),
- ])
+ with check_access():
+ consumptions = Consumption.search([
+ ('invoice_line', '=', None),
+ ('line.subscription.next_invoice_date', '<=', date),
+ ('line.subscription.state', 'in', ['running', 'closed']),
+ ],
+ order=[
+ ('line.subscription.id', 'DESC'),
+ ])
def keyfunc(consumption):
return consumption.line.subscription
@@ -471,10 +470,10 @@ class Subscription(Workflow, ModelSQL, ModelView, ChatMixin):
Invoice.update_taxes(all_invoices)
- subscriptions = cls.search([
- ('next_invoice_date', '<=', date),
- ('company', '=', company_id),
- ])
+ with check_access():
+ subscriptions = cls.search([
+ ('next_invoice_date', '<=', date),
+ ])
for subscription in subscriptions:
if subscription.state == 'running':
while subscription.next_invoice_date <= date:
@@ -959,7 +958,14 @@ class CreateLineConsumption(Wizard):
def do_create_(self, action):
pool = Pool()
Line = pool.get('sale.subscription.line')
- Line.generate_consumption(date=self.start.date)
+ User = pool.get('res.user')
+ transaction = Transaction()
+
+ companies = {c.id for c in self.start.companies}
+ companies &= set(User.get_companies())
+
+ with transaction.set_context(_companies=companies):
+ Line.generate_consumption(date=self.start.date)
return action, {}
def transition_create_(self):
@@ -970,6 +976,12 @@ class CreateLineConsumptionStart(ModelView):
__name__ = 'sale.subscription.line.consumption.create.start'
date = fields.Date("Date")
+ companies = fields.Many2Many(
+ 'company.company', None, None, "Companies", required=True,
+ domain=[
+ ('id', 'in', Eval('context', {}).get('companies', [])),
+ ],
+ help="Limit to subscription lines from these companies.")
@classmethod
def default_date(cls):
@@ -977,6 +989,10 @@ class CreateLineConsumptionStart(ModelView):
Date = pool.get('ir.date')
return Date.today()
+ @classmethod
+ def default_companies(cls):
+ return Transaction().context.get('companies')
+
class CreateSubscriptionInvoice(Wizard):
__name__ = 'sale.subscription.create_invoice'
@@ -991,7 +1007,14 @@ class CreateSubscriptionInvoice(Wizard):
def transition_create_(self):
pool = Pool()
Subscription = pool.get('sale.subscription')
- Subscription.generate_invoice(date=self.start.date)
+ User = pool.get('res.user')
+ transaction = Transaction()
+
+ companies = {c.id for c in self.start.companies}
+ companies &= set(User.get_companies())
+
+ with transaction.set_context(_companies=companies):
+ Subscription.generate_invoice(date=self.start.date)
return 'end'
@@ -999,9 +1022,19 @@ class CreateSubscriptionInvoiceStart(ModelView):
__name__ = 'sale.subscription.create_invoice.start'
date = fields.Date("Date")
+ companies = fields.Many2Many(
+ 'company.company', None, None, "Companies", required=True,
+ domain=[
+ ('id', 'in', Eval('context', {}).get('companies', [])),
+ ],
+ help="Limit to subscription lines from these companies.")
@classmethod
def default_date(cls):
pool = Pool()
Date = pool.get('ir.date')
return Date.today()
+
+ @classmethod
+ def default_companies(cls):
+ return Transaction().context.get('companies')
diff --git a/modules/sale_subscription/view/create_invoice_start_form.xml b/modules/sale_subscription/view/create_invoice_start_form.xml
index 5c2ed431a5..db4ce73e60 100644
--- a/modules/sale_subscription/view/create_invoice_start_form.xml
+++ b/modules/sale_subscription/view/create_invoice_start_form.xml
@@ -6,5 +6,7 @@ this repository contains the full copyright notices and license terms. -->
+
+
diff --git a/modules/sale_subscription/view/line_consumption_create_start_form.xml b/modules/sale_subscription/view/line_consumption_create_start_form.xml
index e169bb7156..3313f450eb 100644
--- a/modules/sale_subscription/view/line_consumption_create_start_form.xml
+++ b/modules/sale_subscription/view/line_consumption_create_start_form.xml
@@ -7,5 +7,7 @@ this repository contains the full copyright notices and license terms. -->
+
+