# Copyright 2018-2019 Akretion France (http://www.akretion.com) # @author Alexis de Lattre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models class AccountInvoiceReport(models.Model): _inherit = "account.invoice.report" margin = fields.Float(string="Margin", readonly=True) # why digits=0 ??? Why is it like that in the native "account" module user_currency_margin = fields.Float( string="Margin", compute="_compute_user_currency_margin", digits=0 ) _depends = { "account.invoice": [ "account_id", "amount_total_company_signed", "commercial_partner_id", "company_id", "currency_id", "date_due", "date_invoice", "fiscal_position_id", "journal_id", "number", "partner_bank_id", "partner_id", "payment_term_id", "residual", "state", "type", "user_id", ], "account.invoice.line": [ "account_id", "invoice_id", "price_subtotal", "product_id", "quantity", "uom_id", "account_analytic_id", "margin_company_currency", ], "product.product": ["product_tmpl_id"], "product.template": ["categ_id"], "uom.uom": ["category_id", "factor", "name", "uom_type"], "res.currency.rate": ["currency_id", "name"], "res.partner": ["country_id"], } @api.depends("currency_id", "date", "margin") def _compute_user_currency_margin(self): user_currency = self.env.user.company_id.currency_id currency_rate = self.env["res.currency.rate"].search( [ ("rate", "=", 1), "|", ("company_id", "=", self.env.user.company_id.id), ("company_id", "=", False), ], limit=1, ) base_currency = currency_rate.currency_id for record in self: date = record.date or fields.Date.today() company = record.company_id record.user_currency_margin = base_currency._convert( record.margin, user_currency, company, date ) # TODO check for refunds def _sub_select(self): select_str = super(AccountInvoiceReport, self)._sub_select() select_str += ", SUM(ail.margin_company_currency) AS margin" return select_str def _select(self): select_str = super(AccountInvoiceReport, self)._select() select_str += ", sub.margin AS margin" return select_str