fix ксе tariffs
Deploy / deploy (push) Successful in 57s

This commit is contained in:
Раис Юсупалиев
2026-06-27 17:34:06 +03:00
parent e4d9b581a6
commit 4262b8a200
8 changed files with 207 additions and 34 deletions
@@ -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"),