import asyncio import logging import uuid from sqlalchemy import select from app.db.session import SessionLocal from app.models import ( User, Person, UserRole, SystemParameter, PointRule, LevelConfig, SubscriptionTier, UserStats ) from app.core.security import get_password_hash from app.core.config import settings logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def seed_data(): async with SessionLocal() as db: logger.info("🚀 Alapadatok feltöltĂ©se biztonsĂĄgos mĂłdban...") admin_email = settings.INITIAL_ADMIN_EMAIL admin_password = settings.INITIAL_ADMIN_PASSWORD if not admin_email or not admin_password: logger.error("❌ HIBA: INITIAL_ADMIN_EMAIL vagy PASSWORD nincs beĂĄllĂ­tva!") return stmt = select(User).where(User.email == admin_email) admin_exists = (await db.execute(stmt)).scalar_one_or_none() if not admin_exists: new_person = Person( first_name="Rendszer", last_name="AdminisztrĂĄtor", id_uuid=uuid.uuid4() ) db.add(new_person) await db.flush() new_admin = User( email=admin_email, hashed_password=get_password_hash(admin_password), role=UserRole.admin, is_active=True, # JAVÍTÁS: is_verified eltĂĄvolĂ­tva, mert nincs ilyen mezƑ a modellben person_id=new_person.id ) db.add(new_admin) await db.flush() db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1)) logger.info(f"✅ Admin lĂ©trehozva: {admin_email}") # --- 1. ÉrtĂ©kelĂ©si szempontok (Admin Motor) --- criteria_key = "ASSET_REVIEW_CRITERIA" stmt_crit = select(SystemParameter).where(SystemParameter.key == criteria_key) if not (await db.execute(stmt_crit)).scalar_one_or_none(): db.add(SystemParameter( key=criteria_key, value=["KĂ©nyelem", "FogyasztĂĄs", "MegbĂ­zhatĂłsĂĄg", "VezetĂ©si Ă©lmĂ©ny", "SzervizigĂ©ny"], description="JĂĄrmƱértĂ©kelĂ©si szempontok" )) # --- 2. Gamification PontszabĂĄlyok --- rules = [ ("ASSET_REGISTER", 100, "Új jĂĄrmƱ felvĂ©tele"), ("ASSET_REVIEW", 75, "JĂĄrmƱ Ă©rtĂ©kelĂ©se"), ("COST_RECORD", 50, "KöltsĂ©g/TankolĂĄs rögzĂ­tĂ©se") ] for key, pts, desc in rules: stmt_rule = select(PointRule).where(PointRule.action_key == key) if not (await db.execute(stmt_rule)).scalar_one_or_none(): db.add(PointRule(action_key=key, points=pts, description=desc)) # --- 3. Gamification Szintek --- stmt_level = select(LevelConfig) if not (await db.execute(stmt_level)).first(): db.add_all([ LevelConfig(level_number=1, min_points=0, rank_name="KezdƑ SofƑr"), LevelConfig(level_number=2, min_points=500, rank_name="Tapasztalt VezetƑ"), LevelConfig(level_number=3, min_points=2000, rank_name="Flotta Mester") ]) # --- 4. ElƑfizetĂ©si csomagok (MVP korlĂĄtok) --- stmt_tier = select(SubscriptionTier) if not (await db.execute(stmt_tier)).first(): db.add_all([ SubscriptionTier(name="Ingyenes", rules={"max_assets": 1, "reports": False}), SubscriptionTier(name="PrĂ©mium", rules={"max_assets": 5, "reports": True}), SubscriptionTier(name="Flotta", rules={"max_assets": 100, "reports": True}) ]) await db.commit() logger.info("✹ A rendszer alapadatai Ă©s a Gamification motor kĂ©szen ĂĄll!") if __name__ == "__main__": asyncio.run(seed_data())