bemade-addons/bemade_packing_wizard/models/stock_quant_package.py

84 lines
3.6 KiB
Python
Raw Normal View History

2023-09-27 15:06:52 -04:00
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
2023-09-28 08:13:46 -04:00
2023-09-27 15:06:52 -04:00
class StockQuantPackage(models.Model):
2023-09-28 08:13:46 -04:00
2023-09-27 15:06:52 -04:00
_inherit = 'stock.quant.package'
length = fields.Float('Length')
width = fields.Float('Width')
height = fields.Float('Height')
2023-09-28 08:13:46 -04:00
carrier_id = fields.Many2one( comodel_name='delivery.carrier',
string='Carrier',
help="Carrier use to create package.",
compute='_compute_package_carrier' )
2023-09-27 15:06:52 -04:00
2023-09-28 08:13:46 -04:00
provider = fields.Selection( selection=lambda self: self._get_provider(),
string='Provider',
help="Provider to create package.",
compute='_compute_package_carrier' )
2023-09-27 15:06:52 -04:00
2023-09-28 08:13:46 -04:00
auto_create_package = fields.Boolean( string='Auto Create Package',
compute='_compute_auto_create_package' )
2023-09-27 15:06:52 -04:00
@api.depends('carrier_id')
def _compute_auto_create_package(self):
2023-09-28 08:13:46 -04:00
# Look so much like a related field
2023-09-27 15:06:52 -04:00
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)])
2023-09-28 08:13:46 -04:00
# This also look like a related field and might not even be needed as we only need it to get the provider
2023-09-27 15:06:52 -04:00
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]
2023-09-28 08:13:46 -04:00
# This is a bit of a hack to get the provider from the carrier_id, depending if carrier is integrated or not
2023-09-27 15:06:52 -04:00
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):
2023-09-28 08:13:46 -04:00
# just cloning the selection from stock.package.type tru a lambda function
2023-09-27 15:06:52 -04:00
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.')
2023-09-28 08:13:46 -04:00
# Make sure length is always greater than width, otherwise swap them
2023-09-27 15:06:52 -04:00
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)
2023-09-28 08:13:46 -04:00
# if not, create new package_type
2023-09-27 15:06:52 -04:00
if not package_type:
package_type = self.env['stock.package.type'].create({
2023-09-28 08:13:46 -04:00
'name': f'Box {vals["length"]}x{vals["width"]}x{vals["height"]}',
2023-09-27 15:06:52 -04:00
'width': vals['width'],
'height': vals['height'],
'packaging_length': vals['length'],
'package_carrier_type': self.provider
})
2023-09-28 08:13:46 -04:00
# update package_type_id
2023-09-27 15:06:52 -04:00
vals['package_type_id'] = package_type.id
res = super(StockQuantPackage, self).write(vals)
return res