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/delivery_purolator_demo.xml',
|
||||||
],
|
],
|
||||||
'data': [
|
'data': [
|
||||||
|
'data/delivery_purolator_data.xml',
|
||||||
'views/delivery_purolator_views.xml',
|
'views/delivery_purolator_views.xml',
|
||||||
],
|
],
|
||||||
'auto_install': False,
|
'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="delivery_type">purolator</field>
|
||||||
<field name="purolator_service_type">PurolatorExpress</field>
|
<field name="purolator_service_type">PurolatorExpress</field>
|
||||||
<field name="prod_environment" eval="False"/>
|
<field name="prod_environment" eval="False"/>
|
||||||
|
<field name="purolator_default_package_type_id" ref="delivery_purolator.purolator_packaging_CustomerPackaging"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="product_product_purolator_ground" model="product.product">
|
<record id="product_product_purolator_ground" model="product.product">
|
||||||
@@ -38,6 +39,7 @@
|
|||||||
<field name="delivery_type">purolator</field>
|
<field name="delivery_type">purolator</field>
|
||||||
<field name="purolator_service_type">PurolatorGround</field>
|
<field name="purolator_service_type">PurolatorGround</field>
|
||||||
<field name="prod_environment" eval="False"/>
|
<field name="prod_environment" eval="False"/>
|
||||||
|
<field name="purolator_default_package_type_id" ref="delivery_purolator.purolator_packaging_CustomerPackaging"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
from . import delivery_purolator
|
from . import delivery_purolator
|
||||||
|
from . import stock_package_type
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from odoo import fields, models, _
|
from odoo import fields, models, _
|
||||||
from .purolator_services import PurolatorClient
|
from .purolator_services import PurolatorClient
|
||||||
import logging
|
import logging
|
||||||
_logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
PUROLATOR_SERVICES = [
|
PUROLATOR_SERVICES = [
|
||||||
@@ -80,6 +79,7 @@ class ProviderPurolator(models.Model):
|
|||||||
purolator_account_number = fields.Char(string='Purolator Account Number', groups='base.group_system')
|
purolator_account_number = fields.Char(string='Purolator Account Number', groups='base.group_system')
|
||||||
purolator_service_type = fields.Selection(selection=PUROLATOR_SERVICES,
|
purolator_service_type = fields.Selection(selection=PUROLATOR_SERVICES,
|
||||||
default='PurolatorGround')
|
default='PurolatorGround')
|
||||||
|
purolator_default_package_type_id = fields.Many2one('stock.package.type', string="Purolator Package Type")
|
||||||
|
|
||||||
def purolator_rate_shipment(self, order):
|
def purolator_rate_shipment(self, order):
|
||||||
# sudoself = self.sudo()
|
# sudoself = self.sudo()
|
||||||
@@ -100,8 +100,12 @@ class ProviderPurolator(models.Model):
|
|||||||
self.purolator_account_number,
|
self.purolator_account_number,
|
||||||
self.prod_environment,
|
self.prod_environment,
|
||||||
)
|
)
|
||||||
res = client.get_quick_estimate(sender.zip, receiver_address, 'CustomerPackaging', weight)
|
res = client.get_quick_estimate(
|
||||||
_logger.warning('get_quick_estimate: %s', res)
|
sender.zip,
|
||||||
|
receiver_address,
|
||||||
|
self.purolator_default_package_type_id.shipper_package_code,
|
||||||
|
weight,
|
||||||
|
)
|
||||||
if res['error']:
|
if res['error']:
|
||||||
return {
|
return {
|
||||||
'success': False,
|
'success': False,
|
||||||
@@ -125,6 +129,15 @@ class ProviderPurolator(models.Model):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def purolator_rate_shipment_multi(self, order=None, picking=None, packages=None):
|
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)
|
sender = self.get_shipper_warehouse(order=order, picking=picking)
|
||||||
receiver = self.get_recipient(order=order, picking=picking)
|
receiver = self.get_recipient(order=order, picking=picking)
|
||||||
receiver_address = {
|
receiver_address = {
|
||||||
@@ -139,10 +152,15 @@ class ProviderPurolator(models.Model):
|
|||||||
if self.env.context.get('date_planned'):
|
if self.env.context.get('date_planned'):
|
||||||
date_planned = 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:
|
if order:
|
||||||
weight = weight_uom_id._compute_quantity(order._get_estimated_weight(), self.env.ref('uom.product_uom_lb'), round=False)
|
weight = weight_uom_id._compute_quantity(order._get_estimated_weight(), self.env.ref('uom.product_uom_lb'), round=False)
|
||||||
else:
|
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(
|
client = PurolatorClient(
|
||||||
self.purolator_api_key,
|
self.purolator_api_key,
|
||||||
self.purolator_password,
|
self.purolator_password,
|
||||||
@@ -150,7 +168,7 @@ class ProviderPurolator(models.Model):
|
|||||||
self.purolator_account_number,
|
self.purolator_account_number,
|
||||||
self.prod_environment,
|
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']:
|
if res['error']:
|
||||||
return [{'carrier': self,
|
return [{'carrier': self,
|
||||||
'success': False,
|
'success': False,
|
||||||
@@ -165,7 +183,7 @@ class ProviderPurolator(models.Model):
|
|||||||
price = shipment['TotalPrice']
|
price = shipment['TotalPrice']
|
||||||
rates.append({
|
rates.append({
|
||||||
'carrier': carrier,
|
'carrier': carrier,
|
||||||
# 'package': package or self.env['stock.quant.package'].browse(),
|
'package': package or self.env['stock.quant.package'].browse(),
|
||||||
'success': True,
|
'success': True,
|
||||||
'price': price,
|
'price': price,
|
||||||
'error_message': False,
|
'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',
|
'zip': 'V5C5A9',
|
||||||
})
|
})
|
||||||
self.storage_box = self.env.ref('product.product_product_6')
|
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({
|
self.sale_order = self.env['sale.order'].create({
|
||||||
'partner_id': self.receiver_partner.id,
|
'partner_id': self.receiver_partner.id,
|
||||||
'warehouse_id': self.shipper_warehouse.id,
|
'warehouse_id': self.shipper_warehouse.id,
|
||||||
@@ -55,5 +58,41 @@ class TestPurolator(TransactionCase):
|
|||||||
carrier_express = self.env.ref('delivery_purolator.purolator_ground')
|
carrier_express = self.env.ref('delivery_purolator.purolator_ground')
|
||||||
rate_express = list(filter(lambda r: r['carrier'] == carrier_express, rates))
|
rate_express = list(filter(lambda r: r['carrier'] == carrier_express, rates))
|
||||||
rate_express = rate_express and rate_express[0]
|
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['price'], 0.0)
|
||||||
self.assertGreater(rate_express['transit_days'], 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_activation_key" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
|
||||||
<field name="purolator_account_number" 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_service_type" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
|
||||||
|
<field name="purolator_default_package_type_id" attrs="{'required': [('delivery_type', '=', 'purolator')]}"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
|
|||||||
Reference in New Issue
Block a user