[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:
+103
-35
@@ -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)]})
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user