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