frontend költség beállítások

This commit is contained in:
Roo
2026-06-23 21:11:21 +00:00
parent 5b437b220d
commit 71ef33bb85
90 changed files with 11850 additions and 1053 deletions

View File

@@ -0,0 +1,214 @@
# 🐛 BMW123 Jármű Adatmegjelenítési Hibajelentés
**Dátum:** 2026-06-20
**Vizsgált entitás:** `bcfed768-c8c2-4867-a7bb-38a6517dce36` (BMW123 / BMW / BMWM3)
**Scope:** Backend (`asset` modell + `AssetUpdate` séma) → Frontend (`OverviewTab`, `VehicleFormModal`)
**Hibák száma:** 4
---
## 🔍 Összefoglaló
A BMW123 rendszámú jármű adatbázisban tárolt `registration_certificate_validity` (2026-08-08) adata nem jelenik meg a frontend járműáttekintő oldalon. Emellett a `VehicleFormModal` adminisztrációs fülön beállítható mezők (`insurance_expiry_date`, `purchase_date`) értékei elvesznek a mentés során, mivel a backend Pydantic sémái és adatbázis modellje nem tartalmazza ezeket a mezőket.
---
## 🐛 BUG #1 — KRITIKUS: MOT/Regisztrációs Érvényesség Eltérés
### Adatbázis oldal
A `vehicle.assets` táblában a `registration_certificate_validity` mező **létezik** és **helyes értéket** tárol:
```
registration_certificate_validity = 2026-08-08 00:00:00+00
```
Ez a mező egy **top-level DateTime** oszlop az [`Asset`](backend/app/models/vehicle/asset.py:137-140) modellben:
```python
registration_certificate_validity: Mapped[Optional[datetime]] = mapped_column(
DateTime(timezone=True), nullable=True
)
```
### Frontend hiba
Az [`OverviewTab.vue`](frontend/src/components/vehicles/tabs/OverviewTab.vue:273-277) a `registration_certificate_validity` helyett tévesen a `individual_equipment.dates.mot_expiry` JSONB mezőből olvassa ki a műszaki érvényességet:
```typescript
const motExpiryLabel = computed(() => {
const dates = vehicle?.value?.individual_equipment?.dates
if (!dates?.mot_expiry) return t('common.noData')
return formatDate(dates.mot_expiry)
})
```
### Gyökérok
A **JSONB `individual_equipment.dates`** objektum és a **top-level `registration_certificate_validity`** oszlop két különböző tárolási hely. A `VehicleFormModal` a `registration_certificate_validity` mezőt használja (helyesen), de az `OverviewTab` a JSONB-ből próbál olvasni. Mivel a `dates` objektum nem létezik a BMW123 adataiban (`individual_equipment` = `{"features": [...], "car_specs": {...}}`), mindig "Nincs adat" jelenik meg.
### Érintett fájlok
- [`frontend/src/components/vehicles/tabs/OverviewTab.vue:273`](frontend/src/components/vehicles/tabs/OverviewTab.vue:273) — hibás olvasás
- [`frontend/src/stores/vehicle.ts:89-92`](frontend/src/stores/vehicle.ts:89) — `dates` interfész definíció
- [`backend/app/models/vehicle/asset.py:137-140`](backend/app/models/vehicle/asset.py:137) — helyes adatbázis mező
### Javasolt javítás
Az `OverviewTab.vue`-ban a `motExpiryLabel` computed property-t át kell írni, hogy a `vehicle.value?.registration_certificate_validity`-ből olvasson, vagy alternatívaként a `VehicleFormModal` `handleSave()` függvényében a `registration_certificate_validity` értékét szinkronizálni kell a `individual_equipment.dates.mot_expiry`-be is.
---
## 🐛 BUG #2 — KRITIKUS: Biztosítási és Vásárlási Adatok Elvesznek
### Adatbázis modell hiányosság
Az [`Asset`](backend/app/models/vehicle/asset.py:69) modellben **NEM** léteznek az alábbi mezők:
- `insurance_expiry_date` (biztosítás lejárta)
- `purchase_date` (vásárlás dátuma)
Ezek a mezők teljesen hiányoznak az adatbázis sémából.
### Pydantic séma hiányosság
Az [`AssetUpdate`](backend/app/schemas/asset.py:269) és [`AssetCreate`](backend/app/schemas/asset.py:122) sémákban **NEM** szerepelnek:
- `insurance_expiry_date`
- `purchase_date`
### Frontend helyzet
A [`VehicleFormModal.vue`](frontend/src/components/dashboard/VehicleFormModal.vue) adminisztrációs fül (Tab 2) tartalmazza ezeket a mezőket:
- `form.insurance_expiry_date` — "Biztosítás lejárta" dátumválasztó
- `form.purchase_date` — "Vásárlás dátuma" dátumválasztó
- `form.registration_certificate_validity` — "Forgalmi engedély érvényessége" dátumválasztó
A [`handleSave()`](frontend/src/components/dashboard/VehicleFormModal.vue:507) függvény a payload-ba teszi ezeket:
```typescript
const payload: Record<string, any> = {
...form.value,
// ...
}
```
A [`populateForm()`](frontend/src/components/dashboard/VehicleFormModal.vue:440) függvény pedig a vehicle objektumból várja ezeket:
```typescript
form.value.insurance_expiry_date = vehicle.insurance_expiry_date || ''
form.value.purchase_date = vehicle.purchase_date || ''
```
### Gyökérok
Az [`update_vehicle`](backend/app/api/v1/endpoints/assets.py:660) endpoint `payload.model_dump(exclude_unset=True)`-t használ, ami **kizárólag** az `AssetUpdate` Pydantic sémában definiált mezőket adja át az adatbázisnak. Mivel `insurance_expiry_date` és `purchase_date` nem szerepelnek az `AssetUpdate`-ben, ezek az értékek **csendben elvesznek** a PUT kérés során.
### Érintett fájlok
- [`backend/app/models/vehicle/asset.py:69`](backend/app/models/vehicle/asset.py:69) — hiányzó modell mezők
- [`backend/app/schemas/asset.py:269`](backend/app/schemas/asset.py:269) — hiányzó séma mezők
- [`backend/app/schemas/asset.py:122`](backend/app/schemas/asset.py:122) — hiányzó séma mezők (Create)
- [`frontend/src/components/dashboard/VehicleFormModal.vue:440-460`](frontend/src/components/dashboard/VehicleFormModal.vue:440) — frontend várja ezeket
- [`frontend/src/components/dashboard/VehicleFormModal.vue:507`](frontend/src/components/dashboard/VehicleFormModal.vue:507) — frontend küldi ezeket
### Javasolt javítás
1. Hozzáadni az `Asset` modellhez: `insurance_expiry_date: Mapped[Optional[datetime]]` és `purchase_date: Mapped[Optional[datetime]]`
2. Hozzáadni az `AssetUpdate` és `AssetCreate` sémákhoz ezeket a mezőket
3. Futtatni a `sync_engine`-t a séma frissítéséhez
---
## 🐛 BUG #3 — HIÁNYZÓ FUNKCIÓ: Nincs Dedikált Biztosítási Adat Struktúra
### Hiányzó mezők
Sem az [`Asset`](backend/app/models/vehicle/asset.py:69) modellben, sem más kapcsolódó táblában (`asset_financials`, `asset_events`) **NEM** léteznek dedikált mezők az alábbiakra:
- **Kötelező felelősségbiztosítás** (liability insurance)
- Kötvény száma
- Lejárati dátuma
- Biztosító neve
- **CASCO biztosítás**
- Kötvény száma
- Lejárati dátuma
- Önrész összege
- Biztosító neve
### Javasolt megoldás
Új tábla létrehozása: `vehicle.insurance_policies`:
```sql
CREATE TABLE vehicle.insurance_policies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
asset_id UUID NOT NULL REFERENCES vehicle.assets(id) ON DELETE CASCADE,
insurance_type VARCHAR(20) NOT NULL CHECK (insurance_type IN ('liability', 'casco')),
policy_number VARCHAR(100),
insurer_name VARCHAR(255),
start_date DATE,
expiry_date DATE,
deductible_amount DECIMAL(12,2),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
```
---
## 🐛 BUG #4 — KISEBB: "Következő Szerviz" Helyettesítő Szöveg
### Hiba
Az [`OverviewTab.vue`](frontend/src/components/vehicles/tabs/OverviewTab.vue:291-294) "Következő szerviz" mezője mindig "Coming Soon" szöveget mutat:
```typescript
const nextServiceLabel = computed(() => {
// Placeholder — will be connected to the service book / maintenance schedule later
return t('vehicleDetail.comingSoon')
})
```
### Érintett fájl
- [`frontend/src/components/vehicles/tabs/OverviewTab.vue:291`](frontend/src/components/vehicles/tabs/OverviewTab.vue:291)
### Javasolt javítás
Össze kell kötni a szervizkönyv modullal. A következő szerviz esedékességét az `asset_events` táblában rögzített szerviz előzményekből kellene kiszámolni (pl. utolsó olajcsere + 15.000 km vagy + 1 év).
---
## 📊 Adatfolyam Diagram (Jelenlegi Hibás Állapot)
```mermaid
flowchart TD
DB[(PostgreSQL\nvehicle.assets)]
DB -->|registration_certificate_validity\n2026-08-08| API
API[GET /api/v1/vehicles/{id}]
API -->|AssetResponse\nregistration_certificate_validity| FE_Store[Pinia Store\nvehicle.ts]
FE_Store -->|vehicle.registration_certificate_validity| OverviewTab
FE_Store -->|vehicle.individual_equipment.dates.mot_expiry| OverviewTab
subgraph OverviewTab [OverviewTab.vue - HIBA]
MOT[MOT label\nolvas: individual_equipment.dates.mot_expiry]
Service[Next Service\nComing Soon placeholder]
end
subgraph VehicleFormModal [VehicleFormModal.vue - VESZÉLYES]
Form[Adminisztráció fül]
Form --> insurance[insurance_expiry_date]
Form --> purchase[purchase_date]
Form --> regCert[registration_certificate_validity]
insurance -->|ELVESZ| PUT[PUT /vehicles/{id}\nexclude_unset=True]
purchase -->|ELVESZ| PUT
regCert -->|ELTÁROLVA| PUT
end
PUT -->|AssetUpdate.model_dump\ncsak definiált mezők| DB
```
---
## ✅ Javítási Terv (Jóváhagyásra Vár)
| # | Prioritás | Feladat | Érintett fájlok |
|---|-----------|---------|-----------------|
| 1 | **KRITIKUS** | `OverviewTab.vue` MOT olvasás javítása `registration_certificate_validity`-ből | [`OverviewTab.vue`](frontend/src/components/vehicles/tabs/OverviewTab.vue:273) |
| 2 | **KRITIKUS** | `insurance_expiry_date` és `purchase_date` hozzáadása az `Asset` modellhez | [`asset.py`](backend/app/models/vehicle/asset.py:69) |
| 3 | **KRITIKUS** | `insurance_expiry_date` és `purchase_date` hozzáadása az `AssetUpdate`/`AssetCreate` sémákhoz | [`asset.py schema`](backend/app/schemas/asset.py:269) |
| 4 | **MAGAS** | Szinkronizációs logika: `registration_certificate_validity` másolása `individual_equipment.dates.mot_expiry`-be | [`assets.py endpoint`](backend/app/api/v1/endpoints/assets.py:660) |
| 5 | **KÖZEPES** | Dedikált `insurance_policies` tábla létrehozása | Új SQLAlchemy modell |
| 6 | **KÖZEPES** | Következő szerviz összekötése a szervizkönyv adatokkal | [`OverviewTab.vue`](frontend/src/components/vehicles/tabs/OverviewTab.vue:291) |
---
## 📝 Technikai Megjegyzések
- A **Sync Engine** használata kötelező az új mezők adatbázisba vezetéséhez: `docker exec sf_api python3 -m app.scripts.sync_engine`
- A JSONB `individual_equipment.dates` opcionális, nem minden járműnél van kitöltve
- A frontend `Vehicle` interfész frissítése is szükséges a [`vehicle.ts`](frontend/src/stores/vehicle.ts:9) store-ban
- A `populateForm` függvényben a hiányzó mezők miatt TypeScript hiba léphet fel, ha szigorú típusellenőrzés van
---
*Jelentés készült: 2026-06-20 | Auditor: Rendszer-Architect*