Перейти к основному содержимому

Модель мероприятия, сезона, тура и зачёта

Зачем нужно

Документ фиксирует ядро доменной модели олимпиад, конкурсов, турниров и других интеллектуальных соревнований «Систематики».

Модель должна поддерживать разные предметы и форматы мероприятий: математическую олимпиаду, олимпиады по биологии и физике, платный конкурс «Кенгуру», а позже — шахматный турнир и другие форматы.

Математическая олимпиада является референсом, но не единственной моделью. В математике сейчас типично два тура, а в других предметах может быть один тур. Поэтому количество туров, расписание, формат проведения и зачёты должны задаваться настройками сезона, а не кодом.

Что входит

Документ фиксирует:

  • что такое соревновательное мероприятие;
  • как мероприятие связано с предметом и типом;
  • как устроен сезон;
  • как внутри сезона задаются туры;
  • как задаются расписания и окна проведения;
  • как разделяются формат тура, способ прохождения и зачёт;
  • как очный и онлайн-зачёт не смешиваются в результатах;
  • какие сущности нужны для первой версии;
  • какие статусы и бизнес-правила нужны в ядре модели.

Что не входит

В этом документе не проектируются подробно:

  • регистрация ученика на сезон и тур;
  • добавление ученика учителем без аккаунта;
  • семейный доступ;
  • детальная модель организации и площадки;
  • детальная модель банка задач;
  • прохождение онлайн-попытки;
  • загрузка фото и сканов;
  • проверка работ;
  • апелляции;
  • генерация дипломов и благодарственных писем;
  • публичная страница олимпиады;
  • финальные API-контракты.

4. Главный принцип модели

В ядре домена нельзя смешивать пять разных осей.

ОсьЧто описываетПример
Тип мероприятияЧто это за событиеолимпиада, конкурс, турнир
ПредметПо какой области проводитсяматематика, биология, физика
Формат тураКак устроены задания и ответытест, письменная работа, сканы
Способ прохожденияГде и через кого участник проходит туронлайн, у учителя, на площадке
ЗачётКак считаются результаты и наградыочный зачёт, онлайн-зачёт, официальный зачёт

Нельзя считать, что онлайн всегда означает отдельный зачёт, а очный всегда означает официальный зачёт. Это независимые настройки.

5. Верхнеуровневая структура

УровеньСущностьНазначение
1CompetitionEventустойчивое мероприятие, например олимпиада по математике
2CompetitionSeasonконкретный сезон мероприятия
3GradeCategoryклассы, параллели или возрастные категории сезона
4Tourтур внутри сезона
5TourWindowокно или слот проведения тура
6ResultTrackотдельный зачёт для расчёта результатов
7AwardPolicyправила дипломов, грамот и других наград
8TourParticipationучастие конкретного ученика в конкретном туре; подробно описывается отдельно

Пример чтения модели:

  • есть мероприятие «Олимпиада Систематика по математике»;
  • у него есть сезон «20-й сезон»;
  • в сезоне есть первый и второй тур;
  • первый тур может идти две недели онлайн или через учителя;
  • второй тур может иметь очный зачёт и онлайн-зачёт;
  • у каждого зачёта свои результаты, пороги дипломов и публикации.

6. CompetitionEvent

CompetitionEvent — стабильная сущность мероприятия, которая существует дольше одного сезона.

Она отвечает на вопрос: «Что это за мероприятие?»

Примеры:

  • Международная олимпиада по математике «Систематика»;
  • Олимпиада по биологии «Систематика»;
  • Олимпиада по физике «Систематика»;
  • Конкурс «Кенгуру»;
  • Шахматный турнир «Систематика».

Основные поля

ПолеОписание
idуникальный идентификатор
codeстабильный код мероприятия
titleназвание мероприятия
short_titleкраткое название
competition_type_idтип мероприятия
competition_subject_idпредмет или область соревнования
default_grade_rangeбазовый диапазон классов, если применимо
owner_teamкоманда-владелец процесса
statusстатус мероприятия
public_visibilityвидимость на публичной витрине
descriptionкраткое описание

Статусы

СтатусЗначение
draftмероприятие заведено, но ещё не готово к использованию
activeмероприятие активно, можно создавать сезоны
archivedмероприятие больше не проводится, но история сохраняется

Правила

  1. CompetitionEvent не хранит конкретные даты проведения.
  2. CompetitionEvent не хранит результаты участников.
  3. CompetitionEvent не должен быть захардкожен под один сезон.
  4. У одного мероприятия может быть много сезонов.
  5. Публичная страница может ссылаться как на мероприятие в целом, так и на конкретный сезон.

7. CompetitionType

CompetitionType задаёт тип соревновательного мероприятия.

КодНазваниеКомментарий
olympiadОлимпиадаосновной формат для математики, биологии, физики
contestКонкурсподходит для «Кенгуру» и похожих мероприятий
tournamentТурнирподходит для шахматного турнира и будущих турнирных механик

Правила:

  1. Тип мероприятия не должен определять всю механику автоматически.
  2. Тип используется для интерфейсов, фильтров, публичной витрины и базовых шаблонов настроек.
  3. Специальные механики должны добавляться через расширения или настройки.

8. CompetitionSubject

CompetitionSubject описывает предмет или область соревнования.

Важно: CompetitionSubject не равен напрямую направлению обучения. Он может ссылаться на направление обучения, но остаётся отдельной сущностью домена олимпиад.

ПолеОписание
idуникальный идентификатор
codeкод предмета
titleназвание предмета
linked_learning_direction_idсвязь с направлением обучения, если есть
statusактивен или архивен

Примеры:

codetitleКомментарий
mathМатематикаможет быть связана с олимпиадной математикой
biologyБиологияуже существует как предмет мероприятий
physicsФизикауже существует как предмет мероприятий
chessШахматыдля турнира может потребовать расширения модели
kangarooКенгуруможет быть отдельной областью или внешним конкурсом

9. CompetitionSeason

CompetitionSeason — конкретный запуск мероприятия в определённый период.

Она отвечает на вопрос: «Как проводится это мероприятие в этом году или сезоне?»

Все ключевые настройки проведения относятся к сезону:

  • какие классы участвуют;
  • сколько туров проводится;
  • какие форматы туров доступны;
  • какие зачёты есть;
  • какие правила регистрации;
  • какие документы выдаются;
  • какие публикации будут доступны.

Основные поля

ПолеОписание
idуникальный идентификатор
competition_event_idссылка на мероприятие
codeкод сезона
titleназвание сезона
season_numberномер сезона, если используется
academic_yearучебный год или период
starts_atдата начала сезона
ends_atдата завершения сезона
registration_opens_atначало регистрации
registration_closes_atокончание регистрации
statusстатус сезона
fee_policyбесплатное или платное участие
public_visibilityвидимость сезона на сайте
result_publication_policyобщая политика публикации результатов

Статусы

СтатусЗначение
draftсезон создаётся и настраивается
configuredосновные настройки заполнены, но сезон ещё не опубликован
publishedсезон виден пользователям, но регистрация может быть закрыта
registration_openрегистрация открыта
registration_closedрегистрация закрыта, подготовка к проведению
activeсезон находится в процессе проведения
results_processingтуры завершены, идёт проверка и расчёт результатов
results_publishedрезультаты опубликованы
archivedсезон завершён и архивирован
cancelledсезон отменён

Правила

  1. Один CompetitionEvent может иметь много CompetitionSeason.
  2. У каждого сезона должен быть хотя бы один Tour перед публикацией.
  3. Количество туров задаётся настройками сезона.
  4. Сезон может быть бесплатным или платным.
  5. Платный сезон или платное участие должны быть связаны с доменом продуктов и каталога.
  6. Нельзя публиковать сезон, если не заданы обязательные классы, туры и базовые правила регистрации.
  7. Архивный сезон остаётся доступным для истории, результатов, документов и материалов прошлых лет.

10. GradeCategory

GradeCategory описывает класс, параллель или возрастную категорию внутри сезона.

Она нужна потому, что правила, задания, пороги и результаты часто различаются по классам.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
codeкод категории
titleназвание
min_gradeминимальный класс, если применимо
max_gradeмаксимальный класс, если применимо
sort_orderпорядок отображения
is_activeиспользуется ли категория в сезоне

Примеры:

codetitle
grade_11 класс
grade_22 класс
grade_3_43–4 класс
grade_5_75–7 класс
beginnersНачинающие

Правила:

  1. GradeCategory принадлежит сезону.
  2. В разных сезонах один и тот же предмет может иметь разные категории.
  3. Для школьных предметов категория чаще всего соответствует классу или диапазону классов.
  4. Для шахмат и других турниров категория может быть уровнем, рейтингом или возрастной группой.

11. Tour

Tour — логический этап внутри сезона.

Примеры:

  • первый тур;
  • второй тур;
  • отборочный тур;
  • заключительный тур;
  • единственный тур конкурса;
  • финальный раунд турнира.

Основные поля

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
codeкод тура
titleназвание тура
sequence_numberпорядковый номер
tour_kindтип этапа: отборочный, заключительный, единственный, дополнительный
statusстатус тура
default_tour_formatбазовый формат тура
admission_policyправила допуска к туру
result_policyобщие правила результата тура
sort_orderпорядок отображения

Статусы

СтатусЗначение
draftтур создаётся
configuredнастройки тура заполнены
registration_openоткрыта регистрация или выбор формата участия
readyтур готов к проведению
runningтур проводится
closedприём ответов завершён
checkingидёт проверка
results_readyрезультаты рассчитаны, но ещё не опубликованы
publishedрезультаты тура опубликованы
archivedтур архивирован
cancelledтур отменён

Правила

  1. Тур принадлежит одному сезону.
  2. У сезона может быть один или несколько туров.
  3. Порядок туров задаётся явно.
  4. Тур может иметь один или несколько способов прохождения.
  5. Тур может быть связан с одним или несколькими зачётами.
  6. Тур может быть доступен не всем участникам сезона, если есть правила допуска.
  7. Для каждого тура должны быть заданы окна проведения или слоты.

12. TourFormat

TourFormat описывает формат заданий и отправки ответов. Он отвечает на вопрос: «Что участник сдаёт?»

КодНазваниеОписание
testТестированиеучастник выбирает вариант или вводит короткий ответ
written_scanПисьменная работа со сканомучастник решает письменно, затем загружается фото или скан
mixedСмешанный форматесть и тестовые ответы, и загружаемые материалы
externalВнешний форматиспользуется для мероприятий по внешним правилам

Правила:

  1. TourFormat не равен способу прохождения.
  2. Тест может проводиться онлайн или очно через учителя.
  3. Письменная работа может загружаться учеником, учителем или площадкой.
  4. Детальные типы заданий приходят из банка задач.

13. DeliveryMode

DeliveryMode описывает способ прохождения тура конкретным участником или группой участников.

Он отвечает на вопрос: «Где и через кого участник проходит тур?»

КодНазваниеОписание
student_onlineОнлайн самостоятельноученик проходит тур в личном кабинете
teacher_offlineОчно у учителяучитель проводит тур у себя и затем вносит ответы или сканы
teacher_supervised_onlineОнлайн под контролем учителяученики проходят на платформе, но в рамках группы учителя
venue_offlineОчно на площадкеучастник приходит на подтверждённую площадку
external_deliveryВнешнее проведениедля внешних конкурсов или специальных форматов

Правила:

  1. DeliveryMode должен задаваться на уровне TourParticipation, а не только на уровне группы.
  2. В одной группе разные ученики могут иметь разные DeliveryMode.
  3. DeliveryMode может влиять на доступные окна, слоты, инструкции, материалы и требования к загрузке работ.
  4. DeliveryMode может быть связан с ResultTrack, но не должен автоматически определять его.

14. TourWindow

TourWindow описывает окно проведения тура или отдельный слот.

ПолеОписание
idуникальный идентификатор
tour_idтур
codeкод окна или слота
titleназвание
window_typeтип окна
starts_atначало доступности
ends_atконец доступности
start_policyкак участник начинает тур
duration_minutesдлительность попытки, если ограничена
delivery_modeограничение окна по способу прохождения
grade_category_idограничение по классу или категории
venue_idограничение по площадке, если это слот площадки
capacityвместимость окна или слота
statusстатус окна

Типы окон

ТипОписаниеПример
fixed_startфиксированное началовсе начинают 15 марта в 10:00
open_windowоткрытое окноможно начать в любой момент в течение недели
limited_start_windowокно стартаможно начать с 10:00 до 14:00, далее идёт таймер
venue_slotслот площадкипоток на площадке в конкретное время
teacher_controlledокно управляется учителемучитель проводит в разрешённый период

Правила:

  1. Тур должен иметь хотя бы одно окно проведения перед запуском.
  2. Для онлайн-тура может быть длинное окно и индивидуальный таймер.
  3. Для очной площадки могут быть отдельные слоты с вместимостью.
  4. Для учительского проведения может быть разрешённый период, внутри которого учитель сам выбирает время.
  5. Окно может быть ограничено классом, способом прохождения или площадкой.

15. ResultTrack

ResultTrack — отдельный зачётный контур.

Он отвечает на вопрос: «В каком зачёте считаются результаты участника?»

ResultTrack нужен, чтобы не смешивать очный и онлайн-зачёт, официальный и неофициальный зачёт, а также другие возможные контуры результатов.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
tour_idтур, если зачёт относится к конкретному туру
codeкод зачёта
titleназвание зачёта
track_typeтип зачёта
official_statusофициальный, неофициальный, внутренний, партнёрский
allowed_delivery_modesкакие способы прохождения могут попадать в зачёт
award_policy_idправила наград
ranking_policy_idправила ранжирования
publication_policy_idправила публикации
statusстатус зачёта

Типы зачётов

КодНазваниеПример
mainОсновной зачётединственный зачёт в однотуровом конкурсе
in_personОчный зачётвторой тур на площадках
onlineОнлайн-зачётвторой тур онлайн
officialОфициальный зачётзачёт для официальных отчётов
communityКомьюнити-зачётотдельный продуктовый или неофициальный зачёт
externalВнешний зачётдля партнёрских или внешних мероприятий

Статусы

СтатусЗначение
draftзачёт создаётся
configuredзаданы основные правила
activeзачёт используется для участников
scoringидёт расчёт результатов
results_readyрезультаты готовы
publishedрезультаты опубликованы
archivedзачёт архивирован

Правила

  1. ResultTrack не должен автоматически выводиться только из DeliveryMode.
  2. Один тур может иметь несколько ResultTrack.
  3. У каждого ResultTrack могут быть свои пороги наград.
  4. У каждого ResultTrack может быть своя публикация результатов.
  5. У каждого ResultTrack может быть свой официальный статус.
  6. Участник должен быть явно отнесён к зачёту через правила участия или выбор формата.
  7. Результаты разных зачётов не должны смешиваться в рейтинге и списках победителей.

16. AwardPolicy и ScoreThreshold

AwardPolicy задаёт правила выдачи дипломов, грамот и других наград в конкретном зачёте.

ScoreThreshold задаёт балльные пороги для конкретных наград.

AwardPolicy

ПолеОписание
idуникальный идентификатор
result_track_idзачёт
grade_category_idкласс или категория, если правило отличается по классам
titleназвание правила
calculation_methodпо порогам, по местам, смешанный метод
statusстатус правила

ScoreThreshold

ПолеОписание
idуникальный идентификатор
award_policy_idправило наград
award_typeдиплом, грамота, сертификат
award_levelуровень награды
min_scoreминимальный балл
max_scoreмаксимальный балл, если нужен
sort_orderпорядок применения

Стартовые награды участников:

КодНазвание
diploma_1диплом первого места
diploma_2диплом второго места
diploma_3диплом третьего места
honorable_mention_1похвальная грамота первой степени
honorable_mention_2похвальная грамота второй степени
participation_certificateсертификат участника, если включён правилами сезона

Правила:

  1. Пороги наград задаются администратором.
  2. Пороги могут различаться по зачётам.
  3. Пороги могут различаться по классам или категориям.
  4. Система должна рассчитывать наградной статус после финализации результатов.
  5. Генерация документа должна происходить через общий механизм документов.

17. Связи сущностей

СвязьКардинальностьКомментарий
CompetitionType → CompetitionEvent1 ко многимодин тип используется многими мероприятиями
CompetitionSubject → CompetitionEvent1 ко многимодин предмет может иметь несколько мероприятий
CompetitionEvent → CompetitionSeason1 ко многиму мероприятия много сезонов
CompetitionSeason → GradeCategory1 ко многимкатегории задаются внутри сезона
CompetitionSeason → Tour1 ко многиму сезона один или несколько туров
Tour → TourWindow1 ко многиму тура одно или несколько окон проведения
CompetitionSeason → ResultTrack1 ко многимзачёты задаются в контексте сезона
Tour → ResultTrack1 ко многим, optionalзачёт может относиться к конкретному туру
ResultTrack → AwardPolicy1 ко многимправила наград могут различаться по классам
AwardPolicy → ScoreThreshold1 ко многиму правила несколько порогов

18. Пример настройки математической олимпиады

УровеньЗначение
CompetitionEventОлимпиада Систематика по математике
CompetitionTypeolympiad
CompetitionSubjectmath
CompetitionSeason20-й сезон
Fee policyfree
Toursпервый тур, второй тур

Первый тур:

НастройкаЗначение
Tour kindотборочный
TourFormattest
DeliveryModestudent_online, teacher_offline, teacher_supervised_online
TourWindowдлинное окно или ограниченное окно сезона
ResultTrackосновной зачёт первого тура

Второй тур:

НастройкаЗначение
Tour kindзаключительный
TourFormatwritten_scan или mixed
DeliveryModevenue_offline, student_online
ResultTrackочный зачёт, онлайн-зачёт
AwardPolicyотдельные пороги по каждому зачёту

19. Пример однотуровой олимпиады

ПолеЗначение
CompetitionEventОлимпиада по биологии
CompetitionSeasonсезон 2026
Toursодин тур
TourFormattest или mixed
ResultTrackосновной зачёт
AwardPolicyпороги по классам или категориям

Однотуровая олимпиада должна использовать ту же модель, что и двухтуровая математика.

20. Пример конкурса «Кенгуру»

ПолеЗначение
CompetitionEventКонкурс «Кенгуру»
CompetitionTypecontest
Fee policypaid
DeliveryModeteacher_offline, venue_offline, external_delivery
ResultTrackзависит от правил конкурса

Особенность: коммерческая часть должна быть связана с доменом продуктов и каталога. Если «Систематика» выступает площадкой, это должно моделироваться через организацию и роль площадки.

21. Админские требования

Администратор должен иметь возможность:

  • создать CompetitionEvent;
  • выбрать CompetitionType;
  • выбрать CompetitionSubject;
  • создать CompetitionSeason;
  • задать классы или категории сезона;
  • задать бесплатную или платную модель участия;
  • создать один или несколько Tour;
  • задать порядок туров;
  • выбрать TourFormat;
  • настроить доступные DeliveryMode;
  • задать TourWindow и слоты;
  • создать ResultTrack;
  • связать ResultTrack с туром, способом прохождения или правилами участия;
  • задать AwardPolicy и ScoreThreshold;
  • настроить видимость сезона и результатов;
  • архивировать сезон без потери истории.

22. Права доступа

Минимальные права для будущей модели доступа:

ПравоНазначение
competition_event.createсоздать мероприятие
competition_event.updateизменить мероприятие
competition_season.createсоздать сезон
competition_season.configureнастраивать сезон
competition_season.publishпубликовать сезон
tour.createсоздать тур
tour.configureнастраивать тур
tour.runзапускать проведение тура
result_track.configureнастраивать зачёты
award_policy.configureнастраивать пороги наград
competition.archiveархивировать сезон или мероприятие

Права должны быть согласованы с доменом идентификации и доступа.

23. Доменные события

СобытиеКогда возникает
CompetitionEventCreatedсоздано мероприятие
CompetitionSeasonCreatedсоздан сезон
CompetitionSeasonPublishedсезон опубликован
TourCreatedсоздан тур
TourConfiguredтур настроен
TourWindowCreatedсоздано окно проведения
TourStartedтур начался
TourClosedприём работ завершён
ResultTrackCreatedсоздан зачёт
AwardPolicyUpdatedизменены правила наград
SeasonArchivedсезон архивирован

Все изменения, влияющие на проведение, результаты и публикации, должны попадать в аудит.

24. Нестандартные случаи

СитуацияТребуемое поведение
Сезон создан без туровнельзя публиковать сезон
Тур создан без окна проведениянельзя запускать тур
У второго тура два зачётарезультаты и награды считаются отдельно
Один DeliveryMode подходит под несколько зачётовнужны явные правила назначения участника в зачёт
Платный конкурс создан без продуктанельзя открыть регистрацию до настройки коммерческой части
Класс есть в сезоне, но не имеет заданийнельзя открыть тур для этой категории
Изменились пороги наград после расчётанужен аудит и пересчёт результатов
Тур отменёнучастия и результаты не удаляются, а переводятся в корректные статусы

Готовность

  1. Добавить базовые модели CompetitionEvent, CompetitionType и CompetitionSubject.
  2. Добавить модель CompetitionSeason со статусами.
  3. Добавить модель GradeCategory внутри сезона.
  4. Добавить модель Tour со статусами и порядком.
  5. Добавить модель TourWindow для окон и слотов проведения.
  6. Добавить справочники TourFormat и DeliveryMode.
  7. Добавить модель ResultTrack.
  8. Добавить модели AwardPolicy и ScoreThreshold.
  9. Добавить административные CRUD-экраны или API для настройки сезона.
  10. Добавить аудит изменений для сезона, тура, окна проведения, зачёта и порогов наград.

27. Статус документа

Документ является первой версией ядра модели. Следующий рекомендуемый документ: модель участия, регистрации и доступа ученика к олимпиаде.