From 4d2dd71764c85f3133a090b47522ba43fe4bbcd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 16 Feb 2026 19:19:01 +0100 Subject: [PATCH] Enforce invoice type for origin of invoice line Closes #14611 --- modules/purchase/invoice.py | 9 ++++++++- modules/purchase/invoice.xml | 2 +- modules/sale/invoice.py | 9 ++++++++- modules/sale/invoice.xml | 2 +- modules/sale_rental/account.py | 16 ++++++++++++++++ modules/sale_rental/account.xml | 2 +- modules/sale_subscription/invoice.py | 16 ++++++++++++++++ modules/sale_subscription/subscription.xml | 2 +- 8 files changed, 52 insertions(+), 6 deletions(-) diff --git a/modules/purchase/invoice.py b/modules/purchase/invoice.py index 10e51c4f7a..90e4fa3222 100644 --- a/modules/purchase/invoice.py +++ b/modules/purchase/invoice.py @@ -6,7 +6,7 @@ from trytond.i18n import gettext from trytond.model import ModelView, Workflow, fields from trytond.model.exceptions import AccessError from trytond.pool import Pool, PoolMeta -from trytond.pyson import Eval +from trytond.pyson import Bool, Eval, If from trytond.tools import cached_property from trytond.transaction import Transaction, without_check_access @@ -110,6 +110,13 @@ class InvoiceLine(metaclass=PoolMeta): cls.origin.domain = {} cls.origin.domain['purchase.line'] = [ ('type', '=', Eval('type')), + If(Bool(Eval('_parent_invoice')), + If(Eval('_parent_invoice', {}).get('type') != 'in', + ('id', '=', -1), + ()), + If(Eval('invoice_type') != 'in', + ('id', '=', -1), + ())), ] @cached_property diff --git a/modules/purchase/invoice.xml b/modules/purchase/invoice.xml index 11ecbf138a..6c745db59d 100644 --- a/modules/purchase/invoice.xml +++ b/modules/purchase/invoice.xml @@ -9,7 +9,7 @@ this repository contains the full copyright notices and license terms. --> account.invoice account.invoice diff --git a/modules/sale_subscription/invoice.py b/modules/sale_subscription/invoice.py index 77e9906bd6..c5404541ee 100644 --- a/modules/sale_subscription/invoice.py +++ b/modules/sale_subscription/invoice.py @@ -1,11 +1,27 @@ # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from trytond.pool import Pool, PoolMeta +from trytond.pyson import Bool, Eval, If class InvoiceLine(metaclass=PoolMeta): __name__ = 'account.invoice.line' + @classmethod + def __setup__(cls): + super().__setup__() + if not cls.origin.domain: + cls.origin.domain = {} + cls.origin.domain['sale.subscription.line'] = [ + If(Bool(Eval('_parent_invoice')), + If(Eval('_parent_invoice', {}).get('type') != 'out', + ('id', '=', -1), + ()), + If(Eval('invoice_type') != 'out', + ('id', '=', -1), + ())), + ] + @property def origin_name(self): pool = Pool() diff --git a/modules/sale_subscription/subscription.xml b/modules/sale_subscription/subscription.xml index 7d539a6ee2..e9d7e997ef 100644 --- a/modules/sale_subscription/subscription.xml +++ b/modules/sale_subscription/subscription.xml @@ -218,7 +218,7 @@ this repository contains the full copyright notices and license terms. --> account.invoice