From c942885abe4d5da376d8b5fee6e89d9324f8e384 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 22:41:10 +0300 Subject: [PATCH] fix pickup date --- .../delivery_providers/cse/order_mapper.py | 23 +++++++++++++--- .../cse/test_cse_adapter.py | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/adapters/delivery_providers/cse/order_mapper.py b/app/adapters/delivery_providers/cse/order_mapper.py index 7567bdb..4680262 100644 --- a/app/adapters/delivery_providers/cse/order_mapper.py +++ b/app/adapters/delivery_providers/cse/order_mapper.py @@ -3,6 +3,7 @@ import base64 import binascii from dataclasses import dataclass +from datetime import datetime, timedelta from app.adapters.delivery_providers.cse.constants import ( resolve_cse_geography, @@ -14,6 +15,8 @@ from app.schemas.payment import Address, InitPaymentRequest from app.schemas.request import DeliveryCalculationRequest _DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S" +_INTERVAL_END_HOUR = 18 +_MIN_INTERVAL_HOURS = 1 @dataclass(frozen=True) @@ -118,12 +121,12 @@ def map_cse_save_order_request( params: CSEOrderRegistrationParams, ) -> dict[str, Element]: system_data = request.system_data - take_date = request.pickup_date.strftime(_DATETIME_FORMAT) + take_date, take_date_of = _datetime_interval(request.pickup_date) delivery_type, _, urgency = split_tariff_code(system_data.tariff.tariff_code) fields = [ make_field("TakeDate", take_date, "dateTime"), - make_field("TakeDateOf", take_date, "dateTime"), + make_field("TakeDateOf", take_date_of, "dateTime"), make_field("Sender", request.sender_contact.full_name), make_field( "SenderGeography", @@ -151,13 +154,15 @@ def map_cse_save_order_request( fields.append(make_field("DeliveryOfCargo", delivery_type)) if request.delivery_date is not None: + delivery_date, delivery_date_of = _datetime_interval(request.delivery_date) fields.append( make_field( "DeliveryDate", - request.delivery_date.strftime(_DATETIME_FORMAT), + delivery_date, "dateTime", ) ) + fields.append(make_field("DeliveryDateOf", delivery_date_of, "dateTime")) if request.content.description: fields.append(make_field("CargoDescription", request.content.description)) fields.append(make_field("Comment", request.content.description)) @@ -186,6 +191,18 @@ def map_cse_save_order_request( } +def _datetime_interval(value: datetime) -> tuple[str, str]: + interval_end = value.replace( + hour=_INTERVAL_END_HOUR, + minute=0, + second=0, + microsecond=0, + ) + if interval_end <= value: + interval_end = value + timedelta(hours=_MIN_INTERVAL_HOURS) + return value.strftime(_DATETIME_FORMAT), interval_end.strftime(_DATETIME_FORMAT) + + def map_cse_save_order_response(root: Element) -> CSEOrderRegistrationResult: for document in root.items: number = document.property_value("Number") diff --git a/tests/adapters/delivery_providers/cse/test_cse_adapter.py b/tests/adapters/delivery_providers/cse/test_cse_adapter.py index a20a709..5dcc8d3 100644 --- a/tests/adapters/delivery_providers/cse/test_cse_adapter.py +++ b/tests/adapters/delivery_providers/cse/test_cse_adapter.py @@ -656,6 +656,32 @@ def test_save_order_request_uses_selected_tariff_urgency() -> None: assert order.field_value("CargoCost") == "50000" +def test_save_order_request_sends_pickup_and_delivery_intervals() -> None: + request = make_init_payment_request( + systemData={ + "tariff": { + "provider": "cse", + "serviceName": "Экспресс", + "price": 200000, + "deliveryDaysMin": 1, + "deliveryDaysMax": 2, + "tariffCode": "ДоставкаДоДверей|tariff-guid-2|urg-exp", + }, + "parcelType": "parcel", + "weight": "1.0", + "dimensions": {"length": "10", "width": "10", "height": "10"}, + } + ) + + body = order_mapper.map_cse_save_order_request(request, "order-uuid-1", _params()) + order = body["data"].items[0] + + assert order.field_value("TakeDate") == "2026-05-15T10:00:00" + assert order.field_value("TakeDateOf") == "2026-05-15T18:00:00" + assert order.field_value("DeliveryDate") == "2026-05-18T18:00:00" + assert order.field_value("DeliveryDateOf") == "2026-05-18T19:00:00" + + def test_application_error_in_response_raises_request_error() -> None: client, _ = _build_client( [