alert('User is not logged in. Please log in to make a booking.'); window.location.href = 'login.php';"; exit(); } // Fetch the membership fee record for this user $query = "SELECT fee_id, payment_amount, payment_status, membership_end_date FROM membership_fees WHERE user_id = ?"; $stmt = $conn->prepare($query); if (!$stmt) { http_response_code(500); echo json_encode(['error' => 'Server error preparing statement']); exit(); } $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); // Check if membership fee exists if ($result->num_rows === 0) { $response = ['error' => 'Membership fee not found.']; header('Content-Type: application/json'); echo json_encode($response); exit(); } // Fetch fee details $fee = $result->fetch_assoc(); $fee_id = isset($fee['fee_id']) ? intval($fee['fee_id']) : null; $payment_status = $fee['payment_status']; $membership_end_date = $fee['membership_end_date']; $payment_amount = floatval($fee['payment_amount']); $publicRef = bin2hex(random_bytes(16)); $description = "4WDCSA: Membership Fee " . getFullName($user_id) . " " . date("Y"); $payment_id = uniqid(); // Persist the generated payment_id back to the membership_fees row (use fee_id to be precise) $updateStmt = $conn->prepare("UPDATE membership_fees SET payment_id = ? WHERE fee_id = ?"); if ($updateStmt) { $updateStmt->bind_param("si", $payment_id, $fee_id); if (!$updateStmt->execute()) { throw new Exception("Failed to update membership_fees table: " . $updateStmt->error); } $updateStmt->close(); } else { throw new Exception("Failed to prepare statement for membership_fees table: " . $conn->error); } // If the amount is zero, treat as paid immediately if ($payment_amount < 1) { if (processZeroPayment($payment_id, $payment_amount, $description)) { // Update membership_fees status to PAID $paidStmt = $conn->prepare("UPDATE membership_fees SET payment_status = 'PAID' WHERE fee_id = ?"); if ($paidStmt) { $paidStmt->bind_param('i', $fee_id); $paidStmt->execute(); $paidStmt->close(); } echo ""; exit(); } else { echo ""; exit(); } } else { // Create payments row $status = "AWAITING PAYMENT"; $pstmt = $conn->prepare("INSERT INTO payments (payment_id, user_id, amount, status, description, public_ref) VALUES (?, ?, ?, ?, ?, ?)"); if ($pstmt) { $pstmt->bind_param('sidsss', $payment_id, $user_id, $payment_amount, $status, $description, $publicRef); $pstmt->execute(); $pstmt->close(); } // Create iKhokha payment link $resp = createIkhokhaPayment($payment_id, $payment_amount, $description, $publicRef); // Send invoice and admin notification if desired // sendInvoice(getEmail($user_id), getFullName($user_id), 'MEMBERSHIP-'.date('Y'), formatCurrency($payment_amount), $description); sendAdminNotification('Membership Payment Initiated - '.getFullName($user_id), getFullName($user_id).' initiated a membership payment.'); // Redirect user to payment link if available $paylink = $resp['paylinkUrl'] ?? $resp['paylinkURL'] ?? $resp['paylink_url'] ?? null; if ($paylink) { header('Location: ' . $paylink); exit(); } else { // Fallback: redirect to a membership page with an encrypted token header("Location: membership_confirmation?token=" . encryptData($payment_id, $salt)); exit(); } }