diff --git a/addons/delivery/__init__.py b/addons/delivery/__init__.py index 81fc81d29c9..11529f98733 100644 --- a/addons/delivery/__init__.py +++ b/addons/delivery/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import models +import wizard diff --git a/addons/delivery/__manifest__.py b/addons/delivery/__manifest__.py index 06eccbb537b..4a3d32e9a1d 100644 --- a/addons/delivery/__manifest__.py +++ b/addons/delivery/__manifest__.py @@ -24,7 +24,7 @@ invoices from picking, the system is able to add and compute the shipping line. 'views/report_shipping.xml', 'views/report_deliveryslip.xml', 'views/sale_config_settings_views.xml', - + 'wizard/choose_delivery_package_views.xml', ], 'demo': ['data/delivery_demo.xml'], 'test': [ diff --git a/addons/delivery/models/stock_picking.py b/addons/delivery/models/stock_picking.py index 7d5257a5546..22bc35971db 100644 --- a/addons/delivery/models/stock_picking.py +++ b/addons/delivery/models/stock_picking.py @@ -31,17 +31,19 @@ class StockPackOperation(models.Model): @api.multi def manage_package_type(self): self.ensure_one() + view_id = self.env.ref('delivery.choose_delivery_package_view_form').id; return { 'name': _('Package Details'), 'type': 'ir.actions.act_window', 'view_mode': 'form', - 'res_model': 'stock.quant.package', - 'view_id': self.env.ref('delivery.view_quant_package_form_save').id, + 'res_model': 'choose.delivery.package', + 'view_id': view_id, + 'views': [(view_id, 'form')], 'target': 'new', - 'res_id': self.result_package_id.id, 'context': { + 'default_stock_quant_package_id': self.result_package_id.id, 'current_package_carrier_type': self.picking_id.carrier_id.delivery_type if self.picking_id.carrier_id.delivery_type not in ['base_on_rule', 'fixed'] else 'none', - }, + } } @@ -120,30 +122,18 @@ class StockPicking(models.Model): @api.multi def put_in_pack(self): - # TDE FIXME: work in batch, please - self.ensure_one() - package = super(StockPicking, self).put_in_pack() - - current_package_carrier_type = self.carrier_id.delivery_type if self.carrier_id.delivery_type not in ['base_on_rule', 'fixed'] else 'none' - count_packaging = self.env['product.packaging'].search_count([('package_carrier_type', '=', current_package_carrier_type)]) - if not count_packaging: - return False - # By default, sum the weights of all package operations contained in this package - pack_operation_ids = self.env['stock.pack.operation'].search([('result_package_id', '=', package.id)]) - package_weight = sum([x.qty_done * x.product_id.weight for x in pack_operation_ids]) - package.shipping_weight = package_weight - + view_id = self.env.ref('delivery.choose_delivery_package_view_form').id; return { 'name': _('Package Details'), 'type': 'ir.actions.act_window', 'view_mode': 'form', - 'res_model': 'stock.quant.package', - 'view_id': self.env.ref('delivery.view_quant_package_form_save').id, + 'res_model': 'choose.delivery.package', + 'view_id': view_id, + 'views': [(view_id, 'form')], 'target': 'new', - 'res_id': package.id, 'context': { - 'current_package_carrier_type': current_package_carrier_type, - }, + 'current_package_carrier_type': self.carrier_id.delivery_type if self.carrier_id.delivery_type not in ['base_on_rule', 'fixed'] else 'none', + } } @api.multi diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml index 4566d69f532..444892802ac 100644 --- a/addons/delivery/views/delivery_view.xml +++ b/addons/delivery/views/delivery_view.xml @@ -254,30 +254,6 @@ - - - stock.quant.package.form.save - stock.quant.package - - -
- - - - -
-
-
- - stock.move.form.weight stock.move diff --git a/addons/delivery/views/product_packaging_view.xml b/addons/delivery/views/product_packaging_view.xml index e4c0de6336d..0ef59bf946c 100644 --- a/addons/delivery/views/product_packaging_view.xml +++ b/addons/delivery/views/product_packaging_view.xml @@ -31,6 +31,7 @@ + diff --git a/addons/delivery/wizard/__init__.py b/addons/delivery/wizard/__init__.py new file mode 100644 index 00000000000..8abff5b3232 --- /dev/null +++ b/addons/delivery/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import choose_delivery_package diff --git a/addons/delivery/wizard/choose_delivery_package.py b/addons/delivery/wizard/choose_delivery_package.py new file mode 100644 index 00000000000..dd5d256f74a --- /dev/null +++ b/addons/delivery/wizard/choose_delivery_package.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ + + +class ChooseDeliveryPackage(models.TransientModel): + _name = 'choose.delivery.package' + _description = 'Delivery Package Selection Wizard' + + stock_quant_package_id = fields.Many2one( + 'stock.quant.package', + default=lambda self: self._default_stock_quant_package_id() + ) + delivery_packaging_id = fields.Many2one( + 'product.packaging', + default=lambda self: self._default_delivery_packaging_id() + ) + shipping_weight = fields.Float( + string='Shipping Weight', + default=lambda self: self._default_shipping_weight() + ) + + def _default_stock_quant_package_id(self): + if self.env.context.get('default_stock_quant_package_id'): + return self.env['stock.quant.package'].browse(self.env.context['stock_quant_package_id']) + + def _default_delivery_packaging_id(self): + res = None + if self.env.context.get('default_delivery_packaging_id'): + res = self.env['product.packaging'].browse(self.env.context['default_delivery_packaging_id']) + if self.env.context.get('default_stock_quant_package_id'): + stock_quant_package = self.env['stock.quant.package'].browse(self.env.context['default_stock_quant_package_id']) + res = stock_quant_package.packaging_id + return res + + def _default_shipping_weight(self): + if self.env.context.get('default_stock_quant_package_id'): + stock_quant_package = self.env['stock.quant.package'].browse(self.env.context['default_stock_quant_package_id']) + return stock_quant_package.shipping_weight + else: + picking_id = self.env['stock.picking'].browse(self.env.context['active_id']) + pack_operation_product_ids = [po for po in picking_id.pack_operation_product_ids if po.qty_done > 0 and not po.result_package_id] + pack_operation_pack_ids = [po for po in picking_id.pack_operation_pack_ids if po.qty_done > 0 and not po.result_package_id] + total_weight = sum([po.qty_done * po.product_id.weight for po in pack_operation_product_ids]) + sum([po.package_id.weight for po in pack_operation_pack_ids]) + return total_weight + + def put_in_pack(self): + picking_id = self.env['stock.picking'].browse(self.env.context['active_id']) + if not self.stock_quant_package_id: + stock_quant_package = picking_id._put_in_pack() + self.stock_quant_package_id = stock_quant_package + # write shipping weight and product_packaging on 'stock_quant_package' if needed + if self.delivery_packaging_id: + self.stock_quant_package_id.packaging_id = self.delivery_packaging_id + if self.shipping_weight: + self.stock_quant_package_id.shipping_weight = self.shipping_weight diff --git a/addons/delivery/wizard/choose_delivery_package_views.xml b/addons/delivery/wizard/choose_delivery_package_views.xml new file mode 100644 index 00000000000..eec5a4861f6 --- /dev/null +++ b/addons/delivery/wizard/choose_delivery_package_views.xml @@ -0,0 +1,24 @@ + + + + choose.delivery.package.form + choose.delivery.package + +
+ + + + +
+
+
+ +
diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index e5c03979b36..f683a7eac4d 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -987,7 +987,7 @@ class Picking(models.Model): return backorders @api.multi - def put_in_pack(self): + def _put_in_pack(self): # TDE FIXME: reclean me QuantPackage = self.env["stock.quant.package"] package = False @@ -1019,6 +1019,11 @@ class Picking(models.Model): raise UserError(_('Please process some quantities to put in the pack first!')) return package + + @api.multi + def put_in_pack(self): + return self._put_in_pack() + @api.multi def button_scrap(self): self.ensure_one()