Got the solution by adding a flag variable in action_produce function in mrp.py.
Here is the code... but check it once by yourself.
def action_produce(self, cr, uid, production_id, production_qty, production_mode, context=None):
""" To produce final product based on production mode (consume/consume&produce).
If Production mode is consume, all stock move lines of raw materials will be done/consumed.
If Production mode is consume & produce, all stock move lines of raw materials will be done/consumed
and stock move lines of final product will be also done/produced.
@param production_id: the ID of mrp.production object
@param production_qty: specify qty to produce
@param production_mode: specify production mode (consume/consume&produce).
@return: True
"""
count=0 stock_mov_obj = self.pool.get('stock.move')
production = self.browse(cr, uid, production_id, context=context)
final_product_todo = []
produced_qty = 0
if production_mode == 'consume_produce': produced_qty = production_qty
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
if production_mode in ['consume', 'consume_produce']: consumed_products = {}
check = {} scrapped = map(lambda x:x.scrapped, production.move_lines2).count(True)
for consumed_product in production.move_lines2: consumed = consumed_product.product_qty
if consumed_product.scrapped: continue
if not consumed_products.get(consumed_product.product_id.id, False): consumed_products[consumed_product.product_id.id] = consumed_product.product_qty check[consumed_product.product_id.id] = 0
for f in production.product_lines: if f.product_id.id == consumed_product.product_id.id: if (len(production.move_lines2) - scrapped) > len(production.product_lines): check[consumed_product.product_id.id] += consumed_product.product_qty consumed = check[consumed_product.product_id.id] rest_consumed = produced_qty * f.product_qty / production.product_qty - consumed consumed_products[consumed_product.product_id.id] = rest_consumed
for raw_product in production.move_lines: count=0
for f in production.product_lines: if f.product_id.id == raw_product.product_id.id and count==0: count=count+1 consumed_qty = consumed_products.get(raw_product.product_id.id, 0) if consumed_qty == 0: consumed_qty = production_qty * f.product_qty / production.product_qty if consumed_qty > 0: stock_mov_obj.action_consume(cr, uid, [raw_product.id], consumed_qty, production.location_src_id.id, context=context)
if production_mode == 'consume_produce':
# To produce remaining qty of final product
vals = {'state':'confirmed'} #final_product_todo = [x.id for x in production.move_created_ids] #stock_mov_obj.write(cr, uid, final_product_todo, vals) #stock_mov_obj.action_confirm(cr, uid, final_product_todo, context) produced_products = {}
for produced_product in production.move_created_ids2:
if produced_product.scrapped: continue
if not produced_products.get(produced_product.product_id.id, False): produced_products[produced_product.product_id.id] = 0 produced_products[produced_product.product_id.id] += produced_product.product_qty
for produce_product in production.move_created_ids: produced_qty = produced_products.get(produce_product.product_id.id, 0) rest_qty = production.product_qty - produced_qty
if rest_qty <= production_qty: production_qty = rest_qty
if rest_qty > 0 : stock_mov_obj.action_consume(cr, uid, [produce_product.id], production_qty, context=context)
for raw_product in production.move_lines2: new_parent_ids = [] parent_move_ids = [x.id for x in raw_product.move_history_ids]
for final_product in production.move_created_ids2:
if final_product.id not in parent_move_ids: new_parent_ids.append(final_product.id)
for new_parent_id in new_parent_ids: stock_mov_obj.write(cr, uid, [raw_product.id], {'move_history_ids': [(4, new_parent_id)]})
Got the solution by adding a flag variable in action_produce function in mrp.py.
Here is the code... but check it once by yourself.
def action_ produce( self, cr, uid, production_id, production_qty, production_mode, context=None): consume& produce) . consume& produce) .
stock_ mov_obj = self.pool. get('stock. move')
""" To produce final product based on production mode (consume/
If Production mode is consume, all stock move lines of raw materials will be done/consumed.
If Production mode is consume & produce, all stock move lines of raw materials will be done/consumed
and stock move lines of final product will be also done/produced.
@param production_id: the ID of mrp.production object
@param production_qty: specify qty to produce
@param production_mode: specify production mode (consume/
@return: True
"""
count=0
production = self.browse(cr, uid, production_id, context=context)
if production_mode == 'consume_produce':
for produced_product in production. move_created_ ids2: product. scrapped) or (produced_ product. product_ id.id <> production. product_ id.id):
continue
produced_ qty += produced_ product. product_ qty
if (produced_
if production_mode in ['consume', 'consume_produce']:
consumed_ products = {}
scrapped = map(lambda x:x.scrapped, production. move_lines2) .count( True)
check = {}
for consumed_product in production. move_lines2:
consumed = consumed_ product. product_ qty product. scrapped:
continue products. get(consumed_ product. product_ id.id, False):
consumed_ products[ consumed_ product. product_ id.id] = consumed_ product. product_ qty
check[ consumed_ product. product_ id.id] = 0 product_ lines:
if f.product_id.id == consumed_ product. product_ id.id:
if (len(production .move_lines2) - scrapped) > len(production. product_ lines):
check[consumed_ product. product_ id.id] += consumed_ product. product_ qty
consumed = check[consumed_ product. product_ id.id]
rest_ consumed = produced_qty * f.product_qty / production. product_ qty - consumed
consumed_ products[ consumed_ product. product_ id.id] = rest_consumed
if consumed_
if not consumed_
for f in production.
for raw_product in production. move_lines:
count= 0 product_ lines:
if f.product_id.id == raw_product. product_ id.id and count==0:
count= count+1
consumed_ qty = consumed_ products. get(raw_ product. product_ id.id, 0)
if consumed_qty == 0:
consumed_ qty = production_qty * f.product_qty / production. product_ qty
if consumed_qty > 0:
stock_mov_ obj.action_ consume( cr, uid, [raw_product.id], consumed_qty, production. location_ src_id. id, context=context)
for f in production.
if production_mode == 'consume_produce': :'confirmed' }
#final_ product_ todo = [x.id for x in production. move_created_ ids]
#stock_ mov_obj. write(cr, uid, final_product_todo, vals)
#stock_ mov_obj. action_ confirm( cr, uid, final_product_todo, context)
produced_ products = {} move_created_ ids2: product. scrapped:
continue products. get(produced_ product. product_ id.id, False):
produced_ products[ produced_ product. product_ id.id] = 0
produced_ products[ produced_ product. product_ id.id] += produced_ product. product_ qty
# To produce remaining qty of final product
vals = {'state'
for produced_product in production.
if produced_
if not produced_
for produce_product in production. move_created_ ids:
produced_ qty = produced_ products. get(produce_ product. product_ id.id, 0)
rest_ qty = production. product_ qty - produced_qty
production _qty = rest_qty
stock_ mov_obj. action_ consume( cr, uid, [produce_ product. id], production_qty, context=context)
if rest_qty <= production_qty:
if rest_qty > 0 :
for raw_product in production. move_lines2:
new_ parent_ ids = []
parent_ move_ids = [x.id for x in raw_product. move_history_ ids] move_created_ ids2:
new_ parent_ ids.append( final_product. id)
stock_ mov_obj. write(cr, uid, [raw_product.id], {'move_ history_ ids': [(4, new_parent_id)]})
for final_product in production.
if final_product.id not in parent_move_ids:
for new_parent_id in new_parent_ids:
wf_service = netsvc. LocalService( "workflow" )
wf_service. trg_validate( uid, 'mrp.production', production_id, 'button_ produce_ done', cr)
return True
Hope this will resolve your problem.