092a8bc7ce
- Removed all backup/duplicate files - Removed test files from root - Consolidated documentation to /docs/ - Moved scripts to /scripts/ - Renamed f_* directories (removed prefix) - Organized icons and assets - Removed unused vendor directories - Cleaned up redundant config files
157 lines
6.3 KiB
SQL
157 lines
6.3 KiB
SQL
-- Token System Database Tables
|
|
-- Complete monetization system with Rainforest Pay integration
|
|
|
|
-- Token purchases table
|
|
CREATE TABLE IF NOT EXISTS token_purchases (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
usd_amount DECIMAL(10,2) NOT NULL,
|
|
token_amount INT NOT NULL,
|
|
exchange_rate DECIMAL(10,4) NOT NULL,
|
|
payment_id VARCHAR(255) NULL,
|
|
status ENUM('pending', 'completed', 'failed', 'cancelled') DEFAULT 'pending',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_payment_id (payment_id),
|
|
INDEX idx_status (status),
|
|
INDEX idx_created_at (created_at)
|
|
);
|
|
|
|
-- Token redemptions table
|
|
CREATE TABLE IF NOT EXISTS token_redemptions (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
token_amount INT NOT NULL,
|
|
gross_usd DECIMAL(10,2) NOT NULL,
|
|
platform_fee DECIMAL(10,2) NOT NULL,
|
|
net_usd DECIMAL(10,2) NOT NULL,
|
|
redemption_method ENUM('bank_transfer', 'mobile_money', 'paypal') NOT NULL,
|
|
payout_id INT NULL,
|
|
status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
completed_at TIMESTAMP NULL,
|
|
failed_at TIMESTAMP NULL,
|
|
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_payout_id (payout_id),
|
|
INDEX idx_status (status),
|
|
INDEX idx_created_at (created_at)
|
|
);
|
|
|
|
-- Token payouts table (Rainforest Pay integration)
|
|
CREATE TABLE IF NOT EXISTS token_payouts (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
redemption_id INT NOT NULL,
|
|
user_id INT NOT NULL,
|
|
usd_amount DECIMAL(10,2) NOT NULL,
|
|
rainforest_payout_id VARCHAR(255) NULL,
|
|
status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
|
|
failure_reason TEXT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
completed_at TIMESTAMP NULL,
|
|
failed_at TIMESTAMP NULL,
|
|
|
|
INDEX idx_redemption_id (redemption_id),
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_rainforest_payout_id (rainforest_payout_id),
|
|
INDEX idx_status (status),
|
|
|
|
FOREIGN KEY (redemption_id) REFERENCES token_redemptions(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- User payout settings table
|
|
CREATE TABLE IF NOT EXISTS user_payout_settings (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL UNIQUE,
|
|
payout_method ENUM('bank_transfer', 'mobile_money', 'paypal') NOT NULL,
|
|
payout_details JSON NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_payout_method (payout_method)
|
|
);
|
|
|
|
-- Token packages configuration (stored in db_settings)
|
|
INSERT INTO db_settings (setting_key, setting_value, setting_description) VALUES
|
|
('token_package_small', '{"tokens": 100, "bonus": 10, "usd": 10, "popular": false}', 'Small token package'),
|
|
('token_package_medium', '{"tokens": 500, "bonus": 75, "usd": 50, "popular": true}', 'Medium token package (most popular)'),
|
|
('token_package_large', '{"tokens": 1000, "bonus": 200, "usd": 100, "popular": false}', 'Large token package'),
|
|
('token_package_mega', '{"tokens": 2500, "bonus": 750, "usd": 250, "popular": false}', 'Mega token package')
|
|
ON DUPLICATE KEY UPDATE
|
|
setting_value = VALUES(setting_value),
|
|
setting_description = VALUES(setting_description);
|
|
|
|
-- Update token settings with monetization features
|
|
UPDATE db_settings SET setting_value = JSON_SET(
|
|
COALESCE(setting_value, '{}'),
|
|
'$.min_purchase', 5,
|
|
'$.max_purchase', 1000,
|
|
'$.min_redemption', 100,
|
|
'$.platform_fee_rate', 0.05,
|
|
'$.exchange_rate', 0.01
|
|
) WHERE setting_key = 'token_settings';
|
|
|
|
-- Create indexes for better performance
|
|
CREATE INDEX IF NOT EXISTS idx_token_transactions_user_type ON token_transactions(user_id, transaction_type);
|
|
CREATE INDEX IF NOT EXISTS idx_token_transactions_created ON token_transactions(created_at);
|
|
|
|
-- Add donation balance column to users table if not exists
|
|
ALTER TABLE db_accountuser
|
|
ADD COLUMN IF NOT EXISTS donation_balance DECIMAL(10,2) DEFAULT 0.00,
|
|
ADD COLUMN IF NOT EXISTS token_balance INT DEFAULT 0;
|
|
|
|
-- Create view for user token balances
|
|
CREATE OR REPLACE VIEW user_token_balances AS
|
|
SELECT
|
|
u.usr_id as user_id,
|
|
u.usr_user as username,
|
|
COALESCE(SUM(CASE WHEN tt.transaction_type IN ('purchase', 'gift_received', 'refund') THEN tt.amount ELSE 0 END), 0) -
|
|
COALESCE(SUM(CASE WHEN tt.transaction_type IN ('gift_sent', 'redemption', 'spend') THEN tt.amount ELSE 0 END), 0) as token_balance,
|
|
COUNT(CASE WHEN tt.transaction_type = 'purchase' THEN 1 END) as total_purchases,
|
|
COALESCE(SUM(CASE WHEN tt.transaction_type = 'purchase' THEN tt.amount END), 0) as total_purchased_tokens,
|
|
COUNT(CASE WHEN tt.transaction_type = 'redemption' THEN 1 END) as total_redemptions,
|
|
COALESCE(SUM(CASE WHEN tt.transaction_type = 'redemption' THEN tt.amount END), 0) as total_redeemed_tokens
|
|
FROM db_accountuser u
|
|
LEFT JOIN token_transactions tt ON u.usr_id = tt.user_id
|
|
GROUP BY u.usr_id, u.usr_user;
|
|
|
|
-- Create view for token purchase analytics
|
|
CREATE OR REPLACE VIEW token_purchase_analytics AS
|
|
SELECT
|
|
DATE(tp.created_at) as purchase_date,
|
|
COUNT(*) as total_purchases,
|
|
SUM(tp.usd_amount) as total_usd,
|
|
SUM(tp.token_amount) as total_tokens,
|
|
AVG(tp.usd_amount) as avg_purchase_amount,
|
|
COUNT(DISTINCT tp.user_id) as unique_buyers
|
|
FROM token_purchases tp
|
|
WHERE tp.status = 'completed'
|
|
GROUP BY DATE(tp.created_at)
|
|
ORDER BY purchase_date DESC;
|
|
|
|
-- Create view for token redemption analytics
|
|
CREATE OR REPLACE VIEW token_redemption_analytics AS
|
|
SELECT
|
|
DATE(tr.created_at) as redemption_date,
|
|
COUNT(*) as total_redemptions,
|
|
SUM(tr.token_amount) as total_tokens_redeemed,
|
|
SUM(tr.gross_usd) as total_gross_usd,
|
|
SUM(tr.platform_fee) as total_platform_fees,
|
|
SUM(tr.net_usd) as total_net_usd,
|
|
AVG(tr.token_amount) as avg_redemption_amount,
|
|
COUNT(DISTINCT tr.user_id) as unique_redeemers
|
|
FROM token_redemptions tr
|
|
WHERE tr.status = 'completed'
|
|
GROUP BY DATE(tr.created_at)
|
|
ORDER BY redemption_date DESC;
|
|
|
|
-- Sample data for testing (remove in production)
|
|
-- INSERT INTO token_purchases (user_id, usd_amount, token_amount, exchange_rate, status) VALUES
|
|
-- (1, 10.00, 110, 0.01, 'completed'),
|
|
-- (2, 50.00, 575, 0.01, 'completed'),
|
|
-- (3, 100.00, 1200, 0.01, 'pending');
|
|
|
|
COMMIT; |