diff --git a/beesdoo_base/__openerp__.py b/beesdoo_base/__openerp__.py
index 8753643..8aa1bb4 100644
--- a/beesdoo_base/__openerp__.py
+++ b/beesdoo_base/__openerp__.py
@@ -20,6 +20,7 @@
'data': [
'security/groups.xml',
'security/ir.model.access.csv',
+ 'data/cron.xml',
'views/partner.xml',
'wizard/views/member_card.xml',
'wizard/views/partner.xml',
diff --git a/beesdoo_base/data/cron.xml b/beesdoo_base/data/cron.xml
new file mode 100644
index 0000000..21a895c
--- /dev/null
+++ b/beesdoo_base/data/cron.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ Procurement: cleanup procurement orders blocking the procurement rules
+
+
+ 1
+ days
+ -1
+
+ procurement.order
+ cron_cleanup_procurement_order
+ ()
+
+
+
diff --git a/beesdoo_base/models/__init__.py b/beesdoo_base/models/__init__.py
index f95b336..acd14bf 100644
--- a/beesdoo_base/models/__init__.py
+++ b/beesdoo_base/models/__init__.py
@@ -1 +1,3 @@
-import partner, membercard
\ No newline at end of file
+from . import partner
+from . import membercard
+from . import procurement
diff --git a/beesdoo_base/models/procurement.py b/beesdoo_base/models/procurement.py
new file mode 100644
index 0000000..b1c63de
--- /dev/null
+++ b/beesdoo_base/models/procurement.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Coop IT Easy SCRL fs
+# Robin Keunen
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, fields, api
+import logging
+_logger = logging.getLogger(__name__)
+
+
+class ProcurementOrder(models.Model):
+ _inherit = "procurement.order"
+
+ @api.model
+ def cron_cleanup_procurement_order(self):
+ running_procurement = self.env["procurement.order"].search(
+ [("state", "=", "running")]
+ )
+
+ # checks if procurement order is done
+ # -> if all moves are 'done' or 'cancel'
+ _logger.info("check procurements in running state.")
+ running_procurement.check()
+
+ # in remaining procurement, cancel those with no procurement order
+ unlinked_procurement = self.env["procurement.order"].search(
+ [("state", "=", "running"),
+ ("purchase_line_id", "=", False)]
+ )
+ _logger.info("cancelling %s procurement unlinked from PO." % len(unlinked_procurement))
+ unlinked_procurement.cancel()
+
+ # in remaining procurement, delete those from 'done' purchase order
+ procurement_linked_to_done_PO = self.env["procurement.order"].search(
+ [("state", "=", "running"),
+ ("purchase_line_id", "!=", False),
+ ("purchase_line_id.order_id.state", "=", "done")]
+ )
+ _logger.info("set %s procurement to done (linked to done PO)" % len(procurement_linked_to_done_PO))
+ procurement_linked_to_done_PO.write({"state": "done"})
+
+ # cancel procurement order from exceptions
+ exception_procurement = self.env["procurement.order"].search(
+ [("state", "=", "exception"),
+ ("purchase_line_id", "=", False)]
+ )
+ _logger.info("cancelling %s procurement in exception" % len(exception_procurement))
+ exception_procurement.cancel()