details:   https://code.tryton.org/tryton/commit/968413e3ff29
branch:    default
user:      Cédric Krier <[email protected]>
date:      Wed Nov 26 12:03:42 2025 +0100
description:
        Raise tailored error message when calculated account for move line is 
empty

        Closes #14392
diffstat:

 modules/account_asset/asset.py               |  13 ++++++++
 modules/account_asset/message.xml            |   6 ++++
 modules/account_invoice_defer/account.py     |   6 ++++
 modules/account_invoice_defer/message.xml    |   3 ++
 modules/account_payment_clearing/message.xml |  20 +++++++++++++
 modules/account_payment_clearing/payment.py  |  42 +++++++++++++++++++++++++--
 modules/account_payment_clearing/tryton.cfg  |   1 +
 7 files changed, 87 insertions(+), 4 deletions(-)

diffs (181 lines):

diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_asset/asset.py
--- a/modules/account_asset/asset.py    Tue Dec 02 00:12:08 2025 +0100
+++ b/modules/account_asset/asset.py    Wed Nov 26 12:03:42 2025 +0100
@@ -11,6 +11,7 @@
 from trytond.i18n import gettext
 from trytond.model import Index, ModelSQL, ModelView, Unique, Workflow, fields
 from trytond.model.exceptions import AccessError
+from trytond.modules.account.exceptions import AccountMissing
 from trytond.modules.company import CompanyReport
 from trytond.modules.currency.fields import Monetary
 from trytond.pool import Pool
@@ -589,8 +590,20 @@
         period = Period.find(self.company, date)
         if self.supplier_invoice_line:
             account_asset = self.supplier_invoice_line.account.current()
+            if not account_asset:
+                raise AccountMissing(gettext(
+                        'account_asset'
+                        '.msg_asset_close_invoice_line_missing_account',
+                        asset=self.rec_name,
+                        account=self.supplier_invoice_line.account.rec_name))
         else:
             account_asset = self.product.account_asset_used
+            if not account_asset:
+                raise AccountMissing(gettext(
+                        'account_asset'
+                        '.msg_asset_close_product_account_asset',
+                        asset=self.rec_name,
+                        product=self.product.rec_name))
 
         asset_line = MoveLine(
             debit=0,
diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_asset/message.xml
--- a/modules/account_asset/message.xml Tue Dec 02 00:12:08 2025 +0100
+++ b/modules/account_asset/message.xml Wed Nov 26 12:03:42 2025 +0100
@@ -27,5 +27,11 @@
         <record model="ir.message" id="msg_revision_asset_origin_unique">
             <field name="text">A revision origin can be used only once per 
asset.</field>
         </record>
+        <record model="ir.message" 
id="msg_asset_close_invoice_line_missing_account">
+            <field name="text">To close asset "%(asset)s" you must configure a 
replacement account for "%(account)s".</field>
+        </record>
+        <record model="ir.message" id="msg_asset_close_product_account_asset">
+            <field name="text">To close asset "%(asset)s" you must configure 
an account asset for the product "%(product)s".</field>
+        </record>
     </data>
 </tryton>
diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_invoice_defer/account.py
--- a/modules/account_invoice_defer/account.py  Tue Dec 02 00:12:08 2025 +0100
+++ b/modules/account_invoice_defer/account.py  Wed Nov 26 12:03:42 2025 +0100
@@ -362,6 +362,12 @@
                 else:
                     income.debit, income.credit = 0, -amount
         income.account = self.invoice_line.account.current(move.date)
+        if not income.account:
+            raise AccountMissing(gettext(
+                    'account_invoice_defer'
+                    '.msg_invoice_deferred_invoice_line_missing_account',
+                    deferral=self.rec_name,
+                    account=self.invoice_line.account.rec_name))
         if income.account.party_required:
             income.party = invoice.party
 
diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_invoice_defer/message.xml
--- a/modules/account_invoice_defer/message.xml Tue Dec 02 00:12:08 2025 +0100
+++ b/modules/account_invoice_defer/message.xml Wed Nov 26 12:03:42 2025 +0100
@@ -12,6 +12,9 @@
         <record model="ir.message" id="msg_invoice_deferred_delete_draft">
             <field name="text">You cannot delete invoice deferred 
"%(deferral)s" because it is not in "draft" state.</field>
         </record>
+        <record model="ir.message" 
id="msg_invoice_deferred_invoice_line_missing_account">
+            <field name="text">To create moves for invoice deferred 
"%(deferral)s" you must configure a replacement account for "%(account)s". 
</field>
+        </record>
         <record model="ir.message" id="msg_missing_deferred_account_revenue">
             <field name="text">There is no deferred account revenue 
configured.</field>
         </record>
diff -r 6a0e22e0f45e -r 968413e3ff29 
modules/account_payment_clearing/message.xml
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/account_payment_clearing/message.xml      Wed Nov 26 12:03:42 
2025 +0100
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data grouped="1">
+        <record model="ir.message" id="msg_payment_clearing_account_missing">
+            <field name="text">To clear the payment "%(payment)s" you must 
configure a replacement account for "%(account)s".</field>
+        </record>
+        <record model="ir.message" 
id="msg_payment_clearing_account_missing_journal">
+            <field name="text">To clear the payment "%(payment)s" you must 
configure a replacement account for "%(account)s" or an active account on the 
payment journal "%(journal)s".</field>
+        </record>
+        <record model="ir.message" 
id="msg_payment_clearing_account_payable_missing">
+            <field name="text">To clear the payment "%(payment)s" you must 
configure a payable account for party "%(party)s".</field>
+        </record>
+        <record model="ir.message" 
id="msg_payment_clearing_account_receivable_missing">
+            <field name="text">To clear the payment "%(payment)s" you must 
configure a receivable account for party "%(party)s".</field>
+        </record>
+
+    </data>
+</tryton>
diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_payment_clearing/payment.py
--- a/modules/account_payment_clearing/payment.py       Tue Dec 02 00:12:08 
2025 +0100
+++ b/modules/account_payment_clearing/payment.py       Wed Nov 26 12:03:42 
2025 +0100
@@ -8,7 +8,9 @@
 from sql.conditionals import Coalesce
 
 from trytond import backend
+from trytond.i18n import gettext
 from trytond.model import ModelView, Workflow, fields
+from trytond.modules.account.exceptions import AccountMissing
 from trytond.pool import Pool, PoolMeta
 from trytond.pyson import Bool, Eval, If, TimeDelta
 from trytond.tools import grouped_slice, reduce_ids
@@ -235,13 +237,38 @@
         context = transaction.context
         with transaction.set_context(date=context.get('clearing_date')):
             if self.line:
-                return self.line.account.current()
+                account = self.line.account.current()
+                if not account:
+                    raise AccountMissing(gettext(
+                            'account_payment_clearing'
+                            '.msg_payment_clearing_account_missing',
+                            payment=self.rec_name,
+                            account=self.line.account.rec_name))
             elif self.account:
-                return self.account.current()
+                account = self.account.current()
+                if not account:
+                    raise AccountMissing(gettext(
+                            'account_payment_clearing'
+                            '.msg_payment_clearing_account_missing',
+                            payment=self.rec_name,
+                            account=self.account.rec_name))
             elif self.kind == 'payable':
-                return self.party.account_payable_used
+                account = self.party.account_payable_used
+                if not account:
+                    raise AccountMissing(gettext(
+                            'account_payment_clearing'
+                            '.msg_payment_clearing_account_payable_missing',
+                            payment=self.rec_name,
+                            party=self.party.rec_name))
             elif self.kind == 'receivable':
-                return self.party.account_receivable_used
+                account = self.party.account_receivable_used
+                if not account:
+                    raise AccountMissing(gettext(
+                            'account_payment_clearing'
+                            '.msg_payment_clearing_account_receivable_missing',
+                            payment=self.rec_name,
+                            party=self.party.rec_name))
+        return account
 
     @property
     def clearing_party(self):
@@ -314,6 +341,13 @@
         else:
             counterpart.debit, counterpart.credit = local_amount, 0
         counterpart.account = self.journal.clearing_account.current(date)
+        if not counterpart.account:
+            raise AccountMissing(gettext(
+                    'account_payment_clearing'
+                    '.msg_payment_clearing_account_missing_journal',
+                    payment=self.rec_name,
+                    account=self.journal.clearing_account.rec_name,
+                    journal=self.journal.rec_name))
         if not local_currency:
             counterpart.amount_second_currency = self.amount.copy_sign(
                 counterpart.debit - counterpart.credit)
diff -r 6a0e22e0f45e -r 968413e3ff29 modules/account_payment_clearing/tryton.cfg
--- a/modules/account_payment_clearing/tryton.cfg       Tue Dec 02 00:12:08 
2025 +0100
+++ b/modules/account_payment_clearing/tryton.cfg       Wed Nov 26 12:03:42 
2025 +0100
@@ -10,6 +10,7 @@
     account_statement_rule
 xml:
     payment.xml
+    message.xml
 
 [register]
 model:

Reply via email to