bemade-addons/bemade_packing_wizard/models/stock_quant_package.py
2025-05-29 21:35:47 -04:00

84 lines
No EOL
3.6 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class StockQuantPackage(models.Model):
_inherit = 'stock.quant.package'
length = fields.Float('Length')
width = fields.Float('Width')
height = fields.Float('Height')
carrier_id = fields.Many2one( comodel_name='delivery.carrier',
string='Carrier',
help="Carrier use to create package.",
compute='_compute_package_carrier' )
provider = fields.Selection( selection=lambda self: self._get_provider(),
string='Provider',
help="Provider to create package.",
compute='_compute_package_carrier' )
auto_create_package = fields.Boolean( string='Auto Create Package',
compute='_compute_auto_create_package' )
@api.depends('carrier_id')
def _compute_auto_create_package(self):
# Look so much like a related field
for record in self:
record.auto_create_package = record.carrier_id.auto_create_package if record.carrier_id else False
def _compute_package_carrier(self):
move_line = self.env['stock.move.line'].search([('result_package_id', '=', self.id)])
# This also look like a related field and might not even be needed as we only need it to get the provider
self.carrier_id = move_line.carrier_id
delivery_types_available = [item[0] for item in self.env['stock.package.type']._fields['package_carrier_type'].selection]
# This is a bit of a hack to get the provider from the carrier_id, depending if carrier is integrated or not
if self.carrier_id.delivery_type not in delivery_types_available:
self.provider = False
else:
self.provider = move_line.carrier_id.delivery_type
def _get_provider(self):
# just cloning the selection from stock.package.type tru a lambda function
return self.env['stock.package.type']._fields['package_carrier_type'].selection
def write(self, vals):
if 'length' in vals and 'width' in vals and 'height' in vals:
# check if length, width, height are greater than 0
if vals['length'] <= 0 or vals['width'] <= 0 or vals['height'] <= 0:
raise ValidationError('Length, width, and height must be greater than 0.')
# Make sure length is always greater than width, otherwise swap them
if vals['length'] < vals['width']:
vals['length'], vals['width'] = vals['width'], vals['length']
# check if existing package_type exists
package_type = self.env['stock.package.type'].search([
('width', '=', vals['width']),
('height', '=', vals['height']),
('packaging_length', '=', vals['length']),
('package_carrier_type', '=', self.provider)
], limit=1)
# if not, create new package_type
if not package_type:
package_type = self.env['stock.package.type'].create({
'name': f'Box {vals["length"]}x{vals["width"]}x{vals["height"]}',
'width': vals['width'],
'height': vals['height'],
'packaging_length': vals['length'],
'package_carrier_type': self.provider
})
# update package_type_id
vals['package_type_id'] = package_type.id
res = super(StockQuantPackage, self).write(vals)
return res