Домен, стек, слои, команды, тесты, базовая ветка test. .claude/code-paths: api/src/, api/alembic/, web/src/. Refs #198 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.6 KiB
DFiP_Budget_planing
Что это
Система бюджетного планирования ДФиП РСХБ (платформа raisa). Исполнители ССП и региональных филиалов (РФ) совместно, в реальном времени заполняют бюджетные формы (сметы) по листам, статьям расходов и кварталам. Что и когда может править каждая роль, задают этапы (окна редактирования колонок). ДФиП и ДУРРС корректируют (секвестр), администратор ведёт пользователей, оргструктуру, шаблоны этапов и журнал аудита. Поверх форм строятся своды 1 и 2, реестр проектов РФ (открытие, закрытие и переезд ВСП и т.п.) с отчётами по годам, справочник ВСП и фоновая выгрузка в Excel.
Формы (v3.form_type): FORM_1 «Смета ГО» (AHR/CAP/OPER/SMETA, AHR и CAP делятся по direction Support/Development), FORM_2 «ПД» (плюс сателлиты AHR_LIMIT/RENT/UTILITY/SECURITY, OTCH9F), FORM_3 «Отчёт РФ развитие» (хранится в project → rf_project_year → rf_project_report), FORM_4 «Смета РФ поддержка» (плюс STRUCTURE — программы и проекты). Названия на фронте (web/src/constants/constants.jsx) расходятся с БД, источник истины — БД.
Роли (api/src/db/models/role.py): 1 ADMIN; 2 EXECUTOR_DFIP (несколько ССП/РФ); 3 EXECUTOR_RF (одна оргединица); 4 EXECUTOR_DURRS.
Стек и ограничения
- Backend
api/: Python, FastAPI 0.111, SQLAlchemy 2 async + asyncpg, Alembic, pydantic-settings, JWT (python-jose, HS256) + argon2. - БД — только PostgreSQL, всё в схеме
v3. Бизнес-логика в основном в PL/pgSQL-функцияхv3.add_*/upd_*/del_*/v_*, их зовут черезtext("SELECT ... FROM v3.fn(...)")изapi/src/repository/. Функции живут вapi/alembic/versions/sql/*.sqlи переопределяютсяCREATE OR REPLACEв последующих миграциях: актуальна последняя версия. SQLite вDATABASE_URLпо умолчанию — ловушка, на нём приложение не работает. - Frontend
web/: React 18 на Rsbuild, JavaScript (JSX), хотя есть tsconfig. UI — MUI и material-react-table. Основная таблица — собственныйcomponents/RealtimeTable/. Состояние в React Context, роутинг react-router-dom 6, axios. Biome для линта. Tailwind/daisyui остались от шаблона и не используются. - Платформа raisa: обязателен
api/run_server.py; хост и порт изSERVER__HOST/SERVER__PORT. CI — внешний шаблонcicd/ci/fastapi-app.yml(.gitlab-ci.yml), ресурсы вraisa_config.yml. Собранный фронт отдаёт сам API изapi/web(StaticFiles). - Зависимости ставятся из корпоративного Nexus (
setup/pip.conf,setup/.npmrc).raisa-fastapi-protected-apiесть только там. - cwd процессов API, тестов и alembic —
api/: путиalembic.ini,.env,web,back_static,tmp/exportsотносительные. - Состояние WebSocket-блокировок ячеек и менеджер выгрузок живут в памяти процесса: один процесс, без нескольких воркеров.
- Настройки (
api/src/core/config.py):OPENBAO__SETTINGS__*или короткое имя (DATABASE_URL,DEBUG,DATABASE_SCHEMA).DEBUGпо умолчанию true. При false на старте выполняютсяalembic upgrade headи цикл чистки аудита.
Архитектура
Подробная карта — в ARCHITECTURE.md.
api/src/api/v1/— роутеры (/api/v1/...) иdeps.py(текущий пользователь, гардыrequire_admin/require_executor*).websocket.py— realtime-редактирование и блокировки ячеек.api/src/services/— сервисы*Service(db);export_service/— Excel-выгрузки в ProcessPool.api/src/repository/—*Repository(db): SQLAlchemy и вызовы SQL-функций. Текущий пользователь передаётся в SQL черезSET LOCAL app.user_id(для аудитаv3.log_event).api/src/db/models/— ORM (36 моделей),api/src/domain/schemas.py— pydantic-схемы,api/src/core/— конфиг, безопасность, ошибки.- Права на ячейки проверяет SQL (
role_not_allowed:,window_closed:).core/exception_handlers.pyпо тексту ошибки Postgres превращает их в 403/409/400/404/422. web/src/app/Routes.jsx— страницы,web/src/api/*.js— клиент API,web/src/components/RealtimeTable/— редактируемая таблица, конфиги колонок по формам вconstants/FORM_*.
Команды
- Установка:
cd setup && ./setup.sh(venv вapi/.venv,npm iвweb/). Для тестов дополнительноpip install -r api/requirements-dev.txt. - API:
cd api && python run_server.py(нужен Postgres вDATABASE_URL). Миграции:cd api && alembic upgrade head. - Web:
cd web && npm run start(dev),npm run build(результат вweb/dist). Линт:cd web && npx biome check src. - Тесты backend:
cd api && pytest— весь набор. Зелёным считается только весь набор.pytest tests/unit— без БД.pytest tests/integration— нужен живой Postgres;--init_dbнакатывает миграции и сидtests/sqls/fixture.sql. - Тесты frontend:
cd web && node --test src/components/RealtimeTable/utils/*.test.js.
Тесты
api/tests/unit/— моки сессии и репозиториев (AsyncMock,monkeypatch), БД не нужна.api/tests/integration/—TestClient(app)с полным lifespan, сессия с rollback. Фикстурыadmin_tokens/isp_tokens(api/tests/conftest.py,tests/integration/conftest.py). Тестовое окружение — Postgres изDATABASE_URL, паролиOPENBAO__TEST_ADMIN_PASSWORD/OPENBAO__TEST_EXECUTOR_PASSWORD. Часть тестов делаетskipпри отсутствии данных.- Новая логика в SQL-функциях покрывается интеграционными тестами через API. Логику без БД выносить в сервисы и покрывать unit-тестами.
Ветки и PR
- Базовая ветка —
test, неmain: в неё идут все PR,main— устаревший шаблон. Везде, где процесс обвязки говорит «main» (база worktree, PR,openspec archive,git pull --ff-onlyв основном checkout), читатьtest. - Хук guard-main защищает только main/master,
testон не охраняет. Прямые коммиты вtestзапрещены так же, как в main; исключение — только коммитopenspec archive. - PR создаётся с
--base test.
OpenSpec и superpowers
- Вход в любую задачу — superpowers:brainstorming. Skills openspec-propose и openspec-explore сами по себе не запускать.
- Когда brainstorming классифицировал задачу как architectural, структуру change создать через
openspec new change <id>(или/opsx:propose <id>), а содержимое proposal.md, specs/ и design.md написать по итогам brainstorming. tasks.md из OpenSpec не заполнять — задачи живут в плане superpowers. /opsx:applyне использовать: исполнение идёт через writing-plans и SDD/executing-plans.openspec archive <id>— после merge PR, как часть чеклиста закрытия.- Хук require-plan защищает каталоги из
.claude/code-paths:api/src/,api/alembic/(SQL-логика),web/src/.