Files
2023-07-24 13:44:53 +02:00

77 lines
2.8 KiB
Python

# Copyright 2023 ForgeFlow S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
import logging
from collections import defaultdict
from odoo import _, api, fields
from odoo.exceptions import UserError
from odoo.addons.stock.models.stock_rule import ProcurementException, ProcurementGroup
_logger = logging.getLogger(__name__)
def post_load_hook():
# Changes done to the original method are highlighted with the comments
# "START/END OF CHANGES"
@api.model
def run_new(self, procurements, raise_user_error=True):
def raise_exception(procurement_errors):
if raise_user_error:
dummy, errors = zip(*procurement_errors)
raise UserError("\n".join(errors))
else:
raise ProcurementException(procurement_errors)
actions_to_run = defaultdict(list)
procurement_errors = []
for procurement in procurements:
procurement.values.setdefault(
"company_id", procurement.location_id.company_id
)
procurement.values.setdefault("priority", "0")
procurement.values.setdefault("date_planned", fields.Datetime.now())
# START OF CHANGES
if self._skip_procurement(procurement):
# END OF CHANGES
continue
rule = self._get_rule(
procurement.product_id, procurement.location_id, procurement.values
)
if not rule:
error = _(
'No rule has been found to replenish "%s" in "%s".\n'
"Verify the routes configuration on the product."
) % (
procurement.product_id.display_name,
procurement.location_id.display_name,
)
procurement_errors.append((procurement, error))
else:
action = "pull" if rule.action == "pull_push" else rule.action
actions_to_run[action].append((procurement, rule))
if procurement_errors:
raise_exception(procurement_errors)
for action, procurements in actions_to_run.items():
if hasattr(self.env["stock.rule"], "_run_%s" % action):
try:
getattr(self.env["stock.rule"], "_run_%s" % action)(procurements)
except ProcurementException as e:
procurement_errors += e.procurement_exceptions
else:
_logger.error(
"The method _run_%s doesn't exist on the procurement rules" % action
)
if procurement_errors:
raise_exception(procurement_errors)
return True
if not hasattr(ProcurementGroup, "run_original"):
ProcurementGroup.run_original = ProcurementGroup.run
ProcurementGroup.run = run_new