|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
if (session_status() == PHP_SESSION_NONE) { |
|
|
session_start(); |
|
|
} |
|
|
|
|
|
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { |
|
|
header('Location: ../../index.php'); |
|
|
exit; |
|
|
} |
|
|
|
|
|
|
|
|
require_once '../../config.php'; |
|
|
|
|
|
|
|
|
function getPackageDetails($package_id) { |
|
|
global $pdo; |
|
|
try { |
|
|
$stmt = $pdo->prepare("SELECT * FROM packages WHERE id = ?"); |
|
|
$stmt->execute([$package_id]); |
|
|
return $stmt->fetch(PDO::FETCH_ASSOC); |
|
|
} catch (PDOException $e) { |
|
|
error_log("Error getting package details: " . $e->getMessage()); |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function getAllPackages() { |
|
|
global $pdo; |
|
|
try { |
|
|
$stmt = $pdo->prepare("SELECT * FROM packages ORDER BY min_investment ASC"); |
|
|
$stmt->execute(); |
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC); |
|
|
} catch (PDOException $e) { |
|
|
error_log("Error getting all packages: " . $e->getMessage()); |
|
|
return []; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function canUserInvest($user_id, $package_id, $amount) { |
|
|
|
|
|
$package = getPackageDetails($package_id); |
|
|
if (!$package) return false; |
|
|
|
|
|
|
|
|
if ($amount < $package['min_investment'] || $amount > $package['max_investment']) { |
|
|
return false; |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
function createInvestment($user_id, $package_id, $amount, $payment_method) { |
|
|
global $pdo; |
|
|
|
|
|
|
|
|
$pdo->beginTransaction(); |
|
|
|
|
|
try { |
|
|
|
|
|
$package = getPackageDetails($package_id); |
|
|
if (!$package) { |
|
|
throw new Exception("Package not found"); |
|
|
} |
|
|
|
|
|
|
|
|
$start_date = date('Y-m-d H:i:s'); |
|
|
$end_date = date('Y-m-d H:i:s', strtotime("+{$package['duration_days']} days")); |
|
|
|
|
|
|
|
|
$total_earnings = $amount * ($package['daily_return'] / 100) * $package['duration_days']; |
|
|
|
|
|
|
|
|
$stmt = $pdo->prepare("INSERT INTO user_investments (user_id, package_id, amount, start_date, end_date, total_earnings) VALUES (?, ?, ?, ?, ?, ?)"); |
|
|
$stmt->execute([$user_id, $package_id, $amount, $start_date, $end_date, $total_earnings]); |
|
|
$investment_id = $pdo->lastInsertId(); |
|
|
|
|
|
|
|
|
$stmt = $pdo->prepare("SELECT MAX(amount) as max_investment FROM user_investments WHERE user_id = ? AND status = 'active'"); |
|
|
$stmt->execute([$user_id]); |
|
|
$result = $stmt->fetch(PDO::FETCH_ASSOC); |
|
|
$max_investment = $result ? $result['max_investment'] : 0; |
|
|
|
|
|
if ($amount >= $max_investment) { |
|
|
$stmt = $pdo->prepare("UPDATE users SET current_package_id = ?, package_start_date = ?, package_end_date = ? WHERE id = ?"); |
|
|
$stmt->execute([$package_id, $start_date, $end_date, $user_id]); |
|
|
} |
|
|
|
|
|
|
|
|
$stmt = $pdo->prepare("UPDATE users SET total_invested = total_invested + ? WHERE id = ?"); |
|
|
$stmt->execute([$amount, $user_id]); |
|
|
|
|
|
|
|
|
if ($payment_method === 'wallet') { |
|
|
|
|
|
$stmt = $pdo->prepare("UPDATE users SET balance = balance - ? WHERE id = ? AND balance >= ?"); |
|
|
$stmt->execute([$amount, $user_id, $amount]); |
|
|
|
|
|
if ($stmt->rowCount() === 0) { |
|
|
throw new Exception("Insufficient balance"); |
|
|
} |
|
|
|
|
|
|
|
|
$_SESSION['balance'] -= $amount; |
|
|
} else if ($payment_method === 'mpesa') { |
|
|
|
|
|
error_log("M-Pesa payment initiated for user $user_id, amount: $amount"); |
|
|
} else if ($payment_method === 'bank') { |
|
|
|
|
|
error_log("Bank transfer initiated for user $user_id, amount: $amount"); |
|
|
} |
|
|
|
|
|
|
|
|
$pdo->commit(); |
|
|
|
|
|
return $investment_id; |
|
|
|
|
|
} catch (Exception $e) { |
|
|
$pdo->rollBack(); |
|
|
error_log("Investment creation failed: " . $e->getMessage()); |
|
|
throw $e; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function getUserActiveInvestment($user_id) { |
|
|
global $pdo; |
|
|
try { |
|
|
$stmt = $pdo->prepare(" |
|
|
SELECT ui.*, p.name as package_name, p.daily_return, p.duration_days |
|
|
FROM user_investments ui |
|
|
JOIN packages p ON ui.package_id = p.id |
|
|
WHERE ui.user_id = ? AND ui.status = 'active' AND ui.end_date > NOW() |
|
|
ORDER BY ui.amount DESC |
|
|
LIMIT 1 |
|
|
"); |
|
|
$stmt->execute([$user_id]); |
|
|
return $stmt->fetch(PDO::FETCH_ASSOC); |
|
|
} catch (PDOException $e) { |
|
|
error_log("Error getting user active investment: " . $e->getMessage()); |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function getUserDailyProducts($user_id) { |
|
|
global $pdo; |
|
|
try { |
|
|
$stmt = $pdo->prepare(" |
|
|
SELECT up.*, p.name as product_name, p.description, p.value, p.image_url |
|
|
FROM user_products up |
|
|
JOIN products p ON up.product_id = p.id |
|
|
WHERE up.user_id = ? |
|
|
ORDER BY up.assigned_date DESC |
|
|
"); |
|
|
$stmt->execute([$user_id]); |
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC); |
|
|
} catch (PDOException $e) { |
|
|
error_log("Error getting user daily products: " . $e->getMessage()); |
|
|
return []; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { |
|
|
$response = ['success' => false, 'message' => '']; |
|
|
|
|
|
try { |
|
|
if ($_POST['action'] === 'invest') { |
|
|
$package_id = intval($_POST['package_id']); |
|
|
$amount = floatval($_POST['amount']); |
|
|
$payment_method = $_POST['payment_method']; |
|
|
$user_id = $_SESSION['user_id']; |
|
|
|
|
|
|
|
|
if (canUserInvest($user_id, $package_id, $amount)) { |
|
|
$investment_id = createInvestment($user_id, $package_id, $amount, $payment_method); |
|
|
|
|
|
$response['success'] = true; |
|
|
$response['message'] = 'Investment successful!'; |
|
|
$response['investment_id'] = $investment_id; |
|
|
|
|
|
|
|
|
$_SESSION['total_deposits'] += $amount; |
|
|
} else { |
|
|
$response['message'] = 'Invalid investment amount or package selection'; |
|
|
} |
|
|
} |
|
|
} catch (Exception $e) { |
|
|
$response['message'] = $e->getMessage(); |
|
|
} |
|
|
|
|
|
header('Content-Type: application/json'); |
|
|
echo json_encode($response); |
|
|
exit; |
|
|
} |
|
|
?> |