9.8 KiB
🏗️ Végrehajtási Terv: Csomagváltási és Fizetési Anomáliák Javítása (4 fázis)
Dátum: 2026-07-28
Szerző: Technical Lead & System Architect
Státusz: 🔵 Tervezés kész — Gitea Issue-k létrehozva
Kapcsolódó kártyák: #429, #430, #431, #432
📋 Áttekintés
A felhasználó csomagot váltott (Ingyenesre), de a tranzakció adatbázis szinten nem ment végbe a net_amount > 0 validációs hiba miatt. A javítást szigorú sorrendben, a mélyebb rétegektől (Backend/Adatbázis) a felület (Vue.js frontend) felé haladva kell végezni.
🔴 Fázis 1: Ingyenes csomag (0 Ft) bypass és Adatbázis szinkronizáció
Gitea kártya: #429 - Issue #1: Ingyenes csomag (0 Ft) bypass és Adatbázis szinkronizáció javítása
Root Cause
A FinancialManager.purchase_package() mindig létrehoz egy PaymentIntent-et, még ingyenes (0 Ft) csomagok esetén is. A PaymentRouter.create_payment_intent() a 62. sorban elvégzi a net_amount <= 0 validációt, ami ValueError-t dob.
Megoldás
- Adatbázis modell bővítés:
pending_tier_id(FK) éspending_activated_at(DateTime) mezők hozzáadása aUserSubscriptionésOrganizationSubscriptionmodellekhez. is_downgrade()metódus: Új statikus metódus aSubscriptionServiceosztályban, amely összehasonlítja a jelenlegi és a cél tier_level értékeket.- Free tier bypass: Ha
price <= 0, aFinancialManager.purchase_package()közvetlenül aktiválja a subscription-t, megkerülve a PaymentRouter-t. - Downgrade logika: Ha a cél tier_level < current tier_level →
pending_tier_idbeállítása, nem azonnali aktiválás. Upgrade esetén a pending flag törlése. - Downgrade Executor: Új szolgáltatás
backend/app/services/downgrade_executor.pya pending downgrade-ek aktiválására avalid_untillejárta után.
Érintett fájlok
| Fájl | Módosítás |
|---|---|
backend/app/models/core_logic.py |
+2 oszlop (pending_tier_id, pending_activated_at) mindkét subscription modellben |
backend/app/services/subscription_service.py |
Új is_downgrade() metódus |
backend/app/services/financial_manager.py |
Free tier bypass + downgrade detektálás |
backend/app/services/downgrade_executor.py |
ÚJ fájl — CRON-jellegű pending aktiváló |
backend/app/api/v1/endpoints/subscriptions.py |
has_pending_downgrade mezők a /my végpontban |
🟠 Fázis 2: Mock Payment Gateway (Szimulált Fizetés)
Gitea kártya: #430 - Issue #2: Mock Payment Gateway (Szimulált Fizetés) implementálása
Jelenlegi állapot
A MockPaymentGateway három módot támogat: auto_approve, simulate_failure, simulate_timeout. Hiányzik a valósághű fizetési flow (redirect → webhook → completion).
Megoldás
- Új mód:
simulate_redirect— Alapértelmezetté tenni.create_intent()visszaadja acheckout_url-t és arequires_actionstátuszt. - Checkout oldal:
GET /mock-payment/checkout/{intent_id}— egyszerű HTML fizetési oldal "Pay Now" gombbal. - Webhook callback:
POST /mock-payment/callback— PaymentIntent → COMPLETED státusz, subscription aktiválás. - Logging: Minden
create_intent()hívásnálMOCK_PAYMENT_REQUESTlogolás.
Érintett fájlok
| Fájl | Módosítás |
|---|---|
backend/app/services/mock_payment_gateway.py |
Új simulate_redirect mód |
backend/app/api/v1/endpoints/billing.py |
Új 2 végpont: checkout page + webhook callback |
🟡 Fázis 3: Subscription Details Card (Flip Card) adatkötés javítása
Gitea kártya: #431 - Issue #3: Subscription Details Card adatkötésének javítása
Jelenlegi állapot
A FinanceMainView.vue Card 2 a raw DB slug-ot (pl. private_pro_v1) jeleníti meg, nem mutat lejárati dátumot és járműhasználatot.
Megoldás
- Backend:
GET /auth/mebővítésesubscription_display_name,subscription_expires_at,subscription_tier_idmezőkkel. - Frontend:
auth.tsUserProfileinterface bővítése. - Frontend:
FinanceMainView.vueCard 2 template teljes átírása: fejléc, csomagnév, lejárati dátum, járműhasználati sáv, dinamikus CTA gomb. - I18n:
renewNow,upgradePlankulcsok felvétele.
Érintett fájlok
| Fájl | Módosítás |
|---|---|
backend/app/api/v1/endpoints/users.py |
+subscription_display_name, +subscription_expires_at, +subscription_tier_id |
frontend_app/src/stores/auth.ts |
UserProfile interface bővítése |
frontend_app/src/views/FinanceMainView.vue |
Card 2 template + computed property rewrite |
frontend_app/src/i18n/hu.ts |
Új kulcsok |
frontend_app/src/i18n/en.ts |
Új kulcsok |
🟢 Fázis 4: Kiegészítő csomagok (Add-ons) kosár-logika
Gitea kártya: #432 - Issue #4: Kiegészítő csomagok (Add-ons) kosár-logikájának és UI megjelenítésének integrálása
Jelenlegi állapot
A SubscriptionTier modellben létezik a type mező (base/addon), de a frontend nem jeleníti meg az addon csomagokat, és nincs kosár-logika.
Megoldás
- Backend:
GET /subscriptions/publicbővítése:base_tiersésaddon_tierskülön mezők. - Frontend:
SubscriptionPlansView.vuebase és addon csomagok szétválasztott megjelenítése. - Kosár-logika:
PlanDetailsModal.vueaddon checkboxok + összegzés. - Backend:
POST /purchase-packagebővítéseaddon_tier_idsfogadására.
Érintett fájlok
| Fájl | Módosítás |
|---|---|
backend/app/api/v1/endpoints/subscriptions.py |
base_tiers + addon_tiers szétválasztás |
backend/app/api/v1/endpoints/financial_manager.py |
addon_tier_ids paraméter fogadása |
frontend_app/src/views/SubscriptionPlansView.vue |
Base + addon szekciók |
frontend_app/src/components/subscription/PlanDetailsModal.vue |
Addon checkboxok + kosár összegzés |
frontend_app/src/i18n/hu.ts |
Addon kulcsok |
frontend_app/src/i18n/en.ts |
Addon kulcsok |
📊 Függőségi Sorrend (Kritikus!)
Fázis 1 (Backend: Free tier bypass + pending)
│
▼
Fázis 2 (Backend: Mock Payment Gateway)
│
▼
Fázis 3 (Backend + Frontend: Card adatkötés)
│
▼
Fázis 4 (Frontend: Add-on kosár)
Miért ebben a sorrendben?
- Fázis 1 nélkül a teljes csomagváltás el van törve (minden ingyenes csomagra váltás hibát dob)
- Fázis 2 nélkül a fizetési folyamat nem tesztelhető végponttól-végpontig
- Fázis 3 nélkül a frontend kártya nem mutat valós adatokat (még ha az API már helyes is)
- Fázis 4 csak azután jöhet, hogy a base csomagok kezelése stabil
🧪 Tesztelési Stratégia
Egységtesztek
test_is_downgrade()— tier_level összehasonlítástest_free_tier_bypass()— 0 Ft-os csomag nem hoz létre PaymentIntent-ettest_mock_redirect_mode()— checkout_url generálástest_mock_webhook_callback()— callback feldolgozástest_pending_downgrade_executor()— pending tier aktiválás lejárat után
Integrációs tesztek
- Teljes flow: Prémium vásárlás → azonnali aktiválás
- Teljes flow: Váltás Ingyenesre → pending_tier_id beállítás
- Teljes flow: Uprade pending downgrade alatt → pending törlés, új tier azonnal
- Addon vásárlás base csomaggal együtt
E2E tesztek (Playwright)
- Pending downgrade banner megjelenése a SubscriptionStatusWidget-ban
- "Csomagváltás folyamatban" üzenet sikeres downgrade rendelés után
- Base + addon kosár összegzés helyes megjelenítése
📎 Referenciák
logic_spec_subscription_downgrade_and_mock_payment.md— Teljes műszaki specifikációlogic_spec_subscription_card_upgrade.md— Card upgrade specifikációlogic_spec_subscription_package_filtering_bug.md— Package filtering bug specifikáció- P0 Subscription JSONB Audit — Tier JSONB struktúra audit