Files
service-finder/docs/masterbook_2.0.1/thick_asset_philosophy.md
2026-03-31 06:20:43 +00:00

192 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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