STABLE: Final schema sync, optimized gitignore

This commit is contained in:
Kincses
2026-02-26 08:19:25 +01:00
parent 893f39fa15
commit 505543330a
203 changed files with 11590 additions and 9542 deletions

View File

@@ -1,107 +1,120 @@
# /opt/docker/dev/service_finder/backend/app/seed_test_scenario.py
import asyncio
import uuid
from datetime import datetime, timedelta
import logging
from datetime import datetime, timedelta, timezone
from sqlalchemy import select
from app.db.session import SessionLocal
from app.models import (
User, Organization, OrganizationMember, Asset, AssetCatalog,
AssetTelemetry, AssetFinancials, AssetCost, AssetEvent
from app.database import AsyncSessionLocal
from app.models.identity import User
from app.models.organization import Organization, OrganizationMember, OrgType
from app.models.asset import (
Asset, AssetCatalog, AssetTelemetry,
AssetFinancials, AssetCost
)
from app.models.organization import OrgType
# Sentinel naplózás
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Scenario: %(message)s')
logger = logging.getLogger("Test-Scenario")
async def seed_test_scenario():
async with SessionLocal() as db:
print("🚀 Teszt ökoszisztéma felépítése a meglévő modellek alapján...")
async with AsyncSessionLocal() as db:
logger.info("🚀 MB2.0 Teszt ökoszisztéma felépítése indul...")
# 1. Admin lekérése
admin = (await db.execute(select(User))).scalars().first()
# 1. LOGIKA: Admin (Superuser) lekérése az identity sémából
res = await db.execute(select(User).where(User.is_active == True))
admin = res.scalars().first()
if not admin:
print("❌ Hiba: Nincs admin az adatbázisban!")
logger.error("❌ Hiba: Nincs aktív felhasználó a rendszerben. Futtasd a seed_system.py-t!")
return
# 2. SZERVEZETEK (A te OrgType enumod alapján)
# Privát flotta
# 2. LOGIKA: Szervezeti struktúra felállítása
# Privát garázs
private_org = Organization(
name="Kincses Privát",
full_name="Kincses Magánflotta és Garázs",
org_type=OrgType.individual,
owner_id=admin.id
owner_id=admin.id,
folder_slug="kincses-privat-vault"
)
# Céges flotta (OrgType.business-t használunk!)
# Üzleti flotta
company_org = Organization(
name="ProfiBot Fleet",
full_name="ProfiBot Software Solutions Kft.",
org_type=OrgType.business,
owner_id=admin.id
owner_id=admin.id,
folder_slug="profibot-fleet-vault"
)
# Szolgáltatók
# Szolgáltatók (Szerviz és Üzemanyag)
service_org = Organization(
name="Mester Szerviz",
full_name="Mester Autójavító és Vizsgabázis Kft.",
org_type=OrgType.service,
owner_id=admin.id
)
gas_station = Organization(
name="MOL Digit",
full_name="MOL Digitális Töltőállomás 001",
org_type=OrgType.service_provider, # OrgType.service_provider-t használunk!
owner_id=admin.id
owner_id=admin.id,
is_active=True
)
db.add_all([private_org, company_org, service_org, gas_station])
db.add_all([private_org, company_org, service_org])
await db.flush()
# Tagságok rögzítése
db.add(OrganizationMember(user_id=admin.id, organization_id=private_org.id, role="owner"))
# Tagsági viszonyok rögzítése
db.add(OrganizationMember(user_id=admin.id, organization_id=company_org.id, role="owner"))
# 3. RÉTESZLETES JÁRMŰ ADAT (Tesla Model 3)
# 3. LOGIKA: Tesla Model 3 - Digitális Iker (Digital Twin)
# Előbb a katalógus (Gold Data)
catalog = AssetCatalog(
make="Tesla", model="Model 3", generation="Long Range",
year_from=2021, fuel_type="Electric",
make="TESLA", model="MODEL 3", generation="Long Range (2021-)",
fuel_type="electric",
factory_data={
"battery": "75 kWh", "power": "366 kW", "torque": "493 Nm",
"tire_size": "235/45 R18", "oil_type": "None (EV)"
"battery": "75 kWh", "power_kw": 366,
"tire_size": "235/45 R18", "ac_charge": "11kW"
}
)
db.add(catalog)
await db.flush()
# Majd a konkrét jármű (Asset)
vehicle = Asset(
vin="5YJ3E1EB8LF000000", license_plate="TES-777-EV",
name="Főnök Teslája", year_of_manufacture=2021,
catalog_id=catalog.id, status="active"
vin=f"5YJ3E1EB8LF{uuid.uuid4().hex[:6].upper()}",
license_plate="TES-777-EV",
name="Céges Tesla",
year_of_manufacture=2021,
catalog_id=catalog.id,
owner_org_id=company_org.id,
status="active"
)
db.add(vehicle)
await db.flush()
# Telemetria és Pénzügyi modulok
db.add(AssetTelemetry(asset_id=vehicle.id, current_mileage=45200, vqi_score=100.0, dbs_score=100.0))
db.add(AssetFinancials(asset_id=vehicle.id, acquisition_price=18500000))
# Telemetria és Pénzügyi alapok
db.add(AssetTelemetry(asset_id=vehicle.id, current_mileage=45200, vqi_score=100.0))
db.add(AssetFinancials(asset_id=vehicle.id, acquisition_price=18500000, currency="HUF"))
# 4. KÖLTSÉGEK (9 kategória szimulálása)
# 4. LOGIKA: A 9 költségtípus szimulálása
costs_data = [
("FUEL", 15000, "Szupertöltés MOL", gas_station.id),
("MAINTENANCE", 120000, "Éves szerviz + fékfolyadék", service_org.id),
("TIRES", 240000, "Michelin Pilot Sport szett", None),
("INSURANCE", 45000, "Allianz Casco", None),
("TAX", 0, "Zöld rendszám kedvezmény", None),
("TOLL", 5500, "Pest megyei e-matrica", None),
("CLEANING", 8500, "Nano bevonat + Mosás", None),
("PARKING", 2400, "Airport Parking", None),
("FINE", 0, "Nincs aktív bírság", None)
("FUEL", 12500, "Supercharger töltés"),
("MAINTENANCE", 85000, "Pollenszűrő és átvizsgálás"),
("TIRES", 280000, "Téli gumi szett"),
("INSURANCE", 32000, "Havi CASCO"),
("TAX", 15000, "Cégautóadó (szimulált)"),
("TOLL", 6500, "Éves matrica"),
("CLEANING", 4500, "Külső-belső takarítás"),
("PARKING", 1200, "Belvárosi zóna"),
("OTHER", 2500, "Szélvédőmosó folyadék")
]
for c_type, amount, desc, vendor_id in costs_data:
for c_type, amount, desc in costs_data:
db.add(AssetCost(
asset_id=vehicle.id, organization_id=company_org.id,
cost_type=c_type, amount=amount, currency="HUF",
data={"description": desc, "vendor_id": vendor_id},
date=datetime.now() - timedelta(days=2)
asset_id=vehicle.id,
organization_id=company_org.id,
cost_type=c_type,
amount=amount,
currency="HUF",
date=datetime.now(timezone.utc) - timedelta(days=2),
specifications={"description": desc}
))
await db.commit()
print("✅ Siker! Flották, Tesla és a 9 költségtípus rögzítve.")
logger.info("✅ Siker! A teljes flotta-ökoszisztéma üzemkész.")
if __name__ == "__main__":
asyncio.run(seed_test_scenario())