From 0a25369a43e5642a8da24981123e781ec5af29db Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 18 Dec 2013 11:13:45 +0100 Subject: [PATCH] [FIX] procurement: when cancelling procurements, cancel only the undone ones bzr revid: qdp-launchpad@openerp.com-20131218101345-ff2vmwsjcht66omk --- addons/procurement/procurement.py | 8 +++++++- addons/stock/procurement.py | 13 ++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py index 9126895..86fa02e 100644 --- a/addons/procurement/procurement.py +++ b/addons/procurement/procurement.py @@ -182,8 +182,14 @@ class procurement_order(osv.osv): return {'value': v} return {} + def get_cancel_ids(self, cr, uid, ids, context=None): + return [proc.id for proc in self.browse(cr, uid, ids, context=context) if proc.state != 'done'] + def cancel(self, cr, uid, ids, context=None): - return self.write(cr, uid, ids, {'state': 'cancel'}, context=context) + #cancel only the procurements that aren't done already + to_cancel_ids = self.get_cancel_ids(cr, uid, ids, context=context) + if to_cancel_ids: + return self.write(cr, uid, to_cancel_ids, {'state': 'cancel'}, context=context) def reset_to_confirmed(self, cr, uid, ids, context=None): return self.write(cr, uid, ids, {'state': 'confirmed'}, context=context) diff --git a/addons/stock/procurement.py b/addons/stock/procurement.py index 307c5b6..6740246 100644 --- a/addons/stock/procurement.py +++ b/addons/stock/procurement.py @@ -109,13 +109,14 @@ class procurement_order(osv.osv): def cancel(self, cr, uid, ids, context=None): if context is None: context = {} + to_cancel_ids = self.get_cancel_ids(cr, uid, ids, context=context) ctx = context.copy() #set the context for the propagation of the procurement cancelation ctx['cancel_procurement'] = True - for procurement in self.browse(cr, uid, ids, context=ctx): + for procurement in self.browse(cr, uid, to_cancel_ids, context=ctx): if procurement.rule_id and procurement.rule_id.propagate: self.propagate_cancel(cr, uid, procurement, context=ctx) - return super(procurement_order, self).cancel(cr, uid, ids, context=ctx) + return super(procurement_order, self).cancel(cr, uid, to_cancel_ids, context=ctx) def _find_parent_locations(self, cr, uid, procurement, context=None): location = procurement.location_id @@ -196,6 +197,12 @@ class procurement_order(osv.osv): 'date_expected': newdate, 'propagate': procurement.rule_id.propagate, } + #look if the procurement was in exception (because all its moves were cancelled) and cancel the previously made attempt to avoid duplicates + cancelled_moves = [m.id for m in procurement.move_ids if m.state == 'cancel'] + if cancelled_moves: + previous_attempt = self.search(cr, uid, [('move_dest_id', 'in', cancelled_moves)], context=context) + if previous_attempt: + self.cancel(cr, uid, previous_attempt, context=context) return vals def _run(self, cr, uid, procurement, context=None): @@ -228,7 +235,7 @@ class procurement_order(osv.osv): self.write(cr, uid, [procurement.id], {'state': 'exception'}, context=context) self.message_post(cr, uid, [procurement.id], body=_('All stock moves have been cancelled for this procurement.'), context=context) return False - + return super(procurement_order, self)._check(cr, uid, procurement, context) def do_view_pickings(self, cr, uid, ids, context=None): -- 1.7.10.4