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;