2026.06.04 frontend építés közben

This commit is contained in:
Roo
2026-06-04 07:26:22 +00:00
parent 7adf6cc3e3
commit 59a30ac428
3302 changed files with 24091 additions and 1771 deletions

View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""
MLM és Gamification paraméterek inicializálása a system_parameters táblába.
Futtatás: docker compose exec sf_api python3 /app/backend/scripts/init_mlm_parameters.py
"""
import asyncio
import sys
import os
sys.path.append(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
from app.models.system.parameter import SystemParameter
from app.core.config import settings
async def init_parameters():
engine = create_async_engine(settings.DATABASE_URL, echo=False)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
# MLM százalékok
mlm_params = [
("mlm_level1_percent", "10", "MLM L1 jutalék százalék (10%)", "global"),
("mlm_level2_percent", "5", "MLM L2 jutalék százalék (5%)", "global"),
("mlm_level3_percent", "3", "MLM L3 jutalék százalék (3%)", "global"),
("gamification_p2p_invite_xp", "50", "XP pontok a meghívónak sikeres KYC után", "global"),
]
for key, value, description, scope in mlm_params:
existing = await session.execute(
select(SystemParameter).where(SystemParameter.key == key)
)
if existing.scalar_one_or_none():
print(f"{key} már létezik, kihagyva.")
continue
param = SystemParameter(
key=key,
value=value,
description=description,
scope=scope,
data_type="integer" if key.endswith("_percent") else "integer",
is_editable=True,
is_visible=True,
region_code=None,
user_id=None,
)
session.add(param)
print(f"{key} = {value} beállítva.")
await session.commit()
print("✅ MLM paraméterek sikeresen inicializálva.")
if __name__ == "__main__":
asyncio.run(init_parameters())

View File

@@ -0,0 +1,57 @@
#!/usr/bin/env python3
"""
MLM és Gamification paraméterek inicializálása a system_parameters táblába.
Futtatás: docker compose exec sf_api python3 /app/backend/app/scripts/init_mlm_parameters_fixed.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
from app.models.system.system import SystemParameter, ParameterScope
from app.core.config import settings
async def init_parameters():
engine = create_async_engine(settings.DATABASE_URL, echo=False)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async with async_session() as session:
# MLM százalékok
mlm_params = [
("mlm_level1_percent", 10, "MLM L1 jutalék százalék (10%)", ParameterScope.GLOBAL),
("mlm_level2_percent", 5, "MLM L2 jutalék százalék (5%)", ParameterScope.GLOBAL),
("mlm_level3_percent", 3, "MLM L3 jutalék százalék (3%)", ParameterScope.GLOBAL),
("gamification_p2p_invite_xp", 50, "XP pontok a meghívónak sikeres KYC után", ParameterScope.GLOBAL),
]
for key, value, description, scope in mlm_params:
existing = await session.execute(
select(SystemParameter).where(SystemParameter.key == key)
)
if existing.scalar_one_or_none():
print(f"{key} már létezik, kihagyva.")
continue
param = SystemParameter(
key=key,
value={"value": value},
category="mlm",
scope_level=scope,
scope_id=None,
is_active=True,
description=description,
last_modified_by=None,
)
session.add(param)
print(f"{key} = {value} beállítva.")
await session.commit()
print("✅ MLM paraméterek sikeresen inicializálva.")
if __name__ == "__main__":
asyncio.run(init_parameters())

View File

@@ -1,6 +1,6 @@
# /opt/docker/dev/service_finder/backend/app/scripts/sync_engine.py
#!/usr/bin/env python3
# docker exec -it sf_api python -m app.scripts.sync_engine
# cd /opt/docker/dev/service_finder && docker exec -it sf_api python -m app.scripts.sync_engine
import asyncio
import importlib
import sys

View File

@@ -0,0 +1,320 @@
#!/usr/bin/env python3
"""
MLM Payout E2E teszt script.
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/backend/test_mlm_payout.py
"""
import asyncio
import sys
import os
sys.path.append(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
from app.models.finance.wallet import Wallet, Ledger, WalletType, TransactionType
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 ===")
# 1. Teszt adatok létrehozása (ha nincsenek)
# Létrehozunk egy L1, L2, L3, L4 (fizető) usert láncolatban
print("1. Teszt userek létrehozása...")
# Ellenőrizzük, hogy van-e már teszt user
existing = await session.execute(select(User).where(User.email == "test_l1@example.com"))
l1_user = existing.scalar_one_or_none()
if not l1_user:
# L1 user (root meghívó)
l1_person = Person(
first_name="L1",
last_name="Referrer",
is_active=True,
identity_docs={},
ice_contact={},
lifetime_xp=0,
penalty_points=0,
social_reputation=1.0,
is_sales_agent=False,
is_ghost=False,
)
session.add(l1_person)
await session.flush()
l1_user = User(
email="test_l1@example.com",
hashed_password="$2b$12$...", # dummy
person_id=l1_person.id,
role="user",
is_active=True,
is_deleted=False,
region_code="HU",
preferred_language="hu",
subscription_plan="FREE",
is_vip=True,
preferred_currency="HUF",
scope_level="individual",
custom_permissions={},
referral_code="L1REF123",
referred_by_id=None,
)
session.add(l1_user)
await session.flush()
print(f" L1 user létrehozva: ID={l1_user.id}, kód={l1_user.referral_code}")
# L2 user (L1 meghívja)
existing = await session.execute(select(User).where(User.email == "test_l2@example.com"))
l2_user = existing.scalar_one_or_none()
if not l2_user:
l2_person = Person(
first_name="L2",
last_name="Referral",
is_active=True,
identity_docs={},
ice_contact={},
lifetime_xp=0,
penalty_points=0,
social_reputation=1.0,
is_sales_agent=False,
is_ghost=False,
)
session.add(l2_person)
await session.flush()
l2_user = User(
email="test_l2@example.com",
hashed_password="$2b$12$...",
person_id=l2_person.id,
role="user",
is_active=True,
is_deleted=False,
region_code="HU",
preferred_language="hu",
subscription_plan="FREE",
is_vip=True,
preferred_currency="HUF",
scope_level="individual",
custom_permissions={},
referral_code="L2REF456",
referred_by_id=l1_user.id,
)
session.add(l2_user)
await session.flush()
print(f" L2 user létrehozva: ID={l2_user.id}, kód={l2_user.referral_code}, referred_by={l2_user.referred_by_id}")
# L3 user (L2 meghívja)
existing = await session.execute(select(User).where(User.email == "test_l3@example.com"))
l3_user = existing.scalar_one_or_none()
if not l3_user:
l3_person = Person(
first_name="L3",
last_name="Referral",
is_active=True,
identity_docs={},
ice_contact={},
lifetime_xp=0,
penalty_points=0,
social_reputation=1.0,
is_sales_agent=False,
is_ghost=False,
)
session.add(l3_person)
await session.flush()
l3_user = User(
email="test_l3@example.com",
hashed_password="$2b$12$...",
person_id=l3_person.id,
role="user",
is_active=True,
is_deleted=False,
region_code="HU",
preferred_language="hu",
subscription_plan="FREE",
is_vip=True,
preferred_currency="HUF",
scope_level="individual",
custom_permissions={},
referral_code="L3REF789",
referred_by_id=l2_user.id,
)
session.add(l3_user)
await session.flush()
print(f" L3 user létrehozva: ID={l3_user.id}, kód={l3_user.referral_code}, referred_by={l3_user.referred_by_id}")
# L4 user (fizető, L3 meghívja)
existing = await session.execute(select(User).where(User.email == "test_l4_payer@example.com"))
l4_user = existing.scalar_one_or_none()
if not l4_user:
l4_person = Person(
first_name="L4",
last_name="Payer",
is_active=True,
identity_docs={},
ice_contact={},
lifetime_xp=0,
penalty_points=0,
social_reputation=1.0,
is_sales_agent=False,
is_ghost=False,
)
session.add(l4_person)
await session.flush()
l4_user = User(
email="test_l4_payer@example.com",
hashed_password="$2b$12$...",
person_id=l4_person.id,
role="user",
is_active=True,
is_deleted=False,
region_code="HU",
preferred_language="hu",
subscription_plan="FREE",
is_vip=True,
preferred_currency="HUF",
scope_level="individual",
custom_permissions={},
referral_code="L4REF999",
referred_by_id=l3_user.id,
)
session.add(l4_user)
await session.flush()
print(f" L4 (fizető) user létrehozva: ID={l4_user.id}, referred_by={l4_user.referred_by_id}")
await session.commit()
# 2. MLM paraméterek lekérése
print("\n2. 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!")
# 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 = []
current = l4_user
for i in range(3):
if current.referred_by_id:
stmt = select(User).where(User.id == current.referred_by_id)
referrer = (await session.execute(stmt)).scalar_one_or_none()
if referrer:
chain.append(referrer)
current = referrer
else:
break
else:
break
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
print("\n5. Jutalékok kiszámítása és CREDIT Wallet jóváírás...")
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 vagy létrehozása
wallet_stmt = select(Wallet).where(
Wallet.user_id == referrer.id,
Wallet.wallet_type == WalletType.CREDIT
)
wallet = (await session.execute(wallet_stmt)).scalar_one_or_none()
if not wallet:
wallet = Wallet(
user_id=referrer.id,
currency="HUF",
wallet_type=WalletType.CREDIT,
balance=Decimal("0.00"),
is_active=True
)
session.add(wallet)
await session.flush()
# Balance frissítése
wallet.balance += commission
# Ledger bejegyzés
ledger = Ledger(
wallet_id=wallet.id,
amount=commission,
transaction_type=TransactionType.MLM_CREDIT,
description=f"MLM jutalék L{idx+1} a(z) {l4_user.email} fizetéséből",
reference_id=l4_user.id,
reference_type="user_payment",
metadata={
"payer_id": l4_user.id,
"payer_email": l4_user.email,
"level": idx+1,
"percent": percent,
"original_amount": float(payment_amount)
}
)
session.add(ledger)
await session.commit()
# 6. Ellenőrzés
print("\n6. Ellenőrzés - CREDIT Wallet egyenlegek:")
for idx, referrer in enumerate(chain):
if idx >= 3:
break
wallet_stmt = select(Wallet).where(
Wallet.user_id == referrer.id,
Wallet.wallet_type == WalletType.CREDIT
)
wallet = (await session.execute(wallet_stmt)).scalar_one_or_none()
if wallet:
print(f" L{idx+1} ({referrer.email}): {wallet.balance} HUF")
else:
print(f" L{idx+1} ({referrer.email}): NINCS CREDIT Wallet!")
# 7. Ledger bejegyzések listázása
print("\n7. Ledger bejegyzések:")
for referrer in chain[:3]:
wallet_stmt = select(Wallet).where(
Wallet.user_id == referrer.id,
Wallet.wallet_type == WalletType.CREDIT
)
wallet = (await session.execute(wallet_stmt)).scalar_one_or_none()
if wallet:
ledger_stmt = select(Ledger).where(Ledger.wallet_id == wallet.id).order_by(Ledger.created_at.desc()).limit(2)
ledgers = (await session.execute(ledger_stmt)).scalars().all()
for l in ledgers:
print(f" - {referrer.email}: {l.amount} HUF ({l.transaction_type}) - {l.description}")
print("\n✅ MLM Payout teszt sikeresen lefutott!")
print("=== TESZT VÉGE ===")
if __name__ == "__main__":
asyncio.run(test_mlm_payout())

View File

@@ -0,0 +1,145 @@
#!/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())