diff --git a/account_invoice_margin/__init__.py b/account_invoice_margin/__init__.py index ab922af..34f74ab 100644 --- a/account_invoice_margin/__init__.py +++ b/account_invoice_margin/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from . import account_invoice +from . import account_invoice_report diff --git a/account_invoice_margin/account_invoice_report.py b/account_invoice_margin/account_invoice_report.py new file mode 100644 index 0000000..696028a --- /dev/null +++ b/account_invoice_margin/account_invoice_report.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 Akretion (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api + + +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', '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'], + 'product.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): + context = dict(self._context or {}) + user_currency_id = self.env.user.company_id.currency_id + currency_rate_id = self.env['res.currency.rate'].search([ + ('rate', '=', 1), + '|', + ('company_id', '=', self.env.user.company_id.id), + ('company_id', '=', False)], limit=1) + base_currency_id = currency_rate_id.currency_id + ctx = context.copy() + for record in self: + ctx['date'] = record.date + record.user_currency_margin = base_currency_id.with_context( + ctx).compute(record.margin, user_currency_id) + + # 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