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

Документы и награды

Зачем нужно

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

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

В домене олимпиад источник для выдачи наград участникам — это AwardStatus, рассчитанный по результатам, зачёту, классу и утверждённым правилам наград. Сам PDF-документ, номер, код проверки и шаблон должны жить в общем механизме документов, но домен олимпиад задаёт правила, когда и какие документы должны быть созданы.

Что входит

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

  • виды документов для участников;
  • виды благодарственных писем для преподавателей, помощников, команд, организаций и площадок;
  • связь AwardStatus и GeneratedDocument;
  • требования к шаблонам документов;
  • требования к подстановочным данным;
  • правила генерации документов;
  • статусы документа;
  • номер документа и код проверки;
  • публичную верификацию;
  • права доступа;
  • аудит;
  • edge cases.

Что не входит

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

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

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

Нужно разделять четыре уровня.

УровеньЧто означаетПример
AwardStatusнаградной статус по результатамдиплом 2 места
DocumentTemplateшаблон документашаблон диплома 2 места для математики
DocumentGenerationJobзадание на генерациюсгенерировать дипломы 5 класса очного зачёта
GeneratedDocumentконкретный созданный документPDF диплома Иванова

AwardStatus не является документом. Документ создаётся на основании AwardStatus, шаблона и данных участника.

Родительский доступ к документу ребёнка может возникнуть через family/claim flow или pending parent invite, созданный при сборе official data package. Такой invite не считается подтверждённым родительским аккаунтом, пока родитель не перейдёт по ссылке, не подтвердит доступ и не примет условия.

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

СущностьНазначениеИсточник истины
AwardStatusитоговый наградной статус участникадомен олимпиад
DocumentTemplateшаблон документаобщий механизм документов
DocumentTemplateBindingсвязь шаблона с сезоном, зачётом и наградойолимпиады / документы
DocumentGenerationJobзадание на генерацию документовобщий механизм документов
GeneratedDocumentконкретный сгенерированный документобщий механизм документов
DocumentNumberуникальный номер документаобщий механизм документов
VerificationCodeкод или QR для проверкиобщий механизм документов
PublicDocumentVerificationпубличная проверка документаобщий механизм документов
GratitudeLetterRequestзапрос благодарственного письмадомен олимпиад

6. Документы участников

Стартовый набор документов для участников:

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

Правила:

  1. Документ участника создаётся только после расчёта или утверждения AwardStatus.
  2. Пороги AwardStatus задаются в AwardPolicy и ScoreThreshold.
  3. У очного и онлайн-зачёта могут быть разные пороги и разные шаблоны документов.
  4. У разных классов или категорий могут быть разные данные в документе.
  5. Документ должен быть доступен участнику после генерации и публикации доступа.
  6. Участник без аккаунта должен получить доступ к документу через AccountClaim или семейную группу.

7. Благодарственные письма

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

Виды:

КодПолучательОписание
teacher_gratitudeпреподавательблагодарность преподавателю, проводившему олимпиаду
assistant_gratitudeпомощникблагодарность помощнику проведения или ввода ответов
team_gratitudeчлен команды проведенияблагодарность человеку, которого указал организатор
organization_gratitudeорганизацияблагодарность школе, кружку, центру или площадке
venue_gratitudeплощадкаблагодарность организации, выступившей открытой площадкой

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

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

8. GratitudeLetterRequest

GratitudeLetterRequest — запрос на генерацию благодарственного письма.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
identity_organization_idexternal ref на identity-owned организацию, если применимо
competition_group_idsnapshot LearningGroup, если применимо
venue_idплощадка, если применимо
requested_by_user_idкто запросил письмо
recipient_typeпреподаватель, помощник, член команды, организация, площадка
recipient_user_idпользователь-получатель, если есть
recipient_name_textимя получателя текстом, если нет пользователя
organization_name_textотображаемое название организации
role_textроль получателя в проведении
statusстатус запроса
generated_document_idссылка на документ, если создан

Статусы:

СтатусЗначение
draftзапрос готовится
submittedзапрос отправлен
approvedзапрос одобрен
rejectedзапрос отклонён
generatedдокумент создан
cancelledзапрос отменён

Правила:

  1. Возможность создать благодарственное письмо зависит от роли пользователя в выбранной организации или площадочном подслое.
  2. Организатор может указать несколько людей команды проведения.
  3. Название организации может быть уточнено для отображения в документе.
  4. Генерация благодарственных писем должна быть аудируемой.
  5. Если запрос не требует ручного одобрения, статус может переходить из submitted сразу в generated.

9. DocumentTemplateBinding

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

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

Правила:

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

10. DocumentGenerationJob

DocumentGenerationJob — задание на генерацию одного или многих документов.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
result_track_idзачёт, если применимо
grade_category_idкласс или категория, если применимо
document_typeтип документа
trigger_typeвручную, автоматически, по расписанию
requested_by_user_idкто запустил генерацию
statusстатус задания
total_countсколько документов нужно создать
success_countсколько создано
failed_countсколько не создано
started_atначало
finished_atзавершение

Статусы:

СтатусЗначение
queuedпоставлено в очередь
runningвыполняется
completedзавершено
completed_with_errorsзавершено с ошибками
failedполностью завершилось ошибкой
cancelledотменено

Правила:

  1. Массовая генерация должна создаваться через DocumentGenerationJob.
  2. Задание должно хранить отчёт об ошибках.
  3. Повторная генерация уже созданных документов должна требовать явного режима: пропустить, пересоздать, создать новую версию.
  4. Автоматическая генерация может запускаться после события AwardStatusApproved или ResultsFinalized, если так настроено.

11. GeneratedDocument

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

ПолеОписание
idуникальный идентификатор
document_typeтип документа
document_template_idшаблон
document_generation_job_idзадание генерации
recipient_typeучастник, преподаватель, помощник, член команды, организация, площадка
recipient_user_idпользователь-получатель, если есть
student_record_idученик, если документ участника
award_status_idнаградной статус, если документ участника
competition_season_idсезон
result_track_idзачёт, если применимо
grade_category_idкласс или категория, если применимо
file_idссылка на файл
document_number_idномер документа
verification_code_idкод проверки
statusстатус документа
generated_atдата генерации

Статусы:

СтатусЗначение
draftдокумент подготовлен, но не финализирован
generatedдокумент сгенерирован
publishedдокумент доступен получателю
revokedдокумент отозван
supersededдокумент заменён новой версией
archivedдокумент архивирован
failedдокумент не удалось создать

Правила:

  1. Документ должен ссылаться на основание генерации: AwardStatus или GratitudeLetterRequest.
  2. Документ участника должен сохранять связь с сезоном, зачётом и классом.
  3. Документ не должен изменяться молча после публикации.
  4. Исправление документа после публикации должно создавать новую версию или переводить старый документ в superseded.
  5. Отзыв документа должен сохранять историю и причину.

12. Подстановочные данные

Шаблон документа должен получать данные из разных доменов.

Для документа участника:

ПолеИсточник
имя участникаStudentRecord или StudentProfile
класс или категорияGradeCategory
название мероприятияCompetitionEvent
название сезонаCompetitionSeason
турTour, если документ туровый
зачётResultTrack
баллFinalResult
местоPlace, если используется
наградной статусAwardStatus
threshold snapshotутверждённый порог и процентный ориентир, если применимо
город, страна, организацияStudentRecord, Organization или регистрационные данные
parent invite/contactIdentity contact/invite, если родитель ещё не подтвердил аккаунт
дата выдачинастройки генерации
номер документаDocumentNumber
код проверкиVerificationCode

Для благодарственного письма:

ПолеИсточник
имя получателяUser или recipient_name_text
роль получателяrole_text
организацияOrganization или organization_name_text
мероприятиеCompetitionEvent
сезонCompetitionSeason
площадкаVenue, если применимо
дата выдачинастройки генерации
номер документаDocumentNumber
код проверкиVerificationCode

Правила:

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

13. DocumentNumber и VerificationCode

DocumentNumber — уникальный номер документа.

VerificationCode — код, по которому документ можно проверить публично.

Правила:

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

14. PublicDocumentVerification

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

Минимально показываемые данные:

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

Правила:

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

15. Доступ к документам

АкторДоступ
Учениксвои документы
Родительдокументы детей своей семейной группы
Преподавательдокументы учеников CompetitionGroup snapshot, если разрешено
Помощниксвои благодарственные письма, если они сгенерированы
Административный подслой выбранной организациидокументы учеников и благодарственные письма организации в рамках роли
Площадочный подслойблагодарственные письма площадки, если разрешено
Администратор «Систематики»документы сезона
Публичный пользовательтолько проверка по коду, если включена

Правила:

  1. Документ участника должен быть доступен через личный или семейный кабинет.
  2. Документы учеников без аккаунта должны стать доступны после AccountClaim.
  3. Преподавательский доступ к документам учеников должен зависеть от Learning Group snapshot, роли и сезона.
  4. Публичный доступ к PDF не равен публичной проверке по коду.

16. Статусная модель: документ участника

СостояниеЗначение
award_calculatedнаградной статус рассчитан
award_approvedнаградной статус утверждён
template_boundнайден активный шаблон
generation_queuedгенерация поставлена в очередь
generatedдокумент создан
publishedдокумент доступен получателю
verified_publiclyдокумент проверен по коду
supersededдокумент заменён новой версией
revokedдокумент отозван
archivedдокумент архивирован

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

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

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

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

ПравоНазначение
document_template.bindназначить шаблон для сезона или награды
document_generation.runзапускать генерацию документов
document_generation.viewвидеть задания генерации
generated_document.view_ownсмотреть свой документ
generated_document.view_childсмотреть документ ребёнка
generated_document.view_groupсмотреть документы учеников CompetitionGroup snapshot
generated_document.view_gratitude_ownсмотреть своё благодарственное письмо
generated_document.admin_viewадминистративно смотреть документы
generated_document.publishпубликовать документы
generated_document.revokeотзывать документы
generated_document.regenerateпересоздавать документы
gratitude_request.createсоздать запрос благодарственного письма
gratitude_request.reviewрассмотреть запрос благодарственного письма
public_document.verifyпроверить документ по коду

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

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

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

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

СобытиеКогда возникает
AwardDocumentGenerationRequestedзапрошена генерация документов по наградам
DocumentTemplateBoundшаблон связан с сезоном или наградой
DocumentGenerationStartedгенерация началась
DocumentGeneratedдокумент создан
DocumentPublishedдокумент опубликован получателю
DocumentRevokedдокумент отозван
DocumentSupersededдокумент заменён новой версией
GratitudeLetterRequestedзапрошено благодарственное письмо
GratitudeLetterGeneratedблагодарственное письмо создано
PublicDocumentVerifiedдокумент проверен публично

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

СитуацияТребуемое поведение
AwardStatus рассчитан, но шаблон не назначендокумент не создаётся, администратор видит ошибку настройки
Изменилось ФИО участника после генерациистарый документ не меняется автоматически; нужен перевыпуск
Изменились пороги наград после генерациитребуется пересчёт AwardStatus и решение по документам
Документ был выдан ошибочнодокумент отзывается, история сохраняется
Ученик без аккаунта получил дипломдокумент сохраняется, доступ открывается после AccountClaim
Преподаватель указал имя помощника с ошибкойнужен перевыпуск благодарственного письма
Результат удержан от публикациидокумент участника не публикуется до release результата
Порог награды утверждён вручную после процентного ориентирадокумент генерируется только после утверждения AwardStatus
Организация изменила публичное названиеуже созданное письмо не меняется без перевыпуска
Публичная проверка открыта для детского дипломапоказывается только разрешённый минимальный набор данных

Готовность

  1. Добавить модель DocumentTemplateBinding для олимпиад.
  2. Добавить связь AwardStatus с GeneratedDocument.
  3. Добавить модель GratitudeLetterRequest для преподавателей, помощников, команды, организации и площадки.
  4. Добавить проверку наличия шаблонов перед генерацией.
  5. Добавить массовый запуск DocumentGenerationJob по сезону, зачёту и классу.
  6. Добавить статусы GeneratedDocument.
  7. Добавить DocumentNumber и VerificationCode или интеграцию с общим механизмом документов.
  8. Добавить права доступа к документам участника, ребёнка, CompetitionGroup snapshot и организации.
  9. Добавить аудит генерации, публикации, отзыва и перевыпуска документов.
  10. Добавить публичную проверку документа по коду или QR, если включено настройками.

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

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