Steps: - Go to Settings > Companies > Manage Companies - Create a company (1) with a different currency than the one you're in - Go to inventory > Products > Products > Create a product (2) - Storable Product - Cost: 10 - Click Update Quantity - Create a new quantity line with 1 in On Hand Quantity - Switch to company (1) - Go to Inventory > Products > Products > Edit product (2) - Storable Product - Cost: 15 - Click Update Quantity - Create a new quantity line with 1 in On Hand Quantity - Go back to the product - Click the "Forecasted" smart button Bug: Traceback here: https://github.com/odoo/odoo/blob/47bfdf0592a5dd93870ca1a9da326351d70087bb/addons/stock_account/report/report_stock_forecasted.py#L17 ValueError: Expected singleton: res.currency(2, 1) Explanation: The amount is the sum of the `stock.valuation.layer`s of a product across all companies and these companies may have different currencies. This commit scopes the computation of the amount inside the company of the current warehouse. Also the `stock.quant` values displayed in the "On Hand" report are not correct for the other companies when displaying their data by selecting all the checkboxes in the global company dropdown. This commit also fixes the amounts in the On Hand view by using the standard price per company and attributing the correct currency to the `stock.quant`. opw:2444593 closes odoo/odoo#65267 X-original-commit: 67d975be75963678d25ae54289b2f1de639c8bed Signed-off-by: backspac <backspac@users.noreply.github.com>
58 lines
2.8 KiB
Python
58 lines
2.8 KiB
Python
# -*- 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
|