# Сертификаты

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

## Как сертификат появляется

- **Сам, по условию курса** — на вкладке курса **«Сертификат»** выбирается одно из трёх:
  «Прошёл курс» (по правилу завершения курса), «Все задания приняты куратором» (выдаётся
  на принятии последнего задания курса; рядом — сколько заданий в курсе) или «По сценарию» —
  тогда курс сам не выдаёт, а выдаёт шаг сценария «Выдать сертификат». Там же — шаблон:
  курса, а если его нет, общий шаблон школы. Через API — `PATCH /api/courses/{id}/flow`
  с полями `certificateAutoIssue` и `certificateRule` (`completed` или `assignments`).
- **Вручную** — «Выдать вручную» на вкладке курса или в разделе «Сертификаты»: ученик
  этого курса. Выдать может **любой сотрудник с правом на курс**, не только тот, кто правит
  шаблоны; выдаётся только тому, кто записан на курс.

На вкладке курса — список **«Кому выдан»**: номер, ученик, дата и как выдан — «По условию»,
«Сценарием» или «Вручную · имя сотрудника». Отозванный зачёркнут.

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

**Номер не порядковый** — вида `2026-KRND-8F42`. По порядковому номеру любой
посчитал бы, сколько человек прошли курс, а это цифра продаж школы.

## Раздел «Сертификаты»

Меню «Обучение» → «Сертификаты». Список выданных — от свежих:

| Колонка | Что в ней |
|---|---|
| Кому | имя — ссылкой на карточку человека — и почта |
| Курс | за какой курс выдан |
| Номер | номер сертификата; у отозванного зачёркнут |
| Когда | дата выдачи |
| Шаблон | по какому шаблону выдан |
| Состояние | **действует**, **файл собирается** или **отозван** — с датой и причиной |

**«Файл собирается» — не ошибка.** Запись о выдаче появляется сразу, а PDF
собирается следом; если хранилище в этот момент не ответило — при первом
скачивании. Выдавать такой сертификат заново не нужно.

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

В меню «…» у строки — **Скачать**, **Ссылка проверки** и **Отозвать**.

## Шаблон

«Сертификаты» → **Шаблоны · N**. Шаблон — подложка картинкой и четыре поля
поверх неё: имя, курс, дата и номер. Свободного текста нет: он рисуется
на самой подложке.

- **Новый шаблон** — название, область и подложка: PNG или JPEG из библиотеки
  в нужном размере, потому что размер страницы PDF равен размеру подложки.
  Поля сразу встают по её размеру.
- **Область** выбирается явно: общий шаблон школы берут курсы без своего,
  шаблон курса — только его курс, и удаляется он вместе с курсом.
- **Поля** двигаются мышью и стрелками, с Shift — на 10 точек. Координаты —
  в точках от левого верхнего угла, `y` — до базовой линии текста; в панели
  правятся размер, цвет, выключка и начертание — обычное или полужирное.
- **Скачать образец** — PDF по полям с экрана, ещё до сохранения.
- **Заменить подложку** — картинкой из библиотеки. Шаблон хранит свою копию:
  удаление файла из библиотеки шаблон не ломает.

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

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

## Отзыв

Отзыв не удаляет сертификат, а меняет его состояние:

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

Причина обязательна. Её видят только сотрудники школы — в списке и в журнале
человека; на публичной странице проверки её нет.

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

Выдавать и отзывать может тот, у кого есть право «выдавать и отзывать
сертификаты»: владелец, администратор и автор.

## Проверка по номеру

Страница `/certificates/НОМЕР` — её адрес печатается на сертификате; номер
можно ввести и в форму на странице `/certificates`. Страница показывает ровно
то, что напечатано на документе: кому, курс, дату выдачи и номер.

Состояний четыре: номер не введён, сертификат подлинный, сертификат отозван,
номер не найден. «Не найден» сказано нейтрально: номер могли переписать
с ошибкой.

## Что умеет агент

- **Читает список** выданных тем же отбором, что раздел: кому, курс, номер,
  состояние, дата и причина отзыва.
- **Выдать и отозвать** — только с подтверждением человека: выдача шлёт ученику
  письмо, отзыв меняет публичную страницу. Без подтверждения агент называет
  действие и даёт ссылку на раздел.
- **Шаблоны** — читает сам; поля, название и область правит с подтверждением.
  Подложку агент не меняет: картинку выбирают в редакторе шаблона.

## Чего пока нет

- Выгрузки списка выданных по курсу таблицей — пока только список на вкладке.
- Блока сертификатов в карточке человека.
