[FIX] stock: no rereservation needed in a lot of cases and make sure the moves passed to action_done are those from the recomputation

It is possible (in very rare cases) on rereservation that the new reservation will trigger other stock moves
than the first reservation.  In order to be sure to send the correct stock moves involved to done, it is better
to do the rereservation before the splitting of the moves on the total picking.

Also rereserve is optimized as it should only reserve for what is given by the pack operations,
as the backorder will be reserved later on anyways.
This commit is contained in:
Josse Colpaert
2016-07-05 17:26:06 +02:00
parent 60a7678b9d
commit 3de53fa165
+8 -5
View File
@@ -1661,6 +1661,13 @@ class stock_picking(models.Model):
todo_move_ids = []
if not all_op_processed:
todo_move_ids += self._create_extra_moves(cr, uid, picking, context=context)
if need_rereserve or not all_op_processed:
moves_reassign = any(x.origin_returned_move_id or x.move_orig_ids for x in picking.move_lines if x.state not in ['done', 'cancel'])
if moves_reassign and (picking.location_id.usage not in ("supplier", "production", "inventory")):
ctx = dict(context)
ctx['reserve_only_ops'] = True #unnecessary to assign other quants than those involved with pack operations as they will be unreserved anyways.
self.rereserve_quants(cr, uid, picking, move_ids=picking.move_lines.ids, context=ctx)
self.do_recompute_remaining_quantities(cr, uid, [picking.id], context=context)
#split move lines if needed
toassign_move_ids = []
@@ -1681,10 +1688,6 @@ class stock_picking(models.Model):
#Assign move as it was assigned before
toassign_move_ids.append(new_move)
todo_move_ids = list(set(todo_move_ids))
if need_rereserve or not all_op_processed:
if not picking.location_id.usage in ("supplier", "production", "inventory"):
self.rereserve_quants(cr, uid, picking, move_ids=todo_move_ids, context=context)
self.do_recompute_remaining_quantities(cr, uid, [picking.id], context=context)
if todo_move_ids and not context.get('do_only_split'):
self.pool.get('stock.move').action_done(cr, uid, todo_move_ids, context=context)
elif context.get('do_only_split'):
@@ -2464,7 +2467,7 @@ class stock_move(osv.osv):
for move in todo_moves:
#then if the move isn't totally assigned, try to find quants without any specific domain
if move.state != 'assigned':
if (move.state != 'assigned') and not context.get("reserve_only_ops"):
qty_already_assigned = move.reserved_availability
qty = move.product_qty - qty_already_assigned
quants = quant_obj.quants_get_preferred_domain(cr, uid, qty, move, domain=main_domain[move.id], preferred_domain_list=[], context=context)