[IMP] delivery_purolator: add multi-rating for pickings and packages

H10820
This commit is contained in:
Cedric Collins
2022-09-01 17:22:05 -05:00
committed by Jared Kipe
parent b63d2b0436
commit 0bd0fc924e
8 changed files with 87 additions and 6 deletions

View File

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

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="purolator_packaging_CustomerPackaging" model="stock.package.type">
<field name="name">Purolator Customer Packaging</field>
<field name="shipper_package_code">CustomerPackaging</field>
<field name="package_carrier_type">purolator</field>
</record>
</data>
</odoo>

View File

@@ -20,6 +20,7 @@
<field name="delivery_type">purolator</field>
<field name="purolator_service_type">PurolatorExpress</field>
<field name="prod_environment" eval="False"/>
<field name="purolator_default_package_type_id" ref="delivery_purolator.purolator_packaging_CustomerPackaging"/>
</record>
<record id="product_product_purolator_ground" model="product.product">
@@ -38,6 +39,7 @@
<field name="delivery_type">purolator</field>
<field name="purolator_service_type">PurolatorGround</field>
<field name="prod_environment" eval="False"/>
<field name="purolator_default_package_type_id" ref="delivery_purolator.purolator_packaging_CustomerPackaging"/>
</record>
</data>

View File

@@ -1 +1,2 @@
from . import delivery_purolator
from . import stock_package_type

View File

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

View File

@@ -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')])

View File

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

View File

@@ -15,6 +15,7 @@
<field name="purolator_activation_key" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
<field name="purolator_account_number" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
<field name="purolator_service_type" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
<field name="purolator_default_package_type_id" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
</group>
</group>
</page>