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