# 🐛 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 = { ...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*