details:   https://code.tryton.org/tryton/commit/6236378a9cd3
branch:    default
user:      Cédric Krier <[email protected]>
date:      Tue Jul 07 00:04:54 2026 +0200
description:
        Add warning when deleting account reconciliation linked to receivable 
rule

        Closes #14891
diffstat:

 modules/account_receivable_rule/account.py                                 |  
33 ++++++++++
 modules/account_receivable_rule/message.xml                                |   
4 +
 modules/account_receivable_rule/tests/scenario_account_receivable_rule.rst |   
9 ++
 modules/account_receivable_rule/tryton.cfg                                 |   
1 +
 4 files changed, 47 insertions(+), 0 deletions(-)

diffs (104 lines):

diff -r a50b564c40d1 -r 6236378a9cd3 modules/account_receivable_rule/account.py
--- a/modules/account_receivable_rule/account.py        Fri Jun 26 00:09:48 
2026 +0200
+++ b/modules/account_receivable_rule/account.py        Tue Jul 07 00:04:54 
2026 +0200
@@ -8,9 +8,11 @@
 from sql.operators import Equal
 
 from trytond import backend
+from trytond.i18n import gettext
 from trytond.model import (
     DeactivableMixin, Exclude, ModelSQL, ModelView, Unique, Workflow,
     dualmethod, fields, sequence_ordered)
+from trytond.modules.account.exceptions import ReconciliationDeleteWarning
 from trytond.pool import Pool, PoolMeta
 from trytond.pyson import Eval
 from trytond.tools import sqlite_apply_types
@@ -33,6 +35,36 @@
         return super()._get_origin() + ['account.account.receivable.rule']
 
 
+class Reconciliation(ModelSQL, ModelView):
+    __name__ = 'account.move.reconciliation'
+
+    @classmethod
+    def check_modification(
+            cls, mode, reconciliations, values=None, external=False):
+        pool = Pool()
+        ReceivableRule = pool.get('account.account.receivable.rule')
+        Warning = pool.get('res.user.warning')
+
+        super().check_modification(
+            mode, reconciliations, values=values, external=external)
+
+        if mode == 'delete':
+            for reconciliation in reconciliations:
+                for line in reconciliation.lines:
+                    if isinstance(line.move.origin, ReceivableRule):
+                        key = Warning.format(
+                            'delete.receivable.rule', [reconciliation])
+                        if Warning.check(key):
+                            raise ReconciliationDeleteWarning(key, gettext(
+                                    'account_receivable_rule.'
+                                    'msg_reconciliation_delete'
+                                    '_receivable_rule',
+                                    reconciliation=reconciliation.rec_name,
+                                    line=line.rec_name,
+                                    receivable_rule=line.move.origin.rec_name,
+                                    move=line.move.rec_name))
+
+
 class AccountRuleAbstract(DeactivableMixin, ModelSQL, ModelView):
 
     company = fields.Many2One(
@@ -473,3 +505,4 @@
         rules_parties = [(a.receivable_rules, p) for a, p in accounts.items()]
         if rules_parties:
             Rule.apply(*rules_parties[0], rules_parties[1:])
+            Rule.apply(*rules_parties[0], rules_parties[1:])
diff -r a50b564c40d1 -r 6236378a9cd3 modules/account_receivable_rule/message.xml
--- a/modules/account_receivable_rule/message.xml       Fri Jun 26 00:09:48 
2026 +0200
+++ b/modules/account_receivable_rule/message.xml       Tue Jul 07 00:04:54 
2026 +0200
@@ -9,5 +9,9 @@
         <record model="ir.message" id="msg_rule_account_unique">
             <field name="text">Only one account is allowed by rule.</field>
         </record>
+        <record model="ir.message" 
id="msg_reconciliation_delete_receivable_rule">
+            <field name="text">The reconciliation "%(reconciliation)s" is 
linked to the line "%(line)s" from the receivable rule %(receivable_rule)s.
+You may need to cancel its move "%(move)s".</field>
+        </record>
     </data>
 </tryton>
diff -r a50b564c40d1 -r 6236378a9cd3 
modules/account_receivable_rule/tests/scenario_account_receivable_rule.rst
--- 
a/modules/account_receivable_rule/tests/scenario_account_receivable_rule.rst    
    Fri Jun 26 00:09:48 2026 +0200
+++ 
b/modules/account_receivable_rule/tests/scenario_account_receivable_rule.rst    
    Tue Jul 07 00:04:54 2026 +0200
@@ -21,6 +21,7 @@
     >>> Party = Model.get('party.party')
     >>> Move = Model.get('account.move')
     >>> ReceivableRule = Model.get('account.account.receivable.rule')
+    >>> Reconciliation = Model.get('account.move.reconciliation')
 
 Create fiscal year::
 
@@ -149,3 +150,11 @@
     >>> receivable2.reload()
     >>> receivable2.balance
     Decimal('20.00')
+
+Test delete reconciliation of receivable rule::
+
+    >>> reconciliations = Reconciliation.find([('delegate_to', '=', None)])
+    >>> Reconciliation.delete(reconciliations)
+    Traceback (most recent call last):
+        ...
+    ReconciliationDeleteWarning: ...
diff -r a50b564c40d1 -r 6236378a9cd3 modules/account_receivable_rule/tryton.cfg
--- a/modules/account_receivable_rule/tryton.cfg        Fri Jun 26 00:09:48 
2026 +0200
+++ b/modules/account_receivable_rule/tryton.cfg        Tue Jul 07 00:04:54 
2026 +0200
@@ -17,6 +17,7 @@
     ir.Cron
     account.Account
     account.Move
+    account.Reconciliation
     account.AccountReceivableRule
     account.AccountReceivableRuleAccount
 

Reply via email to