prepare($sql_opening_hours); $stmt->execute([$dealer_id]); $opening_hours = $stmt->fetch(PDO::FETCH_ASSOC); $opening_hours = json_decode($opening_hours['opening_hours'],true); if (empty($opening_hours)){ // Define opening hours $opening_hours = [ 1 => ['start' => '09:00', 'end' => '17:00'], // Monday 2 => ['start' => '09:00', 'end' => '17:00'], // Tuesday 3 => ['start' => '09:00', 'end' => '17:00'], // Wednesday 4 => ['start' => '09:00', 'end' => '17:00'], // Thursday 5 => ['start' => '09:00', 'end' => '17:00'], // Friday 6 => ['start' => '09:00', 'end' => '17:00'], // Saturday 7 => null // Sunday - Closed ]; } else { // Convert all string "null" values to actual null foreach ($opening_hours as $day => $hours) { if ($hours === "null") { $opening_hours[$day] = null; } } } // Initialize an array to store the available slots for the entire month $all_available_slots = []; // Initialize a counter for the slot IDs $id_counter = 1; // Iterate over each day in the month for ($day = 1; $day <= $num_days; $day++) { // Create a full date string $full_date = sprintf("%04d-%02d-%02d", $year, $month, $day); // Determine the day of the week (1 = Monday, 7 = Sunday) $day_of_week = date('N', strtotime($full_date)); // Check if the day is open if ($opening_hours[$day_of_week] === null) { continue; // Skip closed days (Sunday) } // Get existing booked/unavailable slots for the day $booked_slots_sql = "SELECT start_time, end_time FROM appointment_slots WHERE DATE(start_time) = ? AND dealer_id = ? AND is_available = false"; $stmt = $pdo->prepare($booked_slots_sql); $stmt->execute([$full_date, $dealer_id]); $booked_result = $stmt->fetchAll(PDO::FETCH_ASSOC); // Store booked slots for the day $booked_slots = []; foreach ($booked_result as $row){ $booked_slots[] = [ 'start' => substr($row['start_time'], 11, 5), 'end' => substr($row['end_time'], 11, 5) ]; } // Generate all possible slots for the day $start_time = new DateTime($full_date . ' ' . $opening_hours[$day_of_week]['start']); $end_time = new DateTime($full_date . ' ' . $opening_hours[$day_of_week]['end']); $interval = new DateInterval('PT1H'); // Iterate through each hour and check availability while ($start_time < $end_time) { $slot_end = clone $start_time; $slot_end->add($interval); // Check if this slot is booked $is_available = true; foreach ($booked_slots as $booked) { $booked_start = new DateTime($full_date . ' ' . $booked['start']); $booked_end = new DateTime($full_date . ' ' . $booked['end']); if (($start_time >= $booked_start && $start_time < $booked_end) || ($slot_end > $booked_start && $slot_end <= $booked_end)) { $is_available = false; break; } } // If the slot is available, add it to the list if ($is_available) { $all_available_slots[] = [ 'id' => $id_counter++, 'start_time' => $start_time->format('Y-m-d H:i:s'), 'end_time' => $slot_end->format('Y-m-d H:i:s') ]; } $start_time->add($interval); } } $messages = $all_available_slots; } else { $messages =['success' => false, 'slots' => '']; } //------------------------------------------ //JSON_ENCODE //------------------------------------------ $messages = json_encode($messages, JSON_UNESCAPED_UNICODE); //Send results echo $messages; ?>