From e4d9b581a6f8b48374bab118ed97a750b1dbcc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B0=D0=B8=D1=81=20=D0=AE=D1=81=D1=83=D0=BF=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B5=D0=B2?= Date: Sat, 27 Jun 2026 16:45:58 +0300 Subject: [PATCH] =?UTF-8?q?fix=20=D0=BA=D1=81=D0=B5=20prices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/adapters/delivery_providers/cse/mapper.py | 14 +++- .../cse/test_cse_adapter.py | 84 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/app/adapters/delivery_providers/cse/mapper.py b/app/adapters/delivery_providers/cse/mapper.py index a20085a..7eb5d27 100644 --- a/app/adapters/delivery_providers/cse/mapper.py +++ b/app/adapters/delivery_providers/cse/mapper.py @@ -40,7 +40,9 @@ def map_cse_calc_response_for_tariff_code( delivery_type, _, urgency = tariff_code.partition("|") for tariff in _iter_tariffs(root): if _tariff_urgency(tariff) == urgency: - return _map_tariff(tariff, delivery_type, delivery_type_label) + price = _map_tariff(tariff, delivery_type, delivery_type_label) + if price is not None: + return price return None @@ -62,6 +64,9 @@ def _map_tariff( delivery_type: str, delivery_type_label: str, ) -> DeliveryPrice | None: + if _is_additional_service_tariff(tariff): + return None + urgency = _tariff_urgency(tariff) if not urgency: return None @@ -111,6 +116,13 @@ def _map_tariff( raise CSEMappingError("CSE tariff fields have invalid values.") from exc +def _is_additional_service_tariff(tariff: Element) -> bool: + value = tariff.field_value("AdditionalService") + if value is None: + return False + return value.strip().lower() == "true" + + def _to_int(value: str | None) -> int | None: if value is None or value == "": return None diff --git a/tests/adapters/delivery_providers/cse/test_cse_adapter.py b/tests/adapters/delivery_providers/cse/test_cse_adapter.py index 1fe416b..e845813 100644 --- a/tests/adapters/delivery_providers/cse/test_cse_adapter.py +++ b/tests/adapters/delivery_providers/cse/test_cse_adapter.py @@ -126,6 +126,46 @@ _FORM_RESPONSE = """ """ +_CALC_RESPONSE_WITH_ADDITIONAL_SERVICE_FIRST = """ + + + + + Calc + + Destination + + Tariff + additional-service-guid + Total100.00 + CurrencyNameRUR + + ServiceДоп. услуга + + Urgencyurg-exp + + AdditionalServicetrue + + + + Tariff + delivery-guid + Total793.00 + CurrencyNameRUR + ServiceЭкспресс + Urgencyurg-exp + + AdditionalServicefalse + + MinPeriod1 + MaxPeriod2 + + + + + +""" + _ERROR_RESPONSE = """ @@ -296,6 +336,50 @@ def test_provider_get_payment_price_selects_matching_tariff() -> None: assert price.price == Decimal("2000.00") +def test_provider_get_payment_price_ignores_matching_additional_service() -> None: + response = httpx.Response(200, text=_CALC_RESPONSE_WITH_ADDITIONAL_SERVICE_FIRST) + client, _ = _build_client([response]) + provider = CSEProvider(client) + request = make_init_payment_request( + systemData={ + "tariff": { + "provider": "cse", + "serviceName": "Экспресс", + "price": 79300, + "deliveryDaysMin": 1, + "deliveryDaysMax": 2, + "tariffCode": "ДоставкаДоДверей|urg-exp", + }, + "parcelType": "parcel", + "weight": "1.0", + "dimensions": {"length": "10", "width": "10", "height": "10"}, + } + ) + + price = asyncio.run(provider.get_payment_price(request)) + + assert price is not None + assert price.tariff_code == "ДоставкаДоДверей|urg-exp" + assert price.price == Decimal("793.00") + + +def test_provider_get_prices_excludes_additional_service_tariffs() -> None: + client, _ = _build_client( + [ + httpx.Response(200, text=_DELIVERY_TYPES_RESPONSE), + httpx.Response(200, text=_CALC_RESPONSE_WITH_ADDITIONAL_SERVICE_FIRST), + ] + ) + provider = CSEProvider(client) + + prices = asyncio.run(provider.get_prices(_calc_request())) + + assert [price.price for price in prices] == [Decimal("793.00")] + assert [price.service_name for price in prices] == [ + "Экспресс — Дверь-Дверь" + ] + + def test_provider_register_order_returns_document_number() -> None: response = httpx.Response(200, text=_SAVE_RESPONSE) client, http_client = _build_client([response])