--- id: 036 title: Add CSE SOAP delivery provider adapter status: TODO created: 2026-05-30 --- ## Context Нужен второй провайдер доставки CSE (система «Карго»). CSE предоставляет SOAP/1C web-сервис (namespace `http://www.cargo3.ru`, endpoint `Web1C.1cws`), авторизация — `login`/`password` строковыми параметрами в теле запроса. Данные передаются универсальными структурами `Element`/`Row`; справочные значения — GUID. Спецификация методов: `Calc` (расчёт стоимости) и `SaveDocuments` (регистрация заказа). Поллинг статуса и получение PDF в этой задаче не реализуются. ## Goal Реализовать adapter-пакет CSE: SOAP-транспорт и сериализация `Element`, `CSEClient` с методами `calc()`/`save_order()`, мапперы расчёта и регистрации, и `CSEProvider`, реализующий контракт `DeliveryProvider` плюс расчёт цены для валидации платежа и регистрацию заказа. ## Constraints - Только Adapter layer; без business decisions, фильтрации и сортировки. - Весь XML/HTTP IO инкапсулирован в пакете `cse/`. - Параметры CSE (`base_url`, `login`, `password`, retry policy, timeout, cache TTL) приходят из секции `adapter` YAML-конфига; запрещён хардкод credentials. - Ошибки CSE (`Properties.Error` → `List[Description]`) маппятся в иерархию `ProviderClientError`/`ProviderRequestError`. - Валюта `RUR` нормализуется в `RUB`; цена — `Decimal` в рублях. - Не изменять файлы в `spec/`. ## Acceptance criteria - Существует пакет `app/adapters/delivery_providers/cse/` с SOAP-сериализацией, клиентом, мапперами и `CSEProvider` (`name = "cse"`). - `CSEProvider.get_prices` возвращает унифицированные `DeliveryPrice` из ответа `Calc` с `provider="cse"` и строковым `tariff_code` (GUID). - `CSEProvider.get_payment_price` возвращает выбранный тариф для валидации платежа. - `CSEProvider.register_order` выполняет `SaveDocuments` (`DocumentType=Order`) и возвращает результат регистрации с номером документа. - Адаптер использует значения из секции `adapter` YAML-конфига, включая `cse_timeout_seconds` и `cse_cache_ttl_seconds`. - Добавлены поля `cse_*` в `AdapterConfig` и шаблоны конфигов. ## Definition of Done - [ ] Реализованы `soap`, `client`, `errors`, `mapper`, `order_mapper`, `CSEProvider`. - [ ] Добавлены `cse_*` поля в `AdapterConfig`, `config.template.yaml`, `config.test.yaml`. - [ ] Adapter unit-тесты покрывают сериализацию/парсинг, mapping `Calc`/`SaveDocuments` и обработку ошибок. ## Tests - Unit-тесты SOAP-сериализации и парсинга `Element`. - Unit-тесты мапперов на XML-примерах из спецификации. - Тесты применения параметров CSE из секции `adapter`. - Для внешних HTTP взаимодействий использовать stubs/mocks. ## Commands - `poetry run pytest tests/adapters/delivery_providers/cse -q`