frontend költség beállítások
This commit is contained in:
214
docs/bmw123_vehicle_data_flow_bug_report_2026-06-20.md
Normal file
214
docs/bmw123_vehicle_data_flow_bug_report_2026-06-20.md
Normal 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*
|
||||
Reference in New Issue
Block a user