2026.03.30 front és garázs logika
This commit is contained in:
211
backend/app/scripts/check_and_fix_garage_data.py
Normal file
211
backend/app/scripts/check_and_fix_garage_data.py
Normal 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())
|
||||
Reference in New Issue
Block a user