[FIX] mrp: remove duplicate replenishments in Overview

When a product was used more than once in a MO, then replenishment lines
were duplicated in the MO Overview, as it didn't check which forecast
line was already used, nor the total quantity it should have for this
replenishment.

Part of task-3217757

Part-of: odoo/odoo#118023
This commit is contained in:
clesgow
2023-04-13 15:26:41 +02:00
parent 66cddb7b27
commit a2cc7f307b
+7 -2
View File
@@ -251,10 +251,14 @@ class ReportMoOverview(models.AbstractModel):
product = move_raw.product_id
currency = (production.company_id or self.env.company).currency_id
forecast = replenish_data['products'][product.id].get('forecast', [])
current_lines = filter(lambda line: line.get('document_in', False) and line.get('document_out', False) and line['document_out'].get('id', False) == production.id, forecast)
current_lines = filter(lambda line: line.get('document_in', False) and line.get('document_out', False)
and line['document_out'].get('id', False) == production.id and not line.get('already_used'), forecast)
total_ordered = 0
replenishments = []
for count, forecast_line in enumerate(current_lines):
if float_compare(total_ordered, move_raw.product_uom_qty, precision_rounding=move_raw.product_uom.rounding) == 0:
# If a same product is used twice in the same MO, don't duplicate the replenishment lines
break
doc_in = self.env[forecast_line['document_in']['_name']].browse(forecast_line['document_in']['id'])
replenishment_index = f"{current_index}{count}"
replenishment = {}
@@ -283,6 +287,7 @@ class ReportMoOverview(models.AbstractModel):
replenishment['summary']['mo_cost'] = currency.round(sum(component.get('summary', {}).get('mo_cost', 0.0) for component in replenishment['components']) + replenishment['operations'].get('summary', {}).get('mo_cost', 0.0))
replenishment['summary']['receipt'] = self._check_planned_start(production.date_start, self._get_replenishment_receipt(doc_in, replenishment.get('components', [])))
replenishments.append(replenishment)
forecast_line['already_used'] = True
total_ordered += replenishment['summary']['quantity']
reserved_quantity = self._get_reserved_qty(move_raw, production.warehouse_id, replenish_data)
@@ -357,7 +362,7 @@ class ReportMoOverview(models.AbstractModel):
def _get_replenishments_from_forecast(self, production, replenish_data):
products = production.move_raw_ids.product_id
unknown_products = products.filtered(lambda product: product.id not in replenish_data)
unknown_products = products.filtered(lambda product: product.id not in replenish_data.get('products', {}))
if unknown_products:
warehouse = production.warehouse_id
wh_location_ids = self._get_warehouse_locations(warehouse, replenish_data)