@@ -8,7 +8,7 @@ from app.adapters.delivery_providers.cse.constants import (
|
||||
resolve_cse_geography,
|
||||
resolve_type_of_cargo,
|
||||
)
|
||||
from app.adapters.delivery_providers.cse.errors import CSEMappingError
|
||||
from app.adapters.delivery_providers.cse.errors import CSEMappingError, CSERequestError
|
||||
from app.adapters.delivery_providers.cse.soap import Element, make_field
|
||||
from app.schemas.payment import Address, InitPaymentRequest
|
||||
from app.schemas.request import DeliveryCalculationRequest
|
||||
@@ -44,6 +44,7 @@ class CSEOrderInfo:
|
||||
def build_calc_body_for_calculation(
|
||||
request: DeliveryCalculationRequest,
|
||||
delivery_type: str = "",
|
||||
service_guid: str | None = None,
|
||||
) -> dict[str, Element]:
|
||||
fields = [
|
||||
make_field("SenderGeography", resolve_cse_geography(request.from_city)),
|
||||
@@ -53,12 +54,15 @@ def build_calc_body_for_calculation(
|
||||
make_field("Qty", "1", "int"),
|
||||
]
|
||||
_append_delivery_type(fields, delivery_type)
|
||||
if service_guid:
|
||||
fields.append(make_field("Service", service_guid))
|
||||
return _calc_body(Element(key="Destination", fields=fields))
|
||||
|
||||
|
||||
def build_calc_body_for_payment(
|
||||
request: InitPaymentRequest,
|
||||
delivery_type: str = "",
|
||||
service_guid: str | None = None,
|
||||
) -> dict[str, Element]:
|
||||
system_data = request.system_data
|
||||
fields = [
|
||||
@@ -75,6 +79,8 @@ def build_calc_body_for_payment(
|
||||
make_field("Qty", "1", "int"),
|
||||
]
|
||||
_append_delivery_type(fields, delivery_type)
|
||||
if service_guid:
|
||||
fields.append(make_field("Service", service_guid))
|
||||
return _calc_body(Element(key="Destination", fields=fields))
|
||||
|
||||
|
||||
@@ -83,14 +89,17 @@ def _append_delivery_type(fields: list[Element], delivery_type: str) -> None:
|
||||
fields.append(make_field("DeliveryType", delivery_type))
|
||||
|
||||
|
||||
def split_tariff_code(tariff_code: str) -> tuple[str, str]:
|
||||
"""Split the CSE ``tariff_code`` into (delivery_type, urgency).
|
||||
def split_tariff_code(tariff_code: str) -> tuple[str, str, str]:
|
||||
"""Split the CSE ``tariff_code`` into delivery type, service GUID, urgency.
|
||||
|
||||
The unified tariff_code encodes both dimensions as ``"<DeliveryType>|<Urgency>"``.
|
||||
The expected format is ``"<DeliveryType>|<ServiceGuid>|<Urgency>"``.
|
||||
``DeliveryType`` may be empty when CSE contract defaults are used.
|
||||
"""
|
||||
|
||||
delivery_type, _, urgency = tariff_code.partition("|")
|
||||
return delivery_type, urgency
|
||||
parts = tariff_code.split("|")
|
||||
if len(parts) != 3 or not parts[1] or not parts[2]:
|
||||
raise CSERequestError("CSE tariff_code has invalid format.")
|
||||
return parts[0], parts[1], parts[2]
|
||||
|
||||
|
||||
def _calc_body(destination: Element) -> dict[str, Element]:
|
||||
@@ -110,7 +119,7 @@ def map_cse_save_order_request(
|
||||
) -> dict[str, Element]:
|
||||
system_data = request.system_data
|
||||
take_date = request.pickup_date.strftime(_DATETIME_FORMAT)
|
||||
delivery_type, urgency = split_tariff_code(system_data.tariff.tariff_code)
|
||||
delivery_type, _, urgency = split_tariff_code(system_data.tariff.tariff_code)
|
||||
|
||||
fields = [
|
||||
make_field("TakeDate", take_date, "dateTime"),
|
||||
|
||||
Reference in New Issue
Block a user