36716-vm/book-session.php
2025-12-07 05:00:42 +00:00

108 lines
4.4 KiB
PHP

<?php
session_start();
require_once 'db/config.php';
require_once 'stripe/init.php';
if (!isset($_SESSION['user_id']) || $_SESSION['user_role'] !== 'client') {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$coach_id = $_POST['coach_id'];
$client_id = $_SESSION['user_id'];
$booking_time = $_POST['booking_time'];
$pdo = db();
// Check if the client has an active package with this coach
$pkg_stmt = $pdo->prepare(
"SELECT cp.id, cp.sessions_remaining, sp.type, sp.client_limit FROM client_packages cp JOIN service_packages sp ON cp.package_id = sp.id WHERE cp.client_id = ? AND sp.coach_id = ? AND cp.sessions_remaining > 0 ORDER BY cp.purchase_date ASC LIMIT 1"
);
$pkg_stmt->execute([$client_id, $coach_id]);
$active_package = $pkg_stmt->fetch();
if ($active_package) {
// Use a session from the package
try {
$pdo->beginTransaction();
$is_recurring = isset($_POST['recurring']) && $_POST['recurring'] === 'on';
$recurrences = $is_recurring ? (int)$_POST['recurrences'] : 1;
$frequency = $is_recurring ? $_POST['frequency'] : 'weekly'; // Default to weekly
if ($active_package['sessions_remaining'] < $recurrences) {
throw new Exception('Not enough sessions remaining in the package.');
}
$current_booking_time = new DateTime($booking_time);
for ($i = 0; $i < $recurrences; $i++) {
if ($active_package['type'] === 'group') {
$count_stmt = $pdo->prepare("SELECT COUNT(*) FROM bookings WHERE coach_id = ? AND booking_time = ? AND status IN ('pending', 'confirmed')");
$count_stmt->execute([$coach_id, $current_booking_time->format('Y-m-d H:i:s')]);
$current_bookings = $count_stmt->fetchColumn();
if ($current_bookings >= $active_package['client_limit']) {
throw new Exception('This group session is already full.');
}
}
// 1. Create the booking
$book_stmt = $pdo->prepare(
"INSERT INTO bookings (coach_id, client_id, booking_time, status, payment_status) VALUES (?, ?, ?, 'pending', 'paid_with_package')"
);
$book_stmt->execute([$coach_id, $client_id, $current_booking_time->format('Y-m-d H:i:s')]);
// 2. Decrement remaining sessions
$update_pkg_stmt = $pdo->prepare("UPDATE client_packages SET sessions_remaining = sessions_remaining - 1 WHERE id = ?");
$update_pkg_stmt->execute([$active_package['id']]);
// Calculate next booking time
if ($i < $recurrences - 1) {
if ($frequency === 'weekly') {
$current_booking_time->modify('+1 week');
} elseif ($frequency === 'bi-weekly') {
$current_booking_time->modify('+2 weeks');
}
}
}
$pdo->commit();
// Send email notification to coach
require_once __DIR__ . '/mail/MailService.php';
$coach_stmt = $pdo->prepare("SELECT email FROM coaches WHERE id = ?");
$coach_stmt->execute([$coach_id]);
$coach = $coach_stmt->fetch();
$client_stmt = $pdo->prepare("SELECT name FROM clients WHERE id = ?");
$client_stmt->execute([$client_id]);
$client = $client_stmt->fetch();
if ($coach && $client) {
$to = $coach['email'];
$subject = 'New Pending Booking';
$message = "You have a new booking from {$client['name']} for {$booking_time}. Please log in to your dashboard to approve or decline it.";
MailService::sendMail($to, $subject, $message, $message);
}
header('Location: dashboard.php?booking=pending');
exit;
} catch (Exception $e) {
$pdo->rollBack();
error_log('Package booking failed: ' . $e->getMessage());
header('Location: profile.php?id=' . $coach_id . '&error=booking_failed');
exit;
}
} else {
// No active package, redirect to coach's profile to purchase one
header('Location: profile.php?id=' . $coach_id . '&error=no_package');
exit;
}
} else {
header('Location: coaches.php');
exit;
}