211 lines
8.7 KiB
Python
211 lines
8.7 KiB
Python
#!/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()) |