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.
+