diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 14731dc6fe0..eb56f6522d3 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -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 diff --git a/addons/mrp/wizard/mrp_product_produce.py b/addons/mrp/wizard/mrp_product_produce.py index aafd329ac9e..5504a4e73bb 100644 --- a/addons/mrp/wizard/mrp_product_produce.py +++ b/addons/mrp/wizard/mrp_product_produce.py @@ -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 diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 83cc745d810..a761dd3356a 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -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