diff --git a/app/adapters/delivery_providers/cdek/order_mapper.py b/app/adapters/delivery_providers/cdek/order_mapper.py index 322a18d..8b3320f 100644 --- a/app/adapters/delivery_providers/cdek/order_mapper.py +++ b/app/adapters/delivery_providers/cdek/order_mapper.py @@ -126,7 +126,9 @@ def map_cdek_order_info_response(payload: dict[str, Any]) -> CDEKOrderInfo: "CDEK order info response must include entity.uuid." ) - status_code = _latest_status_code(entity.get("statuses")) + status_code = _invalid_create_request_status( + payload.get("requests") + ) or _latest_status_code(entity.get("statuses")) waybill_uuid, _ = _extract_waybill(payload) return CDEKOrderInfo( order_uuid=order_uuid, @@ -172,6 +174,20 @@ def _latest_status_code(statuses: object) -> str | None: return dated[-1][1] +def _invalid_create_request_status(requests: object) -> str | None: + if not isinstance(requests, list): + return None + for entry in requests: + if not isinstance(entry, dict): + continue + if entry.get("type") != "CREATE" or entry.get("state") != "INVALID": + continue + errors = entry.get("errors") + if isinstance(errors, list) and errors: + return "INVALID" + return None + + def _extract_waybill(payload: dict[str, Any]) -> tuple[str | None, str | None]: entity = payload.get("entity") related_entities = ( @@ -306,16 +322,6 @@ def _map_package(request: InitPaymentRequest, order_uuid: str) -> dict[str, Any] "number": order_uuid, "weight": weight_grams, "comment": description, - "items": [ - { - "name": description, - "ware_key": order_uuid, - "payment": {"value": 0}, - "cost": request.content.declared_value, - "amount": 1, - "weight": weight_grams, - } - ], } if system_data.parcel_type == "parcel" and system_data.dimensions is not None: package.update(_map_dimensions(system_data.dimensions)) diff --git a/tests/adapters/delivery_providers/cdek/test_order_mapper.py b/tests/adapters/delivery_providers/cdek/test_order_mapper.py index e3d57e9..3aea988 100644 --- a/tests/adapters/delivery_providers/cdek/test_order_mapper.py +++ b/tests/adapters/delivery_providers/cdek/test_order_mapper.py @@ -198,21 +198,12 @@ def test_order_payload_includes_company_requisites_for_legal_entity() -> None: assert sender["kpp"] == "770701001" -def test_order_payload_maps_content_to_comments_and_declared_value_item() -> None: +def test_order_payload_maps_content_to_comments_without_items() -> None: payload = map_cdek_order_request(make_init_payment_request(), "order-uuid-1") assert payload["comment"] == "Headphones" assert payload["packages"][0]["comment"] == "Headphones" - assert payload["packages"][0]["items"] == [ - { - "name": "Headphones", - "ware_key": "order-uuid-1", - "payment": {"value": 0}, - "cost": 50000, - "amount": 1, - "weight": 1000, - } - ] + assert "items" not in payload["packages"][0] def test_order_payload_falls_back_package_comment_to_order_uuid() -> None: @@ -224,7 +215,7 @@ def test_order_payload_falls_back_package_comment_to_order_uuid() -> None: ) assert payload["packages"][0]["comment"] == "order-uuid-1" - assert payload["packages"][0]["items"][0]["name"] == "order-uuid-1" + assert "items" not in payload["packages"][0] def test_order_payload_includes_company_for_individual_sender_as_full_name() -> None: @@ -285,6 +276,37 @@ def test_map_cdek_order_info_response_returns_none_status_when_statuses_empty() ) +def test_map_cdek_order_info_response_maps_invalid_create_request_to_invalid_status() -> None: + result = map_cdek_order_info_response( + { + "entity": { + "uuid": "cdek-order-uuid", + "statuses": [ + {"code": "ACCEPTED", "date_time": "2026-05-24T10:00:00+0000"} + ], + }, + "requests": [ + { + "type": "CREATE", + "state": "INVALID", + "errors": [ + { + "code": "ve_delivery_can_not_has_goods", + "message": "Заказ типа доставка не может содержать товары", + } + ], + } + ], + } + ) + + assert result == CDEKOrderInfo( + order_uuid="cdek-order-uuid", + status_code="INVALID", + waybill_uuid=None, + ) + + def test_map_cdek_order_info_response_raises_for_missing_entity() -> None: with pytest.raises(CDEKOrderMappingError): map_cdek_order_info_response({"requests": []})