#!/usr/bin/env python3 """ MLM Payout E2E teszt script (egyszerűsített). Szimulál egy előfizetési fizetést (10,000 HUF) és ellenőrzi a CREDIT Wallet jóváírásokat L1, L2, L3 usereknek. Futtatás: docker compose exec sf_api python3 /app/app/scripts/test_mlm_payout_simple.py """ import asyncio import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from sqlalchemy import select, update, func from decimal import Decimal from app.models.identity import User, Person, Wallet from app.models.system.system import SystemParameter from app.core.config import settings async def test_mlm_payout(): engine = create_async_engine(settings.DATABASE_URL, echo=True) async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as session: print("=== MLM Payout E2E Teszt (Egyszerűsített) ===") # 1. MLM paraméterek lekérése print("\n1. MLM paraméterek lekérése...") params = {} for key in ["mlm_level1_percent", "mlm_level2_percent", "mlm_level3_percent"]: stmt = select(SystemParameter).where(SystemParameter.key == key) param = (await session.execute(stmt)).scalar_one_or_none() if param: params[key] = int(param.value.get("value", 0)) print(f" {key}: {params[key]}%") else: params[key] = 0 print(f" {key}: NINCS BEÁLLÍTVA!") # 2. Meglévő teszt userek keresése vagy létrehozása print("\n2. Teszt userek keresése...") # L1 user keresése (root meghívó) l1_stmt = select(User).where(User.email == "test_l1@example.com") l1_user = (await session.execute(l1_stmt)).scalar_one_or_none() if not l1_user: print(" L1 user nem létezik, teszt adatok hiányoznak.") print(" Futtasd először az init_mlm_parameters_fixed.py-t és regisztrálj néhány teszt usert!") return # L2 user keresése (L1 meghívja) l2_stmt = select(User).where(User.email == "test_l2@example.com") l2_user = (await session.execute(l2_stmt)).scalar_one_or_none() # L3 user keresése (L2 meghívja) l3_stmt = select(User).where(User.email == "test_l3@example.com") l3_user = (await session.execute(l3_stmt)).scalar_one_or_none() # L4 user keresése (fizető, L3 meghívja) l4_stmt = select(User).where(User.email == "test_l4_payer@example.com") l4_user = (await session.execute(l4_stmt)).scalar_one_or_none() users = [l1_user, l2_user, l3_user, l4_user] user_names = ["L1", "L2", "L3", "L4 (fizető)"] for idx, (user, name) in enumerate(zip(users, user_names)): if user: print(f" {name}: {user.email} (ID: {user.id}, referred_by: {user.referred_by_id})") else: print(f" {name}: NEM LÉTEZIK") # 3. Szimulált fizetés (10,000 HUF) payment_amount = Decimal("10000.00") print(f"\n3. Szimulált fizetés: {payment_amount} HUF (L4 user fizet)") # 4. MLM lánc felépítése print("\n4. MLM lánc felépítése...") chain = [] if l4_user and l4_user.referred_by_id: # L3 keresése if l3_user and l3_user.id == l4_user.referred_by_id: chain.append(l3_user) # L2 keresése if l3_user.referred_by_id: if l2_user and l2_user.id == l3_user.referred_by_id: chain.append(l2_user) # L1 keresése if l2_user.referred_by_id: if l1_user and l1_user.id == l2_user.referred_by_id: chain.append(l1_user) print(f" Lánc hossza: {len(chain)}") for idx, user in enumerate(chain): print(f" L{idx+1}: {user.email} (ID: {user.id})") # 5. Jutalékok kiszámítása és CREDIT Wallet jóváírás (szimuláció) print("\n5. Jutalékok kiszámítása (szimuláció)...") levels = ["mlm_level1_percent", "mlm_level2_percent", "mlm_level3_percent"] for idx, referrer in enumerate(chain): if idx >= 3: break percent = params[levels[idx]] commission = (payment_amount * Decimal(percent) / Decimal(100)).quantize(Decimal("0.01")) print(f" L{idx+1} ({referrer.email}): {percent}% -> {commission} HUF") # CREDIT Wallet keresése wallet_stmt = select(Wallet).where( Wallet.user_id == referrer.id ) wallet = (await session.execute(wallet_stmt)).scalar_one_or_none() if wallet: print(f" Wallet megtalálva: {wallet.balance} {wallet.currency}") # Szimulált jóváírás new_balance = wallet.balance + commission print(f" Új egyenleg: {new_balance} {wallet.currency}") else: print(f" NINCS Wallet a usernek!") # 6. API végpont tesztelése (GET /me/network) print("\n6. API végpont tesztelése (GET /me/network)...") if l1_user: # L1 hálózatának lekérdezése network_stmt = select(User).where(User.referred_by_id == l1_user.id) network_result = await session.execute(network_stmt) network_users = network_result.scalars().all() print(f" L1 ({l1_user.email}) közvetlen meghívottai: {len(network_users)}") for u in network_users: print(f" - {u.email} (kód: {u.referral_code})") print("\n✅ MLM Payout teszt (szimuláció) sikeresen lefutott!") print("=== TESZT VÉGE ===") print("\nJAVASLAT: A teljes teszteléshez:") print("1. Regisztrálj 4 teszt usert láncolatban (L1 -> L2 -> L3 -> L4)") print("2. Futtasd a valós billing engine-t a payment success eseménnyel") print("3. Ellenőrizd a CREDIT Wallet egyenlegeket a pgAdmin-ban") if __name__ == "__main__": asyncio.run(test_mlm_payout())