# HUVIS kasutusjuhend (vene keel)

Полное руководство пользователя на русском языке

# Аутентификация

# Вход в систему

Для входа в HUVIS откройте браузер и перейдите по адресу вашей системы. На странице входа доступны способы входа, включённые для вашей организации: Smart-ID, Mobile-ID, SMS-код и passkey (вход без пароля).

> **eID-вход.** Smart-ID и Mobile-ID выполняются через национальный сервис eID: после выбора способа вы переходите на защищённую страницу подтверждения и возвращаетесь в систему после успешного входа.

## Smart-ID

1. Выберите вкладку **Smart-ID**.
2. Введите ваш **личный код** (isikukood).
3. Выберите **страну** (Эстония, Латвия или Литва).
4. Нажмите **Войти**.
5. На экране появится **контрольный код** (4 цифры).
6. Откройте приложение **Smart-ID** на телефоне — там появится запрос на подтверждение с тем же контрольным кодом.
7. Убедитесь, что коды совпадают, и подтвердите вход в приложении (PIN2).
8. После подтверждения вы автоматически войдёте в систему.

> **Важно:** Контрольный код на экране и в приложении Smart-ID должны совпадать. Если коды не совпадают — **не подтверждайте** вход.

## Mobile-ID

1. Выберите вкладку **Mobile-ID**.
2. Введите ваш **номер телефона** (в формате +372XXXXXXXX).
3. Введите ваш **личный код** (isikukood).
4. Нажмите **Войти**.
5. На экране появится **контрольный код** (4 цифры).
6. На ваш телефон придёт запрос подтверждения — убедитесь, что контрольные коды совпадают.
7. Введите **PIN2** на телефоне для подтверждения.
8. После подтверждения вы автоматически войдёте в систему.

> **Требование:** Mobile-ID должен быть активирован у вашего мобильного оператора.

## SMS-код

1. Выберите вкладку **SMS**.
2. Введите ваш **личный код** (isikukood).
3. Нажмите **Отправить код**.
4. На ваш телефон придёт **SMS с 4-значным кодом**.
5. Введите полученный код в поле на экране.
6. Нажмите **Подтвердить**.

> **Примечание:** SMS-код действителен **5 минут**. Повторно запросить код можно через **60 секунд**. Максимум **5 попыток** ввода кода, после чего нужно запросить новый.

## Passkey (вход без пароля)

Если для вашего аккаунта настроен **passkey** (по стандарту WebAuthn — биометрия, PIN устройства или аппаратный ключ), на странице входа доступна кнопка входа по passkey:

1. Нажмите кнопку входа по **passkey**.
2. Подтвердите вход средствами устройства (отпечаток, Face ID, PIN или ключ безопасности).
3. После подтверждения вы войдёте в систему.

> **Примечание:** passkey предварительно регистрируется в настройках вашего профиля. Кнопка показывается, только если passkey доступен для вашего аккаунта.

## Выбор роли и организации

Если ваш личный код привязан к нескольким ролям или организациям, после успешной авторизации появится дополнительный шаг:

### Несколько организаций

1. Система покажет список доступных организаций.
2. Выберите нужную организацию.
3. Нажмите **Продолжить**.

### Несколько ролей

Если в выбранной организации у вас несколько ролей (например, Работник и Плательщик):

1. Система покажет список доступных ролей.
2. Выберите нужную роль:
   - **Работник** — доступ к административному интерфейсу
   - **Плательщик** — просмотр заявлений, счетов, данных студентов
   - **Студент** — просмотр расписания, тестов, домашних заданий
3. Нажмите **Продолжить**.

После выбора вы попадёте на главную страницу соответствующего кабинета.

## Выход из системы

1. Нажмите на ваше **имя** или **иконку профиля** в правом верхнем углу.
2. В выпадающем меню выберите **Выйти**.
3. Вы будете перенаправлены на страницу входа.

> **Рекомендация:** Всегда выходите из системы, если работаете на общедоступном компьютере.

## Проблемы при входе

| Проблема | Решение |
|----------|---------|
| Smart-ID не показывает запрос | Убедитесь, что Smart-ID активирован и телефон подключён к интернету |
| Mobile-ID не отвечает | Проверьте, что Mobile-ID активирован у оператора и телефон в сети |
| SMS-код не приходит | Подождите 60 секунд и запросите код повторно. Убедитесь, что номер телефона указан в системе |
| «Слишком много попыток» | Подождите указанное время (1–30 минут) и попробуйте снова |
| Не удаётся выбрать роль | Обратитесь к администратору — возможно, ваш аккаунт заблокирован |

# Начало работы

# Начало работы с HUVIS

## Вход в систему

Подробное описание всех способов входа (Smart-ID, Mobile-ID, SMS-код) см. в [Аутентификация](https://docs.huvis.ee/link/139).

![Главная страница после входа](images/getting-started/01_after_login.png)

## Обзор интерфейса

После входа в систему вы увидите следующие основные элементы:

### Боковая панель навигации

Слева расположено главное меню с разделами (доступность зависит от роли и прав):

- **Панель** — главная страница с виджетами и статистикой
- **Счета** — выставление счетов, отчёт, скидки, настройки
- **Поиск** — глобальный поиск по системе
- **Конференции** — видеоконференции (BigBlueButton)
- **Чат** — сообщения и групповые чаты
- **Тесты** — тесты, банк вопросов, попытки
- **Курсы** — заявления, дисциплины, специализации, домашние задания, учебные программы, настройки
- **Уведомления** — массовые рассылки, список, настройки шаблонов
- **HR** — работники, панель HR, настройки отпусков
- **Обучение** — кабинеты, нерабочие дни
- **Настройки** — роли, общие настройки, классы, публичные ссылки, логи, организации, политики
- **Отчёты** — плательщики, студенты, посещаемость, замены уроков

### Верхняя панель

В верхней части экрана находятся:

- Переключатель **языка** интерфейса (RU / ET)
- Переключатель **организации** (если доступно несколько)
- Переключатель **учебного года**

![Корневая страница](images/getting-started/02_root.png)

## Переключение языка

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

Для смены языка:

1. Найдите в верхней панели переключатель языка (отображается как **RU**, **ET** и т.д.).
2. Нажмите на переключатель.
3. Выберите нужный язык из списка.
4. Интерфейс мгновенно переключится на выбранный язык.

![Переключение на русский язык](images/getting-started/03_change_language_ru.png)

![Переключение на эстонский язык](images/getting-started/04_change_language_et.png)

## Выход из системы

1. Нажмите на ваше **имя** или **иконку профиля** в правом верхнем углу.
2. В выпадающем меню выберите **Выйти**.
3. Вы будете перенаправлены на страницу входа.

> **Рекомендация:** Всегда выходите из системы, если работаете на общедоступном компьютере.

# Панель управления

# Панель управления (Dashboard)

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

## Панель сотрудника / администратора

![Панель сотрудника](images/dashboard/worker_dashboard.png)

### Статистические карточки

В верхнем ряду отображаются три карточки с ключевыми показателями:

| Карточка | Описание |
|----------|----------|
| **Проведённые уроки** | Общее количество проведённых уроков по вашим курсам |
| **Неподписанные заявления** | Количество заявлений, ожидающих подписания |
| **Заполненность групп** | Процент заполнения групп. Наведите курсор, чтобы увидеть абсолютные числа (например, 15/20) |

### Мои курсы

Список курсов, где вы являетесь преподавателем или ассистентом:

1. Для каждого курса показано количество студентов.
2. Используйте **поле поиска** для быстрого нахождения курса по названию.
3. Если курсов больше 6, нажмите **Показать ещё** для отображения полного списка.
4. Доступные действия для каждого курса:
   - **Отметить посещаемость** — перейти к отметке посещения
   - **Студенты** — просмотр списка студентов курса
   - **Курс** — перейти к детальной странице курса

### Ближайшие уроки

Список следующих 3 запланированных уроков с указанием:
- Даты и времени
- Кабинета (если указан)
- Преподавателя

Сегодняшние уроки выделены визуально.

### Дни рождения учеников

Список учеников с днями рождения в ближайшие 14 дней:
- Имя ученика
- Возраст (сколько лет исполняется)
- Дата дня рождения
- Сколько дней осталось

Сегодняшние именинники выделены жёлтым фоном.

### Статус счетов

Круговая диаграмма с финансовой статистикой:
- Выставленные суммы
- Оплаченные суммы
- Просроченные суммы

### Одобрение отпусков

Отображается при наличии модуля HR и права на одобрение отпусков:
- Количество ожидающих одобрения заявок
- Количество работников, находящихся в отпуске сейчас
- Список первых 5 ожидающих заявок с датами и длительностью

![Панель сотрудника — дополнительный вид](images/dashboard/worker_dashboard_2.png)

### Календарь

Справа расположен интерактивный календарь:
1. Навигация по месяцам стрелками.
2. Дни с запланированными уроками отмечены маркерами.
3. **Нажмите на дату**, чтобы открыть модальное окно с расписанием на этот день.

---

## Панель плательщика

### Статистические карточки

| Карточка | Описание |
|----------|----------|
| **Посещённые уроки** | Общее количество посещённых уроков ваших детей |
| **Неподписанные заявления** | Заявления, ожидающие вашей подписи |

### Ближайшие уроки

Список следующих 5 уроков:
- Дата и время
- Название курса
- Кабинет и преподаватель
- Статус посещаемости (если уже отмечена)

Сегодняшние уроки выделены синим бейджем.

### Неоплаченные счета

Список выставленных, но не оплаченных счетов:
- Название курса
- Номер счёта
- Дата оплаты
- Сумма
- Кнопка **Оплатить** — переход на страницу оплаты

Ссылка **Все** ведёт к полному списку счетов.

### Календарь

Интерактивный календарь с маркерами дат уроков. Нажмите на дату для просмотра расписания.

---

## Панель студента

![Панель студента](images/dashboard/student_dashboard.png)

### Статистические карточки

| Карточка | Описание |
|----------|----------|
| **Посещённые уроки** | Количество посещённых уроков |
| **Активные курсы** | Количество курсов, на которые вы записаны |
| **Следующий урок** | Дата, время и название ближайшего урока |

### Назначенные тесты

Список тестов, которые вам назначены и ещё не пройдены:
- Название теста
- Тип теста (бейдж)
- Срок выполнения (если указан) — сортировка по ближайшему сроку
- Количество оставшихся попыток
- Кнопка **Начать тест** (неактивна, если попытки исчерпаны)

Ссылка **Все** ведёт к полному списку тестов.

### Ближайшие уроки

Аналогично панели плательщика: список ближайших уроков с датой, временем, курсом и кабинетом.

### Календарь

Интерактивный календарь с маркерами дат уроков.

---

## Модальное окно расписания

При нажатии на дату в календаре открывается окно с детальным расписанием на выбранный день:
- Список курсов с расписанием на эту дату
- Время, кабинет, преподаватель

Для сотрудников расписание фильтруется по курсам, где вы являетесь преподавателем или ассистентом.

![Модальное окно расписания](images/dashboard/dashboard_schedule.png)

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

# Курсы

# Управление курсами

Раздел **Курсы** в боковом меню содержит подразделы для управления всей учебной структурой: от дисциплин и специализаций до конкретных курсов с расписанием.

## Структура меню «Курсы»

| Подраздел | Назначение |
|-----------|------------|
| **Заявления** | Управление заявлениями студентов на курсы (подробнее: [04-applications.md](https://docs.huvis.ee/link/143)) |
| **Дисциплины** | Предметные области (верхний уровень иерархии) |
| **Специализации** | Направления внутри дисциплин (содержат курсы) |
| **Домашние задания** | Задания для студентов с оценками и обратной связью |
| **Учебные программы** | Тематические планы: темы, часы, уровни |
| **Добавить заявление** | Быстрое создание нового заявления |
| **Настройки** | Учебный год, шаблоны, анкеты, настройки регистрации |

## Иерархия: Дисциплина → Специализация → Курс

Система использует трёхуровневую иерархию:

```
Дисциплина (например, «Математика»)
  └── Специализация (например, «Алгебра»)
        └── Курс (например, «Алгебра — группа А, 2025/2026»)
```

Прежде чем создать курс, необходимо создать дисциплину и специализацию.

---

## Дисциплины

Дисциплина — это предметная область (например, «Математика», «Английский язык»).

### Список дисциплин

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

### Создание дисциплины

1. Нажмите кнопку **Добавить дисциплину**.
2. Заполните **Название** на каждом доступном языке (например, на эстонском и русском).
3. Нажмите **Сохранить**.

> **Примечание:** Название дисциплины переводится на все языки системы. Пользователь видит название на своём языке интерфейса.

### Редактирование и удаление

- Нажмите на дисциплину для редактирования.
- Удаление возможно, если у дисциплины нет активных специализаций и курсов.

---

## Специализации

Специализация — это направление внутри дисциплины. Каждая специализация содержит один или несколько курсов.

### Список специализаций

1. Перейдите в **Курсы → Специализации**.
2. Таблица: название, дисциплина, количество курсов.

### Создание специализации

1. Нажмите **Добавить специализацию**.
2. Заполните:
   - **Название** — на каждом доступном языке.
   - **Дисциплина** — выберите из выпадающего списка.
3. Нажмите **Сохранить**.

### Редактирование и удаление

- Нажмите на специализацию для редактирования.
- Удаление заблокировано, если есть активные заявления в курсах этой специализации.

### Переход к курсам

Со страницы специализации можно перейти к списку её курсов или создать новый курс.

---

## Создание курса

Курс — это конкретная учебная группа с расписанием, преподавателем и студентами. Создание, редактирование и копирование курсов выполняется через **пошаговый wizard** (мастер).

### Как открыть wizard

- **Создание:** На странице курсов нажмите кнопку **«+ Lisa uus»** (Добавить новый) в боковой панели.
- **Редактирование:** На странице курса нажмите **«✏️ Muuda»** (Редактировать) в баннере.
- **Копирование:** Нажмите **⋮** (меню) в баннере курса → **«Kopeeri kursust»** (Копировать курс).

### Шаги wizard

Wizard состоит из 5 шагов (при копировании — 6):

#### Шаг 1: Основная информация (Põhiinfo)

| Поле | Описание | Обязательное |
|------|----------|:------------:|
| **Название** | Название курса на каждом языке системы (ET, RU) | Да |
| **Учебный год** | К какому учебному году относится курс | Да |
| **Дата начала** | Дата первого занятия | Да |
| **Дата окончания** | Дата последнего занятия (должна быть позже даты начала) | Да |
| **Дата начала регистрации** | Когда форма регистрации станет доступной. Если пусто — доступна всегда | Нет |
| **Макс. кол-во студентов** | Лимит мест в группе (минимум 1) | Да |
| **Лимит листа ожидания** | Сколько заявлений могут быть в очереди. 0 = отключён | Нет |
| **Мин./Макс. возраст** | Возрастные ограничения (макс. >= мин.) | Да |
| **Ассистенты** | Дополнительные преподаватели | Нет |

> **Валидация:** Wizard не позволит перейти к следующему шагу, если обязательные поля не заполнены или содержат ошибки (например, дата окончания раньше даты начала).

> **Важно:** Курс привязан к учебному году. Убедитесь, что выбран нужный учебный год.

#### Шаг 2: Расписание (Tunniplaan)

Отображается недельная сетка расписания. Нажмите **«+ Lisa tund»** (Добавить занятие) чтобы открыть диспетчер расписания.

**Диспетчер расписания:**
- Сетка кабинетов × часов (8:00–23:00) для выбранного дня недели
- Drag & drop для размещения занятия (привязка к 15-минутным интервалам)
- Визуальное выделение конфликтов (красная подсветка при пересечении времени)
- Существующие занятия других курсов показаны как заблокированные (нельзя двигать)
- Расписание выбранного преподавателя отображается внизу

> Расписание необязательно — можно создать курс без занятий и добавить их позже.

#### Шаг 3: Цена (Hind)

**Тип биллинга** — выберите один из трёх:
- 🔄 **Tellimus** (Подписка) — ежемесячная оплата
- 🎫 **Pakett** (Пакет) — фиксированное число занятий
- 🔀 **Tellimus + Pakett** (Смешанный) — студент выбирает

**Цены по частоте** (для подписки/смешанного):
- Ежемесячно, квартально, полугодие, год — введите цену в евро для каждого периода

**Интенсивность** (для подписки/смешанного):
- Включите toggle → задайте мин./макс. занятий в неделю
- Для каждого варианта (1-5 занятий/неделю) задайте цену

**Пакетные опции** (для пакета/смешанного):
- Нажмите **«Lisa pakett»** → задайте кол-во занятий и цену
- Можно добавить несколько пакетов (например, 5 занятий / 10 занятий / 20 занятий)

**Пробный урок:**
- Включите toggle → появятся настройки: цена, режим оплаты, режим договора, режим мест

#### Шаг 4: Шаблоны (Mallid)

- **Шаблон заявки** — выберите шаблон документа для заявлений
- **Шаблон пробного урока** — появляется только если пробный урок включён
- **Уведомления по статусам** — для каждого статуса заявления выберите шаблон уведомления плательщику
- **Уведомления работникам** — для каждого статуса выберите работников для уведомления

#### Шаг 5: Настройки (Seaded)

- **Уведомлять преподавателей** — toggle
- **Уведомлять ассистентов** — toggle
- **Авто-закрытие** — система закрывает регистрацию при заполнении мест
- **🔒 Ручное закрытие** — администратор закрывает регистрацию вручную. Курс не откроется автоматически даже при освобождении мест.

> При редактировании на этом шаге отображается **статистика курса**: активные заявления, свободные места, лист ожидания.

#### Шаг 6: Студенты (Õpilased) — только при копировании

Выберите какие заявления перенести в новый курс:

| Режим | Описание |
|-------|----------|
| **Ülekandmine** (Перенос) | Статус заявления **сохраняется** (подписано → подписано). Файлы и скидки копируются. |
| **Uus avaldus** (Новое) | Создаётся **новое заявление** со статусом «Создано». Файлы и скидки копируются. |

- Выберите студентов через чекбоксы или нажмите **«Vali kõik»** (Выбрать все)
- Фильтруйте по статусу через цветные badges
- Дополнительно: toggle'ы для копирования тестов, анкет, вступительных тестов

> В обоих режимах исходные заявления **не изменяются**.

### Закрытие регистрации

**Автоматическое закрытие** (`close`): регистрация закрывается когда:
1. Все основные места заняты
2. Лист ожидания заполнен или отключён

При освобождении места курс автоматически **открывается** обратно.

**Ручное закрытие** (`force_closed`): администратор закрывает регистрацию вручную. Отличия:
- Курс **не откроется** автоматически при освобождении мест
- Авто-закрытие toggle отключается (неактивен)
- Красный баннер предупреждает что курс закрыт вручную

### Сохранение

Нажмите зелёную кнопку на последнем шаге:
- **«Loo kursus»** — при создании
- **«Salvesta»** — при редактировании
- **«Kopeeri kursus»** — при копировании

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

---

## Страница курса (вкладки)

Каждый курс имеет детальную страницу с вкладками. Для перехода: **Специализации → [специализация]** → нажмите на курс.

### Вкладка «Информация»

Обзорная страница курса с ключевыми показателями.

**Карточки KPI (верхний ряд):**

| Карточка | Описание |
|----------|----------|
| Активные | Количество активных заявлений |
| Вместимость | Максимальное число мест |
| Свободные | Доступные места |
| Лист ожидания | Заявления в листе ожидания |

**Диаграмма статусов:** Круговая диаграмма распределения заявлений по статусам (созданные, отправленные, подписанные и т.д.).

**Расписание:** Визуальная сетка расписания по дням недели — время, кабинет, преподаватель, признак онлайн.

**Еженедельный план:** Таблица с блоками расписания и датами начала действия каждого блока.

### Цены и шаблоны

> **Примечание:** Управление ценами, пробным уроком, шаблонами заявлений и уведомлениями перенесено в **wizard** (шаги 3 «Hind» и 4 «Mallid»). Для изменения нажмите **«✏️ Muuda»** в баннере курса.
>
> Скидки курса по-прежнему доступны через вкладку «Информация» или через прямые URL-ы.
- Нажмите **Сохранить** для применения.

**Шаблоны уведомлений плательщику:**
- Для каждого статуса заявления (Создано, Отправлено, Подписано, Закрыто, Аннулировано, Лист ожидания) можно выбрать шаблон email-уведомления.
- Используйте шаблон по умолчанию или выберите персонализированный для этого курса.
- Если шаблон не выбран, используется общий шаблон из настроек.

**Уведомления работникам:**
- Настройка, при каких статусах уведомлять работников (преподавателей/ассистентов).
- Для каждого статуса можно включить или выключить уведомление.

> **Последствия:** Изменение шаблонов влияет только на будущие уведомления. Ранее отправленные письма не изменяются.

### Вкладка «Студенты»

Список всех заявлений курса с фильтрацией по статусу.

**Фильтры:**
- Вкладки по статусам: Лист ожидания, Созданные, Отправленные, Подписанные, Закрытые, Аннулированные
- Каждая вкладка показывает количество заявлений

**Таблица:**
- ID, Студент, Плательщик, Курс, Дата создания, Дата первого урока, Статус
- Сортировка по любому столбцу
- Нажмите на строку для перехода к заявлению

### Вкладка «Конференции»

Управление видеоконференциями (BigBlueButton). Доступна при включённом модуле **Конференции**.

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

### Вкладка «Начальное тестирование»

Управление вступительными тестами. Доступна при включённом модуле **Тесты**.

**Тесты:**
- Таблица настроенных тестов: название, способ связи, оставшиеся места, дней ожидания.

**Назначения тестов:**
- Таблица: студент, дата создания, срок ответа, оценка, комментарий.
- Можно назначить тест конкретному студенту.

### Вкладка «Посещаемость»

Просмотр и управление посещаемостью занятий.

**На мобильных:** Две вкладки — «Предстоящие» и «Прошедшие» сессии.

**На десктопе:** Календарная сетка:
- Строки — студенты
- Столбцы — даты занятий
- Цвета: зелёный (присутствовал), красный (отсутствовал), серый (не отмечено)
- Клик по ячейке для отметки

**Карточки сессий:** Дата, время, статус (проведено / запланировано), кнопка для отметки.

### Вкладка «Счета»

Финансовая информация по курсу. Доступна при включённом модуле **Счета**.

**KPI карточки:**
- Количество выставленных счетов и сумма
- Сумма оплаченных счетов
- Задолженность

**График:** Линейная диаграмма: выставлено / оплачено / должники по месяцам.

**Таблица студентов:** Группировка по плательщику → студент → список счетов с суммами и статусами. Номер счёта является ссылкой на детальную страницу счёта.

**Массовая скидка:** Через меню **⋮** (три точки) в заголовке курса → **«Lisa allahindlus»** можно применить процентную скидку ко всем неотправленным счетам курса. Подробнее — в разделе [Массовая скидка на курс](https://docs.huvis.ee/link/144#массовая-скидка-на-курс).

### Вкладка «Замены уроков»

Управление заменами преподавателей и переносами занятий.

**Замена преподавателя (левая колонка):**
1. Выберите дату и время урока.
2. Укажите нового преподавателя.
3. Укажите причину замены.
4. Отметьте, нужно ли уведомить студентов/родителей.
5. Нажмите **Сохранить**.

**Перенос занятия (правая колонка):**
1. Выберите исходную дату урока.
2. Укажите новую дату.
3. Укажите причину переноса.
4. Отметьте, нужно ли уведомить.
5. Нажмите **Сохранить**.

> **Последствия:** При включённых уведомлениях студенты и/или плательщики получат email о замене или переносе.

### Вкладка «Опросник»

Вкладка содержит две под-вкладки:

**Под-вкладка «Шаблон анкеты»:**
- Выберите анкету из выпадающего списка (создаются в Настройки → Анкеты)
- Дефолтная анкета организации — её поля отображаются на всех курсах автоматически
- Можно назначить курсу дополнительную (не-дефолтную) анкету — её поля покажутся вместе с дефолтными
- Превью полей выбранной анкеты

**Под-вкладка «Ответы»:**
- Таблица ответов на анкету по всем заявлениям курса
- Поиск по имени ученика
- Каждая строка — ученик с его ответами и ссылкой на заявление

Типы полей: текст, текстовое поле, выбор из списка, чекбокс.

---

## Домашние задания

Раздел **Курсы → Домашние задания**. Доступен при включённом модуле **Домашние задания**.

### Список заданий

Таблица всех домашних заданий: название, курс, студент, срок сдачи, оценка, статус.

### Создание задания

1. Нажмите **Создать задание**.
2. Заполните:
   - Название и описание
   - Курс
   - Привязка к учебной программе (необязательно)
   - Срок сдачи
   - Максимальный балл
3. Приложите файлы (если нужно).
4. Нажмите **Сохранить**.

### Оценка и обратная связь

1. Откройте задание.
2. Просмотрите ответ студента и приложенные файлы.
3. Укажите баллы и оставьте комментарий.
4. Нажмите **Сохранить обратную связь**.

---

## Учебные программы

Раздел **Курсы → Учебные программы**. Тематические планы по предметам.

### Список

Таблица: тема, часы, уровень (класс). Сортировка и фильтрация по уровню.

### Создание

1. Нажмите **Создать**.
2. Заполните:
   - **Тема** — название темы
   - **Часы** — запланированное количество часов
   - **Уровень (класс)** — для какого класса предназначена тема
3. Можно добавить подтемы (подэлементы программы).
4. Нажмите **Сохранить**.

### Подтемы

Каждый элемент программы может содержать подтемы. Нажмите **Добавить подтему** на странице элемента.

---

## Настройки курсов

Раздел **Курсы → Настройки**. Глобальные настройки, влияющие на все курсы организации.

### Учебный год

Управление учебными годами:

| Настройка | Описание |
|-----------|----------|
| **Доступные годы** | Список учебных годов, доступных для выбора (например, «2024/2025», «2025/2026») |
| **Учебный год по умолчанию** | Год, который назначается новым курсам по умолчанию |
| **Год для веб-регистрации** | Учебный год, отображаемый на публичных формах регистрации |

> **Важно:** Переключение учебного года в верхней панели влияет на то, какие курсы и заявления отображаются в системе. Создавайте курсы при выбранном правильном году.

### Шаблон заявления

- Загрузка документа-шаблона (.docx), который используется для генерации PDF заявления.
- Шаблон по умолчанию применяется ко всем курсам, если на вкладке «Шаблон» курса не выбран индивидуальный.

### Уведомления работников

- Настройка шаблонов email-уведомлений для работников при изменении статуса заявлений.
- Для каждого статуса можно выбрать свой шаблон.

### Имя файла подписания

- Шаблон имени файла для подписанных документов (поддерживает переменные).

### Текст заголовка iframe

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

### Анкеты

Управление анкетами (Настройки → Анкеты):
- Создание именованных анкет (например: «Танцевальный курс», «Лагерь», «По умолчанию»)
- Каждая анкета содержит набор полей с возможностью перетаскивания для изменения порядка
- Дефолтная анкета — её поля отображаются на всех курсах автоматически
- Курс может ссылаться на дополнительную анкету — поля объединяются при регистрации

### Поля анкеты

CRUD для управления полями анкеты:
- Создание, редактирование, удаление полей
- Перетаскивание для изменения порядка
- Глобальные поля автоматически привязываются к дефолтной анкете организации
- Типы: текст, текстовое поле, выбор из списка, чекбокс

**Системные поля** (создаются администратором платформы):
- Отмечаются флагом «Системное поле» при создании
- Видны во **всех** организациях автоматически — никто не может их отключить
- Пример: «Согласие на обработку персональных данных»

**Ссылки в описании:**
- Описание поля поддерживает форматирование (жирный, курсив, списки, ссылки)
- Для чекбоксов: описание с ссылками отображается рядом с галочкой
- Пример: `☑ Olen tutvunud privaatsuspoliitikaga ja nõustun...` — где слово является ссылкой на документ

### Причины отчисления

- Управление списком причин, которые выбираются при закрытии заявления.

### Настройки регистрации

- Видимость и обязательность полей на публичной форме регистрации:
  - Для студента: адрес, телефон, email
  - Для плательщика: адрес, телефон, email
- Каждое поле может быть: обязательным, необязательным или скрытым.

---

## Публичная регистрация (iframe)

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

### Как создать публичную ссылку

1. Перейдите в **Настройки → Публичные ссылки**.
2. Нажмите **Создать**.
3. Настройте параметры (дата начала/окончания регистрации).
4. Скопируйте сгенерированную ссылку.

### Форма регистрации

Когда пользователь переходит по ссылке, он видит форму с 4 разделами:

**1. Выбор курса:**
- Выпадающий список курсов
- При выборе отображается расписание и доступные тарифы (радиокнопки)
- Если курс закрыт — красное предупреждение
- Если места заняты и включён лист ожидания — жёлтое предупреждение
- Если включён пробный урок — дополнительная опция (фиолетовая)
- Выбор даты начала из доступных дат расписания

**2. Данные студента:**
- Имя / Фамилия (или единое поле — настраивается)
- Личный код (isikukood) — с валидацией контрольной суммы
- Адрес, телефон, email — видимость и обязательность определяются настройками

**3. Данные плательщика:**
- Те же поля, что и для студента
- Email поддерживает несколько адресов через запятую

**4. Анкета:**
- Поля дефолтной анкеты организации (отображаются сразу при загрузке страницы)
- Поля анкеты курса (подгружаются динамически при выборе курса, если курсу назначена не-дефолтная анкета)

### Что происходит после отправки формы

1. Система находит или создаёт запись студента по личному коду.
2. Система находит или создаёт запись плательщика по личному коду.
3. Проверяется, нет ли у студента активного заявления на этот курс (дубликат запрещён).
4. Определяется статус заявления:
   - **Пробный** — если выбран пробный урок
   - **Лист ожидания** — если мест нет и включён waitlist
   - **Создано** — в обычном случае
5. Сохраняются ответы на анкету.
6. Заявление появляется в системе.

> **Важно:** При регистрации через публичную форму email-уведомление плательщику **не отправляется автоматически**. Администратор должен вручную отправить документ через кнопку «Отправить» на странице заявления. Исключение: для пробного урока с режимом «Всегда платный» автоматически создаётся счёт.

> **Уведомление работникам:** Если на курсе включены уведомления преподавателей/ассистентов, они получат email о новом заявлении автоматически.

### Курс создан, но не отображается в форме регистрации

Если новый курс уже сохранён, а в выпадающем списке курса на публичной форме его нет — последовательно проверьте по списку. После каждой правки обновите страницу регистрации.

1. **Учебный год курса совпадает с годом веб-регистрации.**
   - Откройте курс → поле **«Учебный год»**.
   - Сравните со значением в **Курсы → Настройки → Год для веб-регистрации (`DEFAULT_WEB_ACADEMIC_YEAR`)**.
   - Форма регистрации показывает только курсы того года, который указан в этой настройке. Если курс на `2026/2027`, а веб-регистрация на `2025/2026` — курса не будет.

2. **Регистрация на курсе не закрыта.**
   - На странице курса → переключатель **«Регистрация закрыта»** должен быть выключен.
   - Если включён — курс прячется из формы независимо от прочих условий.

3. **Дата начала регистрации уже наступила.**
   - На странице курса → поле **«Дата начала регистрации» (`registration_start_at`)**.
   - Если поле пустое — регистрация открыта всегда.
   - Если задана дата в будущем — курс появится только начиная с этой даты.

4. **На курсе настроена цена.**
   - Курсы → [курс] → **Цены**. Должен быть хотя бы один тариф (месяц/квартал/год).
   - Без цены форма регистрации не сможет показать тариф и курс не появится.

5. **На курсе есть расписание.**
   - Курсы → [курс] → **Расписание**. Должен быть хотя бы один блок с днём недели и временем.
   - Без расписания форма не сможет рассчитать «дату первого урока» и курс прячется.

6. **Возрастной фильтр (если используется).**
   - Курс показывается только если возраст в форме (или не задан) попадает в диапазон `min_age..max_age` курса.

7. **Курс не архивирован и не удалён.**
   - В списке курсов фильтр **«Только активные»** должен показывать ваш курс. Если он в архиве — снимите архивный флаг.

8. **Кэш страницы.**
   - После любой правки нажмите Ctrl+F5 на странице регистрации (полная перезагрузка), чтобы сбросить кэш браузера.

> **Ничего не помогло?** Проверьте, что публичная ссылка (token) принадлежит **той же организации**, что и курс. В **Настройки → Публичные ссылки** у каждой ссылки указана организация — курсы из других организаций по этой ссылке не видны.

---

## Копирование курса на новый учебный год

Когда начинается новый учебный год, не нужно создавать курсы заново вручную. Функция **«Копировать курс»** позволяет за несколько минут создать новый курс на основе существующего, перенеся расписание, цены, шаблоны и студентов. Процесс проходит через 6 простых шагов — на каждом вы выбираете, что именно копировать.

### Где найти кнопку «Копировать курс»

1. Откройте курс, который хотите скопировать: **Курсы → Специализации → [специализация] → [курс]**.
2. В верхнем баннере курса (рядом с названием) найдите кнопку **«Копировать курс»** — она полупрозрачная, белая.
3. Нажмите на неё — откроется страница визарда копирования.

> **Не видите кнопку?** Она доступна только пользователям с правом редактирования курсов.

Вверху страницы визарда вы увидите **горизонтальную полосу с 6 шагами**. Текущий шаг подсвечен синим, пройденные шаги — зелёной галочкой. Вы можете нажать на любой пройденный шаг, чтобы вернуться и что-то изменить.

---

### Шаг 1 из 6: Основные данные нового курса

На этом шаге вы задаёте **базовые параметры нового курса**. Все поля предзаполнены значениями из исходного курса — измените то, что нужно.

**Что вы видите и заполняете:**

- **Учебный год** — выберите из выпадающего списка (например, `2026/2027`). Обычно выбирают следующий год.
- **Название курса** — отдельное поле для каждого языка (ET, RU). Предзаполнено из исходного курса. Обычно достаточно изменить год в названии.
- **Дата начала курса** и **Дата окончания курса** — нажмите на поле, откроется календарь. Укажите даты нового учебного периода.
- **Дата начала регистрации** — необязательно. Если указать дату, форма регистрации станет доступной только после неё. Если оставить пустым — регистрация открыта сразу.
- **Макс. кол-во студентов** — лимит мест в группе.
- **Лимит листа ожидания** — сколько студентов могут встать в очередь, когда места закончатся. `0` = лист ожидания отключён.
- **Возраст** — ползунок для выбора минимального и максимального возраста.
- **Переключатели внизу:**
  - *Регистрация закрыта* — если включить, на новый курс нельзя будет зарегистрироваться через публичную форму.
  - *Уведомлять преподавателей* — преподаватели получат email при новых заявлениях.
  - *Уведомлять ассистентов* — то же самое для ассистентов.
  - *Пробный урок* — включить возможность пробного урока на новом курсе.

Нажмите **Далее →** для перехода к следующему шагу.

---

### Шаг 2 из 6: Расписание

На этом шаге вы видите **доску расписания исходного курса** — те же блоки с днями недели, временем, преподавателями и кабинетами, которые вы видите на вкладке «Информация» курса.

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

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

---

### Шаг 3 из 6: Цены

Здесь вы задаёте **цены нового курса**. Отображаются 4 карточки — по одной для каждой частоты оплаты:

| Карточка | Пример |
|----------|--------|
| Ежемесячная | 170.00 € |
| Каждые 3 месяца | 480.00 € |
| Каждые 6 месяцев | 900.00 € |
| Годовая | 1700.00 € |

**Как это выглядит:**

- Карточки с ценами выделены **синей рамкой** — это цены, которые будут скопированы.
- Серые карточки — частоты оплаты без цены (они не копируются).
- В каждой карточке два значения:
  - **Оригинальная цена** (серым, для справки) — цена из исходного курса.
  - **Новая цена** (поле ввода) — можете изменить. Предзаполнена из исходного.
- Если вы изменили цену, появится **жёлтое предупреждение** «Цена изменена» — напоминание проверить условия договора.

> **Скидки курса** (discount rules) автоматически копируются вместе с ценами. Например, если на исходном курсе была скидка «Второй ребёнок -15%», она появится и на новом.

---

### Шаг 4 из 6: Шаблоны, уведомления и тесты

Этот шаг позволяет настроить **шаблоны документов, уведомления и перенос дополнительных данных**.

**Что вы видите на странице (сверху вниз):**

**1. Шаблон заявления** — выпадающий список с шаблонами документов. Выберите, какой шаблон PDF будет использоваться для заявлений нового курса. Если оставить пустым, используется шаблон по умолчанию.

**2. Шаблон пробного заявления** — появляется только если на исходном курсе был включён пробный урок. Аналогично выберите шаблон.

**3. Шаблоны уведомлений по статусам** — для каждого статуса заявления (Создано, Отправлено, Подписано и т.д.) можно выбрать шаблон email, который плательщик получит при переходе заявления в этот статус.

**4. Уведомления работников по статусам** — для каждого статуса можно выбрать, каких работников уведомлять.

**5. Копирование связанных данных** — внизу страницы 3 переключателя:

| Переключатель | Что копирует | Счётчик |
|--------------|-------------|---------|
| **Тесты** | Квизы, привязанные к курсу | Показывает «N шт.» |
| **Поля анкеты** | Анкета курса (questionnaire_id) и привязанные поля | Показывает «N шт.» |
| **Вступительные тесты** | Тесты при поступлении (вместе с файлами) | Показывает «N шт.» |

По умолчанию все переключатели включены. Если что-то не нужно — выключите.

---

### Шаг 5 из 6: Студенты

Здесь вы решаете, **каких студентов перенести** на новый курс и **каким способом**.

**Если на исходном курсе нет студентов** — вы увидите сообщение «Нет студентов» и можете сразу перейти к следующему шагу.

**Если студенты есть, страница разделена на 3 части:**

#### Часть 1: Выбор способа переноса

Два варианта (радиокнопки):

- **«Перенести»** — заявки студентов переносятся на новый курс. Старые заявки закрываются автоматически. Файлы и скидки сохраняются. Используйте этот режим, когда студент **продолжает обучение** на новом курсе.

- **«Создать новые заявки»** — на новом курсе создаются **чистые заявки** (статус: Создано). Старые заявки на исходном курсе **не изменяются** — они остаются в том же статусе. Между новой и старой заявкой сохраняется ссылка. Используйте этот режим, когда хотите **сохранить историю** на старом курсе без изменений.

#### Часть 2: Фильтр по статусам

Горизонтальная полоса с **цветными бейджами статусов** и количеством студентов в каждом:

```
[Подписано (15)]  [Создано (5)]  [Отправлено (3)]  [Лист ожидания (2)]
```

- **Нажмите на бейдж** — все студенты с этим статусом будут выбраны (или сняты, если уже были выбраны).
- Это быстрый способ: например, нажмите «Подписано» — и все 15 подписанных студентов будут отмечены для переноса.
- Ссылки **«Выбрать всех»** и **«Снять всех»** — для массового выбора/снятия.

#### Часть 3: Таблица студентов

Таблица со списком всех студентов исходного курса:

| ☑ | Студент | Плательщик | Статус | Дата создания |
|---|---------|------------|--------|---------------|
| ☑ | Иванов Иван | Иванова Мария | Подписано | 01.09.2025 |
| ☑ | Петров Пётр | Петрова Анна | Подписано | 03.09.2025 |
| ☐ | Сидоров Сергей | Сидорова Елена | Закрыто | 15.09.2025 |

- **Чекбокс слева** — отметьте конкретных студентов для переноса.
- Студенты, выбранные через фильтр статусов, уже отмечены.
- Можно **убрать галочку** с конкретного студента, даже если его статус выбран в фильтре.

Внизу таблицы показано: **«N студентов выбрано»**.

> **Не хотите переносить студентов?** Просто снимите все галочки и нажмите «Далее». Курс будет создан пустым.

---

### Шаг 6 из 6: Проверка и подтверждение

Последний шаг — **итоговая сводка** всего, что будет скопировано. Проверьте всё перед подтверждением.

**Страница разделена на 5 блоков:**

**1. Курс** — таблица с основными данными: учебный год, название, даты, лимиты, настройки. Убедитесь, что данные верны.

**2. Расписание** — показывает, сколько блоков и занятий будет скопировано (например, «2 блока, 8 занятий»). Если расписание не выбрано — **жёлтое предупреждение** «Не выбрано».

**3. Цены** — показывает цены по каждой частоте оплаты (например, «Ежемесячная: 170.00 €»). Если цены не заданы — жёлтое предупреждение.

**4. Шаблоны** — список с галочками (зелёная ✓) и крестиками (серый ✗):
- ✓ Шаблон заявления — выбран
- ✓ Шаблоны уведомлений — 5 из 7 настроено
- ✗ Тесты — не копируются
- ✓ Поля анкеты — копируются
- и т.д.

**5. Студенты** — показывает количество выбранных студентов и режим переноса (например, «23 студента · Перенести»). Если студенты не выбраны — жёлтое предупреждение.

> **Жёлтые предупреждения** — это не ошибки. Они просто обращают внимание, что некоторые секции пустые. Курс можно создать и без расписания или студентов — добавите позже.

**Кнопка «Подтвердить»:**

Нажмите **Подтвердить** внизу справа. Система попросит подтверждение — нажмите **OK**.

**Что произойдёт после подтверждения:**
1. Создаётся новый курс со всеми выбранными настройками.
2. Копируются расписание, цены, шаблоны, тесты — всё, что вы отметили.
3. Переносятся студенты в выбранном режиме.
4. Вы будете перенаправлены на **страницу редактирования нового курса**.
5. Появится зелёное уведомление «Курс успешно скопирован».

Все действия выполняются **атомарно**: если что-то пойдёт не так, ничего не изменится — ни новый курс, ни заявки студентов.

---

### Что происходит со студентами после копирования

**Режим «Перенести»:**
- Заявки студентов переносятся на новый курс.
- На старом курсе заявка получает ссылку на новую (видна на странице заявления).
- Файлы и скидки переносятся вместе с заявкой.

**Режим «Создать новые заявки»:**
- На новом курсе появляются новые заявки со статусом **«Создано»**.
- Старые заявки на исходном курсе **не меняются** — остаются как были.
- На странице новой заявки видна ссылка: «Создано на основе заявления #N» — можно кликнуть и перейти к исходной.

> **Предупреждение о учебном годе:** Если вы просматриваете заявление, а курс относится к другому учебному году, чем текущий выбранный — вверху страницы появится жёлтое предупреждение. Переключите учебный год в верхней панели, чтобы оно исчезло.

---

## Редактирование курса

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

> **Последствия:** Изменение расписания влияет на расчёт уроков и счетов. Система автоматически пересчитает даты занятий для блоков расписания с соответствующими датами начала.

> **Совет:** Виджеты, вкладки и действия на странице курса зависят от вашей роли, прав доступа и включённых модулей в системе.

# Заявления

# Управление заявлениями

Заявления — это основной механизм записи студентов на курсы. Заявление можно создать вручную (администратор) или через публичную форму регистрации (плательщик/студент). Описание публичной регистрации: [03-courses.md → Публичная регистрация](https://docs.huvis.ee/link/142#публичная-регистрация-iframe).

---

## Статусы заявлений

Каждое заявление проходит через определённые этапы:

| Статус | Описание |
|--------|----------|
| **Лист ожидания** | Места на курсе заняты, студент ожидает освобождения |
| **Создано** | Заявление создано, ожидает обработки |
| **Отправлено** | Документ отправлен плательщику на подписание |
| **Подписано** | Договор подписан, студент зачислен |
| **Закрыто** | Обучение завершено или студент отчислен |
| **Аннулировано** | Заявление отменено до подписания |
| **Пробный урок** | Студент записан на пробное занятие, ожидается подтверждение |

### Жизненный цикл заявления

```
Регистрация → [Создано] → Отправлено → Подписано → Закрыто
                  │              │
                  │              └─→ Аннулировано (отмена до подписания)
                  │
                  └─→ Лист ожидания (если нет мест)
                        └─→ Создано (при освобождении места)

Пробный урок → [Пробный] → Подтверждение → [Создано] → …
                          → Отказ → [Закрыто]
```

---

## Номер заявления

Каждому заявлению автоматически присваивается **номер** (например, `2025/42`). Формат номера настраивается организацией.

### Формат по умолчанию

`Учебный год / ID заявления` → `2025/42`

### Настройка формата

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

1. Перейдите в **Курсы → Настройки**.
2. Выберите вкладку **Avalduse mall** (Шаблон заявления).
3. Внизу страницы найдите блок **Avalduse numbri mall** (Шаблон номера заявления).
4. Введите шаблон с переменными и нажмите **Сохранить**.
5. Справа от поля отображается **живой предпросмотр** — как будет выглядеть номер.

Доступные переменные:

| Переменная | Что подставляется | Пример |
|------------|-------------------|--------|
| `[[ACADEMIC_YEAR]]` | Учебный год курса | `2025` |
| `[[YYYY]]` | Календарный год | `2026` |
| `[[YY]]` | Год (2 цифры) | `26` |
| `[[MM]]` | Месяц | `03` |
| `[[SEQ]]` | Порядковый номер | `0042` |
| `[[ID]]` | ID заявления | `42` |
| `[[COURSE]]` | Название курса | `Klaveriõpe` |
| `[[STUDENT_CODE]]` | Личный код студента | `50301040740` |
| `[[STUDENT_NAME]]` | Имя студента | `Mari Tamm` |

**Примеры:**
- `[[ACADEMIC_YEAR]]/[[SEQ]]` → `2025/0042` (учебный год + порядковый номер)
- `[[YYYY]]-[[SEQ]]` → `2026-0042` (календарный год + порядковый номер)
- `[[SEQ]]` → `0042` (только номер)

> **Важно:** Изменение шаблона влияет только на **новые** заявления. Существующие номера не меняются.

> **Примечание:** В DOCX-шаблонах доступны две переменные:
> - `[[APPLICATION_ID]]` — уникальный ID заявления из базы данных (число, например `42`)
> - `[[APPLICATION_NUMBER]]` — номер заявления по шаблону (например `2025/0042`)
>
> Используйте `[[APPLICATION_NUMBER]]` для отображения номера договора в документах.

---

## Список заявлений

Перейдите в **Курсы → Заявления**.

### Фильтрация по статусу

Вверху страницы расположены вкладки по статусам: **Лист ожидания**, **Создано**, **Отправлено**, **Подписано**, **Закрыто**, **Аннулировано**. Рядом с каждой вкладкой показано количество заявлений.

### Фильтры и поиск

- **Курс** — выпадающий список для фильтрации по конкретному курсу
- **Студент** — поиск по имени студента
- **Плательщик** — поиск по имени плательщика

### Столбцы таблицы

| Столбец | Описание |
|---------|----------|
| Номер | Номер заявления (формат настраивается, см. выше) |
| Студент | Имя и фамилия |
| Плательщик | Имя и фамилия |
| Курс | Название курса |
| Дата создания | Когда заявление было создано |
| Дата первого урока | С какой даты студент присоединяется |
| Дополнительные | Зависят от выбранной вкладки: дата отправки, подписания, закрытия |

Все столбцы сортируемые. Нажмите на заголовок столбца для сортировки.

### Экспорт

Кнопка **Экспорт** позволяет скачать таблицу в формате XLSX (текущая страница или все записи).

### Видимость

- **Работники** видят только заявления по своим курсам (где они преподаватель или ассистент).
- **Менеджеры** видят все заявления организации.

---

## Создание заявления (администратор)

1. Перейдите в **Курсы → Добавить заявление** (или кнопка «Создать» на странице списка).
2. Заполните форму:

### Блок «Курс»

- **Курс** — выберите из выпадающего списка. После выбора появятся доступные тарифы.
- **Тариф** — выберите вариант оплаты (например, ежемесячная, 3 месяца, полугодовая). Радиокнопки с ценами.

### Блок «Студент»

- **Личный код** — начните вводить. Система автоматически ищет студентов по коду.
- Если студент найден, поля имя/фамилия заполнятся автоматически.
- Если не найден, заполните **Имя**, **Фамилию** и контактные данные — студент будет создан.
- **Адрес**, **Телефон**, **Email** — видимость зависит от настроек.

### Блок «Плательщик»

- Аналогично студенту: поиск по личному коду или создание нового.
- Можно привязать существующего плательщика.

### Дополнительные поля

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

3. Нажмите **Сохранить**.

> **Что происходит при сохранении:**
> - Создаётся запись студента (если нового) и плательщика
> - Создаётся запись Party (билинговая сущность) для плательщика
> - Если нет мест и включён лист ожидания → статус «Лист ожидания»
> - Проверяется дубликат: у студента не может быть двух активных заявлений на один курс
> - Если включены уведомления преподавателей → им отправляется email

---

## Страница заявления (детали)

Нажмите на заявление в списке для открытия детальной страницы. Страница разделена на несколько блоков.

### Блок «Данные студента / плательщика / курса»

Три колонки:

**Студент:**
- Имя, фамилия (редактируемые inline)
- Личный код, возраст
- Адрес, телефон, email

**Плательщик:**
- Имя, фамилия (редактируемые inline)
- Личный код
- Адрес, телефон, email
- Индикатор «Братья/сёстры» — ссылка на другие заявления этого плательщика

**Курс:**
- Название (ссылка на страницу курса)
- Активные тарифы
- Расписание (сетка 7 дней: время, кабинет, онлайн-индикатор)

### Блок «Статус и даты»

- **Статус** — цветной бейдж текущего статуса
- **Индикатор перевода** — если заявление переведено, показана ссылка на новое заявление
- **Номер ссылки** — при включённом модуле счетов
- **Ссылка на конференцию** — при включённом модуле конференций (с кнопкой копирования)

**Даты:**

| Дата | Описание | Действие |
|------|----------|----------|
| Дата создания | Когда заявление было создано | — |
| Дата первого урока | С какого урока студент присоединяется | Редактирование (кнопка ✏️) |
| Дата отправки | Когда документ был отправлен | Повторная отправка (кнопка) |
| Дата подписания | Когда договор был подписан | Отметить как подписанное (кнопка) |
| Дата закрытия | Когда заявление было закрыто | Редактирование |
| Дата последнего урока | Последний оплачиваемый урок | Для закрытых заявлений |

**Информация о пробном уроке** (если заявление пробное):
- Дата пробного урока
- Статус: подтверждено / отклонено / ожидает решения
- Кнопки **Подтвердить** и **Отклонить** (если ожидает)

**Информация о листе ожидания** (если статус «Лист ожидания»):
- Позиция в очереди
- Кнопка **Активировать**

**Принудительная смена статуса:**
- Выпадающий список с доступными статусами + кнопка **Сохранить**
- Доступно для всех статусов кроме «Закрыто» и «Аннулировано»

### Блок «Цена и скидки»

**Цена:**
- Базовая цена (перечёркнута, если есть скидка)
- Итоговая сумма к оплате
- Частота оплаты (ежемесячно, 3 мес. и т.д.)
- Размер скидки

**Скидки:**
- Список активных скидок (зелёный фон): название, значение, срок действия
- Кнопки: закрыть скидку (установить дату окончания) / удалить
- Неактивные скидки (сворачиваемый блок)
- Кнопка **Добавить скидку** (для статусов Создано / Отправлено)

**Счета** (при включённом модуле):
- Кнопки: **Генерировать счёт**, **Пересчитать**, **Наличная оплата**, **Добавить начисление**
- Таблица счетов: номер, сумма, дата оплаты, статус, дата оплаты
- Статус каждого счёта цветным бейджем

### Блок «Файлы»

- Последние 4 файла с информацией: кто загрузил, название, назначение (бейдж), дата
- Кнопки: скачать, предпросмотр
- Ссылка **Показать все файлы**
- Кнопка **Загрузить файл**

**Назначения файлов:**

| Бейдж | Назначение |
|-------|------------|
| Документ на подпись | PDF, сгенерированный из шаблона и отправленный плательщику |
| Подписанный документ | Загруженный подписанный договор |
| Файл заявления | Пользовательский файл |

---

## Действия с заявлением

### Предпросмотр и отправка документа

Это ключевое действие для отправки договора плательщику.

1. Нажмите кнопку **Предпросмотр** на странице заявления.
2. Система генерирует PDF из шаблона заявления (настраивается на вкладке «Шаблон» курса).
3. PDF отображается в модальном окне.
4. Доступно **два действия**:

| Действие | Что происходит | Email |
|----------|----------------|-------|
| **Сохранить** | Файл сохраняется к заявлению с назначением «Документ на подпись». Статус → Отправлено. | **Нет** |
| **Отправить** | Файл сохраняется. Статус → Отправлено. Плательщику отправляется email с PDF во вложении. | **Да** |

> **Важно: разница между «Сохранить» и «Отправить».**
> - **Сохранить** — документ только прикрепляется к заявлению, плательщик **не получает** email. Полезно, если вы хотите передать документ лично.
> - **Отправить** — документ прикрепляется И плательщик **получает email** с PDF. Шаблон email настраивается в разделе «Шаблон» курса (для статуса «Отправлено»). Письмо добавляется в очередь отправки и обрабатывается фоновым процессом.

### Повторная отправка

Кнопка **Отправить повторно** рядом с датой отправки:
- Отправляет последний сохранённый документ (с назначением «Документ на подпись») на email плательщика.
- Статус заявления **не меняется**.
- Используется шаблон email, соответствующий текущему статусу заявления.

### Отметить как подписанное

1. Нажмите кнопку **Подписано** рядом с датой подписания.
2. В модальном окне укажите **дату подписания**.
3. Выберите, что делать с подписанным документом:

**Если к заявлению уже прикреплены файлы**, доступны три режима (переключатель):

| Режим | Что происходит |
|-------|----------------|
| **Без файла** | Заявление подписывается без привязки документа |
| **Выбрать загруженный файл** | Выбираете один из уже прикреплённых к заявлению файлов — его назначение меняется на «Подписанный документ» |
| **Загрузить новый файл** | Загружаете новый документ с компьютера (назначение «Подписанный документ») |

**Если файлов ещё нет** — показывается только поле загрузки, и оно **необязательно**: можно подписать заявление и без файла.

4. Нажмите **Сохранить**.

> **Что происходит:** Статус → Подписано (для пробного урока в статусе «Отправлено» — фиксируется подписание договора). Привязка/пометка файла и смена статуса выполняются **атомарно** — заявление не останется с «подписанным» файлом при неподписанном статусе. Если настроены счета — начинается процесс биллинга.

> **Доступ:** Действие требует права **«Редактирование заявления»** (`course.application.edit`). В режиме «Выбрать загруженный файл» система проверяет, что выбранный файл действительно принадлежит этому заявлению.

### Изменение даты первого урока

1. Нажмите ✏️ рядом с «Дата первого урока».
2. Выберите дату в календаре.
3. Нажмите **Сохранить**.

> **Последствие:** Дата первого урока используется как дата зачисления (enrollment_date) для расчёта проратирования стоимости. Изменение влияет на будущие счета.

### Изменение даты зачисления

1. Нажмите ✏️ рядом с «Дата зачисления» в блоке Lisainfo.
2. Выберите дату в календаре.
3. Нажмите **Сохранить**.

> **Назначение:** Дата зачисления определяет начало периода обучения для расчёта стоимости и проратирования. При создании заявления автоматически заполняется из даты первого урока. Если дата не установлена — генерация счетов невозможна.

### Изменение даты последнего урока

1. Нажмите ✏️ рядом с «Дата последнего урока» в блоке Lisainfo.
2. Выберите дату в календаре.
3. Нажмите **Сохранить**.

> **Назначение:** Дата последнего урока ограничивает период обучения. Если дата в прошлом — система не сможет создать счёт за текущий период. Обычно устанавливается автоматически из `date_end` курса при подписании.

### Изменение тарифа

1. Нажмите ✏️ рядом с блоком цены.
2. В модальном окне выберите новый тариф из доступных.
3. Нажмите **Сохранить**.

> **Последствие:** Пересчитываются все будущие счета. Уже выставленные счета (ISSUED/SENT/PAID) не изменяются.

### Закрытие заявления

1. Нажмите кнопку **Закрыть**.
2. В модальном окне:
   - **Дата закрытия** — по умолчанию сегодня.
   - **Дата последнего урока** (для подписанных заявлений) — ограничена датами расписания.
3. Нажмите **Подтвердить**.

> **Что происходит:**
> - Если статус **Создано/Отправлено** → статус меняется на **Аннулировано** (отмена до подписания)
> - Если статус **Подписано** → статус меняется на **Закрыто** (завершение обучения)
> - Система вычисляет дату последнего урока из расписания курса
> - Если включён модуль счетов → пересчитываются счета (cutoff), будущие запланированные счета удаляются

### Перевод на другой курс

1. Нажмите **Перевести**.
2. Выберите новый курс.
3. При необходимости выберите новый тариф и дату начала.

> **Что происходит:**
> - Если курс в той же специализации с совместимым тарифом → заявление переключается на новый курс
> - Если специализация или тариф отличаются → текущее заявление закрывается, создаётся новое с привязкой (`transferred_to_id`)
> - Активные скидки копируются на новое заявление
> - На странице старого заявления появляется ссылка на новое

### Заявления, созданные при копировании курса

При [копировании курса](https://docs.huvis.ee/link/142#копирование-курса-на-новый-учебный-год) в режиме **«Создать новые заявки»** система создаёт новые заявления на новом курсе. На странице каждого такого заявления видна ссылка **«Создано на основе заявления #N»** — нажмите, чтобы перейти к исходному заявлению на старом курсе.

Исходные заявления на старом курсе при этом **не меняются** — сохраняют прежний статус.

При копировании в режиме **«Перенести»** заявки переносятся на новый курс, а на старом курсе в заявлении появляется ссылка на новое (аналогично обычному переводу).

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

### Принудительная смена статуса

Выпадающий список в блоке статуса позволяет вручную перевести заявление в любой статус.

| Переход | Что происходит |
|---------|----------------|
| → Создано | Очищаются даты отправки, подписания, закрытия |
| → Отправлено | Устанавливается дата отправки |
| → Подписано | Устанавливается дата подписания |
| → Закрыто | Устанавливается дата закрытия, вычисляется дата последнего урока |
| → Аннулировано | Устанавливается дата закрытия |
| → Лист ожидания | Очищаются все даты |
| → Пробный | Устанавливается `is_trial=true`, создаётся запись пробного урока |

> **Внимание:** При переходе из «Пробный» в другой статус автоматически удаляются данные пробного урока и неоплаченные trial-счета.

### Активация из листа ожидания

Кнопка **Активировать** на заявлении со статусом «Лист ожидания»:
- Статус → Создано
- Отправляются уведомления: работникам и плательщику (шаблон «Активация из листа ожидания»)

---

## Управление скидками

### Добавление скидки

1. Нажмите **Добавить скидку** в блоке цены.
2. В модальном окне доступно три варианта (взаимоисключающие):

**Вариант 1 — Выбрать существующую скидку:**
- Выпадающий список доступных скидок из справочника (тип и значение: «-15.50%» или «-25.00 €»).

**Вариант 2 — Указать индивидуальную цену:**
- Введите итоговую цену. Система автоматически создаст скрытую скидку на разницу.

**Вариант 3 — По количеству уроков** (если в неделю > 1 урока):
- Укажите, сколько уроков в неделю студент посещает.
- Система рассчитает процент скидки: `(всего - посещает) / всего × 100`.

3. **Период действия** (необязательно):
   - **Дата начала** — с какой даты скидка начинает действовать
   - **Дата окончания** — до какой даты скидка действует

4. В реальном времени отображается расчёт итоговой цены с учётом скидки.

5. Нажмите **Сохранить**.

> **Последствия:**
> - Все будущие счета пересчитываются автоматически
> - Если заявление в статусе «Отправлено» или «Подписано» — появится предупреждение о необходимости повторного подписания

### Закрытие скидки

1. Нажмите кнопку закрытия (×) рядом со скидкой.
2. Укажите **дату окончания** (по умолчанию — сегодня).
3. Нажмите **Сохранить**.

> **Что происходит:** Скидка мягко удаляется (soft-delete) с указанной даты. Счета пересчитываются. Аудиторский след сохраняется.

### Удаление скидки

Кнопка удаления полностью убирает скидку (soft-delete). Счета пересчитываются.

---

## Массовая отправка на подписание

Для одновременной отправки документов по нескольким заявлениям:

1. Перейдите в список заявлений.
2. Нажмите **Массовая отправка**.
3. Можно выбрать конкретный курс или все курсы.
4. Система запускает фоновый процесс:
   - Для каждого заявления со статусом «Создано» генерируется PDF
   - PDF отправляется плательщику
   - Статус → Отправлено
5. Прогресс отображается в реальном времени на странице.

> **Внимание:** Массовая отправка обрабатывается в фоновом режиме (через очередь). При большом количестве заявлений процесс может занять несколько минут.

---

## Загрузка файлов

1. На странице заявления нажмите **Загрузить файл**.
2. Выберите файл на компьютере.
3. Файл будет прикреплён к заявлению с назначением «Файл заявления».

> **Примечание:** Загрузка файла только сохраняет его в системе. Файл **не отправляется** плательщику автоматически. Для отправки используйте функцию «Предпросмотр → Отправить».

### Прикрепление вложения из письма

Если плательщик прислал документ (например, подписанный договор или справку) на
почту, файл можно прикрепить к заявлению **прямо из почтового клиента**, не
скачивая его на компьютер.

1. Откройте письмо в разделе **Почта**.
2. У нужного вложения нажмите кнопку **📁 «Прикрепить к заявлению»**.
3. В открывшемся окне введите **номер заявления** или **имя студента** (минимум 2 символа) и выберите заявление из списка.
4. Вложение копируется в файлы заявления с назначением **«Файл заявления»**.

> **Подсказка:** Уже прикреплённые заявления отмечаются зелёной галочкой ✓ рядом с вложением — нажатие на неё открывает страницу заявления. Повторное прикрепление того же файла к тому же заявлению ничего не дублирует.

> **Доступ:** Кнопка доступна только при наличии права **«Загрузка файлов на заявление»** (`course.application.file_upload`). Оригинал письма и вложение остаются на месте — в заявление кладётся копия.

---

## Лист ожидания (Waitlist)

### Как работает

1. Когда все места на курсе заняты, новые заявления получают статус **Лист ожидания**.
2. На публичной форме регистрации отображается предупреждение.
3. Плательщик получает email о постановке в очередь.
4. При освобождении места следующее заявление из очереди **автоматически активируется**.
5. Администратор может **вручную активировать** заявление кнопкой на странице заявления (игнорируя лимит мест).

### Настройка

В форме курса, поле **Лимит листа ожидания**:
- **0** — лист ожидания отключён
- **> 0** — максимальное количество заявлений в очереди

---

## Пробный урок (Trial Lesson)

### Регистрация на пробный урок

1. На публичной форме или в кабинете плательщика выберите опцию **Пробный урок**.
2. Выберите дату пробного занятия.
3. Заявление получает статус **Пробный урок**.

### Подтверждение / Отказ

На странице заявления (или в кабинете плательщика):

**Подтвердить:**
1. Нажмите **Подтвердить**.
2. Выберите тариф оплаты.
3. Заявление → статус **Создано**, далее стандартный цикл.
4. Для «Всегда платный»: дата первого урока сдвигается на следующий после пробного.

**Отклонить:**
1. Нажмите **Отклонить**.
2. Заявление → статус **Закрыто**.
3. Для «Бесплатно, если останется»: создаётся счёт за пробный урок.

### Режимы оплаты

| Режим | При записи | При подтверждении | При отказе |
|-------|-----------|-------------------|------------|
| Бесплатно, если останется | Счёт не создаётся | Пробный бесплатен | Счёт создаётся |
| Всегда платный | Счёт создаётся сразу | Дата начала сдвигается | Доп. счёт не нужен |
| Всегда отдельный | Счёт создаётся сразу | Тариф выбирается отдельно | Доп. счёт не нужен |

---

## Шаблоны email-уведомлений

Система автоматически отправляет email при определённых действиях. Шаблоны настраиваются на вкладке «Шаблон» курса или в общих настройках.

### Шаблоны для плательщика

| Событие | Шаблон |
|---------|--------|
| Заявление создано | PAYER_COURSE_APPLICATION_STATUS_CREATED |
| Документ отправлен | PAYER_COURSE_APPLICATION_STATUS_SENT |
| Заявление подписано | PAYER_COURSE_APPLICATION_STATUS_SIGNED |
| Заявление закрыто | PAYER_COURSE_APPLICATION_STATUS_CLOSED |
| Заявление аннулировано | PAYER_COURSE_APPLICATION_STATUS_ANNULLED |
| Добавлено в лист ожидания | PAYER_COURSE_APPLICATION_STATUS_WAITLIST |
| Активировано из очереди | PAYER_COURSE_APPLICATION_STATUS_WAITLIST_ACTIVATED |
| Пробный урок создан | PAYER_TRIAL_LESSON_CREATED |

### Переменные шаблонов

В шаблонах можно использовать переменные в квадратных скобках:

| Переменная | Значение |
|------------|----------|
| `[childName]` | Полное имя студента |
| `[childFirstName]`, `[childLastName]` | Имя / фамилия студента |
| `[childCode]` | Личный код студента |
| `[payerName]` | Имя плательщика |
| `[payerEmail]`, `[payerPhone]` | Контакты плательщика |
| `[courseName]` | Название курса |
| `[applicationId]` | Номер заявления |
| `[applicationYear]` | Учебный год |
| `[applicationFirstLessonAtDate]` | Дата первого урока |
| `[applicationCloseDate]` | Дата закрытия |
| `[price]` | Базовая цена |
| `[pricePeriodName]` | Частота оплаты |
| `[priceEndNoVat]` | Итоговая цена |
| `[company_name]` | Название организации |
| `[company_email]`, `[company_phone]` | Контакты организации |

### Как отправляются письма

1. Система формирует содержание письма, подставляя переменные в шаблон.
2. Создаётся запись `OutboundMessage` в базе данных.
3. Файлы прикрепляются как `OutboundMessageAttachment` (если есть).
4. Фоновый процесс (Laravel Horizon) обрабатывает очередь и отправляет email.

> **Совет:** Если плательщик не получил письмо — проверьте очередь отправки в разделе **Уведомления → Список**.

# Счета и оплата

# Счета и оплата

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

## Список счетов

Для просмотра всех счетов:

1. Перейдите в раздел **Счета** в боковом меню.
2. Откроется таблица со всеми счетами.
3. Для каждого счёта отображается: номер, плательщик, сумма, статус, дата выставления.
4. Используйте фильтры для поиска:
   - **По статусу** — выберите нужный статус (например, «Выставлен», «Оплачен»).
   - **По плательщику** — найдите счета конкретного плательщика.
   - **По курсу** — отфильтруйте счета определённого курса.
   - **По периоду** — укажите даты выставления.
5. Нажмите на строку счёта для просмотра подробной информации.

![Страница счетов](images/invoices/invoices_page.png)

![Список счетов с деталями](images/invoices/invoice_list.png)

## Статусы счетов

Каждый счёт имеет статус, отражающий его текущее состояние:

| Статус | Описание |
|--------|----------|
| **Запланирован** | Счёт создан автоматически, но ещё не выставлен. Можно редактировать. |
| **Готов** | Счёт готов к выставлению. |
| **Выставлен** | Счёт отправлен плательщику. Редактирование заблокировано. |
| **Отправлен** | Уведомление по электронной почте доставлено. |
| **Оплачен** | Оплата получена. |
| **Просрочен** | Срок оплаты истёк, платёж не поступил. |
| **Отменён** | Счёт аннулирован. |

> **Важно:** После выставления счёта его нельзя изменить. Если необходимо внести правки, отмените текущий счёт и создайте новый.

## Выставление счетов

Для выставления запланированного счёта:

1. Откройте счёт со статусом **Запланирован** или **Готов**.
2. Проверьте корректность данных: плательщик, сумма, период, позиции счёта.
3. При необходимости отредактируйте позиции счёта.
4. Нажмите кнопку **Выставить счёт**.
5. Система автоматически:
   - Сформирует PDF-документ счёта.
   - Отправит уведомление плательщику по электронной почте.
   - Изменит статус на **Выставлен**.

> **Примечание:** Счета также могут выставляться автоматически по расписанию, если это настроено в параметрах биллинга.

### Массовая отправка с отслеживанием прогресса

Чтобы выпустить и разослать сразу все подготовленные счета за месяц:

1. На странице **Счета** выберите нужный месяц в селекторе вверху.
2. Нажмите кнопку **Отправить**. В диалоге подтверждения («Отправить счета?») будет показано, сколько счетов будет выпущено и отправлено родителям — подтвердите кнопкой **Да, отправить**.
3. Отправка идёт **в фоне через очередь** — счета обрабатываются по одному, страницу можно не держать открытой.
4. На экране отображается **прогресс**: сколько счетов отправлено, сколько с ошибками, сколько пропущено. Индикатор обновляется автоматически (каждые ~2 секунды).
5. При необходимости отправку можно **отменить** — уже отправленные счета останутся выставленными, оставшиеся не будут обработаны.

> **Примечание:** одновременно для организации выполняется одна массовая отправка. По завершении видно итоговую сводку (успешно / с ошибками).

## Настройки счетов

Настройки определяют, как система автоматически генерирует счета.

> **Первоначальная настройка:** Для новой организации настройки счетов ещё не созданы. При первом посещении страницы заполните форму и нажмите **Сохранить** — система создаст настройки. Без этого автоматическая генерация счетов невозможна.

> **Примечание:** Реквизиты компании (номер расчётного счёта, API-ключ платёжного шлюза) настраиваются отдельно на странице **Настройки → Организация**, а не здесь.

1. Перейдите в **Счета** > **Настройки** в боковом меню.
2. Доступные параметры:

### День генерации

Число месяца (1–28), когда система автоматически создаёт счета.

### Режим биллинга

- **За прошедший месяц** — счёт выставляется после оказания услуги (постоплата).
- **За следующий месяц** — счёт выставляется заранее (предоплата).

### Срок оплаты и пеня (Viivis)

- **Maksetähtaeg (срок оплаты, в днях)** — через сколько дней после выставления счёт должен быть оплачен. По умолчанию 10 дней.
- **Viivis (% в день)** — дневная ставка пени, которая выводится в PDF-счёте (переменная `[[LATE_PAYMENT_RATE]]` в шаблоне). Например `0.02` → в счёте напечатается `0.02%`. Если поле пусто — строка с пеней в PDF не печатается.
- **Включение начисления пени** — отдельно можно включить **автоматическое начисление** пени на просроченные счета (по умолчанию выключено для всей организации). После включения система ежедневно считает пеню на неоплаченные счета и показывает её на странице счёта. Подробнее — раздел [Пеня за просрочку (Viivis)](#пеня-за-просрочку-viivis).

### Шаблон счёта

Загрузите DOCX-шаблон для формирования PDF-счетов. Если шаблон не загружен, используется шаблон по умолчанию.

После загрузки система **автоматически проверит шаблон** и покажет блок «Малли контроль»:

- **Распознанные переменные** — список всех `[[ИМЯ]]`, которые система знает и подставит при рендере.
- **Неизвестные переменные** — пометки, которые не соответствуют ни одной системной переменной. Это либо опечатки, либо устаревшие имена — в счёте такие останутся пустыми. Проверьте и поправьте.
- **Авто-чистка** — Word при правке шаблона иногда вставляет невидимые маркеры проверки орфографии, которые ломают Jinja-директивы (`[% tr for ... %]`). Система их автоматически удаляет и сохраняет очищенную версию.
- **Цикл услуг** — если найдено `[% tr for s in services %]`, строки услуг будут повторяться автоматически.

Кнопка **«Проверить шаблон тестовыми данными»** (Testi malli näidisandmetega) рендерит PDF с подставленными синтетическими значениями: ваши реквизиты (название, IBAN, адрес) подставляются реальные, остальное (плательщик, ученик, курс) — случайные правдоподобные. Открывает PDF в новой вкладке, не сохраняя ничего на сервере — удобно проверить, как будут выглядеть значения в каждой ячейке.

### Банковские ссылки

Опция «Добавлять ссылки на банки в письма» доступна **только если настроен платёжный шлюз Montonio** в параметрах организации. Если шлюз не настроен, опция заблокирована.

### Напоминания об оплате

В блоке **«Автоматизация»** можно задать, через сколько дней после срока оплаты система автоматически отправит плательщику письмо-напоминание (поле количества дней):

- Значение `0` или пусто — авто-напоминания для организации **выключены**.
- Рассылка идёт **ежедневно в 09:00** по неоплаченным счетам, чей срок прошёл на указанное число дней, и только тем, кому ещё не отправляли (повторно одно и то же напоминание не уходит).
- Кнопка **«Отправить сейчас»** отправляет напоминания всем просроченным сразу, независимо от прошлых отправок.
- Текст письма берётся из шаблона **«Напоминание об оплате счёта»** (раздел **Уведомления → Шаблоны**) — без него рассылка не сработает.

3. После изменения настроек нажмите **Сохранить**.

![Настройки счетов](images/invoices/invoice_settings.png)

## Отчёт о генерации счетов

После автоматической генерации счетов система отправляет отчёт администраторам с правом управления настройками счетов. Отчёт содержит:

- Количество сгенерированных счетов
- Общую сумму
- Период и организацию
- Дату и время генерации

Шаблон отчёта настраивается в **Уведомления** > **Шаблоны** > **Отчёт о генерации счетов**.

## Скидки

Система поддерживает гибкую настройку скидок для студентов.

### Типы скидок

- **Процентная скидка** — уменьшает сумму на указанный процент (например, 10%).
- **Фиксированная скидка** — уменьшает сумму на фиксированную величину (например, 50 евро).

### Настройка скидки

1. Откройте заявку студента.
2. Перейдите в раздел **Скидки**.
3. Нажмите **Добавить скидку**.
4. Заполните параметры:
   - **Тип скидки** — процентная или фиксированная.
   - **Размер** — процент или сумма скидки.
   - **Дата начала действия** — с какого момента применяется скидка.
   - **Дата окончания действия** — когда скидка перестаёт действовать.
5. Нажмите **Сохранить**.
6. Счета будут автоматически пересчитаны с учётом скидки.

![Настройки скидок](images/invoices/discount_settings.png)

> **Примечание:** Можно добавить несколько скидок одновременно. Процентные и фиксированные скидки суммируются. При удалении скидки счета пересчитываются автоматически.

### Массовая скидка на курс

Если нужно применить скидку сразу ко всем студентам курса (например, акция или перерасчёт), можно воспользоваться массовой скидкой.

**Как добавить:**

1. Откройте страницу курса.
2. Нажмите на меню **⋮** (три точки) в правом верхнем углу.
3. Выберите **«Lisa allahindlus»**.
4. Введите процент скидки.
5. Нажмите **Сохранить**.

**Что произойдёт:**

- Скидка будет применена ко всем заявлениям курса, у которых есть **неотправленные** счета (статус «Запланирован» или «Готов»).
- Каждый затронутый счёт будет автоматически пересчитан.
- Скидка действует **только на период конкретного счёта** — она не влияет на счета за другие месяцы.

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

## Пропорциональный расчёт (proration)

Когда студент регистрируется **в середине периода оплаты**, первый счёт выставляется не за полный период, а пропорционально — по количеству оставшихся уроков.

### Как это работает

Сумма первого счёта рассчитывается по формуле:

```
Сумма = Базовая цена × (Оставшиеся уроки / Всего уроков в периоде)
```

Это правило действует для **всех** частот оплаты: помесячная, квартальная, полугодовая и годовая.

### Пример: квартальная оплата

Допустим:
- Базовая цена за квартал: **489,99 €**
- Скидка за интенсивность: **20%**
- Всего уроков в квартале: **77**
- Студент пришёл в конце квартала, осталось: **14 уроков**

Расчёт:
1. Цена после скидки: 489,99 × 0,80 = **391,99 €**
2. Пропорция: 14 / 77 = **18,18%**
3. Итого к оплате: 391,99 × 0,1818 = **71,27 €**

> **Важно:** Следующий счёт будет за полный период (100%). Пропорция применяется только к первому счёту после регистрации.

### Как рассчитываются периоды

| Частота оплаты | Период охвата | Что считается |
|----------------|---------------|---------------|
| **Помесячная** | 1 календарный месяц | Уроки в этом месяце |
| **Квартальная** | 3 календарных месяца | Уроки за 3 месяца |
| **Полугодовая** | 6 календарных месяцев | Уроки за 6 месяцев |
| **Годовая** | 12 календарных месяцев | Уроки за 12 месяцев |

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

### Пример расчёта квартала по месяцам

Квартал: январь — март. Студент зарегистрирован 10 марта.

| Месяц | Уроков в месяце | Из них оплачиваемых |
|-------|-----------------|---------------------|
| Январь | 26 | 0 (до регистрации) |
| Февраль | 24 | 0 (до регистрации) |
| Март | 27 | 14 (с 10 марта) |
| **Итого** | **77** | **14** |

Пропорция = 14 / 77 = 18,18%. Студент платит только за те уроки, которые он может посещать.

> **Примечание:** Если у курса нет расписания (уроки не запланированы), пропорция не применяется — счёт выставляется за полный период.

## Предпросмотр PDF счёта

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

1. Откройте счёт со статусом **Запланирован** или **Готов**.
2. Нажмите кнопку **Предпросмотр PDF**.
3. Система сформирует PDF на основе шаблона счёта (настраивается в **Настройки → Счета**).
4. PDF откроется в модальном окне для проверки.

> **Примечание:** Шаблон счёта загружается в формате DOCX на странице настроек счетов. Система подставляет данные счёта (номер, суммы, реквизиты) и конвертирует документ в PDF.

## Публичная ссылка на оплату

При выставлении счёта плательщику отправляется email со ссылкой на страницу оплаты. Эта ссылка **не требует входа в систему** — плательщик может оплатить счёт, просто перейдя по ссылке.

На странице оплаты отображаются:
- Номер и сумма счёта
- Реквизиты плательщика
- Кнопка **Оплатить** (перенаправляет на страницу банка)
- Возможность скачать PDF счёта

> **Важно:** Если платёжная система (Montonio) не настроена, вместо кнопки оплаты отобразится предупреждение. Настройте API-ключи в **Настройки → Счета**.

## Отчёты по счетам

Для анализа финансовых данных доступны отчёты:

1. Перейдите в раздел **Отчёты** в боковом меню.
2. Выберите **Отчёт по счетам**.
3. Настройте параметры отчёта:
   - **Период** — укажите диапазон дат.
   - **Статус** — отфильтруйте по статусу счетов.
   - **Курс** — выберите конкретный курс или все курсы.
4. Нажмите **Сформировать отчёт**.
5. Отчёт отобразит итоговые суммы, количество счетов по статусам и детализацию.

![Отчёт по счетам](images/invoices/invoice_report.png)

> **Совет:** Отчёты можно экспортировать в формате Excel для дальнейшей обработки.

## Отмена счёта (кредитарве)

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

> **Закон:** По эстонскому законодательству (Raamatupidamise seadus § 10) выставленные счета нельзя удалять. Отмена возможна только через кредитарве.

### Как отменить счёт

1. Откройте счёт со статусом **Выставлен**, **Отправлен**, **Просрочен** или **Оплачен**.
2. Нажмите красную кнопку **Tühista** (Отмена) в правом верхнем углу.
3. Подтвердите действие в диалоговом окне.
4. Система автоматически:
   - Создаст **кредитарве** (отрицательный счёт) со ссылкой на оригинал.
   - Присвоит номер по шаблону (например, `KA-2026-0002`).
   - Обнулит остаток долга по оригинальному счёту.
   - Поставит оригинальный счёт в статус **Отменён**.
   - Создаст бухгалтерскую проводку (если настроена главная книга).

### Что происходит с деньгами

| Ситуация | Результат |
|----------|-----------|
| Счёт **не был оплачен** | Долг обнуляется, клиент ничего не должен |
| Счёт **был оплачен** | У клиента появляется **переплата** (кредит). Она автоматически зачтётся в следующий счёт |

### Пример

1. Выставлен счёт №2026-0001 на **89.00 €** → клиент оплатил.
2. Администратор отменяет → создаётся кредитарве **KA-2026-0002** на **-89.00 €**.
3. У клиента: кредит **89.00 €**.
4. Создаётся новый счёт №2026-0003 на **45.00 €** (со скидкой).
5. Система автоматически зачитывает кредит: 89.00 - 45.00 = **44.00 € остаётся**.
6. Счёт помечается как **Оплачен** (total ≤ 0 после зачёта).

### Где посмотреть

- **На странице счёта**: жёлтый баннер со ссылкой на кредитарве.
- **На странице отменённого счёта**: серый баннер «Отменён» со ссылкой.
- **В списке счетов**: кредитарве отображаются с отрицательной суммой.
- **В леджере**: записи ADJUSTMENT_CREDIT.

> **Нельзя** отменить: уже отменённый счёт, кредитарве, счёт со статусом «Ошибка».

---

## Пеня за просрочку (Viivis)

Если счёт не оплачен в срок, система может **автоматически начислять пеню** (viivis) за каждый день просрочки. Это помогает дисциплинировать оплату и при необходимости взыскать пеню официально.

### Включение для организации

Начисление пени включается **отдельно для каждой организации** (по умолчанию выключено):

1. Перейдите в **Счета** > **Настройки**.
2. В блоке биллинга включите начисление пени и задайте параметры:
   - **Ставка** — договорная ставка в % в день (например, `0.02`) **или** законная ставка (по ставке Европейского центрального банка + надбавка). Если на дату нет законной ставки — пеня просто не начисляется.
   - **Льготный период (дней)** — сколько дней после срока оплаты пеня ещё не начисляется (по умолчанию 0).
3. Нажмите **Сохранить**.

Пока начисление выключено — пеня не считается, и блок пени на счёте не отображается.

### Как начисляется

После включения система **каждую ночь** проходит по неоплаченным счетам (Выставлен / Отправлен / Просрочен) и пересчитывает накопленную пеню на сегодня. Пеня считается на непогашенное тело долга; если поступила частичная оплата — она по закону сначала засчитывается в счёт пени, остаток гасит основной долг.

> **Это информация, а не отдельный счёт.** Накопленная пеня — справочный показатель. Она не входит в сумму счёта автоматически и не требует от клиента немедленной оплаты, пока вы её не «начислите» (см. ниже).

### Панель пени на странице счёта

На неоплаченном просроченном счёте появляется блок **Viivis**:

- **накопленная сумма пени** на сегодня;
- **статус**: начисляется / приостановлено / отключено;
- **дата начала** начисления.

### Действия с пеней

| Действие | Что делает |
|----------|-----------|
| **Приостановить** | Замораживает рост пени. Уже накопленная сумма сохраняется. |
| **Возобновить (с текущей даты)** | Продолжает начисление с сегодняшнего дня; пропущенный во время паузы период не добирается. |
| **Возобновить (с даты паузы)** | Добирает пропущенные за время паузы дни, как будто паузы не было. |
| **Отключить** | Пеня по этому счёту больше не начисляется. |
| **Удалить** | Обнуляет накопленную пеню (например, если оплата всё-таки поступила). |
| **Начислить пеню** | «Замораживает» пеню и добавляет её к долгу клиента как официальное начисление — создаётся бухгалтерская проводка (Дебет: Дебиторка / Кредит: Доход от пени). После этого пеня становится обязательной к оплате. |

> **Важно:** все действия с пеней фиксируются в журнале действий (кто, когда, на какую сумму).

### Правовая основа

Реализованы требования эстонского закона (VÕS): пеня начисляется на просроченный долг (§113), может использоваться законная ставка (§94 — ставка ЕЦБ + надбавка), а поступивший платёж сначала погашает пеню, затем основной долг (§88(8)).

---

## Настройка нумерации счетов

Каждая организация может настроить формат номеров счетов, кредитарве и имён PDF-файлов.

### Где настроить

1. Перейдите в **Счета** > **Настройки** в боковом меню.
2. Прокрутите вниз до секции **Нумерация и имена файлов**.

### Шаблон номера счёта

Определяет, как формируется номер при создании нового счёта.

| Пример шаблона | Результат |
|----------------|-----------|
| `[[YYYY]]-[[SEQ]]` | `2026-0001`, `2026-0002`, ... |
| `ARV-[[YYYY]][[MM]]-[[SEQ]]` | `ARV-202603-0001` |
| `[[ID]]` | `3289` (просто ID из базы) |

### Шаблон номера кредитарве

Определяет формат номера для документов отмены.

| Пример шаблона | Результат |
|----------------|-----------|
| `KA-[[YYYY]]-[[SEQ]]` | `KA-2026-0003` |
| `KA-[[ORIG]]` | `KA-2026-0001` (номер оригинального счёта) |

### Шаблон имени PDF-файла

Определяет, как называется скачиваемый PDF.

| Пример шаблона | Результат файла |
|----------------|-----------------|
| `[[COURSE]]-[[STUDENT_CODE]]-inv-[[ID]]` | `klaveriope-50001010001-inv-3289.pdf` |
| `arve-[[NUMBER]]` | `arve-2026-0001.pdf` |
| `[[PAYER_NAME]]-[[PERIOD]]` | `jaan-maasikas-03-2026.pdf` |

### Доступные переменные

| Переменная | Описание | Где работает |
|------------|----------|-------------|
| `[[YYYY]]` | Год (4 цифры) | Номер + файл |
| `[[YY]]` | Год (2 цифры) | Номер + файл |
| `[[MM]]` | Месяц | Номер + файл |
| `[[SEQ]]` | Порядковый номер (сквозной, сбрасывается ежегодно) | Номер |
| `[[ID]]` | ID счёта | Номер + файл |
| `[[UUID]]` | UUID счёта | Номер |
| `[[ORIG]]` | Номер оригинального счёта | Только кредитарве |
| `[[COURSE]]` | Название курса | Только файл |
| `[[STUDENT_CODE]]` | Личный код ученика | Только файл |
| `[[STUDENT_NAME]]` | Имя ученика | Только файл |
| `[[PAYER_NAME]]` | Имя плательщика | Только файл |
| `[[NUMBER]]` | Номер счёта | Только файл |
| `[[PERIOD]]` | Период (ММ.ГГГГ) | Только файл |

### Как работает `[[SEQ]]`

Порядковый номер — это **сквозной счётчик** для всей организации:

- Счёт получает номер `2026-0001`
- Следующий счёт — `2026-0002`
- Кредитарве — `KA-2026-0003` (из того же счётчика!)
- **1 января** счётчик автоматически сбрасывается на 1

> **Важно:** Счета и кредитарве используют **общий** счётчик. Это гарантирует уникальность номеров и соответствие эстонским стандартам.

### Предпросмотр

При вводе шаблона под полем отображается **предпросмотр** с тестовыми данными. Это помогает проверить формат перед сохранением.

---

## Главная книга (бухгалтерские проводки)

Система ведёт двойную бухгалтерию по стандартам SmartAccounts/Merit. Каждая финансовая операция создаёт проводку.

### Где найти

В боковом меню: **Pearaamat** (Главная книга):

| Пункт | Описание |
|-------|----------|
| **План счетов** | Управление бухгалтерскими счетами и маппингами |
| **Пробный баланс** | Сальдо по всем счетам на дату |
| **Баланс** | Активы = Пассивы + Капитал |
| **Отчёт о прибылях** | Доходы минус расходы за период |
| **Выписка по счёту** | Детализация одного бухгалтерского счёта |

> **Примечание:** Пункт меню видим только пользователям с правом `gl.view` (обычно роль Manager).

### План счетов

Каждая организация имеет свой план бухгалтерских счетов. При первоначальной настройке создаются стандартные счета:

| Код | Название | Что отражает |
|-----|----------|--------------|
| 1010 | Pangakonto (põhi) | Основной банковский счёт |
| 1200 | Ostjatelt laekumata arved | Дебиторская задолженность (кто нам должен) |
| 2500 | Ostjatelt saadud ettemaksed | Предоплаты клиентов |
| 3060 | Maksuvaba müügitulu | Доход от обучения (õppemaks) |
| 4350 | Lootusetud debitoorsed võlad | Списание безнадёжных долгов |

### Что происходит автоматически

| Вы делаете | Система создаёт проводку |
|------------|--------------------------|
| Выставляете счёт | Дебет: Дебиторка +89€ / Кредит: Доход +89€ |
| Получаете оплату | Дебет: Банк +89€ / Кредит: Дебиторка -89€ |
| Отменяете счёт | Дебет: Доход +89€ / Кредит: Предоплата +89€ |
| Делаете возврат | Дебет: Дебиторка +89€ / Кредит: Банк -89€ |
| Списываете долг | Дебет: Расход +89€ / Кредит: Дебиторка -89€ |

> **Совет:** Если проводка не создалась (например, GL не настроен), операция (счёт, оплата) всё равно выполнится. Ошибка GL записывается в лог, но не блокирует работу.

### Настройка маппингов

В разделе **План счетов** → таблица **Маппинги** можно привязать каждый тип операции к конкретному бухгалтерскому счёту. Например:

- `ar.receivable` → 1200 (Дебиторка)
- `revenue.tuition` → 3060 (Доход от обучения)
- `bank.montonio` → 1020 (Банк Montonio)

Это позволяет адаптировать бухучёт под конкретную организацию без изменения кода.

### Счёт 2500 — Предоплаты клиентов

Счёт **2500** «Ostjatelt saadud ettemaksed». Создаётся автоматически и используется, когда:

- При отмене **оплаченного** счёта деньги клиента переходят в предоплату (2500)
- При оплате **больше** суммы счёта излишек уходит в предоплату (2500)
- При создании нового счёта предоплата автоматически зачитывается
- В отчётах видно сколько денег клиентов в предоплате

Если счёт не настроен — система работает как раньше, просто без детализации предоплат в бухучёте.

> Не путать с **2310** «Müügi käibemaks» — это счёт НДС с продаж, не предоплата.

**Как настроить (если маппинг отсутствует):**
1. Перейдите в **Pearaamat** > **План счетов**
2. Создайте новый счёт (код 2500, тип LIABILITY)
3. В таблице маппингов привяжите ключ `prepayment.customer` к новому счёту

---

## Внесение наличных

Если родитель оплатил наличными:

1. Откройте заявление студента.
2. Нажмите кнопку **Sularaha** (Наличные) рядом с разделом счетов.
3. В модальном окне укажите:
   - **Дату** получения
   - **Сумму** в евро
4. Нажмите **Salvestan** (Сохранить).
5. Платёж отразится в леджере и уменьшит задолженность по текущему счёту.

---

## Ручная отметка оплаты

Если оплата поступила вне системы (например, банковский перевод, который ещё не подтянулся автоматически), счёт можно вручную пометить как оплаченный:

1. Откройте счёт в статусе **Выставлен** или **Просрочен**, у которого есть непогашенный остаток.
2. Нажмите кнопку **Отметить оплаченным**.
3. Счёт перейдёт в статус **Оплачен**; если ведётся главная книга — создастся проводка о поступлении оплаты (банковский перевод).

> **Когда недоступно:** для счетов, которыми управляет бухгалтерская программа **Merit Aktiva**, кнопка скрыта — статус оплаты для них приходит автоматически из синхронизации с Merit (раз в час).

---

## Журнал проводок (Ledger)

Для просмотра всех финансовых операций:

1. Перейдите в **Счета** > **Журнал проводок** в боковом меню.
2. Доступные фильтры:
   - **Тип операции** — оплата, начисление, корректировка, списание.
   - **Сторона** — дебет или кредит.
   - **Метод оплаты** — банковский перевод, Montonio, наличные.
   - **Период** — даты.
   - **Счёт** — поиск по конкретному счёту.
3. Внизу таблицы отображаются итоги:
   - **Дебет** (красный) — сумма всех дебетовых операций.
   - **Кредит** (зелёный) — сумма всех кредитовых операций.
   - **Сальдо** — разница (положительное = долг, отрицательное = переплата).

---

## Шаблон описания позиции счёта

Позиция счёта (строка с суммой) имеет текстовое описание. По умолчанию оно формируется как «Название курса + период». Вы можете настроить свой формат.

### Где настроить

1. Перейдите в **Счета** > **Настройки**.
2. Найдите поле **Arve rea kirjelduse mall** (Шаблон описания позиции).
3. Введите шаблон с переменными в двойных квадратных скобках.
4. Нажмите **Сохранить**.

### Доступные переменные

| Переменная | Описание | Пример значения |
|------------|----------|-----------------|
| `[[COURSE]]` | Название курса | Klaveriõpe |
| `[[DISCIPLINE]]` | Дисциплина (предмет) | Klaver |
| `[[SPECIALIZATION]]` | Специализация | Muusikakool |
| `[[STUDENT_NAME]]` | Полное имя ученика | Mari Maasikas |
| `[[STUDENT_FIRST_NAME]]` | Имя ученика | Mari |
| `[[STUDENT_LAST_NAME]]` | Фамилия ученика | Maasikas |
| `[[STUDENT_CODE]]` | Личный код ученика | 50001010001 |
| `[[PERIOD]]` | Период (ММ.ГГГГ) | 03.2026 |
| `[[PERIOD_FULL]]` | Полный период | 03.2026 – 05.2026 |
| `[[TEACHER]]` | Преподаватель | Jaan Tamm |
| `[[LESSONS_COUNT]]` | Кол-во уроков в периоде | 8 |
| `[[INVOICE_DISPLAY_NAME]]` | Заданное «название курса в счёте» (если задано на курсе) | Klaveriõpe |

### Примеры шаблонов

| Шаблон | Результат в счёте |
|--------|-------------------|
| `[[COURSE]] [[PERIOD]]` | Klaveriõpe 03.2026 |
| `[[COURSE]] – [[STUDENT_NAME]] ([[PERIOD]])` | Klaveriõpe – Mari Maasikas (03.2026) |
| `[[DISCIPLINE]] / [[TEACHER]] / [[LESSONS_COUNT]] tundi` | Klaver / Jaan Tamm / 8 tundi |

> **Если шаблон не задан**, используется формат по умолчанию: `Название курса + период` (например, «Klaveriõpe 03.2026»).

> **Язык описания.** Названия курса/дисциплины/специализации в описании позиции выводятся на **контентном языке организации** (настраивается в настройках локалей), а не на языке сотрудника, выставляющего счёт. Поэтому описание одинаково у всех администраторов и совпадает с языком документов организации.

### Применить новый шаблон к существующим счетам

После сохранения нового шаблона **уже созданные счета** продолжают показывать старое описание — оно зафиксировано в базе на момент создания позиции. Если новый шаблон нужно применить ретроактивно, под полем шаблона есть блок **«Применить к неотправленным»** (Rakenda saatmata arvetele):

- Рядом отображается счётчик **«Затронуто счетов: N»** — сколько счетов попадает под пересчёт.
- Нажатие кнопки запускает пересчёт для всех счетов в статусах **PLANNED / READY / ISSUED** текущей организации.
- Счета в статусах **SENT / PAID / OVERDUE / CANCELED / FAILED** **не трогаются** — то, что уже отправлено или оплачено клиентом, должно совпадать с тем, что он увидел.
- Счета, выпущенные через **Merit Aktiva** (имеют `accounting_external_id`), **не пересчитываются** — для них PDF хранится у Merit и не пересоздаётся.
- После подтверждения появится сообщение «Описание обновлено в N счетах».

> **Совет:** перед нажатием убедитесь, что шаблон сохранён. Кнопка работает по **текущему** значению шаблона в БД.

---

## Как счёт попадает к плательщику

В зависимости от того, какие интеграции подключены, счёт может уходить плательщику по одному из четырёх сценариев. Во всех случаях счёт уходит в электронном виде (PDF). Различаются только: **кто формирует PDF**, **кто отправляет письмо** и **есть ли в письме ссылки на онлайн-оплату**.

> **Важно:** **Merit Aktiva** и **Montonio** — это сторонние сервисы, которые приобретаются и оплачиваются **отдельно**, не входят в стоимость нашей системы. Договор и тариф на каждый из сервисов школа заключает напрямую с поставщиком. В нашей системе настраивается только подключение по API.

### 1. Базовая система (без интеграций)

- Система рассчитывает стоимость и создаёт **предварительный счёт**.
- Генерирует **PDF-счёт** на своей стороне.
- После подтверждения отправляет плательщику **e-mail с PDF** и просьбой оплатить.
- 📎 Вложение: PDF · 🔗 Ссылки на оплату: нет.

### 2. Базовая система + Merit Aktiva

- Система рассчитывает стоимость и создаёт **предварительный счёт**.
- **PDF не генерируется** — счёт создаётся на стороне Merit.
- Данные счёта уходят в Merit. Далее **два варианта**:
  - **2a.** Плательщику **ничего не отправляется автоматически** — рассылку делает бухгалтер вручную из Merit.
  - **2b.** Merit сам формирует PDF и отправляет письмо плательщику.
- 📎 Вложение: PDF от Merit (только в 2b) · 🔗 Ссылки на оплату: нет.

### 3. Базовая система + Montonio

- Система рассчитывает стоимость и создаёт **предварительный счёт**.
- Генерирует **PDF-счёт** на своей стороне.
- После подтверждения отправляет плательщику **e-mail с PDF + ссылками** на эстонские банки и Apple Pay.
- 📎 Вложение: PDF · 🔗 Ссылки на оплату: да (наши, через Montonio).

### 4. Базовая система + Merit + Montonio

> Montonio подключается **внутри Merit** — ссылки на оплату генерирует сам Merit.

- Система рассчитывает стоимость и создаёт **предварительный счёт**.
- **PDF не генерируется** — счёт создаётся на стороне Merit.
- Данные счёта уходят в Merit. Далее **два варианта**:
  - **4a.** Плательщику **ничего не отправляется автоматически** — рассылку делает бухгалтер вручную из Merit.
  - **4b.** Merit формирует PDF **со ссылками на оплату** и отправляет письмо плательщику.
- 📎 Вложение: PDF от Merit (только в 4b) · 🔗 Ссылки на оплату: да, от Merit (только в 4b).

### Сводная таблица

| Сценарий | Кто делает PDF | Кто шлёт письмо плательщику | Ссылки на оплату |
|---|---|---|---|
| 1. Базовая | Наша система | Наша система | ❌ |
| 2a. Merit (ручная отправка) | Merit | Бухгалтер вручную из Merit | ❌ |
| 2b. Merit (авто-отправка) | Merit | Merit | ❌ |
| 3. Montonio | Наша система | Наша система | ✅ (наши) |
| 4a. Merit + Montonio (ручная) | Merit | Бухгалтер вручную из Merit | ❌ до отправки |
| 4b. Merit + Montonio (авто) | Merit | Merit | ✅ (от Merit) |

> **Юридический момент:** во всех сценариях счёт уходит в электронном виде (PDF). Структурированный e-arve (EVS 923) формируется только при подключённом Merit Aktiva — базовая система сама по себе e-arve не генерирует.

---

## Интеграция с Merit Aktiva

Система может автоматически отправлять выставленные счета в бухгалтерскую программу Merit Aktiva.

### Настройка

1. Перейдите в **Счета** > **Настройки**.
2. Включите переключатель **Merit Aktiva integratsioon**.
3. Заполните:
   - **Merit API ID** — из Merit: Seaded > API seaded.
   - **Merit API võti** — секретный ключ из Merit.
4. Нажмите **Сохранить**.
5. **Обязательно** выполните синхронизацию ставок НДС (обратитесь к администратору).

### Как работает

После включения интеграции:

1. Вы выставляете счёт как обычно (кнопка **Väljasta**).
2. Система **автоматически** отправляет счёт в Merit:
   - Создаёт или обновляет клиента в Merit.
   - Передаёт все позиции счёта с правильными ставками НДС.
   - Получает PDF счёта из Merit.
3. Merit отправляет счёт клиенту на email (настраивается в Merit).
4. Оплаты **автоматически синхронизируются** каждый час:
   - Если клиент оплатил в банке → система пометит счёт как «Оплачен».

### Статус экспорта

На странице счёта отображается статус отправки в Merit:

| Статус | Значение |
|--------|----------|
| *(пусто)* | Не отправлялся в Merit |
| **Ootel** (Ожидание) | В очереди на отправку |
| **Sünkroniseeritud** (Синхронизирован) | Успешно отправлен |
| **Ebaõnnestunud** (Ошибка) | Ошибка при отправке — см. описание ошибки |

### Массовая отправка

При массовом выставлении счетов все они автоматически отправляются в Merit. По завершении вы получите уведомление с отчётом: сколько отправлено успешно, сколько с ошибками.

### Что делать при ошибке

1. Откройте счёт — в поле ошибки будет описание проблемы.
2. Частые причины:
   - **«TaxId required»** — не синхронизированы ставки НДС. Обратитесь к администратору.
   - **«Invalid API credentials»** — проверьте API ID и ключ в настройках.
   - **«Customer validation failed»** — проверьте данные плательщика (имя, код).
3. После исправления повторно выставите счёт.

---

## Показатели на странице счетов

В верхней части страницы списка счетов отображаются информационные карточки:

| Карточка | Описание |
|----------|----------|
| **Väljastatud kokku** | Общая сумма всех выставленных счетов |
| **Makstud kokku** | Общая сумма оплаченных счетов |
| **Laekunud kokku** | Фактически поступившие денежные средства (из бухгалтерии). Показывается только если отличается от «Makstud kokku» |
| **Tasumata** | Общая сумма неоплаченных счетов |
| **Klientide ettemaksud** | Сумма переплат клиентов (кредит). Показывается только если есть переплаты |

> **Примечание:** Карточки «Laekunud kokku» и «Klientide ettemaksud» основаны на данных главной книги (GL). Они отображаются только если в организации настроена главная книга и есть соответствующие проводки.

# Тесты и вопросы

# Тесты и опросы

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

## Список тестов

1. Перейдите в раздел **Тесты** в главном меню.
2. На экране отобразится список всех созданных тестов с указанием названия, типа и статуса.

![Список тестов](images/quiz/quizzes_list.png)

## Создание нового теста

1. Нажмите кнопку **Создать тест**.
2. Заполните форму:
   - **Название** — введите название теста.
   - **Тип** — выберите тип: *домашнее задание* или *экзамен*.
   - **Ограничение по времени** — укажите время на выполнение теста в минутах (при необходимости).
   - **Количество попыток** — укажите, сколько раз учащийся может пройти тест.
3. Нажмите **Сохранить**.

![Заполненная форма теста](images/quiz/quiz_form_filled.png)

После сохранения тест появится в общем списке.

![Список тестов после создания](images/quiz/quizzes_after_create.png)

## Банк вопросов

Банк вопросов — это общее хранилище вопросов, из которого можно добавлять вопросы в любой тест.

### Просмотр банка вопросов

1. Перейдите в раздел **Вопросы** (банк вопросов).
2. На экране отобразится список всех созданных вопросов.

![Список вопросов](images/quiz/questions_list.png)

### Создание вопроса со свободным ответом

1. Нажмите **Добавить вопрос**.
2. Выберите тип **Свободный текст**.
3. Введите текст вопроса.
4. Нажмите **Сохранить**.

![Вопрос со свободным ответом](images/quiz/question_free_text.png)

### Создание вопроса с одним правильным ответом

1. Нажмите **Добавить вопрос**.
2. Выберите тип **Один правильный ответ**.
3. Введите текст вопроса и варианты ответов.
4. Отметьте правильный вариант.
5. Нажмите **Сохранить**.

![Вопрос с одним ответом](images/quiz/question_single_choice.png)

### Создание вопроса с несколькими правильными ответами

1. Нажмите **Добавить вопрос**.
2. Выберите тип **Несколько правильных ответов**.
3. Введите текст вопроса и варианты ответов.
4. Отметьте все правильные варианты.
5. Нажмите **Сохранить**.

![Вопрос с несколькими ответами](images/quiz/question_multiple_choice.png)

## Добавление вопросов в тест

1. Откройте нужный тест из списка.
2. Перейдите в **Менеджер вопросов**.
3. Выберите вопросы из банка вопросов и добавьте их в тест.
4. При необходимости измените порядок вопросов.

![Менеджер вопросов](images/quiz/question_manager.png)

## Назначение теста ученикам

Откройте тест из списка → нажмите **Назначить**. Откроется форма с тремя способами назначения.

### 1. Назначить точечно (одной заявке)

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

1. В выпадающем списке **«Прямое назначение»** выберите заявку (имя — курс).
2. Нажмите **«Назначить напрямую»**.

### 2. Выбрать курс и назначить группе

1. В выпадающем списке **«Курс»** выберите курс. Список отсортирован по учебному году (сверху — самый свежий).
2. Появится секция **«Автоматическое назначение»** и список заявок курса.

### 3. Назначить всем (текущим + будущим)

1. Включите чекбокс **«Назначить тест всем текущим ученикам и автоматически новым заявкам»**.
2. В нижнем списке заявок все активные ученики автоматически отметятся галочками. Закрытые и аннулированные заявки отображаются приглушённо и тестов не получают.
3. Нажмите **«Назначить всем (текущие + будущие)»**.

После этого:
- Каждой **активной** заявке курса (статусы CREATED, SENT, SIGNED) создаётся назначение.
- В системе сохраняется флаг авто-назначения. Любая **новая** заявка на этом курсе автоматически получит тест без вашего участия.
- Закрытые/аннулированные заявки пропускаются.

### 4. Назначить только выбранным

1. **Снимите** галочку «Назначить всем».
2. В списке заявок отметьте нужных учеников.
3. Нажмите **«Назначить выбранных»**.

После этого:
- Тест получают только отмеченные ученики **этого** курса.
- С назначений других курсов этого теста система не трогает.
- Авто-назначение для этого курса выключается — новые заявки больше не получат тест автоматически.

### Сводка назначений

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

Из этой таблицы можно отменить отдельные назначения (значок корзины) и видеть статус попыток (не начат / пройден / провален) и лучший результат.

## Прохождение теста

### Начало теста

1. Учащийся открывает назначенный тест.
2. На стартовой странице отображается информация о тесте: количество вопросов, ограничение по времени, оставшиеся попытки.
3. Нажмите **Начать тест**.

![Стартовая страница теста](images/quiz/quiz_start_page.png)

### Ответы на вопросы

1. Отвечайте на вопросы последовательно.
2. После ответа на все вопросы нажмите **Завершить тест**.

![Все ответы даны](images/quiz/quiz_answers_given.png)

### Просмотр результатов

После завершения теста отобразятся результаты: количество правильных ответов, набранные баллы и итоговая оценка.

![Результаты теста](images/quiz/quiz_results.png)

## Просмотр попыток (для администратора)

1. Откройте нужный тест из списка.
2. Перейдите на вкладку **Попытки**.
3. На экране отобразится список всех попыток учащихся с датой, временем и результатом.
4. Нажмите на попытку, чтобы просмотреть ответы учащегося.

![Список попыток](images/quiz/admin_attempts_list.png)

# Посещаемость

# Учёт посещаемости

В данном разделе описано, как вести учёт посещаемости учащихся: создавать записи о занятиях, отмечать присутствие и отсутствие, а также просматривать историю посещаемости.

## Открытие вкладки посещаемости

1. Перейдите в раздел **Курсы** и откройте нужный курс.
2. Выберите вкладку **Посещаемость**.
3. На экране отобразится таблица посещаемости с датами занятий и списком учащихся.

![Вкладка посещаемости](images/attendance/attendance_tab.png)

## Создание записи о занятии

1. На вкладке **Посещаемость** нажмите кнопку **Добавить занятие** (или выберите дату из календаря).
2. Укажите дату проведения занятия.
3. Система автоматически загрузит список учащихся, зачисленных на курс.

![Форма посещаемости](images/attendance/attendance_form.png)

## Отметка присутствия и отсутствия

1. В форме посещаемости напротив каждого учащегося выберите статус:
   - **Присутствовал** — учащийся был на занятии.
   - **Отсутствовал** — учащийся пропустил занятие.
2. При необходимости добавьте комментарий (например, причину отсутствия).

![Посещаемость отмечена](images/attendance/attendance_marked.png)

## Сохранение записей

1. После того как вы отметили всех учащихся, нажмите кнопку **Сохранить**.
2. Система сохранит данные о посещаемости.
3. На экране появится подтверждение успешного сохранения.

![Посещаемость сохранена](images/attendance/attendance_saved.png)

## Просмотр истории посещаемости

1. Откройте нужный курс и перейдите на вкладку **Посещаемость**.
2. В таблице отображаются все ранее созданные записи о занятиях.
3. Для каждой даты видны статусы учащихся (присутствие или отсутствие).
4. Нажмите на конкретную дату, чтобы отредактировать запись.

![Вкладка посещаемости с записями](images/attendance/attendance_tab_after.png)

## Полезные советы

- Регулярно заполняйте посещаемость после каждого занятия, чтобы данные были актуальными.
- Используйте комментарии для пояснения причин отсутствия (болезнь, уважительная причина и т.д.).
- Ранее сохранённые записи можно отредактировать, нажав на нужную дату в таблице.
- Данные о посещаемости используются для формирования отчётов и статистики по курсу.

# HR-модуль

# Кадровый учёт (HR)

В данном разделе описана работа с кадровым модулем: управление сотрудниками, отпусками, документами, заявками, напоминаниями и компенсациями.

## Список сотрудников

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

![Список сотрудников](images/hr/workers_list.png)

## Панель кадрового учёта

Панель HR содержит несколько вкладок для работы с различными аспектами кадрового учёта:

- **Отпуска** — управление отпусками сотрудников.
- **Документы** — хранение и контроль документов.
- **Заявки** — кадровые заявки.
- **Напоминания** — напоминания о важных событиях.
- **Компенсации** — данные о зарплатах и надбавках.

## Отпуска

### Просмотр отпусков

1. Перейдите на вкладку **Отпуска**.
2. На экране отобразится календарь или список отпусков сотрудников с указанием дат и статуса.

![Вкладка отпусков](images/hr/hr_vacations.png)

### Создание заявки на отпуск

1. Нажмите кнопку **Создать заявку на отпуск**.
2. Заполните форму:
   - **Сотрудник** — выберите сотрудника (или заявка создаётся от вашего имени).
   - **Тип отпуска** — выберите тип (ежегодный, учебный, без сохранения зарплаты и т.д.).
   - **Дата начала** — укажите первый день отпуска.
   - **Дата окончания** — укажите последний день отпуска.
3. Нажмите **Сохранить**.

![Форма заявки на отпуск](images/hr/vacation_form.png)

![Заполненная форма отпуска](images/hr/vacation_form_filled.png)

### Согласование отпуска

1. Руководитель получает уведомление о новой заявке на отпуск.
2. Откройте заявку из списка отпусков.
3. Нажмите **Одобрить** или **Отклонить**.
4. После одобрения статус заявки изменится на «Одобрено».

![Одобренный отпуск](images/hr/vacation_approved.png)

## Документы

### Просмотр документов

1. Перейдите на вкладку **Документы**.
2. На экране отобразится список документов сотрудников.

![Вкладка документов](images/hr/hr_documents.png)

### Добавление документа

1. Нажмите **Добавить документ**.
2. Заполните форму:
   - **Название** — укажите название документа.
   - **Сотрудник** — выберите сотрудника.
   - **Срок действия** — укажите дату окончания действия документа (если применимо).
   - **Файл** — прикрепите файл документа.
3. Нажмите **Сохранить**.

![Форма документа](images/hr/document_form.png)

> При приближении даты истечения срока действия система отправит напоминание.

## Заявки

1. Перейдите на вкладку **Заявки**.
2. На экране отобразится список кадровых заявок (запросы на изменение данных, справки и т.д.).
3. Для создания новой заявки нажмите **Создать заявку** и заполните необходимые поля.

![Вкладка заявок](images/hr/hr_requests.png)

## Напоминания

1. Перейдите на вкладку **Напоминания**.
2. Здесь отображаются напоминания: истекающие документы, предстоящие отпуска и другие события.
3. Для создания нового напоминания нажмите **Добавить напоминание**, укажите дату и описание.

![Вкладка напоминаний](images/hr/hr_reminders.png)

## Компенсации

### Просмотр компенсаций

1. Перейдите на вкладку **Компенсации**.
2. На экране отобразится информация о зарплатах, ставках и надбавках сотрудников.

![Вкладка компенсаций](images/hr/hr_compensation.png)

![Таблица компенсаций](images/hr/compensation_tab.png)

### Добавление записи о компенсации

1. Нажмите **Добавить запись**.
2. Заполните форму:
   - **Сотрудник** — выберите сотрудника.
   - **Тип** — укажите тип компенсации (оклад, почасовая ставка, бонус).
   - **Сумма** — введите сумму.
   - **Дата начала действия** — укажите, с какой даты действует данная компенсация.
3. Нажмите **Сохранить**.

![Заполненная форма компенсации](images/hr/compensation_form_filled.png)

# Уведомления

# Уведомления и рассылки

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

## Массовая рассылка

Массовая рассылка позволяет отправить письмо сразу нескольким получателям.

### Создание рассылки

1. Перейдите в раздел **Уведомления** в главном меню.
2. Выберите пункт **Массовая рассылка**.
3. На экране откроется форма создания рассылки.

![Страница массовой рассылки](images/notifications/bulk_mail_page.png)

### Заполнение формы рассылки

1. Заполните поля:
   - **Тема письма** — введите тему сообщения.
   - **Получатели** — выберите группу получателей (сотрудники, учащиеся, плательщики) или укажите адреса вручную.
   - **Текст письма** — введите текст сообщения. Используйте редактор для форматирования.
   - **Вложения** — при необходимости прикрепите файлы.
2. Нажмите **Отправить**.

![Заполненная форма рассылки](images/notifications/bulk_mail_filled.png)

## Список уведомлений

1. Перейдите в раздел **Уведомления** > **Список**.
2. На экране отобразится история всех отправленных уведомлений.
3. Для каждого уведомления указаны: дата отправки, тема, получатель, статус доставки.
4. Нажмите на уведомление, чтобы просмотреть подробности.

![Список уведомлений](images/notifications/notification_list.png)

## Шаблоны писем

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

### Доступные шаблоны

В системе предусмотрены шаблоны для следующих типов уведомлений:

- **Сброс пароля** — письмо со ссылкой для восстановления пароля.
- **Приглашение сотрудника** — письмо с приглашением нового сотрудника войти на платформу HUVIS через Smart-ID или Mobile-ID. Переменные: `[[WORKER_NAME]]`, `[[LINK]]`. Сброс пароля больше не используется, поэтому `[[RESET_LINK]]` в стандартном шаблоне отсутствует — если организация подключила парольный вход, его можно добавить вручную в редакторе шаблона.
- **Уведомления плательщика** — письма плательщикам об изменениях, счетах и т.д.
- **Закрытие курса** — уведомление о завершении курса.
- **Оплата счёта** — подтверждение оплаты или напоминание о задолженности.
- **Напоминание об оплате счёта** — настройка количества дней после срока для отправки напоминания.
- **Отчёт о генерации счетов** — автоматическое уведомление администраторам после генерации счетов с информацией о количестве и общей сумме.
- **Заявки на отпуск** — уведомления о поданных и согласованных заявках.
- **Изменения в расписании занятий** — уведомления об изменениях в расписании.

### Редактирование шаблона

1. Перейдите в раздел **Уведомления** > **Шаблоны**.
2. Выберите нужный шаблон из списка.
3. Отредактируйте текст шаблона. Используйте переменные (обозначены фигурными скобками) для подстановки данных: имя получателя, дата, ссылка и т.д.
4. Нажмите **Сохранить**.

![Шаблон сброса пароля](images/notifications/template_password_reset.png)

![Шаблон уведомления плательщика](images/notifications/template_payer_detail.png)

### Предварительный просмотр шаблона

1. Откройте нужный шаблон.
2. Нажмите кнопку **Предварительный просмотр**.
3. Система покажет, как будет выглядеть письмо для получателя.

![Предварительный просмотр шаблона](images/notifications/template_preview.png)

## Настройки SMTP

> **Настраивается системным администратором платформы** — обычному пользователю школы этот раздел не виден.
> Значения по умолчанию заполняются при установке.
> Имя отправителя по умолчанию: **Infosüsteem Huvis**.

1. Перейдите в раздел **Уведомления** > **Настройки**.
2. Откроется вкладка **SMTP** с параметрами сервера исходящей почты:
   - **SMTP хост** — адрес SMTP сервера (например, `smtp.gmail.com`).
   - **Порт** — порт подключения (обычно `587` для TLS или `465` для SSL).
   - **Имя пользователя** — логин на SMTP сервере.
   - **Пароль** — пароль на SMTP сервере. Оставьте поле пустым, чтобы сохранить ранее введённый пароль.
   - **Шифрование** — `TLS`, `SSL` или `Нет`.
   - **E-mail отправителя** — адрес, от имени которого отправляются письма.
   - **Имя отправителя** — имя, отображаемое у получателя.
3. Заполните все обязательные поля и нажмите **Сохранить**.

> Настройки SMTP применяются сразу к следующим исходящим письмам. Если SMTP не настроен,
> отправка писем не работает — система уведомит администратора.

![Настройки SMTP](images/notifications/smtp_settings.png)

## Полезные советы

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

# Конференции

# Видеоконференции

В данном разделе описана работа с видеоконференциями в системе HUVIS: создание конференций, подключение участников и просмотр записей.

## Обзор

Система HUVIS поддерживает проведение видеоконференций, интегрированных с учебным процессом. Конференции привязаны к курсам, что позволяет легко организовывать онлайн-занятия для учащихся.

Видеоконференции обеспечивают:

- Проведение онлайн-уроков в реальном времени.
- Демонстрацию экрана и презентаций.
- Общение через аудио, видео и текстовый чат.
- Запись занятий для последующего просмотра.

## Список конференций

1. Перейдите в раздел **Конференции** в главном меню.
2. На экране отобразится список всех конференций с указанием названия, курса, даты и статуса.

![Список конференций](images/conference/conference_page.png)

## Создание конференции

1. Нажмите кнопку **Создать конференцию**.
2. Заполните форму:
   - **Название** — введите название конференции (например, «Онлайн-урок по математике»).
   - **Курс** — выберите курс, к которому привязана конференция. Участники курса автоматически получат доступ.
   - **Дата и время** — укажите дату и время начала конференции.
   - **Длительность** — укажите планируемую длительность (при необходимости).
3. Нажмите **Сохранить**.

После сохранения конференция появится в списке.

![Детали конференции](images/conference/conference_page_2.png)

## Подключение к конференции

### Для преподавателя

1. Откройте нужную конференцию из списка.
2. Нажмите кнопку **Присоединиться** (или **Начать конференцию**).
3. Система откроет окно видеоконференции в браузере.
4. Разрешите доступ к камере и микрофону при первом подключении.

### Для учащегося

1. Учащийся входит в свой личный кабинет (портал учащегося).
2. В разделе курса отображается доступная конференция.
3. Учащийся нажимает кнопку **Присоединиться**.
4. Откроется окно видеоконференции в браузере.

> Учащиеся могут подключиться к конференции только в назначенное время. До начала конференции кнопка подключения будет неактивна.

## Записи конференций

После завершения конференции запись становится доступной для просмотра.

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

> Записи доступны как преподавателям, так и учащимся данного курса.

## Полезные советы

- Проверьте работу камеры и микрофона заранее, до начала конференции.
- Для стабильной работы рекомендуется использовать проводное интернет-соединение.
- Сообщите учащимся о предстоящей конференции заблаговременно через систему уведомлений.
- Если учащийся не может подключиться, убедитесь, что он зачислен на соответствующий курс.
- Записи конференций сохраняются автоматически и доступны после завершения.

# Чат

# Чат

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

## Открытие чата

1. Нажмите на иконку чата в боковом меню слева.
2. Откроется страница чата со списком всех ваших переписок.
3. Слева отображается список диалогов, справа -- окно текущей переписки.

![Страница чата](images/chat/chat_page.png)

## Личные сообщения

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

1. На странице чата нажмите кнопку **Новое сообщение** (иконка карандаша или "+").
2. Начните вводить имя получателя в поле поиска.
3. Выберите нужного пользователя из выпадающего списка.
4. Напишите текст сообщения в поле ввода внизу экрана.
5. Нажмите кнопку **Отправить** или клавишу Enter.

Диалог появится в списке слева. Новые непрочитанные сообщения отмечаются счётчиком.

## Групповые чаты

Групповой чат позволяет общаться сразу с несколькими участниками.

1. Нажмите кнопку **Новый групповой чат**.
2. Введите название группы.
3. Добавьте участников, выбирая их из списка.
4. Нажмите **Создать**.

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

### Управление группой

- Чтобы добавить нового участника, откройте настройки группы (иконка шестерёнки) и выберите **Добавить участника**.
- Чтобы покинуть группу, нажмите **Покинуть чат** в настройках группы.

## Отправка сообщений и файлов

![Чат с сообщениями](images/chat/chat_page_2.png)

### Текстовые сообщения

1. Выберите нужный диалог в списке слева.
2. Введите текст в поле ввода внизу.
3. Нажмите **Отправить** или клавишу Enter.

### Отправка файлов

1. Нажмите иконку скрепки (прикрепить файл) рядом с полем ввода.
2. Выберите файл на вашем компьютере.
3. Файл будет прикреплён к сообщению. Добавьте комментарий при необходимости.
4. Нажмите **Отправить**.

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

### Реакции на сообщения

1. Наведите курсор на сообщение.
2. Нажмите на появившуюся иконку смайлика.
3. Выберите нужную реакцию из списка.

Реакция появится под сообщением. Другие участники могут добавить свои реакции.

## Видеозвонки из чата (Jitsi)

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

1. Откройте нужный диалог (личный или групповой).
2. Нажмите иконку видеокамеры в верхней части окна чата.
3. Система создаст видеоконференцию через Jitsi.
4. Откроется новая вкладка браузера с видеозвонком.
5. Собеседник (или участники группы) получат уведомление и ссылку для подключения.

### Во время видеозвонка

- Вы можете включать и выключать камеру и микрофон.
- Доступна функция демонстрации экрана.
- Чтобы завершить звонок, нажмите красную кнопку завершения вызова.

## Полезные советы

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

# Отчёты

# Отчёты

Раздел отчётов позволяет формировать сводные данные по плательщикам, ученикам, посещаемости, урокам и счетам. Все отчёты поддерживают фильтрацию и экспорт.

## Отчёт по плательщикам

![Отчёт по плательщикам](images/reports/payers_report.png)

Этот отчёт показывает список плательщиков с информацией о них.

1. Перейдите в раздел **Отчёты** в боковом меню.
2. Выберите **Отчёт по плательщикам**.
3. Используйте фильтры для уточнения выборки:
   - Период (дата начала и окончания)
   - Организация
   - Статус плательщика
4. Нажмите **Сформировать** для построения отчёта.
5. Для экспорта нажмите кнопку **Экспорт** и выберите формат (Excel).

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

## Отчёт по ученикам

![Отчёт по ученикам](images/reports/students_report.png)

Отчёт содержит демографические и учебные данные по ученикам.

1. Перейдите в **Отчёты** и выберите **Отчёт по ученикам**.
2. Настройте фильтры:
   - Учебный год
   - Курс или группа
   - Возрастная категория
   - Пол
   - Статус ученика
3. Нажмите **Сформировать**.
4. Для экспорта данных нажмите **Экспорт**.

В отчёте видны: ФИО ученика, дата рождения, возраст, контактные данные, привязанные курсы.

## Отчёт по выполнению посещаемости

![Отчёт по посещаемости](images/reports/attendance_report.png)

Показывает статистику заполнения журнала посещаемости преподавателями.

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

В таблице отображаются:
- Название курса
- Преподаватель
- Количество проведённых уроков
- Количество уроков с заполненной посещаемостью
- Процент заполнения

## Отчёт по изменениям уроков

![Отчёт по изменениям уроков](images/reports/lesson_changes_report.png)

Этот отчёт фиксирует все изменения в расписании уроков: переносы, отмены, замены преподавателей.

1. Перейдите в **Отчёты** и выберите **Изменения уроков**.
2. Укажите период.
3. При необходимости отфильтруйте по курсу или преподавателю.
4. Нажмите **Сформировать**.

В отчёте видно:
- Дата и время исходного урока
- Тип изменения (перенос, отмена, замена)
- Кто внёс изменение
- Дата изменения

## Отчёт по счетам

![Отчёт по счетам](images/reports/invoice_report.png)

Сводный отчёт по выставленным и оплаченным счетам.

1. Перейдите в **Отчёты** и выберите **Отчёт по счетам**.
2. Настройте фильтры:
   - Период выставления
   - Статус счёта (выставлен, оплачен, просрочен, отменён)
   - Организация
   - Плательщик
3. Нажмите **Сформировать**.
4. Для экспорта нажмите **Экспорт**.

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

## Общие возможности отчётов

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

# Настройки

# Настройки системы

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

## Роли и права доступа

Роли определяют, какие действия может выполнять сотрудник в системе.

### Просмотр списка ролей

1. Перейдите в **Настройки** в боковом меню.
2. Выберите раздел **Роли**.
3. Откроется список всех созданных ролей.

![Список ролей](images/settings/roles_list.png)

### Создание новой роли

1. На странице списка ролей нажмите **Добавить роль**.
2. Введите название роли.
3. Нажмите **Сохранить**.

### Настройка прав доступа

![Редактирование роли](images/settings/role_edit.png)

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

![Группы прав](images/settings/permission_groups.png)

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

## Организации

Организации -- это учебные учреждения или подразделения, работающие в системе.

### Список организаций

![Список организаций](images/settings/organizations_list.png)

1. Перейдите в **Настройки** и выберите **Организации**.
2. В таблице отображаются все организации с их основными данными.

### Создание организации

![Форма создания организации](images/settings/organization_form.png)

1. Нажмите **Добавить организацию**.
2. Заполните обязательные поля:
   - Название организации
   - Регистрационный код
   - Контактные данные
3. Заполните реквизиты для счетов (при необходимости):
   - Расчётный счёт
   - Номер KMKR (VAT)
4. **Платёжный шлюз** (настраивается администратором платформы):
   - Платёжный провайдер (Montonio / Everpay)
   - API ключ, API URL, Секретный API ключ
5. Нажмите **Сохранить**.

> **Важно:** Настройки платёжного шлюза необходимы для работы банковских ссылок в счетах и онлайн-оплаты.

### Модули организации

![Управление модулями](images/settings/modules_page.png)

Модули определяют, какие функции доступны для конкретной организации.

1. Откройте карточку организации.
2. Перейдите на вкладку **Модули**.
3. Включите или выключите нужные модули (счета, чат, расписание и т.д.).
4. Нажмите **Сохранить**.

## Адреса

![Список адресов](images/settings/address_list.png)

Справочник адресов используется при заполнении данных организаций и учеников.

1. Перейдите в **Настройки** и выберите **Адреса**.
2. Для добавления нажмите **Добавить адрес**.
3. Заполните поля: улица, дом, город, почтовый индекс.
4. Нажмите **Сохранить**.

## Адреса

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

1. Перейдите в **Настройки → Адреса** (`/setting/address`).
2. Нажмите **Создать**.
3. Заполните название адреса (например, «Pärnu mnt 10, Tallinn»).
4. Нажмите **Сохранить**.

Право на просмотр/редактирование адресов общее с кабинетами (`room.view` / `room.edit` / `room.delete`) — отдельных прав для адресов нет.

## Кабинеты (помещения)

Справочник кабинетов используется при составлении расписания.

1. Сначала создайте **Адрес** (см. выше), иначе при создании кабинета поле «Адрес» будет пустым.
2. Перейдите в **Настройки → Кабинеты** (`/setting/room`).
3. Нажмите **Создать**.
4. Укажите номер кабинета и выберите адрес из списка.
5. При необходимости отметьте «Скрыть» — кабинет не будет показываться в визарде курса.
6. Нажмите **Сохранить**.

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

> Без хотя бы одного кабинета визард создания курса (`Step 2: Расписание`) покажет пустой grid и предложит открыть настройки кабинетов — клик по таймлайну не сработает, пока кабинетов нет.

## Школьные классы (ступени обучения)

Справочник «Школьные классы» — это **уровни обучения** (1-й класс, 5-й класс и т. п.), используется в модуле Curriculum (учебные программы). **Не путать** с классом-кабинетом: кабинет = помещение, школьный класс = уровень.

1. Перейдите в **Настройки → Школьные классы** (`/settings/school-classes`).
2. Нажмите **Создать**.
3. Заполните:
   - **Название** — например, «1. klass», «5. klass».
   - **Код** — короткий идентификатор (`1`, `5`, `1A`).
4. Нажмите **Сохранить**.

Права: `school_class.view` / `school_class.edit` / `school_class.delete`.

## Школа и класс ученика

Система позволяет указать школу и класс ученика. Эти данные заполняются при регистрации и могут быть изменены администратором.

### Где отображается

- **Форма регистрации** — заполняется плательщиком/студентом при подаче заявления
- **Карточка заявления** (вкладка «Данные») — редактируется администратором
- **Карточка ученика** — редактируется администратором
- **Портал плательщика** — отображается в данных ребёнка

### Настройка видимости полей

Поля школы и класса можно включить или скрыть для формы регистрации:

1. Перейдите в **Kursuse seaded** (Настройки курсов).
2. Откройте вкладку **Registreerimisvormi väljad** (Поля формы регистрации).
3. Для каждого поля (`Kool` — школа, `Klass` — класс) выберите:
   - **Видимо** — поле отображается в форме
   - **Обязательное** — поле обязательно для заполнения
   - **Скрыто** — поле не отображается
4. Нажмите **Сохранить**.

### Два режима ввода школы

#### Выбор из справочника (по умолчанию)

При вводе названия школы (минимум 2 символа) появляется выпадающий список с подсказками из справочника эстонских учебных заведений (EHIS, ~11 000 записей). Выберите нужную школу из списка.

В списке для каждой школы отображается:
- **Название** школы
- **Адрес** (мелким шрифтом)

#### Свободный ввод («Muu kool» / «Другая школа»)

Если нужной школы нет в справочнике:

1. Поставьте галочку **Muu kool** (Другая школа).
2. Введите название школы вручную в текстовое поле.
3. Нажмите **Сохранить**.

> **Примечание:** При свободном вводе сохраняется только текст названия, без привязки к справочнику.

### Редактирование школы на карточке заявления

1. Откройте заявление студента.
2. В разделе данных ученика найдите строку **Kool** (Школа).
3. Нажмите иконку карандаша справа.
4. Откроется редактор:
   - **Режим справочника** — начните вводить название и выберите из списка.
   - **Режим «Другая школа»** — поставьте галочку и введите текст.
5. Нажмите **Salvesta** (Сохранить).

Для редактирования поля **Klass** (Класс) процедура аналогична — нажмите карандаш и введите значение.

> **Требуется право:** `COURSE_APPLICATION_EDIT` для редактирования полей на карточке заявления.

## Скидки

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

1. Перейдите в **Настройки** и выберите **Скидки**.
2. Нажмите **Добавить скидку**.
3. Укажите:
   - Название скидки
   - Тип (процент или фиксированная сумма)
   - Значение скидки
   - Период действия (при необходимости)
4. Нажмите **Сохранить**.

## Типы отпусков

Типы отпусков используются при учёте отсутствия сотрудников.

1. Перейдите в **Настройки** и выберите **Типы отпусков**.
2. Нажмите **Добавить тип**.
3. Введите название типа отпуска.
4. Нажмите **Сохранить**.

## Настройки проекта

Общие настройки влияют на внешний вид и поведение системы.

1. Перейдите в **Настройки** и выберите **Проект**.
2. Здесь можно изменить:
   - **Логотип** -- загрузите изображение логотипа организации.
   - **Название проекта** -- отображается в заголовке системы.
   - **Контактные данные** -- email и телефон поддержки.
3. После внесения изменений нажмите **Сохранить**.

# Руководство для плательщика

# Портал плательщика

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

## Вход в систему

1. Откройте страницу входа для плательщиков.
2. Выберите способ входа:
   - **Smart ID** -- введите личный код и следуйте инструкциям на телефоне.
   - **Mobile ID** -- введите номер телефона и личный код, подтвердите на телефоне.
   - **Пароль** -- введите email и пароль.
3. После успешного входа вы попадёте на главную страницу портала.

## Главная страница (панель управления)

![Панель управления плательщика](images/payer/payer_dashboard.png)

На главной странице отображаются:
- Активные заявки и их статусы
- Последние счета
- Уведомления от администрации
- Быстрые ссылки на основные действия

## Подача заявки на курс

### Шаг 1: Начало подачи заявки

![Страница создания заявки](images/payer/payer_create_app.png)

1. Нажмите **Подать заявку** на главной странице или в меню.
2. Откроется форма создания заявки.

### Шаг 2: Выбор курса

![Курс выбран](images/payer/payer_course_selected.png)

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

### Шаг 3: Данные ученика

![Ученик выбран](images/payer/payer_student_selected.png)

1. Выберите ученика из списка уже добавленных детей или добавьте нового.
2. При добавлении нового ученика заполните:
   - Имя и фамилия
   - Личный код
   - Дата рождения 
   - Контактные данные
3. Убедитесь, что данные ученика заполнены корректно.

### Шаг 4: Подтверждение и согласия

![Галочки согласия](images/payer/payer_checkboxes.png)

1. Ознакомьтесь с условиями обучения.
2. Отметьте обязательные галочки:
   - **Согласие на обработку данных платформой HUVIS** — нажмите на ссылку «политика конфиденциальности» (открывается PDF), прочтите документ и поставьте галочку. Это **согласие с платформой**, на которой работает сайт школы, а не с самой школой.
   - Дополнительные согласия школы (правила учреждения, обработка данных школой) — если заданы администрацией.
3. Нажмите **Отправить заявку**.

### После подачи заявки

![После подачи заявки](images/payer/payer_after_submit.png)

После успешной подачи вы увидите подтверждение. Заявка появится в списке ваших заявок со статусом "На рассмотрении".

## Заполнение анкет

![Форма анкеты](images/payer/payer_questionnaire.png)

Некоторые курсы требуют заполнения дополнительных анкет.

1. Откройте заявку, к которой привязана анкета.
2. Нажмите на ссылку **Заполнить анкету**.
3. Ответьте на все обязательные вопросы (отмечены звёздочкой).
4. Нажмите **Сохранить**.

Анкета может содержать текстовые поля, выпадающие списки и вопросы с вариантами ответов. Некоторые поля могут содержать ссылки на документы (например, политика конфиденциальности) — нажмите на ссылку, чтобы ознакомиться.

## Просмотр заявок и статусов

1. Перейдите в раздел **Мои заявки**.
2. В таблице отображаются все ваши заявки с текущими статусами:
   - **На рассмотрении** -- заявка отправлена и ожидает решения.
   - **Одобрена** -- заявка принята, ученик зачислен.
   - **Отклонена** -- заявка не принята (указана причина).
   - **Подписана** -- договор подписан.
3. Нажмите на заявку для просмотра деталей.

## Подписание договора

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

1. В списке заявлений у неподписанных записей появляется баннер **Требуется подпись** и кнопка **Перейти к подписи**. Она же доступна на странице деталей заявления.
2. **Шаг 1 — Анкета и согласия.** Прочтите условия, отметьте обязательные галочки (обработка данных, правила учреждения) и сохраните.
3. **Шаг 2 — Подпись.** Подтвердите подпись через Smart ID или Mobile ID (вы получите запрос на телефон).
4. После успешной подписи статус заявления меняется на **Подписана** и в файлах появляется PDF договора.

> Подпись юридически значима. Если данные ученика указаны неверно, исправьте их **до** подписи — после подписи договор нельзя отредактировать, его можно только закрыть и оформить заново.

## Пробный урок

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

1. **Подтвердить** — выберите тариф из списка, нажмите **Подтвердить**. Заявка переходит в обычный статус, с этого момента начинается полноценное участие в курсе.
2. **Отказаться** — если после пробного урока вы решили не продолжать, нажмите **Отказаться**. Заявка закрывается.
   - Если школа настроила режим «бесплатно при продолжении» (`FREE_IF_STAYS`), то при отказе автоматически создаётся счёт за сам пробный урок. При подтверждении пробный урок остаётся бесплатным.

## Отправка сообщения учителю или администрации

Внутри школы есть встроенный канал связи по конкретной заявке — письма приходят на email учителю и/или администрации, с вашим email в поле «Ответить».

1. На странице деталей заявки нажмите **Написать сообщение**.
2. В открывшемся окне:
   - **Получатель** — выберите одного или нескольких из списка. В список попадают только учителя выбранного курса и email администрации школы (посторонние адреса добавить нельзя).
   - **Тема** — до 255 символов.
   - **Сообщение** — до 5000 символов.
   - **Вложения** — можно прикрепить до **3 файлов** (опционально).
3. Нажмите **Отправить**. Сообщение уходит в очередь рассылки; вы увидите подтверждение **«Сообщение отправлено!»**.

> Ответ от учителя/администрации придёт на ваш email, указанный в профиле плательщика.

## Перевод ребёнка на другой курс

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

1. На странице деталей подписанной заявки нажмите **Перевести на другой курс**.
2. Откроется форма перевода:
   - **Курс** — выберите новый курс из списка (показаны курсы текущего учебного года).
   - **Дата перевода** — по умолчанию «завтра». Нельзя выбрать дату в прошлом. После этой даты идёт первый урок на новом курсе; старая заявка закрывается днём раньше.
   - **Тариф** — выбирается из тарифов нового курса. Если тарифы не найдены, переключитесь на другой курс.
3. Под формой отображается предпросмотр: дата первого урока на новом курсе и пометка **«Нужен новый договор»**, если специализация или тариф меняются существенно.
4. Нажмите **Сохранить**:
   - **Без нового договора** — заявка просто перепривязывается к новому курсу.
   - **С новым договором** — старая заявка закрывается, создаётся новая со статусом **CREATED** и её нужно будет **подписать заново** (см. раздел «Подписание договора»). Активные скидки автоматически переносятся на новую заявку.
5. После успешного перевода вы возвращаетесь на страницу деталей заявления с сообщением об успехе.

> Если в процессе возникла ошибка — вы увидите сообщение «Ошибка обновления». Заявка остаётся без изменений, можно попробовать снова или связаться с администрацией через **Написать сообщение**.

## Завершение обучения (отчисление)

Если ребёнок больше не будет ходить на курс, оформите завершение, чтобы корректно остановить выставление счетов.

1. На странице деталей заявки нажмите **Завершить обучение**.
2. В открывшемся окне:
   - **Дата окончания** — дата, после которой ребёнок не посещает занятия. Нельзя указать дату раньше, чем позволяет школа (настраивается администрацией).
   - **Причина** — выберите из списка (переезд, смена интересов, финансы и т. п.).
   - **Комментарий** — необязательное пояснение.
3. Нажмите **Сохранить**. Заявка получает статус завершения, последний урок фиксируется, будущие счета больше не формируются.

### Отмена будущего завершения

Если завершение назначено на дату в будущем и вы передумали:

1. На странице деталей заявки нажмите **Остаться на курсе**.
2. Дата закрытия и запись о причине удаляются, заявка снова активна.

> Задним числом отменить завершение, если дата уже наступила, нельзя — обратитесь к администрации через **Написать сообщение**.

## Счета и оплата

1. Перейдите в раздел **Счета**.
2. В списке отображаются все выставленные счета.
3. Для каждого счёта видны: номер, сумма, срок оплаты, статус.
4. Нажмите на счёт для просмотра подробностей.
5. Для оплаты нажмите кнопку **Оплатить** -- вы будете перенаправлены на страницу оплаты.

Статусы счетов:
- **Выставлен** -- ожидает оплаты.
- **Оплачен** -- оплата получена.
- **Просрочен** -- срок оплаты истёк.

### Оплата по ссылке (без входа в систему)

При выставлении счёта вам на email приходит ссылка на страницу оплаты. Перейдя по ней, можно оплатить счёт **без входа в систему**:

1. Откройте ссылку из email.
2. На странице отображаются данные счёта: номер, сумма, реквизиты.
3. Нажмите **Оплатить** — вы будете перенаправлены в банк для завершения платежа.
4. При необходимости скачайте PDF счёта по кнопке на странице.

## Чат с администрацией

1. Нажмите на иконку чата в меню.
2. Выберите существующий диалог или начните новый.
3. Напишите сообщение и нажмите **Отправить**.

Через чат можно задать вопросы по расписанию, оплате и другим организационным вопросам.

# Руководство для студента

# Портал ученика

Портал ученика предоставляет доступ к расписанию, домашним заданиям, тестам и видеоконференциям.

## Вход в систему

1. Откройте страницу входа для учеников.
2. Выберите способ входа:
   - **Smart ID** -- введите личный код и подтвердите на телефоне.
   - **Mobile ID** -- введите номер телефона и личный код, подтвердите на телефоне.
   - **Пароль** -- введите email и пароль.
3. После входа вы попадёте на главную страницу портала.

## Главная страница

![Панель управления ученика](images/student/student_dashboard.png)

На главной странице отображаются:
- Ближайшие уроки с датой, временем и названием курса
- Невыполненные домашние задания
- Уведомления от преподавателей
- Предстоящие тесты

## Расписание и курсы

![Страница портала ученика](images/student/student_page_2.png)

1. Перейдите в раздел **Расписание** в меню.
2. Расписание отображается в виде календаря или списка.
3. Для каждого урока видны:
   - Дата и время
   - Название курса
   - Преподаватель
   - Аудитория (если указана)
4. Нажмите на урок для просмотра подробностей.

![Страница портала ученика](images/student/student_page_3.png)

### Просмотр курсов

1. Перейдите в раздел **Мои курсы**.
2. Откроется список курсов, на которые вы записаны.
3. Нажмите на курс для просмотра описания, расписания и материалов.

## Тесты и контрольные

### Список доступных тестов

![Список тестов](images/student/student_quiz_list.png)

1. Перейдите в раздел **Тесты**.
2. В списке видны доступные тесты с указанием курса, даты и времени.
3. Тесты с ограничением по времени помечены соответствующей иконкой.

### Прохождение теста

![Начало теста](images/student/student_quiz_start.png)

1. Нажмите на тест в списке.
2. Ознакомьтесь с информацией: количество вопросов, ограничение по времени, количество попыток.
3. Нажмите **Начать тест**.
4. Отвечайте на вопросы последовательно. Типы вопросов:
   - Один правильный ответ (выбор из вариантов)
   - Несколько правильных ответов (отметьте все подходящие)
   - Свободный ответ (введите текст)
5. После ответа на все вопросы нажмите **Завершить тест**.

### Результаты тестов

![Результаты теста](images/student/student_quiz_results.png)

1. После завершения теста отображаются результаты:
   - Количество правильных ответов
   - Набранные баллы
   - Процент выполнения
2. При наличии нескольких попыток показывается лучший результат.

### История попыток

![История попыток](images/student/student_attempts.png)

1. Перейдите в раздел **Мои попытки** внутри теста.
2. Отображается список всех попыток с датой и результатом.
3. Нажмите на попытку для просмотра ответов (если преподаватель разрешил).

## Домашние задания

![Страница портала ученика](images/student/student_page_4.png)

1. Перейдите в раздел **Домашние задания** или откройте задание из панели на главной странице.
2. Прочитайте описание задания и требования.
3. Подготовьте ответ:
   - Введите текст в поле ответа.
   - Прикрепите файл, нажав кнопку **Прикрепить файл**.
4. Нажмите **Отправить**.

Статусы домашних заданий:
- **Не выполнено** -- задание ещё не сдано.
- **На проверке** -- задание отправлено и ожидает проверки.
- **Проверено** -- преподаватель проверил работу (может быть оценка и комментарий).

## Видеоконференции

Для участия в онлайн-уроках используются видеоконференции.

1. Найдите урок с пометкой видеоконференции в расписании.
2. Нажмите кнопку **Присоединиться** (доступна за несколько минут до начала урока).
3. Откроется новая вкладка с видеоконференцией.
4. Разрешите доступ к камере и микрофону в браузере.
5. Для завершения нажмите красную кнопку выхода.

## Чат

1. Нажмите на иконку чата в меню.
2. Вы можете написать преподавателю или администрации.
3. Выберите получателя и введите сообщение.
4. Нажмите **Отправить**.

Через чат можно задавать вопросы по урокам, заданиям и организационным моментам.

# Глобальный поиск

# Глобальный поиск

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

## Как пользоваться

1. Нажмите на пункт **Поиск** в боковом меню.
2. Откроется модальное окно поиска.
3. Начните вводить запрос — например, имя студента, название курса или номер счёта.
4. Результаты появятся автоматически по мере ввода.
5. Нажмите на нужный результат, чтобы перейти к нему.

![Окно поиска](images/getting-started/search_page.png)

![Результаты поиска](images/getting-started/search_results.png)

## Что можно найти

Поиск работает по нескольким разделам одновременно:

| Тип | Что ищется |
|-----|-----------|
| Заявления | По имени плательщика или студента |
| Студенты | По имени, личному коду |
| Работники | По имени, личному коду |
| Курсы | По названию курса |

## Фильтр по учебному году

Результаты поиска ограничены **текущим учебным годом**, выбранным в верхней панели. Чтобы найти данные за другой год, сначала переключите учебный год.

## Организация

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

> **Совет:** Поиск доступен только пользователям с ролью Manager.

# Автоматизация

# Автоматизация заявлений

Раздел **Курсы → Настройки → Автоматизация** позволяет автоматизировать три ключевых процесса работы с заявлениями:

1. **Автоотправка** — автоматическая отправка заявлений на подпись
2. **Напоминания** — отправка напоминаний о неподписанных заявлениях (email или SMS)
3. **Автоаннулирование** — автоматическое аннулирование заявлений, которые не были подписаны в срок

> **Примечание:** Автоматизация работает независимо для каждой организации. Настройки одной организации не влияют на другие.

---

## Как открыть настройки автоматизации

1. Перейдите в **Курсы → Настройки** в боковом меню.
2. Выберите вкладку **Автоматизация** в панели навигации.

> **Право доступа:** Для просмотра требуется право `course.setting.view`, для изменения — `course.setting.edit`.

---

## Автоотправка

Автоотправка автоматически отправляет заявления на подпись плательщику после настраиваемой задержки.

### Как это работает

Когда студент (или администратор) создаёт заявление на курс, оно получает статус **Создано**. Без автоматизации администратор должен вручную нажать «Отправить» для каждого заявления. Автоотправка делает это автоматически.

**Процесс:**
1. Заявление создаётся → статус **Создано**
2. Проходит указанное количество дней
3. Система автоматически:
   - Генерирует PDF-документ заявления (по шаблону курса)
   - Меняет статус на **Отправлено**
   - Отправляет уведомление плательщику (по шаблону уведомления курса)

### Настройка

1. Включите переключатель **«Автоотправка включена»**.
2. Укажите **задержку в днях** — сколько дней ждать после создания заявления перед автоматической отправкой.
3. Нажмите **Сохранить**.

| Значение задержки | Поведение |
|:-----------------:|-----------|
| **0** | Заявление отправляется при ближайшей обработке (в течение часа после создания) |
| **1** | Отправка через 1 день после создания |
| **3** | Отправка через 3 дня после создания |

> **Важно:** Для корректной работы автоотправки на курсе должен быть настроен **шаблон заявления** (вкладка «Шаблон» на странице курса). Если шаблон отсутствует, автоотправка для этого курса будет пропущена с записью в лог.

### Когда автоотправка НЕ сработает

- У заявления уже другой статус (не «Создано») — например, администратор вручную отправил его раньше
- Для курса не настроен шаблон заявления
- Произошла ошибка генерации PDF (записывается в лог)

---

## Напоминания

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

### Как это работает

1. Заявление отправлено → статус **Отправлено**
2. Проходит указанное количество дней (от даты отправки)
3. Система отправляет напоминание по выбранному каналу (email или SMS)
4. Каждое конкретное напоминание отправляется **один раз** для каждого заявления

### Пример сценария

Вы настроили три напоминания:

| Напоминание | Дней после отправки | Канал |
|:-----------:|:-------------------:|:-----:|
| 1 | 3 | Email |
| 2 | 7 | Email |
| 3 | 10 | SMS |

**Что произойдёт:**
- **День 3:** Плательщик получает email-напоминание
- **День 7:** Второе email-напоминание
- **День 10:** SMS-напоминание
- Если плательщик подписал заявление на **день 5** — второе и третье напоминания НЕ будут отправлены (статус изменился)

### Настройка напоминания

1. Нажмите кнопку **«Добавить напоминание»**.
2. Заполните поля:

| Поле | Описание |
|------|----------|
| **Дней после отправки** | Через сколько дней после отправки заявления сработает напоминание (минимум 1) |
| **Канал** | Способ доставки: **Email** или **SMS** |
| **Тема** (только email) | Тема письма на каждом языке системы (эстонский, русский) |
| **Содержание** | Текст напоминания на каждом языке. Поддерживает переменные `[[KEY]]` |

3. Нажмите **Сохранить**.

### Удаление напоминания

- Нажмите кнопку **«Удалить»** рядом с напоминанием.
- Напоминание будет деактивировано. Уже отправленные напоминания не отзываются.

### Переменные для шаблонов

В тексте напоминания (и в теме email) можно использовать переменные в двойных квадратных скобках. Они будут автоматически заменены реальными данными при отправке.

| Переменная | Описание | Пример значения |
|------------|----------|:---------------:|
| `[[STUDENT_FIRST_NAME]]` | Имя ученика | Мария |
| `[[STUDENT_LAST_NAME]]` | Фамилия ученика | Иванова |
| `[[PARENT_FIRST_NAME]]` | Имя плательщика | Иван |
| `[[PARENT_LAST_NAME]]` | Фамилия плательщика | Иванов |
| `[[COURSE_NAME]]` | Название курса | Математика — гр. А |
| `[[APPLICATION_DATE]]` | Дата создания заявления | 15.03.2026 |
| `[[CANCELLATION_DATE]]` | Дата автоаннулирования | 29.03.2026 |

> **Регистр не важен:** `[[STUDENT_FIRST_NAME]]` и `[[student_first_name]]` работают одинаково.

> **CANCELLATION_DATE:** Рассчитывается как дата отправки + дни до автоаннулирования. Если автоаннулирование выключено — будет пустой строкой.

### Пример текста напоминания

**Эстонский:**
```
Lugupeetud [[PARENT_FIRST_NAME]] [[PARENT_LAST_NAME]],

tuletame meelde, et õpilase [[STUDENT_FIRST_NAME]] [[STUDENT_LAST_NAME]]
avaldus kursusele [[COURSE_NAME]] ootab allkirjastamist.

Avaldus loodi [[APPLICATION_DATE]].
Palun allkirjastage enne [[CANCELLATION_DATE]], vastasel juhul avaldus tühistatakse.
```

**Русский:**
```
Уважаемый(ая) [[PARENT_FIRST_NAME]] [[PARENT_LAST_NAME]],

напоминаем, что заявление ученика [[STUDENT_FIRST_NAME]] [[STUDENT_LAST_NAME]]
на курс [[COURSE_NAME]] ожидает подписания.

Заявление создано [[APPLICATION_DATE]].
Пожалуйста, подпишите до [[CANCELLATION_DATE]], иначе заявление будет аннулировано.
```

### Особенности каналов

#### Email
- Получатель: email плательщика (из профиля Party или из записи Payer)
- Если email не указан — напоминание пропускается
- Тема обязательна для каждого языка

#### SMS
- Получатель: телефон плательщика → если нет, телефон студента
- Если телефон не указан — напоминание пропускается
- **Лимит символов:**
  - Латиница: 160 символов = 1 SMS
  - Кириллица: 70 символов = 1 SMS
  - При превышении лимита сообщение разбивается на несколько SMS
- Счётчик символов показывается под полем текста в реальном времени
- Тема (subject) не используется для SMS

### Язык напоминания

Язык текста определяется по полю `lang` плательщика. Если язык не задан — используется язык системы по умолчанию. Поэтому важно заполнять текст напоминания **на всех доступных языках**.

---

## Автоаннулирование

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

### Как это работает

1. Заявление в статусе **Отправлено**
2. Проходит указанное количество дней (от даты отправки)
3. Система автоматически:
   - Меняет статус на **Аннулировано**
   - Отправляет уведомление плательщику по **стандартному шаблону аннулирования** (из настроек курса)

### Настройка

1. Включите переключатель **«Автоаннулирование включено»**.
2. Укажите **количество дней после отправки** — через сколько дней после отправки заявления оно будет аннулировано (минимум 1).
3. Нажмите **Сохранить**.

| Значение | Поведение |
|:--------:|-----------|
| **7** | Аннулирование через 7 дней после отправки |
| **14** | Аннулирование через 14 дней (по умолчанию) |
| **30** | Аннулирование через 30 дней |

> **Важно:** Уведомление при аннулировании отправляется по **стандартному шаблону аннулирования**, настроенному в **Курсы → [Курс] → вкладка «Шаблон»** (шаблон для статуса «Аннулировано»). Текст из напоминаний НЕ используется.

### Взаимодействие с напоминаниями

Автоаннулирование и напоминания работают независимо. Рекомендуемая настройка — напоминания должны быть **раньше** аннулирования:

| Действие | Дней после отправки |
|----------|:-------------------:|
| 1-е напоминание (email) | 3 |
| 2-е напоминание (email) | 7 |
| 3-е напоминание (SMS) | 10 |
| Автоаннулирование | 14 |

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

---

## Расписание обработки

Автоматизация обрабатывается **каждый час**. Это означает:

- После создания заявления может пройти до 1 часа до автоотправки (при задержке 0 дней)
- Напоминания и аннулирование проверяются ежечасно
- Все действия выполняются **один раз** — повторная обработка не создаёт дубликатов

> **Техническая деталь:** Команда `automation:process-applications` запускается каждый час с защитой от параллельного запуска (withoutOverlapping). Время обработки зависит от количества организаций и заявлений.

---

## Логи и мониторинг

Все действия автоматизации записываются в **Настройки → Логи**. Вы можете отслеживать:

- **Успешные отправки:** запись с типом `AUTOMATION_AUTO_SEND`
- **Отправленные напоминания:** запись с типом `AUTOMATION_REMINDER`
- **Аннулирования:** запись с типом `AUTOMATION_AUTO_CANCEL`
- **Ошибки:** запись с типом `AUTOMATION_FAILED` — содержит описание ошибки

При возникновении проблем (например, не отправляются напоминания) проверьте логи на наличие записей `AUTOMATION_FAILED`.

### Типичные причины ошибок

| Ошибка | Причина | Решение |
|--------|---------|---------|
| `template missing` | Для курса не настроен шаблон заявления | Перейдите в Курсы → [Курс] → Шаблон и выберите шаблон |
| `PDF generation failed` | Ошибка генерации документа | Проверьте корректность шаблона (.docx) |
| `payer notification failed` | Ошибка отправки email | Проверьте email плательщика и настройки почтового сервера |
| `not found or status changed` | Заявление было обработано вручную до срабатывания автоматизации | Нормальная ситуация, не требует действий |

---

## Рекомендации по настройке

### Базовая настройка

Для большинства организаций рекомендуется:

1. **Автоотправка:** включена, задержка **0 дней** (мгновенная отправка)
2. **Напоминание 1:** email через **3 дня** после отправки
3. **Напоминание 2:** email через **7 дней** после отправки
4. **Напоминание 3:** SMS через **12 дней** после отправки
5. **Автоаннулирование:** включено, через **14 дней** после отправки

### С задержкой для проверки

Если администратор хочет проверять заявления перед отправкой:

1. **Автоотправка:** включена, задержка **1 день** (даёт время на проверку)
2. **Напоминания и аннулирование:** как в базовой настройке

### Только напоминания (без автоотправки)

Если отправка должна оставаться ручной:

1. **Автоотправка:** выключена
2. **Напоминания:** настроены (работают для вручную отправленных заявлений)
3. **Автоаннулирование:** по желанию

---

## Часто задаваемые вопросы

### Что произойдёт, если я включу автоотправку — старые заявления тоже отправятся?

Да. При ближайшем запуске обработки все заявления в статусе «Создано», чей возраст превышает задержку, будут отправлены. Если вы не хотите отправлять старые заявления — сначала обработайте их вручную.

### Можно ли отправить напоминание одновременно и по email, и по SMS?

Да. Создайте два правила напоминания с одинаковой задержкой, но разными каналами.

### Что произойдёт, если плательщик подпишет заявление между напоминаниями?

Напоминание не будет отправлено, т.к. статус заявления изменится с «Отправлено» на «Подписано». Система проверяет статус при каждом запуске.

### Можно ли отменить автоаннулирование для конкретного заявления?

Нет специального механизма отмены. Но если администратор вручную изменит статус заявления (например, закроет его) до срабатывания аннулирования — автоаннулирование не произойдёт.

### Как часто проверяется автоматизация?

Каждый час. Точное время зависит от настройки планировщика Laravel.

### Переменная [[CANCELLATION_DATE]] показывает пустое значение — почему?

Убедитесь, что **автоаннулирование включено** и указано количество дней. Дата аннулирования рассчитывается как: дата отправки + дни до аннулирования. Если автоаннулирование выключено, переменная будет пустой.

### Изменение настроек влияет на уже отправленные напоминания?

Нет. Уже отправленные напоминания и совершённые аннулирования не отзываются. Изменения влияют только на будущие действия.

# Ценообразование по интенсивности

# Ценообразование по интенсивности

Функция позволяет предлагать студентам разные цены в зависимости от количества занятий в неделю. Вместо создания отдельного курса для каждой интенсивности (1 раз, 2 раза, 3 раза в неделю), вы настраиваете цены на одном курсе.

---

## Как это работает

Администратор задаёт **месячную цену** для каждого варианта интенсивности. Система автоматически:

1. Рассчитывает цены для всех частот оплаты (квартал, полугодие, год)
2. Создаёт скрытые процентные скидки
3. Показывает студенту выбор интенсивности при регистрации
4. Применяет скидку автоматически при создании заявки

**Пример:**

Курс с занятиями 5 раз в неделю. Базовая месячная цена — 100 €.

| Интенсивность | Цена/месяц | Квартал | Полгода | Год |
|---------------|-----------|---------|---------|-----|
| 5x в неделю   | 100,00 €  | 270,00 € | 500,00 € | 900,00 € |
| 3x в неделю   | 60,00 €   | 162,00 € | 300,00 € | 540,00 € |
| 1x в неделю   | 20,00 €   | 54,00 €  | 100,00 € | 180,00 € |

Вы задаёте только столбец «Цена/месяц». Остальные столбцы рассчитываются автоматически.

---

## Предварительные условия

Для использования функции необходимо:

1. **Расписание курса задано** — система определяет максимальное количество дней в неделю из расписания
2. **Месячная цена задана** — в разделе «Цены» курса должна быть указана цена с частотой оплаты «Месяц»

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

---

## Настройка интенсивности на курсе

### Шаг 1. Откройте вкладку «Цены»

1. Перейдите в **Курсы → Специализации → выберите курс**.
2. Откройте вкладку **Цены**.
3. Найдите секцию **Интенсивность** (отображается под ценами).

### Шаг 2. Включите функцию

1. Установите галочку **«Разрешить выбор интенсивности»** (Luba intensiivsuse valik).
2. Появится таблица настройки.

### Шаг 3. Настройте параметры

**Минимальное количество раз в неделю** — выберите из выпадающего списка (1–6). Это минимальная интенсивность, которую может выбрать студент.

**Максимальное количество раз в неделю** — определяется автоматически из расписания курса (количество уникальных дней занятий). Изменить вручную нельзя.

> **Примечание:** Если у курса занятия в понедельник, среду и пятницу — максимум будет 3. При этом 2 урока в один день считаются как 1 день.

### Шаг 4. Задайте месячные цены

В таблице отображаются строки от минимальной до максимальной интенсивности:

| Интенсивность | Цена/месяц | Квартал | Полгода | Год |
|---------------|-----------|---------|---------|-----|
| 1x в неделю   | [ввести]  | авто    | авто    | авто |
| 2x в неделю   | [ввести]  | авто    | авто    | авто |
| 3x в неделю   | базовая   | авто    | авто    | авто |

- **Последняя строка** (максимальная интенсивность) — всегда равна базовой месячной цене. Не редактируется.
- **Остальные строки** — введите желаемую месячную цену.
- **Столбцы квартал/полгода/год** — рассчитываются автоматически и не редактируются.

### Кнопка «Рассчитать автоматически»

Заполняет цены пропорционально:

```
Цена за N раз в неделю = Базовая цена × N / Максимум
```

Пример для базовой цены 150 € и максимума 5:
- 1x: 150 × 1/5 = **30,00 €**
- 2x: 150 × 2/5 = **60,00 €**
- 3x: 150 × 3/5 = **90,00 €**
- 4x: 150 × 4/5 = **120,00 €**
- 5x: **150,00 €** (базовая)

Вы можете изменить авторассчитанные цены вручную перед сохранением.

### Шаг 5. Сохраните

Нажмите **Сохранить**. Система автоматически создаст скрытые скидки для каждого уровня интенсивности.

---

## Как рассчитываются цены для разных частот оплаты

Месячная цена задаётся вручную. Цены для квартала, полугодия и года рассчитываются через пропорцию:

```
Коэффициент = Месячная цена интенсивности / Базовая месячная цена
Цена за квартал = Базовая квартальная цена × Коэффициент
```

### Подробный пример

**Исходные данные:**
- Базовые цены курса (максимальная интенсивность 3x/нед):
  - Месяц: 65,00 €
  - Квартал: 180,00 €
  - Полгода: 350,00 €
  - Год: 650,00 €

**Настроенные месячные цены:**
- 1x/нед: 25,00 €
- 2x/нед: 45,00 €
- 3x/нед: 65,00 € (базовая)

**Расчёт для 1x в неделю:**
- Коэффициент: 25 / 65 = 0,3846
- Квартал: 180 × 0,3846 = **69,23 €**
- Полгода: 350 × 0,3846 = **134,62 €**
- Год: 650 × 0,3846 = **250,00 €**

**Расчёт для 2x в неделю:**
- Коэффициент: 45 / 65 = 0,6923
- Квартал: 180 × 0,6923 = **124,62 €**
- Полгода: 350 × 0,6923 = **242,31 €**
- Год: 650 × 0,6923 = **450,00 €**

**Итоговая таблица:**

| Интенсивность | Месяц | Квартал | Полгода | Год |
|---------------|-------|---------|---------|-----|
| 1x в неделю   | 25,00 € | 69,23 € | 134,62 € | 250,00 € |
| 2x в неделю   | 45,00 € | 124,62 € | 242,31 € | 450,00 € |
| 3x в неделю   | 65,00 € | 180,00 € | 350,00 € | 650,00 € |

> **Важно:** Скидка «чем дольше платишь — тем выгоднее» сохраняется для каждой интенсивности. Если квартал дешевле 3 месяцев по месячной цене, то и при меньшей интенсивности это соотношение сохранится.

---

## Отключение интенсивности

1. Откройте вкладку **Цены** курса.
2. Снимите галочку **«Разрешить выбор интенсивности»**.
3. Нажмите **Сохранить**.

При отключении все настройки интенсивности и связанные скидки удаляются. Существующие заявки с уже применёнными скидками **не затрагиваются** — скидки остаются до ручного удаления.

---

## Регистрация студента

### Публичная форма регистрации

Если на курсе включена интенсивность, на форме регистрации перед выбором частоты оплаты появляется вопрос:

**«Сколько раз в неделю?»**

Студент выбирает интенсивность (например, 2x в неделю), и цены в списке частот обновляются автоматически.

После отправки формы:
- Заявка создаётся с `sessions_per_week = 2`
- Скидка за интенсивность привязывается автоматически
- Счета генерируются с учётом скидки

### Создание заявки администратором

При создании заявки через административный интерфейс:

1. Выберите курс в форме создания заявки.
2. Если у курса включена интенсивность — появятся радио-кнопки выбора.
3. Выберите интенсивность.
4. Цены обновятся автоматически.
5. Сохраните заявку.

Скидка применяется автоматически.

---

## Просмотр интенсивности на заявке

На странице заявки в блоке цены отображается бейдж с выбранной интенсивностью:

```
📅 2x в неделю
```

Скидка за интенсивность видна в разделе **Скидки** заявки — она отображается как процентная скидка с названием вида «2x korda nädalas (Название курса)».

---

## Изменение интенсивности студента

Чтобы изменить интенсивность на существующей заявке:

1. Откройте заявку студента.
2. В разделе **Скидки** удалите текущую скидку за интенсивность.
3. Добавьте новую скидку за интенсивность (через «Tunni põhine soodustus» или вручную).

При удалении скидки за интенсивность значение `sessions_per_week` на заявке автоматически сбрасывается.

> **Примечание:** Будущие счета (статусы «Запланирован» и «Готов») пересчитываются автоматически при изменении скидок. Выставленные и оплаченные счета не затрагиваются.

---

## Взаимодействие с другими скидками

Скидка за интенсивность — это обычная процентная скидка. Она может сочетаться с другими скидками:

| Скидка | Тип | Пример |
|--------|-----|--------|
| Интенсивность | Процентная | -40% (3x вместо 5x) |
| Многодетная семья | Процентная | -10% |
| Разовая скидка | Фиксированная | -50 € |

Все процентные скидки суммируются, затем применяется фиксированная:

```
Итого = Базовая цена × (1 - 40% - 10%) - 50 € пропорционально
```

---

## Связь с пропорциональным расчётом (proration)

Если студент регистрируется в середине периода, **сначала** применяется скидка за интенсивность, а **затем** пропорция по урокам.

**Пример:**
- Квартальная цена (5x): 270,00 €
- Интенсивность 3x: скидка -40% → 162,00 €
- Студент пришёл, когда осталось 14 из 77 уроков: пропорция 18,18%
- Итого: 162,00 × 0,1818 = **29,45 €**

Подробнее о пропорциональном расчёте — см. раздел [«Пропорциональный расчёт»](https://docs.huvis.ee/link/144#пропорциональный-расчёт-proration).

---

## Часто задаваемые вопросы

### Почему секция интенсивности не отображается?

Проверьте:
1. У курса задано **расписание** (минимум один день)
2. Задана **месячная цена** (частота оплаты «Месяц»)

### Можно ли изменить максимальную интенсивность?

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

### Что произойдёт, если я изменю расписание после настройки интенсивности?

Максимальная интенсивность обновится при следующем открытии вкладки «Цены». Если максимум уменьшился, может потребоваться пересохранить настройки интенсивности.

### Студент уже зарегистрирован. Как изменить интенсивность?

Удалите текущую скидку за интенсивность на странице заявки и добавьте новую. Счета пересчитаются автоматически.

### Увидит ли студент скидку за интенсивность?

В портале плательщика скидка отображается как процентная скидка. Название скидки не отображается на счёте, если в настройках скидки не включено «Показывать название на счёте» (`display_name_on_invoice = false` по умолчанию).

# Пакетный биллинг

# Пакетный биллинг

Пакетный биллинг позволяет предлагать курсы с оплатой за пакет занятий (например, 10 уроков) вместо ежемесячной подписки. Подходит для коротких курсов (свадебный танец, мастер-классы и пр.).

---

## Типы биллинга курса

В настройках курса (вкладка «Цена») доступен выбор типа биллинга:

| Тип | Описание |
|-----|----------|
| **Подписка** (SUBSCRIPTION) | Стандартный ежемесячный биллинг. По умолчанию |
| **Пакет** (PACKAGE) | Только пакетные опции, подписка недоступна |
| **Смешанный** (MIXED) | Студент выбирает подписку или пакет при регистрации |

---

## Настройка пакетных опций

1. Откройте курс → вкладка **Цена**
2. Выберите тип биллинга **Пакет** или **Смешанный**
3. В разделе «Пакетные опции» добавьте варианты:
   - **Количество занятий** — сколько занятий входит в пакет
   - **Цена** — стоимость пакета
   - **Название** — отображаемое название (на каждом языке)
4. Опции можно сортировать перетаскиванием

---

## Настройки срока действия пакета

На вкладке «Цена» задайте срок действия пакета:

| Режим | Описание |
|-------|----------|
| **До конца курса** (COURSE_END) | Пакет действует до даты окончания курса |
| **Фиксированная дата** (FIXED_DATE) | Пакет действует до указанной даты |
| **Плавающий срок** (FLOATING_MONTHS) | Пакет действует N месяцев с момента покупки |

---

## Автоматическое закрытие

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

- Команда `package:close-exhausted` запускается ежедневно в 01:00
- Параметр `package_autoclose_days` задаёт дополнительный льготный период (в днях) после истечения пакета

---

## Регистрация студента

При регистрации на курс с типом **Пакет** или **Смешанный**:

1. Студент видит доступные пакетные опции (количество занятий и цену)
2. Выбирает подходящий пакет
3. После подтверждения заявления выставляется **один счёт** на полную стоимость пакета (без пропорционирования)

---

## Отслеживание прогресса

В карточке заявления отображается прогресс использования пакета:

- Всего занятий в пакете
- Посещённых занятий
- Оставшихся занятий
- Срок действия пакета

# Главная книга

# Главная книга (Pearaamat)

Раздел бухгалтерского учёта для отслеживания финансовых операций организации.

## Где найти

В боковом меню: **Pearaamat** (иконка книги). Доступен пользователям с правом `gl.view`.

---

## План счетов

**Путь:** Pearaamat > План счетов

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

### Что видите

1. **Таблица счетов** — код, название, тип, нормальная сторона (дебет/кредит), системный или нет, активен.
2. **Таблица маппингов** — привязка операций к конкретным счетам.

### Как добавить счёт

1. Нажмите **+ Uus** (Новый).
2. Заполните:
   - **Код** — уникальный номер (например, 4215 для нового счёта расходов).
   - **Тип** — ASSET (актив), LIABILITY (обязательство), REVENUE (доход), EXPENSE (расход), EQUITY (капитал).
   - **Название** — на эстонском, русском, английском.
3. Нажмите **Salvestan** (Сохранить).

### Типы счетов — что означают

| Тип | Что это | Примеры |
|-----|---------|---------|
| **ASSET** | То, чем вы владеете | Банковский счёт, касса, дебиторка |
| **LIABILITY** | То, что вы должны | Предоплаты клиентов, кредиты |
| **REVENUE** | Заработанное | Доход от обучения, от пакетов |
| **EXPENSE** | Потраченное | Списанные долги |
| **EQUITY** | Собственный капитал | Начальный капитал |

### Как изменить маппинг

Маппинг определяет, на какой счёт записывается каждая операция.

1. В таблице **Маппинги** найдите нужную строку (например, `revenue.tuition`).
2. В выпадающем списке выберите другой бухгалтерский счёт.
3. Изменение применяется мгновенно.

**Пример:** Если вы хотите разделить доход от подписок и от пакетов — создайте два разных счёта (3060 и 3061) и привяжите их к `revenue.tuition` и `revenue.package`.

### Системные счета

Счета, отмеченные как **системные** (бейдж «Süsteemne»):
- Нельзя удалить
- Нельзя изменить код или тип
- Можно только переименовать

---

## Отчёты

### Пробный баланс

**Путь:** Pearaamat > Пробный баланс

Показывает сальдо по **всем** счетам на выбранную дату.

- **Зелёный бейдж «Balanced»** — дебеты равны кредитам (всё в порядке).
- **Красный бейдж «Unbalanced»** — есть расхождение (нужно проверить).

**Колонки:**
| Колонка | Описание |
|---------|----------|
| Код | Номер счёта |
| Название | Название счёта |
| Тип | ASSET/LIABILITY/... |
| Дебет | Сумма всех дебетовых проводок |
| Кредит | Сумма всех кредитовых проводок |
| Сальдо дебет | Если дебет > кредит |
| Сальдо кредит | Если кредит > дебет |

### Баланс

**Путь:** Pearaamat > Баланс

Финансовое положение организации на дату:
- **Левая колонка**: Активы (что имеете)
- **Правая колонка**: Обязательства + Капитал (откуда деньги)
- Активы **всегда должны** равняться Обязательства + Капитал

### Отчёт о прибылях и убытках

**Путь:** Pearaamat > Отчёт о прибылях

За выбранный период показывает:
- **Доходы** (зелёным) — сколько заработали
- **Расходы** (красным) — сколько потратили
- **Чистая прибыль** — доходы минус расходы

### Выписка по счёту

**Путь:** Pearaamat > Выписка по счёту

Детальная история одного бухгалтерского счёта:

1. Выберите счёт из выпадающего списка.
2. Укажите период (от — до).
3. Таблица покажет каждую проводку: дата, описание, дебет, кредит, нарастающий остаток.

**Пример использования:** Выберите счёт 1200 (Дебиторка) чтобы увидеть все выставленные счета и полученные платежи.

---

## Примеры из жизни

### Пример 1: Обычный цикл

1. **Создаётся счёт** №2026-0001 на 89.00 € → проводка: Дебиторка +89€, Доход +89€
2. **Клиент оплачивает** через Montonio → проводка: Банк Montonio +89€, Дебиторка -89€
3. Результат: на счёте дебиторки — 0, на банке — +89€, доход — +89€

### Пример 2: Отмена и кредит

1. **Счёт** №2026-0001 на 89.00 € — выставлен и оплачен.
2. **Отмена** → кредитарве KA-2026-0002. Проводка: Доход -89€, Предоплата +89€.
3. **Новый счёт** №2026-0003 на 45.00 € (со скидкой). Проводка: Дебиторка +45€, Доход +45€.
4. **Зачёт предоплаты**: 45€ из предоплаты → Дебиторка -45€. Остаток предоплаты: 44€.
5. Итог: клиенту не нужно платить, у него ещё 44€ в кредите.

### Пример 3: Списание безнадёжного долга

1. **Счёт** №2026-0010 на 120.00 € — выставлен, не оплачен, просрочен.
2. **Администратор списывает** долг → проводка: Расход по безнадёжным +120€, Дебиторка -120€.
3. Результат: долг закрыт, но отражён как расход.

---

## FAQ

### Обязательно ли настраивать главную книгу?

Нет. Биллинг работает без GL. Счета выставляются, оплаты принимаются, отмены работают. GL только добавляет бухгалтерскую детализацию.

### Что будет если GL проводка не создастся?

Ничего страшного. Счёт/оплата/отмена всё равно выполнится. Ошибка GL записывается в лог для проверки.

### Могу ли я изменить план счетов позже?

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

---

## Учёт расходов (Kulud)

**Путь:** Pearaamat > Kulud

Здесь фиксируются расходы организации: аренда, коммунальные услуги, покупка инструментов и т.д.

### Как добавить расход

1. Нажмите **+ Lisa kulu** (Добавить расход).
2. Заполните:
   - **Kirjeldus** (Описание) — что оплачено (например, «Ruumide rent, märts 2026»).
   - **Summa** (Сумма) — в евро.
   - **Kuupäev** (Дата) — когда расход совершён.
   - **Kulukonto** (Счёт расхода) — выберите из плана счетов (например, 5100 «Rendikulud»).
3. Нажмите **Salvesta** (Сохранить).

Система автоматически создаст бухгалтерскую проводку: Дебет → Счёт расхода, Кредит → Банковский счёт.

### Фильтры

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

### Редактирование и удаление

- Нажмите на строку расхода для редактирования.
- Нажмите иконку корзины для удаления.
- При удалении автоматически удаляется связанная проводка.

---

## Отчёт по дебиторской задолженности (Võlgnevuste aruanne)

**Путь:** Pearaamat > Võlgnevuste aruanne

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

### Как использовать

1. Выберите дату **Seisuga** (По состоянию на) — обычно сегодняшнее число.
2. Таблица покажет всех должников с разбивкой:

| Колонка | Описание |
|---------|----------|
| **Klient** | Имя плательщика |
| **Kokku** | Общий долг |
| **Jooksev** | Текущий (срок ещё не наступил) |
| **1–30 päeva** | Просрочено до 30 дней |
| **31–60 päeva** | Просрочено 31–60 дней |
| **61–90 päeva** | Просрочено 61–90 дней |
| **Üle 90 päeva** | Просрочено более 90 дней |

### Рекомендации

- **1–30 дней** — отправьте напоминание об оплате.
- **31–60 дней** — свяжитесь с плательщиком лично.
- **Более 90 дней** — рассмотрите списание долга (see FAQ ниже).

---

## Движение денежных средств (Rahavoogude aruanne)

**Путь:** Pearaamat > Rahavoogude aruanne

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

### Как использовать

1. Выберите период: **Algus** (начало) и **Lõpp** (конец).
2. Отчёт разделён на три блока:

| Блок | Что показывает |
|------|----------------|
| **Äritegevus** (Операционная деятельность) | Поступления от клиентов, расходы на аренду, зарплаты |
| **Investeerimistegevus** (Инвестиционная) | Покупка/продажа оборудования |
| **Finantseerimistegevus** (Финансовая) | Кредиты, займы |

3. Внизу отчёта:
   - **Algsaldo** — остаток на начало периода.
   - **Lõppsaldo** — остаток на конец периода.
   - **Muutus** — разница (положительная = денег стало больше).

---

## Выписка клиента (Kliendi väljavõte)

**Путь:** Pearaamat > Kliendi väljavõte

Документ для сверки с плательщиком — показывает все операции по конкретному клиенту за период.

### Как сформировать

1. Выберите **плательщика** из выпадающего списка.
2. Укажите период: **Algus** и **Lõpp**.
3. Нажмите **Genereeri** (Сформировать).

### Что содержит выписка

- **Шапка** — данные организации и плательщика, период.
- **Algsaldo** — остаток задолженности на начало периода.
- **Таблица операций:**

| Колонка | Описание |
|---------|----------|
| **Kuupäev** | Дата операции |
| **Kirjeldus** | Описание (номер счёта, оплата) |
| **Deebet** | Начисление (долг увеличился) |
| **Kreedit** | Оплата (долг уменьшился) |
| **Saldo** | Текущий остаток долга |

- **Lõppsaldo** — итоговый остаток на конец периода.

> **В будущем:** будет добавлена возможность скачать PDF и отправить по email.

---

## Импорт банковской выписки (Pangaväljavõtted)

**Путь:** Pearaamat > Pangaväljavõtted

Позволяет загрузить выписку из банка и автоматически сопоставить оплаты со счетами.

### Поддерживаемые форматы

| Формат | Описание | Как получить в банке |
|--------|----------|---------------------|
| **CAMT.053** (XML) | Международный стандарт | SEB: Aruanded > Kontoaruanne (XML) |
| **CSV** | Текстовый формат | Swedbank: Aruanded > Väljavõte (CSV) |

### Как импортировать

1. Нажмите **+ Impordi** (Импорт).
2. Выберите формат: **CAMT.053** или **CSV**.
3. Загрузите файл с компьютера.
4. Система покажет список транзакций.

### Автоматическое сопоставление

Система автоматически ищет соответствующий счёт по:
- **Viitenumber** (ссылочный номер) из банковской транзакции.
- **Сумма** — должна совпадать с суммой неоплаченного счёта.
- **Статус счёта** — Выставлен, Отправлен или Просрочен.

Если совпадение найдено, транзакция отображается как **Seotud** (Связана) с номером счёта.

### Статусы транзакций

| Статус | Описание | Действие |
|--------|----------|----------|
| **Seotud** (Связана) | Найден соответствующий счёт | Нажмите **Konteeri** для проведения |
| **Ootel** (Ожидание) | Совпадение не найдено | Пропустите или найдите счёт вручную |
| **Konteeritud** (Проведена) | Оплата зафиксирована | Готово |
| **Vahele jäetud** (Пропущена) | Администратор решил не проводить | — |

### Проведение оплат

- **Одна транзакция:** Нажмите **Konteeri** напротив нужной строки.
- **Все связанные сразу:** Нажмите **Konteeri kõik seotud** — система проведёт все автоматически найденные совпадения.

При проведении система:
1. Создаёт запись оплаты в леджере.
2. Создаёт бухгалтерскую проводку (Дебет: Банк, Кредит: Дебиторка).
3. Помечает счёт как **Оплачен** (если сумма полная).

### Ручное сопоставление (Käsitsi seostamine)

Если автосопоставление не нашло счёт (нет viitenumber, опечатка), нажмите **Seo** (Сопоставить) и
выберите режим:
- **Seo arvega** — найдите счёт по номеру или плательщику. Под выбранным счётом видна разница суммы:
  точное совпадение, **переплата** (излишек уйдёт в предоплату) или **недоплата** (счёт останется
  частично открытым). Подтвердите кнопкой **Seo**.
- **Ettemakse** (предоплата) — деньги пришли, а счёта ещё нет: найдите плательщика и нажмите
  **Seo ettemaksena**. Платёж запишется как предоплата плательщика (счёт 2500).

### Переплата

Если оплата **больше** суммы счёта, при проведении система гасит счёт (**Оплачен**), а излишек
записывает в предоплату плательщика (счёт 2500). Эта предоплата **автоматически зачитывается в
следующем счёте** — повторно вносить её не нужно.

> Проведённые (**Konteeritud**) и пропущенные (**Vahele jäetud**) строки — финальные: повторно
> сопоставить или провести их нельзя, поэтому двойное проведение одного платежа исключено.

> **Совет:** Транзакции расходов (оплата аренды, коммунальные) проводите через раздел **Kulud** (Расходы), а не через банковскую выписку.

---

## Управление периодами (Perioodid)

**Путь:** Pearaamat > Perioodid

Бухгалтерские периоды (месяцы) можно закрывать для предотвращения случайных изменений в завершённых месяцах.

### Что видите

Карточки по месяцам, каждая со статусом:
- **Avatud** (Открыт) — можно создавать и редактировать проводки.
- **Suletud** (Закрыт) — изменения заблокированы.

### Как закрыть месяц

1. Найдите нужный месяц.
2. Нажмите **Sulge** (Закрыть).
3. Подтвердите действие.

> **Важно:** Месяцы закрываются **последовательно** — нельзя закрыть март, если февраль открыт.

### Как повторно открыть

1. Нажмите **Ava uuesti** (Открыть снова) на закрытом месяце.
2. Требуется право `gl.periods.reopen`.

### Закрытие финансового года

В конце года можно закрыть весь финансовый год:

1. Нажмите **Sulge aasta** (Закрыть год).
2. Система автоматически перенесёт прибыль/убыток на счёт 3000 (Jaotamata kasum).
3. Все месяцы года будут закрыты.

> **Рекомендация:** Закрывайте месяцы ежемесячно после проверки всех проводок. Закрытие года выполните после утверждения годового отчёта.

---

## FAQ

### Что такое «предоплата клиента» (2500)?

Когда вы отменяете **оплаченный** счёт или клиент платит **больше** суммы счёта, деньги «зависают» — он уже заплатил, но счёт аннулирован/закрыт. Счёт 2500 «Ostjatelt saadud ettemaksed» показывает эти деньги отдельной строкой. При следующем счёте они автоматически зачтутся.

Если 2500 не настроен — система работает так же, просто без детализации в бухучёте. (Счёт 2310 — это НДС с продаж, не предоплата.)

### Как сбрасывается нумерация?

1 января каждого года счётчик `[[SEQ]]` автоматически сбрасывается на 1. Первый счёт нового года будет `2027-0001`.

# Первичная настройка системы

# Первичная настройка системы (пошаговый запуск)

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

Названия пунктов меню в этом руководстве — **точно как в боковом меню HUVIS**.

Пройдите шаги сверху вниз. После каждого шага проверяйте результат в системе.

> **Перед началом:** войдите под административной ролью (**Manager**) — обычный работник не увидит часть пунктов меню.

---

## 1. Организация

Первым делом нужно настроить свою организацию — её название, реквизиты, контакты.

- **Где:** Настройки → Организации → [ваша организация] → Редактировать
- **Что заполнить:**
  - Название
  - Регистрационный номер (рег. код юрлица)
  - Номер НСО (VAT / tax_id) — если плательщик НСО
  - Контактное имя, телефон, e-mail
  - Адрес (юридический адрес компании)
  - Расчётный счёт (IBAN) — для счетов
- **Зачем это важно:** все сгенерированные счета и документы будут ссылаться на эти данные. Без корректного названия и рег. кода PDF-счета не пройдут бухгалтерскую проверку.

---

## 2. Адреса (физические здания)

Адрес — это здание/филиал, в котором проходят занятия. К адресу привязываются кабинеты.

- **Где:** **Учёба** → **Адреса**.
- **Как создать:**
  1. Нажмите **Создать / Добавить**.
  2. Введите название адреса (например, «Стоматологов, 4» или название филиала).
  3. Сохраните.
- **Когда нужно:** у школы один главный адрес — создайте один. Несколько филиалов — по одному на каждый.

---

## 3. Кабинеты (помещения)

Кабинет — конкретное помещение внутри адреса. На него заводится расписание.

- **Где:** **Учёба** → **Кабинеты**.
- **Как добавить:**
  1. **Создать**.
  2. Выберите **адрес** из списка (из шага 2).
  3. Название кабинета (например, «Кабинет 101», «Зал танцев»).
  4. Вместимость — опционально, используется визуально.
  5. Сохраните.
- **Проверка:** кабинет появился в списке. На странице курса в расписании можно будет выбрать этот кабинет.

---

## 4. Учителя (сотрудники)

- **Где:** **Управление персоналом** → **Сотрудники**.
- **Как добавить:**
  1. **Создать / Добавить работника**.
  2. Заполните **имя, фамилию, личный код (isikukood), e-mail, телефон**.
  3. Назначьте **роль** — для учителя обычно *Worker* или *Teacher*.
  4. Поставьте статус **Активный**.
  5. Сохраните.
- **После сохранения** система отправит письмо-приглашение работнику на вход через Smart-ID / Mobile-ID (если шаблон `worker_invite` настроен — см. шаг 8).
- **Ассистент:** создаётся так же, но с ролью *Assistant* — в расписании можно будет указать его рядом с основным учителем.

---

## 5. Направления

Направление — общая область (танцы, фортепиано, шахматы, программирование).

- **Где:** **Курсы** → **Направления**.
- **Как добавить:**
  1. **Создать**.
  2. Название (на всех поддерживаемых языках).
  3. Сохраните.
- **Зачем:** одно направление объединяет несколько специализаций. Например, направление «Танцы» содержит специализации «Балет», «Хип-хоп», «Бальные танцы».

---

## 6. Специализации

Специализация — более узкое направление внутри направления. К ней привязываются конкретные курсы (группы).

- **Где:** **Курсы** → **Специализации**.
- **Как добавить:**
  1. **Создать специализацию**.
  2. Выберите **дисциплину** (из шага 5).
  3. Название, описание.
  4. (Опционально) шаблон договора, настройки биллинга по умолчанию — можно задать позже.
  5. Сохраните.

---

## 7. Курс (группа)

Курс — конкретная группа учеников с расписанием и учителем. Это основная сущность, по которой идёт учёт посещаемости, счета, заявления.

- **Где:** **Курсы** → **Специализации** → [ваша специализация] → **Создать курс**.
- **Что заполнить при создании:**
  - **Учебный год** — важно! Выберите тот же год, что указан в **Курсы** → **Настройки** → *Год для веб-регистрации*, иначе курс не появится в публичной форме.
  - **Название** (на всех языках).
  - **Даты начала и окончания курса**.
  - **Возрастные рамки** (min/max age) — опционально.
  - **Макс. кол-во студентов**, **лимит листа ожидания**.
  - Переключатели *Регистрация закрыта*, *Уведомлять преподавателей*, *Пробный урок* — по необходимости.

После создания курса нужно поочерёдно заполнить вкладки:

### 7.1 Расписание

- Вкладка **Расписание** курса → **Добавить блок**.
- Для каждого блока: день недели, время начала/окончания, кабинет (из шага 3), учитель (из шага 4), ассистент (опционально).
- Сохраните. Без расписания курс **не появится** в форме регистрации.

### 7.2 Цена

- Вкладка **Цены** (или **Цена**).
- Добавьте хотя бы один тариф: *ежемесячно / ежеквартально / за курс* + сумма в евро.
- Можно завести несколько тарифов — пользователь выберет при регистрации.
- Без цены курс тоже не появится в форме регистрации.

### 7.3 Шаблон заявления (договор)

- Если не настроен дефолтный шаблон заявления — залейте docx через **Курсы** → **Настройки** → *Шаблоны заявлений* и пометьте как **По умолчанию**.
- Без шаблона не получится сгенерировать PDF-договор для подписания.

### 7.4 Открытие регистрации

Чтобы курс появился в публичной форме:

1. Переключатель *Регистрация закрыта* — **выключен**.
2. Поле *Дата начала регистрации* — пустое или уже наступило.
3. Курс, цена и расписание — заполнены.
4. Год курса совпадает с *Год для веб-регистрации* в **Курсы** → **Настройки**.

Проверить: откройте публичную ссылку на регистрацию → курс должен быть в выпадающем списке.

> Детальный чек-лист «курс не виден» см. в [03-courses.md](https://docs.huvis.ee/link/142#курс-создан-но-не-отображается-в-форме-регистрации).

---

## 8. Шаблоны писем

Автоматические письма (приглашение работника, уведомление о заявлении, напоминание об оплате) рассылаются по шаблонам. Без шаблона соответствующее письмо не уйдёт.

- **Где:** **Уведомления** → **Шаблоны**.
- **Минимальный набор, который нужно заполнить сразу:**
  - **Общий HTML-шаблон** — общее оформление всех писем (шапка, подвал, логотип).
  - **Приглашение работника** (`worker_invite`) — иначе новые учителя не получат письмо на вход.
  - **Уведомление плательщика** (`payer_template_notification`) — письмо плательщику о созданном заявлении.
  - **Уведомление работника** (`worker_template_notification`) — письмо учителю о новом заявлении на курс.
  - **Оплата счёта** (`invoice_payment_templates`) — подтверждение оплаты / напоминание.
- **Как редактировать:** нажмите на шаблон → отредактируйте текст, используя переменные в квадратных скобках (например, `[[STUDENT_NAME]]`, `[[COURSE_NAME]]`) → **Сохранить**. Кнопка **Предпросмотр** покажет как будет выглядеть.

---

## 9. SMTP (сервер исходящей почты)

Без настроенного SMTP ни одно письмо не уйдёт.

- **Где:** **Уведомления** → **Настройки** → вкладка **SMTP** (доступно только системному администратору платформы — обычному пользователю школы пункт не виден).
- **Что заполнить:** host, port, username, password, шифрование (TLS/SSL), e-mail отправителя (*from_address*), имя отправителя (*from_name*).
- **Проверка:** кнопка **Тест соединения** — если сервер ответит OK, SMTP настроен.

---

## 10. Уведомления при смене статуса заявления

Когда статус заявления меняется (создано → отправлено → подписано → закрыто), система может автоматически писать плательщику и/или учителю.

- **Где:** **Курсы** → **Настройки** → вкладка **Автоматизация**.
- **Что настроить:**
  - Для каких статусов отправлять уведомление плательщику.
  - Для каких статусов отправлять уведомление работнику/ассистенту.
  - Задержка/напоминания (если заявление долго в статусе «создано» — напомнить через N дней).
- **Зависит от:** шаблонов писем из шага 8 (должны существовать соответствующие шаблоны для каждого события).

---

## 11. Настройки биллинга (счета)

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

- **Где:** **Счета** → **Настройки счетов**.
- **Что заполнить:**
  - **Шаблон номера счёта** (например, `[[YYYY]]-[[SEQ]]`).
  - **Шаблон имени PDF файла**.
  - **Режим выставления** — за прошлый месяц или за следующий.
  - **День генерации** и **час отправки**.
  - **Платёжный шлюз** (Montonio и т.д.) — заполняется администратором платформы.
  - **Шаблон PDF-счёта** (docx) — залейте файл и пометьте как основной.
- **Проверка:** **Счета** → **Настройки счетов** → под номером примера шаблона нет красных сообщений, PDF-шаблон загружен.

---

## 12. Публичные ссылки на регистрацию

Чтобы плательщики могли записываться на курсы с сайта школы — нужна публичная ссылка.

- **Где:** **Настройки** → **Публичные ссылки**.
- **Как создать:**
  1. Нажмите **Создать ссылку**.
  2. Тип: **Регистрация на курсы** или **Расписание**.
  3. Метка (для себя, не видна пользователю).
  4. **Сохранить**.
- **Скопировать** сгенерированный URL и/или iframe-код → разместить на сайте школы.
- Подробнее: [19-iframe-embed.md](19-iframe-embed.md).

---

## 13. Роли и права

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

- **Где:** **Настройки** → **Роли**.
- **Готовые роли:** Manager, Worker, Assistant, Student, Payer.
- **Что можно кастомизировать:** внутри каждой роли — список прав (view/edit/delete по каждому модулю).
- **Рекомендация:** Manager — основная рабочая роль администратора школы. Worker — учитель. Assistant — ассистент на курсах. Student и Payer назначаются автоматически при регистрации учеников и плательщиков.

---

## 14. Причины отчисления

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

- **Где:** **Настройки** → **Настройки** → вкладка *Причины отчисления*.
- **Что добавить:** 3–5 типовых причин на каждом языке организации (нет времени, смена места жительства, потеря интереса и т.п.).

---

## 15. Анкета при регистрации (опционально)

Если хотите собирать дополнительные данные с плательщика/студента при подаче заявления (откуда узнали о школе, мед. ограничения, согласия на фото) — настройте анкету.

- **Где:** **Учёба** → **Анкеты**.
- Создайте дефолтную анкету → добавьте поля (текст, галочка, выпадающий список) → пометьте нужные обязательными.

---

## 16. Нерабочие (неучебные) дни

Государственные праздники Эстонии импортируются автоматически при установке. Свои каникулы/выходные добавляйте вручную.

- **Где:** **Учёба** → **Неучебные дни**.
- Даты каникул → занятия в эти дни автоматически исключаются из расписания и не тарифицируются.

---

## Быстрый чек-лист

Отметьте по мере настройки:

- [ ] 1. Организация заполнена (название, рег. код, IBAN)
- [ ] 2. Адреса созданы (**Учёба** → **Адреса**)
- [ ] 3. Кабинеты созданы и привязаны к адресам (**Учёба** → **Кабинеты**)
- [ ] 4. Сотрудники добавлены, роли назначены (**Управление персоналом** → **Сотрудники**)
- [ ] 5. Направления созданы (**Курсы** → **Направления**)
- [ ] 6. Специализации созданы (**Курсы** → **Специализации**)
- [ ] 7. Хотя бы один курс создан (+ расписание + цена + шаблон)
- [ ] 8. Минимальные шаблоны писем заполнены (**Уведомления** → **Шаблоны**)
- [ ] 9. SMTP настроен, тест прошёл (**Уведомления** → **Настройки** → **SMTP**)
- [ ] 10. Уведомления при смене статуса настроены (**Курсы** → **Настройки** → *Автоматизация*)
- [ ] 11. Настройки счетов заполнены (**Счета** → **Настройки счетов**)
- [ ] 12. Публичная ссылка создана (**Настройки** → **Публичные ссылки**)
- [ ] 13. Роли розданы сотрудникам (**Настройки** → **Роли**)
- [ ] 14. Справочник причин отчисления заполнен
- [ ] 15. Анкета (если нужна)
- [ ] 16. Неучебные дни добавлены (**Учёба** → **Неучебные дни**)

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

# НДС (Käibemaks)

# НДС (Käibemaks)

Раздел описывает работу с налогом на добавленную стоимость (НДС / käibemaks) в системе:
как включить налоговую функцию, создать ставки и применять их к курсам, сборам и строкам
счёта.

> **Важно:** Налоги нужны не каждой организации. Поэтому НДС вынесен в **отдельный модуль
> «Käibemaks»**, который по умолчанию выключен. Если ваша организация работает без НДС
> (`Maksuvaba 0%`) — ничего включать не нужно, налоговые поля просто не появятся.

## Когда включать модуль

Включайте модуль «Käibemaks», если организация является плательщиком НДС (есть номер KMKR)
и должна выставлять облагаемые счета. Если все услуги освобождены от НДС — модуль не нужен.

## Шаг 1. Включить модуль «Käibemaks»

Модуль НДС **зависит от модуля счетов (Arved)** — сначала должен быть включён он.

1. Перейдите в **Настройки → Организации**.
2. Откройте карточку нужной организации.
3. Перейдите на вкладку **Модули** (Moodulid).
4. Убедитесь, что включён модуль **Arved** (счета).
5. Включите модуль **Käibemaks**.
6. Нажмите **Сохранить**.

> Если модуль **Arved** выключен, **Käibemaks** не будет работать, даже если отмечен —
> налоговый интерфейс не появится.

После включения в меню **Настройки** появится пункт **Käibemaksumäärad** (ставки НДС), а в
формах курса, сбора и на странице счёта — поля выбора ставки.

## Шаг 2. Завести ставки НДС

1. Перейдите в **Настройки → Käibemaksumäärad** (ставки НДС).
2. Нажмите **Создать**.
3. Заполните:
   - **Название** — например, «Standardmäär 24%», «Vähendatud 9%», «Maksuvaba 0%».
   - **Процент** — например, `24`, `9`, `0`.
   - **По умолчанию** (опционально) — ставка, которая будет автоматически подставляться в формы.
   - **Активна** — неактивные ставки не предлагаются в списках выбора.
4. Нажмите **Сохранить**.

> **Для интеграции с Merit Aktiva:** после создания ненулевой ставки запустите синхронизацию
> налогов (`merit:sync-taxes`) или попросите администратора — иначе облагаемая строка уйдёт в
> Merit без идентификатора налога. Освобождённые/0%-ставки этого не требуют.

## Шаг 3. Назначить ставку курсу

Цена курса хранится **без НДС** (нетто) — НДС добавляется к этой сумме.

1. Откройте **мастер создания или редактирования курса**.
2. На шаге **Цены** найдите поле **Käibemaks** (ставка НДС).
3. Выберите нужную ставку (по умолчанию — `Maksuvaba 0%`).
4. Сохраните курс.

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

## Шаг 4. Ставка на дополнительном начислении

У дополнительного начисления (сбора) есть **своя** ставка, не обязательно совпадающая со ставкой курса.

1. Откройте заявление → **Добавить начисление**.
2. В форме выберите **ставку НДС** для начисления: сначала подставляется ставка курса, а если её
   нет — ставка организации по умолчанию.
3. Сохраните.

## Шаг 5. Правка НДС на строке счёта

На **черновике счёта** (статусы PLANNED / READY, не кредитный счёт) можно изменить ставку
отдельной строки прямо на странице счёта.

1. Откройте счёт (`/invoices/{...}`).
2. В таблице позиций у каждой строки (**Kirjeldus**) есть поле выбора ставки.
3. Выберите ставку — суммы строки и итог счёта пересчитаются автоматически.
4. В нижней части таблицы видны **Vahesumma** (без НДС), **Käibemaks** (НДС) и **Maksmisele**
   (к оплате).

> На **выставленных** счетах правка ставки заблокирована (счёт зафиксирован). Чтобы изменить
> НДС на выставленном счёте, оформите кредитный счёт и перевыпустите счёт.

## Что видно в счёте и PDF

- Блок **Arvutusvalem** (формула расчёта) показывает шаг **+ käibemaks** для облагаемых строк.
- Подвал таблицы позиций: Vahesumma → Käibemaks → Maksmisele.
- В PDF-счёте по каждой позиции выводятся нетто, НДС и итог; внизу — сумма без НДС, сумма НДС
  и общая сумма.

## Если НДС не нужен

- Не включайте модуль «Käibemaks» — налоговые поля не появятся, счета считаются как раньше
  (сумма = нетто, без строки НДС).
- Если модуль выключить позже, уже выставленные счета не изменятся.

## Частые вопросы

**Включил «Käibemaks», но пункта меню/полей нет.**
Проверьте, что включён модуль **Arved** — без него «Käibemaks» не действует.

**Изменил ставку в каталоге — изменились ли старые счета?**
Нет. Ставка фиксируется в строке счёта при выставлении. Правка каталога влияет
только на вновь выставляемые/пересчитываемые счета.

**Цена с НДС или без?**
Цены вводятся **без НДС** (нетто). НДС добавляется к этой сумме.

---

> См. также: [05-invoices.md](https://docs.huvis.ee/link/144) — счета и оплата, [13-settings.md](https://docs.huvis.ee/link/152) —
> настройки и модули организации, [21-general-ledger.md](https://docs.huvis.ee/link/159) — бухгалтерские
> проводки НДС.