feat: Ensure consistent unit of measure handling for packaging quantities in MRP production and implement a workaround for missing product IDs on stock move lines.
This commit is contained in:
parent
b796e62f24
commit
390e19333f
@ -48,7 +48,8 @@ class MrpProduction(models.Model):
|
|||||||
def _compute_packaging_qty(self):
|
def _compute_packaging_qty(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.packaging_id and record.packaging_id.qty:
|
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:
|
if float_compare(new_qty, record.packaging_qty, precision_digits=2) != 0:
|
||||||
record.packaging_qty = new_qty
|
record.packaging_qty = new_qty
|
||||||
else:
|
else:
|
||||||
@ -57,7 +58,9 @@ class MrpProduction(models.Model):
|
|||||||
def _inverse_packaging_qty(self):
|
def _inverse_packaging_qty(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.packaging_id and record.packaging_id.qty:
|
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))
|
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):
|
def _compute_qty_producing_packaging(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.packaging_id and record.packaging_id.qty:
|
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:
|
else:
|
||||||
record.qty_producing_packaging = 0.0
|
record.qty_producing_packaging = 0.0
|
||||||
|
|
||||||
def _inverse_qty_producing_packaging(self):
|
def _inverse_qty_producing_packaging(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.packaging_id and record.packaging_id.qty:
|
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()
|
record._merge_finished_move_lines()
|
||||||
|
|
||||||
@api.onchange('qty_producing_packaging')
|
@api.onchange('qty_producing_packaging')
|
||||||
def _onchange_qty_producing_packaging(self):
|
def _onchange_qty_producing_packaging(self):
|
||||||
if self.packaging_id and self.packaging_id.qty:
|
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._onchange_qty_producing()
|
||||||
self._merge_finished_move_lines()
|
self._merge_finished_move_lines()
|
||||||
|
|
||||||
|
|||||||
@ -20,3 +20,11 @@ class StockMove(models.Model):
|
|||||||
|
|
||||||
if bom_qty:
|
if bom_qty:
|
||||||
move.unit_factor = line_qty / 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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user