packing wizard ready for test

This commit is contained in:
Benoît Vézina 2023-09-27 15:06:52 -04:00
parent f4deda70a3
commit 8daef2ae48
10 changed files with 275 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import models
from . import wizard

View file

@ -0,0 +1,25 @@
{
'name': 'Packing wizard',
'version': '15.0.1.0.0',
'category': 'Extra Tools',
'summary': 'Allow automated packing type creation',
'description': """
This module allows users simply enter all the package dimensions on every packing and it will create the packing
type automatically if it not exists, use it the create the package with the weight and related package type.
You need to activate the auto create package feature on the delivery carrier to use this feature.
""",
'depends': [
'delivery'
],
'data': [
'views/stock_package_views.xml',
'views/delivery_carrier_views.xml',
'wizard/choose_delivery_package_views.xml',
],
'license': 'AGPL-3',
'author': 'Bemade',
'website': 'https://bemade.org/',
'installable': True,
'auto_install': False
}

View file

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import stock_quant_package
from . import delivery_carrier

View file

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class DeliveryCarrier(models.Model):
_inherit = 'delivery.carrier'
# this allow us to enable the auto create package feature per delivery.carrier
# default is False to avoid impacting Odoo's default behavior on Test
auto_create_package = fields.Boolean('Auto Create Package', default=False)

View file

@ -0,0 +1,88 @@
# -*- 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

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_delivery_carrier_form_auto_package" model="ir.ui.view">
<field name="name">Auto package configuration</field>
<field name="model">delivery.carrier</field>
<field name="inherit_id" ref="delivery.view_delivery_carrier_form"/>
<field name="arch" type="xml">
<field name="product_id" position="after">
<field name="auto_create_package"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_quant_package_form_size" model="ir.ui.view">
<field name="name">stock.view_quant_package_form_size</field>
<field name="model">stock.quant.package</field>
<field name="inherit_id" ref="stock.view_quant_package_form"/>
<field name="arch" type="xml">
<field name="package_type_id" position="replace">
<field name="auto_create_package" attrs="{'invisible': 1}"/>
<field name="package_type_id"
attrs="{'invisible': [('package_type_id', '=', False),('auto_create_package', '=', True)]}"/>
<field name="carrier_id" attrs="{'invisible': 1}"/>
<field name="provider" attrs="{'invisible': 1}"/>
<field name="length" attrs="{'invisible': ['|', ('package_type_id', '!=', False), ('auto_create_package', '!=', True)]}"/>
<field name="width" attrs="{'invisible': ['|', ('package_type_id', '!=', False), ('auto_create_package', '!=', True)]}"/>
<field name="height" attrs="{'invisible': ['|', ('package_type_id', '!=', False), ('auto_create_package', '!=', True)]}"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import choose_delivery_package

View file

@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from math import ceil
from odoo.exceptions import ValidationError
class ChooseDeliveryPackage(models.TransientModel):
_inherit = 'choose.delivery.package'
length = fields.Float('Length')
width = fields.Float('Width')
height = fields.Float('Height')
auto_create_package = fields.Boolean(
string='Auto Create Package',
)
provider = fields.Selection(
selection=lambda self: self._get_provider(),
string='Provider',
help="Provider to create package.",
)
@api.model
def default_get(self, fields_list):
defaults = super().default_get(fields_list)
if 'provider' in fields_list:
picking = self.env['stock.picking'].browse(defaults.get('picking_id'))
delivery_types_available = [item[0] for item in self.env['stock.package.type']._fields['package_carrier_type'].selection]
if picking.carrier_id.delivery_type not in delivery_types_available:
defaults['provider'] = False
defaults['auto_create_package'] = False
else:
defaults['provider'] = picking.carrier_id.delivery_type
defaults['auto_create_package'] = picking.carrier_id.auto_create_package
return defaults
def _get_provider(self):
return self.env['stock.package.type']._fields['package_carrier_type'].selection
# 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_provider(self):
# move_line = self.env['stock.move.line'].search([('result_package_id', '=', self.id)])
# delivery_types_available = [item[0] for item in self.env['stock.package.type']._fields['package_carrier_type'].selection]
# if self.picking_id.carrier_id.delivery_type not in delivery_types_available:
# self.provider = False
# else:
# self.provider = move_line.carrier_id.delivery_type
#
def action_put_in_pack(self):
if self.auto_create_package:
if self.width <= 0 or self.height <= 0 or self.length <= 0:
raise ValidationError('Length, width, and height must be greater than 0.')
if self.length < self.width:
self.length, self.width = self.width, self.length
delivery_package_type = self.env['stock.package.type'].search([
('width', '=', self.width),
('height', '=', self.height),
('packaging_length', '=', self.length),
('package_carrier_type', '=', self.provider)
], limit=1)
if not delivery_package_type:
delivery_package_type = delivery_package_type.create({
'name': f'Box {vals["width"]}x{vals["height"]}x{vals["length"]}',
'width': self.width,
'height': self.height,
'packaging_length': self.length,
'package_carrier_type': self.provider
})
self.delivery_package_type_id = delivery_package_type.id
result = super().action_put_in_pack()
return result

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="choose_delivery_package_view_form2" model="ir.ui.view">
<field name="name">choose.delivery.package.form2</field>
<field name="model">choose.delivery.package</field>
<field name="inherit_id" ref="delivery.choose_delivery_package_view_form"/>
<field name="arch" type="xml">
<field name="delivery_package_type_id" position="replace">
<field name="auto_create_package" attrs="{'invisible': 1}"/>
<field name="delivery_package_type_id"
domain="[('package_carrier_type', '=', context.get('current_package_carrier_type', 'none'))]"
context="{'form_view_ref':'stock.stock_package_type_form'}"
attrs="{'invisible': [('auto_create_package', '=', True)]}"
/>
<field name="length" attrs="{'invisible': [('auto_create_package', '=', False)]}"/>
<field name="width" attrs="{'invisible': [('auto_create_package', '=', False)]}"/>
<field name="height" attrs="{'invisible': [('auto_create_package', '=', False)]}"/>
<field name="provider" attrs="{'invisible': 1}"/>
</field>
</field>
</record>
</odoo>