[IMP]: mrp: Added wizard of Production done, Moved change qty logic to mrp_production from wizard

bzr revid: rpa@openerp.co.in-20100223102641-yqolnuds2hkdr6a2
This commit is contained in:
rpa (Open ERP)
2010-02-23 15:56:41 +05:30
parent 71bd312682
commit 6e5147c9c5
3 changed files with 113 additions and 91 deletions
+103 -35
View File
@@ -586,27 +586,57 @@ class mrp_production(osv.osv):
return True
#TODO Review materials in function in_prod and prod_end.
def action_production_end(self, cr, uid, ids):
def action_production_end(self, cr, uid, ids, qty=0.0, mode=None):
move_ids = []
finished = []
qty_rest = 0.0
move_obj = self.pool.get('stock.move')
for production in self.browse(cr, uid, ids):
for res in production.move_lines:
for move in production.move_created_ids:
#XXX must use the orm
cr.execute('INSERT INTO stock_move_history_ids \
(parent_id, child_id) VALUES (%s,%s)',
(res.id, move.id))
move_ids.append(res.id)
vals= {'state':'confirmed'}
new_moves = [x.id for x in production.move_created_ids]
self.pool.get('stock.move').write(cr, uid, new_moves, vals)
if not production.date_finnished:
if qty > production.product_qty:
# Is it required??
raise osv.except_osv(_('Error'), _("Couldn't produce more quantity"))
elif qty == production.product_qty:
for res in production.move_lines:
for move in production.move_created_ids:
#XXX must use the orm
cr.execute('INSERT INTO stock_move_history_ids \
(parent_id, child_id) VALUES (%s,%s)',
(res.id, move.id))
move_ids.append(res.id)
finished += [x.id for x in production.move_created_ids]
elif qty < production.product_qty:
qty_rest = production.product_qty - qty
# Needs other field to store value of already consumed products
# self.write(cr, uid, ids, {'product_qty': qty_rest})
moves = map(lambda x: x.id, production.move_lines)
moves_created = map(lambda x: x.id, production.move_created_ids)
if mode == 'consume':
temp = move_obj.consume_moves(cr, uid, moves, qty)
temp1 = move_obj.consume_moves(cr, uid, moves_created, qty)
move_ids += temp
finished += temp1
elif mode == 'consume_produce':
for move in move_obj.browse(cr, uid, moves):
move_obj.write(cr, uid, move.id, {'product_qty': qty})
new_move = move_obj.copy(cr, uid, move.id, {'product_qty': qty_rest, 'state': move.state})
self.write(cr, uid, production.id, {'move_lines': [(4, new_move)]})
move_ids += moves
for move in move_obj.browse(cr, uid, moves_created):
move_obj.write(cr, uid, move.id, {'product_qty': qty})
new_finished = move_obj.copy(cr, uid, move.id, {'product_qty': qty_rest, 'state': move.state})
self.write(cr, uid, production.id, {'move_created_ids': [(4, new_finished)]})
finished += moves_created
move_obj.write(cr, uid, finished, vals={'state':'confirmed'})
if not production.date_finnished and mode != 'consume':
self.write(cr, uid, [production.id],
{'date_finnished': time.strftime('%Y-%m-%d %H:%M:%S')})
self.pool.get('stock.move').check_assign(cr, uid, new_moves)
self.pool.get('stock.move').action_done(cr, uid, new_moves)
self._costs_generate(cr, uid, production)
self.pool.get('stock.move').action_done(cr, uid, move_ids)
self.write(cr, uid, ids, {'state': 'done'})
move_obj.action_done(cr, uid, finished)
move_obj.action_done(cr, uid, move_ids)
if mode == 'consume_produce' and not qty_rest and not finished:
move_obj.check_assign(cr, uid, finished)
self._costs_generate(cr, uid, production)
self.write(cr, uid, ids, {'state': 'done'})
return True
def _costs_generate(self, cr, uid, production):
@@ -641,21 +671,6 @@ class mrp_production(osv.osv):
} )
return amount
def action_in_production_my(self, cr, uid, ids, qty=None):
print 'action_in_production', ids, qty
move_obj = self.pool.get('stock.move')
move_ids = []
for production in self.browse(cr, uid, ids):
move_ids = map(lambda x: x.id, production.move_lines + production.move_lines2)
if not production.date_start:
self.write(cr, uid, [production.id],
{'date_start': time.strftime('%Y-%m-%d %H:%M:%S')})
print 'MMMMMMMMMMMMMMMMMMMMMMMM', move_ids
for move in move_obj.browse(cr, uid, move_ids):
move_obj.consume_moves(cr, uid, move.id, qty, move.location_id.id)
# self.write(cr, uid, ids, {'state': 'in_production'})
return True
def action_in_production(self, cr, uid, ids):
move_ids = []
self.write(cr, uid, ids, {'state': 'in_production'})
@@ -777,6 +792,60 @@ class mrp_production(osv.osv):
pick_obj = self.pool.get('stock.picking')
pick_obj.force_assign(cr, uid, [prod.picking_id.id for prod in self.browse(cr, uid, ids)])
return True
def _change_prod_qty(self, cr, uid, ids, new_qty, context={}):
move_lines_obj = self.pool.get('stock.move')
for id in ids:
prod = self.browse(cr, uid, id)
self.write(cr, uid, prod.id, {'product_qty' : new_qty})
self.action_compute(cr, uid, [prod.id])
bom_point = prod.bom_id
bom_id = prod.bom_id.id
if not bom_point:
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id)
if not bom_id:
raise osv.except_osv(_('Error'), _("Couldn't find bill of material for product"))
self.write(cr, uid, [prod.id], {'bom_id': bom_id})
bom_point = self.pool.get('mrp.bom').browse(cr, uid, [bom_id])[0]
factor = new_qty * prod.product_uom.factor / bom_point.product_uom.factor
res = self.pool.get('mrp.bom')._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, [])
qty_vals = {}
qty_vals_done = {}
moves = {}
moves_done = {}
for move in prod.move_lines:
moves[move.product_id.id] = []
qty_vals[move.product_id.id] = qty_vals.get(move.product_id.id, 0.0) + move.product_qty
moves[move.product_id.id].append(move.id)
for move in prod.move_lines2:
moves_done[move.product_id.id] = []
qty_vals_done[move.product_id.id] = qty_vals_done.get(move.product_id.id, 0.0) + move.product_qty
moves_done[move.product_id.id].append(move.id)
for r in res[0]:
if not moves.get(r['product_id']) and moves_done.get(r['product_id']):
new_qty = (r['product_qty'] - qty_vals_done.get(r['product_id'], 0.0))
new_move = move_lines_obj.copy(cr, uid, moves_done.get(r['product_id']), default={'product_qty': new_qty})
self.write(cr, uid, prod.id, {'move_lines': [(4, new_move)]})
continue
to_add = (r['product_qty'] - qty_vals_done.get(r['product_id'], 0.0)) - qty_vals.get(r['product_id'], 0.0)
avail_qty = move_lines_obj.browse(cr, uid, moves[r['product_id']][0]).product_qty
new_qty = avail_qty + to_add
if new_qty == 0:
move_lines_obj.write(cr, uid, moves[r['product_id']][0], {'state': 'draft'})
move_lines_obj.unlink(cr, uid, moves[r['product_id']])
elif new_qty < 0:
avail_qty = move_lines_obj.browse(cr, uid, moves_done[r['product_id']][0]).product_qty
move_lines_obj.unlink(cr, uid, moves[r['product_id']][0])
move_lines_obj.write(cr, uid, moves_done[r['product_id']][0], {'product_qty': avail_qty + new_qty})
else:
move_lines_obj.write(cr, uid, moves[r['product_id']][0], {'product_qty': avail_qty + to_add})
# TODO:For Finished Product lines
# product_lines_obj = self.pool.get('mrp.production.product.line')
# for m in prod.move_created_ids:
# move_lines_obj.write(cr, uid,m.id, {'product_qty' : new_qty})
return {}
mrp_production()
@@ -1305,7 +1374,6 @@ class StockMove(osv.osv):
if move.state=='assigned':
state='assigned'
for line in res[0]:
print 'Line :',line
valdef = {
'picking_id': move.picking_id.id,
'product_id': line['product_id'],
@@ -1364,11 +1432,11 @@ class StockMove(osv.osv):
move_obj.action_done(cr, uid, [new])
return {}
def consume_moves(self, cr, uid, ids, product_qty, location_id, context=None):
def consume_moves(self, cr, uid, ids, product_qty, location_id=None, context=None):
res = []
production_obj = self.pool.get('mrp.production')
for move in self.browse(cr, uid, ids):
new_moves = super(StockMove, self).consume_moves(cr, uid, ids, product_qty, location_id, context=context)
new_moves = super(StockMove, self).consume_moves(cr, uid, [move.id], product_qty, location_id, context=context)
production_ids = production_obj.search(cr, uid, [('move_lines', 'in', [move.id])])
for new_move in new_moves:
production_obj.write(cr, uid, production_ids, {'move_lines': [(4, new_move)]})
+1 -1
View File
@@ -532,7 +532,7 @@
<button name="action_compute" states="draft" string="Compute Data" type="object" icon="gtk-execute"/>
<button name="button_confirm" states="draft" string="Confirm Production" icon="gtk-apply"/>
<button name="button_produce" states="ready" string="Mark as Start" icon="gtk-execute"/>
<button name="button_produce_done" states="in_production" string="Production" icon="gtk-ok"/>
<button name="%(move_produce)d" states="in_production" string="Produce" icon="gtk-ok" type="action"/>
<button name="force_production" states="confirmed,picking_except" string="Force Reservation" type="object" icon="gtk-jump-to"/>
<button name="button_cancel" states="draft,ready,confirmed,in_production,picking_except" string="Cancel" icon="gtk-cancel"/>
<button name="button_recreate" states="picking_except" string="Recreate Picking" icon="gtk-convert"/>
+9 -55
View File
@@ -34,7 +34,8 @@ class stock_move_produce(osv.osv_memory):
}
def _get_product_qty(self, cr, uid, context):
prod = self.pool.get('mrp.production').browse(cr, uid, context['active_id'], context=context)
prod = self.pool.get('mrp.production').browse(cr, uid,
context['active_id'], context=context)
return prod.product_qty
_defaults = {
@@ -45,8 +46,11 @@ class stock_move_produce(osv.osv_memory):
def do_move_produce(self, cr, uid, ids, context={}):
datas = self.read(cr, uid, ids)[0]
prod_obj = self.pool.get('mrp.production')
wf_service = netsvc.LocalService('workflow')
wf_service.trg_validate(uid, 'mrp.production', context['active_id'], 'button_produce', cr)
# wf_service = netsvc.LocalService('workflow')
# wf_service.trg_validate(uid, 'mrp.production', context['active_id'],
# 'button_produce_done', cr)
prod_obj.action_production_end(cr, uid, [context['active_id']],
qty=datas['product_qty'], mode=datas['mode'])
return {}
stock_move_produce()
@@ -71,57 +75,7 @@ class change_production_qty(osv.osv_memory):
def change_prod_qty(self, cr, uid, ids, context={}):
datas = self.read(cr, uid, ids)[0]
prod_obj = self.pool.get('mrp.production')
move_lines_obj = self.pool.get('stock.move')
new_qty = datas['product_qty']
prod = prod_obj.browse(cr, uid, context['active_id'])
prod_obj.write(cr, uid, prod.id, {'product_qty' : new_qty})
prod_obj.action_compute(cr, uid, [prod.id])
bom_point = prod.bom_id
bom_id = prod.bom_id.id
if not bom_point:
bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id)
if not bom_id:
raise osv.except_osv(_('Error'), _("Couldn't find bill of material for product"))
self.write(cr, uid, [prod.id], {'bom_id': bom_id})
bom_point = self.pool.get('mrp.bom').browse(cr, uid, [bom_id])[0]
factor = new_qty * prod.product_uom.factor / bom_point.product_uom.factor
res = self.pool.get('mrp.bom')._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, [])
qty_vals = {}
qty_vals_done = {}
moves = {}
moves_done = {}
for move in prod.move_lines:
moves[move.product_id.id] = []
qty_vals[move.product_id.id] = qty_vals.get(move.product_id.id, 0.0) + move.product_qty
moves[move.product_id.id].append(move.id)
for move in prod.move_lines2:
moves_done[move.product_id.id] = []
qty_vals_done[move.product_id.id] = qty_vals_done.get(move.product_id.id, 0.0) + move.product_qty
moves_done[move.product_id.id].append(move.id)
for r in res[0]:
if not moves.get(r['product_id']) and moves_done.get(r['product_id']):
new_qty = (r['product_qty'] - qty_vals_done.get(r['product_id'], 0.0))
new_move = move_lines_obj.copy(cr, uid, moves_done.get(r['product_id']), default={'product_qty': new_qty})
prod_obj.write(cr, uid, prod.id, {'move_lines': [(4, new_move)]})
continue
to_add = (r['product_qty'] - qty_vals_done.get(r['product_id'], 0.0)) - qty_vals.get(r['product_id'], 0.0)
avail_qty = move_lines_obj.browse(cr, uid, moves[r['product_id']][0]).product_qty
new_qty = avail_qty + to_add
if new_qty == 0:
move_lines_obj.write(cr, uid, moves[r['product_id']][0], {'state': 'draft'})
move_lines_obj.unlink(cr, uid, moves[r['product_id']])
elif new_qty < 0:
avail_qty = move_lines_obj.browse(cr, uid, moves_done[r['product_id']][0]).product_qty
move_lines_obj.unlink(cr, uid, moves[r['product_id']][0])
move_lines_obj.write(cr, uid, moves_done[r['product_id']][0], {'product_qty': avail_qty + new_qty})
else:
move_lines_obj.write(cr, uid, moves[r['product_id']][0], {'product_qty': avail_qty + to_add})
# TODO:For Finished Product lines
# product_lines_obj = self.pool.get('mrp.production.product.line')
# for m in prod.move_created_ids:
# move_lines_obj.write(cr, uid,m.id, {'product_qty' : new_qty})
prod_obj._change_prod_qty(cr, uid, context['active_ids'], datas['product_qty'], context=context)
return {}
change_production_qty()
change_production_qty()