88 lines
No EOL
3.2 KiB
Python
88 lines
No EOL
3.2 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):
|
|
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)])
|
|
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]
|
|
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_package_carrier_types(self):
|
|
return self.env['stock.package.type']._fields['package_carrier_type'].selection
|
|
|
|
|
|
def _get_provider(self):
|
|
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
|
|
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 package_type:
|
|
package_type = self.env['stock.package.type'].create({
|
|
'name': f'Box {vals["width"]}x{vals["height"]}x{vals["length"]}',
|
|
'width': vals['width'],
|
|
'height': vals['height'],
|
|
'packaging_length': vals['length'],
|
|
'package_carrier_type': self.provider
|
|
})
|
|
|
|
vals['package_type_id'] = package_type.id
|
|
|
|
res = super(StockQuantPackage, self).write(vals)
|
|
|
|
# check if length, width, height are changed
|
|
return res |