Тренинги
Функциональные требования: Модуль «Тренинги»
Версия: 1.01
Статус: Draft
Аудитория: Команда разработки (backend, frontend, QA, PM)
Референс: GetCourse (getcourse.ru)
1. Назначение документа
Документ описывает функциональные требования к модулю «Тренинги» — ядру обучающей платформы. Модуль отвечает за:
- создание и управление учебным контентом (тренинги, подтренинги, уроки);
- выдачу и разграничение доступов к контенту;
- управление порядком прохождения (последовательное открытие и расписание).
Документ не описывает технический стек, архитектуру и схему БД — только бизнес-логику и поведение системы.
2. Глоссарий
| Термин | Определение |
|---|---|
| Тренинг | Корневой образовательный контейнер (курс). Содержит уроки и/или подтренинги. |
| Подтренинг | |
| Урок | Атомарная единица обучения с контентом (текст, видео, задания и т.д.). |
| Ученик | Пользователь, получивший доступ к тренингу и проходящий обучение |
| Группа | Сегмент пользователей, используемый для группового управления доступами. |
| Расписание | Правила открытия уроков во времени (по датам или с задержками). |
| Стоп-урок | Урок, блокирующий переход к следующим урокам до его выполнения. |
3. Роли пользователей
ВНа контексущем этапе в модуляе «Тренинги» опредусмотреленыа слеодующиена ролиь:
Администратор — имеет полный доступ ко всем тренингам, их настройкам и доступам пользователей. Может создавать, редактировать, удалять и архивировать любые тренинги.
Преподаватель — имеет доступ к назначенным ему тренингам. Может редактировать контент уроков (при наличии прав), проверять задания учеников и управлять расписанием.
Ученик — пользователь, имеетющий доступ к тренингам, согласно членству в котогрыуппах состоит. Может просматривать уроки (с учётом правил открытия) и отправлять ответы на задания.
Один постальзователь может одновременно иметь разные роли (администратор, преподаватель и т.д.) будут определены отдельно в разныпоследующих тверсиях докуменингтах.
4. Иерархия контента
4.1. Модель
Поддержинваетсята двухуровневограниченная модель вложенность подтренингов:
Тренинг
├── Урок 1
├── Урок 2
├── Подтренинг A
│ ├── Урок A.1
│ ├── Подтренинг A.1
│ │ ├── Урок A.21.1
│ │ └── Подтренинг A.1.1
│ │ └── Урок A.31.1.1
│ └── Урок A.2
├── Подтренинг B
│ ├── Урок B.1
│ └── Урок B.2
└── Урок 3
4.2. Правила
- Тренинг и подтренинг мо
жегут содержать уроки и/или подтренинги в любом сочетании. ПодтренГлубинг может содержать только уроки (дальнейшаявложенностьи подтренингов неподдграничерживнается).- Порядок элементов внутри контейнера задаётся вручную и сохраняется.
- Урок принадлежит ровно одному родителю (тренинг или подтренинг).
- Подтренинг принадлежит ровно одному родительскому контейнеру (тренингу или подтренингу).
- Циклические зависимости запрещены: подтренинг не может быть вложен в самого себя (прямо или транзитивно).
4.3. ПТерминология: тренинг vs подтренинг
С точки зрему двухуровневаия модельи
Огрданных ич поведения системы «тренинг» и «подтренинг» — это одна и та же сущность. Разница только в положении в иерархии:
- Тренинг — корневой элемент, не имеет родителя.
- Подтренинг — элемент, у которого есть родитель (тренинг или другой подтренинг).
Один и тот же элемент может быть тренингом или подтренингом в зависимости упрощает лтогикуо, где оступов,н расписаоложения. При UI навигации. Для перазделенияосе корнтента на темы достаточно однвого тренинга внутрь другого тренинга он становнится подтренингов.м, Этои осознанное сбокращение относительно GetCourse, который поддерживает до 10 уровней вложенности.
5. Сущность «Тренинг / Подтренинг»
5.1. Основные атрибуты
- Название — отображается в списках и заголовках.
- Описание — краткое описание курса, видно ученикам.
- Обложка — изображение для карточки тренинга.
- Статус — черновик / опубликован / архивный.
ПрепРодаваитель — ссылка на родительсновнокийответственный затренинг/подтренинг (отсутствует для корневого тренинга).- Дата создания, дата публикации.
5.2. Статусы
- Черновик — тренинг создан, но недоступен ученика
м. Виден только администраторам и преподавателям. - Опубликован — тренинг активен и может выдаваться ученикам согласно правилам доступа.
- Архивный — тренинг скрыт из активных списков, но доступы сохраняются для исторических данных (опционально — с возможностью полного отзыва доступов).
5.3. Действия над тренингом
- Создание / редактирование / удаление.
- Дублирование (копирование структуры с уроками или без).
- Архивация / восстановление из архива.
- Управление составом уроков и подтренингов (добавление, удаление, изменение порядка).
- Перенос в другой родительский контейнер (становится подтренингом) или вынос в корень (становится тренингом).
- Настройка доступов (см. раздел
8)7). - Настройка расписания (см. раздел
9)8).
5.4. Условия завершения тренинга
Администратор задаёт правило, при котором тренинг считается завершённым учеником. Возможные варианты:
все уроки тренинга пройдены;все стоп-уроки пройдены;конкретный урок пройден (например, финальный тест).
Факт завершения тренинга — это доменное событие, которое может использоваться другими модулями (выдача сертификата, открытие следующего тренинга, начисление баллов и т.д.).
6. Сущность «Подтренинг»
Подтренинг — это тренинг, вложенный в родительский тренинг. С точки зрения функциональности подтренинг идентичен тренингу, за исключением следующего:
не может содержать других подтренингов;отображается ученику только в контексте родительского тренинга;имеет собственные настройки доступа и расписания, которые работают независимо от родителя (см. раздел 8.4).
Все действия, доступные для тренинга (редактирование, дублирование, архивация), применимы и к подтренингу.
7. Сущность «Урок»
7.6.1. Основные атрибуты
- Название.
- Контент — основное наполнение урока (текст, видео, изображения, файлы).
- Порядковый номер внутри родителя.
- Родитель — тренинг или подтренинг.
- Флаг «Скрыт» — урок не отображается ученикам (используется для черновиков).
- Флаг «Стоп-урок» — см. раздел
9.8.3. - Дата открытия по расписанию — см. раздел
9.8.
7.6.2. Типы уроков
Для MVP достаточно одного универсального типа урока с составным контентом (текст + медиа + файлы). В дальнейшем могут быть добавлены специализированные типы (вебинар, тест и т.д.), но это за рамками данного документа.
7.6.3. Задания в уроке
Урок может содержать задание, требующее ответа от ученика. ЗВ рамках MVP:
- ученик может отправить ответ на задание (текст, файл или ком
ебинацию); - ответ сохраняется в системе и привязан к паре «ученик ↔ урок»;
- формальная модель статусов ответа (проверка, принятие, отклонение) в MVP не предусмотрена — ответы просто сохраняются.
Логика работы с проверкой ответов будет определена в последующиех состояния ответа:
Не отправлен— ученик ещё не ответил.Отправлен— ответ ждёт проверкси.Принят— ответ проверен и принят преподавателем.Отклонён— ответ отклонён, требуетсях доработка.
Сументатус ответа влияет на логику стоп-уроков (см. раздел 9.3).
7.6.4. Статусы прохождения урока учеником
Для каждой пары «ученик ↔ урок» система хранит статус:
- Недоступен — урок закрыт правилами доступа или расписания.
- Доступен — урок можно открыть, но ученик ещё не заходил.
- Начат — ученик открыл урок.
- Выполнен — урок пройден (критерий выполнения
зависит от типа урока: вход,в урок или отправка ответа на задание,пресли заданятиеоестветаь).
8.7. Доступы
8.7.1. Модель доступа: по группам
Доступ к тренингам и подтренингам выдаётся через механизм групп пользователей.
- Группа — это именованный сегмент пользователей.
- Пользователь может состоять одновременно в нескольких группах.
- Тренинг/подтренинг привязан к одной или нескольким группам.
- Пользователь имеет доступ к тренингу, если он состоит хотя бы в одной группе, привязанной к тренингу.
8.7.2. Управление членством в группе
Членство в группе может изменяться следующими способами:
- Ручное добавление/удаление
администраторомчерез интерфейс управления группой. - Массовое добавление (например, импорт списка пользователей).
- Программное добавление через внутренние события системы (покупка, регистрация на событие и т.д.) — реализуется за пределами модуля «Тренинги», но модуль должен корректно реагировать на изменение состава группы.
8.7.3. Последствия изменения членства
- При добавлении пользователя в группу — он немедленно получает доступ ко всем тренингам, привязанным к этой группе.
- При удалении пользователя из группы — доступ к тренингу сохраняется, если пользователь остаётся в хотя бы одной другой группе, привязанной к тренингу. Иначе — доступ отзывается.
- Прогресс ученика (статусы прохождения уроков, отправленные ответы
на задания) сохраняется при отзыве доступа. Если доступ будет выдан повторно, ученик продолжит с того места, где остановился.
8.7.4. Доступы к подтренингам
Подтренинг может иметь один из двух режимов доступа:
- Наследовать от родителя — подтренинг доступен всем, у кого есть доступ к родительскому тренингу/подтренингу. Это значение по умолчанию.
- Собственные группы — подтренинг доступен только пользователям из указанных групп (независимо от доступа к родителю).
Второй режим решает типовой кейс: на тренинг куплены два тарифа (обычный и премиум), премиум-тариф открывает дополнительный подтренинг с бонусами. Ученики обоих тарифов состоят в группе «Основная», но только премиум-ученики — в группе «Премиум», привязанной к бонусному подтренингу.
При наследовании доступа режим применяется транзитивно вниз по иерархии: если подтренинг A наследует доступ от родителя, а подтренинг A.1 (вложенный в A) — тоже наследует, то A.1 будет доступен всем, у кого есть доступ к корневому тренингу.
8.7.5. Видимость тренинга без доступа
Для тренингов, к которым у пользователя нет доступа, настраивается поведение отображения:
- Не отображать — тренинг скрыт полностью.
- Отображать как заблокированный — тренинг виден в общем списке с пометкой «нет доступа» (например, для мотивации к покупке доступа).
Настройка задаётся на уровне тренинга.
9.8. Управление прохождением уроков
Существует два независимых механизма ограничения доступа к урокам: расписание и стоп-уроки. Механизмы могут работать одновременно — в этом случае урок доступен ученику только при выполнении обоих условий.
9.8.1. Расписание: общие положения
Расписание определяет, когда урок становится доступным ученику с точки зрения времени. Расписание настраивается на уровне тренинга или подтренинга. Если контейнеренинг содержит вложенные подтренинги, расписание для уроков внутри каждого подтренинга настраивается отдельно.
Система поддерживает два типа расписания:
- Общее — одинаковые даты открытия для всех учеников.
- Индивидуальное — даты рассчитываются для каждого ученика от момента получения доступа.
Тип расписания выбирается на уровне тренинга/подтренинга и распространяется на все его уроки.
9.8.2. Типы расписания
9.8.2.1. Общее расписание
Для каждого урока задаётся конкретная дата и время открытия (абсолютная метка времени). Все ученики получают доступ к уроку одновременно в указанный момент.
Кейс: живой поток курса, стартующий 1 сентября для всех участников.
9.8.2.2. Индивидуальное расписание
Для каждого урока задаётся задержка в днях (или часах) относительно точки отсчёта. Точкой отсчёта служит момент получения учеником доступа к тренингу.
- Урок 1 — задержка 0 дней (доступен сразу).
- Урок 2 — задержка 2 дня.
- Урок 3 — задержка 5 дней.
Если ученик получил доступ 10 марта, то урок 3 откроется для него 15 марта.
Кейс: самостоятельное прохождение курса в индивидуальном темпе.
9.8.3. Стоп-уроки
Стоп-урок — это урок, блокирующий переход к последующим урокам до его выполнения.
9.8.3.1. Правила блокировки
Для стоп-урока задаётся критерий «выполнения»:
- Вход в урок — достаточно открыть урок.
- Отправка ответа — ученик должен отправить ответ на задание.
Принятие ответа— ответ должен быть проверен и принят преподавателем.
Пока критерий не выполнен, все уроки, расположенные после стоп-урока в порядке следования, недоступны ученику.
9.8.3.2. Область действия
- Стоп-уроки работают в пределах одного контейнера (тренинга или подтренинга).
- Стоп-урок в подтренинге не блокирует уроки родительского тренинга и наоборот.
Для последовательного открытия подтренингов используется механизм завершения тренинга (см. раздел 9.4).
9.8.4. Последовательное открытие подтренингов
Для организации поэтапного открытия модулей курса используется связка «условие завершения» ↔ «условие доступа»:
У подтренинга A задаётся условие завершения (например, «все стоп-уроки выполнены»).У подтренинга B задаётся условие доступа: «доступен тем, кто завершил подтренинг A».При завершении подтренинга A для ученика — подтренинг B автоматически открывается.
Это позволяет строить цепочки модулей без использования расписания.
9.5. Совместное действие расписания и стоп-уроков
Когда одновременно настроены и расписание, и стоп-уроки — урок доступен ученику только если выполнены оба условия:
- дата открытия по расписанию наступила И
- все предшествующие стоп-уроки выполнены.
Более строгое ограничение имеет приоритет. Например, если по расписанию урок должен открыться, но предыдущий стоп-урок не пройден — урок остаётся закрытым.
9.6.8.5. Видимость закрытых уроков
Для каждого урока настраивается поведение отображения, когда он ещё недоступен:
- Скрыт из списка — ученик не видит урок до момента открытия.
- Виден, но заблокирован — ученик видит название урока и дату открытия, но не может в него войти.
Настройка задаётся на уровне урока и работает одинаково для ограничений по расписанию и по стоп-урокам.
10.9. Пользовательские сценарии
10.9.1. Создание курса (администратор)
Администратор создаёт новый тренинг в статусе «Черновик».Добавляет уроки и/или подтренинги, задаёт порядок.Наполняет уроки контентом.При необходимости настраивает стоп-уроки и расписание.Создаёт группу доступа и привязывает её к тренингу.Переводит тренинг в статус «Опубликован».
10.2. Выдача доступа (администратор)
Администратор открывает управление группой доступа.Добавляет пользователя в группу (вручную или массово).Пользователь немедленно получает доступ ко всем тренингам группы.
10.3. Прохождение тренинга (ученик)
- Ученик видит тренинг в своём списке.
- Открывает первый доступный урок.
- Изучает контент, отправляет ответ на задание (если есть).
- Переходит к следующему уроку — либо сразу, либо после открытия по расписанию, либо после прохождения стоп-урока.
9.2. Выдача доступа
- Пользователь
здобавляется в гршуппу (вручную, массово или программно). - Пользователь немедлен
иино получает доступ ко всех уроков согласно условию завершениям тренингамотмечается какгрупройденнпый.
10.4.9.3. Отзыв доступа (администратор)
Администратор удаляет пПользователь удаляется из группы.- Если пользователь не состоит в других группах с доступом к тренингу — доступ автоматически отзывается.
- Прогресс ученика сохраняется в системе.
11.10. Требования к логированию
Для аудита и отладки модуль должен логировать следующие события:
- создание, изменение, удаление, архивация тренинга/подтренинга/урока;
- изменение состава группы доступа;
- выдача и отзыв доступа пользователю (с указанием причины: ручная / через группу);
- открытие урока учеником;
- отправка ответа
,сменастзатусдаотвниета.
Детализация формата логов — за рамками данного документа.
12.11. Вне области этой документации
Следующие аспекты платформы GetCourse намеренно не включены в MVP:текущую версию:
- роли пользователей, кроме ученика (администратор, преподаватель и т.д.) — будут определены позже;
- условия завершения тренинга — будут определены позже;
- статусы ответов на задания (проверка, принятие, отклонение) — будут определены позже;
- продукты, предложения, оплаты и связка доступов с покупками;
- процессы и автоворонки;
- геймификация (баллы, рейтинги, достижения);
- сертификаты;
- уроки типа «вебинар», «тест», «опрос» (только универсальный урок);
вложенность более одного уровня (подтренинги в подтренингах);- тест-драйв, промо-уроки;
- сквозные чаты в уроках;
- потоки обучения (когорты со стартом по датам).
Эти возможности могут быть добавлены в следующих итерациях.
13.12. Открытые вопросы
Вопросы, требующие обсуждения с продуктовой командой перед началом разработки:
- Какие именно форматы контента поддерживаются в уроке в MVP (только текст + видео? файлы? встраиваемые блоки?).
Нужна ли роль «преподаватель» в MVP или на старте достаточно администратора?- Какие уведомления отправляются ученику при открытии урока по расписанию?
- Как ведёт себя система при смещении расписания в тренинге, где уже есть активные ученики?
- Нужна ли возможность ручной индивидуальной выдачи доступа к отдельному уроку (в обход групп)?
- Есть ли ограничение на максимальную глубину вложенности подтренингов (для защиты от UI/performance проблем)?