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()