fellybikush's picture
Upload 99 files
0dff816 verified
raw
history blame
41.5 kB
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;