# đŸ—ïž P0 DEEP ARCHITECTURE AUDIT — Teljes AdatbĂĄzis SĂ©ma Audit **DĂĄtum:** 2026-06-20 **HatĂĄskör:** Teljes SQLAlchemy modellrĂ©teg (`backend/app/models/`) **Elemzett fĂĄjlok:** 26 modellfĂĄjl **FeltĂĄrt kapcsolatok:** 95 ForeignKey, 65 relationship() deklarĂĄciĂł **JSONB mezƑk:** 56 darab --- ## TartalomjegyzĂ©k 1. [SĂ©ma ÁttekintĂ©s](#1-sĂ©ma-ĂĄttekintĂ©s) 2. [Teljes TĂĄblalista SĂ©mĂĄnkĂ©nt](#2-teljes-tĂĄblalista-sĂ©mĂĄnkĂ©nt) 3. [Kapcsolati TĂ©rkĂ©p (Entity-Relationship)](#3-kapcsolati-tĂ©rkĂ©p-entity-relationship) 4. [Központi EntitĂĄs: Asset (Digital Twin)](#4-központi-entitĂĄs-asset-digital-twin) 5. [JSONB MezƑk Teljes FeltĂĄrĂĄsa](#5-jsonb-mezƑk-teljes-feltĂĄrĂĄsa) 6. [Redundancia AnalĂ­zis](#6-redundancia-analĂ­zis) 7. [HiĂĄnyossĂĄg ElemzĂ©s — Admin, BiztosĂ­tĂĄs, AdĂł](#7-hiĂĄnyossĂĄg-elemzĂ©s) 8. [ArchitekturĂĄlis Javaslat — Admin & PĂ©nzĂŒgyi Adatok TĂĄrolĂĄsa](#8-architekturĂĄlis-javaslat) 9. [FĂŒggelĂ©k: Teljes FK-relationship MĂĄtrix](#9-fĂŒggelĂ©k-teljes-fk-relationship-mĂĄtrix) --- ## 1. SĂ©ma ÁttekintĂ©s Az adatbĂĄzis **9 PostgreSQL sĂ©mĂĄra** van bontva, Domain-Driven Design (DDD) elvek szerint: | SĂ©ma | TĂĄblĂĄk szĂĄma | ElsƑdleges Domain | |------|-------------|-------------------| | `vehicle` | ~28 | JĂĄrmƱvek, katalĂłgus, költsĂ©gek, esemĂ©nyek | | `identity` | 10 | SzemĂ©lyek, felhasznĂĄlĂłk, tĂĄrcĂĄk, eszközök | | `fleet` | 7 | Szervezetek, tagok, telephelyek, asset-hozzĂĄrendelĂ©s | | `system` | 14 | RendszerparamĂ©terek, dokumentumok, Ă©rtesĂ­tĂ©sek, cĂ­mek | | `marketplace` | 10 | SzolgĂĄltatĂłk, szakĂ©rtƑi cĂ­mkĂ©k, felfedezĂ©s | | `finance` | 7 | KibocsĂĄtĂłk, fizetĂ©si szĂĄndĂ©kok, kivĂ©teli kĂ©relmek | | `audit` | 4 | BiztonsĂĄgi naplĂł, mƱveleti naplĂł, fƑkönyv | | `gamification` | 9 | Pontok, szintek, jelvĂ©nyek, szezonok | | `marketing` | 7 | KampĂĄnyok, kreatĂ­vok, elhelyezĂ©sek, hirdetĂ©sek | | **ÖSSZESEN** | **~96 tĂĄbla** | | --- ## 2. Teljes TĂĄblalista SĂ©mĂĄnkĂ©nt ### 2.1 `vehicle` sĂ©ma (~28 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `vehicle.vehicle_types` | `VehicleType` | `vehicle_definitions.py:17` | JĂĄrmƱ kategĂłriĂĄk JSONB `units`-szal | | `vehicle.feature_definitions` | `FeatureDefinition` | `vehicle_definitions.py:33` | FelszereltsĂ©g jegyzĂ©k | | `vehicle.vehicle_model_definitions` | `VehicleModelDefinition` | `vehicle_definitions.py:48` | **MDM Master** — 60+ mezƑ, 4 JSONB, UniqueConstraint 7 mezƑn | | `vehicle.model_feature_maps` | `ModelFeatureMap` | `vehicle_definitions.py:148` | M:N modell↔felszereltsĂ©g | | `vehicle.dict_body_types` | `BodyTypeDictionary` | `vehicle_definitions.py:162` | KarosszĂ©ria tĂ­pusok i18n-nel | | `vehicle.vehicle_catalog` | `AssetCatalog` | `asset.py:14` | KatalĂłgus bejegyzĂ©s, JSONB `factory_data` | | `vehicle.assets` | `Asset` | `asset.py:69` | **Digital Twin** — 84 oszlop, központi entitĂĄs | | `vehicle.asset_financials` | `AssetFinancials` | `asset.py:246` | BeszerzĂ©si/amortizĂĄciĂłs adatok | | `vehicle.asset_costs` | `AssetCost` | `asset.py:271` | TCO költsĂ©gek | | `vehicle.vehicle_logbook` | `VehicleLogbook` | `asset.py:312` | NAV menetlevĂ©l GPS-szel | | `vehicle.asset_inspections` | `AssetInspection` | `asset.py:341` | Napi ellenƑrzƑ lista | | `vehicle.asset_reviews` | `AssetReview` | `asset.py:357` | JĂĄrmƱ Ă©rtĂ©kelĂ©sek | | `vehicle.vehicle_ownership_history` | `VehicleOwnership` | `asset.py:373` | TulajdonosvĂĄltozĂĄsok | | `vehicle.asset_telemetry` | `AssetTelemetry` | `asset.py:389` | Telemetria (1:1) | | `vehicle.odometer_readings` | `OdometerReading` | `asset.py:398` | KilomĂ©terĂłra ĂĄllĂĄsok idƑrendben | | `vehicle.asset_assignments` | `AssetAssignment` | `asset.py:415` | Asset↔Organization kapcsolat | | `vehicle.asset_events` | `AssetEvent` | `asset.py:447` | **DigitĂĄlis Szervizkönyv** | | `vehicle.exchange_rates` | `ExchangeRate` | `asset.py:492` | Árfolyamok | | `vehicle.catalog_discovery` | `CatalogDiscovery` | `asset.py:499` | Robot felfedezƑ munkaterĂŒlet | | `vehicle.vehicle_expenses` | `VehicleExpenses` | `asset.py:528` | KöltsĂ©g reporting | | `vehicle.vehicle_transfer_requests` | `VehicleTransferRequest` | `asset.py:546` | Asset ĂĄtadĂĄs-ĂĄtvĂ©tel workflow | | `vehicle.cost_categories` | `CostCategory` | `vehicle.py:19` | Hierarchikus költsĂ©gkategĂłriĂĄk | | `vehicle.costs` | `VehicleCost` | `vehicle.py:64` | **⚠ VMD-hez kötve, NEM Asset-hez!** | | `vehicle.vehicle_user_ratings` | `VehicleUserRating` | `vehicle.py:112` | 4-dimenziĂłs felhasznĂĄlĂłi Ă©rtĂ©kelĂ©s | | `vehicle.gb_catalog_discovery` | `GbCatalogDiscovery` | `vehicle.py:168` | GB piaci felfedezƑ robot | | `vehicle.motorcycle_specs` | `MotorcycleSpecs` | `motorcycle_specs.py:6` | Motor technikai adatok JSONB-ben | | `vehicle.external_reference_library` | `ExternalReferenceLibrary` | `external_reference.py:6` | KĂŒlsƑ referencia könyvtĂĄr | | `vehicle.external_reference_queue` | `ExternalReferenceQueue` | `external_reference_queue.py:6` | KĂŒlsƑ referencia vĂĄrĂłlista | | `vehicle.reference_lookup` | `ReferenceLookup` | `reference_data.py` | Referencia keresƑ JSONB-vel | ### 2.2 `identity` sĂ©ma (10 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `identity.persons` | `Person` | `identity.py:37` | **DNS** — valĂłs szemĂ©ly, soha nem törölhetƑ | | `identity.users` | `User` | `identity.py:126` | Login entitĂĄs, GDPR törölhetƑ | | `identity.wallets` | `Wallet` | `identity.py:223` | Triple Wallet | | `identity.verification_tokens` | `VerificationToken` | `identity.py:244` | JĂłvĂĄhagyĂł tokenek | | `identity.social_accounts` | `SocialAccount` | `identity.py:258` | KözössĂ©gi fiĂłkok | | `identity.active_vouchers` | `ActiveVoucher` | `identity.py:276` | AktĂ­v utalvĂĄnyok | | `identity.user_trust_profiles` | `UserTrustProfile` | `identity.py:290` | Gondos Gazda Index | | `identity.one_time_passwords` | `OneTimePassword` | `identity.py:321` | Egyszeri jelszavak | | `identity.devices` | `Device` | `identity.py:340` | Eszköz fingerprint | | `identity.user_device_links` | `UserDeviceLink` | `identity.py:355` | User↔Device kapcsolat | ### 2.3 `fleet` sĂ©ma (7 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `fleet.organizations` | `Organization` | `organization.py:70` | **Központi szervezet** — lifecycle | | `fleet.org_roles` | `OrgRole` | `organization.py:39` | Dinamikus RBAC JSONB-vel | | `fleet.organization_financials` | `OrganizationFinancials` | `organization.py:215` | Éves pĂ©nzĂŒgyi adatok | | `fleet.organization_members` | `OrganizationMember` | `organization.py:230` | Tagok (user/person/invited_email) | | `fleet.organization_sales_assignments` | `OrganizationSalesAssignment` | `organization.py:268` | ÉrtĂ©kesĂ­tĂ©si hozzĂĄrendelĂ©s | | `fleet.branches` | `Branch` | `organization.py:279` | Telephelyek PostGIS-szel | | `fleet.asset_assignments` | `AssetAssignment` | `asset.py:415` | Asset-szervezet kapcsolat | ### 2.4 `system` sĂ©ma (14 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `system.system_parameters` | `SystemParameter` | `system.py:19` | Hierarchikus paramĂ©terek | | `system.internal_notifications` | `InternalNotification` | `system.py:40` | ÉrtesĂ­tĂ©sek | | `system.system_data_completion_weights` | `SystemDataCompletionWeight` | `system.py:62` | KitöltöttsĂ©gi sĂșlyok | | `system.system_service_staging` | `SystemServiceStaging` | `system.py:85` | SzolgĂĄltatĂĄs staging | | `system.documents` | `Document` | `document.py:11` | NAS-alapĂș doksi metatĂĄrolĂł | | `system.legal_documents` | `LegalDocument` | `legal.py:9` | Jogi dokumentumok | | `system.legal_acceptances` | `LegalAcceptance` | `legal.py:24` | Jogi elfogadĂĄsok | | `system.translations` | `Translation` | `translation.py:8` | FordĂ­tĂĄsok | | `system.geo_postal_codes` | `GeoPostalCode` | `address.py:12` | IrĂĄnyĂ­tĂłszĂĄm keresƑ | | `system.geo_streets` | `GeoStreet` | `address.py:22` | Utca regiszter | | `system.geo_street_types` | `GeoStreetType` | `address.py:31` | Utca tĂ­pusok | | `system.addresses` | `Address` | `address.py:39` | UniverzĂĄlis cĂ­m GPS-szel | | `system.pending_actions` | `PendingAction` | `security.py:22` | **Sentinel** — 4 szem elv | | `system.subscription_tiers` | `SubscriptionTier` | `core_logic.py:12` | ElƑfizetĂ©si csomagok | ### 2.5 `marketplace` sĂ©ma (10 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `marketplace.service_profiles` | `ServiceProfile` | `service.py:21` | SzolgĂĄltatĂłi profilok PostGIS-szel | | `marketplace.expertise_tags` | `ExpertiseTag` | `service.py:79` | **4-szintƱ hierarchia** | | `marketplace.service_expertises` | `ServiceExpertise` | `service.py:142` | M:N profil↔tag | | `marketplace.service_staging` | `ServiceStaging` | `service.py:158` | SzolgĂĄltatĂĄs staging | | `marketplace.discovery_parameters` | `DiscoveryParameter` | `service.py:184` | FelfedezĂ©si paramĂ©terek | | `marketplace.costs` | `Cost` | `service.py:196` | KöltsĂ©gek | | `marketplace.service_specialties` | `ServiceSpecialty` | `core_logic.py:88` | ÖnhivatkozĂł hierarchia | | `marketplace.service_providers` | `ServiceProvider` | `social.py:22` | KözössĂ©gi szolgĂĄltatĂłk | | `marketplace.ratings` | `Rating` | `address.py:77` | UniverzĂĄlis Ă©rtĂ©kelĂ©s | | `marketplace.service_reviews` | `ServiceReview` | `social.py:86` | EllenƑrzött Ă©rtĂ©kelĂ©sek | | `marketplace.votes` | `Vote` | `social.py:46` | KözössĂ©gi szavazatok | ### 2.6 `finance` sĂ©ma (7 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `finance.issuers` | `Issuer` | `finance.py:27` | SzĂĄmlakibocsĂĄtĂłk | | `finance.payment_intents` | `PaymentIntent` | `payment.py:30` | **Double Lock** | | `finance.withdrawal_requests` | `WithdrawalRequest` | `payment.py:147` | KivĂ©teli kĂ©relmek | | `finance.org_subscriptions` | `OrganizationSubscription` | `core_logic.py:25` | Szervezeti elƑfizetĂ©s | | `finance.user_subscriptions` | `UserSubscription` | `core_logic.py:49` | FelhasznĂĄlĂłi elƑfizetĂ©s | | `finance.credit_logs` | `CreditTransaction` | `core_logic.py:72` | Kredit naplĂł | | `finance.exchange_rates` | `ExchangeRate` | `asset.py:492` | Árfolyamok | ### 2.7 `audit` sĂ©ma (4 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `audit.security_audit_logs` | `SecurityAuditLog` | `audit.py:12` | BiztonsĂĄgi esemĂ©nyek | | `audit.operational_logs` | `OperationalLog` | `audit.py:29` | Napi mƱveletek | | `audit.process_logs` | `ProcessLog` | `audit.py:43` | Robot naplĂłk | | `audit.financial_ledger` | `FinancialLedger` | `audit.py:78` | **Központi fƑkönyv** | ### 2.8 `gamification` sĂ©ma (9 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `gamification.point_rules` | `PointRule` | `gamification.py:13` | Akció→pont szabĂĄlyok | | `gamification.level_configs` | `LevelConfig` | `gamification.py:23` | SzintkĂŒszöbök | | `gamification.points_ledger` | `PointsLedger` | `gamification.py:33` | XP/bĂŒntetĂ©s tranzakciĂłk | | `gamification.user_stats` | `UserStats` | `gamification.py:49` | AggregĂĄlt statok | | `gamification.badges` | `Badge` | `gamification.py:71` | JelvĂ©nyek | | `gamification.user_badges` | `UserBadge` | `gamification.py:80` | M:N user↔jelvĂ©ny | | `gamification.user_contributions` | `UserContribution` | `gamification.py:95` | HozzĂĄjĂĄrulĂĄsok | | `gamification.seasons` | `Season` | `gamification.py:136` | Szezonok | | `gamification.seasonal_competitions` | `SeasonalCompetitions` | `gamification.py:149` | Versenyek | ### 2.9 `marketing` sĂ©ma (7 tĂĄbla) | TĂĄbla | Modell | FĂĄjl | LeĂ­rĂĄs | |-------|--------|------|--------| | `marketing.campaigns` | `Campaign` | `marketing.py:65` | KampĂĄnyok JSONB cĂ©lzĂĄssal | | `marketing.creatives` | `Creative` | `marketing.py:126` | KreatĂ­v anyagok | | `marketing.placements` | `Placement` | `marketing.py:174` | HirdetĂ©si felĂŒletek | | `marketing.campaign_creatives` | `CampaignCreative` | `marketing.py:204` | M:N kampĂĄny↔kreatĂ­v | | `marketing.campaign_placements` | `CampaignPlacement` | `marketing.py:226` | M:N kampĂĄny↔elhelyezĂ©s | | `marketing.ad_impressions` | `AdImpression` | `marketing.py:247` | HirdetĂ©si megjelenĂ©sek | | `marketing.ad_clicks` | `AdClick` | `marketing.py:276` | HirdetĂ©si kattintĂĄsok | --- ## 3. Kapcsolati TĂ©rkĂ©p (Entity-Relationship) ### 3.1 VizuĂĄlis ÖsszefoglalĂł ```mermaid erDiagram ASSET ||--o{ ASSET_COST : van ASSET ||--o{ ASSET_EVENT : van ASSET ||--o{ VEHICLE_LOGBOOK : van ASSET ||--o{ ASSET_INSPECTION : van ASSET ||--o{ ASSET_REVIEW : van ASSET ||--o{ ODOMETER_READING : van ASSET ||--o{ VEHICLE_OWNERSHIP : van ASSET ||--o{ ASSET_ASSIGNMENT : van ASSET ||--o{ SERVICE_REQUEST : van ASSET ||--o{ VEHICLE_TRANSFER : van ASSET ||--|| ASSET_FINANCIALS : 1:1 ASSET ||--|| ASSET_TELEMETRY : 1:1 ASSET ||--o| ASSET_CATALOG : katalogus PERSON ||--o{ USER : fiĂłk PERSON ||--o{ ORGANIZATION : tulajdonol USER ||--|| WALLET : 1:1 USER ||--|| USER_TRUST_PROFILE : 1:1 USER ||--|| USER_STATS : 1:1 ORGANIZATION ||--o{ MEMBER : tagok ORGANIZATION ||--o{ BRANCH : telephely ORGANIZATION ||--o{ ASSET_ASSIGNMENT : jarmuvek ORGANIZATION ||--o| SERVICE_PROFILE : szolgaltato VMD ||--o{ ASSET_CATALOG : varians VMD ||--o{ VEHICLE_COST : koltseg VMD ||--o{ VEHICLE_RATING : ertekeles ``` ### 3.2 Kritikus Kapcsolatok #### âœłïž FIGYELEM: `VehicleCost` eltĂ©rƑ referenciĂĄja A [`VehicleCost`](backend/app/models/vehicle/vehicle.py:64) `vehicle_id` mezeje a [`VehicleModelDefinition`](backend/app/models/vehicle/vehicle_definitions.py:48)-re mutat, **NEM** az [`Asset`](backend/app/models/vehicle/asset.py:69)-re! Ez architekturĂĄlis anomĂĄlia: a költsĂ©gek a modelldefinĂ­ciĂłhoz vannak kötve, nem a konkrĂ©t jĂĄrmƱpĂ©ldĂĄnyhoz. #### âœłïž TöbbfĂ©le cost modell - [`VehicleCost`](backend/app/models/vehicle/vehicle.py:64) — VMD-hez kötött - [`AssetCost`](backend/app/models/vehicle/asset.py:271) — Asset-hez kötött (TCO) - [`VehicleExpenses`](backend/app/models/vehicle/asset.py:528) — Asset-hez kötött (expense) - [`Cost`](backend/app/models/marketplace/service.py:196) — MarketPlace költsĂ©g #### âœłïž Person-User Dual Entity - [`Person`](backend/app/models/identity/identity.py:37) — DNS, halhatatlan, `merged_into_id` self-ref - [`User`](backend/app/models/identity/identity.py:126) — Login entitĂĄs, törölhetƑ - `OrganizationMember` mindkettƑhöz kötƑdhet #### âœłïž ÖnhivatkozĂł hierarchiĂĄk (7 darab) 1. [`CostCategory`](backend/app/models/vehicle/vehicle.py:19) — `parent_id` self 2. [`ExpertiseTag`](backend/app/models/marketplace/service.py:79) — `parent_id` + `path` (4 szint) 3. [`ServiceSpecialty`](backend/app/models/core_logic.py:88) — `parent_id` self 4. [`User.referred_by_id`](backend/app/models/identity/identity.py:149) — self 5. [`User.current_sales_agent_id`](backend/app/models/identity/identity.py:150) — self 6. [`Person.merged_into_id`](backend/app/models/identity/identity.py:76) — self 7. [`ServiceProfile.parent_id`](backend/app/models/marketplace/service.py:31) — self --- ## 4. Központi EntitĂĄs: Asset (Digital Twin) Az [`Asset`](backend/app/models/vehicle/asset.py:69) a rendszer központi entitĂĄsa, **84 oszloppal** Ă©s **12+ kapcsolattal**. ### 4.1 Asset mezƑstruktĂșra ```yaml # === AZONOSÍTÓ ÉS KATALÓGUS === id: UUID (PK) | catalog_id: FK vezerel.vehicle_catalog.id | name: String # === JÁRMư SPECIFIKUS (DENORMALIZÁLT) === vin: String(17) | license_plate: String(20) | make: String(100) model: String(255) | year: Integer | variant: String(100) fuel_type: String(50) | engine_size: Integer | color: String(50) seats: Integer | body_type: String(50) | transmission_type: String(30) drivetrain: String(30) | mileage_unit: String(10) # === MưSZAKI ADATOK === power_hp: Integer | power_kw: Integer | torque_nm: Integer co2_emission: Integer | euro_class: String(10) | emission_class: String(10) # === FELSZERELTSÉG === audio_system_type: String(100) individual_equipment: JSONB # ← CRITICAL: is_primary itt tĂĄrolva! # === REGISZTRÁCIÓS DOKUMENTUMOK (RÉSZLEGES) === registration_certificate_number: String(50) registration_certificate_validity: DateTime vehicle_registration_document_number: String(50) # === SZERVEZET ÉS LOKÁCIÓ === current_organization_id: FK | branch_id: FK | relocation_performed: Boolean # === TULAJDONOS ÉS ÜZEMELTETƐ === owner_person_id: FK | owner_org_id: FK operator_person_id: FK | operator_org_id: FK # === ÁLLAPOT === status: String(30) | data_status: String(20) | current_mileage: Integer condition_score: Integer(0-100) # === IDƐBÉLYEGEK === created_at | updated_at | first_registration_date | purchase_date warranty_expiry | last_technical_inspection | next_inspection_date ``` ### 4.2 Asset kapcsolati kĂ©p ``` Asset ├──1:1──â–ș AssetFinancials (pĂ©nzĂŒgy) ├──1:N──â–ș AssetCost (TCO költsĂ©gek) ├──1:N──â–ș AssetEvent (DigitĂĄlis Szervizkönyv) ├──1:N──â–ș VehicleLogbook (NAV menetlevĂ©l) ├──1:N──â–ș AssetInspection (napi ellenƑrzĂ©s) ├──1:N──â–ș AssetReview (Ă©rtĂ©kelĂ©sek) ├──1:1──â–ș AssetTelemetry ├──1:N──â–ș OdometerReading (ĂłraĂĄllĂĄs) ├──1:N──â–ș VehicleOwnership (tulajdonosvĂĄltozĂĄs) ├──1:N──â–ș AssetAssignment (→Organization) ├──1:N──â–ș ServiceRequest ├──1:N──â–ș VehicleTransferRequest ├──N:1──â–ș AssetCatalog ├──N:1──â–ș Organization (current) ├──N:1──â–ș Branch ├──N:1──â–ș Person (owner/operator) └──N:1──â–ș Organization (owner/operator) ``` --- ## 5. JSONB MezƑk Teljes FeltĂĄrĂĄsa Összesen **56 JSONB mezƑ** talĂĄlhatĂł. AlĂĄbb a kritikusak. ### 5.1 `Asset.individual_equipment` — KRITIKUS **DeklarĂĄciĂł:** [`asset.py:114`](backend/app/models/vehicle/asset.py:114) ```python individual_equipment: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) ``` **Jelenlegi tartalom:** ```json { "is_primary": true|false, // + extra felszerelĂ©sek } ``` **ProblĂ©ma:** Az `is_primary` logikai mezƑ JSONB-ben van elrejtve, lekĂ©rdezhetetlen index nĂ©lkĂŒl. ORM szinten computed property-kĂ©nt van kezelve (lĂĄsd [`asset.py:183-198`](backend/app/models/vehicle/asset.py:183)). ### 5.2 Többi Kritikus JSONB MezƑ | Modell | MezƑ | CĂ©l | |--------|------|-----| | `AssetCatalog` | `factory_data` | GyĂĄri adatok | | `AssetFinancials` | `accounting_details` | SzĂĄmviteli rĂ©szletek | | `AssetCost` | `data` | KöltsĂ©g metaadatok | | `VehicleModelDefinition` | `marketing_name_aliases` | AlternatĂ­v nevek | | `VehicleModelDefinition` | `raw_api_data` | API nyers vĂĄlasz | | `VehicleModelDefinition` | `research_metadata` | KutatĂĄsi adatok | | `VehicleModelDefinition` | `specifications` | SpecifikĂĄciĂłk | | `Person` | `identity_docs` | SzemĂ©lyi docs | | `Person` | `ice_contact` | VĂ©szhelyzeti kapcsolat | | `User` | `visual_settings` | UI beĂĄllĂ­tĂĄsok | | `User` | `custom_permissions` | Egyedi jogok | | `User` | `alternative_emails` | AlternatĂ­v emailek | | `User` | `email_history` | Email vĂĄltozĂĄsok | | `Organization` | `visual_settings` | CĂ©g UI beĂĄllĂ­tĂĄsok | | `Organization` | `settings` | CĂ©g beĂĄllĂ­tĂĄsok | | `Organization` | `aliases` | Alias nevek | | `Organization` | `tags` | CĂ­mkĂ©k | | `Organization` | `notification_settings` | ÉrtesĂ­tĂ©si beĂĄllĂ­tĂĄsok | | `Organization` | `external_integration_config` | KĂŒlsƑ integrĂĄciĂł | | `ServiceProfile` | `vibe_analysis` | AI hangulatelemzĂ©s | | `ServiceProfile` | `social_links` | KözössĂ©gi linkek | | `ServiceProfile` | `specialization_tags` | SpecializĂĄciĂłk | | `ServiceProfile` | `verification_log` | EllenƑrzĂ©si naplĂł | | `ServiceProfile` | `opening_hours` | NyitvatartĂĄs | | `ExpertiseTag` | `name_translations` | TöbbnyelvƱ nĂ©v | | `ExpertiseTag` | `search_keywords` | Kulcsszavak | | `OrgRole` | `permissions` | Capability flag-ek | | `Branch` | `opening_hours` | NyitvatartĂĄs | | `Rating` | `images` | KĂ©pek array | | `Campaign` | `targeting` | CĂ©lzĂĄs | | `AssetInspection` | `checklist_results` | EllenƑrzƑ lista | | `PendingAction` | `payload` | MƱveleti adatok | | `SubscriptionTier` | `rules` | Csomag szabĂĄlyok | | `OrganizationSubscription` | `extra_allowances` | **Booster architektĂșra** | | `SystemParameter` | `value` | ParamĂ©ter Ă©rtĂ©k | | `InternalNotification` | `data` | ÉrtesĂ­tĂ©si adatok | | `SystemServiceStaging` | `raw_data` | Nyers staging adat | | `FinancialLedger` | `details` | TranzakciĂł rĂ©szletek | --- ## 6. Redundancia AnalĂ­zis ### 6.1 MAGAS KOCKÁZATÚ #### 1. Dupla KöltsĂ©g Rendszer | TĂĄbla | Referencia | CĂ©l | |-------|-----------|-----| | `VehicleCost` | vehicle_id → VMD.id | ❌ AnomĂĄlia | | `AssetCost` | asset_id → Asset.id | ✅ Helyes | | `VehicleExpenses` | vehicle_id → Asset.id | ✅ Helyes | **KockĂĄzat:** `VehicleCost` a modell-definĂ­ciĂłhoz köt, nem a konkrĂ©t jĂĄrmƱhöz. #### 2. HĂĄromszoros kilomĂ©terĂłra tĂĄrolĂĄs - `Asset.current_mileage` — denormalizĂĄlt utolsĂł Ă©rtĂ©k - `OdometerReading.reading` — idƑbeli adatsor - `AssetTelemetry.current_mileage` — harmadik helyen! #### 3. Asset mezƑk duplikĂĄciĂłja `make`, `model`, `year`, `variant`, `fuel_type` szerepel: - `Asset`-ben (denormalizĂĄlt) - `VehicleModelDefinition`-ben (eredeti) - `AssetCatalog`-ban (katalĂłgus) #### 4. CĂ­m adatok duplikĂĄciĂłja `Branch` denormalizĂĄlt cĂ­mmezƑket tartalmaz `Address` mellett. ### 6.2 KÖZEPES KOCKÁZATÚ #### 5. KettƑs tulajdonos mezƑk - `Organization.owner_id` → users (technikai, törölhetƑ) - `Organization.legal_owner_id` → persons (jogi, halhatatlan) SzĂĄndĂ©kos (Dual Entity), de potenciĂĄlis konfĂșziĂł. #### 6. Subscription mezƑk duplikĂĄciĂłja `Organization` denormalizĂĄltan tĂĄrolja a `subscription_plan`, `base_asset_limit`, `purchased_extra_slots` mezƑket, melyek az `OrganizationSubscription`-ban is szerepelnek. ### 6.3 ALACSONY KOCKÁZAT (szĂĄndĂ©kos) - `owner_person_id` + `owner_org_id` — B2B/B2C miatt - Triple Wallet mezƑk — szĂĄndĂ©kos --- ## 7. HiĂĄnyossĂĄg ElemzĂ©s ### 7.1 Jelenlegi Állapot | Domain | StĂĄtusz | MegjegyzĂ©s | |--------|---------|------------| | **RegisztrĂĄciĂłs doksik** | ⚠ RĂ©szleges | 3 mezƑ az Asset-en | | **MƱszaki vizsga** | ⚠ RĂ©szleges | 2 mezƑ (last/next) | | **ElsƑ forgalomba helyezĂ©s** | ✅ Van | `first_registration_date` | | **KGFB biztosĂ­tĂĄs** | ❌ HIÁNYZIK | Nincs adatmodell | | **Casco biztosĂ­tĂĄs** | ❌ HIÁNYZIK | Nincs adatmodell | | **SĂșlyadĂł** | ❌ HIÁNYZIK | Nincs adatmodell | | **CĂ©gautĂł adĂł** | ❌ HIÁNYZIK | Nincs adatmodell | | **Forgalmi engedĂ©ly** | ⚠ RĂ©szleges | Csak szĂĄm + Ă©rvĂ©nyessĂ©g | | **Törzskönyv** | ⚠ RĂ©szleges | Csak szĂĄm | | **Import megkĂŒlönböztetĂ©s** | ❌ HIÁNYZIK | Nincs | | **Expected/Recurring költsĂ©gek** | ❌ HIÁNYZIK | Nincs | ### 7.2 Specifikus HiĂĄnyzĂł MezƑk #### BiztosĂ­tĂĄs (teljesen hiĂĄnyzik) ``` insurance_type: KGFB/CASCO/BOTH insurer_name, policy_number, contract_date start_date, expiry_date premium_amount, premium_currency bonus_malus_level (0-20) deductible_amount, is_active, status, notes ``` #### AdĂłk (teljesen hiĂĄnyzik) ``` tax_type: WEIGHT_TAX/COMPANY_CAR_TAX/PERFORMANCE_TAX tax_year, tax_amount, tax_currency payment_date, payment_status tax_authority, tax_period_start/end, notes ``` #### Admin (rĂ©szleges) ``` MEGLÉVƐ: registration_certificate_number, registration_certificate_validity, vehicle_registration_document_number HIÁNYZÓ: registration_type (FIRST_HU/FIRST_FOREIGN/IMPORT_USED) first_hungarian_registration_date, first_foreign_registration_date title_deed_number, title_deed_issue_date engine_number, number_of_previous_owners original_plate_number, import_country ``` #### Ütemezett költsĂ©gek (teljesen hiĂĄnyzik) ``` expected_cost_type: INSURANCE/TAX/SERVICE/INSPECTION/TIRE_CHANGE/OTHER expected_amount, currency, frequency (MONTHLY/QUARTERLY/YEARLY/ONE_TIME) next_due_date, last_paid_date, is_recurring category_id FK, description, reminder_days_before ``` --- ## 8. ArchitekturĂĄlis Javaslat ### 8.1 AjĂĄnlott: DedikĂĄlt tĂĄblĂĄk (elƑnyben rĂ©szesĂ­tett) ```sql -- BiztosĂ­tĂĄsi kötvĂ©nyek vehicle.vehicle_insurance_policies ├── id: UUID PK ├── asset_id: UUID FK -> vehicle.assets.id ├── insurance_type: ENUM(KGFB, CASCO, BOTH) ├── insurer_name, policy_number, contract_date, start_date, expiry_date ├── premium_amount, premium_currency, bonus_malus_level ├── deductible_amount, status, data: JSONB -- AdĂłkötelezettsĂ©gek vehicle.vehicle_tax_obligations ├── id: UUID PK ├── asset_id: UUID FK -> vehicle.assets.id ├── tax_type: ENUM(WEIGHT_TAX, COMPANY_CAR_TAX, PERFORMANCE_TAX) ├── tax_year, tax_amount, tax_currency ├── payment_date, payment_status, tax_period_start/end ├── data: JSONB -- Ütemezett költsĂ©gek vehicle.vehicle_expected_costs ├── id: UUID PK ├── asset_id: UUID FK -> vehicle.assets.id ├── cost_type: ENUM(INSURANCE, TAX, SERVICE, INSPECTION, TIRE_CHANGE, OTHER) ├── expected_amount, currency, frequency ├── next_due_date, last_paid_date, is_recurring ├── category_id FK -> cost_categories.id ├── description, reminder_days_before, status, data: JSONB -- RegisztrĂĄciĂłs dokumentumok (kibƑvĂ­tve) vehicle.vehicle_registration_documents ├── id: UUID PK ├── asset_id: UUID FK -> vehicle.assets.id UNIQUE ├── registration_type: ENUM(FIRST_HU, FIRST_FOREIGN, IMPORT_USED) ├── first_hungarian_registration_date, first_foreign_registration_date ├── title_deed_number, title_deed_issue_date ├── engine_number, number_of_previous_owners ├── original_plate_number, import_country, data: JSONB ``` ### 8.2 AlternatĂ­va: MeglĂ©vƑ modellek bƑvĂ­tĂ©se (gyorsabb) #### `Asset` bƑvĂ­tĂ©se: ```python first_hungarian_registration_date: Mapped[Optional[date]] first_foreign_registration_date: Mapped[Optional[date]] import_country: Mapped[Optional[str]] title_deed_number: Mapped[Optional[str]] engine_number: Mapped[Optional[str]] number_of_previous_owners: Mapped[Optional[int]] ``` #### `AssetFinancials` bƑvĂ­tĂ©se: ```python insurance_kgfb_policy_number: Mapped[Optional[str]] insurance_kgfb_expiry: Mapped[Optional[date]] insurance_kgfb_premium: Mapped[Optional[float]] insurance_casco_policy_number: Mapped[Optional[str]] insurance_casco_expiry: Mapped[Optional[date]] insurance_casco_premium: Mapped[Optional[float]] bonus_malus_level: Mapped[Optional[int]] ``` ### 8.3 AjĂĄnlott MegvalĂłsĂ­tĂĄsi Sorrend 1. **P1** — `VehicleInsurancePolicy` Ășj modell (dedikĂĄlt tĂĄbla) 2. **P1** — `VehicleTaxObligation` Ășj modell (dedikĂĄlt tĂĄbla) 3. **P2** — `VehicleExpectedCost` Ășj modell (ĂŒtemezett költsĂ©gek) 4. **P2** — `VehicleRegistrationDocument` Ășj modell (admin adatok elkĂŒlönĂ­tĂ©se) 5. **P3** — `individual_equipment.is_primary` kivezetĂ©se dedikĂĄlt boolean oszlopba --- ## 9. FĂŒggelĂ©k: Teljes FK-relationship MĂĄtrix ### 9.1 Minden ForeignKey ``` === VEHICLE SÉMA === AssetCatalog.master_definition_id -> vehicle.vehicle_model_definitions.id Asset.catalog_id -> vehicle.vehicle_catalog.id Asset.current_organization_id -> fleet.organizations.id Asset.branch_id -> fleet.branches.id Asset.owner_person_id -> identity.persons.id Asset.owner_org_id -> fleet.organizations.id Asset.operator_person_id -> identity.persons.id Asset.operator_org_id -> fleet.organizations.id AssetFinancials.asset_id -> vehicle.assets.id (UNIQUE) AssetCost.asset_id -> vehicle.assets.id AssetCost.organization_id -> fleet.organizations.id AssetCost.category_id -> vehicle.cost_categories.id AssetCost.document_id -> system.documents.id AssetCost.linked_asset_event_id -> vehicle.asset_events.id VehicleLogbook.asset_id -> vehicle.assets.id VehicleLogbook.driver_id -> identity.users.id AssetInspection.asset_id -> vehicle.assets.id AssetInspection.inspector_id -> identity.users.id AssetReview.asset_id -> vehicle.assets.id AssetReview.user_id -> identity.users.id VehicleOwnership.asset_id -> vehicle.assets.id VehicleOwnership.user_id -> identity.users.id AssetTelemetry.asset_id -> vehicle.assets.id (UNIQUE) OdometerReading.asset_id -> vehicle.assets.id OdometerReading.cost_id -> vehicle.asset_costs.id AssetAssignment.asset_id -> vehicle.assets.id AssetAssignment.organization_id -> fleet.organizations.id AssetEvent.asset_id -> vehicle.assets.id AssetEvent.user_id -> identity.users.id AssetEvent.organization_id -> fleet.organizations.id AssetEvent.cost_id -> vehicle.asset_costs.id AssetEvent.linked_expense_id -> vehicle.asset_costs.id VehicleExpenses.vehicle_id -> vehicle.assets.id VehicleTransferRequest.asset_id -> vehicle.assets.id VehicleTransferRequest.requester_id -> identity.users.id VehicleTransferRequest.current_owner_id -> identity.persons.id VehicleTransferRequest.proof_document_id -> system.documents.id VehicleCost.vehicle_id -> vehicle.vehicle_model_definitions.id VehicleCost.organization_id -> fleet.organizations.id VehicleCost.category_id -> vehicle.cost_categories.id VehicleUserRating.vehicle_id -> vehicle.vehicle_model_definitions.id VehicleUserRating.user_id -> identity.users.id CostCategory.parent_id -> vehicle.cost_categories.id (self-ref) FeatureDefinition.vehicle_type_id -> vehicle.vehicle_types.id VehicleModelDefinition.vehicle_type_id -> vehicle.vehicle_types.id ModelFeatureMap.model_definition_id -> vehicle.vehicle_model_definitions.id ModelFeatureMap.feature_id -> vehicle.feature_definitions.id MotorcycleSpecs.(FK) -> vehicle.auto_data_crawler_queue.id ExternalReferenceLibrary.matched_vmd_id -> vehicle.vehicle_model_definitions.id === IDENTITY SÉMA === Person.address_id -> system.addresses.id Person.merged_into_id -> identity.persons.id (self-ref) Person.user_id (active_user) -> identity.users.id User.person_id -> identity.persons.id User.referred_by_id -> identity.users.id (self-ref) User.current_sales_agent_id -> identity.users.id (self-ref) Wallet.user_id -> identity.users.id (UNIQUE) Wallet.organization_id -> fleet.organizations.id VerificationToken.user_id -> identity.users.id SocialAccount.user_id -> identity.users.id ActiveVoucher.wallet_id -> identity.wallets.id UserTrustProfile.user_id -> identity.users.id (PK) UserDeviceLink.user_id -> identity.users.id UserDeviceLink.device_hash -> identity.devices.fingerprint_hash === FLEET SÉMA === Organization.legal_owner_id -> identity.persons.id Organization.address_id -> system.addresses.id Organization.subscription_tier_id -> system.subscription_tiers.id Organization.owner_id -> identity.users.id OrganizationFinancials.organization_id -> fleet.organizations.id OrganizationMember.organization_id -> fleet.organizations.id OrganizationMember.user_id -> identity.users.id OrganizationMember.person_id -> identity.persons.id OrganizationSalesAssignment.organization_id -> fleet.organizations.id OrganizationSalesAssignment.agent_user_id -> identity.users.id Branch.organization_id -> fleet.organizations.id Branch.address_id -> system.addresses.id Rating.author_id -> identity.users.id Rating.target_organization_id -> fleet.organizations.id Rating.target_user_id -> identity.users.id Rating.target_branch_id -> fleet.branches.id === SYSTEM SÉMA === Address.postal_code_id -> system.geo_postal_codes.id GeoStreet.postal_code_id -> system.geo_postal_codes.id InternalNotification.user_id -> identity.users.id Document.uploaded_by -> identity.users.id LegalAcceptance.user_id -> identity.users.id LegalAcceptance.document_id -> system.legal_documents.id PendingAction.requester_id -> identity.users.id PendingAction.approver_id -> identity.users.id === MARKETPLACE SÉMA === ServiceProfile.organization_id -> fleet.organizations.id (UNIQUE) ServiceProfile.parent_id -> marketplace.service_profiles.id (self-ref) ExpertiseTag.parent_id -> marketplace.expertise_tags.id (self-ref) ExpertiseTag.suggested_by_id -> identity.persons.id ServiceExpertise.service_id -> marketplace.service_profiles.id ServiceExpertise.expertise_id -> marketplace.expertise_tags.id ServiceRequest.user_id -> identity.users.id ServiceRequest.asset_id -> vehicle.assets.id ServiceRequest.branch_id -> fleet.branches.id ServiceProvider.added_by_user_id -> identity.users.id Vote.user_id -> identity.users.id Vote.provider_id -> marketplace.service_providers.id UserScore.user_id -> identity.users.id UserScore.competition_id -> gamification.competitions.id ServiceReview.service_id -> marketplace.service_profiles.id ServiceReview.user_id -> identity.users.id ServiceReview.transaction_id -> audit.financial_ledger.transaction_id ServiceSpecialty.parent_id -> marketplace.service_specialties.id (self-ref) OrganizationSubscription.org_id -> fleet.organizations.id OrganizationSubscription.tier_id -> system.subscription_tiers.id UserSubscription.user_id -> identity.users.id UserSubscription.tier_id -> system.subscription_tiers.id CreditTransaction.org_id -> fleet.organizations.id === FINANCE SÉMA === PaymentIntent.payer_id -> identity.users.id PaymentIntent.beneficiary_id -> identity.users.id WithdrawalRequest.user_id -> identity.users.id WithdrawalRequest.approved_by_id -> identity.users.id === AUDIT SÉMA === SecurityAuditLog.actor_id -> identity.users.id SecurityAuditLog.target_id -> identity.users.id SecurityAuditLog.confirmed_by_id -> identity.users.id OperationalLog.user_id -> identity.users.id FinancialLedger.user_id -> identity.users.id FinancialLedger.person_id -> identity.persons.id FinancialLedger.related_agent_id -> identity.users.id FinancialLedger.issuer_id -> finance.issuers.id === GAMIFICATION SÉMA === PointsLedger.user_id -> identity.users.id UserStats.user_id -> identity.users.id (PK) UserBadge.user_id -> identity.users.id UserBadge.badge_id -> gamification.badges.id UserContribution.user_id -> identity.users.id UserContribution.season_id -> gamification.seasons.id UserContribution.reviewed_by -> identity.users.id SeasonalCompetitions.season_id -> gamification.seasons.id === MARKETING SÉMA === CampaignCreative.campaign_id -> marketing.campaigns.id CampaignCreative.creative_id -> marketing.creatives.id CampaignPlacement.campaign_id -> marketing.campaigns.id CampaignPlacement.placement_id -> marketing.placements.id AdImpression.campaign_id -> marketing.campaigns.id AdImpression.creative_id -> marketing.creatives.id AdImpression.placement_id -> marketing.placements.id AdClick.impression_id -> marketing.ad_impressions.id AdClick.campaign_id -> marketing.campaigns.id AdClick.creative_id -> marketing.creatives.id ``` ### 9.2 Leggyakrabban Hivatkozott TĂĄblĂĄk | TĂĄbla | HivatkozĂĄsok | Honnan | |-------|-------------|--------| | `identity.users` | **30+** | Minden domainbƑl | | `vehicle.assets` | **12** | cost, event, logbook, inspection, stb. | | `fleet.organizations` | **10** | asset, cost, member, branch, stb. | | `identity.persons` | **6** | user, organization, financial_ledger | | `vehicle.vehicle_model_definitions` | **4** | catalog, cost, rating | | `vehicle.cost_categories` | **3** | asset_cost, vehicle_cost | --- ## ÖsszefoglalĂĄs ### FƑbb MegĂĄllapĂ­tĂĄsok 1. **Központi entitĂĄs:** [`Asset`](backend/app/models/vehicle/asset.py:69) — Digital Twin, 12+ kapcsolattal 2. **Legkritikusabb redundancia:** `VehicleCost` a VMD-hez köt (NEM az Asset-hez) 3. **Dual Entity:** `Person` (DNS) + `User` (login) sikeresen implementĂĄlva 4. **7 önhivatkozĂł hierarchia** — CostCategory, ExpertiseTag (4 szint), ServiceSpecialty, User (referral, sales), Person (merge), ServiceProfile 5. **56 JSONB mezƑ** — RugalmassĂĄg, de kereshetƑsĂ©get ront 6. **`individual_equipment.is_primary`** — Logikai mezƑ JSONB-ben elrejtve ### Kritikus HiĂĄnyossĂĄgok 1. ❌ **BiztosĂ­tĂĄsi adatok teljes hiĂĄnya** (KGFB, Casco) 2. ❌ **AdĂł adatok teljes hiĂĄnya** (sĂșlyadĂł, cĂ©gautĂł adĂł) 3. ❌ **ElsƑ forgalomba helyezĂ©s tĂ­pusĂĄnak hiĂĄnya** 4. ❌ **Ütemezett/expected költsĂ©gek hiĂĄnya** 5. ⚠ **RegisztrĂĄciĂłs dokumentumok rĂ©szlegesek** (3 mezƑ) 6. ⚠ **HĂĄrom cost modell pĂĄrhuzamosan** eltĂ©rƑ referenciĂĄkkal ### AjĂĄnlott KövetkezƑ LĂ©pĂ©sek 1. **P1:** DedikĂĄlt `VehicleInsurancePolicy` Ă©s `VehicleTaxObligation` modellek 2. **P1:** `Asset` bƑvĂ­tĂ©se hiĂĄnyzĂł admin mezƑkkel 3. **P2:** `VehicleExpectedCost` modell 4. **P2:** `VehicleRegistrationDocument` modell 5. **P3:** `individual_equipment.is_primary` dedikĂĄlt boolean oszlopba 6. **P3:** Cost modellek konszolidĂĄciĂłja