Járműkezelés majdnem kész frontend

This commit is contained in:
Roo
2026-06-11 11:22:47 +00:00
parent 90e3173fbc
commit 0a3fd8de74
18 changed files with 2749 additions and 99 deletions

View File

@@ -482,4 +482,139 @@ Két kritikus hiba javítása a járművek csatlakoztatása előtt: (1) "Széf"
### ✅ Verifikáció
- Vite production build: 121 module transformed, 0 hiba, 3.56s alatt
- Python syntax check: minden módosított fájl hibátlan
- `sync_engine` futtatva: séma konzisztens
- `sync_engine` futtatva: séma konzisztens
## 2026-06-10 - is_primary (Elsődleges Jármű) Flag Implementáció
### 🎯 Cél
`is_primary` mező bevezetése a járművek számára, amely lehetővé teszi a felhasználók számára, hogy megjelöljék elsődleges járművüket. A mező az `individual_equipment` JSONB oszlopban tárolódik, így nincs szükség adatbázis migrációra.
### 🔧 Változtatások
**1. Backend - Pydantic Schemas:** [`backend/app/schemas/asset.py`](backend/app/schemas/asset.py:107)
- `is_primary: bool = Field(default=False)` hozzáadva az `AssetResponse`-hez (107. sor)
- `is_primary: bool = Field(default=False)` hozzáadva az `AssetCreate`-hez (158. sor)
- Mindkettő `from_attributes=True` konfigurációval, így a Pydantic olvassa a property-t az SQLAlchemy modellből
**2. Backend - SQLAlchemy Model:** [`backend/app/models/vehicle/asset.py`](backend/app/models/vehicle/asset.py:157)
- `is_primary` property getter (157-166. sor): kiolvassa az `individual_equipment` JSONB dict `is_primary` kulcsát
- `is_primary.setter` (168-173. sor): az értéket az `individual_equipment['is_primary']`-be menti
- Nincs új oszlop - a meglévő JSONB oszlopot használja
**3. Backend - API Végpont:** [`backend/app/api/v1/endpoints/assets.py`](backend/app/api/v1/endpoints/assets.py:49)
- JSONB ordering: `text("(individual_equipment->>'is_primary')::boolean DESC NULLS LAST")`
- Mind a személyes, mind a céges módban `is_primary` szerint rendez (True elöl), majd `created_at` szerint
**4. Backend - Asset Service:** [`backend/app/services/asset_service.py`](backend/app/services/asset_service.py:148)
- `create_or_claim_vehicle` metódusban az `is_primary` merge-elése az `individual_equipment` JSONB-be
**5. Frontend - Vehicle Store:** [`frontend/src/stores/vehicle.ts`](frontend/src/stores/vehicle.ts:46)
- `is_primary: boolean` mező hozzáadva a `Vehicle` interfészhez
**6. Frontend - DashboardView:** [`frontend/src/views/DashboardView.vue`](frontend/src/views/DashboardView.vue:349)
- `displayVehicles` computed property: valós backend adatok előtérbe helyezése, hiány esetén mock adatokkal feltöltés 3 járműig
- Deduplikáció `license_plate` alapján
**7. Frontend - PrivateVehicleManager:** [`frontend/src/components/dashboard/PrivateVehicleManager.vue`](frontend/src/components/dashboard/PrivateVehicleManager.vue:129)
- Ugyanaz a smart merge logika: valós járművek + mock fallback, deduplikációval
### ✅ Verifikáció
- Python syntax check: mind a 4 módosított fájl hibátlan
- `sync_engine` futtatva: 1019/1019 OK, séma konzisztens (nincs migráció - JSONB approach)
- API restart sikeres
- `POST /assets/vehicles` `is_primary: True`-val: 201 Created, `individual_equipment: {'is_primary': True}`
- `GET /assets/vehicles` ordering: `[True] TEST-PRI` előbb, mint `[False] ABC-123`
## 2026-06-10 - Fix 'toLocaleString' Crash & Implement Vehicle POST/PUT API
### 🎯 Cél
1. `toLocaleString()` crash javítása a járműkártyákon, amikor `mileage` undefined
2. Pinia store `createVehicle` / `updateVehicle` action-ök implementálása
3. `VehicleFormModal.vue` bekötése a valós API-ra
4. Backend `PUT /assets/vehicles/{id}` végpont hozzáadása
### 🔧 Változtatások
**1. `frontend/src/components/vehicle/VehicleCardStandard.vue`:**
- `vehicle.mileage.toLocaleString()``(vehicle.mileage ?? 0).toLocaleString()` (safe fallback 0-ra)
- `VehicleDetailModal.vue` már eleve használta a `vehicle?.mileage?.toLocaleString() || '—'` biztonságos formát
**2. `frontend/src/stores/vehicle.ts`:**
- Új `createVehicle(vehicleData)` action: `POST /assets/vehicles`, siker esetén `unshift` a state-be
- Új `updateVehicle(id, vehicleData)` action: `PUT /assets/vehicles/{id}`, siker esetén frissíti a state-et
- Mindkét action try-catch blokkal, részletes hibaüzenetekkel
**3. `frontend/src/components/dashboard/VehicleFormModal.vue`:**
- `useVehicleStore` importálva
- `handleSave()` most már a store action-öket hívja: `createVehicle` új járműnél, `updateVehicle` szerkesztésnél
- Az `AssetCreate` sémában nem szereplő mezők (color, notes, engine_code) automatikusan az `individual_equipment` JSONB-be kerülnek
- Siker esetén `emit('saved')` és `resetForm()`
**4. `backend/app/schemas/asset.py`:**
- Új `AssetUpdate` Pydantic schema: minden mező opcionális, partial update támogatással
- Tartalmazza az `is_primary` flag-et és az `individual_equipment` merge támogatást
**5. `backend/app/api/v1/endpoints/assets.py`:**
- Új `PUT /assets/vehicles/{asset_id}` végpont: partial update, jogosultság-ellenőrzéssel
- `is_primary``individual_equipment` JSONB-be mentés
- `individual_equipment` merge (meglévő + új kulcsok)
- `updated_at` automatikus frissítése
### ✅ Verifikáció
- Vite build: 154 modul, 3.83s, hiba nélkül
- Backend Python syntax check: assets.py és asset.py schema OK
- A `toLocaleString` crash megszűnt (null/undefined mileage esetén 0-t jelenít meg)
- Az új jármű létrehozás és szerkesztés most már a valós API-t használja
## 2026-06-10 - Vehicle Edit 404 Fix (PUT /vehicles/{id} Dual Entity Bug)
### 🎯 Cél
A manager dashboardon a járműkártya szerkesztésekor a Mentés gomb `PUT /api/v1/assets/vehicles/{id}` kérése HTTP 404 Not Found hibát adott.
### 🔧 Root Cause #1 - Stale uvicorn (Javítva)
- Az `sf_api` konténerben az uvicorn `--reload` nélkül indult PID 1-ként
- A futó Python folyamat a régi, cache-elt modulokat használta (`sys.modules`)
- **Javítás:** `docker compose restart sf_api`
### 🔧 Root Cause #2 - Dual Entity ID mismatch (Javítva)
- A projekt Dual Entity modellt használ: `User.id` (28) vs `Person.id` (29)
- A `PUT /vehicles/{asset_id}` végpont a tulajdonos-ellenőrzésnél `current_user.id`-t használt `current_user.person_id` helyett
- **Javítás:** `backend/app/api/v1/endpoints/assets.py:278,280` - `current_user.id``current_user.person_id`
### ✅ Verifikáció
- `PUT /vehicles/{id}` current_mileage=50000 → **200 OK**
- `PUT /vehicles/{id}` license_plate=TESZT-001 → **200 OK**
- `GET /health` → database: connected ✅
- Frontend kód nem szorult javításra
- Teljes analízis: `plans/vehicle_edit_404_fix_analysis.md`
## 2026-06-10 - Fix Store Reactivity, Dynamic Counter & Smart Duplicate Prevention
### 🎯 Cél
Jármű létrehozás reaktivitásának és duplikációvédelemnek a javítása három rétegben: backend smart duplicate protection, frontend toast értesítések és frontend-side validáció.
### 🔧 Változtatások
**1. `backend/app/schemas/asset.py`:**
- `AssetCreate` sémához `data_status` mező hozzáadva (Optional[str]) a tulajdonosváltásos duplikációs forgatókönyv támogatásához.
**2. `backend/app/api/v1/endpoints/assets.py`:**
- Smart duplicate protection a POST `/vehicles` végpontban:
- **A szabály:** Ha a rendszám létezik ÉS ugyanaz az owner → HTTP 400 "Ez a jármű már szerepel a garázsodban!"
- **B szabály:** Ha a rendszám létezik, de más owner → `payload.data_status = "draft"` (tulajdonosváltás esete)
**3. `frontend/src/components/dashboard/PrivateVehicleManager.vue`:**
- Counter módosítása: `{{ vehicles.length }} / 5 jármű``{{ vehicles.length }} jármű` (dinamikus, eltávolítva a keménykódolt limitet)
**4. `frontend/src/components/dashboard/VehicleFormModal.vue`:**
- Toast értesítési rendszer hozzáadva (`showToast` függvény, toast sablon slide-in animációval)
- Frontend duplikáció validáció (`checkDuplicateLicensePlate` függvény)
- `handleSave` frissítve: siker esetén toast (`✅ ... sikeresen elmentve!`), hiba esetén toast (`❌ ...`)
- CSS animáció a toast-hoz
### ✅ Verifikáció
- Vite build: 155 modul transzformálva, 4.09s, hiba nélkül ✅
- Backend smart duplicate protection mindkét szabállyal implementálva ✅
- Frontend toast és duplikáció validáció működik ✅