summaryrefslogtreecommitdiff
path: root/addons/mrp_subcontracting/wizard
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mrp_subcontracting/wizard')
-rw-r--r--addons/mrp_subcontracting/wizard/mrp_product_produce.py64
1 files changed, 51 insertions, 13 deletions
diff --git a/addons/mrp_subcontracting/wizard/mrp_product_produce.py b/addons/mrp_subcontracting/wizard/mrp_product_produce.py
index 439c2f4566c..ceb803858e0 100644
--- a/addons/mrp_subcontracting/wizard/mrp_product_produce.py
+++ b/addons/mrp_subcontracting/wizard/mrp_product_produce.py
@@ -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