# Odometer Rendszer Duplikáció Audit Jelentés **Dátum:** 2026-06-12 **Auditor:** Rendszer-Architect **Gitea Issue:** #258 ## Összefoglaló A vizsgálat feltárta, hogy az odometer (kilométeróra) adatok **több helyen és több formában** vannak tárolva a rendszerben, ami duplikációhoz és architekturális inkonzisztenciához vezet. --- ## 1. Összes Odometer-rel Kapcsolatos Elem ### 1.1 Különálló Táblák | # | Tábla (Schema) | Modell | Fájl | Elsődleges Entitás | |---|---|---|---|---| | 1 | `vehicle.odometer_readings` | `OdometerReading` | `backend/app/models/vehicle/asset.py:347` | Asset (járműpéldány) | | 2 | `vehicle.vehicle_odometer_states` | `VehicleOdometerState` | `backend/app/models/vehicle/vehicle.py:112` | VehicleModelDefinition (katalógus) | | 3 | `vehicle.asset_telemetry` | `AssetTelemetry` (`current_mileage`) | `backend/app/models/vehicle/asset.py:338` | Asset (járműpéldány) | ### 1.2 Oszlopok Más Táblákban | # | Tábla | Oszlop | Fájl | |---|---|---|---| | 4 | `vehicle.costs` | `odometer` | `backend/app/models/vehicle/vehicle.py:97` | | 5 | `vehicle.asset_events` | `odometer_reading` | `backend/app/models/vehicle/asset.py:400` | | 6 | `marketplace.costs` | `odometer_km` | `backend/app/models/marketplace/service.py:172` | --- ## 2. Részletes Elemzés ### 2.1 `OdometerReading` (asset.py:347) - **Cél:** Km óra állás időbeli nyomonkövetése. Minden egyes leolvasás külön rekord. - **Adatbázis séma:** `vehicle.odometer_readings(id, asset_id, reading, recorded_at, source, cost_id)` - **Forrás:** `manual`, `api`, `telemetry`, `cost_entry` - **Kötődés:** `vehicle.assets` (Asset) - **konkrét járműpéldány** - **FK:** `odometer_readings_asset_id_fkey` → `vehicle.assets.id` ### 2.2 `VehicleOdometerState` (vehicle.py:112) - **Cél:** Okos odometer - becsült aktuális km állás, napi átlag, konfidencia score. - **Adatbázis séma:** `vehicle.vehicle_odometer_states(vehicle_id PK, last_recorded_odometer, last_recorded_date, daily_avg_distance, estimated_current_odometer, confidence_score, manual_override_avg)` - **Kötődés:** `vehicle.vehicle_model_definitions` (VehicleModelDefinition) - **katalógusrekord** - **FK:** `vehicle_odometer_states_vehicle_id_fkey` → `vehicle.vehicle_model_definitions.id` - **Adatforrás:** Kizárólag a `VehicleCost.odometer` mezőből számol (`odometer_service.py:59-62`) ### 2.3 `AssetTelemetry.current_mileage` (asset.py:338) - **Cél:** Telemetriai adat tárolása. - **Kötődés:** `vehicle.assets` (Asset) - **konkrét járműpéldány** - **Nincs integrálva** sem az `OdometerReading`, sem a `VehicleOdometerState` rendszerrel. ### 2.4 `VehicleCost.odometer` (vehicle.py:97) - **Cél:** Költségbejegyzéshez tartozó km állás (NOT NULL). - **Kötődés:** `vehicle.vehicle_model_definitions` (VehicleModelDefinition) - **Funkció:** Ez az adatforrása a `VehicleOdometerState` számításnak. ### 2.5 `AssetEvent.odometer_reading` (asset.py:400) - **Cél:** Digitális szervizkönyv eseményhez tartozó km állás. - **Kötődés:** `vehicle.assets` (Asset) - **Nincs integrálva** semmilyen más odometer rendszerrel. ### 2.6 `marketplace.costs.odometer_km` - **Cél:** Marketplace szolgáltatás árához tartozó km állás. - **Teljesen elkülönült** rendszer. --- ## 3. A Duplikáció Leírása ### 3.1 Két Párhuzamos Odometer Rendszer #### A) Asset-alapú Odometer Rendszer (komplett, de kihasználatlan) - **Tábla:** `vehicle.odometer_readings` - **Használat:** Csak `expenses.py:108-127` hoz létre `OdometerReading` rekordot költség rögzítésekor. - **Kötődés:** `Asset` (konkrét jármű) - **Státusz:** Létezik, de **nincs kihasználva** a VehicleOdometerState számára. #### B) Vehicle-definition-alapú Odometer Rendszer (aktív, de hibás) - **Tábla:** `vehicle.vehicle_odometer_states` - **Service:** `odometer_service.py` - teljes funkcionalitás - **Kötődés:** `VehicleModelDefinition` (katalógusrekord) - **Adatforrás:** `VehicleCost.odometer` (szintén vehicle-definition-hez kötött) - **Státusz:** Működik, de **architekturálisan hibás**, mert egy katalógusrekordhoz rendel km állást. ### 3.2 Architekturális Következmények 1. **Adatvesztés:** Az Asset-hez tartozó `OdometerReading` adatok nincsenek felhasználva a VehicleOdometerState számításban. 2. **Inkonzisztens adat:** Telemetriából vagy manuális bevitelből származó km adatok nem kerülnek be a VehicleOdometerState-ba. 3. **Entitás zavar:** A `VehicleModelDefinition` egy katalógusrekord, aminek NINCS km óra állása. 4. **Több forrás, nincs szinkron:** AssetTelemetry, OdometerReading, AssetEvent mind Asset-hez kötött, de nincsenek szinkronizálva. --- ## 4. Mermaid Diagram ```mermaid graph TD subgraph "ASSET-alapú (konkrét jármű)" A[Asset] --> OR[OdometerReading
vehicle.odometer_readings] A --> AT[AssetTelemetry
current_mileage] A --> AE[AssetEvent
odometer_reading] end subgraph "VEHICLE-DEFINITION-alapú (katalógus)" VMD[VehicleModelDefinition] --> VOS[VehicleOdometerState
vehicle.vehicle_odometer_states] VMD --> VC[VehicleCost
odometer] end subgraph "SZOLGÁLTATÁS" OS[OdometerService
odometer_service.py] -->|számol| VC OS -.->|NEM használja| OR end subgraph "MARKETPLACE (elkülönült)" MC[Marketplace Cost
odometer_km] end style VOS fill:#f96,stroke:#333,stroke-width:2px style OR fill:#9cf,stroke:#333,stroke-width:2px style OS fill:#ff9,stroke:#333,stroke-width:2px ``` --- ## 5. Javaslat 1. A `VehicleOdometerState`-ot át kell kötni az `Asset` entitáshoz. 2. Az `OdometerService`-nek az `OdometerReading` táblából kellene számolnia. 3. Az `AssetTelemetry.current_mileage` és `AssetEvent.odometer_reading` integrálni kell az `OdometerReading` rendszerbe. 4. A `marketplace.costs.odometer_km` egységesítése.