12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- # -*- 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="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)
|