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

Результаты, зачёты и публикация

Зачем нужно

Документ описывает, как в домене олимпиад рассчитываются баллы, финальные результаты, места, наградные статусы и публикации на основе immutable score snapshots, полученных из LMS activity runtime или temporary compatible adapter.

Ключевая особенность домена: один и тот же сезон или тур может иметь несколько отдельных зачётов. Например, во втором туре математической олимпиады может быть очный зачёт и онлайн-зачёт. Эти зачёты не должны смешиваться при расчёте победителей, призёров, дипломов, публичных списков и отчётности.

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

Что входит

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

  • отличие Score, FinalResult, Ranking и AwardStatus;
  • immutable score snapshots по LMS activity item;
  • модель ResultTrack как отдельного зачётного контура;
  • расчёт результата по туру и сезону;
  • связь результата с классом или категорией;
  • правила наградных порогов;
  • процентные ориентиры порогов и ручное утверждение;
  • удержание результата от публикации;
  • публикацию личных результатов;
  • публикацию результатов группы;
  • публичные списки победителей и призёров;
  • официальные публикации и внутренние публикации;
  • правила аудита изменений результатов;
  • edge cases для пересчёта, MVP-апелляций, арбитража и смены зачёта.

Что не входит

Документ не проектирует подробно:

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

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

Нельзя смешивать четыре уровня результата.

УровеньЧто означаетПример
Scoreбалл за задание, часть работы или тур7 баллов за задачу
FinalResultутверждённый результат участника в туре или зачёте42 балла в очном зачёте
Rankingместо или позиция участника внутри зачёта и категории3 место среди 5 класса
AwardStatusнаградной статус по правилам зачётадиплом 2 места

Результат всегда должен считаться в контексте ResultTrack, класса или категории и сезона или тура.

5. Основные сущности

СущностьНазначение
Scoreбалл за работу, задачу, часть работы или тур
FinalScoreфинальный утверждённый балл
FinalResultфинальный результат участника в зачёте
ResultTrackотдельный зачётный контур
Rankingранжирование участников внутри зачёта
Placeместо участника
AwardPolicyправила выдачи наград
ScoreThresholdбалльный порог награды
AwardStatusитоговый наградной статус
ResultCalculationRunзапуск расчёта результатов
ResultPublicationпубликация результатов
PublicResultListпубличный список результатов
PrivateResultViewличное отображение результата участнику
GroupResultViewотображение результатов для учителя или организации
AppealMVP-апелляция по проверке или результату
ArbitrationCaseотдельный кейс подозрительной работы или нарушения регламента

6. Score и FinalScore

Score — отдельный балл, полученный по задаче, части работы, автоматической проверке или ручной проверке. Для competition result он фиксируется как immutable score snapshot, полученный из LMS activity runtime, temporary adapter или imported/manual mode.

FinalScore — итоговый утверждённый балл, который используется для расчёта результата.

Поле ScoreОписание
idуникальный идентификатор
tour_participation_idучастие в туре
submission_idработа или отправка
task_idзадание, если балл относится к заданию
lms_activity_item_refitem ref внутри LMS activity или adapter
task_numberномер задачи для отображения результата
score_typeавтоматический, ручной, модерационный, апелляционный
valueзначение балла
max_valueмаксимум
sourceисточник балла
created_by_user_idкто выставил или создал балл
statusстатус балла

Статусы Score:

СтатусЗначение
draftбалл черновой
submittedбалл выставлен
moderatedбалл прошёл модерацию
disputedбалл оспаривается
finalбалл финализирован
voidedбалл отменён

Правила:

  1. Сырые Score не должны напрямую публиковаться как итоговый результат.
  2. Result calculation использует score snapshots, а не raw answers.
  3. FinalScore формируется после автоматической проверки, ручной проверки, модерации и возможных корректировок.
  4. Любое изменение Score после финализации должно аудироваться.
  5. Если была апелляция, исходный балл не удаляется, а фиксируется новая версия или корректировка.
  6. Training scores из LMS не попадают в competition score snapshots.

7. FinalResult

FinalResult — утверждённый результат участника в конкретном зачёте.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
tour_idтур, если результат относится к туру
result_track_idзачёт
season_participation_idучастие в сезоне
tour_participation_idучастие в туре, если применимо
student_record_idзапись ученика
grade_category_idкласс или категория
final_scoreфинальный балл
max_scoreмаксимум
result_statusстатус результата
calculated_atкогда рассчитан
finalized_atкогда финализирован
finalized_by_user_idкто финализировал, если вручную
threshold_policy_snapshotзафиксированные пороги и процентные ориентиры
is_withheldрезультат удержан от публикации
withheld_reasonпричина удержания

Статусы result_status:

СтатусЗначение
pendingрезультат ещё не готов
calculatedрезультат рассчитан
needs_reviewтребуется проверка или модерация
finalizedрезультат финализирован
ready_for_publicationрезультат финализирован и готов к отдельному publication action
published_privateрезультат опубликован лично участнику через publication
published_publicрезультат включён в публичную публикацию через publication
withheldрезультат удержан от публикации
cancelledрезультат отменён

Правила:

  1. FinalResult всегда относится к ResultTrack.
  2. FinalResult не должен существовать без grade_category_id, если в сезоне результаты считаются по классам.
  3. Один участник может иметь разные FinalResult в разных зачётах.
  4. Результаты разных ResultTrack не смешиваются в одном Ranking.
  5. FinalResult может быть рассчитан заново, но история расчётов должна сохраняться.
  6. Удержанный результат исключается из личной/публичной публикации до release action, если policy не задаёт иной личный показ.
  7. FinalResult не меняется от LMS training attempts после публикации тренажёра.

8. ResultTrack

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

Примеры:

КодСмысл
mainосновной зачёт
in_personочный зачёт
onlineонлайн-зачёт
officialофициальный зачёт
communityотдельный неофициальный зачёт
externalвнешний или партнёрский зачёт

Правила:

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

9. Ranking и Place

Ranking — результат ранжирования участников внутри зачёта.

Place — место конкретного участника в Ranking.

Поле RankingОписание
idуникальный идентификатор
result_track_idзачёт
competition_season_idсезон
tour_idтур, если рейтинг относится к туру
grade_category_idкласс или категория
ranking_policy_idправило ранжирования
statusстатус рейтинга
calculated_atдата расчёта
Поле PlaceОписание
idуникальный идентификатор
ranking_idрейтинг
final_result_idфинальный результат
place_numberместо
rank_positionпозиция в отсортированном списке
tie_groupгруппа равенства, если есть
statusстатус места

Статусы Ranking:

СтатусЗначение
draftрейтинг готовится
calculatedрейтинг рассчитан
needs_reviewтребуется проверка
finalizedрейтинг финализирован
publishedрейтинг опубликован
archivedрейтинг архивирован

Правила:

  1. Ranking строится отдельно для каждого ResultTrack и grade_category_id.
  2. При равных баллах политика мест должна быть задана явно.
  3. Публичный список может показывать не все места, а только победителей и призёров.
  4. Изменение FinalResult после финализации рейтинга требует пересчёта.

10. AwardPolicy, ScoreThreshold и AwardStatus

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

ScoreThreshold задаёт балльные пороги для наград. Порог может быть абсолютным баллом или процентным ориентиром от распределения результатов в классе/зачёте.

AwardStatus — итоговый наградной статус участника.

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

КодНазвание
diploma_1диплом первого места
diploma_2диплом второго места
diploma_3диплом третьего места
honorable_mention_1похвальная грамота первой степени
honorable_mention_2похвальная грамота второй степени
participation_certificateсертификат участника, если включён правилами
no_awardбез награды
Поле AwardStatusОписание
idуникальный идентификатор
final_result_idфинальный результат
result_track_idзачёт
award_policy_idправило наград
award_codeкод награды
award_titleназвание награды
assigned_byсистема или администратор
threshold_snapshotбалльный порог, процентный ориентир и ручное решение
statusстатус наградного статуса
assigned_atдата назначения

Статусы AwardStatus:

СтатусЗначение
calculatedнаграда рассчитана
approvedнаграда утверждена
revokedнаграда отозвана
publishedнаграда опубликована
document_generatedдокумент сгенерирован

Правила:

  1. Пороги наград задаются отдельно по зачётам.
  2. Пороги могут отличаться по классам или категориям.
  3. Очный и онлайн-зачёт могут иметь разные пороги дипломов и грамот.
  4. Наградной статус не равен сгенерированному документу.
  5. Генерация документа должна опираться на AwardStatus, но жить в общем механизме документов.
  6. Изменение порогов после расчёта требует пересчёта и аудита.
  7. Процентные ориентиры не публикуются автоматически: администратор должен утвердить итоговые пороги перед публикацией.

11. ResultCalculationRun

ResultCalculationRun фиксирует запуск расчёта результатов.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
tour_idтур, если расчёт по туру
result_track_idзачёт
grade_category_idкласс или категория, если расчёт ограничен
calculation_typeпервичный расчёт, пересчёт, расчёт после апелляций
triggered_by_user_idкто запустил расчёт
statusстатус запуска
started_atначало
finished_atзавершение
summaryкраткий результат расчёта

Статусы:

СтатусЗначение
queuedпоставлен в очередь
runningвыполняется
completedзавершён
completed_with_warningsзавершён с предупреждениями
failedне завершён
cancelledотменён

Правила:

  1. Каждый массовый расчёт результатов должен создавать ResultCalculationRun.
  2. Пересчёт не должен затирать историю предыдущего расчёта.
  3. Если часть работ не проверена, расчёт должен либо блокироваться, либо завершаться с предупреждениями по явному правилу.
  4. После апелляций должен быть отдельный пересчёт или корректировка с историей.

12. ResultPublication

ResultPublication — публикация результатов в определённом контуре доступа.

Виды публикации:

ВидКто видит
privateтолько участник и разрешённые семейные пользователи
groupучитель или организация видит своих учеников
venueплощадка видит результаты участников площадки, если это разрешено
publicоткрытый список на сайте
officialофициальный список для регламентной публикации или отчётности
admin_internalвнутренняя административная публикация
ПолеОписание
idуникальный идентификатор
competition_season_idсезон
tour_idтур, если публикация по туру
result_track_idзачёт
publication_typeтип публикации
grade_category_idкласс или категория, если публикация ограничена
statusстатус публикации
visible_fields_policyкакие поля показывать
opens_atначало публикации
closes_atокончание, если есть
published_atкогда опубликовано
published_by_user_idкто опубликовал

Статусы:

СтатусЗначение
draftпубликация готовится
scheduledпубликация запланирована
publishedопубликована
pausedвременно остановлена
retractedотозвана
archivedархивирована

Правила:

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

13. PrivateResultView

PrivateResultView — личный результат участника в кабинете.

Может показывать:

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

Правила:

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

14. GroupResultView

GroupResultView — представление результатов для преподавателя в выбранной организации.

Может показывать:

  • список учеников CompetitionGroup snapshot;
  • статус прохождения;
  • баллы;
  • допуск к следующему туру;
  • наградной статус;
  • ссылки на документы;
  • статусы получения аккаунта учеником;
  • признаки проблем: нет работы, дубль, неявка, не проверено.

Правила:

  1. Преподаватель видит только учеников своих Learning Groups/CompetitionGroup snapshots, если у него нет расширенной роли.
  2. Административный подслой выбранной организации может видеть несколько snapshots в рамках роли.
  3. Результаты внешних участников площадки не должны автоматически попадать в преподавательский слой.
  4. Организация, совмещающая свои группы и открытую площадку, должна видеть эти контуры раздельно.

15. PublicResultList

PublicResultList — публичный список результатов, победителей, призёров или награждённых.

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

Типы list_type:

ТипОписание
winnersпобедители
prize_winnersпризёры
honorable_mentionsпохвальные грамоты
awardeesвсе награждённые
full_resultsполный список, если разрешено
official_report_listофициальный список для регламентной публикации

Правила:

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

16. Visible fields policy

Политика видимых полей определяет, какие данные показываются в публикации.

Возможные поля:

ПолеКомментарий
full_nameФИО участника
grade_categoryкласс или категория
cityгород
countryстрана
organization_nameшкола или организация
teacher_nameучитель, если публикуется
final_scoreитоговый балл
placeместо
award_statusнаградной статус
result_track_titleзачёт

Правила:

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

17. Статусная модель: результат

СостояниеЗначение
work_submittedработа отправлена
checkingработа проверяется
scoredбаллы выставлены
final_score_readyфинальный балл готов
result_calculatedрезультат рассчитан
ranking_calculatedрейтинг рассчитан
award_calculatedнаградной статус рассчитан
result_finalizedрезультат финализирован
result_withheldрезультат удержан от публикации
private_publishedличный результат опубликован
public_publishedпубличный список опубликован
document_readyдокумент доступен
archivedрезультат архивирован

18. MVP-апелляция и арбитраж

MVP-апелляция — пользовательский workflow несогласия с проверкой или результатом.

ArbitrationCase — отдельный административный workflow для подозрительных работ, нарушений регламента и санкций.

СущностьЧто решаетКто инициирует
Appealошибка проверки, несогласие с баллом, техническая претензия к результатуучастник, родитель, преподаватель
ArbitrationCaseподозрение на нарушение, списывание, недопуск, санкцияпроверяющий, админ «Систематики»

Правила:

  1. Appeal не используется для дисциплинарных подозрений.
  2. Accepted appeal создаёт новую версию Score/FinalScore или ResultCalculationRun.
  3. ArbitrationCase может удержать результат от публикации.
  4. Решения appeal и arbitration требуют reason, actor и audit.
  5. UI-статус апелляции “Новая” соответствует техническому статусу submitted; отдельный technical new не вводится.

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

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

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

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

ПравоНазначение
result.view_ownсмотреть свой результат
result.view_childсмотреть результат ребёнка
result.view_groupсмотреть результаты группы
result.view_organizationсмотреть результаты организации
result.view_venueсмотреть результаты участников площадки, если разрешено
result.admin_viewадминистративный просмотр результатов
result.calculateзапускать расчёт результатов
result.finalizeфинализировать результаты
result.withholdудержать результат от публикации
result.recalculateзапускать пересчёт
award_policy.configureнастраивать правила наград
award_status.approveутверждать наградные статусы
appeal.createподать MVP-апелляцию
appeal.decideпринять решение по апелляции
arbitration_case.createоткрыть кейс подозрительной работы
arbitration_case.decideпринять решение арбитража
result_publication.configureнастраивать публикацию
result_publication.publishпубликовать результаты
result_publication.retractотзывать публикацию
public_result_list.generateформировать публичный список

21. Требования к аудиту

Аудироваться должны:

  • создание и изменение Score;
  • создание и изменение FinalScore;
  • запуск расчёта результатов;
  • ошибки и предупреждения расчёта;
  • финализация результата;
  • изменение ResultTrack участника;
  • изменение AwardPolicy;
  • изменение ScoreThreshold;
  • ручное утверждение процентных ориентиров порогов;
  • пересчёт AwardStatus;
  • ручная корректировка наградного статуса;
  • удержание и release результата;
  • решение appeal;
  • решение arbitration case;
  • создание публикации;
  • публикация результатов;
  • отзыв публикации;
  • генерация публичного списка;
  • изменение политики видимых полей.

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

СобытиеКогда возникает
ScoreSubmittedбалл выставлен
FinalScoreCalculatedфинальный балл рассчитан
ResultCalculationStartedрасчёт результатов запущен
ResultCalculationCompletedрасчёт результатов завершён
FinalResultCalculatedфинальный результат рассчитан
RankingCalculatedрейтинг рассчитан
AwardStatusCalculatedнаградной статус рассчитан
ThresholdsApprovedпороги утверждены вручную
ResultsFinalizedрезультаты финализированы
ResultWithheldрезультат удержан от публикации
AppealSubmittedподана MVP-апелляция
AppealDecidedпринято решение по апелляции
ArbitrationCaseOpenedоткрыт арбитражный кейс
ArbitrationCaseDecidedпринято решение арбитража
PrivateResultsPublishedличные результаты опубликованы
GroupResultsPublishedгрупповые результаты опубликованы
PublicResultListGeneratedпубличный список сформирован
PublicResultsPublishedпубличные результаты опубликованы
ResultPublicationRetractedпубликация отозвана

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

СитуацияТребуемое поведение
В зачёте есть непроверенные работырасчёт блокируется или завершается с предупреждением по явному правилу
Участник ошибочно попал в онлайн-зачёт вместо очногоизменение ResultTrack требует аудита и пересчёта
После публикации изменился баллнужна новая версия результата, пересчёт наград и решение по публикации
Пороги наград изменились после расчётатребуется пересчёт AwardStatus и аудит
Процентные ориентиры дали спорный порогадминистратор вручную утверждает итоговый threshold snapshot
Результат удержан арбитражемрезультат исключается из публикации до release
Участник подал апелляцию на подозрение в нарушениизапрос маршрутизируется в arbitration/support, а не в MVP appeal
У двух участников одинаковые баллыприменяется RankingPolicy для равенства мест
Участник дисквалифицирован после расчётарезультат переводится в специальный статус и рейтинг пересчитывается
Личный результат опубликован, публичный список ещё нетэто допустимо, если так настроена публикация
Публичный список отозвансписок не удаляется из истории, а получает статус retracted
Участник без аккаунта получил дипломдоступ к документу должен быть связан с AccountClaim или семейной группой

Готовность

  1. Добавить модели Score и FinalScore.
  2. Добавить модель FinalResult.
  3. Добавить модель Ranking и Place.
  4. Расширить ResultTrack политиками результата и публикации.
  5. Добавить модели AwardStatus и ResultCalculationRun.
  6. Добавить модель ResultPublication.
  7. Добавить модели PrivateResultView, GroupResultView и PublicResultList или их сервисные представления.
  8. Добавить настройку visible_fields_policy для публикаций.
  9. Добавить ручное утверждение процентных ориентиров порогов.
  10. Добавить result withholding.
  11. Добавить разделение MVP appeal и arbitration case.
  12. Добавить права расчёта, финализации и публикации результатов.
  13. Добавить аудит изменения баллов, порогов, результатов и публикаций.
  14. Добавить запрет смешивания ResultTrack в одном публичном списке без явного агрегирующего правила.
  15. Добавить административный запуск расчёта и пересчёта результатов.

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

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