[FIX] mrp_subcontracting: records components on existing line
In a barcode environemtn or a situation with a lot of stock.move.line the subcontract is hard to use with record components because a line is created each time the produce wizard is proccessed. Then each line is duplicate, one with reservation and the other with effective transfer. This commit try to merge them in order to limit the number of lines. Task 2073383 closes odoo/odoo#38689 Signed-off-by: Simon Lejeune (sle) <sle@openerp.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models
|
||||
from odoo.tools.float_utils import float_is_zero
|
||||
from odoo.tools.float_utils import float_is_zero, float_compare
|
||||
|
||||
class MrpProductProduce(models.TransientModel):
|
||||
_inherit = 'mrp.product.produce'
|
||||
@@ -33,18 +33,56 @@ class MrpProductProduce(models.TransientModel):
|
||||
""" After producing, set the move line on the subcontract picking. """
|
||||
res = super(MrpProductProduce, self)._update_finished_move()
|
||||
if self.subcontract_move_id:
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': self.subcontract_move_id.id,
|
||||
'picking_id': self.subcontract_move_id.picking_id.id,
|
||||
'product_id': self.product_id.id,
|
||||
'location_id': self.subcontract_move_id.location_id.id,
|
||||
'location_dest_id': self.subcontract_move_id.location_dest_id.id,
|
||||
'product_uom_qty': 0,
|
||||
'product_uom_id': self.product_uom_id.id,
|
||||
'qty_done': self.qty_producing,
|
||||
'lot_id': self.finished_lot_id and self.finished_lot_id.id,
|
||||
'lot_name': self.finished_lot_id and self.finished_lot_id.name,
|
||||
})
|
||||
quantity = self.qty_producing
|
||||
if self.finished_lot_id:
|
||||
move_lines = self.subcontract_move_id.move_line_ids.filtered(lambda ml: ml.lot_id == self.finished_lot_id or not ml.lot_id)
|
||||
else:
|
||||
move_lines = self.subcontract_move_id.move_line_ids.filtered(lambda ml: not ml.lot_id)
|
||||
# Update reservation and quantity done
|
||||
for ml in move_lines:
|
||||
rounding = ml.product_uom_id.rounding
|
||||
if float_compare(quantity, 0, precision_rounding=rounding) <= 0:
|
||||
break
|
||||
quantity_to_process = min(quantity, ml.product_uom_qty - ml.qty_done)
|
||||
quantity -= quantity_to_process
|
||||
|
||||
new_quantity_done = (ml.qty_done + quantity_to_process)
|
||||
|
||||
# on which lot of finished product
|
||||
if float_compare(new_quantity_done, ml.product_uom_qty, precision_rounding=rounding) >= 0:
|
||||
ml.write({
|
||||
'qty_done': new_quantity_done,
|
||||
'lot_id': self.finished_lot_id and self.finished_lot_id.id,
|
||||
'lot_name': self.finished_lot_id and self.finished_lot_id.name,
|
||||
})
|
||||
else:
|
||||
new_qty_reserved = ml.product_uom_qty - new_quantity_done
|
||||
default = {
|
||||
'product_uom_qty': new_quantity_done,
|
||||
'qty_done': new_quantity_done,
|
||||
'lot_id': self.finished_lot_id and self.finished_lot_id.id,
|
||||
'lot_name': self.finished_lot_id and self.finished_lot_id.name,
|
||||
}
|
||||
ml.copy(default=default)
|
||||
ml.with_context(bypass_reservation_update=True).write({
|
||||
'product_uom_qty': new_qty_reserved,
|
||||
'qty_done': 0
|
||||
})
|
||||
|
||||
if float_compare(quantity, 0, precision_rounding=self.product_uom_id.rounding) > 0:
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': self.subcontract_move_id.id,
|
||||
'picking_id': self.subcontract_move_id.picking_id.id,
|
||||
'product_id': self.product_id.id,
|
||||
'location_id': self.subcontract_move_id.location_id.id,
|
||||
'location_dest_id': self.subcontract_move_id.location_dest_id.id,
|
||||
'product_uom_qty': 0,
|
||||
'product_uom_id': self.product_uom_id.id,
|
||||
'qty_done': quantity,
|
||||
'lot_id': self.finished_lot_id and self.finished_lot_id.id,
|
||||
'lot_name': self.finished_lot_id and self.finished_lot_id.name,
|
||||
})
|
||||
|
||||
if not self._get_todo(self.production_id):
|
||||
ml_reserved = self.subcontract_move_id.move_line_ids.filtered(lambda ml:
|
||||
float_is_zero(ml.qty_done, precision_rounding=ml.product_uom_id.rounding) and
|
||||
|
||||
Reference in New Issue
Block a user