odoo-modules/odoo-bringout-ventor-outgoing_routing/outgoing_routing/models/stock_picking.py
2025-08-29 15:49:21 +02:00

81 lines
2.7 KiB
Python

# Copyright 2020 VentorTech OU
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0).
from odoo import http
from odoo import models, fields, api, _
import functools
class StockPicking(models.Model):
_name = 'stock.picking'
_inherit = ['stock.picking', 'stock.picking.mixin']
operations_to_pick = fields.Many2many(
'stock.move.line', relation='picking_operations_to_pick',
string='Operations to Pick',
compute='_compute_operations_to_pick', store=False)
strategy_order_r = fields.Char(
string='Strategy Order',
compute='_compute_operations_to_pick',
store=False,
)
@api.depends(
'move_line_ids',
'move_line_ids.location_id',
'move_line_ids.qty_done',
)
def _compute_operations_to_pick(self):
"""
"""
strategy = self.env.user.company_id.outgoing_routing_strategy
strategy_order = self.env.user.company_id.outgoing_routing_order
for rec in self:
all_operations = self.env['stock.move.line'].search([
('picking_id', '=', rec.id),
])
rec.strategy_order_r = rec.get_strategy_string(strategy, strategy_order)
rec.operations_to_pick = rec.sort_operations(all_operations, strategy, strategy_order)
def sort_printer_picking_list(self, move_line_ids):
""" sort list of pack operations by configured field
"""
strategy = self.env.user.company_id.outgoing_routing_strategy
strategy_order = self.env.user.company_id.outgoing_routing_order
return self.sort_operations(move_line_ids, strategy, strategy_order)
def get_strategy_string(self, strategy, strategy_order):
"""
"""
settings = self.env['res.company'].fields_get([
'outgoing_routing_strategy',
'outgoing_routing_order',
])
strategies = settings['outgoing_routing_strategy']['selection']
orders = settings['outgoing_routing_order']['selection']
result = _('Hint: operations are sorted by {} in {} order.').format(
dict(strategies)[strategy].lower(),
dict(orders)[strategy_order].lower()
)
return result
def sort_operations(self, all_operations, strategy, strategy_order):
"""
"""
def _r_getattr(obj, attr, *args):
return functools.reduce(getattr, [obj] + attr.split('.'))
validated_operations = all_operations.filtered(lambda op: op._compute_operation_valid())
result = validated_operations.sorted(
key=lambda op: _r_getattr(op, strategy, 'None'),
reverse=int(strategy_order)
)
return result