Для super_admin clubId=null — не добавляем фильтр WHERE clubId,
чтобы видеть данные всех клубов. Club roles фильтруют по своему clubId.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
clubId=null — платформенные данные, недоступны club_admin.
Вернул строгий фильтр по clubId. Pipelines привязаны к клубу в БД.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
findAll теперь возвращает pipelines с clubId текущего клуба И с
clubId=null (общие, созданные суперадмином). Ранее club_admin не
видел pipelines → фронтенд не загружал сделки.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Удалены отдельные эндпоинты /by-number/:number для deals и users.
Теперь GET /:id определяет формат параметра (число → getByNumber,
UUID → getById) и вызывает соответствующий метод. Фронтенд вызывает
/crm/deals/{number} и /users/{number} напрямую.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- onDealClick передаёт number (string) или UUID как фоллбэк
- deal/[id] загружает по by-number или по UUID в зависимости от формата
- Проставлен number=100 для сделки без номера в БД
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- API: GET /users/by-number/:number + findByNumber в UsersService
- Список: клик по сотруднику → /staff/{number}
- Детальная: загрузка через /users/by-number/{number}
- PATCH/avatar/password операции используют user.id (UUID) внутри
- Синхронизировано в web-platform-admin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Старый маршрут /crm/[id] теперь редиректит UUID-ссылки (из кеша
браузера или внешних источников) на новый формат /crm/deal/{number}.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- API: GET /crm/deals/by-number/:number для поиска сделки по номеру
- Маршруты: /crm/deal/kanban, /crm/deal/list, /crm/deal/{number}
- /crm редиректит на /crm/deal/kanban
- Карандашик в блоке переводит ВСЕ editable поля в edit mode
- Кнопки «Общий/Мой вид» и «Добавить раздел» — под блоками
- Убран double-click для редактирования полей
- onDealClick передаёт deal.number, API операции через deal.id (UUID)
- Изменения синхронизированы в web-platform-admin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
API с booking-модулем потребляет ~160MB (через dist/main.js),
ранее nest start тянул ~800MB и PM2 убивал по лимиту 512M.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GET /users/staff endpoint с поиском по имени
- Fix /staff → /users/staff во всех CRM-компонентах
- Searchable combobox для выбора ответственного (create/edit deal)
- Default assignee = текущий пользователь при создании сделки
- Bitrix-style переключатель стадий (цветные прямоугольники)
- Inline-редактирование карточки сделки (вместо диалога)
- Форма создания дел (активностей) в activity-list
- Loading states для Win/Lose/Delete/Complete (защита от двойных кликов)
- Fix body parser: NestJS API вместо дублирующих express middleware
- Копирование staff-компонентов в platform-admin (аватар, сотрудники)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
— Очистка тестового мусора: дубликаты полей, пайплайнов, причин проигрыша
— Порядковые номера сделок (#N) per-club с @@unique([clubId, number])
— DELETE endpoints для стадий (с переносом сделок) и пайплайнов
— onDelete: Cascade→Restrict для стадий, SetNull для истории
— PipelineManager: полный CRUD воронок и стадий с палитрой цветов
— FieldManager: CRUD кастомных полей с типами и опциями
— EditDealDialog: редактирование сделки (контакт, сумма, компания, ответственный)
— Кастомные поля в форме создания и карточке сделки
— Soft-delete сделок, выбор ответственного, расширенные фильтры
— Поиск по номеру сделки (#42 / 42)
— Исправлены pre-existing тесты: module.guard, themes, auth, reports
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Корневая проблема: validateAndMerge() никогда не вызывалась из
task-manager — документы создавались в worktree, но не мёрджились
в main. Пользователь видел старый контент.
Исправлено:
- task-manager.ts: вызов validateAndMerge() после завершения задачи
- worktree-manager.ts: две стратегии мёрджа:
- Документы (apps/*/document/**): fast path без lint/typecheck/test,
rebase + merge, рестарт только web-platform-admin
- Код: полный путь lint → typecheck → test → rebase → merge
- Rebase вместо ff-only решает расхождение веток при параллельной работе
- Восстановлен документ франшиз (90+ записей из chatbot worktree)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Формализация процесса разработки на основе анализа статьи Zilliz
о провале Claude Code на крупном проекте. Новый документ описывает:
- Формат задачи с Definition of Done до начала работы
- Test-first подход (тесты → код → проверка)
- Послойная декомпозиция (Prisma → API → UI), max 20 файлов/коммит
- Автоматический quality gate (typecheck всех apps + тесты)
- Таблица антипаттернов и метрики качества
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Backend: GET/PATCH /users/:id, POST /users/:id/password, POST /users/:id/avatar
- Prisma: email, roomId, comment поля в User, relation к Room
- Static files: avatars через useStaticAssets, multer upload (5MB, JPEG/PNG/WebP)
- Club-admin: /staff/[id] — аватар, ФИО, email, телефон, роль, департамент, зал, комментарий, смена пароля
- Все панели: sidebar с user info + logout, /profile с role switcher для admin/super_admin
- Ecosystem: dist/main.js вместо nest start для стабильного запуска
- .npmrc: public-hoist-pattern для @types/* (fix pnpm + @types/react)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Документ: сравнительный анализ 11 фитнес-студий Екатеринбурга
(fitness-studios-comparison) — специализация, цены, ИНН, масштаб
- Fix: 3 strict-TS ошибки в CRM (possibly undefined) блокировавшие сборку
- Safety: скрипт typecheck (tsc --noEmit) во всех web-приложениях —
безопасная проверка типов без удаления .next/
- CLAUDE.md: правило «никогда не запускать build на живом сервере»
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Global setup: единый логин всех пользователей перед тестами (без rate limit)
- Playwright проекты: testMatch привязка файлов к проектам (убрал 5x дублирование)
- LP порт: 3004 → 3050 (реальный порт из ecosystem.config)
- Theme тесты: мок API через page.route() (предотвращение 401→logout)
- Web UI тесты: защита response?.status() ?? 200 от undefined
- getCachedTokens(): чтение токенов из файла вместо loginAs в каждом beforeAll
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ссылка от коллеги по прямому URL — допустимо показать страницу «Контент недоступен».
Но ссылка нигде в интерфейсе пользователя не должна появляться: ни в меню, ни в списках, ни в карточках.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- UX-авторизация: недоступные элементы не рендерятся (не «403 / нет прав»)
- Role Switcher: суперадмин переключает роль в header без перелогинивания
- Обновлены: CLAUDE.md, roles-rbac.md, business-logic.md, sprints.md
- Sprint 10: добавлены задачи 48-54 (RoleGate, filterByRole, impersonate API)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Корневая причина: @unique на themeId в Prisma → P2002 ошибка при
повторной установке ранее использованной темы → .catch() скрывал ошибку →
API fetch на перезагрузке возвращал старую тему и перезаписывал localStorage.
Исправления:
- Убран @unique с themeId в PlatformTheme (разрешает аудит-трейл)
- Добавлен @@index([createdAt]) для быстрого findFirst orderBy desc
- handleApply теперь показывает ошибки пользователю вместо .catch(() => {})
- Лендинг: @theme inline → @theme, добавлен ThemeSync компонент
(подтягивает primary color из API и применяет к LP)
- Lint-фиксы в competitor-analysis-skk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Заменили @theme inline на @theme в globals.css всех 3 приложений —
Tailwind v4 теперь генерирует var() ссылки вместо хардкода значений,
что позволяет runtime-переключение тем через CSS custom properties
- Исправлен дублирующийся React-ключ #42A5F5 в палитре Azure Professional
- Исправлена key-стратегия: key={color.hex} → key={color.name}
- Убраны неиспользуемые импорты в theme-provider (web-admin, web-club-admin)
- Добавлены E2E тесты: применение темы к сайдбару, отсутствие duplicate keys
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Обновлены цветовые схемы 9 тем (WCAG AA, контраст sidebar ≥8:1)
- Заменены 60+ hardcoded цветов на theme-aware классы (text-text, bg-card, text-error и т.д.)
- Создан SVG-логотип MyFitCRM (компонент Logo с вариантами full/icon)
- Ребрендинг FitCRM → MyFitCRM во всех 5 сервисах (17 файлов)
- Добавлена поддержка тем в web-admin и web-club-admin (ThemeProvider, globals.css)
- Обновлена страница «Разработка»: спринты, прогресс, theme-aware компоненты
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Добавлено: архитектура тем (10 дизайн-китов), Backend API (/v1/theme/current, /v1/admin/theme),
интеграция во все сервисы (лендинг, web-admin, club-admin, mobile), Prisma-модель PlatformTheme,
webhook theme.changed, чеклист Sprint 8 (30+ задач), права доступа (только суперадмин).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Тесты: загрузка страницы тем, отображение 10 тем, применение CSS-переменных,
сохранение в localStorage, восстановление после перезагрузки, data-dark для
тёмных тем, отсутствие JS-ошибок на всех страницах. Фикс: перезапуск PM2 после
очистки .next кэша (corrupted webpack chunks).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Вкладка «Тестирование» на странице /development с табами (Прогресс | Тестирование)
- 65 E2E автотестов: 36 API + 29 UI (лендинг, рецепция, клуб, суперадмин)
- ~100 ручных проверок по 6 сервисам: лендинг, рецепция, клуб, суперадмин, API, мобильное приложение
- Ссылки на разделы и страницы в каждой проверке для тестировщиков
- Замечания тестеров → TODO (localStorage, фильтры ОК/Замечания)
- API route /api/documents — автообновление списка документов без rebuild
- meta.json для документов — автоматическое отображение в списке
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Sidebar: пункт «Документы» с иконкой FileText
- /documents — листинг документов (с поиском, пустое состояние)
- /documents/[id] — динамическая страница документа (HTML + экспорт DOCX/XLSX)
- /documents/dev-status — отчёт о состоянии разработки FitCRM (спринты, TODO, журнал)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- fix(auth): ON CONFLICT для refresh_tokens — устранение UNIQUE violation
при быстрых последовательных логинах (одинаковый JWT iat)
- feat(auth): добавлен GET /v1/auth/profile endpoint
- fix(auth): resetTenantId() перед cross-tenant запросами в validateUser,
refreshToken, getProfile
- fix(e2e): учётные данные тестов приведены в соответствие с seed-данными
- fix(e2e): POST /v1/clients использует coordinator (RBAC требует роль)
- test(e2e): добавлен тест на запрет POST /v1/clients для тренера (403)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Конфигурация Playwright для 4 проектов (web-admin, club-admin, platform-admin, api).
E2E тесты:
- auth.spec.ts: логин, рефреш токена, профиль, защита эндпоинтов
- clients.spec.ts: CRUD клиентов, пагинация, изоляция по club_id (RLS)
- funnel.spec.ts: воронка по этапам, статистика конверсии
- rbac.spec.ts: проверка доступа для 6 ролей (тренер, координатор, менеджер и др.)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mobile:
- Экран уведомлений с фильтрами (все/непрочитанные), пагинацией, pull-to-refresh
- NotificationCard с иконками по типу, относительным временем, маркером непрочитанного
- Zustand store, API service, типы для 9 типов уведомлений
- Роут в навигации (More → Уведомления)
Backend:
- PDF-генерация для 5 типов отчётов (clients_summary, funnel_conversion,
trainer_performance, sales_summary, sleeping_clients) через pdfkit
- Async генерация с обновлением статуса (PENDING → GENERATING → COMPLETED)
- Endpoint GET /v1/reports/:id/file для скачивания PDF
- StatsService интеграция для данных отчётов
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Замена хардкода на реальные данные из /stats/summary и /stats/funnel.
KPI-карточки, воронка конверсии (BarChart), распределение клиентов (PieChart),
тренировки по статусам, таблица конверсии по тренерам, блок продаж.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- CLAUDE.md: добавлен workflow обработки задач через Telegram
- web-admin: добавлена зависимость recharts для страницы аналитики
- .gitignore: добавлены .expo/ и test-results/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- funnel.service: обёрнуть moveStage в $transaction, удалять старые записи при смене этапа и назначении
- schedule.controller: координаторы/менеджеры могут указывать trainerId при создании тренировки
- create-training.dto: добавлено опциональное поле trainerId
- web-admin: новый диалог записи на ВПТ (create-vpt-dialog), обновлён reception page
- mobile: исправлен Button компонент, добавлен import в funnel-action
- Исправлены тесты auth, funnel, schedule (310 passed)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>