Добавлен заказ накладной
This commit is contained in:
@@ -20,9 +20,13 @@ from app.adapters.delivery_providers.cdek.mapper import (
|
||||
)
|
||||
from app.adapters.delivery_providers.cdek.order_mapper import (
|
||||
CDEKOrderMappingError,
|
||||
CDEKOrderRegistrationResult,
|
||||
centimeters_string_to_int,
|
||||
kilograms_string_to_grams,
|
||||
map_cdek_existing_order_response,
|
||||
map_cdek_order_request,
|
||||
map_cdek_order_response,
|
||||
resolve_cdek_city_code,
|
||||
)
|
||||
from app.cities import cities_map
|
||||
from app.config import AdapterConfig
|
||||
@@ -143,7 +147,9 @@ class CDEKClient:
|
||||
|
||||
raise CDEKClientError("CDEK tariff request failed unexpectedly.")
|
||||
|
||||
async def register_order(self, request: InitPaymentRequest) -> str:
|
||||
async def register_order(
|
||||
self, request: InitPaymentRequest
|
||||
) -> CDEKOrderRegistrationResult:
|
||||
payload = map_cdek_order_request(request)
|
||||
for attempt in range(self._retry_attempts + 1):
|
||||
try:
|
||||
@@ -172,11 +178,17 @@ class CDEKClient:
|
||||
)
|
||||
|
||||
if 400 <= response.status_code < 500:
|
||||
existing_order_uuid = map_cdek_existing_order_response(
|
||||
_response_json_or_none(response)
|
||||
response_payload = _response_json_or_none(response)
|
||||
existing_result = map_cdek_existing_order_response(response_payload)
|
||||
if existing_result is not None:
|
||||
return existing_result
|
||||
log.warning(
|
||||
"cdek_order_register_rejected",
|
||||
status_code=response.status_code,
|
||||
request_payload=payload,
|
||||
response_payload=response_payload,
|
||||
response_body=_response_text_or_none(response),
|
||||
)
|
||||
if existing_order_uuid is not None:
|
||||
return existing_order_uuid
|
||||
raise CDEKRequestError(
|
||||
"CDEK order registration request was rejected with status "
|
||||
f"{response.status_code}."
|
||||
@@ -195,6 +207,12 @@ class CDEKClient:
|
||||
"CDEK order registration payload must be a JSON object."
|
||||
)
|
||||
|
||||
log.info(
|
||||
"cdek_order_register_raw_response",
|
||||
status_code=response.status_code,
|
||||
response_payload=raw_payload,
|
||||
)
|
||||
|
||||
try:
|
||||
return map_cdek_order_response(raw_payload)
|
||||
except CDEKOrderMappingError as exc:
|
||||
@@ -234,25 +252,29 @@ class CDEKClient:
|
||||
def _build_payment_price_payload(
|
||||
request: InitPaymentRequest,
|
||||
) -> dict[str, Any]:
|
||||
payload: dict[str, Any] = {
|
||||
"type": request.type,
|
||||
"from_location": request.from_location.model_dump(mode="python"),
|
||||
"to_location": request.to_location.model_dump(mode="python"),
|
||||
"packages": [
|
||||
{
|
||||
"weight": package.weight * 1000,
|
||||
"length": package.length,
|
||||
"width": package.width,
|
||||
"height": package.height,
|
||||
}
|
||||
for package in request.packages
|
||||
],
|
||||
try:
|
||||
from_code = resolve_cdek_city_code(request.sender_address.city_id)
|
||||
to_code = resolve_cdek_city_code(request.receiver_address.city_id)
|
||||
weight_grams = kilograms_string_to_grams(request.system_data.weight)
|
||||
except CDEKOrderMappingError as exc:
|
||||
raise CDEKRequestError(str(exc)) from exc
|
||||
|
||||
package: dict[str, Any] = {"weight": weight_grams}
|
||||
dimensions = request.system_data.dimensions
|
||||
if request.system_data.parcel_type == "parcel" and dimensions is not None:
|
||||
try:
|
||||
package["length"] = centimeters_string_to_int(dimensions.length, "length")
|
||||
package["width"] = centimeters_string_to_int(dimensions.width, "width")
|
||||
package["height"] = centimeters_string_to_int(dimensions.height, "height")
|
||||
except CDEKOrderMappingError as exc:
|
||||
raise CDEKRequestError(str(exc)) from exc
|
||||
|
||||
return {
|
||||
"type": 2,
|
||||
"from_location": {"code": from_code},
|
||||
"to_location": {"code": to_code},
|
||||
"packages": [package],
|
||||
}
|
||||
if request.services is not None:
|
||||
payload["services"] = [
|
||||
service.model_dump(mode="python") for service in request.services
|
||||
]
|
||||
return payload
|
||||
|
||||
@staticmethod
|
||||
def _get_cdek_city_code(city_id: int) -> int:
|
||||
@@ -327,14 +349,16 @@ class CDEKProvider(DeliveryProvider):
|
||||
try:
|
||||
return map_cdek_response_for_tariff_code(
|
||||
raw_payload,
|
||||
tariff_code=request.tariff_code,
|
||||
tariff_code=request.system_data.tariff.tariff_code,
|
||||
)
|
||||
except CDEKMappingError as exc:
|
||||
raise CDEKClientError(
|
||||
"CDEK payment price validation response payload is invalid."
|
||||
) from exc
|
||||
|
||||
async def register_order(self, request: InitPaymentRequest) -> str:
|
||||
async def register_order(
|
||||
self, request: InitPaymentRequest
|
||||
) -> CDEKOrderRegistrationResult:
|
||||
return await self._client.register_order(request)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user