# GetCourse: как работает коннектор

В этой статье вы узнаете, как коннектор GetCourse выгружает данные в хранилище ROMI center: какие таблицы он создаёт, с какой периодичностью идёт выгрузка и как устроена перезагрузка прошлых дней. Полный список полей — в статье [GetCourse: описание выгружаемых полей](https://help-ru.romi.center/getcourse-opisanie-vygruzhaemyh-polej).

## Что выгружается: до семи таблиц

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

| Таблица | Что внутри | Когда появляется |
| --- | --- | --- |
| `…_deals` | Заказы | включены «Заказы» |
| `…_deal_positions` | Позиции заказов — товары внутри заказа | включены «Позиции заказов»; требуют заказов |
| `…_purchases` | Покупки пользователей | включены «Покупки»; требуют заказов |
| `…_users` | Пользователи (ученики) | включены «Пользователи» |
| `…_payments` | Платежи | включены «Платежи» |
| `…_groups` | Справочник выбранных групп | в дополнительных настройках выбрана хотя бы одна группа |
| `…_group_users` | Состав этих групп: кто в какой группе | вместе с `…_groups` |

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

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

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

## Периодичность

Ночью, в 05:10, коннектор ставит задание на каждую включённую сущность. Заказы, пользователей, платежи и группы он забирает каждые 5 минут фоновыми воркерами; позиции заказов и покупки — раз в минуту, пачками по 500 строк, с запросом в технический API на каждый заказ и каждого пользователя.

> **Важно**
> Выгрузки GetCourse лимитированы — около ста запросов за два часа на аккаунт, поэтому заказы, пользователи и платежи забираются раз в сутки, а не чаще.

## За какой период забираются данные

Ночной прогон берёт данные со вчерашнего дня минус «Перезагрузка прошлых дней» по вчерашний день; сегодняшний день в ночную выгрузку не попадает. Историческая перезагрузка нарезается на семидневные куски — на каждый кусок и каждую сущность ставится своё задание. Вебхук обновления поля работает вне периодов: он правит уже выгруженную строку по её ключу.

## Как сохраняет данные

*   **Куда:** хранилище ROMI center на движке ClickHouse.
*   **Имя таблицы:** `get_course_<адрес аккаунта>_<id подключения>_<таблица>`. Адрес берётся из ссылки на портал: отбрасываются `https://` и хвост `.ru`, остальное приводится к латинице без точек и дефисов. Аккаунт `https://myschool.getcourse.ru` даёт таблицу заказов `get_course_myschoolgetcourse_412_deals`.
*   **Структура догоняется, а не пересоздаётся.** Поле, добавленное в настройках, приходит новой колонкой. Колонки никогда не удаляются: снятое поле останется в таблице со старыми значениями, а новые строки будут писаться в него пустыми.
*   **Повторная выгрузка не плодит дубли.** Строка ищется по ключу — у заказов и пользователей это их идентификатор, у платежей — номер. Найденная строка удаляется и вставляется заново, а дата первой заливки (`rc_created_at`) переносится со старой.
*   **Состав групп обновляется целиком.** У строки составной ключ «группа + пользователь», и вместе с заливкой удаляются выбывшие: кого в свежем ответе GetCourse нет, того убирают из таблицы. Если ответ по группе не пришёл, не удаляется ничего — коннектор падает в безопасную сторону.

## Перезагрузка прошлых дней

Ночная перезагрузка в 05:10 перечитывает окно из настройки «Перезагрузка прошлых дней» (0–7): строки за это окно перезаписываются по ключу, ничего заранее не удаляется. Функция «Загрузить исторические данные» в меню подключения работает за любой период, нарезанный на семидневные куски, — данные дописываются поверх существующих по ключу.

> **Важно**
> Галочка «Удалить ранее загруженные данные за период» удаляет все таблицы подключения целиком — заказы, позиции, покупки, пользователей, платежи, группы, — а не только выбранный период. После такой перезагрузки останется только перезагруженный период.

## Дополнительные настройки

| Настройка | Что делает |
| --- | --- |
| Адрес аккаунта и ключ API | Шаг подключения. Ключ нужен для выгрузок; он же используется для списка полей и групп. |
| Сущности и поля | Шаг «Выбор полей»: заказы, позиции заказов, покупки, пользователи, платежи. Позиции и покупки доступны только вместе с заказами. |
| Дата события | Синтетическое поле в списке заказов, пользователей и платежей. В колонку попадает дата оплаты, а если её нет — дата создания записи. |
| Перезагрузка прошлых дней (0–7, по умолчанию 7) | Глубина ночной перезаписи. Больше дней — дольше прогон и больше запросов к GetCourse. |
| Принимать обновления полей по вебхуку | Включает приём вебхуков GetCourse: изменение поля в портале правит уже выгруженную строку, не дожидаясь ночного прогона. Правятся строки заказов, пользователей и платежей; ключевые поля вебхук не трогает. |
| Группы | Мультивыбор групп, состав которых выгружать. Пустой выбор — таблицы групп не заводятся. |

## Технические поля

| Колонка | Что внутри |
| --- | --- |
| `rc_import_id` | Номер прогона выгрузки, которым записана строка. По нему же вычисляются выбывшие из групп. |
| `rc_created_at` | Когда строка впервые попала в таблицу. При перезаписи переносится со старой строки. |
| `rc_updated_at` | Когда строку последний раз меняли — перезаливкой или вебхуком. |

В предпросмотре данных служебные колонки скрыты — они отрезаются по префиксу `rc_`.
