prepare(" SELECT p.project_name, p.project_id, b.batch_number, b.total_urls, b.sent_count, b.upload_type, b.created_at FROM survey_url_batches b JOIN projects p ON b.project_id = p.project_id WHERE b.project_id = ? AND b.batch_number = ? AND p.client_id = ? "); $stmt->execute([$project_id, $batch_number, $client_id]); $batch = $stmt->fetch(PDO::FETCH_ASSOC); if (!$batch) { $_SESSION['error'] = 'Batch not found or access denied'; header('Location: projects-list.php'); exit; } // Get all URLs from this batch $stmt = $pdo->prepare(" SELECT unique_identifier, rr_proxy_url, client_url, is_sent, sent_to_user_id, sent_at, created_at FROM survey_urls WHERE project_id = ? AND batch_number = ? ORDER BY id ASC "); $stmt->execute([$project_id, $batch_number]); $urls = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($urls)) { $_SESSION['error'] = 'No URLs found in this batch'; header('Location: view-batch-urls.php?project_id=' . urlencode($project_id) . '&batch=' . $batch_number); exit; } // Generate filename $filename = sprintf( '%s_Batch%d_%s.csv', $project_id, $batch_number, date('Ymd_His') ); // Set headers for CSV download header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Pragma: no-cache'); header('Expires: 0'); // Open output stream $output = fopen('php://output', 'w'); // Add UTF-8 BOM for Excel compatibility fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); // Write CSV headers fputcsv($output, [ 'Unique ID', 'Relevant Reflex URL', 'Client Survey URL', 'Status', 'Sent To User ID', 'Sent Date/Time', 'Created Date/Time' ]); // Write data rows foreach ($urls as $url) { fputcsv($output, [ $url['unique_identifier'], $url['rr_proxy_url'], $url['client_url'], $url['is_sent'] ? 'Sent' : 'Available', $url['sent_to_user_id'] ?? '', $url['sent_at'] ? date('Y-m-d H:i:s', strtotime($url['sent_at'])) : '', date('Y-m-d H:i:s', strtotime($url['created_at'])) ]); } // Add summary row fputcsv($output, []); // Empty row fputcsv($output, ['SUMMARY']); fputcsv($output, ['Project ID', $batch['project_id']]); fputcsv($output, ['Project Name', $batch['project_name']]); fputcsv($output, ['Batch Number', $batch_number]); fputcsv($output, ['Total URLs', $batch['total_urls']]); fputcsv($output, ['Sent URLs', $batch['sent_count']]); fputcsv($output, ['Available URLs', $batch['total_urls'] - $batch['sent_count']]); fputcsv($output, ['Upload Type', ucfirst($batch['upload_type'])]); fputcsv($output, ['Batch Created', date('Y-m-d H:i:s', strtotime($batch['created_at']))]); fputcsv($output, ['Export Date', date('Y-m-d H:i:s')]); // Close output stream fclose($output); // Log export activity error_log(sprintf( "Client %d exported %d URLs from project %s batch %d", $client_id, count($urls), $project_id, $batch_number )); exit; } catch (Exception $e) { error_log("Export Error: " . $e->getMessage()); $_SESSION['error'] = 'Error exporting URLs: ' . $e->getMessage(); header('Location: view-batch-urls.php?project_id=' . urlencode($project_id) . '&batch=' . $batch_number); exit; } ?>