diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index 289454d6a3e..fc3fa98a9f5 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -861,6 +861,25 @@ class MrpProduction(models.Model):
move = self.env['stock.move'].create(move_values)
return move, 0, quantity
+ def _update_raw_moves(self, factor):
+ self.ensure_one()
+ update_info = []
+ move_to_unlink = self.env['stock.move']
+ for move in self.move_raw_ids.filtered(lambda m: m.state not in ('done', 'cancel')):
+ old_qty = move.product_uom_qty
+ new_qty = old_qty * factor
+ if new_qty > 0:
+ move.write({'product_uom_qty': new_qty})
+ move._action_assign()
+ update_info.append((move, old_qty, new_qty))
+ else:
+ if move.quantity_done > 0:
+ raise UserError(_('Lines need to be deleted, but can not as you still have some quantities to consume in them. '))
+ move._action_cancel()
+ move_to_unlink |= move
+ move_to_unlink.unlink()
+ return update_info
+
def _get_ready_to_produce_state(self):
""" returns 'assigned' if enough components are reserved in order to complete
the first operation of the bom. If not returns 'waiting'
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index a972822f35d..f1d5a82f4d5 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -137,7 +137,11 @@
/
-
+
+
@@ -206,13 +210,9 @@
-<<<<<<< HEAD
-
-=======
->>>>>>> dd9359b6fbe... fixup! [REF] mrp: no more produce wizard
diff --git a/addons/mrp/wizard/change_production_qty.py b/addons/mrp/wizard/change_production_qty.py
index bb589ac9bdb..72d00e9b348 100644
--- a/addons/mrp/wizard/change_production_qty.py
+++ b/addons/mrp/wizard/change_production_qty.py
@@ -53,46 +53,27 @@ class ChangeProductionQty(models.TransientModel):
production.write({'product_qty': wizard.product_qty})
done_moves = production.move_finished_ids.filtered(lambda x: x.state == 'done' and x.product_id == production.product_id)
qty_produced = production.product_id.uom_id._compute_quantity(sum(done_moves.mapped('product_qty')), production.product_uom_id)
- factor = production.product_uom_id._compute_quantity(production.product_qty - qty_produced, production.bom_id.product_uom_id) / production.bom_id.product_qty
- boms, lines = production.bom_id.explode(production.product_id, factor, picking_type=production.bom_id.picking_type_id)
+
+ factor = (production.product_qty - qty_produced) / (old_production_qty - qty_produced)
+ update_info = production._update_raw_moves(factor)
documents = {}
- for line, line_data in lines:
- if line.child_bom_id and line.child_bom_id.type == 'phantom' or\
- line.product_id.type not in ['product', 'consu']:
- continue
- move = production.move_raw_ids.filtered(lambda x: x.bom_line_id.id == line.id and x.state not in ('done', 'cancel'))
- if move:
- move = move[0]
- old_qty = move.product_uom_qty
- else:
- old_qty = 0
+ for move, old_qty, new_qty in update_info:
iterate_key = production._get_document_iterate_key(move)
if iterate_key:
- document = self.env['stock.picking']._log_activity_get_documents({move: (line_data['qty'], old_qty)}, iterate_key, 'UP')
+ document = self.env['stock.picking']._log_activity_get_documents({move: (new_qty, old_qty)}, iterate_key, 'UP')
for key, value in document.items():
if documents.get(key):
documents[key] += [value]
else:
documents[key] = [value]
-
- production._update_raw_move(line, line_data)
production._log_manufacture_exception(documents)
- operation_bom_qty = {}
- for bom, bom_data in boms:
- for operation in bom.operation_ids:
- operation_bom_qty[operation.id] = bom_data['qty']
- finished_moves_modification = self._update_finished_moves(production, production.product_qty - qty_produced, old_production_qty)
+ finished_moves_modification = self._update_finished_moves(production, production.product_qty - qty_produced, old_production_qty - qty_produced)
if finished_moves_modification:
production._log_downside_manufactured_quantity(finished_moves_modification)
- moves = production.move_raw_ids.filtered(lambda x: x.state not in ('done', 'cancel'))
- moves._action_assign()
+
for wo in production.workorder_ids:
operation = wo.operation_id
- if operation_bom_qty.get(operation.id):
- cycle_number = float_round(operation_bom_qty[operation.id] / operation.workcenter_id.capacity, precision_digits=0, rounding_method='UP')
- wo.duration_expected = (operation.workcenter_id.time_start +
- operation.workcenter_id.time_stop +
- cycle_number * operation.time_cycle * 100.0 / operation.workcenter_id.time_efficiency)
+ wo._onchange_expected_duration()
quantity = wo.qty_production - wo.qty_produced
if production.product_id.tracking == 'serial':
quantity = 1.0 if not float_is_zero(quantity, precision_digits=precision) else 0.0