From 52eff801b6730e3f436106f8a10e826d2be607b5 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 9 Feb 2018 17:52:25 +0100 Subject: [PATCH] sale_margin_no_onchange port to v10 --- sale_margin_no_onchange/__manifest__.py | 31 +---- sale_margin_no_onchange/sale.py | 166 +++++++++++------------- sale_margin_no_onchange/sale_view.xml | 30 ++--- 3 files changed, 97 insertions(+), 130 deletions(-) diff --git a/sale_margin_no_onchange/__manifest__.py b/sale_margin_no_onchange/__manifest__.py index 5dcf1bc..22e7e3b 100644 --- a/sale_margin_no_onchange/__manifest__.py +++ b/sale_margin_no_onchange/__manifest__.py @@ -1,30 +1,13 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# Sale Margin No Onchange module for Odoo -# Copyright (C) 2015 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# Copyright (C) 2015-2018 Akretion (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { 'name': 'Sale Margin No Onchange', - 'version': '0.1', - 'category': 'Accounting & Finance', + 'version': '10.0.1.0.0', + 'category': 'Accounting', 'license': 'AGPL-3', 'summary': 'Copy standard price on sale order line and compute margins', 'description': """ @@ -39,5 +22,5 @@ This module has been written by Alexis de Lattre from Akretion 'data': [ 'sale_view.xml', ], - 'installable': False, + 'installable': True, } diff --git a/sale_margin_no_onchange/sale.py b/sale_margin_no_onchange/sale.py index edb0907..a4cc439 100644 --- a/sale_margin_no_onchange/sale.py +++ b/sale_margin_no_onchange/sale.py @@ -1,81 +1,70 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# Sale Margin No Onchange module for Odoo -# Copyright (C) 2015 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# Copyright (C) 2015-2018 Akretion (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import models, fields, api -import openerp.addons.decimal_precision as dp + +from odoo import models, fields, api +import odoo.addons.decimal_precision as dp class SaleOrderLine(models.Model): _inherit = 'sale.order.line' + # Also defined in bi_sale_company_currency + company_currency_id = fields.Many2one( + related='order_id.company_id.currency_id', + readonly=True, store=True, string='Company Currency') standard_price_company_currency = fields.Float( string='Cost Price in Company Currency', readonly=True, - digits=dp.get_precision('Product Price')) + digits=dp.get_precision('Product Price'), + help="Cost price in company currency in the unit of measure " + "of the sale order line") standard_price_sale_currency = fields.Float( string='Cost Price in Sale Currency', readonly=True, compute='_compute_margin', store=True, - digits=dp.get_precision('Product Price')) - margin_sale_currency = fields.Float( + digits=dp.get_precision('Product Price'), + help="Cost price in sale currency in the unit of measure " + "of the sale order line") + margin_sale_currency = fields.Monetary( string='Margin in Sale Currency', readonly=True, store=True, - compute='_compute_margin', - digits=dp.get_precision('Account')) - margin_company_currency = fields.Float( + compute='_compute_margin', currency_field='currency_id') + margin_company_currency = fields.Monetary( string='Margin in Company Currency', readonly=True, store=True, - compute='_compute_margin', - digits=dp.get_precision('Account')) + compute='_compute_margin', currency_field='company_currency_id') margin_rate = fields.Float( - string="Margin Rate", readonly=True, store=True, + string="Margin (%)", readonly=True, store=True, compute='_compute_margin', digits=(16, 2), help="Margin rate in percentage of the sale price") - @api.one @api.depends( - 'standard_price_company_currency', 'order_id.pricelist_id', - 'order_id.date_order', 'product_uom_qty', 'price_subtotal') + 'standard_price_company_currency', 'order_id.pricelist_id.currency_id', + 'order_id.date_order', 'product_uom_qty', 'price_subtotal', + 'order_id.company_id') def _compute_margin(self): - standard_price_sale_cur = 0.0 - margin_sale_cur = 0.0 - margin_comp_cur = 0.0 - margin_rate = 0.0 - if self.order_id and self.order_id.currency_id: - # it works in _get_current_rate - # even if we set date = False in context - standard_price_sale_cur =\ - self.order_id.company_id.currency_id.with_context( - date=self.order_id.date_order).compute( - self.standard_price_company_currency, - self.order_id.currency_id) - margin_sale_cur =\ - self.price_subtotal\ - - self.product_uom_qty * standard_price_sale_cur - margin_comp_cur = self.order_id.currency_id.with_context( - date=self.order_id.date_order).compute( - margin_sale_cur, self.order_id.company_id.currency_id) - if self.price_subtotal: - margin_rate = 100 * margin_sale_cur / self.price_subtotal - self.standard_price_sale_currency = standard_price_sale_cur - self.margin_sale_currency = margin_sale_cur - self.margin_company_currency = margin_comp_cur - self.margin_rate = margin_rate + for line in self: + standard_price_sale_cur = 0.0 + margin_sale_cur = 0.0 + margin_comp_cur = 0.0 + margin_rate = 0.0 + order_cur = line.order_id.pricelist_id.currency_id + company_cur = line.order_id.company_id.currency_id + if order_cur and company_cur: + date = line.order_id.date_order + standard_price_sale_cur =\ + company_cur.with_context(date=date).compute( + line.standard_price_company_currency, order_cur) + margin_sale_cur =\ + line.price_subtotal\ + - line.product_uom_qty * standard_price_sale_cur + margin_comp_cur = order_cur.with_context(date=date).compute( + margin_sale_cur, company_cur) + if line.price_subtotal: + margin_rate = 100 * margin_sale_cur / line.price_subtotal + line.standard_price_sale_currency = standard_price_sale_cur + line.margin_sale_currency = margin_sale_cur + line.margin_company_currency = margin_comp_cur + line.margin_rate = margin_rate # We want to copy standard_price on sale order line @api.model @@ -85,38 +74,31 @@ class SaleOrderLine(models.Model): std_price = pp.standard_price sale_uom_id = vals.get('product_uom') if sale_uom_id and sale_uom_id != pp.uom_id.id: - std_price = self.env['product.uom']._compute_price( - pp.uom_id.id, std_price, sale_uom_id) + sale_uom = self.env['product.uom'].browse(sale_uom_id) + # convert from product UoM to sale UoM + std_price = pp.uom_id._compute_price( + standard_price, sale_uom) vals['standard_price_company_currency'] = std_price return super(SaleOrderLine, self).create(vals) - @api.multi def write(self, vals): if not vals: vals = {} if 'product_id' in vals or 'product_uom' in vals: for sol in self: + # product_uom and product_id are required fields if 'product_id' in vals: - if vals.get('product_id'): - pp = self.env['product.product'].browse( - vals['product_id']) - else: - pp = False + pp = self.env['product.product'].browse(vals['product_id']) else: - pp = sol.product_id or False - # product_uom is a required field, - # so it's different from product_id + pp = sol.product_id if 'product_uom' in vals: sale_uom = self.env['product.uom'].browse( vals['product_uom']) else: sale_uom = sol.product_uom - std_price = 0.0 - if pp: - std_price = pp.standard_price - if sale_uom != pp.uom_id: - std_price = self.env['product.uom']._compute_price( - pp.uom_id.id, std_price, sale_uom.id) + std_price = pp.standard_price + if sale_uom != pp.uom_id: + std_price = pp.uom_id._compute_price(std_price, sale_uom) sol.write({'standard_price_company_currency': std_price}) return super(SaleOrderLine, self).write(vals) @@ -124,24 +106,28 @@ class SaleOrderLine(models.Model): class SaleOrder(models.Model): _inherit = 'sale.order' - margin_sale_currency = fields.Float( + # Also defined in bi_sale_company_currency + company_currency_id = fields.Many2one( + related='company_id.currency_id', readonly=True, store=True, + string="Company Currency") + margin_sale_currency = fields.Monetary( string='Margin in Sale Currency', - readonly=True, compute='_compute_margin', store=True, - digits=dp.get_precision('Account')) - margin_company_currency = fields.Float( + currency_field='currency_id', + readonly=True, compute='_compute_margin', store=True) + margin_company_currency = fields.Monetary( string='Margin in Company Currency', - readonly=True, compute='_compute_margin', store=True, - digits=dp.get_precision('Account')) + currency_field='company_currency_id', + readonly=True, compute='_compute_margin', store=True) - @api.one @api.depends( 'order_line.margin_sale_currency', 'order_line.margin_company_currency') def _compute_margin(self): - margin_sale_cur = 0.0 - margin_comp_cur = 0.0 - for sol in self.order_line: - margin_sale_cur += sol.margin_sale_currency - margin_comp_cur += sol.margin_company_currency - self.margin_sale_currency = margin_sale_cur - self.margin_company_currency = margin_comp_cur + for order in self: + margin_sale_cur = 0.0 + margin_comp_cur = 0.0 + for sol in order.order_line: + margin_sale_cur += sol.margin_sale_currency + margin_comp_cur += sol.margin_company_currency + order.margin_sale_currency = margin_sale_cur + order.margin_company_currency = margin_comp_cur diff --git a/sale_margin_no_onchange/sale_view.xml b/sale_margin_no_onchange/sale_view.xml index d6903c8..69536ff 100644 --- a/sale_margin_no_onchange/sale_view.xml +++ b/sale_margin_no_onchange/sale_view.xml @@ -1,12 +1,11 @@ - - + @@ -14,21 +13,20 @@ sale.order - - + + - - - - + + + + + @@ -42,9 +40,9 @@ + - - +