Skip to content

Seed / Bootstrap — тестовые данные для CRM RMS ​

Быстрый старт ​

bash
# 1. Применить последние миграции (включая 0058 — global_function у пользователей)
go run ./cmd/migrate up

# 2. Заполнить БД тестовыми данными
go run ./cmd/seed

# 3. Сброс и повторное заполнение с нуля
go run ./cmd/seed --clean

Что создаётся ​

Пользователи ​

EmailПарольСистемная рольФункция
admin@seed.rmsAdmin123!admin—
manager@seed.rmsManager123!manager—
logist@seed.rmsLogist123!employeelogistician
engineer@seed.rmsEngineer123!engineerengineer
accountant@seed.rmsAccountant123!accountantaccountant
lawyer@seed.rmsLawyer123!lawyerlawyer
executor@seed.rmsExecutor123!employee(соисполнитель на проектах)

Seed синхронизирует users.role и user_roles: прежние лишние роли пользователя удаляются, целевая роль добавляется через идемпотентный upsert. global_function остаётся отдельной профессиональной функцией; например, логист имеет системную роль employee и функцию logistician.

Проекты ​

НазваниеСтатусКоманда
[SEED] Выставка ТехноЭкспо 2026in_progressПолная (все 7 функций)
[SEED] Конференция РМС Форум 2026estimatingmanager + logist + accountant
[SEED] Корпоратив Пром Решенияdonemanager + engineer + executor
[SEED] Монтаж Оборудования Офис Аapprovedmanager + engineer + logist
[SEED] Архивный Проект 2025closedmanager + 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 если не найдено

Для полного сброса (удаление и пересоздание):

bash
go run ./cmd/seed --clean

Seed-данные помечены:

  • Пользователи: email оканчивается на @seed.rms
  • Все остальные сущности: name начинается с [SEED]
  • Оборудование: identifier начинается с SEED-

Проверка после запуска ​

bash
# Посмотреть созданных пользователей
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')"

Загружаем документацию…