[FIX] delivery_fedex_hibou: faults by timestamps difference in 11 from 12

This commit is contained in:
Jared Kipe
2021-10-04 16:27:27 -07:00
parent d78a4d0657
commit 13a4f9890c
2 changed files with 115 additions and 55 deletions

View File

@@ -19,6 +19,10 @@ class DeliveryFedex(models.Model):
('FEDEX_EXPRESS_SAVER', 'FEDEX_EXPRESS_SAVER'),
])
def _fedex_convert_weight(self, weight, unit):
# dummy converter
return weight
def _get_fedex_is_third_party(self, order=None, picking=None):
third_party_account = self.get_third_party_account(order=order, picking=picking)
if third_party_account:
@@ -114,6 +118,8 @@ class DeliveryFedex(models.Model):
date_planned = None
if self.env.context.get('date_planned'):
date_planned = self.env.context.get('date_planned')
if date_planned and isinstance(date_planned, str):
date_planned = fields.Datetime.from_string(date_planned)
# Authentication stuff
@@ -298,12 +304,12 @@ class DeliveryFedex(models.Model):
# Hibou Delivery
# Add more details to package.
srm._add_package(
srm.add_package(
package_weight,
package_code=packaging_code,
package_height=packaging.height,
package_width=packaging.width,
package_length=packaging.length,
# package_code=packaging_code,
# package_height=packaging.height,
# package_width=packaging.width,
# package_length=packaging.length,
sequence_number=sequence,
ref=('%s-%d' % (order_name, sequence)),
insurance=insurance_value
@@ -373,12 +379,12 @@ class DeliveryFedex(models.Model):
elif package_count == 1:
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,
package_code=packaging_code,
package_height=packaging.height,
package_width=packaging.width,
package_length=packaging.length,
# package_code=packaging_code,
# package_height=packaging.height,
# package_width=packaging.width,
# package_length=packaging.length,
ref=order_name,
insurance=insurance_value
)
@@ -474,6 +480,8 @@ class DeliveryFedex(models.Model):
date_planned = fields.Datetime.now()
if self.env.context.get('date_planned'):
date_planned = self.env.context.get('date_planned')
if date_planned and isinstance(date_planned, str):
date_planned = fields.Datetime.from_string(date_planned)
# Authentication stuff
srm = FedexRequest(self.log_xml, request_type="rating", prod_environment=self.prod_environment)
@@ -507,10 +515,10 @@ class DeliveryFedex(models.Model):
for sequence in range(1, total_package + 1):
srm.add_package(
max_weight,
package_code=pkg.shipper_package_code,
package_height=pkg.height,
package_width=pkg.width,
package_length=pkg.length,
# package_code=pkg.shipper_package_code,
# package_height=pkg.height,
# package_width=pkg.width,
# package_length=pkg.length,
sequence_number=sequence,
mode='rating',
)
@@ -518,10 +526,10 @@ class DeliveryFedex(models.Model):
total_package = total_package + 1
srm.add_package(
last_package_weight,
package_code=pkg.shipper_package_code,
package_height=pkg.height,
package_width=pkg.width,
package_length=pkg.length,
# package_code=pkg.shipper_package_code,
# package_height=pkg.height,
# package_width=pkg.width,
# package_length=pkg.length,
sequence_number=total_package,
mode='rating',
)
@@ -529,10 +537,10 @@ class DeliveryFedex(models.Model):
elif order:
srm.add_package(
weight_value,
package_code=pkg.shipper_package_code,
package_height=pkg.height,
package_width=pkg.width,
package_length=pkg.length,
# package_code=pkg.shipper_package_code,
# package_height=pkg.height,
# package_width=pkg.width,
# package_length=pkg.length,
mode='rating',
)
srm.set_master_package(weight_value, 1)
@@ -545,10 +553,10 @@ class DeliveryFedex(models.Model):
srm.add_package(
package_weight,
mode='rating',
package_code=package_code,
package_height=packaging.height,
package_width=packaging.width,
package_length=packaging.length,
# package_code=package_code,
# package_height=packaging.height,
# package_width=packaging.width,
# package_length=packaging.length,
sequence_number=1,
ref=('%s-%d' % (order_name, 1)),
insurance=insurance_value
@@ -561,10 +569,10 @@ class DeliveryFedex(models.Model):
srm.add_package(
package_weight,
mode='rating',
package_code=packaging.shipper_package_code,
package_height=packaging.height,
package_width=packaging.width,
package_length=packaging.length,
# package_code=packaging.shipper_package_code,
# package_height=packaging.height,
# package_width=packaging.width,
# package_length=packaging.length,
sequence_number=1,
# po_number=po_number,
# dept_number=dept_number,
@@ -635,9 +643,6 @@ class DeliveryFedex(models.Model):
carrier = self.fedex_find_delivery_carrier_for_service(service_code)
if carrier:
date_delivered = request.get('date_delivered', False)
if date_delivered:
tz = pytz.timezone(self.delivery_calendar_id.tz)
date_delivered = tz.localize(date_delivered).astimezone(pytz.utc).replace(tzinfo=None)
result.append({'carrier': carrier,
'package': package or self.env['stock.quant.package'].browse(),
'success': True,

View File

@@ -2,10 +2,12 @@
import suds
from odoo.addons.delivery_fedex.models import fedex_request
from datetime import datetime
from copy import deepcopy
from pprint import pformat
import logging
_logger = logging.getLogger(__name__)
# logging.getLogger('suds.client').setLevel(logging.DEBUG)
STATECODE_REQUIRED_COUNTRIES = fedex_request.STATECODE_REQUIRED_COUNTRIES
@@ -132,20 +134,44 @@ class FedexRequest(fedex_request.FedexRequest):
Payor.ResponsibleParty.AccountNumber = shipping_charges_payment_account
self.RequestedShipment.ShippingChargesPayment.Payor = Payor
def shipment_request(self, dropoff_type, service_type, packaging_type, overall_weight_unit, saturday_delivery, ship_timestamp=None):
self.RequestedShipment = self.client.factory.create('RequestedShipment')
self.RequestedShipment.ShipTimestamp = ship_timestamp or datetime.now()
self.RequestedShipment.DropoffType = dropoff_type
self.RequestedShipment.ServiceType = service_type
self.RequestedShipment.PackagingType = packaging_type
# Resuest estimation of duties and taxes for international shipping
if service_type in ['INTERNATIONAL_ECONOMY', 'INTERNATIONAL_PRIORITY']:
self.RequestedShipment.EdtRequestType = 'ALL'
else:
self.RequestedShipment.EdtRequestType = 'NONE'
self.RequestedShipment.PackageCount = 0
self.RequestedShipment.TotalWeight.Units = overall_weight_unit
self.RequestedShipment.TotalWeight.Value = 0
self.listCommodities = []
if saturday_delivery:
timestamp_day = self.RequestedShipment.ShipTimestamp.strftime("%A")
if (service_type == 'FEDEX_2_DAY' and timestamp_day == 'Thursday') or (service_type in ['PRIORITY_OVERNIGHT', 'FIRST_OVERNIGHT', 'INTERNATIONAL_PRIORITY'] and timestamp_day == 'Friday'):
SpecialServiceTypes = self.client.factory.create('ShipmentSpecialServiceType')
self.RequestedShipment.SpecialServicesRequested.SpecialServiceTypes = [SpecialServiceTypes.SATURDAY_DELIVERY]
# Rating stuff
def rate(self, date_planned=None):
def rate(self, date_planned=None, multi=False):
"""
Response will contain 'transit_days' key with number of days.
:param date_planned: Planned Outgoing shipment. Used to have FedEx tell us how long it will take for the package to arrive.
:return:
"""
if multi:
multi_result = []
if date_planned:
self.RequestedShipment.ShipTimestamp = date_planned
formatted_response = {'price': {}}
del self.ClientDetail.Region
if date_planned:
# though Fedex sends BACK timestamps like `2020-01-01 00:00:00` they EXPECT `2020-01-01T00:00:00`
self.RequestedShipment.ShipTimestamp = date_planned.replace(' ', 'T')
if self.hasCommodities:
self.RequestedShipment.CustomsClearanceDetail.Commodities = self.listCommodities
try:
self.response = self.client.service.getRates(WebAuthenticationDetail=self.WebAuthenticationDetail,
@@ -154,7 +180,12 @@ class FedexRequest(fedex_request.FedexRequest):
Version=self.VersionId,
RequestedShipment=self.RequestedShipment,
ReturnTransitAndCommit=True) # New ReturnTransitAndCommit for CommitDetails in response
if (self.response.HighestSeverity != 'ERROR' and self.response.HighestSeverity != 'FAILURE'):
if not getattr(self.response, "RateReplyDetails", False):
raise Exception("No rating found")
if not multi:
for rating in self.response.RateReplyDetails[0].RatedShipmentDetails:
formatted_response['price'][rating.ShipmentRateDetail.TotalNetFedExCharge.Currency] = rating.ShipmentRateDetail.TotalNetFedExCharge.Amount
if len(self.response.RateReplyDetails[0].RatedShipmentDetails) == 1:
@@ -164,13 +195,33 @@ class FedexRequest(fedex_request.FedexRequest):
# Hibou Delivery Planning
if hasattr(self.response.RateReplyDetails[0], 'DeliveryTimestamp') and self.response.RateReplyDetails[0].DeliveryTimestamp:
formatted_response['date_delivered'] = self.response.RateReplyDetails[0].DeliveryTimestamp
elif hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'CommitTimestamp'):
elif hasattr(self.response.RateReplyDetails[0], 'CommitDetails') and hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'CommitTimestamp'):
formatted_response['date_delivered'] = self.response.RateReplyDetails[0].CommitDetails[0].CommitTimestamp
formatted_response['transit_days'] = self._service_transit_days.get(self.response.RateReplyDetails[0].CommitDetails[0].ServiceType, 0)
elif hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'TransitTime'):
elif hasattr(self.response.RateReplyDetails[0], 'CommitDetails') and hasattr(self.response.RateReplyDetails[0].CommitDetails[0], 'TransitTime'):
transit_days = self.response.RateReplyDetails[0].CommitDetails[0].TransitTime
transit_days = self._transit_days.get(transit_days, 0)
formatted_response['transit_days'] = transit_days
else:
for rate_reply_detail in self.response.RateReplyDetails:
res = deepcopy(formatted_response)
res['service_code'] = rate_reply_detail.ServiceType
for rating in rate_reply_detail.RatedShipmentDetails:
res['price'][rating.ShipmentRateDetail.TotalNetFedExCharge.Currency] = rating.ShipmentRateDetail.TotalNetFedExCharge.Amount
if len(rate_reply_detail.RatedShipmentDetails) == 1:
if 'CurrencyExchangeRate' in rate_reply_detail.RatedShipmentDetails[0].ShipmentRateDetail:
res['price'][rate_reply_detail.RatedShipmentDetails[0].ShipmentRateDetail.CurrencyExchangeRate.FromCurrency] = rate_reply_detail.RatedShipmentDetails[0].ShipmentRateDetail.TotalNetFedExCharge.Amount / rate_reply_detail.RatedShipmentDetails[0].ShipmentRateDetail.CurrencyExchangeRate.Rate
# Hibou Delivery Planning
if hasattr(rate_reply_detail, 'DeliveryTimestamp') and rate_reply_detail.DeliveryTimestamp:
res['date_delivered'] = rate_reply_detail.DeliveryTimestamp
elif hasattr(rate_reply_detail, 'CommitDetails') and hasattr(rate_reply_detail.CommitDetails[0], 'CommitTimestamp'):
res['date_delivered'] = rate_reply_detail.CommitDetails[0].CommitTimestamp
res['transit_days'] = self._service_transit_days.get(rate_reply_detail.CommitDetails[0].ServiceType, 0)
elif hasattr(rate_reply_detail, 'CommitDetails') and hasattr(rate_reply_detail.CommitDetails[0], 'TransitTime'):
transit_days = rate_reply_detail.CommitDetails[0].TransitTime
transit_days = self._transit_days.get(transit_days, 0)
res['transit_days'] = transit_days
multi_result.append(res)
else:
errors_message = '\n'.join([("%s: %s" % (n.Code, n.Message)) for n in self.response.Notifications if (n.Severity == 'ERROR' or n.Severity == 'FAILURE')])
@@ -184,5 +235,9 @@ class FedexRequest(fedex_request.FedexRequest):
formatted_response['errors_message'] = fault
except IOError:
formatted_response['errors_message'] = "Fedex Server Not Found"
except Exception as e:
formatted_response['errors_message'] = e.args[0]
if multi:
return multi_result
return formatted_response