diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 8963942dbff..3ba3fd73f06 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -757,6 +757,7 @@ class sale_order(osv.osv): :return: True """ proc_ids = [] + move_obj = self.pool.get('stock.move') for line in order_lines: if line.state == 'done': continue @@ -768,7 +769,7 @@ class sale_order(osv.osv): if line.product_id.product_tmpl_id.type in ('product', 'consu'): if not picking_id: picking_id = self.pool.get('stock.picking').create(cr, uid, self._prepare_order_picking(cr, uid, order, *args)) - move_id = self.pool.get('stock.move').create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args)) + move_id = move_obj.create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args)) else: # a service has no stock move move_id = False @@ -783,11 +784,11 @@ class sale_order(osv.osv): for pick in order.picking_ids: for move in pick.move_lines: if move.state == 'cancel': - mov_ids = self.pool.get('stock.move').search(cr, uid, [('state', '=', 'cancel'),('sale_line_id', '=', line.id),('picking_id', '=', pick.id)]) + mov_ids = move_obj.search(cr, uid, [('state', '=', 'cancel'),('sale_line_id', '=', line.id),('picking_id', '=', pick.id)]) if mov_ids: for mov in move_obj.browse(cr, uid, mov_ids): # FIXME: the following seems broken: what if move_id doesn't exist? What if there are several mov_ids? Shouldn't that be a sum? - self.pool.get('stock.move').write(cr, uid, [move_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) + move_obj.write(cr, uid, [move_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) self.pool.get('procurement.order').write(cr, uid, [proc_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) wf_service = netsvc.LocalService("workflow") diff --git a/addons/sale/sale_workflow.xml b/addons/sale/sale_workflow.xml index 0ff5eb15ea0..4e75ee92e09 100644 --- a/addons/sale/sale_workflow.xml +++ b/addons/sale/sale_workflow.xml @@ -221,7 +221,8 @@ - test_state('canceled') + ship_exception + diff --git a/addons/sale/stock.py b/addons/sale/stock.py index 223ac7458e2..1f517070ef3 100644 --- a/addons/sale/stock.py +++ b/addons/sale/stock.py @@ -20,6 +20,7 @@ ############################################################################## from osv import osv, fields +import netsvc class stock_move(osv.osv): _inherit = 'stock.move' @@ -47,14 +48,10 @@ class stock_picking(osv.osv): """ Changes picking state to cancel. @return: True """ - for pick in self.browse(cr, uid, ids, context=context): - ids2 = [move.id for move in pick.move_lines] - self.pool.get('stock.move').action_cancel(cr, uid, ids2, context) - self.write(cr, uid, ids, {'state': 'cancel', 'invoice_state': 'none'}) - self.log_picking(cr, uid, ids, context=context) sale_id = self.browse(cr, uid, ids)[0].sale_id.id - self.pool.get('sale.order').write(cr, uid, sale_id, {'state':'shipping_except'}) - return True + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'sale.order', sale_id, 'ship_exception', cr) + return super(stock_picking, self).action_cancel(cr, uid, ids) def get_currency_id(self, cursor, user, picking): if picking.sale_id: diff --git a/addons/sale/test/process/cancel_order.yml b/addons/sale/test/process/cancel_order.yml index 0817398d472..de34ce9bca9 100644 --- a/addons/sale/test/process/cancel_order.yml +++ b/addons/sale/test/process/cancel_order.yml @@ -14,12 +14,12 @@ !python {model: sale.order}: | order = self.browse(cr, uid, ref("order")) self.pool.get('stock.picking').action_cancel(cr, uid, [picking.id for picking in order.picking_ids]) + assert order.picking_ids[0].state == "cancel","order's related picking should be cancelled" - I check order status in "Shipping Exception" and related picking is in cancel state. - !python {model: sale.order}: | order = self.browse(cr, uid, ref("order")) - assert order.picking_ids[0].state == "cancel","order's related picking should be cancelled" assert order.state == "shipping_except", "order should be in Ship Exception state after cancel shipment" - I try to cancel the invoice.