Files
service-finder/docs/bmw123_vehicle_data_flow_bug_report_2026-06-20.md
2026-06-23 21:11:21 +00:00

10 KiB

🐛 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 modellben:

registration_certificate_validity: Mapped[Optional[datetime]] = mapped_column(
    DateTime(timezone=True), nullable=True
)

Frontend hiba

Az OverviewTab.vue 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:

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

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 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 és AssetCreate sémákban NEM szerepelnek:

  • insurance_expiry_date
  • purchase_date

Frontend helyzet

A 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() függvény a payload-ba teszi ezeket:

const payload: Record<string, any> = {
  ...form.value,
  // ...
}

A populateForm() függvény pedig a vehicle objektumból várja ezeket:

form.value.insurance_expiry_date = vehicle.insurance_expiry_date || ''
form.value.purchase_date = vehicle.purchase_date || ''

Gyökérok

Az update_vehicle 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

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 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:

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 "Következő szerviz" mezője mindig "Coming Soon" szöveget mutat:

const nextServiceLabel = computed(() => {
  // Placeholder — will be connected to the service book / maintenance schedule later
  return t('vehicleDetail.comingSoon')
})

Érintett fájl

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)

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
2 KRITIKUS insurance_expiry_date és purchase_date hozzáadása az Asset modellhez asset.py
3 KRITIKUS insurance_expiry_date és purchase_date hozzáadása az AssetUpdate/AssetCreate sémákhoz asset.py schema
4 MAGAS Szinkronizációs logika: registration_certificate_validity másolása individual_equipment.dates.mot_expiry-be assets.py endpoint
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

📝 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 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