| CREATE TABLE `access_tokens` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `name` VARCHAR(100) NOT NULL, | |
| `token` VARCHAR(255) NOT NULL UNIQUE, | |
| `permissions` JSON NOT NULL, | |
| `ip_restrictions` TEXT DEFAULT NULL, | |
| `expires_at` DATETIME DEFAULT NULL, | |
| `status` ENUM('active','revoked') DEFAULT 'active', | |
| `last_used` TIMESTAMP NULL DEFAULT NULL, | |
| `usage_count` INT DEFAULT 0, | |
| `metadata` JSON DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_expires_at` (`expires_at`), | |
| CONSTRAINT `fk_access_tokens_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `admin_payments` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `mpesa_code` VARCHAR(20) UNIQUE NOT NULL, | |
| `phone_number` VARCHAR(20) NOT NULL, | |
| `status` ENUM('pending','verified','rejected') DEFAULT 'pending', | |
| `verified_by` INT DEFAULT NULL, | |
| `verified_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `fk_admin_payments_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `advertisement_payments` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `advertisement_id` INT NOT NULL, | |
| `user_id` INT NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `payment_method` ENUM('mpesa','bank_transfer','wallet','card') DEFAULT 'mpesa', | |
| `transaction_code` VARCHAR(100) UNIQUE, | |
| `status` ENUM('pending','completed','failed','refunded') DEFAULT 'pending', | |
| `payment_date` TIMESTAMP NULL DEFAULT NULL, | |
| `confirmed_by` INT DEFAULT NULL, | |
| `confirmed_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_advertisement_id` (`advertisement_id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_confirmed_by` (`confirmed_by`), | |
| CONSTRAINT `fk_adv_payments_advertisement` FOREIGN KEY (`advertisement_id`) REFERENCES `advertisements` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_adv_payments_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_adv_payments_confirmer` FOREIGN KEY (`confirmed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `advertisements` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `agent_id` INT DEFAULT NULL, | |
| `title` VARCHAR(255) NOT NULL, | |
| `description` TEXT, | |
| `image_url` VARCHAR(500) DEFAULT NULL, | |
| `video_url` VARCHAR(500) DEFAULT NULL, | |
| `target_platform` ENUM('facebook','instagram','whatsapp','twitter','all') DEFAULT 'all', | |
| `budget` DECIMAL(10,2) NOT NULL, | |
| `duration_days` INT DEFAULT 7, | |
| `status` ENUM('pending','approved','rejected','active','completed','paused') DEFAULT 'pending', | |
| `admin_notes` TEXT, | |
| `approved_by` INT DEFAULT NULL, | |
| `approved_at` TIMESTAMP NULL DEFAULT NULL, | |
| `start_date` DATE DEFAULT NULL, | |
| `end_date` DATE DEFAULT NULL, | |
| `impressions` INT DEFAULT 0, | |
| `clicks` INT DEFAULT 0, | |
| `conversions` INT DEFAULT 0, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_agent_id` (`agent_id`), | |
| KEY `idx_approved_by` (`approved_by`), | |
| CONSTRAINT `fk_ads_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_ads_agent` FOREIGN KEY (`agent_id`) REFERENCES `users` (`id`) ON DELETE SET NULL, | |
| CONSTRAINT `fk_ads_approver` FOREIGN KEY (`approved_by`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `agent_applications` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `sponsor_id` INT NOT NULL, | |
| `full_name` VARCHAR(255) NOT NULL, | |
| `phone` VARCHAR(20) NOT NULL, | |
| `email` VARCHAR(255) DEFAULT NULL, | |
| `location` VARCHAR(255) NOT NULL, | |
| `id_front` VARCHAR(500) DEFAULT NULL, | |
| `id_back` VARCHAR(500) DEFAULT NULL, | |
| `status` ENUM('pending','approved','rejected','documents_needed') DEFAULT 'pending', | |
| `applied_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| `reviewed_by` INT DEFAULT NULL, | |
| `reviewed_at` TIMESTAMP NULL DEFAULT NULL, | |
| `review_notes` TEXT, | |
| `commission_rate` DECIMAL(5,2) DEFAULT 10.00, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_sponsor_id` (`sponsor_id`), | |
| KEY `idx_reviewed_by` (`reviewed_by`), | |
| CONSTRAINT `fk_agent_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_agent_sponsor` FOREIGN KEY (`sponsor_id`) REFERENCES `users` (`id`) ON DELETE SET NULL, | |
| CONSTRAINT `fk_agent_reviewer` FOREIGN KEY (`reviewed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `agent_claims` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `claim_type` ENUM('commission','bonus','referral','override','other') NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL, | |
| `description` TEXT, | |
| `claim_period` VARCHAR(50) DEFAULT NULL, | |
| `status` ENUM('pending','approved','rejected','processing') DEFAULT 'pending', | |
| `approved_by` INT DEFAULT NULL, | |
| `approved_amount` DECIMAL(15,2) DEFAULT NULL, | |
| `approval_notes` TEXT, | |
| `approved_at` DATETIME DEFAULT NULL, | |
| `supporting_docs` JSON DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_approved_by` (`approved_by`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_status` (`status`), | |
| KEY `idx_created_at` (`created_at`), | |
| CONSTRAINT `fk_claim_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_claim_approved_by` FOREIGN KEY (`approved_by`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `agent_hierarchy` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `upline_id` INT NOT NULL, | |
| `downline_id` INT NOT NULL, | |
| `level` INT NOT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_upline_id` (`upline_id`), | |
| KEY `idx_downline_id` (`downline_id`), | |
| CONSTRAINT `fk_hierarchy_upline` FOREIGN KEY (`upline_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_hierarchy_downline` FOREIGN KEY (`downline_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `agents` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `full_name` VARCHAR(100) NOT NULL, | |
| `phone` VARCHAR(20) NOT NULL, | |
| `location` VARCHAR(100) NOT NULL, | |
| `id_front` VARCHAR(255) DEFAULT NULL, | |
| `id_back` VARCHAR(255) DEFAULT NULL, | |
| `status` ENUM('pending','approved','rejected','documents_needed') DEFAULT 'pending', | |
| `applied_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| `reviewed_at` TIMESTAMP DEFAULT NULL, | |
| `reviewed_by` INT DEFAULT NULL, | |
| `notes` TEXT, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_reviewed_by` (`reviewed_by`), | |
| CONSTRAINT `fk_agents_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_agents_reviewed_by` FOREIGN KEY (`reviewed_by`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `audit_logs` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT DEFAULT NULL, | |
| `action` VARCHAR(100) NOT NULL, | |
| `description` TEXT, | |
| `ip_address` VARCHAR(45) DEFAULT NULL, | |
| `user_agent` TEXT, | |
| `metadata` JSON DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `fk_audit_logs_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `balance_history` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `transaction_id` INT DEFAULT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `balance_before` DECIMAL(10,2) NOT NULL, | |
| `balance_after` DECIMAL(10,2) NOT NULL, | |
| `type` ENUM('transfer_sent','transfer_received','deposit','withdrawal') DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_transaction_id` (`transaction_id`), | |
| CONSTRAINT `fk_balance_history_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_balance_history_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `transactions` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `commissions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `upline_id` INT NOT NULL, | |
| `downline_id` INT NOT NULL, | |
| `advertisement_id` INT NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `commission_rate` DECIMAL(5,2) NOT NULL, | |
| `commission_amount` DECIMAL(10,2) NOT NULL, | |
| `percentage` DECIMAL(5,2) NOT NULL, | |
| `description` VARCHAR(255) DEFAULT NULL, | |
| `status` ENUM('pending','paid','cancelled') DEFAULT 'pending', | |
| `paid_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_upline_id` (`upline_id`), | |
| KEY `idx_downline_id` (`downline_id`), | |
| KEY `idx_advertisement_id` (`advertisement_id`), | |
| CONSTRAINT `fk_commissions_upline` FOREIGN KEY (`upline_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_commissions_downline` FOREIGN KEY (`downline_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_commissions_advertisement` FOREIGN KEY (`advertisement_id`) REFERENCES `advertisements` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `currency_rates` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `base_currency` VARCHAR(3) NOT NULL DEFAULT 'KES', | |
| `target_currency` VARCHAR(3) NOT NULL, | |
| `exchange_rate` DECIMAL(10,4) NOT NULL DEFAULT 1.0000, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `idx_currency_pair` (`base_currency`, `target_currency`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `daily_earnings` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `investment_id` INT NOT NULL, | |
| `user_id` INT NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `earning_date` DATE NOT NULL, | |
| `status` ENUM('pending','paid','reinvested') NOT NULL DEFAULT 'pending', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_investment_id` (`investment_id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `daily_earnings_ibfk_1` FOREIGN KEY (`investment_id`) REFERENCES `user_investments` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `daily_earnings_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `daily_token_stats` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `date` DATE NOT NULL, | |
| `tokens_generated` INT NOT NULL DEFAULT 0, | |
| `tokens_revoked` INT NOT NULL DEFAULT 0, | |
| `api_calls` INT NOT NULL DEFAULT 0, | |
| `total_processing_time_ms` INT NOT NULL DEFAULT 0, | |
| `unique_endpoints` INT NOT NULL DEFAULT 0, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `unique_user_date` (`user_id`,`date`), | |
| KEY `idx_date` (`date`), | |
| CONSTRAINT `daily_token_stats_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `eligibility_criteria` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `min_deposit_amount` DECIMAL(15,2) NOT NULL DEFAULT 20000.00, | |
| `min_account_age_months` INT NOT NULL DEFAULT 6, | |
| `min_successful_uploads` INT NOT NULL DEFAULT 10, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `cooling_period_days` INT NOT NULL DEFAULT 30, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `faqs` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `question` TEXT NOT NULL, | |
| `answer` TEXT NOT NULL, | |
| `category` VARCHAR(50) DEFAULT NULL, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `ledger` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `change_amount` DECIMAL(15,2) NOT NULL, | |
| `balance_after` DECIMAL(15,2) NOT NULL, | |
| `type` ENUM('deposit','withdrawal','transfer','reward','fee') NOT NULL, | |
| `reference` VARCHAR(100) NOT NULL, | |
| `description` TEXT DEFAULT NULL, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `ledger_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `loan_applications` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL, | |
| `duration_days` INT NOT NULL, | |
| `purpose` VARCHAR(255) NOT NULL, | |
| `disbursement_method` ENUM('mpesa','bank','paypal') NOT NULL, | |
| `mpesa_phone` VARCHAR(15) DEFAULT NULL, | |
| `bank_name` VARCHAR(100) DEFAULT NULL, | |
| `account_number` VARCHAR(50) DEFAULT NULL, | |
| `account_name` VARCHAR(100) DEFAULT NULL, | |
| `paypal_email` VARCHAR(100) DEFAULT NULL, | |
| `notification_number` VARCHAR(15) NOT NULL, | |
| `status` ENUM('pending','approved','rejected','disbursed','completed') NOT NULL DEFAULT 'pending', | |
| `application_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `approval_date` TIMESTAMP NULL DEFAULT NULL, | |
| `due_date` DATE DEFAULT NULL, | |
| `processing_fee` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `interest_rate` DECIMAL(5,2) NOT NULL DEFAULT 5.00, | |
| `total_repayment` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `loan_applications_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `loan_repayments` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `loan_id` INT NOT NULL, | |
| `due_date` DATE NOT NULL, | |
| `amount_due` DECIMAL(15,2) NOT NULL, | |
| `amount_paid` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `status` ENUM('pending','partial','paid','overdue') NOT NULL DEFAULT 'pending', | |
| `payment_date` TIMESTAMP NULL DEFAULT NULL, | |
| PRIMARY KEY (`id`), | |
| KEY `loan_id` (`loan_id`), | |
| CONSTRAINT `loan_repayments_ibfk_1` FOREIGN KEY (`loan_id`) REFERENCES `loan_applications` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `loans` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL, | |
| `interest_rate` DECIMAL(5,2) NOT NULL DEFAULT 5.00, | |
| `duration_days` INT NOT NULL, | |
| `purpose` TEXT DEFAULT NULL, | |
| `status` ENUM('pending','approved','rejected','active','paid') NOT NULL DEFAULT 'pending', | |
| `approved_by` INT DEFAULT NULL, | |
| `approved_at` DATETIME DEFAULT NULL, | |
| `due_date` DATE DEFAULT NULL, | |
| `amount_paid` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| KEY `approved_by` (`approved_by`), | |
| CONSTRAINT `loans_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `loans_ibfk_2` FOREIGN KEY (`approved_by`) REFERENCES `users` (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `main_account` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `account_name` VARCHAR(100) NOT NULL DEFAULT 'JMotors Main Account', | |
| `paybill_number` VARCHAR(20) DEFAULT NULL, | |
| `account_number` VARCHAR(50) DEFAULT NULL, | |
| `account_type` ENUM('paybill','bank','mpesa') NOT NULL DEFAULT 'paybill', | |
| `total_balance` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `total_deposits` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `total_withdrawals` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `currency` VARCHAR(3) NOT NULL DEFAULT 'KES', | |
| `mpesa_phone` VARCHAR(20) DEFAULT NULL, | |
| `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `meta_uploads` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `file_name` VARCHAR(255) NOT NULL, | |
| `file_type` VARCHAR(50) NOT NULL, | |
| `file_size` BIGINT NOT NULL, | |
| `file_path` VARCHAR(500) NOT NULL, | |
| `upload_date` DATE NOT NULL, | |
| `status` ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending', | |
| `reward_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `reviewed_by` INT DEFAULT NULL, | |
| `reviewed_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| KEY `reviewed_by` (`reviewed_by`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `packages` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `name` VARCHAR(50) NOT NULL, | |
| `min_investment` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `max_investment` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `daily_return` DECIMAL(5,2) NOT NULL DEFAULT 0.00, | |
| `price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `award` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `return_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `duration_days` INT NOT NULL DEFAULT 0, | |
| `referral_bonus` DECIMAL(5,2) NOT NULL DEFAULT 0.00, | |
| `daily_return_percent` DECIMAL(5,2) NOT NULL DEFAULT 0.00, | |
| `features` TEXT, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `pin_setup` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `pin_hash` VARCHAR(255) NOT NULL DEFAULT '', | |
| `setup_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `pin_setup_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `products` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `name` VARCHAR(100) NOT NULL DEFAULT '', | |
| `value` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `package_requirement` VARCHAR(50) NOT NULL DEFAULT 'all', | |
| `image_url` VARCHAR(500) DEFAULT NULL, | |
| `stock` INT NOT NULL DEFAULT 0, | |
| `description` TEXT DEFAULT NULL, | |
| `price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `image_code` VARCHAR(10) NOT NULL DEFAULT '', | |
| `cashback_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `recharge_transactions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `main_account_id` INT NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `virtual_balance_before` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `virtual_balance_after` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `main_balance_before` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `main_balance_after` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `currency` VARCHAR(3) NOT NULL DEFAULT 'KES', | |
| `payment_method` VARCHAR(50) NOT NULL DEFAULT '', | |
| `phone_number` VARCHAR(20) NOT NULL DEFAULT '', | |
| `mpesa_receipt` VARCHAR(100) DEFAULT NULL, | |
| `transaction_id` VARCHAR(100) DEFAULT NULL, | |
| `paybill_number` VARCHAR(20) NOT NULL DEFAULT '542542', | |
| `account_number` VARCHAR(50) NOT NULL DEFAULT '00106664176150', | |
| `status` ENUM('pending','completed','failed','verified') NOT NULL DEFAULT 'pending', | |
| `bonus_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `verified_by` INT DEFAULT NULL, | |
| `verified_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| KEY `fk_recharge_main` (`main_account_id`), | |
| CONSTRAINT `fk_recharge_main` FOREIGN KEY (`main_account_id`) REFERENCES `main_account` (`id`), | |
| CONSTRAINT `recharge_transactions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `referrals` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `referrer_id` INT NOT NULL, | |
| `referred_id` INT NOT NULL, | |
| `status` ENUM('pending','completed','cancelled') NOT NULL DEFAULT 'pending', | |
| `commission_earned` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `referrer_id` (`referrer_id`), | |
| KEY `referred_id` (`referred_id`), | |
| CONSTRAINT `referrals_ibfk_1` FOREIGN KEY (`referrer_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `referrals_ibfk_2` FOREIGN KEY (`referred_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `reward_settings` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `setting_key` VARCHAR(50) NOT NULL, | |
| `setting_value` VARCHAR(255) NOT NULL, | |
| `description` TEXT DEFAULT NULL, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `setting_key` (`setting_key`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `reward_transactions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `type` ENUM('upload','bonus','withdrawal') NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `description` VARCHAR(255) DEFAULT NULL, | |
| `reference_id` INT DEFAULT NULL, | |
| `status` ENUM('pending','completed','failed') NOT NULL DEFAULT 'completed', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `reward_transactions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `sessions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `session_token` VARCHAR(255) NOT NULL, | |
| `ip_address` VARCHAR(45) DEFAULT NULL, | |
| `user_agent` TEXT, | |
| `expires_at` DATETIME NOT NULL, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `session_token` (`session_token`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `sessions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `support_agents` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `name` VARCHAR(100) NOT NULL, | |
| `email` VARCHAR(255) NOT NULL, | |
| `phone` VARCHAR(20) DEFAULT NULL, | |
| `department` VARCHAR(50) DEFAULT NULL, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `email` (`email`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `support_tickets` ( | |
| `id` int NOT NULL AUTO_INCREMENT, | |
| `user_id` int DEFAULT NULL, | |
| `ticket_number` varchar(20) NOT NULL, | |
| `issue_type` enum('technical','account','payment','product','other') NOT NULL, | |
| `subject` varchar(200) NOT NULL, | |
| `description` text NOT NULL, | |
| `status` enum('open','in_progress','resolved','closed') DEFAULT 'open', | |
| `priority` enum('low','medium','high','urgent') DEFAULT 'medium', | |
| `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `ticket_number` (`ticket_number`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `support_tickets_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `support_users` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `username` VARCHAR(100) NOT NULL, | |
| `email` VARCHAR(255) NOT NULL, | |
| `tier` VARCHAR(50) NOT NULL DEFAULT 'standard', | |
| `package` VARCHAR(50) NOT NULL DEFAULT 'basic', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `email` (`email`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `system_config` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `config_key` VARCHAR(100) NOT NULL, | |
| `config_value` TEXT NOT NULL, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `config_key` (`config_key`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `team_relationships` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `sponsor_id` INT NOT NULL, | |
| `agent_id` INT NOT NULL, | |
| `level` INT NOT NULL, | |
| `status` ENUM('active','inactive') NOT NULL DEFAULT 'active', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `unique_relationship` (`sponsor_id`,`agent_id`), | |
| KEY `agent_id` (`agent_id`), | |
| CONSTRAINT `team_relationships_ibfk_1` FOREIGN KEY (`sponsor_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `team_relationships_ibfk_2` FOREIGN KEY (`agent_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `ticket_assignments` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `ticket_id` INT NOT NULL, | |
| `agent_id` INT NOT NULL, | |
| `assigned_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `ticket_id` (`ticket_id`), | |
| KEY `agent_id` (`agent_id`), | |
| CONSTRAINT `ticket_assignments_ibfk_1` FOREIGN KEY (`ticket_id`) REFERENCES `support_tickets` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `ticket_assignments_ibfk_2` FOREIGN KEY (`agent_id`) REFERENCES `support_agents` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `ticket_responses` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `ticket_id` INT NOT NULL, | |
| `responder_type` ENUM('user','support_agent') NOT NULL, | |
| `message` TEXT NOT NULL, | |
| `attachments` TEXT, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `ticket_id` (`ticket_id`), | |
| CONSTRAINT `ticket_responses_ibfk_1` FOREIGN KEY (`ticket_id`) REFERENCES `support_tickets` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `token_usage_logs` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `token_id` INT NOT NULL, | |
| `user_id` INT NOT NULL, | |
| `endpoint` VARCHAR(100) NOT NULL, | |
| `ip_address` VARCHAR(45), | |
| `user_agent` TEXT, | |
| `request_method` VARCHAR(10), | |
| `response_code` INT, | |
| `processing_time_ms` INT, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| KEY `idx_created_at` (`created_at`), | |
| KEY `idx_token_id` (`token_id`), | |
| CONSTRAINT `token_usage_logs_ibfk_1` FOREIGN KEY (`token_id`) REFERENCES `access_tokens` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `token_usage_logs_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `transactions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `sender_id` INT NOT NULL, | |
| `user_id` INT NOT NULL, | |
| `recipient_id` INT NOT NULL, | |
| `type` ENUM('deposit','withdrawal','product_purchase','cashback') NOT NULL, | |
| `amount` DECIMAL(10,2) NOT NULL, | |
| `balance_after` DECIMAL(10,2) NOT NULL, | |
| `description` TEXT, | |
| `message` TEXT, | |
| `transaction_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `reference` VARCHAR(100), | |
| `status` ENUM('pending','completed','failed') DEFAULT 'pending', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `completed_at` TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `fk_sender` (`sender_id`), | |
| KEY `fk_recipient` (`recipient_id`), | |
| KEY `fk_transactions_user` (`user_id`), | |
| CONSTRAINT `fk_sender` FOREIGN KEY (`sender_id`) REFERENCES `users` (`id`), | |
| CONSTRAINT `fk_recipient` FOREIGN KEY (`recipient_id`) REFERENCES `users` (`id`), | |
| CONSTRAINT `fk_transactions_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `transaction_verifications` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `transaction_id` INT, | |
| `user_id` INT, | |
| `amount` DECIMAL(10,2), | |
| `paybill_number` VARCHAR(20), | |
| `account_number` VARCHAR(50), | |
| `mpesa_receipt` VARCHAR(100), | |
| `screenshot_path` VARCHAR(255), | |
| `status` ENUM('pending','approved','rejected') DEFAULT 'pending', | |
| `reviewed_by` INT, | |
| `reviewed_at` TIMESTAMP, | |
| `notes` TEXT, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `fk_transaction` (`transaction_id`), | |
| KEY `fk_user` (`user_id`), | |
| CONSTRAINT `fk_transaction` FOREIGN KEY (`transaction_id`) REFERENCES `recharge_transactions` (`id`) ON DELETE SET NULL, | |
| CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `upload_rewards` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `upload_date` DATE NOT NULL, | |
| `total_uploads` INT DEFAULT 0, | |
| `completed_uploads` INT DEFAULT 0, | |
| `total_reward` DECIMAL(10,2) DEFAULT 0.00, | |
| `status` ENUM('pending','processed') DEFAULT 'pending', | |
| `processed_at` TIMESTAMP, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `unique_user_date` (`user_id`,`upload_date`), | |
| CONSTRAINT `fk_upload_rewards_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_accounts` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT, | |
| `virtual_account_number` VARCHAR(50) UNIQUE, | |
| `current_balance` DECIMAL(15,2) DEFAULT 0.00, | |
| `total_invested` DECIMAL(15,2) DEFAULT 0.00, | |
| `total_earnings` DECIMAL(15,2) DEFAULT 0.00, | |
| `total_withdrawn` DECIMAL(15,2) DEFAULT 0.00, | |
| `currency` VARCHAR(3) DEFAULT 'KES', | |
| `status` ENUM('active','suspended','closed') DEFAULT 'active', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `fk_user_accounts_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_activity` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT, | |
| `activity_type` VARCHAR(50), | |
| `description` TEXT, | |
| `ip_address` VARCHAR(45), | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `fk_user_activity_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_channel_subscriptions` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT, | |
| `channel_id` INT, | |
| `subscribed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `uniq_user_channel` (`user_id`,`channel_id`), | |
| KEY `idx_channel_id` (`channel_id`), | |
| CONSTRAINT `fk_user_channel_subscriptions_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_user_channel_subscriptions_channel` FOREIGN KEY (`channel_id`) REFERENCES `whatsapp_channels` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_investments` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `package_id` INT NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL, | |
| `start_date` DATETIME NOT NULL, | |
| `end_date` DATETIME NOT NULL, | |
| `status` ENUM('active','completed','cancelled') NOT NULL DEFAULT 'active', | |
| `total_earnings` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_package_id` (`package_id`), | |
| CONSTRAINT `fk_user_investments_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_user_investments_package` FOREIGN KEY (`package_id`) REFERENCES `packages` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_packages` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `package_id` INT NOT NULL, | |
| `purchase_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `start_date` DATETIME NULL DEFAULT NULL, | |
| `end_date` DATETIME NULL DEFAULT NULL, | |
| `amount_paid` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `status` ENUM('active','completed','cancelled') NOT NULL DEFAULT 'active', | |
| `investment_amount` DECIMAL(10,2) NOT NULL, | |
| `expected_return` DECIMAL(10,2) NOT NULL, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_package_id` (`package_id`), | |
| CONSTRAINT `fk_user_packages_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_user_packages_package` FOREIGN KEY (`package_id`) REFERENCES `packages` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_products` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `product_id` INT NOT NULL, | |
| `investment_id` INT NOT NULL, | |
| `assigned_date` DATE NOT NULL, | |
| `purchase_price` DECIMAL(10,2) NOT NULL, | |
| `cashback_received` DECIMAL(10,2) NOT NULL DEFAULT 0.00, | |
| `purchase_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `status` ENUM('active','completed','cancelled') NOT NULL DEFAULT 'active', | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| KEY `idx_product_id` (`product_id`), | |
| CONSTRAINT `fk_user_products_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `fk_user_products_product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_profiles` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `first_name` VARCHAR(50), | |
| `last_name` VARCHAR(50), | |
| `date_of_birth` DATE, | |
| `gender` ENUM('Male','Female','Other'), | |
| `profile_picture` VARCHAR(255), | |
| `address` TEXT, | |
| `city` VARCHAR(50), | |
| `state` VARCHAR(50), | |
| `zip_code` VARCHAR(20), | |
| `bio` TEXT, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `idx_user_id` (`user_id`), | |
| CONSTRAINT `fk_user_profiles_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `users` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_type` ENUM('marketer','agent','admin') NOT NULL DEFAULT 'marketer', | |
| `referred_by` INT, | |
| `username` VARCHAR(50) NOT NULL, | |
| `email` VARCHAR(100) NOT NULL, | |
| `country` CHAR(2) NOT NULL, | |
| `phone_number` VARCHAR(20) NOT NULL, | |
| `tier` ENUM('Basic','Premium') NOT NULL DEFAULT 'Basic', | |
| `current_package_id` INT, | |
| `package_start_date` DATETIME, | |
| `package_end_date` DATETIME, | |
| `package` ENUM('None','NOVA','SUPERIOR','GOLD') NOT NULL DEFAULT 'None', | |
| `balance` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `verification_token` VARCHAR(100), | |
| `reset_token` VARCHAR(100), | |
| `reset_token_expiry` DATETIME, | |
| `total_invested` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `total_earnings` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `total_deposits` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `total_withdrawals` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `rewards` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `meta_earnings` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| `last_login` TIMESTAMP, | |
| `pin_hash` VARCHAR(255) NOT NULL, | |
| `password_hash` VARCHAR(255) NOT NULL, | |
| `currency` CHAR(3) NOT NULL DEFAULT 'KES', | |
| `exchange_rate` DECIMAL(10,4) NOT NULL DEFAULT 1.0000, | |
| `referral_code` VARCHAR(20), | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `uk_users_username` (`username`), | |
| UNIQUE KEY `uk_users_email` (`email`), | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_security` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `two_factor_enabled` TINYINT(1) NOT NULL DEFAULT 0, | |
| `two_factor_secret` VARCHAR(32), | |
| `password_reset_token` VARCHAR(100), | |
| `reset_token_expires` TIMESTAMP, | |
| `login_attempts` INT NOT NULL DEFAULT 0, | |
| `last_login_attempt` TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `uk_user_security_user_id` (`user_id`), | |
| CONSTRAINT `fk_user_security_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `user_settings` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `dark_mode` TINYINT(1) NOT NULL DEFAULT 1, | |
| `language` VARCHAR(10) NOT NULL DEFAULT 'en', | |
| `currency` VARCHAR(3) NOT NULL DEFAULT 'KES', | |
| `auto_logout` TINYINT(1) NOT NULL DEFAULT 1, | |
| `email_notifications` TINYINT(1) NOT NULL DEFAULT 1, | |
| `push_notifications` TINYINT(1) NOT NULL DEFAULT 1, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `uk_user_settings_user_id` (`user_id`), | |
| CONSTRAINT `fk_user_settings_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `whatsapp_channels` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `channel_name` VARCHAR(100) NOT NULL, | |
| `channel_type` ENUM('group','channel','tips','elite') NOT NULL, | |
| `whatsapp_link` VARCHAR(500) NOT NULL, | |
| `description` TEXT DEFAULT NULL, | |
| `icon_class` VARCHAR(50) DEFAULT NULL, | |
| `color_class` VARCHAR(50) DEFAULT NULL, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `member_count` INT NOT NULL DEFAULT 0, | |
| `max_capacity` INT NOT NULL DEFAULT 1000, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `withdrawal_destinations` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `type` ENUM('mpesa','bank','airtel','tkash') NOT NULL, | |
| `details` VARCHAR(255) NOT NULL, | |
| `is_default` TINYINT(1) NOT NULL DEFAULT 0, | |
| `is_active` TINYINT(1) NOT NULL DEFAULT 1, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| KEY `user_id` (`user_id`), | |
| CONSTRAINT `withdrawal_destinations_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE TABLE `withdrawals` ( | |
| `id` INT NOT NULL AUTO_INCREMENT, | |
| `user_id` INT NOT NULL, | |
| `destination_id` INT NOT NULL, | |
| `amount` DECIMAL(15,2) NOT NULL, | |
| `fee` DECIMAL(15,2) NOT NULL DEFAULT 0.00, | |
| `net_amount` DECIMAL(15,2) NOT NULL, | |
| `status` ENUM('pending','processing','completed','failed','cancelled') NOT NULL DEFAULT 'pending', | |
| `idempotency_key` VARCHAR(255) NOT NULL, | |
| `reference` VARCHAR(100) NOT NULL, | |
| `failure_reason` TEXT, | |
| `processed_at` TIMESTAMP NULL DEFAULT NULL, | |
| `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| PRIMARY KEY (`id`), | |
| UNIQUE KEY `idempotency_key` (`idempotency_key`), | |
| KEY `user_id` (`user_id`), | |
| KEY `destination_id` (`destination_id`), | |
| CONSTRAINT `withdrawals_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, | |
| CONSTRAINT `withdrawals_ibfk_2` FOREIGN KEY (`destination_id`) REFERENCES `withdrawal_destinations` (`id`) ON DELETE CASCADE | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; | |
| CREATE VIEW `user_teams` AS | |
| SELECT | |
| u.id AS user_id, | |
| u.username, | |
| u.referral_code, | |
| COUNT(r.referred_id) AS team_size, | |
| COALESCE(SUM(ref.commission_earned), 0) AS total_earnings | |
| FROM | |
| users u | |
| LEFT JOIN | |
| referrals r ON u.id = r.referrer_id | |
| LEFT JOIN | |
| referrals ref ON u.id = ref.referrer_id AND ref.status = 'completed' | |
| GROUP BY | |
| u.id, u.username, u.referral_code; | |