From c861edefaa0009ba214d79a53376c85ab9f45991 Mon Sep 17 00:00:00 2001 From: Arnold Moyaux Date: Tue, 18 Jun 2019 13:55:51 +0000 Subject: [PATCH] [IMP] stock_account: value on quant This commit introduces back the value by location feature dropped in v11. The feature was dropped because we implement financial fifo, thus the value by location does not make sense for this cost method. This commit introduces an estimation of the value by location in fifo. Task: 1880379 --- addons/stock_account/__manifest__.py | 1 + addons/stock_account/models/__init__.py | 1 + addons/stock_account/models/stock_quant.py | 51 +++++++++++++++++++ .../stock_account/views/stock_quant_views.xml | 27 ++++++++++ 4 files changed, 80 insertions(+) create mode 100644 addons/stock_account/models/stock_quant.py create mode 100644 addons/stock_account/views/stock_quant_views.xml diff --git a/addons/stock_account/__manifest__.py b/addons/stock_account/__manifest__.py index e1fdfa3b079..80fbc9ea82e 100644 --- a/addons/stock_account/__manifest__.py +++ b/addons/stock_account/__manifest__.py @@ -31,6 +31,7 @@ Dashboard / Reports for Warehouse Management includes: 'views/res_config_settings_views.xml', 'data/product_data.xml', 'views/product_views.xml', + 'views/stock_quant_views.xml', 'views/stock_valuation_layer_views.xml', ], 'test': [ diff --git a/addons/stock_account/models/__init__.py b/addons/stock_account/models/__init__.py index e91f43d72be..97fa38dc1b0 100644 --- a/addons/stock_account/models/__init__.py +++ b/addons/stock_account/models/__init__.py @@ -10,5 +10,6 @@ from . import stock_inventory from . import stock_location from . import stock_move_line from . import stock_picking +from . import stock_quant from . import stock_valuation_layer from . import res_config_settings diff --git a/addons/stock_account/models/stock_quant.py b/addons/stock_account/models/stock_quant.py new file mode 100644 index 00000000000..7d537a7b986 --- /dev/null +++ b/addons/stock_account/models/stock_quant.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models +from odoo.tools.float_utils import float_is_zero + + +class StockQuant(models.Model): + _inherit = 'stock.quant' + + value = fields.Monetary('Value', compute='_compute_value', groups='stock.group_stock_manager') + currency_id = fields.Many2one(related='product_id.currency_id', groups='stock.group_stock_manager') + + @api.depends('quantity') + def _compute_value(self): + """ For standard and AVCO valuation, compute the current accounting + valuation of the quants by multiplying the quantity by + the standard price. Instead for FIFO, use the quantity times the + average cost (valuation layers are not manage by location so the + average cost is the same for all location and the valuation field is + a estimation more than a real value). + """ + for quant in self: + if not quant.location_id._should_be_valued() or\ + (quant.owner_id and quant.owner_id != quant.company_id.partner_id): + quant.value = 0 + continue + if quant.product_id.cost_method == 'fifo': + quantity = quant.product_id.quantity_svl + if float_is_zero(quantity, precision_rounding=quant.product_id.uom_id.rounding): + quant.value = 0.0 + continue + average_cost = quant.product_id.value_svl / quantity + quant.value = quant.quantity * average_cost + else: + quant.value = quant.quantity * quant.product_id.standard_price + + @api.model + def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True): + """ This override is done in order for the grouped list view to display the total value of + the quants inside a location. This doesn't work out of the box because `value` is a computed + field. + """ + if 'value' not in fields: + return super(StockQuant, self).read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy) + res = super(StockQuant, self).read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy) + for group in res: + if group.get('__domain'): + quants = self.search(group['__domain']) + group['value'] = sum(quant.value for quant in quants) + return res diff --git a/addons/stock_account/views/stock_quant_views.xml b/addons/stock_account/views/stock_quant_views.xml new file mode 100644 index 00000000000..576140d09d3 --- /dev/null +++ b/addons/stock_account/views/stock_quant_views.xml @@ -0,0 +1,27 @@ + + + + stock.quant.tree.inherit + stock.quant + + + + + + + + + + + stock.quant.tree.editable.inherit + stock.quant + + + + + + + + + +