Raise tailored error message when calculated account for move line is empty
Closes #14392
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user