Калькулятор конкурсного бала
Метадані
Section titled “Метадані”| Поле | Значення |
|---|---|
| Статус | 🟢 prod |
| Поверхні | web (+ deep-link у bot) |
| Доступність | безкоштовно, без акаунта; «Зберегти бал» — потрібен акаунт |
| Власник | TODO: |
| Останнє підтвердження | 2026-06-13 · browse (abitly.org/uk/nmt-calculator, api.abitly.org/specialities/calculator, /regions, /offers/admission-chances) + код:main (abitly-frontend-v2, abitly-api-v2) |
Призначення
Section titled “Призначення”Абітурієнт вводить бали НМТ і миттєво бачить свій конкурсний бал (КБ) для обраної спеціальності — з урахуванням предметних коефіцієнтів, творчого конкурсу, підготовчих курсів (ОУ), регіонального (РК) та галузевого (ГК) коефіцієнтів. Головний органічний вхід у воронку: результат конвертується в реєстрацію або перехід у Telegram-бот.
User flow
Section titled “User flow”Точка входу: https://abitly.org/uk/nmt-calculator (внутрішній роут /nmt-calculator, без локалізованого аліаса; ISR revalidate 1 день, robots index, FAQ-schema).
- Вибір спеціальності (
SpecialityDropdown— групи за галузями, бейджі коефіцієнтів предметів). - Обов’язкові предмети: українська, математика, історія України (валідація Zod 100–200;
ScoreModeToggle— ввід «тестових балів» із конвертацією у шкалу 100–200). - Один вибірковий предмет (рівно один — обов’язковий).
- Опційно: творчий конкурс (рендериться лише якщо у спеціальності
КТ > 0), бал за підготовчі курси ЗВО (ОУ), регіональний коефіцієнт (RegionDropdown). - «Розрахувати» → скрол до результатів: головна картка бала, таблиця «який був би бал з іншим вибірковим предметом», порівняльні графіки (
BetterThanCards). - Конверсійні поверхні після результату (registration funnel, у prod): банер Telegram-бота з deep-link
t.me/<bot>?start=chances_<specialityId>_<score×100>, тізер «шанси на вступ» (топ-3 оффери за балом, частина карток заблокована до реєстрації), sticky-бар реєстрації, «Зберегти бал». - «Зберегти бал»: авторизований →
usersApi.updateGrades/updateProfile(бал у профілі); гість → бали в localStorage кроків wizard’а my-score + redirect на/auth/login, після входу воронка відновлюється (useResumeFunnelOnAuth).
Гілка deep-link у бота вже намальована — див. /start chances_…; кліки трекаються через track-events → lake-house. Тут не дублюємо.
Формула
Section titled “Формула”Код (calculateHelpers.ts) реалізує офіційну формулу НМТ-2026/2025: чисельник К1·П1+К2·П2+К3·П3+К4·П4+КТ·ТК, знаменник К1+К2+К3+(К4макс+К4)/2+КТ, далі +ОУ, ×РК, ×ГК (1.02 для спеціальностей з особливою підтримкою, isSupported), cap 200. Узгоджена з довідником хабу — Мінімальні бали та формула (Порядок прийому-2026, Розділ IV, п. 4). Формули НМТ-2023/2024 калькулятор не реалізує.
Дані та API
Section titled “Дані та API”| Джерело | Ендпоінт / entity | Призначення |
|---|---|---|
| api-v2 | GET /specialities/calculator | галузі + спеціальності з предметними коефіцієнтами (staleTime: Infinity — змінюються раз на рік; live віддає year 2026) |
| api-v2 | GET /regions | регіони з РК (coefficient) |
| api-v2 | GET /offers/admission-chances (param concursScore) | тізер «шанси на вступ» — топ-N офферів за балом |
| api-v2 | usersApi.updateGrades / updateProfile | збереження бала в профіль (тільки авторизовані) |
Спеціальності та регіони prefetch’аться на сервері (RSC + HydrationBoundary), форма й розрахунок — повністю клієнтські (React Hook Form + CalculatorContext): сам КБ рахується в браузері, без запиту до API.
Зв’язки з іншими фічами
Section titled “Зв’язки з іншими фічами”- «Мої пріоритети» — тизер шансів калькулятора несе кнопку «+ у пріоритети» (єдина точка входу MVP доку); КБ із калькулятора живить статус-чіп «куди проходжу».
- Каталог спеціальностей / офферів — з результату веде картка «знайти оффери»; тізер шансів тягне ті самі оффери.
- Deep-links до Telegram-бота — контракт
chances_<specialityId>_<score×100>(owner — бот;NEXT_PUBLIC_TELEGRAM_BOT_USERNAME). - Автентифікація — гейт для збереження бала; воронка реєстрації стартує саме звідси.
- Wizard «Куди я вступлю?» (🚧) і профільний my-score wizard — продовження цього флоу, карток ще немає (див. індекс).
| Репо | Шлях | Примітка |
|---|---|---|
abitly-frontend-v2 | src/app/[locale]/(main)/nmt-calculator/page.tsx | роут (RSC, prefetch) |
abitly-frontend-v2 | src/components/pages/calculator/** | форма, результати, registration-funnel, utils/calcGrade.ts + utils/calculateHelpers.ts (формула) |
abitly-frontend-v2 | src/lib/utils/telegramBot.ts | buildChancesDeepLink — єдине джерело bot-URL |
abitly-frontend-v2 | docs/domains/calculator/ | домен-доки (overview, api, state, seo, i18n) — першоджерело деталей |
abitly-api-v2 | src/api/specialities/, src/api/regions/ | контролери даних калькулятора |
Покриття тестами: e2e __tests__/e2e/nmt-calculator/ (15 spec-файлів) + unit/integration по воронці.
Обмеження та блокери
Section titled “Обмеження та блокери”- Лише формула НМТ-2026/2025; для НМТ-2023/2024 (інші формули — див. довідник) розрахунку немає.
NEXT_PUBLIC_TELEGRAM_BOT_USERNAMEне заданий → усі bot-лінки тихо ховаються (повертаєтьсяnull).- Deep-link із застарілим speciality-id → бот мовчки відповідає «не знайдено» (id мають бути поточного року бекенда).
- Тізер шансів вимагає
score > 0і вибраної спеціальності;retry: false— при падінні API секція просто не показується. - Спецкатегорії вступника (квоти, пільги) калькулятор не враховує — тільки «загальна» формула КБ.
Історія змін
Section titled “Історія змін”| Дата | Подія | Джерело |
|---|---|---|
| 2026-05-15 | актуалізовано домен-доки калькулятора | abitly-frontend-v2 docs/domains/calculator/ |
| 2026-05-25 | registration funnel (тізер шансів + sticky CTA) — спроєктовано і змержено | docs/superpowers/plans/2026-05-25-nmt-calculator-registration-funnel.md |
| 2026-06-13 | створено картку; формулу звірено з довідником vstup-rules | PR Wave 1 |