mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[IMP] delivery_purolator: add multi-rating for pickings and packages
H10820
This commit is contained in:
committed by
Jared Kipe
parent
b63d2b0436
commit
0bd0fc924e
@@ -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,
|
||||
|
||||
12
delivery_purolator/data/delivery_purolator_data.xml
Normal file
12
delivery_purolator/data/delivery_purolator_data.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
from . import delivery_purolator
|
||||
from . import stock_package_type
|
||||
|
||||
@@ -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,
|
||||
|
||||
7
delivery_purolator/models/stock_package_type.py
Normal file
7
delivery_purolator/models/stock_package_type.py
Normal 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')])
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user