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 + + + + + + + + + +