[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:
parent
96120dcdbd
commit
056bfc00a9
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue