From c8464cd945def4f3bcb937e342154d6c5d2d3b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 1 Aug 2024 23:43:43 +0200 Subject: [PATCH] Add SQL constraint to ensure only one tax line without period TaxLine.update_cash_basis relies on having only one line without period per grouping key so it is safer to make it a SQL constraint. --- modules/account_tax_cash/account.py | 22 +++++++++++++++++++++- modules/account_tax_cash/message.xml | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/modules/account_tax_cash/account.py b/modules/account_tax_cash/account.py index 8114e8d5b3..a9a8073cb2 100644 --- a/modules/account_tax_cash/account.py +++ b/modules/account_tax_cash/account.py @@ -4,9 +4,11 @@ from collections import defaultdict from itertools import groupby from sql import Literal, Null +from sql.operators import Equal from trytond.i18n import gettext -from trytond.model import ModelSQL, ModelView, Workflow, dualmethod, fields +from trytond.model import ( + Exclude, ModelSQL, ModelView, Workflow, dualmethod, fields) from trytond.pool import Pool, PoolMeta from trytond.pyson import Eval from trytond.tools import sortable_values @@ -133,6 +135,24 @@ class TaxLine(metaclass=PoolMeta): 'invisible': ~Eval('on_cash_basis', False), }) + @classmethod + def __setup__(cls): + super().__setup__() + + t = cls.__table__() + cls._sql_constraints = [ + ('tax_type_move_line_cash_basis_no_period', + Exclude( + t, + (t.tax, Equal), + (t.type, Equal), + (t.move_line, Equal), + where=(t.on_cash_basis == Literal(True)) + & (t.period == Null)), + 'account_tax_cash.' + 'msg_tax_type_move_line_cash_basis_no_period_unique'), + ] + @classmethod def default_on_cash_basis(cls): return False diff --git a/modules/account_tax_cash/message.xml b/modules/account_tax_cash/message.xml index 3850cd7a4b..2e58c4289d 100644 --- a/modules/account_tax_cash/message.xml +++ b/modules/account_tax_cash/message.xml @@ -6,5 +6,8 @@ this repository contains the full copyright notices and license terms. --> To close period "%(period)s" you must link all payable/receivable lines to invoices. + + Only one tax line on cash basis can be without period per move line. +