Paketi muutus — kõik reeglid

Portaal → Treeningupakett → Soovin muuta pakettijoin.html?mode=change. Seotud: mockup · Õppeleping §1.2, §3.2, §5.4, §6 · 📦 Paketid & Hinnad → ÜHEKORDSE TASUD → Lepingumuudatuse tasu.

1. Kliendi teekond

📦Portaal
Treeningupakett
1Pakett
+ lepingu tüüp
2Treening
eeltäidetud + capacity
3Kinnita
mitte «Loo konto»
Taotlus
auto / admin
Uut kontot ei looda. Alguskuupäeva ei küsita. Sessioon: portal JWT (tcs_token). Valikuline &client_id= pere liikmele.

2. Millal pakett tõuseb / langeb

OlukordSuundPortaalTasu
Rohkem sessions_per_week või kallim hind ↑ Tõus Jah Lepingumuudatuse tasu ei
Vähem treeninguid / odavam pakett ↓ Langus Jah, kui aastane lukk ei kehti 📦 ÜHEKORDSE TASUD → Lepingumuudatuse tasu
Aastane → tähtajatu Tüüp Ainult kui aastane lukk ei kehti Sõltub hinnamuutusest
Sama pakett + samad treeningud 400 — muudatusi ei ole

3. Aastane leping — lukk (V1)

Põhimõte: aastane = 12 kuu kohustus (Õppeleping §5.4, §3.8 soodustus). Portaalist ei saa enne perioodi lõppu minna odavamale ega tähtajatule. Tõus aastase sees (rohkem treeninguid / kallim, jäädes aastaseks) on lubatud.

3.1 Mis on «Kehtib kuni»

Sama arvutus mis 📦 Portaal → Treeningupakett → Staatus → Kehtib kuni: järgmine aastapäev billing_start_date (fallback created_at), või contract_end_date kui määratud.

3.2 Millal lukk on aktiivne

active ⇔ contract_type === 'annual'
       ∧ effective_from ≤ ends_on   // effective_from = järgmise kuu 01.
NäideKehtib kunieffective_fromLukk
Täna 20.08, lõpp 15.10 15.10.2026 01.09.2026 Aktiivne — open/langus keelatud
Täna 01.10, lõpp 15.10 15.10.2026 01.11.2026 Ei kehti — jõustumine pärast lõppu
Tähtajatu leping 01. järgmine Ei kehti

3.3 UI lukuga

V1 ei tee: eelnevat taotlust «langus alates ends_on». Klient ootab, kuni lukk kaob (või jõustumise kuupäev on pärast lõppu), siis teeb uue taotluse.

4. Jõustumine

SuundReegel
Upgrade / lateral Alati järgmise kuu 1. — ka kui taotlus on pärast 15. kuupäeva
Downgrade Õppeleping §6.2: 1.–14. → järgmise kuu 01.; 15.–kuu lõpp → ülejärgmise 01.
Cron pending_auto + effective_from ≤ CURDATE() → apply (~00:20)
API: effectiveFromForDirection(direction) · bootstrap annab effective_from_upgrade / effective_from_downgrade · UI uuendab bännerit valiku peale.

5. Vabad kohad (capacity)

TaseAllikasPrioriteet
Slot 📦 Treeningud → slot → Max osalejaid (trainings.capacity_limit) 1
Grupp Grupi Max osalejaid (groups.capacity_limit) 2 (fallback)
NULL Limiiti ei kontrollita

6. Lepingumuudatuse tasu

Allikas: 📦 Paketid & Hinnad → ÜHEKORDSE TASUD → Lepingumuudatuse tasu (fees.fee_key = contract_change). Õppeleping §1.2 — kehtib alandamisel, mitte kallima paketi vastu.

7. Muud blokeeringud (bootstrap / POST)

(nagu Võlad)
TingimusKood / tulemus
Pole sisse logitudauth
Pole aktiivne klient400
custom_price seatudainult admin
Välja antud võlg (>0, ilma draftita)debt
Ootel taotlus juba olemaspending_exists
Aastane → open (lukk)annual_to_open_blocked
Aastane + langus (lukk)annual_downgrade_blocked
Draft-arveEi blokeeri

8. Taotluse staatused

StatusTähendus
pending_autoCron rakendab effective_from kuupäeval
pending_adminGrupp täis — admin kinnitab → pending_auto
appliedPakett + treeningud uuendatud; vajadusel tasu-arve
rejected / cancelledTagasi lükatud / tühistatud
CRM UI pending_admin nimekirjale: API /api/package-changes on olemas; admin-ekraan V1-s võib puududa.

9. Olulised UI tekstid (RU näide)

KohtTekst
BannerСмена пакета · Nimi + Вступит в силу DD.MM.YYYY
Aastane lukkГодовой договор до … — дешевле/открытый только после…
Slot praegu«ходишь» / käid
Slot täis«Мест нет · заявка» / Täis · taotlus
Kinnita + täisОжидает подтверждения администратора
Kinnita + langusLepingumuudatuse tasu X €

10. V1 vs hiljem

TeemaV1Hiljem
Langus / open aastase ajal Keelatud (lukk) Eeltaotlus effective_from = ends_on
§6.2 jõustumine Downgrade = täis §6.2; upgrade/lateral = järgmise kuu 01.
Admin UI pending_admin API olemas CRM nimekiri + approve
«N vaba» number pillil Ei Valikuline

Uuendatud koos deploy’ga · vaata ka Uued kliendid — kõik reeglid