diff --git a/models/mrp_production.py b/models/mrp_production.py index 68712ee..f71e3d4 100644 --- a/models/mrp_production.py +++ b/models/mrp_production.py @@ -48,7 +48,8 @@ class MrpProduction(models.Model): def _compute_packaging_qty(self): for record in self: if record.packaging_id and record.packaging_id.qty: - new_qty = record.product_qty / record.packaging_id.qty + qty_in_base = record.product_uom_id._compute_quantity(record.product_qty, record.product_id.uom_id, round=False) + new_qty = qty_in_base / record.packaging_id.qty if float_compare(new_qty, record.packaging_qty, precision_digits=2) != 0: record.packaging_qty = new_qty else: @@ -57,7 +58,9 @@ class MrpProduction(models.Model): def _inverse_packaging_qty(self): for record in self: if record.packaging_id and record.packaging_id.qty: - record.product_qty = record.packaging_qty * record.packaging_id.qty + qty_in_base = record.packaging_qty * record.packaging_id.qty + record.product_qty = record.product_id.uom_id._compute_quantity(qty_in_base, record.product_uom_id, round=False) + qty_producing_packaging = fields.Float('Quantity Producing Packaging', compute='_compute_qty_producing_packaging', inverse='_inverse_qty_producing_packaging', digits=(16, 2)) @@ -65,20 +68,23 @@ class MrpProduction(models.Model): def _compute_qty_producing_packaging(self): for record in self: if record.packaging_id and record.packaging_id.qty: - record.qty_producing_packaging = record.qty_producing / record.packaging_id.qty + qty_in_base = record.product_uom_id._compute_quantity(record.qty_producing, record.product_id.uom_id, round=False) + record.qty_producing_packaging = qty_in_base / record.packaging_id.qty else: record.qty_producing_packaging = 0.0 def _inverse_qty_producing_packaging(self): for record in self: if record.packaging_id and record.packaging_id.qty: - record.qty_producing = record.qty_producing_packaging * record.packaging_id.qty + qty_in_base = record.qty_producing_packaging * record.packaging_id.qty + record.qty_producing = record.product_id.uom_id._compute_quantity(qty_in_base, record.product_uom_id, round=False) record._merge_finished_move_lines() @api.onchange('qty_producing_packaging') def _onchange_qty_producing_packaging(self): if self.packaging_id and self.packaging_id.qty: - self.qty_producing = self.qty_producing_packaging * self.packaging_id.qty + qty_in_base = self.qty_producing_packaging * self.packaging_id.qty + self.qty_producing = self.product_id.uom_id._compute_quantity(qty_in_base, self.product_uom_id, round=False) self._onchange_qty_producing() self._merge_finished_move_lines() diff --git a/models/stock_move.py b/models/stock_move.py index 07e361d..4a72c3b 100644 --- a/models/stock_move.py +++ b/models/stock_move.py @@ -20,3 +20,11 @@ class StockMove(models.Model): if bom_qty: move.unit_factor = line_qty / bom_qty + + def _set_quantity_done_prepare_vals(self, qty): + # Workaround for Odoo UI onchange bug where move_line_ids (NewId) are sometimes passed + # from the browser without their product_id, causing "Expected singleton: uom.uom()" crashes. + for ml in self.move_line_ids: + if not ml.product_id and self.product_id: + ml.product_id = self.product_id + return super()._set_quantity_done_prepare_vals(qty)