Raise tailored error message when calculated account for move line is empty

Closes #14392
This commit is contained in:
Cédric Krier
2025-11-26 12:03:42 +01:00
parent 929b3545cd
commit 66999ae7e5
7 changed files with 87 additions and 4 deletions
+13
View File
@@ -11,6 +11,7 @@ from sql.functions import CharLength
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 @@ class Asset(Workflow, ModelSQL, ModelView):
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,
+6
View File
@@ -27,5 +27,11 @@ this repository contains the full copyright notices and license terms. -->
<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>
+6
View File
@@ -362,6 +362,12 @@ class InvoiceDeferred(Workflow, ModelSQL, ModelView):
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
@@ -12,6 +12,9 @@ this repository contains the full copyright notices and license terms. -->
<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>
@@ -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>
+38 -4
View File
@@ -8,7 +8,9 @@ from sql.aggregate import BoolAnd, Min
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 @@ class Payment(metaclass=PoolMeta):
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 @@ class Payment(metaclass=PoolMeta):
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)
@@ -10,6 +10,7 @@ extras_depend:
account_statement_rule
xml:
payment.xml
message.xml
[register]
model: