[FIX] {purchase_,}mrp: fix wrong uom for Overview replenishments

The MO Overview would display the wrong uom in the replenishments lines
of the MO Overview. Since the data was pulled from the forecast report
(which displays it in the product's uom), it could not coincide with the
ones used in the MO.

Part-of: odoo/odoo#118023
This commit is contained in:
clesgow
2023-04-13 15:26:39 +02:00
parent 60f4cdb6b1
commit d4a70eab4d
2 changed files with 22 additions and 22 deletions
+10 -10
View File
@@ -258,7 +258,7 @@ class ReportMoOverview(models.AbstractModel):
doc_in = self.env[forecast_line['document_in']['_name']].browse(forecast_line['document_in']['id'])
replenishment_index = f"{current_index}{count}"
replenishment = {}
uom_id = self.env['uom.uom'].browse(forecast_line['uom_id']['id'])
forecast_uom_id = forecast_line['uom_id']
replenishment['summary'] = {
'level': level + 1,
'index': replenishment_index,
@@ -269,11 +269,11 @@ class ReportMoOverview(models.AbstractModel):
'product_id': product.id,
'state': doc_in.state,
'formatted_state': self._format_state(doc_in),
'quantity': forecast_line['quantity'],
'uom_name': forecast_line['uom_id']['display_name'],
'quantity': min(move_raw.product_uom_qty, forecast_uom_id._compute_quantity(forecast_line['quantity'], move_raw.product_uom)), # Avoid over-rounding
'uom_name': move_raw.product_uom.display_name,
'uom_precision': self._get_uom_precision(forecast_line['uom_id']['rounding']),
'mo_cost': self._get_replenishment_cost(product, forecast_line['quantity'], uom_id, currency, forecast_line['move_in']),
'product_cost': currency.round(uom_id._compute_quantity(forecast_line['quantity'], product.uom_id) * product.standard_price),
'mo_cost': self._get_replenishment_cost(product, forecast_line['quantity'], forecast_uom_id, currency, forecast_line['move_in']),
'product_cost': currency.round(forecast_uom_id._compute_quantity(forecast_line['quantity'], product.uom_id) * product.standard_price),
'currency_id': currency.id,
'currency': currency,
}
@@ -395,7 +395,7 @@ class ReportMoOverview(models.AbstractModel):
continue
if production_id and extra.get('production_id', False) and extra['production_id'] != production_id:
continue
taken_from_extra = min(line_qty, extra['quantity'])
taken_from_extra = min(line_qty, extra['uom']._compute_quantity(extra['quantity'], forecast_line['uom_id']))
line_qty -= taken_from_extra
# Create copy of the current forecast line to add a possible replenishment.
# Needs to be a copy since it might take multiple replenishment to fulfill a single "out" line.
@@ -452,12 +452,12 @@ class ReportMoOverview(models.AbstractModel):
for move in linked_moves:
if move.state not in ('partially_available', 'assigned'):
continue
# count reserved stock.
reserved = move.product_uom._compute_quantity(move.reserved_availability, move.product_id.uom_id)
# count reserved stock in move_raw's uom
reserved = move.product_uom._compute_quantity(move.reserved_availability, move_raw.product_uom)
# check if the move reserved qty was counted before (happens if multiple outs share pick/pack)
reserved = min(reserved - replenish_data['qty_already_reserved'][move], move_raw.product_qty)
reserved = min(reserved - move.product_uom._compute_quantity(replenish_data['qty_already_reserved'][move], move_raw.product_uom), move_raw.product_uom_qty)
total_reserved += reserved
replenish_data['qty_already_reserved'][move] += reserved
replenish_data['qty_already_reserved'][move] += move_raw.product_uom._compute_quantity(reserved, move.product_uom)
if float_compare(total_reserved, move_raw.product_qty, precision_rounding=move.product_id.uom_id.rounding) >= 0:
break
replenish_data['qty_reserved'][move_raw] = total_reserved
@@ -2,7 +2,6 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
from odoo.tools import float_compare
class ReportMoOverview(models.AbstractModel):
_inherit = 'report.mrp.report_mo_overview'
@@ -16,17 +15,17 @@ class ReportMoOverview(models.AbstractModel):
po_lines = self.env['purchase.order.line'].search(domain, order='date_planned, id')
for po_line in po_lines:
line_qty = po_line.product_uom_qty
if po_line.move_dest_ids.raw_material_production_id:
for move in po_line.move_dest_ids:
if float_compare(line_qty, move.product_uom_qty, precision_rounding=po_line.product_uom.rounding) >= 0:
prod_qty = move.product_uom_qty
else:
prod_qty = line_qty
res.append(self._format_extra_replenishment(po_line, prod_qty, move.raw_material_production_id.id))
line_qty -= prod_qty
else:
res.append(self._format_extra_replenishment(po_line, po_line.product_uom_qty))
line_qty = po_line.product_qty
for move in po_line.move_dest_ids:
linked_production = self.env['stock.move'].browse(move._rollup_move_dests()).raw_material_production_id
# Only create specific lines for moves directly linked to a manufacturing order
if not linked_production:
continue
prod_qty = min(line_qty, move.product_uom._compute_quantity(move.product_uom_qty, po_line.product_uom))
res.append(self._format_extra_replenishment(po_line, prod_qty, linked_production.id))
line_qty -= prod_qty
if line_qty:
res.append(self._format_extra_replenishment(po_line, line_qty))
return res
@@ -36,6 +35,7 @@ class ReportMoOverview(models.AbstractModel):
'id': po_line.order_id.id,
'cost': po_line.price_total,
'quantity': quantity,
'uom': po_line.product_uom,
'production_id': production_id
}