mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
77 lines
2.8 KiB
Python
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
|