packing wizard ready for test
This commit is contained in:
parent
f4deda70a3
commit
8daef2ae48
10 changed files with 275 additions and 0 deletions
4
bemade_packing_wizard/__init__.py
Normal file
4
bemade_packing_wizard/__init__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
from . import wizard
|
||||||
25
bemade_packing_wizard/__manifest__.py
Normal file
25
bemade_packing_wizard/__manifest__.py
Normal 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
|
||||||
|
}
|
||||||
5
bemade_packing_wizard/models/__init__.py
Normal file
5
bemade_packing_wizard/models/__init__.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import stock_quant_package
|
||||||
|
from . import delivery_carrier
|
||||||
|
|
||||||
11
bemade_packing_wizard/models/delivery_carrier.py
Normal file
11
bemade_packing_wizard/models/delivery_carrier.py
Normal 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)
|
||||||
88
bemade_packing_wizard/models/stock_quant_package.py
Normal file
88
bemade_packing_wizard/models/stock_quant_package.py
Normal 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
|
||||||
13
bemade_packing_wizard/views/delivery_carrier_views.xml
Normal file
13
bemade_packing_wizard/views/delivery_carrier_views.xml
Normal 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>
|
||||||
20
bemade_packing_wizard/views/stock_package_views.xml
Normal file
20
bemade_packing_wizard/views/stock_package_views.xml
Normal 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>
|
||||||
3
bemade_packing_wizard/wizard/__init__.py
Normal file
3
bemade_packing_wizard/wizard/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import choose_delivery_package
|
||||||
83
bemade_packing_wizard/wizard/choose_delivery_package.py
Normal file
83
bemade_packing_wizard/wizard/choose_delivery_package.py
Normal 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
|
||||||
|
|
@ -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>
|
||||||
Loading…
Reference in a new issue