# План упрощения — 2026-06-11 ## Проблема AI усложнил код `entries.js` фоллбеками `getOrCreateCompany`, запутанной логикой `ownCo`, ненужными редиректами `?company=`. Пользователь указал что логика простая и не требует усложнений. ## Исходные данные (что юзер знает после входа по Keycloak) 1. **email** — из JWT (Keycloak claims) 2. **session.token** — access_token от Keycloak 3. **IAM API** (`fetchIamUser`) даёт: - `email` - `profiles[]` — список компаний юзера: `[{id, client_id, company_name, is_active_profile}, ...]` - `activeProfile` — текущая активная компания - `isAdmin` — флаг администратора ## Базовые правила - **Компания** = общий список IP. Все юзеры компании видят одни и те же записи и могут CRUD. - **email** пишется в `audit_log.created_by` — кто сделал CRUD. - **client_id** (WZ01112, WZ03709…) — идентификатор компании в БД (`companies.client_id`). ## Переключение компаний (мульти-компания) Если у юзера `profiles.length > 1` — он выбирает активную компанию через переключатель. CRUD идёт в активную компанию. ## Админ-режим (чекбокс → toggle) ### Правило (финальное): > Toggle «Администратор» показывается **только** когда: > `isAdmin === true` **И** `activeClientId === 'WZ01112'` ### Временное исключение (тесты): Пока я (WZ01112 + ntazetdinov@nubes.ru) — тоже вижу toggle, даже без `isAdmin`. Убрать когда перейдём на чистый IAM `isAdmin`. ### Поведение toggle: - **ВЫКЛ** — обычный режим: юзер видит свою активную компанию, CRUD только в неё - **ВКЛ** — admin-режим: выпадающий список ВСЕХ компаний, можно выбрать любую, ссылки «Аудит» и «Лимиты» ### Реализация toggle: - Не `` с `onchange="this.form.submit()"` (старый вариант, не работал) - Замена на **toggle-переключатель** (как ползунок ВКЛ/ВЫКЛ) - `onchange` → `fetch('/toggle-admin', {method:'POST'})` → `location.reload()` - Никакой формы, никакого CSRF — просто JS fetch и перезагрузка страницы ## Что меняем (4 файла) ### 1. `ui/index.js` — resolveUser middleware - Добавить `canAdminMode`: ```js canAdminMode: (iamAdmin && activeClientId === 'WZ01112') || activeClientId === 'WZ01112' // временно ``` - Убрать `isAdmin: iamAdmin || activeClientId === ADMIN_CLIENT_ID` — заменить на чистое `isAdmin: iamAdmin` - `adminMode` остаётся из сессии ### 2. `views/index.ejs` — header - Условие показа toggle: `<% if (canAdminMode) { %>` вместо `<% if (isAdmin) { %>` - Заменить checkbox на toggle - Ссылки «Аудит»/«Лимиты» — по `adminMode` (уже так) ### 3. `ui/routes/entries.js` — GET / - **Убрать** `getOrCreateCompany`-фоллбек (строки 89-96) - **Упростить** admin-ветку: если нет `?company=` — показать свою компанию - Обычный пользователь: без изменений (уже работает) ### 4. `ui/routes/auth.js` — POST /toggle-admin - Без изменений (уже работает — переключает `req.session.adminMode`) ## Почему именно так 1. **AND а не OR**: админ не должен видеть toggle в чужих компаниях — только в WZ01112 2. **Toggle а не checkbox**: чекбокс = «прочитано/не прочитано», toggle = «режим ВКЛ/ВЫКЛ» — семантически верно 3. **JS fetch а не form submit**: быстрее, без моргания страницы, без CSRF-проблем 4. **Никаких фоллбеков**: компания либо есть в списке (из IAM), либо юзер к ней не относится — не надо «создавать если нет»