diff --git a/delivery_purolator/models/delivery_purolator.py b/delivery_purolator/models/delivery_purolator.py index 758b2ece..11cc6fa0 100644 --- a/delivery_purolator/models/delivery_purolator.py +++ b/delivery_purolator/models/delivery_purolator.py @@ -7,6 +7,7 @@ import logging _logger = logging.getLogger(__name__) +# 2022-09-21 - US Methods are known to rate, but cannot ship without additional customs/documents PUROLATOR_SERVICES = [ ('PurolatorExpress9AM', 'Purolator Express 9AM'), ('PurolatorExpress10:30AM', 'Purolator Express 10:30AM'), @@ -36,39 +37,41 @@ PUROLATOR_SERVICES = [ ('PurolatorQuickShipEnvelope', 'Purolator Quick Ship Envelope'), ('PurolatorQuickShipPack', 'Purolator Quick Ship Pack'), ('PurolatorQuickShipBox', 'Purolator Quick Ship Box'), - ('PurolatorExpressU.S.', 'Purolator Express U.S.'), - ('PurolatorExpressU.S.9AM', 'Purolator Express U.S. 9AM'), - ('PurolatorExpressU.S.10:30AM', 'Purolator Express U.S. 10:30AM'), - ('PurolatorExpressU.S.12:00', 'Purolator Express U.S. 12:00'), - ('PurolatorExpressEnvelopeU.S.', 'Purolator Express Envelope U.S.'), - ('PurolatorExpressU.S.Envelope9AM', 'Purolator Express U.S. Envelope 9AM'), - ('PurolatorExpressU.S.Envelope10:30AM', 'Purolator Express U.S. Envelope 10:30AM'), - ('PurolatorExpressU.S.Envelope12:00', 'Purolator Express U.S. Envelope 12:00'), - ('PurolatorExpressPackU.S.', 'Purolator Express Pack U.S.'), - ('PurolatorExpressU.S.Pack9AM', 'Purolator Express U.S. Pack 9AM'), - ('PurolatorExpressU.S.Pack10:30AM', 'Purolator Express U.S. Pack 10:30AM'), - ('PurolatorExpressU.S.Pack12:00', 'Purolator Express U.S. Pack 12:00'), - ('PurolatorExpressBoxU.S.', 'Purolator Express Box U.S.'), - ('PurolatorExpressU.S.Box9AM', 'Purolator Express U.S. Box 9AM'), - ('PurolatorExpressU.S.Box10:30AM', 'Purolator Express U.S. Box 10:30AM'), - ('PurolatorExpressU.S.Box12:00', 'Purolator Express U.S. Box 12:00'), - ('PurolatorGroundU.S.', 'Purolator Ground U.S.'), - ('PurolatorExpressInternational', 'Purolator Express International'), - ('PurolatorExpressInternational9AM', 'Purolator Express International 9AM'), - ('PurolatorExpressInternational10:30AM', 'Purolator Express International 10:30AM'), - ('PurolatorExpressInternational12:00', 'Purolator Express International 12:00'), - ('PurolatorExpressEnvelopeInternational', 'Purolator Express Envelope International'), - ('PurolatorExpressInternationalEnvelope9AM', 'Purolator Express International Envelope 9AM'), - ('PurolatorExpressInternationalEnvelope10:30AM', 'Purolator Express International Envelope 10:30AM'), - ('PurolatorExpressInternationalEnvelope12:00', 'Purolator Express International Envelope 12:00'), - ('PurolatorExpressPackInternational', 'Purolator Express Pack International'), - ('PurolatorExpressInternationalPack9AM', 'Purolator Express International Pack 9AM'), - ('PurolatorExpressInternationalPack10:30AM', 'Purolator Express International Pack 10:30AM'), - ('PurolatorExpressInternationalPack12:00', 'Purolator Express International Pack 12:00'), - ('PurolatorExpressBoxInternational', 'Purolator Express Box International'), - ('PurolatorExpressInternationalBox9AM', 'Purolator Express International Box 9AM'), - ('PurolatorExpressInternationalBox10:30AM', 'Purolator Express International Box 10:30AM'), - ('PurolatorExpressInternationalBox12:00', 'Purolator Express International Box 12:00'), + # 2022-09-21 - US Methods are known to rate, but cannot ship without additional customs/documents + # ('PurolatorExpressU.S.', 'Purolator Express U.S.'), + # ('PurolatorExpressU.S.9AM', 'Purolator Express U.S. 9AM'), + # ('PurolatorExpressU.S.10:30AM', 'Purolator Express U.S. 10:30AM'), + # ('PurolatorExpressU.S.12:00', 'Purolator Express U.S. 12:00'), + # ('PurolatorExpressEnvelopeU.S.', 'Purolator Express Envelope U.S.'), + # ('PurolatorExpressU.S.Envelope9AM', 'Purolator Express U.S. Envelope 9AM'), + # ('PurolatorExpressU.S.Envelope10:30AM', 'Purolator Express U.S. Envelope 10:30AM'), + # ('PurolatorExpressU.S.Envelope12:00', 'Purolator Express U.S. Envelope 12:00'), + # ('PurolatorExpressPackU.S.', 'Purolator Express Pack U.S.'), + # ('PurolatorExpressU.S.Pack9AM', 'Purolator Express U.S. Pack 9AM'), + # ('PurolatorExpressU.S.Pack10:30AM', 'Purolator Express U.S. Pack 10:30AM'), + # ('PurolatorExpressU.S.Pack12:00', 'Purolator Express U.S. Pack 12:00'), + # ('PurolatorExpressBoxU.S.', 'Purolator Express Box U.S.'), + # ('PurolatorExpressU.S.Box9AM', 'Purolator Express U.S. Box 9AM'), + # ('PurolatorExpressU.S.Box10:30AM', 'Purolator Express U.S. Box 10:30AM'), + # ('PurolatorExpressU.S.Box12:00', 'Purolator Express U.S. Box 12:00'), + # ('PurolatorGroundU.S.', 'Purolator Ground U.S.'), + # 2022-09-21 - International Methods are known to rate + # ('PurolatorExpressInternational', 'Purolator Express International'), + # ('PurolatorExpressInternational9AM', 'Purolator Express International 9AM'), + # ('PurolatorExpressInternational10:30AM', 'Purolator Express International 10:30AM'), + # ('PurolatorExpressInternational12:00', 'Purolator Express International 12:00'), + # ('PurolatorExpressEnvelopeInternational', 'Purolator Express Envelope International'), + # ('PurolatorExpressInternationalEnvelope9AM', 'Purolator Express International Envelope 9AM'), + # ('PurolatorExpressInternationalEnvelope10:30AM', 'Purolator Express International Envelope 10:30AM'), + # ('PurolatorExpressInternationalEnvelope12:00', 'Purolator Express International Envelope 12:00'), + # ('PurolatorExpressPackInternational', 'Purolator Express Pack International'), + # ('PurolatorExpressInternationalPack9AM', 'Purolator Express International Pack 9AM'), + # ('PurolatorExpressInternationalPack10:30AM', 'Purolator Express International Pack 10:30AM'), + # ('PurolatorExpressInternationalPack12:00', 'Purolator Express International Pack 12:00'), + # ('PurolatorExpressBoxInternational', 'Purolator Express Box International'), + # ('PurolatorExpressInternationalBox9AM', 'Purolator Express International Box 9AM'), + # ('PurolatorExpressInternationalBox10:30AM', 'Purolator Express International Box 10:30AM'), + # ('PurolatorExpressInternationalBox12:00', 'Purolator Express International Box 12:00'), ] @@ -145,6 +148,28 @@ class ProviderPurolator(models.Model): request.PaymentInformation.PaymentType = 'ThirdParty' request.PaymentInformation.BillingAccountNumber = third_party_account + def _purolator_shipment_fill_options(self, request, picking=None, order=None, packages=None): + # Signature can come from any package/packages + require_signature = False + if packages: + # if ANY package has it + require_signature = any(packages.mapped('require_signature')) + else: + require_signature = self.get_signature_required(order=order, picking=picking) + # when we support international, there is also ResidentialSignatureIntl (and AdultSignatureRequired) + request.ResidentialSignatureDomestic = 'true' if require_signature else 'false' + + declared_value = 0.0 + if packages: + declared_value = sum(s or 0.0 for s in packages.mapped('declared_value')) + else: + declared_value = self.get_insurance_value(picking=picking, order=order) + if declared_value: + request.DeclaredValue = str(round(declared_value, 2)) + + request.DeclaredValue = str(self.get_insurance_value()) + # _logger.info(' _purolator_shipment_fill_options set sig.req. %s set declared val. %s' % (require_signature, declared_value)) + def _purolator_rate_shipment_multi_package(self, order=None, picking=None, package=None): service = self._purolator_service() third_party = self.purolator_third_party(order=order, picking=picking) @@ -175,6 +200,7 @@ class ProviderPurolator(models.Model): service.estimate_shipment_add_picking_packages(shipment, self, picking, package) self._purolator_shipment_fill_payor(shipment, order=order, picking=picking) + self._purolator_shipment_fill_options(shipment, order=order, picking=picking, packages=package) shipment_res = service.get_full_estimate(shipment) @@ -294,15 +320,8 @@ class ProviderPurolator(models.Model): service.shipment_add_picking_packages(shipment, self, picking, picking_packages) - # TODO package level signature and insurance.... - # IF we cannot do this at the package level, then we must implement it here. - # We may need to warn that all packages will follow the same rule. - # //Define OptionsInformation - # //ResidentialSignatureDomestic - # $request->Shipment->PackageInformation->OptionsInformation->Options->OptionIDValuePair->ID = "ResidentialSignatureDomestic"; - # $request->Shipment->PackageInformation->OptionsInformation->Options->OptionIDValuePair->Value = "true"; - self._purolator_shipment_fill_payor(shipment, picking=picking) + self._purolator_shipment_fill_options(shipment, picking=picking, packages=picking_packages) shipment_res = service.shipment_create(shipment, printer_type=('Regular' if self.purolator_label_file_type == 'PDF' else 'Thermal')) diff --git a/delivery_purolator/tests/test_purolator.py b/delivery_purolator/tests/test_purolator.py index c316dd26..efa37c0c 100644 --- a/delivery_purolator/tests/test_purolator.py +++ b/delivery_purolator/tests/test_purolator.py @@ -57,6 +57,9 @@ class TestPurolator(TransactionCase): # reconfigure this method so that we can set its default package to one that needs a service code self.delivery_carrier_ground = self.env.ref('delivery_purolator.purolator_ground') self.delivery_carrier_ground.purolator_default_package_type_id = self.env.ref('delivery_purolator.purolator_packaging_large_package') + # set a VERY low requirement for signature + self.delivery_carrier_ground.automatic_insurance_value = 0.1 + self.delivery_carrier_ground.automatic_sig_req_value = 0.1 def _so_pick_shipping(self): # Regular Update Shipping functionality