Files
service-finder/backend/scripts/seed_cost_category_tiers.py

98 lines
3.4 KiB
Python

#!/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())