From 33427fd77fa109f2b4e4967d56c026f8174b666a Mon Sep 17 00:00:00 2001 From: clesgow Date: Thu, 16 Dec 2021 14:21:35 +0000 Subject: [PATCH] [ADD] delivery_stock_picking_batch: Add carrier & weight to autobatch Improves the auto-batcher, allowing it to also group by : - Carrier While adding a new restriction on the batch size as well : - Max weight per batch Task-2670580 Part-of: odoo/odoo#81533 --- .../delivery_stock_picking_batch/__init__.py | 4 ++ .../__manifest__.py | 21 ++++++++ .../models/__init__.py | 5 ++ .../models/stock_picking.py | 52 +++++++++++++++++++ .../models/stock_picking_batch.py | 16 ++++++ .../views/stock_picking_type_views.xml | 24 +++++++++ 6 files changed, 122 insertions(+) create mode 100644 addons/delivery_stock_picking_batch/__init__.py create mode 100644 addons/delivery_stock_picking_batch/__manifest__.py create mode 100644 addons/delivery_stock_picking_batch/models/__init__.py create mode 100644 addons/delivery_stock_picking_batch/models/stock_picking.py create mode 100644 addons/delivery_stock_picking_batch/models/stock_picking_batch.py create mode 100644 addons/delivery_stock_picking_batch/views/stock_picking_type_views.xml diff --git a/addons/delivery_stock_picking_batch/__init__.py b/addons/delivery_stock_picking_batch/__init__.py new file mode 100644 index 00000000000..dc5e6b693d1 --- /dev/null +++ b/addons/delivery_stock_picking_batch/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/addons/delivery_stock_picking_batch/__manifest__.py b/addons/delivery_stock_picking_batch/__manifest__.py new file mode 100644 index 00000000000..4e92b93b8a1 --- /dev/null +++ b/addons/delivery_stock_picking_batch/__manifest__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'Delivery Stock Picking Batch', + 'version': '1.0', + 'category': 'Hidden', + 'summary': 'Batch Transfer, Carrier', + 'description': """ +This module makes the link between the batch pickings and carrier applications. + +Allows to prepare batches depending on their carrier +""", + 'depends': ['delivery', 'stock_picking_batch'], + 'data': [ + 'views/stock_picking_type_views.xml', + ], + 'installable': True, + 'auto_install': True, + 'license': 'LGPL-3', +} diff --git a/addons/delivery_stock_picking_batch/models/__init__.py b/addons/delivery_stock_picking_batch/models/__init__.py new file mode 100644 index 00000000000..a5f3f55679c --- /dev/null +++ b/addons/delivery_stock_picking_batch/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import stock_picking +from . import stock_picking_batch diff --git a/addons/delivery_stock_picking_batch/models/stock_picking.py b/addons/delivery_stock_picking_batch/models/stock_picking.py new file mode 100644 index 00000000000..e73780b8e2f --- /dev/null +++ b/addons/delivery_stock_picking_batch/models/stock_picking.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models +from odoo.osv import expression + + +class StockPickingType(models.Model): + _inherit = "stock.picking.type" + + def _get_default_weight_uom(self): + return self.env['product.template']._get_weight_uom_name_from_ir_config_parameter() + + batch_group_by_carrier = fields.Boolean('Carrier', help="Automatically group batches by carriers") + batch_max_weight = fields.Integer("Maximum weight per batch", + help="A transfer will not be automatically added to batches that will exceed this weight if the transfer is added to it.\n" + "Leave this value as '0' if no weight limit.") + weight_uom_name = fields.Char(string='Weight unit of measure label', compute='_compute_weight_uom_name', readonly=True, default=_get_default_weight_uom) + + def _compute_weight_uom_name(self): + for picking_type in self: + picking_type.weight_uom_name = self.env['product.template']._get_weight_uom_name_from_ir_config_parameter() + + @api.model + def _get_batch_group_by_keys(self): + return super()._get_batch_group_by_keys() + ['batch_group_by_carrier'] + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + def _get_possible_pickings_domain(self): + domain = super()._get_possible_pickings_domain() + if self.picking_type_id.batch_group_by_carrier: + domain = expression.AND([domain, [('carrier_id', '=', self.carrier_id.id if self.carrier_id else False)]]) + + return domain + + def _get_possible_batches_domain(self): + domain = super()._get_possible_batches_domain() + if self.picking_type_id.batch_group_by_carrier: + domain = expression.AND([domain, [('picking_ids.carrier_id', '=', self.carrier_id.id if self.carrier_id else False)]]) + + return domain + + def _is_auto_batchable(self, picking=None): + """ Verifies if a picking can be put in a batch with another picking without violating auto_batch constrains. + """ + res = super()._is_auto_batchable(picking) + if self.picking_type_id.batch_max_weight: + res = res and (self.weight + picking.weight <= self.picking_type_id.batch_max_weight) + return res diff --git a/addons/delivery_stock_picking_batch/models/stock_picking_batch.py b/addons/delivery_stock_picking_batch/models/stock_picking_batch.py new file mode 100644 index 00000000000..c21e403fa20 --- /dev/null +++ b/addons/delivery_stock_picking_batch/models/stock_picking_batch.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + +class StockPickingBatch(models.Model): + _inherit = "stock.picking.batch" + + def _is_picking_auto_mergeable(self, picking): + """ Verifies if a picking can be safely inserted into the batch without violating auto_batch_constrains. + """ + res = super()._is_picking_auto_mergeable(picking) + if self.picking_type_id.batch_max_weight: + batch_weight = sum(self.picking_ids.mapped('weight')) + res = res and (batch_weight + picking.weight <= self.picking_type_id.batch_max_weight) + return res diff --git a/addons/delivery_stock_picking_batch/views/stock_picking_type_views.xml b/addons/delivery_stock_picking_batch/views/stock_picking_type_views.xml new file mode 100644 index 00000000000..b151d3aa69a --- /dev/null +++ b/addons/delivery_stock_picking_batch/views/stock_picking_type_views.xml @@ -0,0 +1,24 @@ + + + + stock.picking.type.form.inherit + stock.picking.type + + +
+ +
+ +
+
+ + +
+
+