Конфликт в api/tests/integration/test_form_phases_api_smoke.py: оставлены
оба набора тестов (тесты фильтра по роли и 404 из этого PR и тест
aware-дат из test).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- FormPhaseRepository.get_list и Form3PhaseRepository.get_list: новый
необязательный параметр role для фильтрации по v3.role.code.
- FormPhaseService.get_list и Form3PhaseService.get_list: для не-админа
передают в репозиторий role по коду роли пользователя (единая функция
role_code_for_user в form_phase_service.py), для ADMIN фильтр не нужен.
- GET /stages/form/{form_id} и GET /stages/project/{project_id}: сначала
проверяют доступ к форме/проекту (BudgetFormService.get /
ProjectService.get_instance), при отсутствии доступа — 404 вместо
AttributeError → 500.
- StagesTable.jsx: подпись роли этапа показывается только админу.
Closes#250.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
asyncpg не принимает aware-datetime для CAST AS TIMESTAMP WITHOUT TIME ZONE (400).
Даты переводятся в пояс оргединицы и становятся naive, SQL приписывает тот же offset.
timezone_from_offset вынесен в src/core/timezones.py, добавлен to_org_local_naive.
Aware-дата при NULL utc_offset оргединицы даёт 422.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>