$hasta) [$desde, $hasta] = [$hasta, $desde]; // ── Mensajes entrantes por día (usuarios únicos) ───────── $msgRows = $db->fetchAll(" SELECT DATE(created_at) AS fecha, COUNT(DISTINCT user_id) AS usuarios, COUNT(*) AS total_mensajes FROM conversations WHERE direction = 'incoming' AND DATE(created_at) BETWEEN ? AND ? GROUP BY DATE(created_at) ORDER BY fecha ASC ", [$desde, $hasta]); // ── Agendamientos (turnos creados) por día ─────────────── $turnosRows = $db->fetchAll(" SELECT DATE(creado_at) AS fecha, COUNT(*) AS agendamientos FROM turnero_turnos WHERE DATE(creado_at) BETWEEN ? AND ? GROUP BY DATE(creado_at) ORDER BY fecha ASC ", [$desde, $hasta]); // ── Construir mapa fecha → datos combinados ────────────── $dias = []; // Generar todos los días del rango para que no haya huecos $cur = new DateTime($desde); $fin = new DateTime($hasta); while ($cur <= $fin) { $f = $cur->format('Y-m-d'); $dias[$f] = ['fecha' => $f, 'usuarios' => 0, 'total_mensajes' => 0, 'agendamientos' => 0]; $cur->modify('+1 day'); } foreach ($msgRows as $r) { if (isset($dias[$r['fecha']])) { $dias[$r['fecha']]['usuarios'] = (int)$r['usuarios']; $dias[$r['fecha']]['total_mensajes'] = (int)$r['total_mensajes']; } } foreach ($turnosRows as $r) { if (isset($dias[$r['fecha']])) { $dias[$r['fecha']]['agendamientos'] = (int)$r['agendamientos']; } } $porDia = array_values($dias); // ── Agrupado por día de la semana (0=Domingo … 6=Sábado) ─ $semana = [ 0 => ['dia' => 'Domingo', 'usuarios' => 0, 'agendamientos' => 0], 1 => ['dia' => 'Lunes', 'usuarios' => 0, 'agendamientos' => 0], 2 => ['dia' => 'Martes', 'usuarios' => 0, 'agendamientos' => 0], 3 => ['dia' => 'Miércoles', 'usuarios' => 0, 'agendamientos' => 0], 4 => ['dia' => 'Jueves', 'usuarios' => 0, 'agendamientos' => 0], 5 => ['dia' => 'Viernes', 'usuarios' => 0, 'agendamientos' => 0], 6 => ['dia' => 'Sábado', 'usuarios' => 0, 'agendamientos' => 0], ]; foreach ($porDia as $d) { $dow = (int)(new DateTime($d['fecha']))->format('w'); // 0=Dom $semana[$dow]['usuarios'] += $d['usuarios']; $semana[$dow]['agendamientos'] += $d['agendamientos']; } // ── Totales del rango ──────────────────────────────────── $totalUsuarios = array_sum(array_column($porDia, 'usuarios')); $totalMensajes = array_sum(array_column($porDia, 'total_mensajes')); $totalAgendamientos = array_sum(array_column($porDia, 'agendamientos')); // Día de semana pico (más usuarios) $picoDow = array_keys($semana, max($semana, fn($a,$b) => $a['usuarios'] <=> $b['usuarios']))[0] ?? null; $picoDow = array_reduce(array_keys($semana), fn($carry, $k) => ($semana[$k]['usuarios'] > $semana[$carry]['usuarios'] ? $k : $carry), 0); echo json_encode([ 'ok' => true, 'desde' => $desde, 'hasta' => $hasta, 'totales' => [ 'usuarios' => $totalUsuarios, 'mensajes' => $totalMensajes, 'agendamientos' => $totalAgendamientos, 'pico_semana' => $semana[$picoDow]['dia'] ?? '—', ], 'por_dia' => $porDia, 'por_dia_semana' => array_values($semana), ], JSON_UNESCAPED_UNICODE); } catch (Exception $e) { http_response_code(500); echo json_encode(['ok' => false, 'error' => $e->getMessage()]); }