#!/usr/bin/env python3 """ Seed script: CostCategory min_tier beállítása. A szkript beállítja a költségkategóriák min_tier mezőjét a kód alapján. A tier-ek hierarchikusak: free < premium < enterprise. Kategória tier hozzárendelés: - FUEL, SERVICE, TIRES, INSURANCE, TAXES -> free - TOLL_PARKING, CLEANING, OTHER -> premium - (minden más) -> enterprise Használat: docker compose exec sf_api python -m backend.scripts.seed_cost_category_tiers """ import asyncio import logging from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker from sqlalchemy import select, text from app.core.config import settings from app.models.vehicle.vehicle import CostCategory logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Tier mapping by category code # A fő kategóriák (parent_id IS NULL) tier beállításai. # Az alkategóriák (pl. FUEL_PETROL, MAINT_SERVICE) öröklik a szülő tier-jét. CATEGORY_TIER_MAP = { "FUEL": "free", # Üzemanyag / Töltés "MAINTENANCE": "free", # Szerviz & Karbantartás "TIRES": "free", # Gumiabroncsok "INSURANCE": "free", # Biztosítás "TAX": "free", # Adók "FEES": "premium", # Útdíj & Parkolás "ADMIN": "premium", # Hatósági díjak "FINANCE": "premium", # Finanszírozás "CLEANING": "premium", # Ápolás & Kozmetika "OTHER": "premium", # Egyéb } # Default tier for categories not in the map DEFAULT_TIER = "enterprise" async def seed_cost_category_tiers(): """Beállítja a min_tier értékeket az összes CostCategory rekordra.""" engine = create_async_engine(str(settings.SQLALCHEMY_DATABASE_URI)) async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as db: try: # Lekérjük az összes kategóriát stmt = select(CostCategory).order_by(CostCategory.id) result = await db.execute(stmt) categories = result.scalars().all() if not categories: logger.warning("❌ Nincsenek CostCategory rekordok az adatbázisban!") return updated_count = 0 for cat in categories: # Meghatározzuk a tier-t a kód alapján new_tier = CATEGORY_TIER_MAP.get(cat.code, DEFAULT_TIER) # Csak akkor frissítjük, ha még nincs beállítva, vagy változott if cat.min_tier != new_tier: cat.min_tier = new_tier updated_count += 1 logger.info( f" ✅ [{cat.code:15s}] {cat.name:30s} -> tier={new_tier}" ) if updated_count > 0: await db.commit() logger.info(f"\n✅ {updated_count} kategória tier beállítva.") else: logger.info("\n✅ Minden kategória tier már be van állítva.") # Összesítő logger.info("\n📊 Tier összesítő:") for cat in categories: logger.info(f" [{cat.min_tier:10s}] {cat.code:15s} - {cat.name}") except Exception as e: await db.rollback() logger.error(f"❌ Hiba a seedelés során: {e}") raise finally: await engine.dispose() if __name__ == "__main__": asyncio.run(seed_cost_category_tiers())