--- id: 002 title: Implement pure domain quote rules status: TODO created: 2026-03-07 --- ## Context `spec/overview.md` требует business rules для фильтрации тарифов, сравнения цен, сортировки и нормализации входных данных в чистом слое Business Logic. ## Goal Реализовать детерминированные, dependency-free domain functions в `app/domain/quotes.py` для нормализации запроса и фильтрации/упорядочивания котировок. ## Constraints - Business Logic должна быть pure и dependency-free. - Запрещены прямые IO, adapters, repositories, framework imports и внешние вызовы. - Слои Service и Controller не должны забирать domain rules из этой задачи. - Не изменять файлы в `spec/`. ## Acceptance criteria - Domain functions нормализуют значения запроса по явным детерминированным правилам. - Domain functions отфильтровывают невалидные котировки по определённым domain conditions. - Domain functions сортируют валидные котировки по возрастанию цены. - Логика реализована только в `app/domain/` и доступна для вызова из Service. ## Definition of Done - [ ] Реализованы pure domain functions для normalization/filtering/sorting. - [ ] Поведение функций детерминированное и без side effects. - [ ] В domain module нет импортов не-domain зависимостей. - [ ] Unit tests (без mocks) покрывают стандартные и edge cases. ## Tests - Добавить `tests/domain/test_quotes.py` только с unit tests. - Покрыть edge cases: пустой input, невалидные quotes, одинаковые цены, границы нормализации. ## Commands - `poetry run pytest tests/domain/test_quotes.py -q`