summaryrefslogtreecommitdiff
path: root/addons/stock_account/models/stock_quant.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/stock_account/models/stock_quant.py')
-rw-r--r--addons/stock_account/models/stock_quant.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/addons/stock_account/models/stock_quant.py b/addons/stock_account/models/stock_quant.py
new file mode 100644
index 00000000..c8724bf9
--- /dev/null
+++ b/addons/stock_account/models/stock_quant.py
@@ -0,0 +1,57 @@
+# -*- 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('res.currency', compute='_compute_value', groups='stock.group_stock_manager')
+
+ @api.depends('company_id', 'location_id', 'owner_id', 'product_id', '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:
+ quant.currency_id = quant.company_id.currency_id
+ # If the user didn't enter a location yet while enconding a quant.
+ if not quant.location_id:
+ quant.value = 0
+ return
+
+ 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.with_company(quant.company_id).value_svl / quantity
+ quant.value = quant.quantity * average_cost
+ else:
+ quant.value = quant.quantity * quant.product_id.with_company(quant.company_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