import asyncio import os from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy import text from dotenv import load_dotenv load_dotenv() # Cím beállítása raw_url = os.getenv("DATABASE_URL") if not raw_url: raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") async def build_db(): print(f"🔌 Kapcsolódás a rendszerhez...") engine = create_async_engine(DATABASE_URL) async with engine.begin() as conn: print("🏗️ 'DATA' séma előkészítése...") await conn.execute(text("CREATE SCHEMA IF NOT EXISTS data;")) # 1. FELHASZNÁLÓK TÁBLA (Céges/Magán logika) print("👤 Users tábla létrehozása...") await conn.execute(text(""" CREATE TABLE IF NOT EXISTS data.users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role VARCHAR(20) DEFAULT 'PRIVATE', -- 'PRIVATE', 'COMPANY', 'ADMIN' company_name VARCHAR(255), -- Ha cég tax_number VARCHAR(50), -- Ha cég is_active BOOLEAN DEFAULT FALSE, -- Email megerősítésig created_at TIMESTAMP DEFAULT NOW() ); """)) # 2. JÁRMŰ TÖRZS (A Fizikai Vas - Tulajdonos nélkül!) print("🚗 Vehicles tábla létrehozása (A Vas)...") await conn.execute(text(""" CREATE TABLE IF NOT EXISTS data.vehicles ( id SERIAL PRIMARY KEY, model_id INTEGER REFERENCES ref.vehicle_models(id), vin VARCHAR(50) UNIQUE NOT NULL, -- ALVÁZSZÁM (Az igazi kulcs) current_plate VARCHAR(20) NOT NULL, -- A mostani rendszám production_year INTEGER, created_at TIMESTAMP DEFAULT NOW() ); """)) # 3. ÉLETÚT ÉS JOGOSULTSÁG (A Történelem) print("📜 History tábla létrehozása (Kié mikor volt?)...") await conn.execute(text(""" CREATE TABLE IF NOT EXISTS data.vehicle_history ( id SERIAL PRIMARY KEY, vehicle_id INTEGER REFERENCES data.vehicles(id), user_id INTEGER REFERENCES data.users(id), role VARCHAR(20) NOT NULL, -- 'OWNER' (Tulaj), 'DRIVER' (Sofőr), 'LEASE' (Lízingelő) start_date DATE NOT NULL, -- Mikor vette át? end_date DATE, -- Mikor adta le? (Ha NULL, akkor nála van!) start_mileage INTEGER, -- Óraállás átvételkor end_mileage INTEGER, -- Óraállás leadáskor is_active BOOLEAN GENERATED ALWAYS AS (end_date IS NULL) STORED -- Segédmező a gyors kereséshez ); """)) # 4. KÖLTSÉGEK (Szeparált pénzügyek) print("💸 Costs tábla létrehozása...") await conn.execute(text(""" CREATE TABLE IF NOT EXISTS data.costs ( id SERIAL PRIMARY KEY, vehicle_id INTEGER REFERENCES data.vehicles(id), user_id INTEGER REFERENCES data.users(id), -- Ki fizette? (Csak ő láthatja!) cost_type VARCHAR(50) NOT NULL, -- FUEL, SERVICE, TAX, INSURANCE, LEASE... amount DECIMAL(10, 2) NOT NULL, date DATE NOT NULL, mileage_at_cost INTEGER, description TEXT, document_url VARCHAR(255), -- Fotó linkje created_at TIMESTAMP DEFAULT NOW() ); """)) print("✅ KÉSZ! A Professzionális Adatmodell felépült.") await engine.dispose() if __name__ == "__main__": asyncio.run(build_db())