'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril', 5 => 'Mayo', 6 => 'Junio', 7 => 'Julio', 8 => 'Agosto', 9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre' ]; $current_year = date('Y'); $years = range($current_year, $current_year - 5); // Últimos 5 años include 'layout_header.php'; // Contar pedidos del día (esto no cambia con el filtro mensual) $stmt_pedidos_hoy = $pdo->prepare("SELECT COUNT(*) FROM pedidos WHERE DATE(created_at) = CURDATE()"); $stmt_pedidos_hoy->execute(); $pedidos_hoy = $stmt_pedidos_hoy->fetchColumn(); // Contar pedidos del mes seleccionado $stmt_pedidos_mes = $pdo->prepare("SELECT COUNT(*) FROM pedidos WHERE MONTH(created_at) = ? AND YEAR(created_at) = ?"); $stmt_pedidos_mes->execute([$selected_month, $selected_year]); $pedidos_mes = $stmt_pedidos_mes->fetchColumn(); // Contar pedidos enviados (esto es un total general, no cambia con el filtro) $stmt_pedidos_enviados = $pdo->prepare("SELECT COUNT(*) FROM pedidos WHERE estado = 'EN TRANSITO 🚛'"); $stmt_pedidos_enviados->execute(); $pedidos_enviados = $stmt_pedidos_enviados->fetchColumn(); // Contadores específicos para el rol de Asesor $pedidos_hoy_asesor = 0; $pedidos_mes_asesor = 0; if ($user_role === 'Asesor') { // Contar pedidos del día para el asesor actual $stmt_hoy_asesor = $pdo->prepare("SELECT COUNT(*) FROM pedidos WHERE DATE(created_at) = CURDATE() AND asesor_id = ?"); $stmt_hoy_asesor->execute([$user_id]); $pedidos_hoy_asesor = $stmt_hoy_asesor->fetchColumn(); // Contar pedidos del mes seleccionado para el asesor actual $stmt_mes_asesor = $pdo->prepare("SELECT COUNT(*) FROM pedidos WHERE MONTH(created_at) = ? AND YEAR(created_at) = ? AND asesor_id = ?"); $stmt_mes_asesor->execute([$selected_month, $selected_year, $user_id]); $pedidos_mes_asesor = $stmt_mes_asesor->fetchColumn(); } // Define los estados de los pedidos $estados = ['RUTA_CONTRAENTREGA', 'RETORNADO', 'ENTREGA EXITOSA', 'ROTULADO 📦', 'EN TRANSITO 🚛', 'EN DESTINO 🏬', 'COMPLETADO ✅']; $asesor_data = []; $chart_data = []; if ($user_role === 'Administrador' || $user_role === 'Control Logistico' || $user_role === 'Asesor') { // 1. Obtener todos los asesores $stmt_asesores = $pdo->query("SELECT id, username, nombre_asesor FROM users WHERE role = 'Asesor'"); $asesores = $stmt_asesores->fetchAll(PDO::FETCH_ASSOC); // 2. Preparar la estructura de datos foreach ($asesores as $asesor) { $asesor_data[$asesor['id']] = [ 'nombre' => !empty($asesor['nombre_asesor']) ? $asesor['nombre_asesor'] : $asesor['username'], 'pedidos' => array_fill_keys($estados, 0), 'total' => 0 ]; } // Add a special entry for unassigned orders $asesor_data['sin_asignar'] = [ 'nombre' => 'Sin Asignar', 'pedidos' => array_fill_keys($estados, 0), 'total' => 0 ]; // 3. Construir y ejecutar una consulta única para todos los pedidos del mes seleccionado $placeholders = rtrim(str_repeat('?,', count($estados)), ','); $sql = " SELECT asesor_id, estado, COUNT(*) as total_pedidos FROM pedidos WHERE estado IN ($placeholders) AND MONTH(created_at) = ? AND YEAR(created_at) = ? GROUP BY asesor_id, estado "; $stmt_pedidos = $pdo->prepare($sql); $params = array_merge($estados, [$selected_month, $selected_year]); $stmt_pedidos->execute($params); // 4. Llenar la estructura con los datos de la consulta while ($row = $stmt_pedidos->fetch(PDO::FETCH_ASSOC)) { $asesor_id = $row['asesor_id']; $estado = $row['estado']; $total_pedidos = (int)$row['total_pedidos']; // Si el asesor_id es nulo o no corresponde a un asesor conocido, se agrupa en "Sin Asignar". if ($asesor_id === null || !isset($asesor_data[$asesor_id])) { $asesor_data['sin_asignar']['pedidos'][$estado] += $total_pedidos; } else { // De lo contrario, se asigna al asesor correspondiente. $asesor_data[$asesor_id]['pedidos'][$estado] = $total_pedidos; } } // 5. Calcular totales y preparar datos para el gráfico foreach ($asesor_data as $id => &$data) { $data['total'] = array_sum($data['pedidos']); } unset($data); // Encontrar a la asesora del mes $top_advisor_name = 'N/A'; $top_advisor_total = 0; if (!empty($asesor_data)) { // Clonar el array para no afectar el orden del gráfico $temp_asesor_data = $asesor_data; // Ordenar de forma descendente para encontrar a la mejor uasort($temp_asesor_data, function ($a, $b) { return $b['total'] <=> $a['total']; }); $top_advisor = reset($temp_asesor_data); // Obtener la primera if ($top_advisor && $top_advisor['total'] > 0) { $top_advisor_name = $top_advisor['nombre']; $top_advisor_total = $top_advisor['total']; } } // Encontrar la mejor efectividad en completados $best_completion_advisor = ['nombre' => 'N/A', 'efectividad' => 0]; if (!empty($asesores)) { $completion_effectiveness = []; foreach ($asesores as $asesor) { // Contar el total de pedidos asignados al asesor en el mes $stmt_total = $pdo->prepare(" SELECT COUNT(*) FROM pedidos WHERE asesor_id = ? AND MONTH(created_at) = ? AND YEAR(created_at) = ? "); $stmt_total->execute([$asesor['id'], $selected_month, $selected_year]); $total_asignados = $stmt_total->fetchColumn(); if ($total_asignados > 0) { // Contar pedidos completados para el asesor en el mes $stmt_completados = $pdo->prepare(" SELECT COUNT(*) FROM pedidos WHERE asesor_id = ? AND estado = 'COMPLETADO ✅' AND MONTH(created_at) = ? AND YEAR(created_at) = ? "); $stmt_completados->execute([$asesor['id'], $selected_month, $selected_year]); $total_completados = $stmt_completados->fetchColumn(); $efectividad = ($total_completados / $total_asignados) * 100; $nombre_asesor = !empty($asesor['nombre_asesor']) ? $asesor['nombre_asesor'] : $asesor['username']; $completion_effectiveness[] = ['nombre' => $nombre_asesor, 'efectividad' => $efectividad]; } } if (!empty($completion_effectiveness)) { // Ordenar por efectividad descendente usort($completion_effectiveness, function ($a, $b) { return $b['efectividad'] <=> $a['efectividad']; }); $best_completion_advisor = $completion_effectiveness[0]; } } // Ordenar asesores por total de pedidos (descendente) para la tabla y el gráfico uasort($asesor_data, function ($a, $b) { return $b['total'] <=> $a['total']; }); // Preparar datos para Chart.js foreach ($asesor_data as $data) { $chart_data['labels'][] = $data['nombre']; $chart_data['data'][] = $data['total']; } // Invertir el orden para el gráfico (de menor a mayor) if (isset($chart_data['labels'])) { $chart_data['labels'] = array_reverse($chart_data['labels']); $chart_data['data'] = array_reverse($chart_data['data']); } } // TABLA DE PEDIDOS POR DÍA Y ASESORA (TIPO EXCEL) $pedidos_mensual_asesora = []; $asesoras_mensual = []; if ($user_role === 'Administrador' || $user_role === 'Control Logistico' || $user_role === 'Asesor') { // 1. Obtener todas las asesoras $stmt_asesoras = $pdo->query("SELECT id, nombre_asesor FROM users WHERE role = 'Asesor' AND nombre_asesor IS NOT NULL AND nombre_asesor != ''"); $asesoras_mensual = $stmt_asesoras->fetchAll(PDO::FETCH_ASSOC); $asesora_ids = array_column($asesoras_mensual, 'id'); // 2. Obtener y procesar los datos de pedidos del mes if (!empty($asesora_ids)) { $placeholders = implode(',', array_fill(0, count($asesora_ids), '?')); $stmt_pedidos_mensual = $pdo->prepare(" SELECT DAY(created_at) as dia, asesor_id, COUNT(id) as total_pedidos FROM pedidos WHERE MONTH(created_at) = ? AND YEAR(created_at) = ? AND asesor_id IN (" . $placeholders . ") GROUP BY dia, asesor_id "); $params = array_merge([$selected_month, $selected_year], $asesora_ids); $stmt_pedidos_mensual->execute($params); $pedidos_data = $stmt_pedidos_mensual->fetchAll(PDO::FETCH_ASSOC); foreach ($pedidos_data as $row) { $pedidos_mensual_asesora[$row['dia']][$row['asesor_id']] = $row['total_pedidos']; } // 3. Calcular totales por asesora para el mes $totales_por_asesora_para_orden = array_fill_keys($asesora_ids, 0); foreach ($pedidos_mensual_asesora as $dia_data) { foreach ($dia_data as $asesor_id => $cantidad) { if (isset($totales_por_asesora_para_orden[$asesor_id])) { $totales_por_asesora_para_orden[$asesor_id] += $cantidad; } } } // 4. Ordenar el array de asesoras basado en el total de pedidos (de menor a mayor) usort($asesoras_mensual, function ($a, $b) use ($totales_por_asesora_para_orden) { $total_a = $totales_por_asesora_para_orden[$a['id']] ?? 0; $total_b = $totales_por_asesora_para_orden[$b['id']] ?? 0; return $total_a <=> $total_b; }); } } ?>
Bienvenido, !
| Día | Total Día | |
|---|---|---|
| ' . ($cantidad > 0 ? $cantidad : '-') . ''; endforeach; ?> | ||
| Total Mes |
| Asesora | 'Ruta Contraentrega', 'RETORNADO' => 'Retornado', 'ENTREGA EXITOSA' => 'Entrega Exitosa']; foreach ($estados as $estado): $display_name = $estado_display_map[$estado] ?? $estado; echo "" . htmlspecialchars($display_name) . " | "; endforeach; ?>Total | No hay datos para el período seleccionado. | "; else: // Initialize totals $totals = array_fill_keys($estados, 0); $grand_total = 0; // Definir los grupos de estados para los cálculos de porcentaje $estados_efectividad = ['RUTA_CONTRAENTREGA', 'RETORNADO', 'ENTREGA EXITOSA']; foreach ($asesor_data as $data): echo "
|---|---|---|
| " . htmlspecialchars($data['nombre']) . " | "; // Calcular los totales para cada grupo $total_efectividad = 0; $total_general_grupo = 0; foreach ($estados_efectividad as $e) { $total_efectividad += $data['pedidos'][$e]; } foreach ($estados as $estado) { if (!in_array($estado, $estados_efectividad)) { $total_general_grupo += $data['pedidos'][$estado]; } } foreach ($estados as $estado): $cantidad = $data['pedidos'][$estado]; $totals[$estado] += $cantidad; echo ""; echo $cantidad; // Calcular porcentaje basado en el grupo if (in_array($estado, $estados_efectividad)) { if ($total_efectividad > 0) { $porcentaje = round(($cantidad / $total_efectividad) * 100, 1); echo " ({" . $porcentaje . "}%)"; } } else { if ($total_general_grupo > 0) { $porcentaje = round(($cantidad / $total_general_grupo) * 100, 1); echo " ({" . $porcentaje . "}%)"; } } echo " | "; endforeach; echo "" . $data['total'] . " | "; $grand_total += $data['total']; echo "
| Total General | " . $total_estado . ""; endforeach; echo "" . $grand_total . " | "; ?>