Seed / Bootstrap — тестовые данные для CRM RMS
Быстрый старт
# 1. Применить последние миграции (включая 0058 — global_function у пользователей)
go run ./cmd/migrate up
# 2. Заполнить БД тестовыми данными
go run ./cmd/seed
# 3. Сброс и повторное заполнение с нуля
go run ./cmd/seed --cleanЧто создаётся
Пользователи
| Пароль | Системная роль | Функция | |
|---|---|---|---|
admin@seed.rms | Admin123! | admin | — |
manager@seed.rms | Manager123! | manager | — |
logist@seed.rms | Logist123! | employee | logistician |
engineer@seed.rms | Engineer123! | engineer | engineer |
accountant@seed.rms | Accountant123! | accountant | accountant |
lawyer@seed.rms | Lawyer123! | lawyer | lawyer |
executor@seed.rms | Executor123! | employee | (соисполнитель на проектах) |
Seed синхронизирует users.role и user_roles: прежние лишние роли пользователя удаляются, целевая роль добавляется через идемпотентный upsert. global_function остаётся отдельной профессиональной функцией; например, логист имеет системную роль employee и функцию logistician.
Проекты
| Название | Статус | Команда |
|---|---|---|
[SEED] Выставка ТехноЭкспо 2026 | in_progress | Полная (все 7 функций) |
[SEED] Конференция РМС Форум 2026 | estimating | manager + logist + accountant |
[SEED] Корпоратив Пром Решения | done | manager + engineer + executor |
[SEED] Монтаж Оборудования Офис А | approved | manager + engineer + logist |
[SEED] Архивный Проект 2025 | closed | manager + accountant |
Роли в команде проекта (project_team_members.role_in_project, role_codes)
Каждый пользователь получает одну или несколько проектных ролей, которые определяют его функцию в конкретном проекте. role_in_project хранит основную роль для совместимости, role_codes хранит полный набор ролей.
| Значение | Кто видит |
|---|---|
manager | Всё по проекту |
logistician | Логистические операции, оборудование, склад |
engineer | Технические задачи, оборудование |
accountant | Бюджет, сметы, финансовые документы |
finance / financier | Финансовая сводка и статьи затрат проекта |
lawyer | Юридические документы, договоры |
co_executor | Только назначенные ему задачи |
Задачи
Создаётся 17 задач по всем проектам в статусах: todo, in_progress, blocked, done
Оборудование
16 позиций с разными статусами:
available— на складах Бутово и Мытищиreserved— закреплено за Проектом 1 (Выставка) и Проектом 4 (Монтаж)in_use— активно используется на площадкеmaintenance— на обслуживании
Финансы (project_cost_items)
По каждому проекту статьи расходов в категориях: tech, logistics, labor, rent, other, taxes
Для done и closed проектов заполнены как planned_amount, так и actual_amount.
Документы
| Тип | Проект | Статус |
|---|---|---|
invoice | Выставка | issued |
contract | Выставка | issued |
invoice | Корпоратив | paid |
act | Корпоратив | acted |
contract | Корпоратив | issued |
invoice | Архив | paid |
act | Архив | acted |
contract | Архив | issued |
Логистика
3 операции с разными статусами:
in_transit— доставка на Выставкуcompleted— возврат с Корпоративаrequest_created— запрос на доставку для Монтажа
Заявки на команду (team_requests)
- Конференция: заявка
pending(логист назначен, инженер ожидает, бухгалтер назначен) - Монтаж: заявка
draft(инженер ожидает)
Архитектура ролей
users.role — primary роль: admin | manager
user_roles — RBAC-роли для permissions: admin | manager | logistician | ...
users.global_function — функция во всех проектах: logistician | engineer | accountant | lawyer | ...
project_team_members.role_in_project — функция в конкретном проекте: manager | logistician | engineer | accountant | lawyer | co_executorПринцип: у пользователя есть primary роль (users.role) и набор RBAC-ролей (user_roles) для permission-кодов. Опциональная глобальная функция описывает специализацию во всех проектах; для логистов она также мапится в RBAC-роль logistician. В каждом проекте пользователю дополнительно можно назначить конкретную проектную роль — что он делает именно в этом проекте.
Идемпотентность
Повторный запуск go run ./cmd/seed безопасен:
- Пользователи:
ON CONFLICT (email) DO UPDATE - Отделы:
ON CONFLICT (name) DO UPDATE - Оборудование:
ON CONFLICT (identifier) DO UPDATE - Команды проектов:
ON CONFLICT (project_id, user_id) DO UPDATE - Задачи, статьи расходов, документы, логистика: проверка через
SELECT EXISTSперед вставкой - Проекты, компании, локации, поставщики:
SELECTпоname,INSERTесли не найдено
Для полного сброса (удаление и пересоздание):
go run ./cmd/seed --cleanSeed-данные помечены:
- Пользователи: email оканчивается на
@seed.rms - Все остальные сущности:
nameначинается с[SEED] - Оборудование:
identifierначинается сSEED-
Проверка после запуска
# Посмотреть созданных пользователей
psql $DSN -c "SELECT email, role, global_function FROM users WHERE email LIKE '%@seed.rms'"
# Проекты
psql $DSN -c "SELECT name, status FROM projects WHERE name LIKE '[SEED]%'"
# Задачи по проекту
psql $DSN -c "SELECT t.title, t.status, u.email as assignee
FROM tasks t
LEFT JOIN users u ON u.id = t.assignee_id
WHERE t.project_id = (SELECT id FROM projects WHERE name = '[SEED] Выставка ТехноЭкспо 2026')"