[FIX] stock: include enventual serial number in product reservation procedure

done using context for stability reason
wont be needed in new wms
opw 600078

bzr revid: mat@openerp.com-20131104081038-e7qyg5rkwmg48x6a
This commit is contained in:
Martin Trigaux 2013-11-04 09:10:38 +01:00
commit 06c8267768
1 changed files with 14 additions and 5 deletions

View File

@ -401,15 +401,17 @@ class stock_location(osv.osv):
uom_rounding = self.pool.get('product.product').browse(cr, uid, product_id, context=context).uom_id.rounding
if context.get('uom'):
uom_rounding = uom_obj.browse(cr, uid, context.get('uom'), context=context).rounding
prodlot_id = context.get('prodlot_id', False)
locations_ids = self.search(cr, uid, [('location_id', 'child_of', ids)])
if locations_ids:
# Fetch only the locations in which this product has ever been processed (in or out)
cr.execute("""SELECT l.id FROM stock_location l WHERE l.id in %s AND
EXISTS (SELECT 1 FROM stock_move m WHERE m.product_id = %s
AND (NOT BOOL(%s) OR m.prodlot_id=%s)
AND ((state = 'done' AND m.location_dest_id = l.id)
OR (state in ('done','assigned') AND m.location_id = l.id)))
""", (tuple(locations_ids), product_id,))
""", (tuple(locations_ids), product_id, prodlot_id, prodlot_id or None))
locations_ids = [i for (i,) in cr.fetchall()]
for id in locations_ids:
if lock:
@ -421,6 +423,7 @@ class stock_location(osv.osv):
cr.execute("SAVEPOINT stock_location_product_reserve")
cr.execute("""SELECT id FROM stock_move
WHERE product_id=%s AND
(NOT BOOL(%s) OR prodlot_id=%s) AND
(
(location_dest_id=%s AND
location_id<>%s AND
@ -430,7 +433,7 @@ class stock_location(osv.osv):
location_dest_id<>%s AND
state in ('done', 'assigned'))
)
FOR UPDATE of stock_move NOWAIT""", (product_id, id, id, id, id), log_exceptions=False)
FOR UPDATE of stock_move NOWAIT""", (product_id, prodlot_id, prodlot_id or None, id, id, id, id), log_exceptions=False)
except Exception:
# Here it's likely that the FOR UPDATE NOWAIT failed to get the LOCK,
# so we ROLLBACK to the SAVEPOINT to restore the transaction to its earlier
@ -446,20 +449,22 @@ class stock_location(osv.osv):
WHERE location_dest_id=%s AND
location_id<>%s AND
product_id=%s AND
(NOT BOOL(%s) OR prodlot_id=%s) AND
state='done'
GROUP BY product_uom
""",
(id, id, product_id))
(id, id, product_id, prodlot_id, prodlot_id or None))
results = cr.dictfetchall()
cr.execute("""SELECT product_uom,-sum(product_qty) AS product_qty
FROM stock_move
WHERE location_id=%s AND
location_dest_id<>%s AND
product_id=%s AND
(NOT BOOL(%s) OR prodlot_id=%s) AND
state in ('done', 'assigned')
GROUP BY product_uom
""",
(id, id, product_id))
(id, id, product_id, prodlot_id, prodlot_id or None))
results += cr.dictfetchall()
total = 0.0
results2 = 0.0
@ -2176,8 +2181,12 @@ class stock_move(osv.osv):
pickings[move.picking_id.id] = 1
continue
if move.state in ('confirmed', 'waiting'):
ctx = context.copy()
ctx.update({'uom': move.product_uom.id})
if move.prodlot_id:
ctx.update({'prodlot_id': move.prodlot_id.id})
# Important: we must pass lock=True to _product_reserve() to avoid race conditions and double reservations
res = self.pool.get('stock.location')._product_reserve(cr, uid, [move.location_id.id], move.product_id.id, move.product_qty, {'uom': move.product_uom.id}, lock=True)
res = self.pool.get('stock.location')._product_reserve(cr, uid, [move.location_id.id], move.product_id.id, move.product_qty, context=ctx, lock=True)
if res:
#_product_available_test depends on the next status for correct functioning
#the test does not work correctly if the same product occurs multiple times