= ?"; $params[] = $filter_from_date; } if ($filter_to_date) { $query .= " AND DATE(created_at) <= ?"; $params[] = $filter_to_date; } if ($filter_min_loi) { $query .= " AND eloi >= ?"; $params[] = intval($filter_min_loi); } if ($filter_max_loi) { $query .= " AND eloi <= ?"; $params[] = intval($filter_max_loi); } $query .= " ORDER BY created_at DESC"; $stmt = $pdo->prepare($query); $stmt->execute($params); $projects = $stmt->fetchAll(); // For each project, get real-time completion stats $projectStats = []; if (!empty($projects)) { $projectIds = array_column($projects, 'project_id'); $ph = implode(',', array_fill(0, count($projectIds), '?')); // URL-level stats per project $stmt = $pdo->prepare(" SELECT project_id, COUNT(*) as total_urls, SUM(CASE WHEN status = 'complete' THEN 1 ELSE 0 END) as completes, SUM(CASE WHEN status = 'clicked' THEN 1 ELSE 0 END) as clicked, SUM(CASE WHEN status IN ('earlyscreenout','latescreenout') THEN 1 ELSE 0 END) as screenouts, SUM(CASE WHEN status = 'quotafull' THEN 1 ELSE 0 END) as quotafull, SUM(CASE WHEN status = 'timeout' THEN 1 ELSE 0 END) as timeouts, AVG(CASE WHEN status='complete' AND actual_loi_seconds IS NOT NULL THEN actual_loi_seconds END) as avg_loi, SUM(CASE WHEN quality_flag = 'speedster' THEN 1 ELSE 0 END) as speedsters, SUM(CASE WHEN quality_flag = 'ip_duplicate' THEN 1 ELSE 0 END) as ip_dups FROM survey_urls WHERE project_id IN ($ph) GROUP BY project_id "); $stmt->execute($projectIds); foreach ($stmt->fetchAll() as $r) $projectStats[$r['project_id']] = $r; // Selection counts per project (by project internal id) $intIds = array_column($projects, 'id'); $ph2 = implode(',', array_fill(0, count($intIds), '?')); $stmt = $pdo->prepare(" SELECT project_id, COUNT(*) as sel_count FROM project_selections WHERE project_id IN ($ph2) GROUP BY project_id "); $stmt->execute($intIds); $selCounts = []; foreach ($stmt->fetchAll() as $r) $selCounts[$r['project_id']] = $r['sel_count']; } // Build filter description $filter_desc = []; if ($filter_status) $filter_desc[] = "Status: $filter_status"; if ($filter_industry) $filter_desc[] = "Industry: $filter_industry"; if ($filter_from_date) $filter_desc[] = "From: $filter_from_date"; if ($filter_to_date) $filter_desc[] = "To: $filter_to_date"; if ($filter_min_loi) $filter_desc[] = "Min LOI: {$filter_min_loi}min"; if ($filter_max_loi) $filter_desc[] = "Max LOI: {$filter_max_loi}min"; $filter_text = empty($filter_desc) ? 'All Projects' : implode(' | ', $filter_desc); // Global totals $g_completes = 0; $g_target = 0; $g_screenout = 0; $g_speedsters = 0; $g_ipdups = 0; $g_quality = 0; foreach ($projects as $p) { $s = $projectStats[$p['project_id']] ?? []; $g_completes += intval($s['completes'] ?? 0); $g_target += intval($p['sample_size']); $g_screenout += intval($s['screenouts'] ?? 0); $g_speedsters += intval($s['speedsters'] ?? 0); $g_ipdups += intval($s['ip_dups'] ?? 0); } $g_quality = $g_speedsters + $g_ipdups; $status_colors = [ 'Created' => '#0066cc', 'Targeted' => '#d97706', 'Live' => '#059669', 'On hold' => '#dc2626', 'Closed' => '#6b7280' ]; ?>
No projects match the selected filters.
| Project ID | Name | Status | eLOI | Target | Sel. | Completes | % | Progress | Avg LOI | Screen Out | Quota Full | Speedsters | IP Dups | Deadline |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| m | % | 0 ? '' . $spd . '' : '0'; ?> | 0 ? '' . $ipd . '' : '0'; ?> |