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 + + +
+ +
+ +
+
+ + +
+
+