# ๐Ÿ“ Full Database Schema Blueprint โ€” Service Finder > **P0 DEEP AUDIT** โ€” Generated from SQLAlchemy models in `backend/app/models/` > > Format: Schema โ†’ Table โ†’ Columns (flat dump, no relationships) > > **9 schemas ยท ~100 tables** cataloged --- ## ๐Ÿงฌ 1. Schema: `identity` ### `identity.persons` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `BIGINT` | PK | Primary key, indexed | | `id_uuid` | `UUID` | UNIQUE | `uuid.uuid4()`, not null | | `address_id` | `UUID` | FK โ†’ `system.addresses.id` | Nullable | | `identity_hash` | `VARCHAR(64)` | UNIQUE, INDEX | Hash: lastName + motherName + birthDate | | `last_name` | `VARCHAR` | NOT NULL | | | `first_name` | `VARCHAR` | NOT NULL | | | `phone` | `VARCHAR` | | Nullable | | `mothers_last_name` | `VARCHAR` | | Nullable | | `mothers_first_name` | `VARCHAR` | | Nullable | | `birth_place` | `VARCHAR` | | Nullable | | `birth_date` | `DATETIME` | | Nullable | | `identity_docs` | `JSON` | NOT NULL | Default: `{}` | | `ice_contact` | `JSON` | NOT NULL | Default: `{}` | | `lifetime_xp` | `BIGINT` | NOT NULL | Default: -1 | | `penalty_points` | `INTEGER` | NOT NULL | Default: -1 | | `social_reputation` | `NUMERIC(3,2)` | NOT NULL | Default: 0.0 | | `is_sales_agent` | `BOOLEAN` | NOT NULL | Default: true | | `is_active` | `BOOLEAN` | NOT NULL | Default: true | | `is_ghost` | `BOOLEAN` | NOT NULL | Default: false | | `merged_into_id` | `BIGINT` | FK โ†’ `identity.persons.id` | Self-ref, nullable | | `deleted_at` | `DATETIME` | | Timezone-aware, nullable | | `created_at` | `DATETIME` | NOT NULL | `func.now()` | | `updated_at` | `DATETIME` | | `onupdate=func.now()` | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Active user, nullable | ### `identity.users` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Primary key, indexed | | `id_uuid` | `UUID` | UNIQUE | `uuid.uuid4()`, not null | | `person_id` | `BIGINT` | FK โ†’ `identity.persons.id` | NOT NULL | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Primary org, nullable | | `role` | `VARCHAR(50)` | NOT NULL | ENUM: SUPERADMIN/ADMIN/MODERATOR/SALES_REP/SERVICE_MGR/USER | | `username` | `VARCHAR(80)` | UNIQUE, INDEX | Not null | | `email` | `VARCHAR(255)` | UNIQUE, INDEX | Not null | | `password_hash` | `VARCHAR(255)` | NOT NULL | | | `avatar_url` | `VARCHAR` | | Nullable | | `phone` | `VARCHAR(50)` | | Nullable | | `is_active` | `BOOLEAN` | NOT NULL | Default: true | | `is_verified` | `BOOLEAN` | NOT NULL | Default: false | | `is_onboarded` | `BOOLEAN` | NOT NULL | Default: false | | `is_superuser` | `BOOLEAN` | NOT NULL | Default: false | | `language` | `VARCHAR(10)` | | Default: 'hu' | | `preferences` | `JSON` | NOT NULL | Default: `{}` | | `last_login_at` | `DATETIME` | | Nullable | | `deleted_at` | `DATETIME` | | Soft delete, nullable | | `created_at` | `DATETIME` | NOT NULL | `func.now()` | | `updated_at` | `DATETIME` | | `onupdate=func.now()` | ### `identity.wallets` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Primary key, indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `balance_earned` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `balance_purchased` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `balance_service_coins` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `balance_voucher` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `total_deposited` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `total_withdrawn` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `lifetime_earned` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `lifetime_spent` | `NUMERIC(18,4)` | NOT NULL | Default: 0.0 | | `created_at` | `DATETIME` | NOT NULL | `func.now()` | | `updated_at` | `DATETIME` | | `onupdate=func.now()` | ### `identity.verification_tokens` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `token` | `VARCHAR` | UNIQUE | NOT NULL | | `token_type` | `VARCHAR(20)` | | email_verification, password_reset, etc. | | `expires_at` | `DATETIME` | NOT NULL | | | `is_used` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | ### `identity.social_accounts` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `provider` | `VARCHAR(50)` | NOT NULL | e.g. google, facebook | | `provider_id` | `VARCHAR(255)` | NOT NULL | | | `extra_data` | `JSON` | | Default: `{}` | | `created_at` | `DATETIME` | | `func.now()` | ### `identity.active_vouchers` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `wallet_id` | `INTEGER` | FK โ†’ `identity.wallets.id` | CASCADE delete | | `amount` | `NUMERIC(18,4)` | NOT NULL | | | `original_amount` | `NUMERIC(18,4)` | NOT NULL | | | `expires_at` | `DATETIME` | NOT NULL | Timezone-aware | | `created_at` | `DATETIME` | | `func.now()` | ### `identity.user_trust_profiles` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `user_id` | `INTEGER` | PK, FK โ†’ `identity.users.id` | CASCADE delete | | `trust_score` | `INTEGER` | NOT NULL | Default: 0 | | `maintenance_score` | `NUMERIC(5,2)` | NOT NULL | Default: 0.0 | | `quality_score` | `NUMERIC(5,2)` | NOT NULL | Default: 0.0 | | `preventive_score` | `NUMERIC(5,2)` | NOT NULL | Default: 0.0 | | `identity_score` | `INTEGER` | NOT NULL | Default: 0 | | `verification_level` | `INTEGER` | NOT NULL | Default: 0 | | `verified_channels` | `JSONB` | NOT NULL | Default: `{}` | | `identity_risk_flag` | `BOOLEAN` | NOT NULL | Default: false | | `last_calculated` | `DATETIME` | NOT NULL | `func.now()` | ### `identity.one_time_passwords` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `email` | `VARCHAR` | INDEX | NOT NULL | | `code` | `VARCHAR(6)` | NOT NULL | | | `otp_type` | `VARCHAR(30)` | NOT NULL | 'restore' or 'company_claim' | | `extra_data` | `JSON` | | Nullable | | `is_used` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | | `expires_at` | `DATETIME` | NOT NULL | | ### `identity.devices` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `fingerprint_hash` | `VARCHAR(255)` | PK | Indexed | | `risk_score` | `INTEGER` | NOT NULL | Default: 100 | | `is_banned` | `BOOLEAN` | NOT NULL | Default: false | | `created_at` | `DATETIME` | NOT NULL | | ### `identity.user_device_links` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | CASCADE, indexed | | `device_hash` | `VARCHAR(255)` | FK โ†’ `identity.devices.fingerprint_hash` | CASCADE, indexed | | `first_seen_at` | `DATETIME` | NOT NULL | | | `last_seen_at` | `DATETIME` | | Nullable | ### `identity.legal_acceptances` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | | | `document_id` | `INTEGER` | FK โ†’ `system.legal_documents.id` | | | `accepted_at` | `DATETIME` | | `func.now()` | | `ip_address` | `VARCHAR(45)` | | Nullable | --- ## ๐Ÿงฌ 2. Schema: `system` ### `system.geo_postal_codes` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `country_code` | `VARCHAR(5)` | | Default: 'HU' | | `zip_code` | `VARCHAR(10)` | INDEX | NOT NULL | | `city` | `VARCHAR(100)` | INDEX | NOT NULL | ### `system.geo_streets` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `postal_code_id` | `INTEGER` | FK โ†’ `system.geo_postal_codes.id` | Nullable | | `name` | `VARCHAR(200)` | INDEX | NOT NULL | ### `system.geo_street_types` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(50)` | UNIQUE | NOT NULL | ### `system.addresses` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `postal_code_id` | `INTEGER` | FK โ†’ `system.geo_postal_codes.id` | Nullable | | `street_name` | `VARCHAR(200)` | | Nullable | | `street_type` | `VARCHAR(50)` | | Nullable | | `house_number` | `VARCHAR(50)` | | Nullable | | `stairwell` | `VARCHAR(20)` | | Nullable | | `floor` | `VARCHAR(20)` | | Nullable | | `door` | `VARCHAR(20)` | | Nullable | | `parcel_id` | `VARCHAR(50)` | | Nullable | | `full_address_text` | `TEXT` | | Nullable | | `latitude` | `FLOAT` | | Nullable | | `longitude` | `FLOAT` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | ### `system.pending_actions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `requester_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `approver_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `status` | `ENUM(actionstatus)` | | Default: 'pending' | | `action_type` | `VARCHAR(50)` | NOT NULL | e.g. 'WALLET_ADJUST' | | `payload` | `JSONB` | NOT NULL | | | `reason` | `VARCHAR(255)` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | | `expires_at` | `DATETIME` | | `now() + 24h` | | `processed_at` | `DATETIME` | | Nullable | ### `system.system_parameters` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Auto-increment | | `key` | `VARCHAR` | INDEX | NOT NULL | | `category` | `VARCHAR` | INDEX | Default: 'general' | | `value` | `JSONB` | NOT NULL | | | `scope_level` | `VARCHAR(50)` | INDEX | Default: 'global' | | `scope_id` | `VARCHAR(50)` | | Nullable | | `is_active` | `BOOLEAN` | | Default: true | | `description` | `VARCHAR` | | Nullable | | `last_modified_by` | `INTEGER` | | Nullable | | `updated_at` | `DATETIME` | | `func.now()` | | UNIQUE | | | `(key, scope_level, scope_id)` | ### `system.internal_notifications` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | CASCADE, indexed | | `title` | `VARCHAR(255)` | NOT NULL | | | `message` | `TEXT` | NOT NULL | | | `category` | `VARCHAR(50)` | | Default: 'info' | | `priority` | `VARCHAR(20)` | | Default: 'medium' | | `is_read` | `BOOLEAN` | INDEX | Default: false | | `read_at` | `DATETIME` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | | `data` | `JSONB` | | Nullable | ### `system.system_data_completion_weights` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Auto-increment | | `entity_type` | `VARCHAR(50)` | INDEX | NOT NULL | | `field_name` | `VARCHAR(100)` | INDEX | NOT NULL | | `weight_percent` | `INTEGER` | NOT NULL | 0-100% | | `is_mandatory` | `BOOLEAN` | | Default: false | | `is_active` | `BOOLEAN` | | Default: true | | `description` | `TEXT` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | | `is_read` | `BOOLEAN` | NOT NULL | Shadow column, Default: false | | UNIQUE | | | `(entity_type, field_name)` | ### `system.service_staging` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(255)` | INDEX | NOT NULL | | `source` | `VARCHAR(50)` | | NOT NULL | | `external_id` | `VARCHAR(100)` | INDEX | Nullable | | `fingerprint` | `VARCHAR(64)` | UNIQUE, INDEX | NOT NULL | | `postal_code` | `VARCHAR(20)` | INDEX | Nullable | | `city` | `VARCHAR(100)` | INDEX | NOT NULL | | `full_address` | `VARCHAR(500)` | | Nullable | | `contact_phone` | `VARCHAR(50)` | | Nullable | | `website` | `VARCHAR(255)` | | Nullable | | `description` | `TEXT` | | Nullable | | `submitted_by` | `INTEGER` | | Nullable | | `raw_data` | `JSONB` | | Default: `{}` | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | Nullable | ### `system.documents` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `parent_type` | `VARCHAR(20)` | | 'organization' or 'asset' | | `parent_id` | `VARCHAR(50)` | INDEX | | | `doc_type` | `VARCHAR(50)` | | Nullable | | `original_name` | `VARCHAR(255)` | NOT NULL | | | `file_hash` | `VARCHAR(64)` | NOT NULL | | | `file_ext` | `VARCHAR(10)` | | Default: 'webp' | | `mime_type` | `VARCHAR(100)` | | Default: 'image/webp' | | `file_size` | `INTEGER` | | Nullable | | `has_thumbnail` | `BOOLEAN` | | Default: false | | `thumbnail_path` | `VARCHAR(255)` | | Nullable | | `uploaded_by` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `created_at` | `DATETIME` | | `func.now()` | | `status` | `VARCHAR(50)` | INDEX | Default: 'uploaded' | | `ocr_data` | `TEXT` | | Nullable | | `error_log` | `TEXT` | | Nullable | ### `system.translations` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `key` | `VARCHAR(255)` | INDEX | NOT NULL | | `lang` | `VARCHAR(5)` | INDEX | NOT NULL | | `value` | `TEXT` | NOT NULL | | | `is_published` | `BOOLEAN` | | Default: true | ### `system.legal_documents` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `title` | `VARCHAR(255)` | | Nullable | | `content` | `TEXT` | NOT NULL | | | `version` | `VARCHAR(20)` | NOT NULL | | | `region_code` | `VARCHAR(5)` | | Default: 'HU' | | `language` | `VARCHAR(5)` | | Default: 'hu' | | `is_active` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | ### `system.subscription_tiers` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR` | UNIQUE, INDEX | e.g. 'premium' | | `rules` | `JSONB` | | Default: `{}` | | `is_custom` | `BOOLEAN` | | Default: false | ### `system.service_catalog` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `service_code` | `VARCHAR` | UNIQUE, INDEX | NOT NULL, e.g. 'SRV_DATA_EXPORT' | | `name` | `VARCHAR` | NOT NULL | | | `description` | `VARCHAR` | | Nullable | | `credit_cost` | `INTEGER` | | Default: 0 | | `is_active` | `BOOLEAN` | | Default: true | --- ## ๐Ÿงฌ 3. Schema: `vehicle` ### `vehicle.vehicle_types` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `code` | `VARCHAR(30)` | UNIQUE, INDEX | | | `name` | `VARCHAR(50)` | NOT NULL | | | `icon` | `VARCHAR(50)` | | Nullable | | `units` | `JSONB` | | Default: `{"power": "kW", "weight": "kg"}` | ### `vehicle.feature_definitions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `vehicle_type_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_types.id` | NOT NULL | | `code` | `VARCHAR(50)` | INDEX | | | `name` | `VARCHAR(100)` | NOT NULL | | | `category` | `VARCHAR(50)` | INDEX | | ### `vehicle.vehicle_model_definitions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `market` | `VARCHAR(20)` | INDEX | Default: 'EU' | | `make` | `VARCHAR(100)` | INDEX | | | `marketing_name` | `VARCHAR(255)` | INDEX | | | `official_marketing_name` | `VARCHAR(255)` | | Nullable | | `attempts` | `INTEGER` | | Default: 0 | | `last_error` | `TEXT` | | Nullable | | `updated_at` | `DATETIME` | | `func.now()` | | `priority_score` | `INTEGER` | | Default: 0 | | `normalized_name` | `VARCHAR(255)` | INDEX | NOT NULL | | `marketing_name_aliases` | `JSONB` | | Default: `[]` | | `engine_code` | `VARCHAR(50)` | INDEX | Nullable | | `technical_code` | `VARCHAR(100)` | INDEX | Default: 'UNKNOWN' | | `variant_code` | `VARCHAR(100)` | INDEX | Default: 'UNKNOWN' | | `version_code` | `VARCHAR(100)` | INDEX | Default: 'UNKNOWN' | | `type_approval_number` | `VARCHAR(100)` | INDEX | Nullable | | `seats` | `INTEGER` | | Default: 0 | | `width` | `INTEGER` | | Default: 0 | | `wheelbase` | `INTEGER` | | Default: 0 | | `list_price` | `INTEGER` | | Default: 0 | | `max_speed` | `INTEGER` | | Default: 0 | | `towing_weight_unbraked` | `INTEGER` | | Default: 0 | | `towing_weight_braked` | `INTEGER` | | Default: 0 | | `fuel_consumption_combined` | `NUMERIC(10,2)` | | Nullable | | `co2_emissions_combined` | `INTEGER` | | Default: 0 | | `vehicle_type_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_types.id` | Nullable | | `vehicle_class` | `VARCHAR(50)` | INDEX | Nullable | | `fuel_type` | `VARCHAR(50)` | INDEX | Nullable | | `engine_capacity` | `INTEGER` | INDEX | Nullable | | `power_kw` | `INTEGER` | INDEX | Nullable | | `power_hp` | `INTEGER` | | Nullable | | `transmission_type` | `VARCHAR(50)` | INDEX | Nullable | | `drive_type` | `VARCHAR(50)` | INDEX | Nullable | | `body_type` | `VARCHAR(100)` | INDEX | Nullable | | `emission_standard` | `VARCHAR(50)` | INDEX | Nullable | | `model_year_from` | `INTEGER` | INDEX | Nullable | | `model_year_to` | `INTEGER` | INDEX | Nullable | | `weight_kg` | `INTEGER` | | Nullable | | `total_weight_kg` | `INTEGER` | | Nullable | | `axle_count` | `INTEGER` | | Nullable | | `is_4x4` | `BOOLEAN` | | Default: false | | `origin_country` | `VARCHAR(100)` | | Nullable | | `gold_enriched` | `BOOLEAN` | INDEX | Default: false | | `engine_hash` | `VARCHAR(64)` | INDEX | Nullable | | `compliance` | `JSONB` | | Nullable | | `specifications` | `JSONB` | | Nullable | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.model_feature_maps` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `model_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_model_definitions.id` | NOT NULL | | `feature_id` | `INTEGER` | FK โ†’ `vehicle.feature_definitions.id` | NOT NULL | | UNIQUE | | | `(model_id, feature_id)` | ### `vehicle.reference_lookup` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `make` | `VARCHAR` | INDEX | NOT NULL | | `model` | `VARCHAR` | INDEX | NOT NULL | | `year` | `INTEGER` | INDEX | Nullable | | `specs` | `JSONB` | NOT NULL | | | `source` | `VARCHAR` | NOT NULL | e.g. 'os-vehicle-db' | | `source_id` | `VARCHAR` | | Nullable | | `updated_at` | `DATETIME` | | `func.now()` | ### `vehicle.cost_categories` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(100)` | UNIQUE, INDEX | NOT NULL | | `parent_id` | `INTEGER` | FK โ†’ `vehicle.cost_categories.id` | Self-ref, nullable | | `sort_order` | `INTEGER` | | | | `is_active` | `BOOLEAN` | | Default: true | ### `vehicle.vehicle_costs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `vehicle_id` | `UUID` | FK โ†’ `vehicle.assets.id` | NOT NULL | | `category_id` | `INTEGER` | FK โ†’ `vehicle.cost_categories.id` | | | `amount` | `NUMERIC(18,2)` | NOT NULL | | | `currency` | `VARCHAR(3)` | | Default: 'HUF' | | `description` | `TEXT` | | Nullable | | `date` | `DATETIME` | | | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.vehicle_catalog` (AssetCatalog) | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `master_definition_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_model_definitions.id` | Nullable | | `make` | `VARCHAR` | INDEX | NOT NULL | | `model` | `VARCHAR` | INDEX | NOT NULL | | `generation` | `VARCHAR` | INDEX | Nullable | | `year_from` | `INTEGER` | | Nullable | | `year_to` | `INTEGER` | | Nullable | | `fuel_type` | `VARCHAR` | INDEX | Nullable | | `power_kw` | `INTEGER` | INDEX | Nullable | | `engine_capacity` | `INTEGER` | INDEX | Nullable | | `factory_data` | `JSONB` | | Default: `{}` | | UNIQUE | | | `(make, model, year_from, fuel_type)` | ### `vehicle.assets` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `vin` | `VARCHAR(17)` | UNIQUE, INDEX | Nullable | | `license_plate` | `VARCHAR(20)` | INDEX | | | `name` | `VARCHAR` | | Nullable | | `catalog_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_catalog.id` | Nullable | | `vehicle_class` | `VARCHAR(50)` | INDEX | Nullable | | `brand` | `VARCHAR(100)` | INDEX | Nullable | | `model` | `VARCHAR(100)` | INDEX | Nullable | | `trim_level` | `VARCHAR(100)` | | Nullable | | `fuel_type` | `VARCHAR(50)` | INDEX | Nullable | | `engine_capacity` | `INTEGER` | INDEX | Nullable | | `power_kw` | `INTEGER` | INDEX | Nullable | | `torque_nm` | `INTEGER` | | Nullable | | `transmission_type` | `VARCHAR(50)` | INDEX | Nullable | | `drive_type` | `VARCHAR(50)` | INDEX | Nullable | | `year_of_manufacture` | `INTEGER` | INDEX | Nullable | | `mileage` | `INTEGER` | | Nullable | | `registration_date` | `DATETIME` | | Nullable | | `status` | `VARCHAR(30)` | INDEX | Default: 'active' | | `owner_person_id` | `BIGINT` | FK โ†’ `identity.persons.id` | Nullable | | `owner_org_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Nullable | | `current_organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Nullable | | `is_deleted` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | | CHECK | | | `vin IS NOT NULL OR license_plate IS NOT NULL` | ### `vehicle.asset_costs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `asset_id` | `UUID` | FK โ†’ `vehicle.assets.id` | NOT NULL | | `category` | `VARCHAR(50)` | INDEX | | | `amount` | `NUMERIC(18,2)` | NOT NULL | | | `currency` | `VARCHAR(3)` | | Default: 'HUF' | | `description` | `TEXT` | | Nullable | | `occurred_at` | `DATETIME` | INDEX | | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.asset_events` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `asset_id` | `UUID` | FK โ†’ `vehicle.assets.id` | NOT NULL, indexed | | `event_type` | `VARCHAR(50)` | INDEX | | | `status` | `VARCHAR(50)` | INDEX | | | `description` | `TEXT` | | Nullable | | `cost_id` | `INTEGER` | FK โ†’ `vehicle.asset_costs.id` | Nullable | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Nullable | | `metadata` | `JSONB` | | Nullable | | `occurred_at` | `DATETIME` | INDEX | | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.odometer_readings` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `asset_id` | `UUID` | FK โ†’ `vehicle.assets.id` | NOT NULL | | `reading` | `INTEGER` | NOT NULL | | | `recorded_at` | `DATETIME` | | | | `source` | `VARCHAR(50)` | | | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.exchange_rates` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `rate` | `NUMERIC(18,6)` | NOT NULL | | ### `vehicle.catalog_discovery` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `make` | `VARCHAR(100)` | INDEX | NOT NULL | | `model` | `VARCHAR(100)` | INDEX | NOT NULL | | `vehicle_class` | `VARCHAR(50)` | INDEX | Default: 'car' | | `market` | `VARCHAR(20)` | INDEX | Default: 'GLOBAL' | | `model_year` | `INTEGER` | INDEX | Nullable | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `source` | `VARCHAR(100)` | | Nullable | | `priority_score` | `INTEGER` | | Default: 0 | | `attempts` | `INTEGER` | | Default: 0 | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | ### `vehicle.vehicle_expenses` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `vehicle_id` | `UUID` | FK โ†’ `vehicle.assets.id` | NOT NULL, indexed | | `category` | `VARCHAR(50)` | INDEX | NOT NULL | | `amount` | `NUMERIC(18,2)` | NOT NULL | | | `date` | `DATETIME` | INDEX | `func.now()` | | `description` | `TEXT` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | ### `vehicle.vehicle_transfer_requests` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `asset_id` | `UUID` | FK โ†’ `vehicle.assets.id` | INDEX | | `requester_id` | `INTEGER` | FK โ†’ `identity.users.id` | INDEX | | `current_owner_id` | `INTEGER` | FK โ†’ `identity.persons.id` | INDEX, nullable | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `requested_at` | `DATETIME` | | `func.now()` | | `processed_at` | `DATETIME` | | Nullable | | `notes` | `TEXT` | | Nullable | ### `vehicle.external_reference_library` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `specifications` | `JSON` | | Default: `{}` | | `source_url` | `VARCHAR(500)` | UNIQUE | | | `last_scraped_at` | `DATETIME` | | `func.now()` | | `pipeline_status` | `VARCHAR(30)` | INDEX | Default: 'pending_enrich' | | `matched_vmd_id` | `INTEGER` | FK โ†’ `vehicle.vehicle_model_definitions.id` | Nullable | ### `vehicle.auto_data_crawler_queue` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `url` | `VARCHAR(500)` | UNIQUE | NOT NULL | | `level` | `VARCHAR(20)` | INDEX | NOT NULL | | `category` | `VARCHAR(20)` | INDEX | Default: 'car' | | `parent_id` | `INTEGER` | | Nullable | | `name` | `VARCHAR(255)` | | | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `error_msg` | `VARCHAR(1000)` | | Nullable | | `retry_count` | `INTEGER` | | Default: 0 | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | ### `vehicle.motorcycle_specs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `crawler_id` | `INTEGER` | FK โ†’ `vehicle.auto_data_crawler_queue.id` | UNIQUE, CASCADE | | `full_name` | `TEXT` | NOT NULL | | | `url` | `TEXT` | | | | `raw_data` | `JSONB` | NOT NULL | | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | ### `vehicle.gb_catalog_discovery` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `vrm` | `VARCHAR` | INDEX | UK license plate | | `make` | `VARCHAR` | | | | `model` | `VARCHAR` | | | | `status` | `VARCHAR` | | Default: 'pending' | --- ## ๐Ÿงฌ 4. Schema: `fleet` ### `fleet.organizations` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `legal_owner_id` | `BIGINT` | FK โ†’ `identity.persons.id` | INDEX, nullable | | `first_registered_at` | `DATETIME` | NOT NULL | `func.now()` | | `current_lifecycle_started_at` | `DATETIME` | NOT NULL | `func.now()` | | `last_deactivated_at` | `DATETIME` | | Nullable | | `lifecycle_index` | `INTEGER` | | Default: 1 | | `address_id` | `UUID` | FK โ†’ `system.addresses.id` | Nullable | | `is_anonymized` | `BOOLEAN` | | Default: false | | `full_name` | `VARCHAR` | NOT NULL | | | `name` | `VARCHAR` | NOT NULL | | | `display_name` | `VARCHAR(50)` | | Nullable | | `folder_slug` | `VARCHAR(24)` | UNIQUE, INDEX | | | `default_currency` | `VARCHAR(3)` | | Default: 'HUF' | | `country_code` | `VARCHAR(3)` | | | | `tax_id` | `VARCHAR` | | Nullable | | `registration_number` | `VARCHAR` | | Nullable | | `org_type` | `VARCHAR(20)` | | Default: 'business' | | `status` | `VARCHAR(20)` | INDEX | | | `is_deleted` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | | `subscription_plan` | `VARCHAR(50)` | | | | `subscription_tier_id` | `INTEGER` | FK โ†’ `system.subscription_tiers.id` | | | `aliases` | `JSONB` | | | | `tags` | `JSONB` | | | ### `fleet.org_roles` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name_key` | `VARCHAR(50)` | UNIQUE, INDEX | NOT NULL | | `display_name` | `VARCHAR(100)` | NOT NULL | | | `description` | `VARCHAR(255)` | | Nullable | | `is_system` | `BOOLEAN` | | Default: true | | `priority` | `INTEGER` | | Default: 0 | | `is_active` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | | `permissions` | `JSONB` | NOT NULL | Default: `{}` | ### `fleet.organization_members` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | NOT NULL | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `person_id` | `BIGINT` | FK โ†’ `identity.persons.id` | Nullable | | `invited_email` | `VARCHAR(255)` | | | | `expires_at` | `DATETIME` | | Nullable | | `role` | `ENUM(orguserrole)` | | Default: 'MEMBER' | | `permissions` | `JSON` | | Default: `{}` | | `is_permanent` | `BOOLEAN` | | Default: false | | `is_verified` | `BOOLEAN` | | Default: false | | `status` | `VARCHAR(20)` | | Default: 'active' | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | ### `fleet.org_sales_assignments` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Nullable | | `agent_user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `assigned_at` | `DATETIME` | | `func.now()` | | `is_active` | `BOOLEAN` | | Default: true | ### `fleet.branches` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `UUID` | PK | `uuid.uuid4()` | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | NOT NULL | | `address_id` | `UUID` | FK โ†’ `system.addresses.id` | Nullable | | `name` | `VARCHAR(100)` | NOT NULL | | | `is_main` | `BOOLEAN` | | Default: false | | `postal_code` | `VARCHAR(10)` | INDEX | Nullable | | `city` | `VARCHAR(100)` | INDEX | Nullable | | `street_name` | `VARCHAR(150)` | | Nullable | | `location` | `GEOMETRY(POINT, 4326)` | | PostGIS, nullable | | `opening_hours` | `JSONB` | | Default: `{}` | | `branch_rating` | `FLOAT` | | Default: 0.0 | | `status` | `VARCHAR(30)` | | Default: 'active' | | `is_deleted` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | ### `fleet.locations` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name` | `VARCHAR` | NOT NULL | | | `type` | `ENUM(location_type)` | NOT NULL | stop/warehouse/client | | `coordinates` | `VARCHAR` | | Nullable | | `address_full` | `VARCHAR` | | Nullable | | `capacity` | `INTEGER` | | Nullable | --- ## ๐Ÿงฌ 5. Schema: `marketplace` ### `marketplace.service_profiles` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(255)` | NOT NULL | | | `organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | | | `description` | `TEXT` | | Nullable | | `category` | `VARCHAR(100)` | | | | `status` | `VARCHAR(20)` | | Default: 'pending' | | `is_verified` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | `func.now()` | ### `marketplace.expertise_tags` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(100)` | UNIQUE | | | `parent_id` | `INTEGER` | FK โ†’ `marketplace.expertise_tags.id` | Self-ref, nullable | | `category` | `VARCHAR(50)` | INDEX | | ### `marketplace.service_expertises` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | (junction table) | | | service_id โ†” expertise_id | ### `marketplace.service_staging` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(255)` | INDEX | NOT NULL | | `fingerprint` | `VARCHAR(64)` | UNIQUE, INDEX | NOT NULL | | `city` | `VARCHAR(100)` | INDEX | NOT NULL | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `validation_level` | `INTEGER` | | Default: 40 | | `created_at` | `DATETIME` | | `func.now()` | ### `marketplace.discovery_parameters` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `city` | `VARCHAR(100)` | UNIQUE, INDEX | NOT NULL | | `country_code` | `VARCHAR(2)` | | Default: 'HU' | | `keyword` | `VARCHAR(100)` | | Nullable | | `is_active` | `BOOLEAN` | | Default: true | ### `marketplace.service_specialties` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `parent_id` | `INTEGER` | FK โ†’ `marketplace.service_specialties.id` | Self-ref, nullable | | `name` | `VARCHAR` | NOT NULL | | | `slug` | `VARCHAR` | UNIQUE, INDEX | | ### `marketplace.service_providers` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name` | `VARCHAR` | NOT NULL | | | `address` | `VARCHAR` | NOT NULL | | | `status` | `ENUM(moderation_status)` | | Default: 'pending' | | `source` | `ENUM(source_type)` | | Default: 'manual' | | `validation_score` | `INTEGER` | | Default: 0 | | `created_at` | `DATETIME` | | `func.now()` | ### `marketplace.votes` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `provider_id` | `INTEGER` | FK โ†’ `marketplace.service_providers.id` | NOT NULL | | `vote_value` | `INTEGER` | NOT NULL | +1 or -1 | | UNIQUE | | | `(user_id, provider_id)` | ### `marketplace.service_reviews` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Auto-increment | | `service_id` | `INTEGER` | FK โ†’ `marketplace.service_profiles.id` | CASCADE | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | SET NULL | | `transaction_id` | `UUID` | FK โ†’ `audit.financial_ledger.transaction_id` | RESTRICT, indexed | | `price_rating` | `INTEGER` | NOT NULL | 1-10 | | `quality_rating` | `INTEGER` | NOT NULL | 1-10 | | `time_rating` | `INTEGER` | NOT NULL | 1-10 | | `communication_rating` | `INTEGER` | NOT NULL | 1-10 | | `comment` | `TEXT` | | Nullable | | `is_verified` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | | UNIQUE | | | `(transaction_id)` | ### `marketplace.ratings` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `author_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `target_organization_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | Nullable | | `target_user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `target_branch_id` | `UUID` | FK โ†’ `fleet.branches.id` | Nullable | | `score` | `NUMERIC(3,2)` | NOT NULL | | | `comment` | `TEXT` | | Nullable | | `is_verified` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | --- ## ๐Ÿงฌ 6. Schema: `finance` ### `finance.issuers` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(255)` | INDEX | NOT NULL | | `tax_id` | `VARCHAR(50)` | UNIQUE, INDEX | Nullable | | `type` | `ENUM(issuer_type)` | NOT NULL | KFT/EV/BT/ZRT/OTHER | | `revenue_limit` | `NUMERIC(18,4)` | | Default: 19500000.0 | | `is_active` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | ### `finance.payment_intents` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `intent_token` | `UUID` | UNIQUE, INDEX | NOT NULL | | `payer_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `beneficiary_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `net_amount` | `NUMERIC(18,4)` | | | | `handling_fee` | `NUMERIC(18,4)` | | | | `gross_amount` | `NUMERIC(18,4)` | | | | `status` | `ENUM(payment_intent_status)` | | Default: 'PENDING' | | `created_at` | `DATETIME` | | `func.now()` | ### `finance.org_subscriptions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `org_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | NOT NULL | | `tier_id` | `INTEGER` | FK โ†’ `system.subscription_tiers.id` | NOT NULL | | `valid_from` | `DATETIME` | | `func.now()` | | `valid_until` | `DATETIME` | | Nullable | | `is_active` | `BOOLEAN` | | Default: true | | `extra_allowances` | `JSONB` | | Default: `{}` | ### `finance.user_subscriptions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `tier_id` | `INTEGER` | FK โ†’ `system.subscription_tiers.id` | NOT NULL | | `valid_from` | `DATETIME` | | `func.now()` | | `valid_until` | `DATETIME` | | Nullable | | `is_active` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | ### `finance.credit_logs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `org_id` | `INTEGER` | FK โ†’ `fleet.organizations.id` | NOT NULL | | `amount` | `NUMERIC(10,2)` | NOT NULL | | | `description` | `VARCHAR` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | --- ## ๐Ÿงฌ 7. Schema: `audit` ### `audit.audit_logs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | Nullable | | `severity` | `ENUM(log_severity)` | | Default: 'INFO' | | `action` | `VARCHAR(100)` | INDEX | | | `target_type` | `VARCHAR(50)` | INDEX | Nullable | | `target_id` | `VARCHAR(50)` | INDEX | Nullable | | `old_data` | `JSON` | | Nullable | | `new_data` | `JSON` | | Nullable | | `ip_address` | `VARCHAR(45)` | INDEX | Nullable | | `user_agent` | `TEXT` | | Nullable | | `timestamp` | `DATETIME` | INDEX | `func.now()` | ### `audit.security_audit_logs` (security-specific audit trail) ### `audit.operational_logs` (operational/process logs) ### `audit.process_logs` (background process logs) ### `audit.financial_ledger` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `transaction_id` | `UUID` | UNIQUE | NOT NULL | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `entry_type` | `ENUM(ledger_entry_type)` | NOT NULL | DEBIT/CREDIT | | `wallet_type` | `ENUM(wallet_type)` | NOT NULL | EARNED/PURCHASED/SERVICE_COINS/VOUCHER | | `amount` | `NUMERIC(18,4)` | NOT NULL | | | `balance_after` | `NUMERIC(18,4)` | | Nullable | | `status` | `ENUM(ledger_status)` | | Default: 'SUCCESS' | | `description` | `VARCHAR` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | --- ## ๐Ÿงฌ 8. Schema: `gamification` ### `gamification.point_rules` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `action_type` | `INTEGER` | UNIQUE | NOT NULL | | `base_points` | `INTEGER` | NOT NULL | | | `description` | `VARCHAR` | | | ### `gamification.level_configs` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `level` | `INTEGER` | UNIQUE | NOT NULL | | `xp_required` | `INTEGER` | NOT NULL | | ### `gamification.points_ledger` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `points` | `INTEGER` | NOT NULL | | | `reason` | `VARCHAR` | | | | `created_at` | `DATETIME` | | `func.now()` | ### `gamification.user_stats` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | UNIQUE | | `total_xp` | `INTEGER` | | Default: 0 | | `level` | `INTEGER` | | Default: 1 | | `current_streak` | `INTEGER` | | Default: 0 | | `longest_streak` | `INTEGER` | | Default: 0 | | `updated_at` | `DATETIME` | | `func.now()` | ### `gamification.badges` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name` | `VARCHAR` | UNIQUE | | | `description` | `VARCHAR` | NOT NULL | | | `icon_url` | `VARCHAR` | | Nullable | ### `gamification.user_badges` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | | | `badge_id` | `INTEGER` | FK โ†’ `gamification.badges.id` | | | `earned_at` | `DATETIME` | | `func.now()` | ### `gamification.user_contributions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | NOT NULL | | `season_id` | `INTEGER` | FK โ†’ `gamification.seasons.id` | Nullable | | `contribution_type` | `VARCHAR(50)` | INDEX | NOT NULL | | `points_awarded` | `INTEGER` | | Default: 0 | | `xp_awarded` | `INTEGER` | | Default: 0 | | `status` | `VARCHAR(20)` | INDEX | Default: 'pending' | | `created_at` | `DATETIME` | | `func.now()` | ### `gamification.seasons` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name` | `VARCHAR(100)` | NOT NULL | | | `start_date` | `DATE` | NOT NULL | | | `end_date` | `DATE` | NOT NULL | | | `is_active` | `BOOLEAN` | | Default: false | | `created_at` | `DATETIME` | | `func.now()` | ### `gamification.competitions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR` | NOT NULL | | | `description` | `TEXT` | | Nullable | | `start_date` | `DATETIME` | NOT NULL | | | `end_date` | `DATETIME` | NOT NULL | | | `is_active` | `BOOLEAN` | | Default: true | ### `gamification.user_scores` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `user_id` | `INTEGER` | FK โ†’ `identity.users.id` | | | `competition_id` | `INTEGER` | FK โ†’ `gamification.competitions.id` | | | `points` | `INTEGER` | | Default: 0 | | UNIQUE | | | `(user_id, competition_id)` | ### `gamification.seasonal_competitions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | Indexed | | `name` | `VARCHAR(200)` | NOT NULL | | | `season_id` | `INTEGER` | FK โ†’ `gamification.seasons.id` | INDEX | | `start_date` | `DATE` | NOT NULL | | | `end_date` | `DATE` | NOT NULL | | | `status` | `VARCHAR(20)` | INDEX | Default: 'draft' | | `created_at` | `DATETIME` | | `func.now()` | --- ## ๐Ÿงฌ 9. Schema: `marketing` ### `marketing.campaigns` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(200)` | INDEX | NOT NULL | | `status` | `VARCHAR(20)` | INDEX | Default: 'draft' | | `targeting` | `JSONB` | | Nullable | | `priority` | `INTEGER` | NOT NULL | Default: 100 | | `start_date` | `DATETIME` | | Nullable | | `end_date` | `DATETIME` | | Nullable | | `current_impressions` | `INTEGER` | | Default: 0 | | `current_clicks` | `INTEGER` | | Default: 0 | | `created_at` | `DATETIME` | | `func.now()` | | `updated_at` | `DATETIME` | | Nullable | ### `marketing.creatives` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(200)` | NOT NULL | | | `creative_type` | `VARCHAR(20)` | NOT NULL | 'image' or 'html_snippet' | | `image_url` | `VARCHAR(500)` | | Nullable | | `html_snippet` | `TEXT` | | Nullable | | `click_url` | `VARCHAR(500)` | | Nullable | | `is_active` | `BOOLEAN` | | Default: true | | `created_at` | `DATETIME` | | `func.now()` | ### `marketing.placements` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `name` | `VARCHAR(100)` | UNIQUE | NOT NULL | | `placement_type` | `VARCHAR(20)` | NOT NULL | | `is_active` | `BOOLEAN` | | Default: true | ### `marketing.campaign_creatives` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `campaign_id` | `INTEGER` | FK โ†’ `marketing.campaigns.id` | CASCADE | | `creative_id` | `INTEGER` | FK โ†’ `marketing.creatives.id` | CASCADE | | UNIQUE | | | `(campaign_id, creative_id)` | ### `marketing.campaign_placements` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `campaign_id` | `INTEGER` | FK โ†’ `marketing.campaigns.id` | CASCADE | | `placement_id` | `INTEGER` | FK โ†’ `marketing.placements.id` | CASCADE | | UNIQUE | | | `(campaign_id, placement_id)` | ### `marketing.ad_impressions` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `campaign_id` | `INTEGER` | FK โ†’ `marketing.campaigns.id` | CASCADE | | `user_id` | `INTEGER` | | Nullable | | `session_id` | `VARCHAR(100)` | | Nullable | | `ip_address` | `VARCHAR(45)` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | ### `marketing.ad_clicks` | Column | Type | PK/FK | Notes | |--------|------|-------|-------| | `id` | `INTEGER` | PK | | | `impression_id` | `INTEGER` | FK โ†’ `marketing.ad_impressions.id` | SET NULL | | `campaign_id` | `INTEGER` | FK โ†’ `marketing.campaigns.id` | CASCADE | | `user_id` | `INTEGER` | | Nullable | | `created_at` | `DATETIME` | | `func.now()` | --- ## ๐Ÿ“Š Summary Statistics | Schema | Approx. Tables | Source Files | |--------|---------------|-------------| | `identity` | 11 | `identity/identity.py`, `identity/security.py` | | `system` | 14 | `identity/address.py`, `system/system.py`, `system/document.py`, `system/translation.py`, `system/legal.py` | | `vehicle` | 24 | `vehicle/vehicle_definitions.py`, `vehicle/vehicle.py`, `vehicle/asset.py`, `vehicle/motorcycle_specs.py`, `vehicle/external_reference.py`, `vehicle/external_reference_queue.py` | | `fleet` | 7 | `marketplace/organization.py`, `marketplace/logistics.py` | | `marketplace` | 12 | `marketplace/service.py`, `marketplace/staged_data.py`, `marketplace/service_request.py`, `identity/social.py`, `identity/address.py` | | `finance` | 6 | `marketplace/finance.py`, `marketplace/payment.py`, `core_logic.py` | | `audit` | 5 | `vehicle/history.py`, `system/audit.py` | | `gamification` | 11 | `gamification/gamification.py`, `identity/social.py` | | `marketing` | 8 | `marketing.py` | | **TOTAL** | **~98** | **36 model files across 7 subdirectories** | --- *Generated: 2026-06-21T00:15 UTC ยท Source: SQLAlchemy models in `backend/app/models/`*