2026.03.30 front és garázs logika

This commit is contained in:
Roo
2026-03-30 06:32:22 +00:00
parent ba8b6579ef
commit 2508ae7452
108 changed files with 3184 additions and 115 deletions

View File

@@ -0,0 +1,211 @@
#!/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())