#!/usr/bin/env python3 """ Garázs adatok ellenőrzése és javítása. Ez a szkript ellenőrzi a teszt felhasználó szervezeti státuszát, és felosztja a járműveket privát és céges flotta között. Futtatás: docker compose exec sf_api python -m app.scripts.check_and_fix_garage_data """ import asyncio import sys from sqlalchemy import select, update from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload # Add the backend directory to the path sys.path.insert(0, '/app') from app.db.session import AsyncSessionLocal from app.models.identity import User from app.models.marketplace.organization import Organization, OrganizationMember from app.models.vehicle.asset import Asset # AssetCatalog is inside the asset module async def main(): """Fő végrehajtási logika.""" print("=" * 60) print("GARÁZS ADATOK ELLENŐRZÉSE ÉS JAVÍTÁSA") print("=" * 60) async with AsyncSessionLocal() as db: # 1. Keressük meg a teszt felhasználót print("\n1. TESZT FELHASZNÁLÓ KERESÉSE...") stmt = select(User).where(User.email == "tester_pro@profibot.hu") result = await db.execute(stmt) test_user = result.scalar_one_or_none() if not test_user: print("❌ HIBA: A teszt felhasználó (tester_pro@profibot.hu) nem található!") return print(f" ✅ Teszt felhasználó megtalálva: ID={test_user.id}, Email={test_user.email}") # 2. Ellenőrizzük, hogy a felhasználóhoz tartozik-e szervezet print("\n2. SZERVEZETI TAGSÁG ELLENŐRZÉSE...") org_stmt = ( select(Organization) .join(OrganizationMember) .where(OrganizationMember.user_id == test_user.id) .where(Organization.is_deleted == False) .where(Organization.is_active == True) ) org_result = await db.execute(org_stmt) user_organizations = org_result.scalars().all() if user_organizations: print(f" ✅ A felhasználó már tagja {len(user_organizations)} szervezetnek:") for org in user_organizations: print(f" - {org.name} (ID: {org.id}, Adószám: {org.tax_number})") target_org = user_organizations[0] else: print(" ℹ️ A felhasználó nem tagja egyetlen szervezetnek sem. Új szervezet létrehozása...") # Új szervezet létrehozása new_org = Organization( full_name="Teszt Flotta Kft.", name="Teszt Flotta", display_name="Teszt Flotta Kft.", tax_number="12345678-2-42", reg_number="01-23-456789", country_code="HU", language="hu", default_currency="HUF", address_zip="1234", address_city="Budapest", address_street_name="Teszt utca", address_street_type="utca", address_house_number="1", folder_slug="teszt-flotta", org_type="business", status="active", is_active=True, is_deleted=False, subscription_plan="FREE", base_asset_limit=10, owner_id=test_user.id ) db.add(new_org) await db.flush() # ID generáláshoz await db.refresh(new_org) # Szervezeti tagság létrehozása (ADMIN szerepkör) org_member = OrganizationMember( organization_id=new_org.id, user_id=test_user.id, role="ADMIN" ) db.add(org_member) await db.commit() await db.refresh(new_org) target_org = new_org print(f" ✅ Új szervezet létrehozva: {target_org.name} (ID: {target_org.id})") # 3. A felhasználó összes járművének lekérdezése print("\n3. FELHASZNÁLÓ JÁRMŰVEINEK LEKÉRDEZÉSE...") asset_stmt = ( select(Asset) .where(Asset.owner_person_id == test_user.id) .options(selectinload(Asset.catalog)) ) asset_result = await db.execute(asset_stmt) user_assets = asset_result.scalars().all() print(f" ✅ Összesen {len(user_assets)} jármű található a felhasználóhoz.") if not user_assets: print(" ℹ️ Nincsenek járművek a felhasználóhoz. Nincs mit felosztani.") return # 4. Járművek felosztása privát és céges között print("\n4. JÁRMŰVEK FELOSZTÁSA PRIVÁT ÉS CÉGES FLOTTA KÖZÖTT...") # Számoljuk meg, hány jármű van már privát és hány céges private_count = 0 corporate_count = 0 for asset in user_assets: if asset.owner_org_id is None: private_count += 1 else: corporate_count += 1 print(f" Jelenlegi állapot: {private_count} privát, {corporate_count} céges jármű") # Ha minden jármű ugyanabban a kategóriában van, felosztjuk őket if private_count == 0 or corporate_count == 0: print(" ℹ️ Járművek újraelosztása 50-50% arányban...") # Felosztás fele-fele arányban half_index = len(user_assets) // 2 for i, asset in enumerate(user_assets): if i < half_index: # Első fele: maradjon privát (owner_org_id = None) if asset.owner_org_id is not None: asset.owner_org_id = None print(f" 🚗 {asset.id}: Privát módra állítva") else: # Második fele: legyen céges (owner_org_id = target_org.id) if asset.owner_org_id != target_org.id: asset.owner_org_id = target_org.id print(f" 🏢 {asset.id}: Céges flottához rendelve (Szervezet: {target_org.name})") await db.commit() print(f" ✅ {half_index} jármű privát, {len(user_assets) - half_index} jármű céges módra állítva.") else: print(" ✅ A járművek már megfelelően fel vannak osztva. Nincs szükség módosításra.") # 5. Végeredmény összefoglaló print("\n" + "=" * 60) print("VÉGEREDMÉNY ÖSSZEFOGLALÓ") print("=" * 60) # Új lekérdezés a frissített adatokhoz asset_result = await db.execute(asset_stmt) user_assets = asset_result.scalars().all() private_assets = [a for a in user_assets if a.owner_org_id is None] corporate_assets = [a for a in user_assets if a.owner_org_id == target_org.id] other_assets = [a for a in user_assets if a.owner_org_id not in [None, target_org.id]] print(f"\n📊 TESZT FELHASZNÁLÓ ÁLLAPOTA:") print(f" • Email: {test_user.email}") print(f" • User ID: {test_user.id}") print(f" • Aktív szervezet: {target_org.name} (ID: {target_org.id})") print(f" • Szerepkör a szervezetben: ADMIN") print(f"\n🚗 JÁRMŰVEGYÜTT ÁLLAPOTA:") print(f" • Összes jármű: {len(user_assets)} db") print(f" • Privát garázs (owner_org_id = NULL): {len(private_assets)} db") print(f" • Céges flotta ({target_org.name}): {len(corporate_assets)} db") if other_assets: print(f" • Egyéb szervezetekhez rendelve: {len(other_assets)} db") print(f"\n📋 PRIVÁT JÁRMŰVEK:") for asset in private_assets[:5]: # Csak az első 5-öt mutatjuk catalog_name = asset.catalog.make + " " + asset.catalog.model if asset.catalog else "Ismeretlen" print(f" • {catalog_name} (Asset ID: {asset.id})") if len(private_assets) > 5: print(f" • ... és még {len(private_assets) - 5} további") print(f"\n🏢 CÉGES JÁRMŰVEK:") for asset in corporate_assets[:5]: catalog_name = asset.catalog.make + " " + asset.catalog.model if asset.catalog else "Ismeretlen" print(f" • {catalog_name} (Asset ID: {asset.id})") if len(corporate_assets) > 5: print(f" • ... és még {len(corporate_assets) - 5} további") print("\n" + "=" * 60) print("A tesztadatok sikeresen előkészítve!") print("Most tesztelhető a Garage UI switcher funkció.") print("=" * 60) if __name__ == "__main__": asyncio.run(main())