diff --git a/CHANGELOG b/CHANGELOG
index f33d908152..b0e7cfa676 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Add return wizard
* Add employee on purchases for some states
* Add contact and invoice party on purchase
diff --git a/__init__.py b/__init__.py
index edc4272e47..fa5abbef51 100644
--- a/__init__.py
+++ b/__init__.py
@@ -36,6 +36,7 @@ def register():
stock.Location,
party.Party,
party.CustomerCode,
+ purchase.ReturnPurchaseStart,
module='purchase', type_='model')
Pool.register(
purchase.PurchaseReport,
@@ -47,4 +48,5 @@ def register():
party.PartyReplace,
party.PartyErase,
purchase.ModifyHeader,
+ purchase.ReturnPurchase,
module='purchase', type_='wizard')
diff --git a/purchase.py b/purchase.py
index 65afbe0eaa..4349df30d7 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1903,3 +1903,36 @@ class ModifyHeader(Wizard):
Line.save(purchase.lines)
return 'end'
+
+
+class ReturnPurchaseStart(ModelView):
+ "Return Purchase"
+ __name__ = 'purchase.return_purchase.start'
+
+
+class ReturnPurchase(Wizard):
+ "Return Purchase"
+ __name__ = 'purchase.return_purchase'
+ start = StateView('purchase.return_purchase.start',
+ 'purchase.return_purchase_start_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Return", 'return_', 'tryton-ok', default=True),
+ ])
+ return_ = StateAction('purchase.act_purchase_form')
+
+ def do_return_(self, action):
+ Purchase = Pool().get('purchase.purchase')
+
+ purchases = Purchase.browse(Transaction().context['active_ids'])
+ return_purchases = Purchase.copy(purchases)
+ for return_purchase, purchase in zip(return_purchases, purchases):
+ for line in return_purchase.lines:
+ if line.type == 'line':
+ line.quantity *= -1
+ return_purchase.lines = return_purchase.lines # Force saving
+ Purchase.save(return_purchases)
+
+ data = {'res_id': [s.id for s in return_purchases]}
+ if len(return_purchases) == 1:
+ action['views'].reverse()
+ return action, data
diff --git a/purchase.xml b/purchase.xml
index 27f30d3ccb..4fc7fd3fa3 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -515,6 +515,22 @@ this repository contains the full copyright notices and license terms. -->
template_tree
+
+ purchase.return_purchase.start
+ form
+ return_purchase_start_form
+
+
+ Return Purchase
+ purchase.return_purchase
+ purchase.purchase
+
+
+ form_action
+ purchase.purchase,-1
+
+
+
Parties associated to Purchases
purchase.open_supplier
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index 0bc22b7798..4dcd9deed8 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -122,4 +122,9 @@ def suite():
tearDown=doctest_teardown, encoding='utf-8',
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE,
checker=doctest_checker))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_purchase_return_wizard.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE,
+ checker=doctest_checker))
return suite