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

Модель участия, регистрации и доступа ученика

Зачем нужно

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

Ключевая особенность домена: преподаватель часто регистрирует учеников из своих Learning Groups, а часть учеников ещё не имеет аккаунта. При этом платформа заинтересована в том, чтобы участник позже стал полноценным пользователем, получил доступ к результатам, сканам работ, дипломам и истории участия.

Документ должен быть согласован с доменом идентификации и доступа и Learning Workspace. Олимпиады не владеют пользователями, организациями, семейными группами, Learning Workspace и Learning Group как источниками истины, но используют их для регистрации, прав доступа и просмотра результатов.

Что входит

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

  • различие между записью ученика и аккаунтом пользователя;
  • индивидуальную, родительскую и двухшаговую регистрацию;
  • групповую регистрацию через Learning Group;
  • competition_group как season snapshot/projection;
  • участие ученика, добавленного без аккаунта;
  • получение доступа к записи ученика;
  • связь с семейной группой;
  • участие в сезоне;
  • участие в туре;
  • выбор способа прохождения тура;
  • назначение в зачёт;
  • базовые статусы регистрации и участия;
  • official data package только для официального сценария;
  • текстовое поле «учитель» без автоматической связи;
  • требования к аудиту и правам доступа.

Что не входит

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

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

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

В домене участия нельзя смешивать четыре разных объекта.

ОбъектЧто означаетИсточник истины
Userаккаунт для входа в платформуидентификация и доступ
StudentRecordзапись о ребёнке как об участнике или потенциальном участникеолимпиады совместно с identity
StudentProfileпрофиль ученика, связанный с пользователемидентификация и доступ
LearningGroupканоническая учебная группа преподавателяLearning Workspace
CompetitionGroupснимок Learning Group для регистрации сезонаолимпиады
SeasonParticipationучастие конкретного ученика в конкретном сезонеолимпиады
TourParticipationучастие конкретного ученика в конкретном туреолимпиады

Запись ученика может существовать до появления аккаунта. Аккаунт может быть получен позже ребёнком, родителем или обоими.

5. Основные сценарии

5.1. Индивидуальная регистрация ученика или родителя

  1. Пользователь входит или создаёт аккаунт.
  2. Создаётся или выбирается профиль ученика.
  3. Пользователь выбирает мероприятие и сезон.
  4. Система проверяет доступность регистрации.
  5. Создаётся предварительная SeasonRegistration.
  6. Пользователь дозаполняет обязательные поля второго шага.
  7. Если регламент официального сценария требует official data package, система проверяет СНИЛС ребёнка, дату рождения ребёнка, email родителя и телефон родителя через identity protected attributes; вне official flow эти поля не запрашиваются и не принимаются competitions API.
  8. После подтверждения создаётся или активируется SeasonParticipation.
  9. Ученик получает доступ к доступным турам, инструкциям и результатам.

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

5.2. Преподаватель регистрирует Learning Group

  1. Преподаватель входит в преподавательский режим и выбирает организацию.
  2. Система показывает Learning Workspaces / Learning Groups, доступные через Learning Workspace.
  3. Преподаватель выбирает группу или отдельных учеников.
  4. Competitions создаёт CompetitionGroup как снимок состава для сезона.
  5. Для учеников без аккаунта создаются StudentRecord/CompetitionParticipant без связанного User.
  6. Преподаватель регистрирует группу или выбранных учеников на сезон.
  7. Создаётся SeasonParticipation с признаком, что доступ участника ещё не получен.
  8. Ученик участвует через преподавателя или самостоятельно, если так настроен TourParticipation.
  9. Позже ребёнок или родитель получает доступ к записи.

CompetitionGroup не является каноническим списком учеников преподавателя. Любой экран «мои ученики» должен читать Learning Workspace / Learning Group.

5.3. Смешанное участие внутри группы

  1. Преподаватель регистрирует CompetitionGroup snapshot на сезон.
  2. Для каждого ученика определяется способ участия в конкретном туре.
  3. Часть учеников пишет очно у учителя.
  4. Часть учеников проходит тур онлайн самостоятельно.
  5. Результаты обоих сценариев собираются в кабинете учителя.

Вывод: способ прохождения должен храниться на уровне TourParticipation, а не только на уровне группы.

5.4. Ученик прошёл первый тур сам, а позже привязан к учителю

  1. Ученик зарегистрировался индивидуально и прошёл первый тур.
  2. Преподаватель позже выбирает этого ученика в Learning Group или получает подтверждённую связь.
  3. Система предлагает связать существующую запись с CompetitionGroup snapshot.
  4. После подтверждения преподаватель получает разрешённый доступ к результатам ученика.
  5. Участие в следующем туре может идти уже через преподавателя или площадочный подслой выбранной организации.

Этот сценарий требует аккуратной модели согласий и прав доступа.

5.5. Получение доступа к записи ученика

  1. В системе уже есть StudentRecord без аккаунта.
  2. Ребёнок или родитель инициирует получение доступа.
  3. Система проверяет данные и право на доступ.
  4. Запись связывается с User, StudentProfile или Family.
  5. Участник получает доступ к своим результатам, работам и документам.
  6. Все действия сохраняются в аудите.

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

6.1. StudentRecord

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

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

ПолеОписание
idуникальный идентификатор
sourceкак запись создана: индивидуально, учителем, импортом, администратором
first_nameимя
last_nameфамилия
middle_nameотчество, если используется
birth_dateдата рождения, если требуется
gradeкласс на момент сезона или регистрации
countryстрана
cityгород
school_name_textназвание школы текстом, если нет связи с Organization
teacher_name_textтекстовое поле «учитель», без автоматической связи с User
official_data_refзащищённый identity ref на official data package, если требуется регламентом
organization_student_idexternal ref на identity-owned ученика организации, если запись создана через организацию
identity_organization_idexternal ref на identity-owned организацию
organization_student_snapshotФИО/класс на момент регистрации
created_by_user_idкто создал запись
linked_student_profile_idсвязанный профиль ученика, если доступ получен
linked_family_idсемейная группа, если запись связана с семьёй
identity_statusстатус идентификации записи
duplicate_statusстатус проверки дублей
statusстатус записи

Статусы identity_status:

СтатусЗначение
unclaimedзапись не связана с аккаунтом
claim_pendingначато получение доступа
claimed_by_childдоступ получил ребёнок
claimed_by_adultдоступ получил взрослый
claimed_by_familyзапись связана с семейной группой
blockedдоступ заблокирован из-за спорной ситуации

Правила:

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

6.2. SeasonRegistration

SeasonRegistration — заявка или факт регистрации ученика на сезон.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
student_record_idзапись ученика
registration_typeиндивидуальная, групповая, импорт, административная
registered_by_user_idкто выполнил регистрацию
identity_organization_idexternal ref на identity-owned организацию, если регистрация через организацию
learning_workspace_idexternal ref на Learning Workspace
learning_group_idexternal ref на Learning Group
competition_group_idснимок Learning Group для сезона, если регистрация через преподавателя
teacher_name_textтекстовое поле анкеты, не выдаёт доступ
official_data_package_requiredтребуется ли official data package
official_data_package_statusnot_required, not_filled, incomplete, needs_verification, confirmed, rejected
official_data_refprotected ref на identity-owned official attributes
parent_contact_refref на contact record родителя
parent_invite_refref на pending parent account/invite
official_data_collected_by_user_idкто инициировал или внёс данные
official_data_verified_atкогда данные проверены
statusстатус регистрации
stageшаг регистрации
submitted_atдата подачи
confirmed_atдата подтверждения
cancelled_atдата отмены
cancellation_reasonпричина отмены

Статусы:

СтатусЗначение
draftрегистрация начата, но не завершена
pre_submittedпредварительная регистрация создана
needs_completionтребуется дозаполнение второго шага
submittedрегистрация отправлена
pending_reviewтребуется проверка администратором
approvedрегистрация подтверждена
rejectedрегистрация отклонена
cancelledрегистрация отменена
duplicate_holdрегистрация удержана из-за возможного дубля

Правила:

  1. Регистрация относится к конкретному сезону.
  2. Регистрация может быть индивидуальной, родительской или групповой через Learning Group.
  3. Для платных мероприятий регистрация может зависеть от оплаты.
  4. Подтверждённая регистрация создаёт или активирует SeasonParticipation.
  5. Повторная регистрация того же ученика на тот же сезон должна проходить проверку дублей.
  6. teacher_name_text не создаёт relation с преподавателем.
  7. Raw official fields не принимаются competitions API; collection идёт через identity-owned protected flow.
  8. Official data package допускается только при official_data_package_required = true.
  9. Родительская регистрация должна приводить к child-mode прохождению тура ребёнком.

6.2.1. Официальный пакет данных для ГИР

Official data package нужен только для официального зачёта или передачи результатов во внешний официальный контур.

Стартовый состав:

ПолеГде живётКто может заполнить
СНИЛС ребёнкаidentity protected attributes / защищённый профиль ребёнкародитель, ученик, учитель в разрешённом official flow, администратор
Дата рождения ребёнкаidentity student_profile / protected attributesродитель, ученик, учитель в разрешённом official flow, администратор
Email родителяidentity family contact / parent contact recordродитель, учитель в разрешённом official flow, администратор
Телефон родителяidentity family contact / parent contact recordродитель, учитель в разрешённом official flow, администратор

Competitions хранит только:

  • что package требуется для регистрации, тура или зачёта;
  • статус полноты и проверки;
  • official_data_ref на protected identity record;
  • parent_contact_ref или parent_invite_ref;
  • кто инициировал сбор или передачу;
  • audit действий.

Ручной ввод учителем:

  1. Разрешён только регламентом official flow.
  2. Создаёт identity collection session, а не raw запись в competitions.
  3. Может создать contact record родителя и pending parent account/invite.
  4. Не выдаёт учителю родительские права.
  5. Родитель подтверждает доступ по ссылке, принимает условия и получает семейную связь с ребёнком через identity/claim flow.

6.3. SeasonParticipation

SeasonParticipation — участие ученика в сезоне.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
student_record_idзапись ученика
season_registration_idрегистрация, из которой создано участие
grade_category_idкласс или категория участия
participation_sourceиндивидуально, через учителя, через организацию, импорт
primary_identity_organization_idосновная identity organization в контексте сезона, если есть
primary_competition_group_idолимпиадный снимок Learning Group, если есть
access_stateсостояние доступа ученика к записи
statusстатус участия

Статусы:

СтатусЗначение
activeучастие активно
withdrawnучастник снят с сезона
disqualifiedучастник дисквалифицирован
completedучастие в сезоне завершено
archivedучастие архивировано

Access state:

СтатусЗначение
no_accountзапись без аккаунта
invite_sentотправлено приглашение получить доступ
claim_in_progressполучение доступа начато
account_linkedаккаунт связан
family_linkedзапись связана с семейной группой
access_blockedдоступ временно заблокирован

Правила:

  1. SeasonParticipation является главным объектом участия в сезоне.
  2. Один StudentRecord не должен иметь два активных участия в одном сезоне без специального разрешения.
  3. Участие может быть связано с CompetitionGroup snapshot или организацией, но не обязано.
  4. История участия сохраняется после смены аккаунта, группы или организации.

6.4. TourParticipation

TourParticipation — участие ученика в конкретном туре.

ПолеОписание
idуникальный идентификатор
season_participation_idучастие в сезоне
tour_idтур
grade_category_idкатегория участия в туре
delivery_modeспособ прохождения тура
result_track_idзачёт, если уже определён
venue_idплощадка, если выбрана
competition_group_idснимок Learning Group, если участие через преподавателя
child_mode_requiredтур должен проходить ребёнок в детском режиме
statusстатус участия в туре
admission_statusстатус допуска к туру
started_atначало прохождения
submitted_atдата отправки работы
completed_atдата завершения

Статусы:

СтатусЗначение
not_startedучастие в туре создано, но тур не начат
admittedучастник допущен
awaiting_choiceнужно выбрать способ участия или площадку
readyвсё готово к прохождению
in_progressучастник проходит тур
submittedработа отправлена
absentучастник не явился или не прошёл тур
checkingработа на проверке
scoredбаллы выставлены
finalizedрезультат финализирован
cancelledучастие в туре отменено

Admission status:

СтатусЗначение
not_requiredдопуск не требуется
pendingдопуск ещё не рассчитан
admittedучастник допущен
not_admittedучастник не допущен
manually_admittedдопущен вручную администратором
revokedдопуск отозван

Правила:

  1. TourParticipation принадлежит SeasonParticipation.
  2. Способ прохождения хранится на TourParticipation.
  3. В одной CompetitionGroup у разных участников могут быть разные delivery_mode.
  4. Участник может выбрать площадку только для delivery_mode, который поддерживает площадки.
  5. ResultTrack может назначаться автоматически или через выбор участника, но должен быть явным перед расчётом результатов.
  6. TourParticipation является точкой связи с Attempt, Submission, проверкой и результатами.

6.5. GroupParticipation / CompetitionGroup snapshot

GroupParticipation связывает участие ученика с competition_group в конкретном сезоне или туре. competition_group является снимком Learning Group для регистрации и проведения сезона.

ПолеОписание
idуникальный идентификатор
season_participation_idучастие в сезоне
competition_group_idолимпиадный снимок Learning Group
learning_workspace_idexternal ref на Learning Workspace
learning_group_idexternal ref на Learning Group
learning_group_member_idexternal ref на участника Learning Group
identity_organization_idexternal ref на identity-owned организацию
primary_teacher_user_idосновной преподаватель
role_in_groupучастник, приглашённый, архивный
member_snapshotФИО, класс и служебные поля на момент snapshot
starts_atдата начала связи
ends_atдата окончания связи
statusстатус связи

Правила:

  1. Ученик может быть связан с CompetitionGroup snapshot.
  2. Каноническое членство живёт в Learning Workspace / Learning Group.
  3. Групповая связь не должна автоматически лишать семью или ученика доступа к личным результатам.
  4. Права преподавателя на просмотр данных должны зависеть от выбранной организации, Learning Group, роли и контекста сезона.
  5. Изменение Learning Group после snapshot не переписывает historical registration без явного действия.

6.6. AccountClaim

AccountClaim — процесс получения доступа к StudentRecord.

ПолеОписание
idуникальный идентификатор
student_record_idзапись ученика
requested_by_user_idпользователь, который запросил доступ
requested_actor_typeребёнок, родитель, взрослый представитель, администратор
target_link_typeсвязать с профилем ученика, семьёй или взрослым доступом
verification_methodспособ проверки
statusстатус процесса
reviewed_by_user_idкто проверил, если нужна ручная проверка
created_atдата создания
resolved_atдата завершения
rejection_reasonпричина отказа

Статусы:

СтатусЗначение
draftпроцесс начат, но не отправлен
pending_verificationждёт подтверждения
pending_manual_reviewждёт ручной проверки
approvedдоступ подтверждён
rejectedдоступ отклонён
cancelledзапрос отменён
expiredсрок действия истёк
conflictобнаружен конфликт или дубль

Возможные verification_method:

МетодОписание
invite_codeкод приглашения от учителя или системы
email_matchсовпадение email, если он был указан
phone_matchсовпадение телефона, если он был указан
teacher_confirmationподтверждение учителем
admin_reviewручная проверка администратором
document_checkпроверка документа, если потребуется

Правила:

  1. AccountClaim не должен автоматически подтверждать доступ, если есть риск захвата чужой записи.
  2. Одобрение AccountClaim связывает StudentRecord с нужным профилем или семейной группой.
  3. Все действия по AccountClaim аудируются.
  4. При конфликте доступ не выдаётся до ручного разрешения.

7. Регистрация и участие: различие терминов

ТерминЗначение
Registrationпроцесс или заявка на участие
Participationподтверждённый факт участия
SeasonRegistrationрегистрация на сезон
SeasonParticipationучастие в сезоне
TourParticipationучастие в конкретном туре

Правило: регистрация может быть отклонена, отменена или зависеть от оплаты. Участие появляется только после подтверждения правил регистрации.

8. Индивидуальная и групповая регистрация

ТипКто создаётЧто создаётся
individualученикStudentRecord, SeasonRegistration, SeasonParticipation
parent_childродительStudentRecord ребёнка, SeasonRegistration, child-mode TourParticipation
teacher_learning_groupпреподавательCompetitionGroup snapshot, GroupParticipation, SeasonRegistration
organization_importкоординатор организациизаписи учеников и групповые регистрации
adminадминистраторрегистрация или участие вручную

Правила:

  1. Индивидуальная и групповая регистрация должны сосуществовать.
  2. Преподаватель может регистрировать учеников без аккаунта через Learning Group snapshot.
  3. Ученик, зарегистрированный индивидуально, может позже быть связан с CompetitionGroup snapshot.
  4. Для платных конкурсов регистрация может требовать оплаты до подтверждения.
  5. При любой регистрации нужна проверка дублей.
  6. Предварительная регистрация не равна допуску к туру.

9. Связь с ResultTrack

ResultTrack — отдельный зачёт, в котором считаются результаты.

TourParticipation должен получить result_track_id до финального расчёта результатов.

Способы назначения зачёта:

СпособОписание
automatic_by_delivery_modeзачёт назначается по способу прохождения
participant_choiceучастник сам выбирает формат или зачёт
admin_assignmentадминистратор назначает вручную
venue_assignmentзачёт определяется выбранной площадкой
rule_basedзачёт определяется набором правил сезона

Правила:

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

10. Права доступа к данным участия

АкторЧто может видеть
Ученик с аккаунтомсвои регистрации, туры, ответы, сканы, результаты и документы
Родитель в семейной группеданные детей своей семейной группы по правилам identity-домена
Преподавательданные учеников разрешённых Learning Groups в выбранной организации и сезоне
Помощник преподавателятолько действия, выданные преподавателем или координатором
Административный подслой выбранной организацииданные registration scope своей организации в пределах роли
Площадочный подслой выбранной организациисписки и материалы участников, назначенных на площадку
Администратор «Систематики»данные сезона, регистраций, туров и результатов
Проверяющийтолько назначенные работы и разрешённый объём данных

Правила:

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

11. Дедупликация учеников

Дедупликация нужна, потому что одного ученика могут добавить:

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

Потенциальные признаки дубля:

ПризнакКомментарий
ФИОнедостаточно само по себе
дата рожденияусиливает совпадение
класспомогает, но может меняться
школа или организацияпомогает, но не всегда совпадает
городпомогает, но не уникален
email или телефон родителясильный признак, если есть
история участияпомогает при ручной проверке

Статусы duplicate_status:

СтатусЗначение
not_checkedпроверка не проводилась
no_duplicateдублей не найдено
possible_duplicateнайден возможный дубль
duplicate_confirmedдубль подтверждён
merge_pendingожидается объединение
mergedзаписи объединены
false_positiveсовпадение признано ложным

Правила:

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

12. Статусная модель: путь ученика в сезоне

СостояниеЗначение
record_createdсоздана запись ученика
registration_startedначата регистрация
registration_pre_submittedпредварительная регистрация создана
registration_needs_completionтребуется дозаполнение
registration_submittedрегистрация отправлена
registration_approvedрегистрация подтверждена
season_participation_activeучастие в сезоне активно
tour_admittedученик допущен к туру
tour_readyвыбран способ прохождения и всё готово
tour_in_progressученик проходит тур
tour_submittedработа отправлена
tour_scoredбаллы выставлены
result_finalizedрезультат финализирован
result_publishedрезультат опубликован
award_availableдокумент или награда доступны
season_completedсезон завершён

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

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

  • создание StudentRecord;
  • изменение персональных данных ученика;
  • создание регистрации;
  • подтверждение или отмена регистрации;
  • создание SeasonParticipation;
  • изменение группы или организации участия;
  • выбор или изменение DeliveryMode;
  • выбор или изменение площадки;
  • назначение или изменение ResultTrack;
  • создание AccountClaim;
  • одобрение или отклонение AccountClaim;
  • объединение дублей;
  • ручной допуск к туру;
  • дисквалификация или отмена участия;
  • действия, которые меняют доступ к результатам, работам и документам.

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

СобытиеКогда возникает
StudentRecordCreatedсоздана запись ученика
SeasonRegistrationSubmittedотправлена регистрация на сезон
SeasonRegistrationConfirmedрегистрация подтверждена
SeasonParticipationCreatedсоздано участие в сезоне
GroupParticipationLinkedученик связан с группой
TourParticipationCreatedсоздано участие в туре
DeliveryModeSelectedвыбран способ прохождения тура
ResultTrackAssignedназначен зачёт
AccountClaimRequestedзапрошен доступ к записи ученика
AccountClaimApprovedдоступ подтверждён
AccountClaimRejectedдоступ отклонён
StudentDuplicateDetectedнайден возможный дубль
StudentRecordsMergedзаписи ученика объединены

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

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

  • найти StudentRecord;
  • увидеть связанные регистрации и участия;
  • увидеть источник создания записи;
  • увидеть, есть ли связанный аккаунт или семья;
  • проверить потенциальные дубли;
  • объединить записи при наличии прав;
  • вручную подтвердить регистрацию;
  • вручную допустить или не допустить участника к туру;
  • изменить ResultTrack с обязательным аудитом;
  • посмотреть историю AccountClaim;
  • заблокировать получение доступа в спорной ситуации;
  • экспортировать список регистраций и участников сезона.

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

ПравоНазначение
student_record.createсоздать запись ученика
student_record.updateизменить запись ученика
student_record.viewпосмотреть запись ученика
student_record.mergeобъединить дубли
season_registration.createсоздать регистрацию
season_registration.confirmподтвердить регистрацию
season_registration.cancelотменить регистрацию
season_participation.viewпосмотреть участие в сезоне
season_participation.updateизменить участие в сезоне
tour_participation.viewпосмотреть участие в туре
tour_participation.updateизменить участие в туре
account_claim.createзапросить доступ к записи
account_claim.reviewрассмотреть запрос доступа
result_track.assignназначить зачёт участнику

Права должны проверяться через actor context: личный, семейный, преподавательский режим с выбранной организацией, Learning Group, административный подслой, площадочный подслой или админ «Систематики».

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

СитуацияТребуемое поведение
Учитель добавил ученика, а родитель создал аккаунт отдельносистема должна найти возможный дубль и предложить связывание
Два учителя добавили одного ученикасистема должна предотвратить двойное участие в одном сезоне или туре
Ученик прошёл тур индивидуально, а потом добавлен в Learning Groupнужна безопасная привязка к CompetitionGroup snapshot без потери результата
Родитель пытается получить доступ к чужой записидоступ не выдаётся без подтверждения
Ученик сменил школу или группу в сезонеистория сохраняется, права доступа пересчитываются
Участник сменил очный формат на онлайннужно обновить DeliveryMode и ResultTrack с аудитом
Запись ученика объединена после публикации результатадокументы и результаты должны ссылаться на итоговую запись без потери истории
Платная регистрация не оплаченаSeasonParticipation не активируется до выполнения правил оплаты
Родитель зарегистрировал ребёнкаребёнок проходит тур в child mode, родитель видит статус и документы
Указано текстовое поле «учитель»поле хранится для отображения, но не выдаёт преподавательский доступ
Official data package требуется, но не заполненregistration остаётся needs_completion или pending_review, UI показывает недостающие поля
Raw СНИЛС или родительские контакты переданы в competitions APIзапрос отклоняется; сбор должен идти через identity protected flow
Учитель ввёл данные родителя в official flowсоздаётся protected identity record и pending parent invite/contact без выдачи родительских прав учителю
Learning Group изменилась после snapshotcompetitions не переписывает состав регистрации автоматически

Готовность

  1. Добавить модель StudentRecord с identity_status и duplicate_status.
  2. Добавить модель SeasonRegistration со статусами двухшаговой регистрации.
  3. Добавить модель SeasonParticipation.
  4. Добавить модель TourParticipation с delivery_mode и result_track_id.
  5. Добавить модель GroupParticipation / CompetitionGroup snapshot с refs на Learning Workspace.
  6. Добавить official data package readiness flow через identity protected attributes.
  7. Добавить модель AccountClaim.
  8. Добавить аудит для всех изменений участия, official data package и доступа.
  9. Добавить базовую проверку дублей при регистрации.
  10. Добавить права доступа для личного, семейного, преподавательского, helper, площадочного и административного контекста.
  11. Добавить административный просмотр записи ученика и истории участия.

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

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