diff --git a/delivery_fedex_hibou/models/delivery_fedex.py b/delivery_fedex_hibou/models/delivery_fedex.py index 09640588..f67012d5 100644 --- a/delivery_fedex_hibou/models/delivery_fedex.py +++ b/delivery_fedex_hibou/models/delivery_fedex.py @@ -311,7 +311,8 @@ class DeliveryFedex(models.Model): # package_length=packaging.length, sequence_number=sequence, ref=('%s-%d' % (order_name, sequence)), - insurance=superself.get_insurance_value(picking=picking, package=package) + insurance=superself.get_insurance_value(picking=picking, package=package), + signature_required=superself.get_signature_required(picking=picking, package=package) ) srm.set_master_package(net_weight, package_count, master_tracking_id=master_tracking_id) request = srm.process_shipment() @@ -385,7 +386,8 @@ class DeliveryFedex(models.Model): # package_width=packaging.width, # package_length=packaging.length, ref=order_name, - insurance=superself.get_insurance_value(picking=picking, package=picking_packages[:1]) + insurance=superself.get_insurance_value(picking=picking, package=picking_packages[:1]), + signature_required=superself.get_signature_required(picking=picking, package=picking_packages[:1]) ) srm.set_master_package(net_weight, 1) @@ -475,6 +477,7 @@ class DeliveryFedex(models.Model): meter_number = superself._get_fedex_meter_number(order=order, picking=picking) order_name = superself.get_order_name(order=order, picking=picking) insurance_value = superself.get_insurance_value(order=order, picking=picking, package=package) + signature_required = superself.get_signature_required(order=order, picking=picking, package=package) residential = self._get_fedex_recipient_is_residential(recipient) date_planned = fields.Datetime.now() if self.env.context.get('date_planned'): @@ -558,7 +561,8 @@ class DeliveryFedex(models.Model): # package_length=packaging.length, sequence_number=1, ref=('%s-%d' % (order_name, 1)), - insurance=insurance_value + insurance=insurance_value, + signature_required=signature_required ) else: # deliver all together... @@ -576,7 +580,8 @@ class DeliveryFedex(models.Model): # po_number=po_number, # dept_number=dept_number, ref=('%s-%d' % (order_name, 1)), - insurance=insurance_value + insurance=insurance_value, + signature_required=signature_required ) diff --git a/delivery_fedex_hibou/models/fedex_request.py b/delivery_fedex_hibou/models/fedex_request.py index b6573a31..5e2e4418 100644 --- a/delivery_fedex_hibou/models/fedex_request.py +++ b/delivery_fedex_hibou/models/fedex_request.py @@ -81,7 +81,7 @@ class FedexRequest(fedex_request.FedexRequest): self.RequestedShipment.Recipient.Contact = Contact self.RequestedShipment.Recipient.Address = Address - def add_package(self, weight_value, sequence_number=False, mode='shipping', ref=False, insurance=False): + def add_package(self, weight_value, sequence_number=False, mode='shipping', ref=False, insurance=False, signature_required=False): """ Adds ref type of object to include. :param weight_value: default @@ -89,6 +89,7 @@ class FedexRequest(fedex_request.FedexRequest): :param mode: default :param ref: NEW add CUSTOMER_REFERENCE object :param insurance: NEW add Insurance amount + :param signature_required: NEW add signature required :return: """ package = self.client.factory.create('RequestedPackageLineItem') @@ -109,6 +110,12 @@ class FedexRequest(fedex_request.FedexRequest): insured.Currency = 'USD' package.InsuredValue = insured + special_service = self.client.factory.create("PackageSpecialServicesRequested") + signature_detail = self.client.factory.create("SignatureOptionDetail") + signature_detail.OptionType = 'DIRECT' if signature_required else 'NO_SIGNATURE_REQUIRED' + special_service.SignatureOptionDetail = signature_detail + package.SpecialServicesRequested = special_service + package.PhysicalPackaging = 'BOX' package.Weight = package_weight if mode == 'rating': diff --git a/sale_planner/wizard/order_planner.py b/sale_planner/wizard/order_planner.py index c932841d..6f99aa93 100644 --- a/sale_planner/wizard/order_planner.py +++ b/sale_planner/wizard/order_planner.py @@ -669,7 +669,7 @@ class SaleOrderMakePlan(models.TransientModel): _logger.info('generate_shipping_options:: base_option: ' + str(base_option) + ' order_fake: ' + str(order_fake) + ' carriers: ' + str(carriers)) if not carriers: - return base_option + return [base_option] if not base_option.get('sub_options'): options = [] diff --git a/stock_delivery_planner/wizard/stock_delivery_planner.py b/stock_delivery_planner/wizard/stock_delivery_planner.py index 0de30215..b3f0319f 100644 --- a/stock_delivery_planner/wizard/stock_delivery_planner.py +++ b/stock_delivery_planner/wizard/stock_delivery_planner.py @@ -1,7 +1,7 @@ # Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. from odoo import api, fields, models, _ -from odoo.tools import safe_eval +from odoo.exceptions import UserError, ValidationError import logging _logger = logging.getLogger(__name__) @@ -37,22 +37,25 @@ class StockDeliveryPlanner(models.TransientModel): pass for carrier in base_carriers: - rates = carrier.rate_shipment_multi(picking=planner.picking_id) - for rate in filter(lambda r: not r.get('success'), rates): - _logger.warning(rate.get('error_message')) - for rate in filter(lambda r: r.get('success'), rates): - rate = self.calculate_delivery_window(rate) - # added late in API dev cycle - package = rate.get('package') or self.env['stock.quant.package'].browse() - planner.plan_option_ids |= planner.plan_option_ids.create({ - 'plan_id': self.id, - 'carrier_id': rate['carrier'].id, - 'package_id': package.id, - 'price': rate['price'], - 'date_planned': rate['date_planned'], - 'requested_date': rate['date_delivered'], - 'transit_days': rate['transit_days'], - }) + try: + rates = carrier.rate_shipment_multi(picking=planner.picking_id) + for rate in filter(lambda r: not r.get('success'), rates): + _logger.warning(rate.get('error_message')) + for rate in filter(lambda r: r.get('success'), rates): + rate = self.calculate_delivery_window(rate) + # added late in API dev cycle + package = rate.get('package') or self.env['stock.quant.package'].browse() + planner.plan_option_ids |= planner.plan_option_ids.create({ + 'plan_id': self.id, + 'carrier_id': rate['carrier'].id, + 'package_id': package.id, + 'price': rate['price'], + 'date_planned': rate['date_planned'], + 'requested_date': rate.get('date_delivered', False), + 'transit_days': rate.get('transit_days', 0), + }) + except (UserError, ValidationError) as e: + _logger.warning('Exception during delivery planning. %s' % str(e)) return planner @api.model