98 lines
3.4 KiB
Python
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())
|