From 66f4e5ef53526ad568ba499bc94eb8e98714d34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=D1=81=20=D0=A1=D1=83=D0=BB=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 6 Sep 2026 21:53:47 +0300 Subject: [PATCH] =?UTF-8?q?DI2:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D1=80=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20=D1=84=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=BD=D1=81=D0=BE=D0=B2=20=E2=80=94=20=D0=BF=D1=83=D0=BB=20?= =?UTF-8?q?=D0=91=D0=94=20=D0=B8=20=D0=B0=D1=83=D0=B4=D0=B8=D1=82=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B2?= =?UTF-8?q?=20finance-di2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server/finance/ (19 файлов) удалён: пул финансовой БД перенесён в server/finance-di2/db-core.ts, db-client.ts теперь реэкспортирует из ./db-core - Шедулер аудита перенесён в server/finance-di2/audit-scheduler.ts (03:00 МСК, setInterval, без node-cron), запуск из registerDi2Routes с защитой от повторного старта - История аудита DI2 теперь персистентна: загрузка/запись data/finance-audit-history.json в audit-agent.ts (порт из удалённого server/finance/audit.ts) - registerFinanceRoutes убран из server/routes/index.ts, registerDi2Routes остался на его месте - Клиент: удалены pages/finance/, components/finance/, hooks/useFinance.ts, hooks/useColumnLabels.ts, lib/format.ts, pages/salary.tsx; роуты /finance*, /income*, /expenses*, /salary и lazy-импорты убраны из App.tsx - Навигация: «Финансы» в Sidebar и MobileBottomNav ведёт на субапп /di2 (внешняя ссылка), гейт moduleAccess.finance + finance.view сохранён - index.css: удалён блок .hover-elevate/.hover-elevate-2/.active-elevate (использовался только старым модульным DataTable) - FinanceBottomNav.tsx сохранён как референс для этапа 3 (.superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx) - Не тронуто: client-di2/, сиды прав finance.view/manage, finance_access (module-access) --- .../FinanceBottomNav.reference.tsx | 0 .superpowers/sdd/di2-restyle/ledger.md | 8 + .superpowers/sdd/di2-restyle/plan.md | 90 + client/src/App.tsx | 33 - client/src/components/MobileBottomNav.tsx | 8 +- client/src/components/Sidebar.tsx | 42 +- .../src/components/finance/AnalyticsChart.tsx | 99 -- .../components/finance/CategoryManager.tsx | 188 --- .../finance/CategoryOverrideDialog.tsx | 162 -- .../src/components/finance/CategoryTree.tsx | 267 --- .../src/components/finance/ColumnFilter.tsx | 113 -- .../components/finance/ConnectionStatus.tsx | 24 - .../components/finance/ContractSyncDialog.tsx | 243 --- .../src/components/finance/CopyableCell.tsx | 56 - .../components/finance/CustomerSyncDialog.tsx | 262 --- .../src/components/finance/DarkModeToggle.tsx | 37 - client/src/components/finance/DataTable.tsx | 180 -- .../src/components/finance/DatabaseError.tsx | 18 - .../components/finance/DateRangeFilter.tsx | 95 -- .../finance/DraggableColumnList.tsx | 86 - .../src/components/finance/FinanceHeader.tsx | 60 - .../src/components/finance/FinanceLayout.tsx | 32 - client/src/components/finance/FinanceNav.tsx | 71 - .../components/finance/FinanceSettings.tsx | 166 -- .../src/components/finance/FinanceSidebar.tsx | 103 -- .../src/components/finance/SummaryCards.tsx | 78 - client/src/components/finance/TreeNodeRow.tsx | 140 -- client/src/hooks/useColumnLabels.ts | 19 - client/src/hooks/useFinance.ts | 1450 ----------------- client/src/index.css | 42 - client/src/lib/format.ts | 60 - client/src/pages/finance/audit.tsx | 281 ---- client/src/pages/finance/calculations.tsx | 1174 ------------- client/src/pages/finance/dashboard.tsx | 277 ---- client/src/pages/finance/debt.tsx | 654 -------- .../src/pages/finance/expense-categories.tsx | 322 ---- .../src/pages/finance/expenses-overview.tsx | 766 --------- client/src/pages/finance/expenses.tsx | 216 --- .../src/pages/finance/income-categories.tsx | 322 ---- client/src/pages/finance/income-overview.tsx | 766 --------- client/src/pages/finance/income.tsx | 216 --- client/src/pages/finance/index.ts | 9 - client/src/pages/finance/settings.tsx | 16 - client/src/pages/salary.tsx | 1041 ------------ server/finance-di2/audit-agent.ts | 27 +- server/finance-di2/audit-scheduler.ts | 53 + server/finance-di2/db-client.ts | 8 +- .../db-client.ts => finance-di2/db-core.ts} | 2 +- server/finance-di2/index.ts | 5 + server/finance/audit.ts | 566 ------- server/finance/auto-detect.ts | 206 --- server/finance/cache.ts | 38 - server/finance/calculations.ts | 272 ---- server/finance/category-matching.ts | 91 -- server/finance/contract-sync.ts | 369 ----- server/finance/customer-sync.ts | 402 ----- server/finance/debt.ts | 318 ---- server/finance/google-sheets.ts | 494 ------ server/finance/overrides.ts | 43 - server/finance/routes.ts | 708 -------- server/finance/salary-routes.ts | 346 ---- server/finance/settings.ts | 36 - server/finance/sync-utils.ts | 36 - server/finance/table-config.ts | 116 -- server/finance/tags.ts | 88 - server/finance/timeseries.ts | 70 - server/finance/views.ts | 93 -- server/routes/index.ts | 4 +- 68 files changed, 212 insertions(+), 14471 deletions(-) rename client/src/components/finance/FinanceBottomNav.tsx => .superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx (100%) create mode 100644 .superpowers/sdd/di2-restyle/ledger.md create mode 100644 .superpowers/sdd/di2-restyle/plan.md delete mode 100644 client/src/components/finance/AnalyticsChart.tsx delete mode 100644 client/src/components/finance/CategoryManager.tsx delete mode 100644 client/src/components/finance/CategoryOverrideDialog.tsx delete mode 100644 client/src/components/finance/CategoryTree.tsx delete mode 100644 client/src/components/finance/ColumnFilter.tsx delete mode 100644 client/src/components/finance/ConnectionStatus.tsx delete mode 100644 client/src/components/finance/ContractSyncDialog.tsx delete mode 100644 client/src/components/finance/CopyableCell.tsx delete mode 100644 client/src/components/finance/CustomerSyncDialog.tsx delete mode 100644 client/src/components/finance/DarkModeToggle.tsx delete mode 100644 client/src/components/finance/DataTable.tsx delete mode 100644 client/src/components/finance/DatabaseError.tsx delete mode 100644 client/src/components/finance/DateRangeFilter.tsx delete mode 100644 client/src/components/finance/DraggableColumnList.tsx delete mode 100644 client/src/components/finance/FinanceHeader.tsx delete mode 100644 client/src/components/finance/FinanceLayout.tsx delete mode 100644 client/src/components/finance/FinanceNav.tsx delete mode 100644 client/src/components/finance/FinanceSettings.tsx delete mode 100644 client/src/components/finance/FinanceSidebar.tsx delete mode 100644 client/src/components/finance/SummaryCards.tsx delete mode 100644 client/src/components/finance/TreeNodeRow.tsx delete mode 100644 client/src/hooks/useColumnLabels.ts delete mode 100644 client/src/hooks/useFinance.ts delete mode 100644 client/src/lib/format.ts delete mode 100644 client/src/pages/finance/audit.tsx delete mode 100644 client/src/pages/finance/calculations.tsx delete mode 100644 client/src/pages/finance/dashboard.tsx delete mode 100644 client/src/pages/finance/debt.tsx delete mode 100644 client/src/pages/finance/expense-categories.tsx delete mode 100644 client/src/pages/finance/expenses-overview.tsx delete mode 100644 client/src/pages/finance/expenses.tsx delete mode 100644 client/src/pages/finance/income-categories.tsx delete mode 100644 client/src/pages/finance/income-overview.tsx delete mode 100644 client/src/pages/finance/income.tsx delete mode 100644 client/src/pages/finance/index.ts delete mode 100644 client/src/pages/finance/settings.tsx delete mode 100644 client/src/pages/salary.tsx create mode 100644 server/finance-di2/audit-scheduler.ts rename server/{finance/db-client.ts => finance-di2/db-core.ts} (97%) delete mode 100644 server/finance/audit.ts delete mode 100644 server/finance/auto-detect.ts delete mode 100644 server/finance/cache.ts delete mode 100644 server/finance/calculations.ts delete mode 100644 server/finance/category-matching.ts delete mode 100644 server/finance/contract-sync.ts delete mode 100644 server/finance/customer-sync.ts delete mode 100644 server/finance/debt.ts delete mode 100644 server/finance/google-sheets.ts delete mode 100644 server/finance/overrides.ts delete mode 100644 server/finance/routes.ts delete mode 100644 server/finance/salary-routes.ts delete mode 100644 server/finance/settings.ts delete mode 100644 server/finance/sync-utils.ts delete mode 100644 server/finance/table-config.ts delete mode 100644 server/finance/tags.ts delete mode 100644 server/finance/timeseries.ts delete mode 100644 server/finance/views.ts diff --git a/client/src/components/finance/FinanceBottomNav.tsx b/.superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx similarity index 100% rename from client/src/components/finance/FinanceBottomNav.tsx rename to .superpowers/sdd/di2-restyle/FinanceBottomNav.reference.tsx diff --git a/.superpowers/sdd/di2-restyle/ledger.md b/.superpowers/sdd/di2-restyle/ledger.md new file mode 100644 index 0000000..8140d48 --- /dev/null +++ b/.superpowers/sdd/di2-restyle/ledger.md @@ -0,0 +1,8 @@ +# SDD ledger — plan: di2-restyle + +BASE: 6bcf4df + +- [ ] Этап 1 — удаление старого модуля финансов +- [ ] Этап 2 — мост тем/скинов +- [ ] Этап 3 — визуальный рестайл +- [ ] Этап 4 — проверка, деплой, документация diff --git a/.superpowers/sdd/di2-restyle/plan.md b/.superpowers/sdd/di2-restyle/plan.md new file mode 100644 index 0000000..b5c4dc0 --- /dev/null +++ b/.superpowers/sdd/di2-restyle/plan.md @@ -0,0 +1,90 @@ +# План: удаление старого модуля финансов + рестайл DI2 под дизайн iistwin + +Репозиторий: `C:\1Ai\1iistwin\1Project` (main, автодеплой через push). Субапп DI2 уже в проде на `/di2` (server/finance-di2 + client-di2). + +Решения пользователя (зафиксированы): /salary удалить и вести на /di2; рестайл = мост токенов + точечные правки (без замены 45 shadcn-компонентов); мобильная навигация = нижняя панель. + +--- + +## Этап 1 — Удаление старого модуля финансов + +### 1.1 Сервер +1. **Перенос пула БД**: содержимое `server/finance/db-client.ts` → новый `server/finance-di2/db-core.ts` (правка внутренних импортов: там только fs/path/pg). Обновить `server/finance-di2/db-client.ts`: реэкспорт из `./db-core` вместо `../finance/db-client`. Удалить папку `server/finance/` целиком (19 файлов). +2. **Шедулер аудита**: создать `server/finance-di2/audit-scheduler.ts` — порт `startAuditScheduler` (cron 03:00 МСК) из удаляемого `server/finance/audit.ts:524`, но вызывающий DI2-функцию `runIntegrityAudit` из `./audit-agent`. Запускать из `registerDi2Routes` (server/finance-di2/index.ts). Реализация — setInterval-проверка времени (как в оригинале) или порт через обычный таймер; node-cron НЕ добавлять. +3. **Персистентность истории аудита**: в `server/finance-di2/audit-agent.ts` добавить загрузку/запись `data/finance-audit-history.json` (порт логики из старого audit.ts): загрузка при старте модуля, append после каждого `runIntegrityAudit`. Сейчас история в памяти и теряется при рестарте. +4. **Регистрация**: `server/routes/index.ts` — убрать `import { registerFinanceRoutes }` (стр. 33) и вызов (стр. 116), оставить `registerDi2Routes`. +5. **Env сервера** (проверка, не код): DI2 Google-флоу использует `GOOGLE_CLIENT_ID`/`GOOGLE_CLIENT_SECRET` — проверить наличие в `.env` сервера; старый `FINANCE_GOOGLE_REDIRECT_URI` больше не нужен. + +### 1.2 Клиент (основное приложение) +1. Удалить: `client/src/pages/finance/` (14 файлов), `client/src/components/finance/` (22 файла), `client/src/hooks/useFinance.ts`, `client/src/hooks/useColumnLabels.ts`, `client/src/lib/format.ts`, `client/src/pages/salary.tsx`. + - Перед удалением: `grep -rn "lib/format\|useFinance" client/src --include=*.tsx --include=*.ts` — все внешние импорты должны отсутствовать (по разведке используются только удаляемыми файлами — перепроверить!). +2. `client/src/index.css` — удалить блок `.hover-elevate`/`.hover-elevate-2` (строки ~343-374, использовался только finance DataTable). +3. `client/src/App.tsx`: + - Убрать lazy-импорты finance-страниц (строки 61-72) и роуты `/finance`, `/finance/debt`, `/finance/calculations`, `/finance/audit`, `/income*`, `/expenses*`, `/salary` (строки 117-120, 187-200). + - ROUTE_TITLES: убрать записи этих путей. +4. Навигация: + - `client/src/components/Sidebar.tsx` (строки 1084-1122, 1544, 1641-1645): `FinanceNavItem` и пункт «Финансы» в меню профиля → внешняя ссылка `` (паттерн как в FinanceSidebar.tsx:88-99), гейт `moduleAccess.finance !== false && (isAdmin || hasPermission('finance.view'))` сохранить. + - `client/src/components/MobileBottomNav.tsx` (строки 383-389): пункт «Финансы» → `/di2`. +5. **Не трогать**: сиды прав `finance.view/manage` (`server/storage/roles.storage.ts:300-301` — gate DI2 ломается без них), `finance_access` (shared/schema.ts, module-access, Users.tsx матрица доступа). + +### 1.3 Проверка этапа +`npm run check` + `npm run build` чисто; ключевые API DI2 авторизованно 200 (список из этапа 4). + +--- + +## Этап 2 — Мост тем/скинов iistwin в DI2 + +Ключевая несовместимость: DI2 ждёт голые HSL-тройки (`hsl(var(--x) / )`), скины iistwin генерируют полные значения (`hsl(...)`). Решение — перевод DI2 на формат основного клиента + общий generated-skins.css + свой провайдер. + +### 2.1 Общий код тем +- Vite-алиас в `vite.config.di2.ts`: `"@skin": path.resolve(import.meta.dirname, "client/src/themes")` (через `../client` → фактически `1Project/client/src/themes`); пути в `client-di2/tsconfig.json`: `"@skin/*": ["../client/src/themes/*"]`. +- Импортируемые модули (чистый TS, без React): `tokens.ts` (`generateSkinCss`, `Skin` типы), `skins/index.ts` (`BUILT_IN_SKINS`, `DEFAULT_SKIN_ID`, `getBuiltInSkinById`), `styles/generated-skins.css` — через CSS-`@import` в index.css (путь `../../client/src/themes/styles/generated-skins.css` первой строкой). + +### 2.2 Di2ThemeProvider — `client-di2/src/themes/Di2ThemeProvider.tsx` +Порт логики `client/src/themes/ThemeProvider.tsx` (строки 75-92, 151-209) минус useAuth/useQuery: +- Приоритет скина: `localStorage['skin']` (если id валиден среди BUILT_IN_SKINS + кастомных с сервера) → `GET /api/organization/current-skin` (`{skinId, skin}`) → `'iistwin'`. +- Кастомные скины: список через `GET /api/organization/skins`, токены через `GET /api/organization/skins/:id` (только для не-встроенного текущего). +- Тема: `localStorage['theme']` → `prefers-color-scheme` + слушатель. +- На ``: `data-skin`, `data-theme`, класс `light|dark`; для кастомного скина — `