From 0bd0fc924e9b61eeb7bdd6bbc49f9a5970970ae1 Mon Sep 17 00:00:00 2001 From: Cedric Collins Date: Thu, 1 Sep 2022 17:22:05 -0500 Subject: [PATCH] [IMP] delivery_purolator: add multi-rating for pickings and packages H10820 --- delivery_purolator/__manifest__.py | 1 + .../data/delivery_purolator_data.xml | 12 ++++++ .../data/delivery_purolator_demo.xml | 2 + delivery_purolator/models/__init__.py | 1 + .../models/delivery_purolator.py | 30 +++++++++++--- .../models/stock_package_type.py | 7 ++++ delivery_purolator/tests/test_purolator.py | 39 +++++++++++++++++++ .../views/delivery_purolator_views.xml | 1 + 8 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 delivery_purolator/data/delivery_purolator_data.xml create mode 100644 delivery_purolator/models/stock_package_type.py diff --git a/delivery_purolator/__manifest__.py b/delivery_purolator/__manifest__.py index b3c7394e..cc305e42 100644 --- a/delivery_purolator/__manifest__.py +++ b/delivery_purolator/__manifest__.py @@ -21,6 +21,7 @@ Purolator Shipping 'data/delivery_purolator_demo.xml', ], 'data': [ + 'data/delivery_purolator_data.xml', 'views/delivery_purolator_views.xml', ], 'auto_install': False, diff --git a/delivery_purolator/data/delivery_purolator_data.xml b/delivery_purolator/data/delivery_purolator_data.xml new file mode 100644 index 00000000..503d26de --- /dev/null +++ b/delivery_purolator/data/delivery_purolator_data.xml @@ -0,0 +1,12 @@ + + + + + + Purolator Customer Packaging + CustomerPackaging + purolator + + + + diff --git a/delivery_purolator/data/delivery_purolator_demo.xml b/delivery_purolator/data/delivery_purolator_demo.xml index a8746dc8..2527e7cd 100644 --- a/delivery_purolator/data/delivery_purolator_demo.xml +++ b/delivery_purolator/data/delivery_purolator_demo.xml @@ -20,6 +20,7 @@ purolator PurolatorExpress + @@ -38,6 +39,7 @@ purolator PurolatorGround + diff --git a/delivery_purolator/models/__init__.py b/delivery_purolator/models/__init__.py index ab7a929c..8a30199b 100644 --- a/delivery_purolator/models/__init__.py +++ b/delivery_purolator/models/__init__.py @@ -1 +1,2 @@ from . import delivery_purolator +from . import stock_package_type diff --git a/delivery_purolator/models/delivery_purolator.py b/delivery_purolator/models/delivery_purolator.py index a18c63f1..f6fa16b4 100644 --- a/delivery_purolator/models/delivery_purolator.py +++ b/delivery_purolator/models/delivery_purolator.py @@ -1,7 +1,6 @@ from odoo import fields, models, _ from .purolator_services import PurolatorClient import logging -_logger = logging.getLogger(__name__) PUROLATOR_SERVICES = [ @@ -80,6 +79,7 @@ class ProviderPurolator(models.Model): purolator_account_number = fields.Char(string='Purolator Account Number', groups='base.group_system') purolator_service_type = fields.Selection(selection=PUROLATOR_SERVICES, default='PurolatorGround') + purolator_default_package_type_id = fields.Many2one('stock.package.type', string="Purolator Package Type") def purolator_rate_shipment(self, order): # sudoself = self.sudo() @@ -100,8 +100,12 @@ class ProviderPurolator(models.Model): self.purolator_account_number, self.prod_environment, ) - res = client.get_quick_estimate(sender.zip, receiver_address, 'CustomerPackaging', weight) - _logger.warning('get_quick_estimate: %s', res) + res = client.get_quick_estimate( + sender.zip, + receiver_address, + self.purolator_default_package_type_id.shipper_package_code, + weight, + ) if res['error']: return { 'success': False, @@ -125,6 +129,15 @@ class ProviderPurolator(models.Model): } def purolator_rate_shipment_multi(self, order=None, picking=None, packages=None): + if not packages: + return self._purolator_rate_shipment_multi_package(order=order, picking=picking) + else: + rates = [] + for package in packages: + rates += self._purolator_rate_shipment_multi_package(order=order, picking=picking, package=package) + return rates + + def _purolator_rate_shipment_multi_package(self, order=None, picking=None, package=None): sender = self.get_shipper_warehouse(order=order, picking=picking) receiver = self.get_recipient(order=order, picking=picking) receiver_address = { @@ -139,10 +152,15 @@ class ProviderPurolator(models.Model): if self.env.context.get('date_planned'): date_planned = self.env.context.get('date_planned') + package_code = self.purolator_default_package_type_id.shipper_package_code if order: weight = weight_uom_id._compute_quantity(order._get_estimated_weight(), self.env.ref('uom.product_uom_lb'), round=False) else: - raise NotImplementedError + if package: + weight = package.shipping_weight + package_code = package.package_type_id.shipper_package_code or package_code + else: + weight = picking.shipping_weight or picking.weight client = PurolatorClient( self.purolator_api_key, self.purolator_password, @@ -150,7 +168,7 @@ class ProviderPurolator(models.Model): self.purolator_account_number, self.prod_environment, ) - res = client.get_quick_estimate(sender.zip, receiver_address, 'CustomerPackaging', weight) + res = client.get_quick_estimate(sender.zip, receiver_address, package_code, weight) if res['error']: return [{'carrier': self, 'success': False, @@ -165,7 +183,7 @@ class ProviderPurolator(models.Model): price = shipment['TotalPrice'] rates.append({ 'carrier': carrier, - # 'package': package or self.env['stock.quant.package'].browse(), + 'package': package or self.env['stock.quant.package'].browse(), 'success': True, 'price': price, 'error_message': False, diff --git a/delivery_purolator/models/stock_package_type.py b/delivery_purolator/models/stock_package_type.py new file mode 100644 index 00000000..868e16fc --- /dev/null +++ b/delivery_purolator/models/stock_package_type.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class PackageType(models.Model): + _inherit = 'stock.package.type' + + package_carrier_type = fields.Selection(selection_add=[('purolator', 'Purolator')]) diff --git a/delivery_purolator/tests/test_purolator.py b/delivery_purolator/tests/test_purolator.py index 2febb852..844849d2 100644 --- a/delivery_purolator/tests/test_purolator.py +++ b/delivery_purolator/tests/test_purolator.py @@ -28,6 +28,9 @@ class TestPurolator(TransactionCase): 'zip': 'V5C5A9', }) self.storage_box = self.env.ref('product.product_product_6') + self.storage_box.weight = 1.5 # Something more reasonable + # Make some available + self.env['stock.quant']._update_available_quantity(self.storage_box, self.shipper_warehouse.lot_stock_id, 100) self.sale_order = self.env['sale.order'].create({ 'partner_id': self.receiver_partner.id, 'warehouse_id': self.shipper_warehouse.id, @@ -55,5 +58,41 @@ class TestPurolator(TransactionCase): carrier_express = self.env.ref('delivery_purolator.purolator_ground') rate_express = list(filter(lambda r: r['carrier'] == carrier_express, rates)) rate_express = rate_express and rate_express[0] + self.assertFalse(rate_express['error_message']) self.assertGreater(rate_express['price'], 0.0) self.assertGreater(rate_express['transit_days'], 0) + self.assertEqual(rate_express['package'], self.env['stock.quant.package'].browse()) + + # Multi-rating with picking + self.sale_order.action_confirm() + picking = self.sale_order.picking_ids + self.assertEqual(len(picking), 1) + rates = self.carrier.rate_shipment_multi(picking=picking) + rate_express = list(filter(lambda r: r['carrier'] == carrier_express, rates)) + rate_express = rate_express and rate_express[0] + self.assertFalse(rate_express['error_message']) + self.assertGreater(rate_express['price'], 0.0) + self.assertGreater(rate_express['transit_days'], 0) + self.assertEqual(rate_express['package'], self.env['stock.quant.package'].browse()) + + # Multi-rate package + picking.carrier_id = self.carrier + self.assertEqual(picking.move_lines.reserved_availability, 3.0) + picking.move_line_ids.qty_done = 1.0 + context = dict( + current_package_carrier_type=picking.carrier_id.delivery_type, + default_picking_id=picking.id + ) + choose_package_wizard = self.env['choose.delivery.package'].with_context(context).create({}) + self.assertEqual(choose_package_wizard.shipping_weight, 1.5) + choose_package_wizard.action_put_in_pack() + package = picking.move_line_ids.mapped('result_package_id') + self.assertEqual(len(package), 1) + + rates = self.carrier.rate_shipment_multi(picking=picking, packages=package) + rate_express = list(filter(lambda r: r['carrier'] == carrier_express, rates)) + rate_express = rate_express and rate_express[0] + self.assertFalse(rate_express['error_message']) + self.assertGreater(rate_express['price'], 0.0) + self.assertGreater(rate_express['transit_days'], 0) + self.assertEqual(rate_express['package'], package) diff --git a/delivery_purolator/views/delivery_purolator_views.xml b/delivery_purolator/views/delivery_purolator_views.xml index fd57bea5..695f56dd 100644 --- a/delivery_purolator/views/delivery_purolator_views.xml +++ b/delivery_purolator/views/delivery_purolator_views.xml @@ -15,6 +15,7 @@ +