commit 31e1322b40 is allowing the
customer to increase is decimal accuracy for currency without
consequences but triggering issue upon lowering it if entries
already exist.
+ Remove the redirection to the support.
Let's ensure that the behavior is consistent and the users are
warned on first modification. To do so, adding an alert msg
in addition of the blocking message in case of lowering the decimal
accuracy after already creating accounting entries.
opw-2428857
closes odoo/odoo#64757
X-original-commit: 66533ebd88ed89c3baae6fdb1d0a28a458fa0cb9
Signed-off-by: Simon Goffin (sig) <sig@openerp.com>
67 lines
3.1 KiB
Python
67 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, models, fields, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class ResCurrency(models.Model):
|
|
_inherit = 'res.currency'
|
|
|
|
display_rounding_warning = fields.Boolean(string="Display Rounding Warning", compute='_compute_display_rounding_warning',
|
|
help="Technical field. Used to tell whether or not to display the rounding warning. The warning informs a rounding factor change might be dangerous on res.currency's form view.")
|
|
|
|
|
|
@api.depends('rounding')
|
|
def _compute_display_rounding_warning(self):
|
|
for record in self:
|
|
record.display_rounding_warning = record.id \
|
|
and record._origin.rounding != record.rounding \
|
|
and record._origin._has_accounting_entries()
|
|
|
|
def write(self, vals):
|
|
if 'rounding' in vals:
|
|
rounding_val = vals['rounding']
|
|
for record in self:
|
|
if (rounding_val > record.rounding or rounding_val == 0) and record._has_accounting_entries():
|
|
raise UserError(_("You cannot reduce the number of decimal places of a currency which has already been used to make accounting entries."))
|
|
|
|
return super(ResCurrency, self).write(vals)
|
|
|
|
def _has_accounting_entries(self):
|
|
""" Returns True iff this currency has been used to generate (hence, round)
|
|
some move lines (either as their foreign currency, or as the main currency
|
|
of their company).
|
|
"""
|
|
self.ensure_one()
|
|
return bool(self.env['account.move.line'].search_count(['|', ('currency_id', '=', self.id), ('company_currency_id', '=', self.id)]))
|
|
|
|
@api.model
|
|
def _get_query_currency_table(self, options):
|
|
''' Construct the currency table as a mapping company -> rate to convert the amount to the user's company
|
|
currency in a multi-company/multi-currency environment.
|
|
The currency_table is a small postgresql table construct with VALUES.
|
|
:param options: The report options.
|
|
:return: The query representing the currency table.
|
|
'''
|
|
|
|
user_company = self.env.company
|
|
user_currency = user_company.currency_id
|
|
if options.get('multi_company', False):
|
|
companies = self.env.companies
|
|
conversion_date = options['date']['date_to']
|
|
currency_rates = companies.mapped('currency_id')._get_rates(user_company, conversion_date)
|
|
else:
|
|
companies = user_company
|
|
currency_rates = {user_currency.id: 1.0}
|
|
|
|
conversion_rates = []
|
|
for company in companies:
|
|
conversion_rates.extend((
|
|
company.id,
|
|
currency_rates[user_company.currency_id.id] / currency_rates[company.currency_id.id],
|
|
user_currency.decimal_places,
|
|
))
|
|
query = '(VALUES %s) AS currency_table(company_id, rate, precision)' % ','.join('(%s, %s, %s)' for i in companies)
|
|
return self.env.cr.mogrify(query, conversion_rates).decode(self.env.cr.connection.encoding)
|