From c95b6210a70b6e7cb18fd27126c55520e0cff487 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, 4 Apr 2026 23:13:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=D0=B0=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + spec/index.md | 7 +-- spec/overview.md | 1 - .../019_add_cdek_order_creation_endpoint.md | 2 +- ...move_company_from_create_delivery_order.md | 51 +++++++++++++++++++ 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 spec/tasks/025_remove_company_from_create_delivery_order.md diff --git a/.gitignore b/.gitignore index 261f755..7de30f4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__ http-client.private.env.json scripts +.codex diff --git a/spec/index.md b/spec/index.md index 9b073f0..6b6a426 100644 --- a/spec/index.md +++ b/spec/index.md @@ -25,15 +25,16 @@ | 016 | DONE | 2026-03-14 | Add CDEK order registration adapter | `spec/tasks/016_add_cdek_order_registration_adapter.md` | | 017 | DONE | 2026-03-14 | Return all tariffs from CDEK price calculation | `spec/tasks/017_return_all_cdek_tariffs.md` | | 018 | DONE | 2026-03-16 | Add optional parcel type filter to price request | `spec/tasks/018_add_optional_parcel_type_filter_to_price_request.md` | -| 019 | TODO | 2026-03-14 | Add CDEK order creation endpoint | `spec/tasks/019_add_cdek_order_creation_endpoint.md` | +| 019 | DONE | 2026-03-14 | Add CDEK order creation endpoint | `spec/tasks/019_add_cdek_order_creation_endpoint.md` | | 020 | DONE | 2026-03-21 | Rename price request model and use cities_map for CDEK codes | `spec/tasks/020_rename_price_request_model_and_use_cities_map_for_cdek_codes.md` | | 021 | DONE | 2026-03-25 | Add address suggestion adapter and country provider mapping | `spec/tasks/021_add_address_suggestion_adapter_and_country_mapping.md` | | 022 | DONE | 2026-03-25 | Add address suggestion endpoint | `spec/tasks/022_add_address_suggestion_endpoint.md` | | 023 | DONE | 2026-03-29 | Add Yandex Geosuggest address suggestion adapter and CIS routing | `spec/tasks/023_add_yandex_geosuggest_address_suggestion_adapter.md` | | 024 | DONE | 2026-03-29 | Add TomTom address suggestion adapter and Europe routing | `spec/tasks/024_add_tomtom_address_suggestion_adapter.md` | +| 025 | TODO | 2026-04-03 | Remove company from Create Delivery Order parties | `spec/tasks/025_remove_company_from_create_delivery_order.md` | ## Summary -- Total: **25** +- Total: **26** - TODO: **1** -- DONE: **24** +- DONE: **25** diff --git a/spec/overview.md b/spec/overview.md index 22380bd..0ce768a 100644 --- a/spec/overview.md +++ b/spec/overview.md @@ -171,7 +171,6 @@ type: Literal[2] tariff_code: Literal[535] comment: str | None sender: - company: str | None name: str email: str phones: list[{number: str}] diff --git a/spec/tasks/019_add_cdek_order_creation_endpoint.md b/spec/tasks/019_add_cdek_order_creation_endpoint.md index 1be370b..fb5fe3a 100644 --- a/spec/tasks/019_add_cdek_order_creation_endpoint.md +++ b/spec/tasks/019_add_cdek_order_creation_endpoint.md @@ -1,7 +1,7 @@ --- id: 019 title: Add CDEK order creation endpoint -status: TODO +status: DONE created: 2026-03-14 --- diff --git a/spec/tasks/025_remove_company_from_create_delivery_order.md b/spec/tasks/025_remove_company_from_create_delivery_order.md new file mode 100644 index 0000000..acbaa06 --- /dev/null +++ b/spec/tasks/025_remove_company_from_create_delivery_order.md @@ -0,0 +1,51 @@ +--- +id: 025 +title: Remove company from Create Delivery Order parties +status: TODO +created: 2026-04-03 +--- + +## Context +Текущий контракт `POST /api/v1/delivery/order` допускает поле `company` в `sender`, потому что order party schema используется и для `sender`, и для `recipient`. Новый сценарий требует упростить Create Delivery Order payload: поля `sender.company` и `recipient.company` больше не должны приниматься и не должны отправляться в CDEK. + +## Goal +Удалить `company` из request contract Create Delivery Order на уровне schema validation, controller/API contract и CDEK order registration payload без изменения endpoint path, service orchestration и response model. + +## Constraints +- Изменения ограничены существующими модулями order flow: `app/schemas/order.py`, `app/controllers/v1/delivery.py`, `app/services/aggregator.py`, `app/adapters/delivery_providers/cdek/` и связанными тестами; не создавать новые controller/service модули. +- `POST /api/v1/delivery/order` должен оставаться в существующем controller и по-прежнему вызывать ровно один метод Service: `AggregatorService.create_order()`. +- Service не должен получать новую business logic; orchestration order flow должна остаться прежней. +- Поля `sender.company` и `recipient.company` должны отсутствовать в публичном request contract и не должны сериализоваться в payload, отправляемый в CDEK. +- Payload, содержащий `sender.company` или `recipient.company`, должен считаться невалидным и отклоняться schema validation с HTTP 422. +- `from_location.address` и `to_location.address` остаются opaque input strings; не добавлять address suggestion lookup, нормализацию адреса или иные изменения order flow. +- Scope задачи не включает изменение response contract, price flow, address suggestion flow, provider routing, кеширование, новые провайдеры и расширение поддерживаемых `type`/`tariff_code`. +- Обновить пример контракта Create Delivery Order в `http-client.http`, чтобы он не содержал `company`. +- Не изменять файлы в `spec/`. + +## Acceptance criteria +- `OrderCreateRequest` больше не содержит поле `company` ни для `sender`, ни для `recipient`. +- `POST /api/v1/delivery/order` успешно принимает прежний payload без `company` и не требует никаких новых полей. +- Если request payload содержит `sender.company` или `recipient.company`, endpoint возвращает 422 на уровне schema validation. +- `AggregatorService.create_order()` продолжает только оркестрировать вызов injected order adapter без новой business logic. +- CDEK adapter отправляет JSON payload для регистрации заказа без поля `company`. +- `http-client.http` содержит актуальный пример регистрации заказа без `company`. +- Service, controller/API и adapter tests покрывают success case после удаления поля и rejection scenario для `company`. + +## Definition of Done +- [ ] Обновлён order request contract без поля `company` для `sender` и `recipient`. +- [ ] Schema validation отклоняет `sender.company` и `recipient.company`. +- [ ] CDEK order registration payload больше не содержит `company`. +- [ ] Обновлены order flow tests для service, controller/API и adapter layers. +- [ ] Обновлён пример Create Delivery Order в `http-client.http`. + +## Tests +- Обновить `tests/services/test_order.py`, убрав `company` из валидных fixture payloads и сохранив проверку service orchestration. +- Обновить `tests/controllers/v1/test_order.py` для success case без `company` и добавить сценарий 422 при передаче `sender.company` и `recipient.company`. +- Обновить `tests/adapters/delivery_providers/cdek/test_order_client.py`, чтобы проверить отсутствие `company` в отправляемом CDEK payload. +- При необходимости обновить другие order-related tests, завязанные на старый request contract. + +## Commands +- `poetry run pytest tests/services/test_order.py -q` +- `poetry run pytest tests/controllers/v1/test_order.py -q` +- `poetry run pytest tests/adapters/delivery_providers/cdek/test_order_client.py -q` +- `python3 spec/gen_spec_index.py --check`