From b84b1bab4160f63598faa60ec744638b71eb9b66 Mon Sep 17 00:00:00 2001 From: Roo Date: Fri, 5 Jun 2026 14:45:02 +0000 Subject: [PATCH] =?UTF-8?q?bel=C3=A9p=C3=A9s=20j=C3=B3,=20rgisztr=C3=A1ci?= =?UTF-8?q?=C3=B3n=20kicsit=20faragni=20kell=20m=C3=A9g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/endpoints/auth.py | 10 +- backend/app/api/v1/endpoints/users.py | 23 +- backend/app/schemas/user.py | 21 +- docs/vehicle_api_frontend_architecture.md | 251 +++++++++++++++++++++ frontend/src/stores/auth.ts | 19 ++ frontend/src/views/ProfileView.vue | 35 ++- tests/active/e2e_profile_address.py_old | 253 ++++++++++++++++++++++ 7 files changed, 570 insertions(+), 42 deletions(-) create mode 100644 docs/vehicle_api_frontend_architecture.md create mode 100644 tests/active/e2e_profile_address.py_old diff --git a/backend/app/api/v1/endpoints/auth.py b/backend/app/api/v1/endpoints/auth.py index 7c036cd..72350a7 100755 --- a/backend/app/api/v1/endpoints/auth.py +++ b/backend/app/api/v1/endpoints/auth.py @@ -294,9 +294,15 @@ async def complete_kyc(kyc_in: UserKYCComplete, db: AsyncSession = Depends(get_d return {"status": "success", "message": "Fiók aktiválva."} @router.get("/me") -async def get_current_user_profile(current_user: User = Depends(get_current_user)): +async def get_current_user_profile( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user), +): """ Return current user profile (alias for /users/me). + Uses _build_user_response() to ensure proper address field mapping. """ from app.schemas.user import UserResponse - return UserResponse.model_validate(current_user) \ No newline at end of file + from app.api.v1.endpoints.users import _build_user_response + response_data = _build_user_response(current_user) + return UserResponse.model_validate(response_data) \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/users.py b/backend/app/api/v1/endpoints/users.py index dfe45d9..120b376 100755 --- a/backend/app/api/v1/endpoints/users.py +++ b/backend/app/api/v1/endpoints/users.py @@ -68,15 +68,15 @@ def _build_user_response(user: User, active_org_id: Optional[int] = None) -> dic address_data = None if person.address: address_data = { - "zip": getattr(person.address, 'zip', None) or getattr(getattr(person.address, 'postal_code', None), 'zip_code', None), - "city": getattr(person.address, 'city', None) or getattr(getattr(person.address, 'postal_code', None), 'city', None), - "street_name": person.address.street_name, - "street_type": person.address.street_type, - "house_number": person.address.house_number, - "stairwell": person.address.stairwell, - "floor": person.address.floor, - "door": person.address.door, - "parcel_id": person.address.parcel_id, + "address_zip": getattr(person.address, 'zip', None) or getattr(getattr(person.address, 'postal_code', None), 'zip_code', None), + "address_city": getattr(person.address, 'city', None) or getattr(getattr(person.address, 'postal_code', None), 'city', None), + "address_street_name": person.address.street_name, + "address_street_type": person.address.street_type, + "address_house_number": person.address.house_number, + "address_stairwell": person.address.stairwell, + "address_floor": person.address.floor, + "address_door": person.address.door, + "address_hrsz": person.address.parcel_id, "full_address_text": person.address.full_address_text, "latitude": person.address.latitude, "longitude": person.address.longitude, @@ -249,13 +249,12 @@ async def update_my_person( ) if addr_id: person.address_id = addr_id + # EXPLICIT betöltjük az új címet a memóriába, hogy felülírjuk a régit! + person.address = await db.get(Address, addr_id) try: await db.commit() - # Refresh to get the latest state await db.refresh(person) - if person.address: - await db.refresh(person.address) except SQLAlchemyError as e: await db.rollback() raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py index 122d8b6..ee134a3 100755 --- a/backend/app/schemas/user.py +++ b/backend/app/schemas/user.py @@ -6,16 +6,17 @@ from datetime import date, datetime class AddressResponse(BaseModel): - """Beágyazott cím adatok a PersonResponse számára.""" - zip: Optional[str] = None - city: Optional[str] = None - street_name: Optional[str] = None - street_type: Optional[str] = None - house_number: Optional[str] = None - stairwell: Optional[str] = None - floor: Optional[str] = None - door: Optional[str] = None - parcel_id: Optional[str] = None + """Beágyazott cím adatok a PersonResponse számára. + A mezőnevek address_ előtaggal egyeznek a frontend által várt PersonUpdate formátummal.""" + address_zip: Optional[str] = None + address_city: Optional[str] = None + address_street_name: Optional[str] = None + address_street_type: Optional[str] = None + address_house_number: Optional[str] = None + address_stairwell: Optional[str] = None + address_floor: Optional[str] = None + address_door: Optional[str] = None + address_hrsz: Optional[str] = None full_address_text: Optional[str] = None latitude: Optional[float] = None longitude: Optional[float] = None diff --git a/docs/vehicle_api_frontend_architecture.md b/docs/vehicle_api_frontend_architecture.md new file mode 100644 index 0000000..3783314 --- /dev/null +++ b/docs/vehicle_api_frontend_architecture.md @@ -0,0 +1,251 @@ +# 🚗 Service Finder - Jármű API és Frontend Architektúra Elemzés + +> **Verzió:** 1.0 +> **Dátum:** 2026-06-05 +> **Szerző:** Rendszer-Architect +> **Cél:** A backend jármű API teljes áttekintése és frontend csoportosítási javaslat + +--- + +## 1. 📊 Backend API Réteg - Teljes Végpont Térkép + +A FastAPI routerek a `backend/app/api/v1/api.py` fájlban vannak összefogva. Az összes járművel kapcsolatos végpont az alábbi prefixek alatt fut: + +### 1.1 `/assets` prefix - Jármű (Asset) Menedzsment + +**Router:** `backend/app/api/v1/endpoints/assets.py` + +| Metódus | Végpont | Cél | Adatbázis kapcsolat | +|---------|---------|-----|---------------------| +| GET | /assets/vehicles | Felhasználó járműveinek listázása (Garázs). Paginált. Támogatja: személyes mód (owner/operator) és vállalati mód (szervezet garázsai/Branch-ek). | Asset - vehicle.assets tábla | +| POST | /assets/vehicles | Új jármű hozzáadása vagy meglévő igénylése. Ellenőrzi a járműlimitet, kezeli a VIN duplikációt, XP jutalmat ad. | Asset | +| GET | /assets/{asset_id} | Jármű részletes adatai (katalógus adatokkal együtt). Jogosultság ellenőrzés (tulajdonos/szervezet). | Asset + AssetCatalog | +| GET | /assets/{asset_id}/financial-summary | Pénzügyi riport - kategóriákra bontott összesítés (Local/EUR). | AssetCost | +| GET | /assets/{asset_id}/costs | Tételes költséglista lapozással. | AssetCost | +| GET | /assets/{asset_id}/maintenance | Szerviznapló - karbantartási költségek listája. | AssetCost - cost_category='maintenance' | +| POST | /assets/{asset_id}/maintenance | Szervizbejegyzés hozzáadása (date, odometer, description, cost). Létrehoz AssetEvent-et is. | AssetCost + AssetEvent | + +### 1.2 `/catalog` prefix - Jármű Katalógus + +**Router:** `backend/app/api/v1/endpoints/catalog.py` + +| Metódus | Végpont | Cél | Adatbázis kapcsolat | +|---------|---------|-----|---------------------| +| GET | /catalog/makes | Márkák listázása (opcionálisan vehicle_class szerint szűrve). | AssetCatalog | +| GET | /catalog/models | Típusok listázása adott márkához. | AssetCatalog | +| GET | /catalog/generations | Generációk/Évjáratok adott márka+típushoz. | AssetCatalog | +| GET | /catalog/engines | Motorváltozatok és technikai specifikációk (ID, engine_code, fuel_type, factory_data). | AssetCatalog | + +### 1.3 `/vehicles` prefix - Jármű Értékelések + +**Router:** `backend/app/api/v1/endpoints/vehicles.py` + +| Metódus | Végpont | Cél | Adatbázis kapcsolat | +|---------|---------|-----|---------------------| +| POST | /vehicles/{vehicle_id}/ratings | Jármű értékelése 4 dimenzióban (driving_experience, reliability, comfort, consumption_satisfaction 1-10). Egy user csak egyszer értékelhet. | VehicleUserRating | +| GET | /vehicles/{vehicle_id}/ratings | Értékelések lekérése adott járműhöz. | VehicleUserRating | + +### 1.4 `/expenses` prefix - Flotta Költségek (TCO) + +**Router:** `backend/app/api/v1/endpoints/expenses.py` + +| Metódus | Végpont | Cél | Adatbázis kapcsolat | +|---------|---------|-----|---------------------| +| POST | /expenses/ | Költség rögzítése (üzemanyag, szerviz, adó, biztosítás). Dynamic Gatekeeper: draft jármű limit ellenőrzés. | AssetCost + SystemParameter | + +### 1.5 `/analytics` prefix - Jármű Analitika + +**Router:** `backend/app/api/v1/endpoints/analytics.py` + +| Metódus | Végpont | Cél | Adatbázis kapcsolat | +|---------|---------|-----|---------------------| +| GET | /analytics/{vehicle_id}/summary | TCO összesítő járművenként (user costs, lifetime costs, benchmark). | AssetCost, VehicleModelDefinition | +| GET | /analytics/dashboard | Dashboard analitika (mock data - havi költségek, üzemanyag-hatékonyság, cost/km trendek). | Jelenleg mock | + +### 1.6 További kapcsolódó végpontok + +| Metódus | Végpont | Cél | Router helye | +|---------|---------|-----|-------------| +| POST | /documents/upload/{parent_type}/{parent_id} | Dokumentumfeltöltés járműhöz | documents.py | +| POST | /evidence/scan-registration | OCR regisztrációs dokumentum szkennelés | evidence.py | +| GET | /search/match | Geo-keresés PostGIS segítségével | search.py | +| POST | /services/hunt | Szerviz vadászat indítása | services.py | +| GET | /reports/summary/{vehicle_id} | Jármű összesítő jelentés | reports.py | +| GET | /reports/trends/{vehicle_id} | Jármű trend jelentés | reports.py | + +--- + +## 2. 🗄️ Adatbázis Modell Réteg - Jármű Domain + +### 2.1 Core Asset Model - A "Digital Twin" + +Az Asset modell (backend/app/models/vehicle/asset.py) a központi entitás: + +``` +Asset ──┬── AssetCatalog (katalógus kapcsolat) + ├── AssetFinancials (pénzügyi adatok) + ├── AssetCost (költségnapló) + ├── AssetEvent (eseménynapló - Digitális Szervizkönyv) + ├── VehicleLogbook (útnyilvántartás) + ├── AssetInspection (ellenőrzési napló) + ├── AssetReview (értékelések) + ├── AssetTelemetry (telemetria) + ├── AssetAssignment (szervezeti hozzárendelés) + ├── VehicleOwnership (tulajdonosváltás) + └── ServiceRequest (szervizkérések) +``` + +### 2.2 Főbb Modellek Leírása + +| Modell | Tábla (séma) | Cél | +|--------|-------------|-----| +| Asset | vehicle.assets | Fizikai eszköz (Digital Twin) - Minden adat itt fut össze | +| AssetCatalog | vehicle.vehicle_catalog | Jármű katalógus mesteradatok | +| VehicleModelDefinition | vehicle.vehicle_model_definitions | Multi-Tier MDM Master - technikai igazságforrás | +| VehicleType | vehicle.vehicle_types | Jármű kategóriák | +| CostCategory | vehicle.cost_categories | Standardizált költségkategória fa | +| AssetCost | vehicle.asset_costs | Üzemeltetési költség (TCO) | +| AssetEvent | vehicle.asset_events | Digitális Szervizkönyv események | +| VehicleOdometerState | vehicle.vehicle_odometer_states | Km óra állapot és becslés | +| VehicleUserRating | vehicle.vehicle_user_ratings | Jármű értékelés 4 dimenzióban | + +--- + +## 3. 🔌 Jelenlegi Frontend Implementáció + +### 3.1 Garázs Nézet (DashboardView.vue) + +A frontend egy egységes garázs nézetet használ, ahol az összes jármű egy grid-ben jelenik meg: + +- Adatforrás: GET /api/v1/assets/vehicles -> vehicleStore.fetchVehicles() +- Megjelenítés: Minden jármű egy kártyán, amely tartalmazza az EU-s rendszámtáblát, márka+modell nevet, gyártási évet, állapot score-t, futott km-t, státusz badge-t +- UI élmény: Zen mód (UI elrejtése), 3D téreffektusok + +### 3.2 Hiányzó Frontend Funkciók + +A backend által biztosított API-k közül a frontend CSAK a járműlista lekérést használja. Az alábbi funkciók NINCSENEK implementálva: + +- Jármű hozzáadása (POST /assets/vehicles) +- Jármű részletes adatlapja (GET /assets/{id}) +- Költségnapló megjelenítése/rögzítése +- Szerviznapló (karbantartási rekordok) +- Katalógus böngésző (márka -> modell -> generáció -> motor) +- TCO analitika és dashboard +- Jármű értékelés +- Dokumentumfeltöltés +- Útnyilvántartás (logbook) + +--- + +## 4. 🎯 Frontend Csoportosítási Javaslat + +### 4.1 Javasolt Menü Szerkezet + +Az alábbi csoportosítás a DDD (Domain-Driven Design) elveket követi, és a felhasználói élményt (UX) helyezi előtérbe: + +``` +GARÁZS (fő nézet) +│ +├── 🔧 JÁRMŰVEK +│ ├── Garázs áttekintés <- Jelenlegi DashboardView +│ ├── Jármű hozzáadása <- POST /assets/vehicles +│ ├── Katalógus böngésző <- GET /catalog/makes -> models -> engines +│ └── Jármű részletek <- GET /assets/{id} +│ +├── 📊 PÉNZÜGYEK & TCO +│ ├── Költségnapló <- GET /assets/{id}/costs, POST /expenses +│ ├── Pénzügyi riport <- GET /assets/{id}/financial-summary +│ ├── TCO Analitika <- GET /analytics/{id}/summary +│ └── Dashboard analitika <- GET /analytics/dashboard +│ +├── 🔧 KARBANTARTÁS +│ ├── Szerviznapló <- GET /assets/{id}/maintenance +│ ├── Új szerviz bejegyzés <- POST /assets/{id}/maintenance +│ ├── Eseménynapló <- AssetEvent adatok +│ └── Km óra állapot <- GET /admin/odometer/{id} +│ +├── 📄 DOKUMENTUMOK +│ ├── Feltöltés <- POST /documents/upload/vehicle/{id} +│ └── OCR szkennelés <- POST /evidence/scan-registration +│ +└── ⭐ KÖZÖSSÉG + ├── Értékelés <- POST /vehicles/{id}/ratings + └── Vélemények <- GET /vehicles/{id}/ratings +``` + +### 4.2 Javasolt Vue Router Struktúra + +``` +/dashboard Garázs áttekintés (DashboardView) +/vehicles/add Jármű hozzáadása +/vehicles/catalog Katalógus böngésző +/vehicles/{id} Jármű részletes nézet +/vehicles/{id}/costs Költségek +/vehicles/{id}/maintenance Szerviznapló +/vehicles/{id}/analytics TCO Analitika +/vehicles/{id}/documents Dokumentumok +/vehicles/{id}/ratings Értékelések +``` + +### 4.3 Javasolt Store Bővítés + +A jelenlegi vehicleStore bővítendő az alábbiakkal: + +``` +ÚJ state-ek: + - selectedVehicle Aktuálisan kiválasztott jármű + - vehicleCosts Költségnapló tételek + - maintenanceRecords Szerviz rekordok + - financialSummary Pénzügyi összesítő + +ÚJ katalógus state-ek: + - catalogMakes Márkák listája + - catalogModels Modellek listája + - catalogGenerations Generációk listája + - catalogEngines Motorváltozatok listája + +ÚJ action-ök: + - fetchVehicleDetail(id) + - createVehicle(payload) + - fetchCosts(assetId) + - createExpense(payload) + - fetchMaintenance(assetId) + - fetchFinancialSummary(assetId) + - fetchAnalytics(assetId) + - fetchMakes(vehicleClass?) + - fetchModels(make) + - fetchGenerations(make, model) + - fetchEngines(make, model, gen) +``` + +### 4.4 UX/UI Javaslatok + +1. **Garázs Szűrők:** A járművek szűrhetők legyenek járműosztály (personal, motorcycle, commercial), státusz (active, draft, maintenance) és márka szerint. + +2. **Jármű Kártya Információs Rétegek:** + - 1. réteg (alap): Rendszám, márka, modell, státusz - látszik a grid-ben + - 2. réteg (hover): Gyors infók (km, állapot, utolsó szerviz) + - 3. réteg (kattintás): Teljes részletes nézet + +3. **TCO Dashboard:** A garázs nézet tetején egy összesítő sáv (teljes flotta km, havi költség, átlagos állapot). Minden járműkártyán egy "TCO" gomb. + +4. **Katalógus Böngésző:** Lépcsőzetes dropdown-ok (márka -> modell -> generáció -> motor). Gyors hozzáadás: "Add this to my garage" gomb. + +--- + +## 5. 📝 Összefoglalás + +A backend rendelkezésre álló API végpontok lefedik a járműkezelés teljes életciklusát: + +| Fázis | API Végpontok | Állapot | +|-------|--------------|---------| +| Felfedezés (Katalógus) | /catalog/makes, /catalog/models, /catalog/generations, /catalog/engines | Backend kész | +| Létrehozás | POST /assets/vehicles | Backend kész | +| Megtekintés (Garázs) | GET /assets/vehicles, GET /assets/{id} | Backend kész, Frontend részleges | +| Költségkövetés (TCO) | POST /expenses/, GET /assets/{id}/costs, GET /assets/{id}/financial-summary | Backend kész, Frontend hiányzik | +| Karbantartás | GET/POST /assets/{id}/maintenance | Backend kész, Frontend hiányzik | +| Analitika | GET /analytics/{id}/summary, GET /analytics/dashboard | Backend kész (részben mock), Frontend hiányzik | +| Értékelés | GET/POST /vehicles/{id}/ratings | Backend kész, Frontend hiányzik | +| Dokumentumok | POST /documents/upload/{parent_type}/{parent_id} | Backend kész, Frontend hiányzik | + +**Következtetés:** A backend erős alapokon áll a járműkezeléshez. A frontenden a garázs nézet (DashboardView) csak a járművek listázását valósítja meg. A javasolt csoportosítás (Járművek -> Pénzügyek -> Karbantartás -> Dokumentumok -> Közösség) egy logikus, felhasználó-központú navigációs struktúrát adna a teljes jármű életciklus kezeléséhez. diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts index 9027da0..c42d5ce 100644 --- a/frontend/src/stores/auth.ts +++ b/frontend/src/stores/auth.ts @@ -3,6 +3,12 @@ import { ref, computed } from 'vue' import router from '../router' import api from '../api/axios' +/** + * Backend now sends address fields directly on the person object + * with address_ prefix (e.g. address_city, address_zip, address_floor). + * This interface is kept for backward compatibility but the actual + * data comes as flat fields on PersonData. + */ export interface AddressData { zip: string | null city: string | null @@ -28,7 +34,20 @@ export interface PersonData { identity_docs: Record | null ice_contact: Record | null is_active: boolean + /** @deprecated Backend now sends address_* fields flat on person */ address: AddressData | null + // Flat address fields (new backend format) + address_zip: string | null + address_city: string | null + address_street_name: string | null + address_street_type: string | null + address_house_number: string | null + address_stairwell: string | null + address_floor: string | null + address_door: string | null + address_hrsz: string | null + address_parcel_id: string | null + address_full_text: string | null } export interface UserProfile { diff --git a/frontend/src/views/ProfileView.vue b/frontend/src/views/ProfileView.vue index d086a20..6c30e64 100644 --- a/frontend/src/views/ProfileView.vue +++ b/frontend/src/views/ProfileView.vue @@ -403,13 +403,13 @@

-