From 940b5beb2621858fdc8a2d1af6c205d5ebda5b10 Mon Sep 17 00:00:00 2001
From: Martin Trigaux <mart-e@users.noreply.github.com>
Date: Thu, 11 Dec 2014 14:15:56 +0100
Subject: [PATCH] [FIX] purchase: cancel PO lines and set related procurements
 in exception on cancelation of a PO

---
 addons/purchase/purchase.py           | 23 +++++++++++++++++++++--
 addons/purchase/purchase_workflow.xml |  2 +-
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index e6f4989c9a3a..eea61a7b3c9c 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -266,6 +266,22 @@ class purchase_order(osv.osv):
 
         return super(purchase_order, self).unlink(cr, uid, unlink_ids, context=context)
 
+    def set_order_line_status(self, cr, uid, ids, status, context=None):
+        line = self.pool.get('purchase.order.line')
+        order_line_ids = []
+        move_ids = []
+        proc_obj = self.pool.get('procurement.order')
+        for order in self.browse(cr, uid, ids, context=context):
+            order_line_ids += [po_line.id for po_line in order.order_line]
+            move_ids += [po_line.move_dest_id.id for po_line in order.order_line if po_line.move_dest_id]
+        if order_line_ids:
+            line.write(cr, uid, order_line_ids, {'state': status}, context=context)
+        if order_line_ids and status == 'cancel':
+            procs = proc_obj.search(cr, uid, [('move_id', 'in', move_ids)], context=context)
+            if procs:
+                proc_obj.write(cr, uid, procs, {'state': 'exception'}, context=context)
+        return True
+
     def button_dummy(self, cr, uid, ids, context=None):
         return True
 
@@ -582,6 +598,10 @@ class purchase_order(osv.osv):
                     return True
         return False
 
+    def wkf_action_cancel(self, cr, uid, ids, context=None):
+        self.write(cr, uid, ids, {'state': 'cancel'}, context=context)
+        self.set_order_line_status(cr, uid, ids, 'cancel', context=context)
+
     def action_cancel(self, cr, uid, ids, context=None):
         wf_service = netsvc.LocalService("workflow")
         for purchase in self.browse(cr, uid, ids, context=context):
@@ -601,9 +621,8 @@ class purchase_order(osv.osv):
                     wf_service.trg_validate(uid, 'account.invoice', inv.id, 'invoice_cancel', cr)
             self.pool['purchase.order.line'].write(cr, uid, [l.id for l in  purchase.order_line],
                     {'state': 'cancel'})
-        self.write(cr,uid,ids,{'state':'cancel'})
 
-        for (id, name) in self.name_get(cr, uid, ids):
+        for id in ids:
             wf_service.trg_validate(uid, 'purchase.order', id, 'purchase_cancel', cr)
         return True
 
diff --git a/addons/purchase/purchase_workflow.xml b/addons/purchase/purchase_workflow.xml
index bed4ba5275c3..ac9f561442a1 100644
--- a/addons/purchase/purchase_workflow.xml
+++ b/addons/purchase/purchase_workflow.xml
@@ -31,7 +31,7 @@
             <field name="name">cancel</field>
             <field name="kind">function</field>
             <field name="flow_stop">True</field>
-            <field name="action">write({'state':'cancel'})</field>
+            <field name="action">wkf_action_cancel()</field>
         </record>
         <record id="act_except_invoice" model="workflow.activity">
             <field name="wkf_id" ref="purchase_order"/>
-- 
GitLab