diff --git a/mrp_production_serial_matrix/tests/test_mrp_production_serial_matrix.py b/mrp_production_serial_matrix/tests/test_mrp_production_serial_matrix.py
index 89738b4dc..a55146a37 100644
--- a/mrp_production_serial_matrix/tests/test_mrp_production_serial_matrix.py
+++ b/mrp_production_serial_matrix/tests/test_mrp_production_serial_matrix.py
@@ -175,6 +175,9 @@ class TestMrpProductionSerialMatrix(SavepointCase):
active_id=production_1.id, active_model="mrp.production"
)
)
+ expected = 3 * 3 # Only SN products (1 + 2 per finish unit)
+ self.assertEqual(len(wizard_form.line_ids), expected)
+ wizard_form.include_lots = True
expected = 3 * 4
self.assertEqual(len(wizard_form.line_ids), expected)
self.assertEqual(wizard_form.lot_selection_warning_count, 0)
diff --git a/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix.py b/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix.py
index 2bf4ea96c..bc4bc36e5 100644
--- a/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix.py
+++ b/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix.py
@@ -40,6 +40,11 @@ class MrpProductionSerialMatrix(models.TransientModel):
lot_selection_warning_count = fields.Integer(
compute="_compute_lot_selection_warning"
)
+ include_lots = fields.Boolean(
+ string="Include Lots?",
+ help="Include products tracked by Lots in matrix. Product tracket by "
+ "serial numbers are always included.",
+ )
@api.depends("line_ids", "line_ids.component_lot_id")
def _compute_lot_selection_warning(self):
@@ -129,14 +134,26 @@ class MrpProductionSerialMatrix(models.TransientModel):
def _get_matrix_lines(self, production, finished_lots):
tracked_components = []
- for line in production.bom_id.bom_line_ids:
- if line.product_id.tracking == "serial":
- # TODO: factor if parent is not 1.
- # TODO: uom.
- for i in range(1, int(line.product_qty) + 1):
- tracked_components.append((line.product_id, i, 1))
- elif line.product_id.tracking == "lot":
- tracked_components.append((line.product_id, 0, line.product_qty))
+ for move in production.move_raw_ids:
+ rounding = move.product_id.uom_id.rounding
+ if float_is_zero(move.product_qty, precision_rounding=rounding):
+ # Component moves cannot be deleted in in-progress MO's; however,
+ # they can be set to 0 units to consume. In such case, we ignore
+ # the move.
+ continue
+ boml = move.bom_line_id
+ # TODO: UoM (MO/BoM using different UoMs than product's defaults).
+ if boml:
+ qty_per_finished_unit = boml.product_qty / boml.bom_id.product_qty
+ else:
+ # The product could have been added for the specific MO but not
+ # be part of the BoM.
+ qty_per_finished_unit = move.product_qty / production.product_qty
+ if move.product_id.tracking == "serial":
+ for i in range(1, int(qty_per_finished_unit) + 1):
+ tracked_components.append((move.product_id, i, 1))
+ elif move.product_id.tracking == "lot" and self.include_lots:
+ tracked_components.append((move.product_id, 0, qty_per_finished_unit))
matrix_lines = []
current_lot = False
@@ -187,7 +204,7 @@ class MrpProductionSerialMatrix(models.TransientModel):
)
return res
- @api.onchange("finished_lot_ids")
+ @api.onchange("finished_lot_ids", "include_lots")
def _onchange_finished_lot_ids(self):
for rec in self:
matrix_lines = self._get_matrix_lines(
@@ -212,6 +229,12 @@ class MrpProductionSerialMatrix(models.TransientModel):
current_mo.qty_producing = 1.0
current_mo._set_qty_producing()
for move in current_mo.move_raw_ids:
+ rounding = move.product_id.uom_id.rounding
+ if float_is_zero(move.product_qty, precision_rounding=rounding):
+ # Component moves cannot be deleted in in-progress MO's; however,
+ # they can be set to 0 units to consume. In such case, we ignore
+ # the move.
+ continue
if move.product_id.tracking in ["serial", "lot"]:
# We filter using the lot nane because the ORM sometimes
# is not storing correctly the finished_lot_id in the lines
diff --git a/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix_view.xml b/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix_view.xml
index 313ac0dc7..c2a4a82c1 100644
--- a/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix_view.xml
+++ b/mrp_production_serial_matrix/wizards/mrp_production_serial_matrix_view.xml
@@ -5,14 +5,19 @@
mrp.production.serial.matrix