[IMP] Make sure the wizard does not take negative quants and refactor a little bit not to have duplicate code

bzr revid: jco@openerp.com-20140121104051-87ihs7fnz72i0b9z
This commit is contained in:
Josse Colpaert 2014-01-21 11:40:51 +01:00
parent 96120dcdbd
commit 056bfc00a9
3 changed files with 27 additions and 40 deletions

View File

@ -772,6 +772,25 @@ class mrp_production(osv.osv):
"""
return 1
def _get_produced_qty(self, cr, uid, production, context=None):
produced_qty = 0
for produced_product in production.move_created_ids2:
if (produced_product.scrapped) or (produced_product.product_id.id != production.product_id.id):
continue
produced_qty += produced_product.product_qty
return produced_qty
def _get_consumed_data(self, cr, uid, production, context=None):
consumed_data = {}
# Calculate already consumed qtys
for consumed in production.move_lines2:
if consumed.scrapped:
continue
if not consumed_data.get(consumed.product_id.id, False):
consumed_data[consumed.product_id.id] = 0
consumed_data[consumed.product_id.id] += consumed.product_qty
return consumed_data
def action_produce(self, cr, uid, production_id, production_qty, production_mode, wiz, context=None):
""" To produce final product based on production mode (consume/consume&produce).
@ -791,11 +810,7 @@ class mrp_production(osv.osv):
# trigger workflow if not products to consume (eg: services)
self.signal_button_produce(cr, uid, [production_id])
produced_qty = 0
for produced_product in production.move_created_ids2:
if (produced_product.scrapped) or (produced_product.product_id.id != production.product_id.id):
continue
produced_qty += produced_product.product_qty
produced_qty = self._get_produced_qty(cr, uid, production, context=context)
main_production_move = False
if production_mode == 'consume_produce':
@ -823,21 +838,8 @@ class mrp_production(osv.osv):
new_moves = stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), location_id = produce_product.location_id.id, restrict_lot_id = wiz.lot_id.id, context=context)
if produce_product.product_id.id == production.product_id.id and new_moves:
main_production_move = new_moves[0]
# if produce_product.product_id.id == production.bom_id.product_id.id:
# stock_mov_obj.write(cr, uid, new_moves, {'consumed_for': produce_product.id}, context=context)
if production_mode in ['consume','consume_produce']:
consumed_data = {}
# Calculate already consumed qtys
for consumed in production.move_lines2:
if consumed.scrapped:
continue
if not consumed_data.get(consumed.product_id.id, False):
consumed_data[consumed.product_id.id] = 0
consumed_data[consumed.product_id.id] += consumed.product_qty
consumed_moves = []
for consume in wiz.consume_lines:
# Search move for the product

View File

@ -54,31 +54,16 @@ class mrp_product_produce(osv.osv_memory):
def on_change_qty(self, cr, uid, ids, product_qty, consume_lines, context=None):
""" Will calculate number of products based on
""" Will give the initial number of consumption lines
"""
quant_obj = self.pool.get("stock.quant")
prod_obj = self.pool.get("mrp.production")
production = prod_obj.browse(cr, uid, context['active_id'], context=context)
produced_qty = 0
for produced_product in production.move_created_ids2:
if (produced_product.scrapped) or (produced_product.product_id.id != production.product_id.id):
continue
produced_qty += produced_product.product_qty
produced_qty = prod_obj._get_produced_qty(cr, uid, production, context=context)
consumed_data = prod_obj._get_consumed_data(cr, uid, production, context=context)
#Calculate consume lines
consumed_data = {}
for consumed in production.move_lines2:
if consumed.scrapped:
continue
if not consumed_data.get(consumed.product_id.id, False):
consumed_data[consumed.product_id.id] = 0
consumed_data[consumed.product_id.id] += consumed.product_qty
new_consume_lines = []
dicts = {}
# Find product qty to be consumed and consume it
for scheduled in production.product_lines:
@ -100,12 +85,12 @@ class mrp_product_produce(osv.osv_memory):
move = [x for x in production.move_lines if x.product_id.id == scheduled.product_id.id]
#TODO: check if not already in dict_new
if move:
product_id = scheduled.product_id.id
move = move[0]
quants = quant_obj.quants_get_prefered_domain(cr, uid, move.location_id, scheduled.product_id, qty, domain=None,
quants = quant_obj.quants_get_prefered_domain(cr, uid, move.location_id, scheduled.product_id, qty, domain=[('qty', '>', 0.0)],
prefered_domain=[('reservation_id', '=', move.id)], fallback_domain=[('reservation_id', '=', False)], context=context)
for quant in quants:
if quant[0]:
product_id = scheduled.product_id.id
lot_id = quant[0].lot_id.id
prod_qty = quant[1]
if not product_id in dicts.keys():
@ -116,7 +101,7 @@ class mrp_product_produce(osv.osv_memory):
dicts[product_id][lot_id] = prod_qty
qty -= quant[1]
if qty > 0:
if dicts[product_id][False]:
if dicts[product_id].get(False):
dicts[product_id][False] += qty
else:
dicts[product_id][False] = qty

View File

@ -283,7 +283,7 @@ class stock_quant(osv.osv):
def quants_reserve(self, cr, uid, quants, move, link=False, context=None):
'''This function reserves quants for the given move (and optionally given link). If the total of quantity reserved is enough, the move's state
is also set to 'assigned'
is also set to 'assigned' Please do not pass negative quants.
:param quants: list of tuple(quant browse record or None, qty to reserve). If None is given as first tuple element, the item will be ignored
:param move: browse record