[IMP] delivery_fedex_hibou: mechanisms for multi-rating per-package

This commit is contained in:
Jared Kipe
2021-09-20 17:46:09 -07:00
parent 0ca51cc44e
commit 674a4d60ab
6 changed files with 64 additions and 30 deletions

View File

@@ -1 +1,3 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import models from . import models

View File

@@ -1,9 +1,9 @@
{ {
'name': 'Hibou Fedex Shipping', 'name': 'Hibou Fedex Shipping',
'version': '14.0.1.0.0', 'version': '14.0.1.1.0',
'category': 'Stock', 'category': 'Stock',
'author': "Hibou Corp.", 'author': "Hibou Corp.",
'license': 'AGPL-3', 'license': 'OPL-1',
'website': 'https://hibou.io/', 'website': 'https://hibou.io/',
'depends': [ 'depends': [
'delivery_fedex', 'delivery_fedex',

View File

@@ -1,2 +1,4 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from . import delivery_fedex from . import delivery_fedex
from . import stock from . import stock

View File

@@ -1,3 +1,5 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
import logging import logging
import pytz import pytz
from odoo import fields, models, tools, _ from odoo import fields, models, tools, _
@@ -223,6 +225,15 @@ class DeliveryFedex(models.Model):
srm = FedexRequest(self.log_xml, request_type="shipping", prod_environment=self.prod_environment) srm = FedexRequest(self.log_xml, request_type="shipping", prod_environment=self.prod_environment)
superself = self.sudo() superself = self.sudo()
picking_packages = picking.package_ids
package_carriers = picking_packages.mapped('carrier_id')
if package_carriers:
# only ship ours
picking_packages = picking_packages.filtered(lambda p: p.carrier_id == self and not p.carrier_tracking_ref)
if package_carriers and not picking_packages:
continue
shipper_company = superself.get_shipper_company(picking=picking) shipper_company = superself.get_shipper_company(picking=picking)
shipper_warehouse = superself.get_shipper_warehouse(picking=picking) shipper_warehouse = superself.get_shipper_warehouse(picking=picking)
recipient = superself.get_recipient(picking=picking) recipient = superself.get_recipient(picking=picking)
@@ -239,7 +250,7 @@ class DeliveryFedex(models.Model):
srm.transaction_detail(picking.id) srm.transaction_detail(picking.id)
package_type = picking.package_ids and picking.package_ids[0].packaging_id.shipper_package_code or self.fedex_default_packaging_id.shipper_package_code package_type = picking_packages and picking_packages[0].packaging_id.shipper_package_code or self.fedex_default_packaging_id.shipper_package_code
srm.shipment_request(self.fedex_droppoff_type, self.fedex_service_type, package_type, self.fedex_weight_unit, self.fedex_saturday_delivery) srm.shipment_request(self.fedex_droppoff_type, self.fedex_service_type, package_type, self.fedex_weight_unit, self.fedex_saturday_delivery)
srm.set_currency(_convert_curr_iso_fdx(picking.company_id.currency_id.name)) srm.set_currency(_convert_curr_iso_fdx(picking.company_id.currency_id.name))
srm.set_shipper(shipper_company, shipper_warehouse) srm.set_shipper(shipper_company, shipper_warehouse)
@@ -278,7 +289,7 @@ class DeliveryFedex(models.Model):
send_etd = superself.env['ir.config_parameter'].get_param("delivery_fedex.send_etd") send_etd = superself.env['ir.config_parameter'].get_param("delivery_fedex.send_etd")
srm.commercial_invoice(self.fedex_document_stock_type, send_etd) srm.commercial_invoice(self.fedex_document_stock_type, send_etd)
package_count = len(picking.package_ids) or 1 package_count = len(picking_packages) or 1
# For india picking courier is not accepted without this details in label. # For india picking courier is not accepted without this details in label.
po_number = order.display_name or False po_number = order.display_name or False
@@ -307,16 +318,17 @@ class DeliveryFedex(models.Model):
package_labels = [] package_labels = []
carrier_tracking_ref = "" carrier_tracking_ref = ""
for sequence, package in enumerate(picking.package_ids, start=1): for sequence, package in enumerate(picking_packages, start=1):
package_weight = self._fedex_convert_weight(package.shipping_weight, self.fedex_weight_unit) package_weight = self._fedex_convert_weight(package.shipping_weight, self.fedex_weight_unit)
packaging = package.packaging_id packaging = package.packaging_id
packaging_code = packaging.shipper_package_code if (packaging.package_carrier_type == 'fedex' and packaging.shipper_package_code) else self.fedex_default_packaging_id.shipper_package_code
# Hibou Delivery # Hibou Delivery
# Add more details to package. # Add more details to package.
srm._add_package( srm._add_package(
package_weight, package_weight,
package_code=packaging.shipper_package_code, package_code=packaging_code,
package_height=packaging.height, package_height=packaging.height,
package_width=packaging.width, package_width=packaging.width,
package_length=packaging.packaging_length, package_length=packaging.packaging_length,
@@ -394,10 +406,11 @@ class DeliveryFedex(models.Model):
# One package # # One package #
############### ###############
elif package_count == 1: elif package_count == 1:
packaging = picking.package_ids[:1].packaging_id or picking.carrier_id.fedex_default_packaging_id packaging = picking_packages[:1].packaging_id or self.fedex_default_packaging_id
packaging_code = packaging.shipper_package_code if packaging.package_carrier_type == 'fedex' else self.fedex_default_packaging_id.shipper_package_code
srm._add_package( srm._add_package(
net_weight, net_weight,
package_code=packaging.shipper_package_code, package_code=packaging_code,
package_height=packaging.height, package_height=packaging.height,
package_width=packaging.width, package_width=packaging.width,
package_length=packaging.packaging_length, package_length=packaging.packaging_length,
@@ -457,21 +470,33 @@ class DeliveryFedex(models.Model):
picking.message_post(body='Fedex Documents', attachments=fedex_documents) picking.message_post(body='Fedex Documents', attachments=fedex_documents)
return res return res
def fedex_rate_shipment_multi(self, order=None, picking=None): def fedex_rate_shipment_multi(self, order=None, picking=None, packages=None):
if not packages:
return self._fedex_rate_shipment_multi_package(order=order, picking=picking)
else:
rates = []
for package in packages:
rates += self._fedex_rate_shipment_multi_package(order=order, picking=picking, package=package)
return rates
def _fedex_rate_shipment_multi_package(self, order=None, picking=None, package=None):
if order: if order:
max_weight = self._fedex_convert_weight(self.fedex_default_packaging_id.max_weight, self.fedex_weight_unit) max_weight = self._fedex_convert_weight(self.fedex_default_packaging_id.max_weight, self.fedex_weight_unit)
is_india = order.partner_shipping_id.country_id.code == 'IN' and order.company_id.partner_id.country_id.code == 'IN' is_india = order.partner_shipping_id.country_id.code == 'IN' and order.company_id.partner_id.country_id.code == 'IN'
est_weight_value = sum([(line.product_id.weight * line.product_uom_qty) for line in order.order_line]) or 0.0 est_weight_value = sum([(line.product_id.weight * line.product_uom_qty) for line in order.order_line]) or 0.0
weight_value = self._fedex_convert_weight(est_weight_value, self.fedex_weight_unit) weight_value = self._fedex_convert_weight(est_weight_value, self.fedex_weight_unit)
order_currency = order.currency_id order_currency = order.currency_id
else: elif not package:
# max_weight = self._fedex_convert_weight(self.fedex_default_packaging_id.max_weight, self.fedex_weight_unit)
is_india = picking.partner_id.country_id.code == 'IN' and picking.company_id.partner_id.country_id.code == 'IN' is_india = picking.partner_id.country_id.code == 'IN' and picking.company_id.partner_id.country_id.code == 'IN'
# TODO must be per-package eventually
# theoretically just sum of all packages weights, but the rating itself will also need to change...
est_weight_value = sum([(line.product_id.weight * (line.qty_done or line.product_uom_qty)) for line in picking.move_line_ids]) or 0.0 est_weight_value = sum([(line.product_id.weight * (line.qty_done or line.product_uom_qty)) for line in picking.move_line_ids]) or 0.0
weight_value = self._fedex_convert_weight(est_weight_value, self.fedex_weight_unit) weight_value = self._fedex_convert_weight(est_weight_value, self.fedex_weight_unit)
order_currency = picking.sale_id.currency_id if picking.sale_id else picking.company_id.currency_id order_currency = picking.sale_id.currency_id if picking.sale_id else picking.company_id.currency_id
else:
is_india = picking.partner_id.country_id.code == 'IN' and picking.company_id.partner_id.country_id.code == 'IN'
order_currency = picking.sale_id.currency_id if picking.sale_id else picking.company_id.currency_id
est_weight_value = package.shipping_weight or package.weight
weight_value = self._fedex_convert_weight(est_weight_value, self.fedex_weight_unit)
price = 0.0 price = 0.0
@@ -558,24 +583,24 @@ class DeliveryFedex(models.Model):
) )
srm.set_master_package(weight_value, 1) srm.set_master_package(weight_value, 1)
else: else:
if picking.package_ids: if package:
for sequence, package in enumerate(picking.package_ids, start=1): package_weight = self._fedex_convert_weight(package.shipping_weight or package.weight, self.fedex_weight_unit)
package_weight = self._fedex_convert_weight(package.shipping_weight, self.fedex_weight_unit) packaging = package.packaging_id
packaging = package.packaging_id package_code = package.packaging_id.shipper_package_code if packaging.package_carrier_type == 'fedex' else self.fedex_default_packaging_id.shipper_package_code
srm.add_package( srm.add_package(
package_weight, package_weight,
mode='rating', mode='rating',
package_code=packaging.shipper_package_code, package_code=package_code,
package_height=packaging.height, package_height=packaging.height,
package_width=packaging.width, package_width=packaging.width,
package_length=packaging.packaging_length, package_length=packaging.packaging_length,
sequence_number=sequence, sequence_number=1,
# po_number=po_number, # po_number=po_number,
# dept_number=dept_number, # dept_number=dept_number,
reference=('%s-%d' % (order_name, sequence)), reference=('%s-%d' % (order_name, 1)),
insurance=insurance_value insurance=insurance_value
) )
else: else:
# deliver all together... # deliver all together...
package_weight = self._fedex_convert_weight(picking.shipping_weight or picking.weight, self.fedex_weight_unit) package_weight = self._fedex_convert_weight(picking.shipping_weight or picking.weight, self.fedex_weight_unit)
@@ -662,6 +687,7 @@ class DeliveryFedex(models.Model):
tz = pytz.timezone(self.delivery_calendar_id.tz) tz = pytz.timezone(self.delivery_calendar_id.tz)
date_delivered = tz.localize(date_delivered).astimezone(pytz.utc).replace(tzinfo=None) date_delivered = tz.localize(date_delivered).astimezone(pytz.utc).replace(tzinfo=None)
result.append({'carrier': carrier, result.append({'carrier': carrier,
'package': package or self.env['stock.quant.package'].browse(),
'success': True, 'success': True,
'price': price, 'price': price,
'error_message': False, 'error_message': False,

View File

@@ -1,3 +1,5 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from zeep.exceptions import Fault from zeep.exceptions import Fault
from datetime import datetime from datetime import datetime
from copy import deepcopy from copy import deepcopy

View File

@@ -1,3 +1,5 @@
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
from odoo import api, fields, models from odoo import api, fields, models