@@ -3,6 +3,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import binascii
|
import binascii
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from app.adapters.delivery_providers.cse.constants import (
|
from app.adapters.delivery_providers.cse.constants import (
|
||||||
resolve_cse_geography,
|
resolve_cse_geography,
|
||||||
@@ -14,6 +15,8 @@ from app.schemas.payment import Address, InitPaymentRequest
|
|||||||
from app.schemas.request import DeliveryCalculationRequest
|
from app.schemas.request import DeliveryCalculationRequest
|
||||||
|
|
||||||
_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
|
_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
|
||||||
|
_INTERVAL_END_HOUR = 18
|
||||||
|
_MIN_INTERVAL_HOURS = 1
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
@@ -118,12 +121,12 @@ def map_cse_save_order_request(
|
|||||||
params: CSEOrderRegistrationParams,
|
params: CSEOrderRegistrationParams,
|
||||||
) -> dict[str, Element]:
|
) -> dict[str, Element]:
|
||||||
system_data = request.system_data
|
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)
|
delivery_type, _, urgency = split_tariff_code(system_data.tariff.tariff_code)
|
||||||
|
|
||||||
fields = [
|
fields = [
|
||||||
make_field("TakeDate", take_date, "dateTime"),
|
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("Sender", request.sender_contact.full_name),
|
||||||
make_field(
|
make_field(
|
||||||
"SenderGeography",
|
"SenderGeography",
|
||||||
@@ -151,13 +154,15 @@ def map_cse_save_order_request(
|
|||||||
fields.append(make_field("DeliveryOfCargo", delivery_type))
|
fields.append(make_field("DeliveryOfCargo", delivery_type))
|
||||||
|
|
||||||
if request.delivery_date is not None:
|
if request.delivery_date is not None:
|
||||||
|
delivery_date, delivery_date_of = _datetime_interval(request.delivery_date)
|
||||||
fields.append(
|
fields.append(
|
||||||
make_field(
|
make_field(
|
||||||
"DeliveryDate",
|
"DeliveryDate",
|
||||||
request.delivery_date.strftime(_DATETIME_FORMAT),
|
delivery_date,
|
||||||
"dateTime",
|
"dateTime",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
fields.append(make_field("DeliveryDateOf", delivery_date_of, "dateTime"))
|
||||||
if request.content.description:
|
if request.content.description:
|
||||||
fields.append(make_field("CargoDescription", request.content.description))
|
fields.append(make_field("CargoDescription", request.content.description))
|
||||||
fields.append(make_field("Comment", 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:
|
def map_cse_save_order_response(root: Element) -> CSEOrderRegistrationResult:
|
||||||
for document in root.items:
|
for document in root.items:
|
||||||
number = document.property_value("Number")
|
number = document.property_value("Number")
|
||||||
|
|||||||
@@ -656,6 +656,32 @@ def test_save_order_request_uses_selected_tariff_urgency() -> None:
|
|||||||
assert order.field_value("CargoCost") == "50000"
|
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:
|
def test_application_error_in_response_raises_request_error() -> None:
|
||||||
client, _ = _build_client(
|
client, _ = _build_client(
|
||||||
[
|
[
|
||||||
|
|||||||
Reference in New Issue
Block a user