| Поле | Значення |
|---|
| Статус | 🚧 змержено в інтеграційні гілки (api-v2 PR #556 → dev, frontend PR #494 → development); задеплоєно на dev-API і верифіковано E2E; у prod ще немає |
| Поверхні | web (кабінет /profile/simulation) |
| Доступність | показується лише покупцям симуляції з quick-реєстрацією (onboarding_state='quick') |
| Власник | TODO: |
| Останнє підтвердження | 2026-07-04 · dev live-smoke: API-виклики + браузерний прохід wizard проти development.api.abitly.org |
Купівля симуляції можлива через quick Google-auth (GET /auth/google/quick) без повної реєстрації: створюється юзер типу OTHER зі станом onboarding_state='quick', про якого платформа не знає нічого. Wizard при першому візиті кабінету збирає базовий профіль і проводить по кабінету — заповнені канонічні поля одразу вмикають наявну персоналізацію: конкурсний бал по інтересах (my-score), JourneyStepper на огляді профілю, повні вкладки налаштувань абітурієнта.
Точка входу: https://abitly.org/uk/profile/simulation (після redirect з оплати Monobank або будь-який наступний візит).
- Кабінет бачить
user.onboardingState === 'quick' (з GET /users/me) → відкриває модальний wizard.
- Крок «Про тебе»: ім’я (prefill з Google), рік вступу (2026 / 2027 / «ще не знаю»), місто (опц.).
- Крок «Інтереси»: Typesense-автокомпліт
/offers/search-params (той самий, що MainSearch і «Додати КП») — одне поле пошуку, групи «Спеціальності»/«Університети», чипи; університети опційні.
- Перехід до туру = збереження:
POST /users/profile/onboarding — бекенд конвертує OTHER→APPLICANT (STI-дискримінатор), пише скаляри через update(), junction-таблиці синхронізує raw-SQL ідемпотентно (повторний сабміт безпечний), ставить onboarding_state='complete'.
- Крок «Як працює кабінет»: 3 статичні підказки (бали НМТ → додай КП → запусти симуляцію) → «До кабінету».
- Навігація вільна: «Назад» на кожному кроці (включно з туром), прогрес-сегменти клікабельні назад, лічильник «Крок N з 3»; повернення з туру і повторне «Далі» замінює вибір (повні масиви в DTO).
- «Пропустити» на будь-якому кроці зберігає зібране і закриває назавжди; Esc/оверлей до збереження — snooze на сесію (повернеться наступного візиту).
| Джерело | Ендпоінт / entity | Призначення |
|---|
| api-v2 | POST /users/profile/onboarding | зберегти дані (+ interestedSpecialities[], selectedUniversities[]) + конверсія типу + complete |
| api-v2 | GET /offers/search-params | Typesense-автокомпліт кроку «Інтереси» |
| api-v2 | GET /users/me → onboardingState | тригер показу wizard |
| api-v2 | users.onboarding_state enum(pending_profile,quick,complete) | стан онбордингу (ставиться в quick при GET /auth/google/quick) |
- simulation — кабінет, у якому живе wizard; quick-auth зʼявився саме для його checkout.
- account-auth — quick-флоу Google OAuth без complete-profile.
- profile — дозаповнення тих самих полів у налаштуваннях; конверсія відкриває вкладки абітурієнта.
- my-score — інтереси з онбордингу живлять розрахунок конкурсного бала.
| Репо | Шлях | Примітка |
|---|
abitly-frontend-v2 | src/components/pages/profile/pages/Simulation/components/Onboarding/ | wizard (3 кроки + тригер) |
abitly-api-v2 | src/api/users/users.service.ts → completeOnboarding | конверсія OTHER→APPLICANT + збереження |
- Фронт деградує безпечно до деплою бекенда: без поля
onboardingState wizard не з’являється.
- Юзери, що купили симуляцію до фічі й лишилися в
quick, побачать wizard при наступному візиті кабінету (свідомо).
- Аналітика: 4 typed-події
simulation_onboarding_viewed / _step_completed / _skipped / _completed (booleans/counts, PII-safe).
- ⚠️ Pre-existing баг (не з цієї фічі, відтворено на контрольному e2e-юзері): на dev будь-який TypeORM
save() юзера із завантаженим M2M і наявними junction-рядами падає 500 (duplicate key … user_interested_specialities PK) — зачіпає PATCH /users/profile. Onboarding-ендпоінт від нього ізольовано (api-v2 PR #559: update() + raw junction-sync). TODO: окремий фікс для PATCH-шляху в api-v2.
| Дата | Подія | Джерело |
|---|
| 2026-07-04 | Бекенд-ендпоінт + конверсія типу | api-v2 PR #556 |
| 2026-07-04 | Wizard у кабінеті симуляції | frontend PR #494 |
| 2026-07-04 | Обидва PR змержено (admin-merge, CI біллінг-блок; гейти локально) + деплой dev-API (pipeline abitly-dev-backend) + E2E-верифікація: конверсія OTHER→APPLICANT, поля, інтереси, complete, wizard у браузері, no-reshow після reload | dev live-smoke |
| 2026-07-04 | v2 (за фідбеком): крок «Інтереси» на Typesense search-params (спеціальності+університети, чипи), вільна навігація назад (кроки/прогрес/тур), лічильник кроків; бекенд — selectedUniversities + bug-immune raw junction-sync (повторний сабміт 200). Dev E2E-верифікація повторена (заміна вибору E7/КНУТШ у БД) | api-v2 PR #559 + frontend PR #496 |