Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions plugins/eshipper/karrio/providers/eshipper/rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,21 @@ def _extract_details(
rate.serviceName,
service_id=rate.serviceId,
test_mode=settings.test_mode,
carrier_name=rate.carrierName,
)
carrier_id = provider_units.ShippingService.carrier_id(
rate.carrierName,
test_mode=settings.test_mode,
service_search=service.name_or_key,
service_id=rate.serviceId,
carrier_name=rate.carrierName,
)
rate_provider = provider_units.RateProvider.find(
rate.carrierName,
test_mode=settings.test_mode,
service_search=service.name_or_key,
service_id=rate.serviceId,
carrier_name=rate.carrierName,
)

charges = [
Expand Down
16 changes: 16 additions & 0 deletions plugins/eshipper/karrio/providers/eshipper/shipment/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ def _extract_details(
service = provider_units.ShippingService.find(
shipment.carrier.serviceName,
test_mode=settings.test_mode,
carrier_name=shipment.carrier.carrierName,
)
rate_provider = provider_units.RateProvider.find(
shipment.carrier.carrierName,
test_mode=settings.test_mode,
carrier_name=shipment.carrier.carrierName,
)

return models.ShipmentDetails(
Expand Down Expand Up @@ -89,11 +91,24 @@ def shipment_request(
initializer=provider_units.shipping_options_initializer,
)
service = provider_units.ShippingService.map(payload.service)

# Extract carrier from service code if available
carrier_name_from_service = None
if "_" in service.name_or_key:
parts = service.name_or_key.split("_")
# Carrier is always at index 1 after "eshipper" prefix
if len(parts) >= 2 and parts[0] == "eshipper":
potential_carrier = parts[1] # e.g., "canadapost" from "eshipper_canadapost_expedited"
# Validate it's a known carrier
if provider_units.RateProvider.map(potential_carrier).name:
carrier_name_from_service = potential_carrier

service_id = lib.identity(
options.eshipper_service_id.state
or provider_units.ShippingService.service_id(
service.name_or_key,
test_mode=settings.test_mode,
carrier_name=carrier_name_from_service,
)
)
carrier_id = lib.identity(
Expand All @@ -103,6 +118,7 @@ def shipment_request(
service_id=service_id,
test_mode=settings.test_mode,
service_search=service.name_or_key,
carrier_name=carrier_name_from_service,
)
)

Expand Down
70 changes: 55 additions & 15 deletions plugins/eshipper/karrio/providers/eshipper/units.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,12 @@ def to_service_code(service: typing.Dict[str, str]) -> str:
return output


def get_service(search: str, test_mode: bool = False, service_id: str = None):
def get_service(
search: str,
test_mode: bool = False,
service_id: str = None,
carrier_name: str = None,
):
prod_metadata = METADATA_JSON["PROD_SERVICES"]
test_metadata = METADATA_JSON["DEV_SERVICES"]
metadata = lib.identity(
Expand All @@ -144,27 +149,53 @@ def get_service(search: str, test_mode: bool = False, service_id: str = None):
service
for service in metadata
if to_service_code(service) == search
or service.get("name") == search
or str(service.get("id")) == search
or (service_id and service_id == str(service.get("id")))
or (
service.get("name") == search
and (
not carrier_name
or service.get("carrierDTO", {}).get("name") == carrier_name
)
)
),
{},
)


def get_service_id(search: str, test_mode: bool = False, service_id: str = None):
def get_service_id(
search: str,
test_mode: bool = False,
service_id: str = None,
carrier_name: str = None,
):
return (
get_service(search, test_mode=test_mode, service_id=service_id).get("id")
get_service(
search,
test_mode=test_mode,
service_id=service_id,
carrier_name=carrier_name,
).get("id")
or service_id
)


def find_service(search: str, test_mode: bool = False, service_id: str = None):
def find_service(
search: str,
test_mode: bool = False,
service_id: str = None,
carrier_name: str = None,
):

if ShippingService.map(search).name:
return ShippingService.map(search)

service = get_service(search, test_mode=test_mode, service_id=service_id)
service = get_service(
search,
test_mode=test_mode,
service_id=service_id,
carrier_name=carrier_name,
)

if service:
return ShippingService.map(to_service_code(service))
Expand All @@ -177,10 +208,16 @@ def get_carrier(
test_mode: bool = False,
service_search: str = None,
service_id: str = None,
carrier_name: str = None,
):
id_key = "test_id" if test_mode else "prod_id"
alternate_key = "prod_id" if not test_mode else "test_id"
service = get_service(service_search, test_mode=test_mode, service_id=service_id)
service = get_service(
service_search,
test_mode=test_mode,
service_id=service_id,
carrier_name=carrier_name or search,
)

return service.get("carrierDTO") or next(
(
Expand All @@ -204,12 +241,14 @@ def get_carrier_id(
test_mode: bool = False,
service_search: str = None,
service_id: str = None,
carrier_name: str = None,
):
return get_carrier(
search,
test_mode=test_mode,
service_search=service_search,
service_id=service_id,
carrier_name=carrier_name,
).get("id")


Expand All @@ -218,6 +257,7 @@ def find_rate_provider(
test_mode: bool = False,
service_search: str = None,
service_id: str = None,
carrier_name: str = None,
):

if RateProvider.map(lib.to_snake_case(search)).name:
Expand All @@ -228,6 +268,7 @@ def find_rate_provider(
test_mode=test_mode,
service_search=service_search,
service_id=service_id,
carrier_name=carrier_name,
)

if carrier and RateProvider.map(to_carrier_code(carrier)).name:
Expand Down Expand Up @@ -273,48 +314,47 @@ def find_rate_provider(
}

ESHIPPER_SERVICE_METADATA = {
lib.to_snake_case(service.get("esServicename") or service.get("name")): {
to_service_code(service): {
**service,
"ids": list(
set(
[
s["id"]
for s in METADATA_JSON["PROD_SERVICES"]
+ METADATA_JSON["DEV_SERVICES"]
if lib.to_snake_case(s["name"])
== lib.to_snake_case(service["name"])
if to_service_code(s) == to_service_code(service)
]
)
),
"prod_id": next(
(
s["id"]
for s in METADATA_JSON["PROD_SERVICES"]
if s["name"] == service["name"]
if to_service_code(s) == to_service_code(service)
),
None,
),
"test_id": next(
(
s["id"]
for s in METADATA_JSON["DEV_SERVICES"]
if s["name"] == service["name"]
if to_service_code(s) == to_service_code(service)
),
None,
),
"carrier": lib.to_snake_case(service["carrierDTO"]["name"]),
}
for service in {
s["name"]: s
for s in METADATA_JSON["PROD_SERVICES"] + METADATA_JSON["DEV_SERVICES"]
to_service_code(s): s
for s in METADATA_JSON["DEV_SERVICES"] + METADATA_JSON["PROD_SERVICES"]
}.values()
}


ShippingService = lib.StrEnum(
"ShippingService",
{
to_service_code(service): service["name"]
to_service_code(service): to_service_code(service)
for service in ESHIPPER_SERVICE_METADATA.values()
},
)
Expand Down
6 changes: 3 additions & 3 deletions plugins/eshipper/tests/eshipper/test_rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,14 @@ def test_parse_rate_response(self):
{"amount": 6.01, "currency": "CAD", "name": "HST"},
],
"meta": {
"eshipper_carrier_id": 6,
"eshipper_carrier_id": 45,
"eshipper_carrier_name": "Canpar",
"eshipper_service_id": 5000184,
"eshipper_service_name": "Ground",
"rate_provider": "canpar",
"service_name": "eshipper_ups_ground",
"service_name": "eshipper_canpar_ground",
},
"service": "eshipper_ups_ground",
"service": "eshipper_canpar_ground",
"total_charge": 52.23,
"transit_days": 1,
},
Expand Down