oca-technical/odoo-bringout-oca-ddmrp-stock_buffer_route/stock_buffer_route/models/stock_buffer.py
2025-08-29 15:43:03 +02:00

69 lines
2.3 KiB
Python

# Copyright 2019-20 ForgeFlow S.L. (https://www.forgeflow.com)
# Copyright 2019-20 Camptocamp SA
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import api, fields, models
class StockBuffer(models.Model):
_inherit = "stock.buffer"
route_ids = fields.Many2many(
"stock.route",
string="Allowed routes",
compute="_compute_route_ids",
)
route_id = fields.Many2one(
"stock.route",
string="Route",
domain="[('id', 'in', route_ids)]",
ondelete="restrict",
)
@api.depends("product_id", "warehouse_id", "warehouse_id.route_ids", "location_id")
def _compute_route_ids(self):
route_obj = self.env["stock.route"]
for record in self:
wh_routes = record.warehouse_id.route_ids
routes = route_obj.browse()
if record.product_id:
routes += record.product_id.mapped(
"route_ids"
) | record.product_id.mapped("categ_id").mapped("total_route_ids")
if record.warehouse_id:
routes |= wh_routes
parents = record.get_parents()
record.route_ids = self._get_location_routes_of_parents(routes, parents)
def _get_location_routes_of_parents(self, routes, parents):
return routes.filtered(
lambda route: (
# at least one rule of the route must have a destination location
# reaching the buffer
route.rule_ids.filtered(lambda rule: rule.action != "push").mapped(
"location_dest_id"
)
& parents
)
or any(rule.action == "buy" for rule in route.rule_ids)
)
def get_parents(self):
location = self.location_id
result = location
while location.location_id:
location = location.location_id
result |= location
return result
def _values_source_location_from_route(self):
values = super()._values_source_location_from_route()
if self.route_id:
values["route_ids"] = self.route_id
return values
def write(self, vals):
res = super().write(vals)
if "route_id" in vals:
self._calc_distributed_source_location()
return res