frontend kínlódás

This commit is contained in:
Roo
2026-03-31 06:20:43 +00:00
parent 2508ae7452
commit c7cbe60976
46 changed files with 6091 additions and 136 deletions

View File

@@ -0,0 +1,192 @@
# Thick Asset Filozófia A Digital Twin mint elsődleges adattároló
**Verzió:** 2.0.1
**Dátum:** 2026-03-30
**Státusz:** Aktív
**Kapcsolódó issue:** #179 (Asset Refactor Documentation Sync)
## 1. Mi a „Thick Asset”?
A Service Finder 2.0.1 architektúrája a **„Thick Asset”** (vastag eszköz) elvet követi. Ez azt jelenti, hogy a fizikai jármű digitális ikre (Digital Twin) nem csupán egy hivatkozás a katalógusra, hanem egy teljes értékű, önálló adattároló entitás, amely magában hordozza a jármű **összes releváns technikai, gazdasági és üzemeltetési adatát**.
### 1.1. A régi „Thin Asset” modell
- Az Asset csak egy külső kulcs a `vehicle_catalog` vagy `vehicle_model_definitions` táblákra.
- A technikai specifikációk (lökettérfogat, teljesítmény, felszereltség) kizárólag a katalógusban voltak tárolva.
- Ha egy jármű módosításon esett át (pl. tuning, átépítés), az adatok elvesztek vagy nem voltak nyomon követhetők.
### 1.2. Az új „Thick Asset” modell
- Az Asset (**`vehicle.assets`** tábla) tartalmazza a jármű **saját technikai adatait** (lásd a 22+ új oszlopot).
- A katalógus (**`vehicle.vehicle_catalog`**) továbbra is szolgál mint **ellenőrzött mestersablon**, de az Asset önállóan tárolhat eltérő értékeket.
- A modell lehetővé teszi:
- **Egyedi módosítások** rögzítését (pl. tuning, felszereltségbővítés).
- **Időbeli változások** nyomon követését (pl. motorcsere, üzemanyagátállítás).
- **Hiányzó katalógus** esetén is a jármű teljes profiljának kezelését.
## 2. A filozófia előnyei
### 2.1. Adatintegritás és teljesség
- A jármű adatai **egy helyen**, az Asset rekordban összpontosulnak.
- A katalógus frissítése (pl. újabb évjárat) nem írja felül a már létező Asset adatait.
- A **profile_completion_percentage** dinamikusan számolható a ténylegesen kitöltött mezők alapján.
### 2.2. Rugalmasság a valós üzleti folyamatokhoz
- **Költségkövetés:** Minden kiadás (`vehicle.asset_costs`) közvetlenül az Assethez kapcsolódik.
- **Szerviztörténet:** Az AssetEvent szolgáltatásnapló (`vehicle.asset_events`) az Assethez kötődik, nem a katalógushoz.
- **Tulajdonosi változások:** A `vehicle_transfer_requests` és `vehicle_ownership_history` táblák az Asseten keresztül kezelik a tulajdonosváltásokat.
### 2.3. Teljesítmény és lekérdezési hatékonyság
- A gyakran használt technikai adatok (pl. `fuel_type`, `power_kw`, `vehicle_class`) indexelve vannak az Asset táblában, így a szűrés és jelentéskészítés gyorsabb.
- Nincs szükség összetett JOINokra a katalógussal minden egyes lekérdezésnél.
## 3. Technikai megvalósítás
### 3.1. Az Asset tábla szerkezete
A `vehicle.assets` tábla jelenleg **22+ új oszlopot** tartalmaz a korábbi v1-hez képest. Ezek az oszlopok a következő kategóriákba sorolhatók:
1. **Azonosítás** (`vin`, `license_plate`, `name`, `catalog_id`)
2. **Osztályozás** (`vehicle_class`, `brand`, `model`, `trim_level`)
3. **Technikai specifikációk** (`fuel_type`, `engine_capacity`, `power_kw`, `torque_nm`, `cylinder_layout`, `transmission_type`, `drive_type`, `euro_classification`)
4. **Fizikai méretek** (`curb_weight`, `max_weight`, `cargo_volume_x`, `cargo_volume_y`, `door_count`, `seat_count`)
5. **Felszereltség** (`roof_type`, `audio_system_type`, `individual_equipment` (JSONB))
6. **Állapot** (`current_mileage`, `condition_score`, `status`, `data_status`)
7. **Idővonal** (`year_of_manufacture`, `first_registration_date`, `created_at`, `updated_at`)
8. **Értékesítés** (`is_for_sale`, `price`, `currency`)
9. **Szervezeti kapcsolatok** (`current_organization_id`, `branch_id`, `relocation_performed`)
10. **Tulajdonosi kapcsolatok** (`owner_person_id`, `owner_org_id`, `operator_person_id`, `operator_org_id`)
### 3.2. Kapcsolatok
- **`catalog`** kapcsolat a `vehicle.vehicle_catalog` táblával (opcionális, ha a jármű ismert katalóguselemhez tartozik).
- **`financials`** az AssetFinancials rekord (beszerzési adatok, amortizáció).
- **`costs`** az AssetCost rekordok (üzemeltetési költségek).
- **`events`** az AssetEvent rekordok (szerviznapló).
- **`logbook`** a VehicleLogbook bejegyzések (útnyilvántartás).
- **`inspections`**, **`reviews`**, **`telemetry`**, **`assignments`**, **`ownership_history`**, **`service_requests`** további kapcsolatok.
### 3.3. Enum típusok
A következő enumerációk definiálva vannak a modellben:
- **`VehicleClassEnum`** járműosztályok (personal, motorcycle, light_commercial, commercial, work_machine, trailer, bus, camper, boat, aircraft).
- **`RoofTypeEnum`** tetőtípusok (metal, fabric, hardtop, folding, targa, fixed_glass, panoramic, fixed_sunroof, openable_sunroof, retractable_sunroof, motorized_sunroof, openable_panoramic).
- **`AssetEventTypeEnum`** eseménytípusok a digitális szervizkönyvben (SERVICE, REPAIR, ACCIDENT, INSPECTION, TIRE_CHANGE, MAINTENANCE, UPGRADE, RECALL).
## 4. Migrációs útmutató
A meglévő, „thin” Asset rekordok frissítése a következő lépésekből áll:
1. **Katalógus keresés** ha a jármű ismert márka/modell/évjárat kombináció, a `catalog_id` beállítása.
2. **Hiányzó mezők kitöltése** a katalógusból másolható adatok (pl. `engine_capacity`, `power_kw`) átmásolása az Asset rekordba.
3. **Adatminőség javítása** a `data_status` mező beállítása (DRAFT, DISCOVERED, ENRICHED, ACTIVE, ARCHIVED) a kitöltöttség függvényében.
A migrációt a `sync_engine.py` szkript végzi automatikusan, amikor a séma változás észlelhető.
## 5. Jövőbeli kiterjesztések
- **Realtime telemetria** az `asset_telemetry` tábla bővítése GPS, üzemanyagfogyasztás, hibakódok rögzítésére.
- **Predictive maintenance** a szervizesemények és költségek alapján javaslatok generálása.
- **Multiasset kapcsolatok** pl. pótkocsivontató összerendelés, flottaszintű optimalizálás.
## 6. API Végpontok és Payload Struktúrák
### 6.1. Asset Létrehozás (POST /api/v1/assets)
**Endpoint:** `POST /api/v1/assets`
**RBAC:** `asset:create` jogosultság szükséges
**Státusz logika:** Automatikus státusz meghatározás az adatkomplettség alapján
**Request Body (AssetCreate):**
```json
{
"license_plate": "ABC-123",
"vin": "WBA12345678901234",
"brand": "BMW",
"model": "320i",
"vehicle_class": "personal",
"fuel_type": "petrol",
"catalog_id": 12345,
"engine_capacity": 1998,
"power_kw": 135,
"year_of_manufacture": 2020,
"organization_id": 1
}
```
**Státusz meghatározás szabályai:**
- **"active" státusz:** Ha mind az 5 alapvető mező (`license_plate`, `brand`, `model`, `vehicle_class`, `fuel_type`) kitöltve van
- **"draft" státusz:** Ha bármelyik alapvető mező hiányzik
- A `vin` mező nem kötelező az "active" státuszhoz, de növeli a profil kitöltési százalékot
### 6.2. Asset Válasz (GET /api/v1/assets/{id})
**Response Body (AssetResponse):**
```json
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"vin": "WBA12345678901234",
"license_plate": "ABC-123",
"brand": "BMW",
"model": "320i",
"vehicle_class": "personal",
"fuel_type": "petrol",
"engine_capacity": 1998,
"power_kw": 135,
"status": "active",
"data_status": "enriched",
"is_verified": false,
"profile_completion_percentage": 85,
"year_of_manufacture": 2020,
"current_organization_id": 1,
"owner_organization_id": 1,
"created_at": "2026-03-30T21:30:00Z",
"updated_at": "2026-03-30T21:30:00Z",
"catalog": {
"id": 12345,
"make": "BMW",
"model": "3 Series",
"generation": "G20",
"vehicle_class": "personal",
"fuel_type": "petrol",
"power_kw": 135,
"engine_capacity": 1998
}
}
```
### 6.3. Catalog Snapshot Sync Funkcionalitás
Ha a kérés tartalmaz `catalog_id`-t, a rendszer automatikusan betölti a hiányzó technikai adatokat a `VehicleModelDefinition` táblából:
**Szinkronizációs logika:**
1. Ha a felhasználó nem ad meg értéket egy mezőhöz (pl. `power_kw`), de a katalógus tartalmazza, a katalógus értéke kerül felhasználásra
2. Ha a felhasználó explicit megad egy értéket, az felülírja a katalógus értékét
3. A szinkronizáció csak a következő mezőkre vonatkozik: `brand`, `model`, `vehicle_class`, `fuel_type`, `power_kw`, `engine_capacity`, `euro_classification`, `body_type`
### 6.4. Service Book API (Digitális Szervizkönyv)
**Esemény hozzáadása (POST /api/v1/assets/{id}/events):**
```json
{
"event_type": "SERVICE",
"odometer_reading": 50000,
"description": "Rendszeres szerviz: olajcsere, szűrők cseréje",
"event_date": "2026-03-30T10:00:00Z"
}
```
**RBAC szabályok:**
- Csak a `operator_org_id` vagy `owner_org_id` szervezethez tartozó felhasználók adhatnak hozzá eseményeket
- Admin felhasználók bármely eszközhöz hozzáadhatnak eseményeket
### 6.5. SaaS Limit Integráció
A `create_or_claim_vehicle` metódus továbbra is tiszteletben tartja a meglévő SaaS limit logikát:
- A `get_user_vehicle_limit` függvény ellenőrzi a felhasználó és szervezet limitjeit
- Csak "active" státuszú járművek számítanak a limitbe
- "draft" státuszú járművek nem érintik a limitet
## 7. Összefoglaló
A **Thick Asset filozófia** a Service Finder 2.0.1 alapvető pillére. Biztosítja, hogy a digitális ikrek ne csupán üres héjak legyenek, hanem teljes értékű, önállóan kezelhető üzleti entitások, amelyek képesek a valós világ változásait tükrözni és támogatni a flottavezetés, költségkövetés és szerviznaplózás összetett folyamatait.
**Kulcsfontosságú implementációs pontok:**
1. **Backward compatibility:** A meglévő SaaS limit és RBAC logika változatlan marad
2. **Automatikus státuszkezelés:** Az adatkomplettség alapján automatikus "draft" vs "active" státusz
3. **Intelligens katalógus szinkron:** Hiányzó technikai adatok automatikus kitöltése katalógusból
4. **Service Book integráció:** Teljes körű digitális szervizkönyv támogatás RBAC védelme mellett