Odoo18-Base/addons/stock_fleet/models/stock_picking_batch.py

92 lines
4.2 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api
class StockPickingBatch(models.Model):
_inherit = 'stock.picking.batch'
vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle")
vehicle_category_id = fields.Many2one(
'fleet.vehicle.model.category', string="Vehicle Category",
compute='_compute_vehicle_category_id', store=True, readonly=False)
dock_id = fields.Many2one('stock.location', string="Dock Location", domain="[('warehouse_id', '=', warehouse_id), ('is_a_dock', '=', True)]",
compute='_compute_dock_id', store=True, readonly=False)
vehicle_weight_capacity = fields.Float(string="Vehcilce Payload Capacity",
related='vehicle_category_id.weight_capacity')
weight_uom_name = fields.Char(string='Weight unit of measure label', compute='_compute_weight_uom_name')
vehicle_volume_capacity = fields.Float(string="Max Volume (m³)",
related='vehicle_category_id.volume_capacity')
volume_uom_name = fields.Char(string='Volume unit of measure label', compute='_compute_volume_uom_name')
driver_id = fields.Many2one(
'res.partner', compute="_compute_driver_id", string="Driver", store=True, readonly=False)
used_weight_percentage = fields.Float(
string="Weight %", compute='_compute_capacity_percentage')
used_volume_percentage = fields.Float(
string="Volume %", compute='_compute_capacity_percentage')
end_date = fields.Datetime('End Date', default=fields.Datetime.now)
# Compute
@api.depends('vehicle_id')
def _compute_vehicle_category_id(self):
for rec in self:
rec.vehicle_category_id = rec.vehicle_id.category_id
@api.depends('picking_ids', 'picking_ids.location_id', 'picking_ids.location_dest_id')
def _compute_dock_id(self):
for batch in self:
if batch.picking_ids:
if len(batch.picking_ids.location_id) == 1 and batch.picking_ids.location_id.is_a_dock:
batch.dock_id = batch.picking_ids.location_id
def _compute_weight_uom_name(self):
self.weight_uom_name = self.env['product.template']._get_weight_uom_name_from_ir_config_parameter()
def _compute_volume_uom_name(self):
self.volume_uom_name = self.env['product.template']._get_volume_uom_name_from_ir_config_parameter()
@api.depends('vehicle_id')
def _compute_driver_id(self):
for rec in self:
rec.driver_id = rec.vehicle_id.driver_id
@api.depends('estimated_shipping_weight', 'vehicle_category_id.weight_capacity',
'estimated_shipping_volume', 'vehicle_category_id.volume_capacity')
def _compute_capacity_percentage(self):
self.used_weight_percentage = False
self.used_volume_percentage = False
for batch in self:
if batch.vehicle_weight_capacity:
batch.used_weight_percentage = 100 * (batch.estimated_shipping_weight / batch.vehicle_weight_capacity)
if batch.vehicle_volume_capacity:
batch.used_volume_percentage = 100 * (batch.estimated_shipping_volume / batch.vehicle_volume_capacity)
# CRUD
def create(self, vals_list):
batches = super().create(vals_list)
batches.order_on_zip()
batches.filtered(lambda b: b.dock_id)._set_moves_destination_to_dock()
return batches
def write(self, vals):
res = super().write(vals)
if 'dock_id' in vals:
self._set_moves_destination_to_dock()
return res
# Public actions
def order_on_zip(self):
sorted_records = self.picking_ids.sorted('zip')
for idx, record in enumerate(sorted_records):
record.batch_sequence = idx
# Private buisness logic
def _set_moves_destination_to_dock(self):
for batch in self:
if not batch.dock_id:
batch.picking_ids._reset_location()
elif batch.picking_type_id.code in ["internal", "incoming"]:
batch.picking_ids.move_ids.write({'location_dest_id': batch.dock_id.id})
else:
batch.picking_ids.move_ids.write({'location_id': batch.dock_id.id})