@@ -306,6 +306,16 @@ def _map_package(request: InitPaymentRequest, order_uuid: str) -> dict[str, Any]
|
|||||||
"number": order_uuid,
|
"number": order_uuid,
|
||||||
"weight": weight_grams,
|
"weight": weight_grams,
|
||||||
"comment": description,
|
"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:
|
if system_data.parcel_type == "parcel" and system_data.dimensions is not None:
|
||||||
package.update(_map_dimensions(system_data.dimensions))
|
package.update(_map_dimensions(system_data.dimensions))
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ def map_cse_save_order_request(
|
|||||||
make_field("TypeOfCargo", resolve_type_of_cargo(system_data.parcel_type)),
|
make_field("TypeOfCargo", resolve_type_of_cargo(system_data.parcel_type)),
|
||||||
make_field("Weight", system_data.weight, "float"),
|
make_field("Weight", system_data.weight, "float"),
|
||||||
make_field("CargoPackageQty", "1", "float"),
|
make_field("CargoPackageQty", "1", "float"),
|
||||||
|
make_field("CargoCost", str(request.content.declared_value), "float"),
|
||||||
]
|
]
|
||||||
if delivery_type:
|
if delivery_type:
|
||||||
fields.append(make_field("DeliveryOfCargo", delivery_type))
|
fields.append(make_field("DeliveryOfCargo", delivery_type))
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ class Contact(_CamelModel):
|
|||||||
|
|
||||||
class Content(_CamelModel):
|
class Content(_CamelModel):
|
||||||
description: str | None = None
|
description: str | None = None
|
||||||
|
declared_value: int = Field(strict=True)
|
||||||
|
|
||||||
|
|
||||||
class SystemDataTariff(_CamelModel):
|
class SystemDataTariff(_CamelModel):
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ def test_order_payload_for_parcel_includes_dimensions() -> None:
|
|||||||
|
|
||||||
def test_order_payload_for_doc_omits_dimensions() -> None:
|
def test_order_payload_for_doc_omits_dimensions() -> None:
|
||||||
request = make_init_payment_request(
|
request = make_init_payment_request(
|
||||||
content={"description": "Docs"},
|
content={"description": "Docs", "declaredValue": 25000},
|
||||||
systemData={
|
systemData={
|
||||||
"tariff": {
|
"tariff": {
|
||||||
"provider": "СДЭК",
|
"provider": "СДЭК",
|
||||||
@@ -198,20 +198,33 @@ def test_order_payload_includes_company_requisites_for_legal_entity() -> None:
|
|||||||
assert sender["kpp"] == "770701001"
|
assert sender["kpp"] == "770701001"
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_propagates_description_to_comments_without_items() -> None:
|
def test_order_payload_maps_content_to_comments_and_declared_value_item() -> None:
|
||||||
payload = map_cdek_order_request(make_init_payment_request(), "order-uuid-1")
|
payload = map_cdek_order_request(make_init_payment_request(), "order-uuid-1")
|
||||||
|
|
||||||
assert payload["comment"] == "Headphones"
|
assert payload["comment"] == "Headphones"
|
||||||
assert payload["packages"][0]["comment"] == "Headphones"
|
assert payload["packages"][0]["comment"] == "Headphones"
|
||||||
assert "items" not in payload["packages"][0]
|
assert payload["packages"][0]["items"] == [
|
||||||
|
{
|
||||||
|
"name": "Headphones",
|
||||||
|
"ware_key": "order-uuid-1",
|
||||||
|
"payment": {"value": 0},
|
||||||
|
"cost": 50000,
|
||||||
|
"amount": 1,
|
||||||
|
"weight": 1000,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_falls_back_package_comment_to_order_uuid() -> None:
|
def test_order_payload_falls_back_package_comment_to_order_uuid() -> None:
|
||||||
payload = map_cdek_order_request(
|
payload = map_cdek_order_request(
|
||||||
make_init_payment_request(content={"description": None}), "order-uuid-1"
|
make_init_payment_request(
|
||||||
|
content={"description": None, "declaredValue": 50000}
|
||||||
|
),
|
||||||
|
"order-uuid-1",
|
||||||
)
|
)
|
||||||
|
|
||||||
assert payload["packages"][0]["comment"] == "order-uuid-1"
|
assert payload["packages"][0]["comment"] == "order-uuid-1"
|
||||||
|
assert payload["packages"][0]["items"][0]["name"] == "order-uuid-1"
|
||||||
|
|
||||||
|
|
||||||
def test_order_payload_includes_company_for_individual_sender_as_full_name() -> None:
|
def test_order_payload_includes_company_for_individual_sender_as_full_name() -> None:
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ def test_provider_get_payment_price_omits_dimensions_for_doc() -> None:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
request = make_init_payment_request(
|
request = make_init_payment_request(
|
||||||
content={"description": "Docs"},
|
content={"description": "Docs", "declaredValue": 25000},
|
||||||
systemData={
|
systemData={
|
||||||
"tariff": {
|
"tariff": {
|
||||||
"provider": "СДЭК",
|
"provider": "СДЭК",
|
||||||
|
|||||||
@@ -276,6 +276,7 @@ def test_save_order_request_uses_selected_tariff_urgency() -> None:
|
|||||||
assert order.field_value("DeliveryOfCargo") == "ДоставкаДоДверей"
|
assert order.field_value("DeliveryOfCargo") == "ДоставкаДоДверей"
|
||||||
assert order.field_value("Payer") == "payer-1"
|
assert order.field_value("Payer") == "payer-1"
|
||||||
assert order.field_value("ShippingMethod") == "sm-1"
|
assert order.field_value("ShippingMethod") == "sm-1"
|
||||||
|
assert order.field_value("CargoCost") == "50000"
|
||||||
|
|
||||||
|
|
||||||
def test_application_error_in_response_raises_request_error() -> None:
|
def test_application_error_in_response_raises_request_error() -> None:
|
||||||
|
|||||||
@@ -164,6 +164,32 @@ def test_post_init_payment_rejects_non_integer_price() -> None:
|
|||||||
assert service.calls == []
|
assert service.calls == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_post_init_payment_rejects_missing_declared_value() -> None:
|
||||||
|
service = StubAggregatorService(response=None)
|
||||||
|
app = create_app()
|
||||||
|
_install_service_override(app, service)
|
||||||
|
invalid_payload = make_init_payment_payload()
|
||||||
|
del invalid_payload["content"]["declaredValue"]
|
||||||
|
|
||||||
|
response = _post(app, invalid_payload)
|
||||||
|
|
||||||
|
assert response.status_code == 422
|
||||||
|
assert service.calls == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_post_init_payment_rejects_non_integer_declared_value() -> None:
|
||||||
|
service = StubAggregatorService(response=None)
|
||||||
|
app = create_app()
|
||||||
|
_install_service_override(app, service)
|
||||||
|
invalid_payload = make_init_payment_payload()
|
||||||
|
invalid_payload["content"]["declaredValue"] = "50000"
|
||||||
|
|
||||||
|
response = _post(app, invalid_payload)
|
||||||
|
|
||||||
|
assert response.status_code == 422
|
||||||
|
assert service.calls == []
|
||||||
|
|
||||||
|
|
||||||
def test_post_init_payment_requires_company_fields_when_is_company_true() -> None:
|
def test_post_init_payment_requires_company_fields_when_is_company_true() -> None:
|
||||||
service = StubAggregatorService(response=None)
|
service = StubAggregatorService(response=None)
|
||||||
app = create_app()
|
app = create_app()
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ def make_init_payment_payload(**overrides: Any) -> dict[str, Any]:
|
|||||||
},
|
},
|
||||||
"content": {
|
"content": {
|
||||||
"description": "Headphones",
|
"description": "Headphones",
|
||||||
|
"declaredValue": 50000,
|
||||||
},
|
},
|
||||||
"pickupDate": "2026-05-15T10:00:00.000Z",
|
"pickupDate": "2026-05-15T10:00:00.000Z",
|
||||||
"deliveryDate": "2026-05-18T18:00:00.000Z",
|
"deliveryDate": "2026-05-18T18:00:00.000Z",
|
||||||
|
|||||||
Reference in New Issue
Block a user