> ## Documentation Index
> Fetch the complete documentation index at: https://faq.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Сертификаты: обзор

> Как устроены сертификаты о завершении курса: шаблон, снимок данных, публичная проверка и PDF.

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

<Note>
  Раздел находится в активной разработке (задача ITD-158). Настройка сертификата в админке (`ManageCourseCertificatesPage`) и раздел «Мои сертификаты» у ученика уже присутствуют в интерфейсе, но пока не подключены к боевому backend: списки шаблонов и сертификатов используют временные заглушки, сохранение настроек и запрос `certificateFindMany` будут включены после публикации серверной схемы. Ниже описана целевая механика согласно утверждённой спецификации.
</Note>

## Что такое сертификат

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

У каждого сертификата есть уникальный код (`uuid`) и публичная ссылка вида:

```
https://verify.exode.biz/certificate/<uuid>
```

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

## Как это устроено

Сертификат складывается из двух частей: **шаблона оформления** и **снимка данных** (snapshot).

| Часть         | Что это                                                        | Где хранится                                       |
| ------------- | -------------------------------------------------------------- | -------------------------------------------------- |
| Шаблон        | HTML-дизайн сертификата (`CertificateTemplateEntity`)          | Облачное хранилище Cloudflare R2                   |
| Снимок данных | Значения переменных на момент выдачи (имя, курс, дата и т. д.) | Поле `snapshot` (jsonb) записи `CertificateEntity` |

### Снимок данных — неизменяемый документ

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

| Что изменилось после выдачи                  | Что будет с выданным сертификатом                      |
| -------------------------------------------- | ------------------------------------------------------ |
| Ученик сменил имя в профиле                  | Ничего — остаётся имя на момент выдачи                 |
| Курс переименовали или удалили               | Ничего — сертификат живёт независимо от курса          |
| Школа сменила логотип, цвет, подпись, дизайн | Ничего — старые сертификаты выглядят как в день выдачи |
| Школа изменила срок действия в настройках    | Ничего — коснётся только новых выдач                   |

<Tip>
  Принцип «как бумажный диплом»: что напечатано в день вручения — то и останется. Если в данных ошибка (например, опечатка в имени), сертификат не редактируется, а отзывается и выдаётся заново.
</Tip>

### Публичная проверка через verify.exode.biz

Проверку подлинности выполняет отдельный сервис (worker) на домене `verify.exode.biz`. Когда кто-то открывает ссылку сертификата:

1. Worker запрашивает данные сертификата у backend по его `uuid`.
2. Загружает HTML-шаблон из хранилища R2.
3. Подставляет значения из снимка, добавляет даты, номер и QR-код.
4. Показывает готовую страницу с баннером подлинности.

| Ситуация                              | Что покажет страница проверки            |
| ------------------------------------- | ---------------------------------------- |
| Сертификат действителен               | Сертификат + плашка «Подлинный»          |
| Срок действия истёк                   | Сертификат виден с пометкой «Срок истёк» |
| Сертификат отозван или ссылка неверна | «Сертификат не найден»                   |

### Скачивание PDF через печать

Готовый PDF-файл на сервере не хранится. Кнопка «Скачать PDF» на странице сертификата вызывает стандартное окно печати браузера (`window.print()`), где документ можно сохранить как PDF. Специальный `@media print` CSS печатает только область сертификата. На мобильных устройствах это работает через «Сохранить в Файлы».

<Warning>
  Ссылка на сертификат должна открываться во внешнем системном браузере (`target="_blank"`), а не во встроенном webview приложения — иначе печать в PDF может не сработать.
</Warning>

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/gamification/certificate-verify-page.png" alt="Пример страницы сертификата с проверкой подлинности" />

## Что дальше

* [Создание сертификата](/online-schools/gamification/creating-certificates) — настройка шаблона курса и условий выдачи.
* [Редактирование сертификата](/online-schools/gamification/editing-certificates) — брендовый цвет и переменные шаблона.
* [Отображение у пользователя](/online-schools/gamification/certificate-display) — раздел «Мои сертификаты» и публичная страница.
