'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 === 'Logistica' || $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) - PROVINCIA y CONTRAENTREGA $pedidos_mensual_provincia_asesora = []; $pedidos_mensual_contraentrega_asesora = []; $asesoras_mensual = []; $asesoras_mensual_provincia = []; $asesoras_mensual_contraentrega = []; if ($user_role === 'Administrador' || $user_role === 'Control Logistico' || $user_role === 'Logistica' || $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); // Por defecto, las dos tablas usan la misma lista (luego se ordena por cada tipo) $asesoras_mensual_provincia = $asesoras_mensual; $asesoras_mensual_contraentrega = $asesoras_mensual; $asesora_ids = array_column($asesoras_mensual, 'id'); if (!empty($asesora_ids)) { // PROVINCIA $estados_provincia = ['ROTULADO 📦', 'EN TRANSITO 🚛', 'EN DESTINO 🏬', 'COMPLETADO ✅']; $placeholders_estados_prov = implode(',', array_fill(0, count($estados_provincia), '?')); $placeholders_asesores = implode(',', array_fill(0, count($asesora_ids), '?')); $stmt_prov = $pdo->prepare(" SELECT DAY(created_at) as dia, asesor_id, COUNT(id) as total_pedidos FROM pedidos WHERE estado IN ($placeholders_estados_prov) AND MONTH(created_at) = ? AND YEAR(created_at) = ? AND asesor_id IN ($placeholders_asesores) GROUP BY dia, asesor_id "); $params_prov = array_merge($estados_provincia, [$selected_month, $selected_year], $asesora_ids); $stmt_prov->execute($params_prov); $pedidos_prov_data = $stmt_prov->fetchAll(PDO::FETCH_ASSOC); foreach ($pedidos_prov_data as $row) { $dia = (int)$row['dia']; $asesor_id = (int)$row['asesor_id']; $pedidos_mensual_provincia_asesora[$dia][$asesor_id] = (int)$row['total_pedidos']; } // Totales por asesora (Provincia) para ordenar columnas $totales_prov_para_orden = array_fill_keys($asesora_ids, 0); foreach ($pedidos_mensual_provincia_asesora as $dia_data) { foreach ($dia_data as $asesor_id => $cantidad) { if (isset($totales_prov_para_orden[$asesor_id])) { $totales_prov_para_orden[$asesor_id] += (int)$cantidad; } } } usort($asesoras_mensual_provincia, function ($a, $b) use ($totales_prov_para_orden) { $total_a = $totales_prov_para_orden[$a['id']] ?? 0; $total_b = $totales_prov_para_orden[$b['id']] ?? 0; return $total_a <=> $total_b; // de menor a mayor }); // CONTRAENTREGA $estados_contraentrega = ['RUTA_CONTRAENTREGA', 'RETORNADO', 'ENTREGA EXITOSA']; $placeholders_estados_contra = implode(',', array_fill(0, count($estados_contraentrega), '?')); $stmt_contra = $pdo->prepare(" SELECT DAY(created_at) as dia, asesor_id, COUNT(id) as total_pedidos FROM pedidos WHERE estado IN ($placeholders_estados_contra) AND MONTH(created_at) = ? AND YEAR(created_at) = ? AND asesor_id IN ($placeholders_asesores) GROUP BY dia, asesor_id "); $params_contra = array_merge($estados_contraentrega, [$selected_month, $selected_year], $asesora_ids); $stmt_contra->execute($params_contra); $pedidos_contra_data = $stmt_contra->fetchAll(PDO::FETCH_ASSOC); foreach ($pedidos_contra_data as $row) { $dia = (int)$row['dia']; $asesor_id = (int)$row['asesor_id']; $pedidos_mensual_contraentrega_asesora[$dia][$asesor_id] = (int)$row['total_pedidos']; } // Totales por asesora (Contraentrega) para ordenar columnas $totales_contra_para_orden = array_fill_keys($asesora_ids, 0); foreach ($pedidos_mensual_contraentrega_asesora as $dia_data) { foreach ($dia_data as $asesor_id => $cantidad) { if (isset($totales_contra_para_orden[$asesor_id])) { $totales_contra_para_orden[$asesor_id] += (int)$cantidad; } } } usort($asesoras_mensual_contraentrega, function ($a, $b) use ($totales_contra_para_orden) { $total_a = $totales_contra_para_orden[$a['id']] ?? 0; $total_b = $totales_contra_para_orden[$b['id']] ?? 0; return $total_a <=> $total_b; // de menor a mayor }); } } ?>

Dashboard

Bienvenido, !

Mis Pedidos del Día
Mis Pedidos de
Asesora del Mes () - En Curso
Bonificacion S/250
pedidos
Mejor Efectividad en Completados () - En Curso
% de efectividad
Pedidos del Día Cargados
Pedidos de
Pedidos en Tránsito (Total)
Asesora del Mes () - En Curso
Bonificacion S/250
pedidos
Mejor Efectividad en Completados () - En Curso
% de efectividad
Reporte Mensual de Pedidos por Asesora - Provincia ()
No hay asesoras configuradas para mostrar en este reporte.
' . ($cantidad > 0 ? $cantidad : '-') . ''; endforeach; ?>
Día Total Día
Total Mes
Rendimiento de Asesoras ()
Resumen Provincia por Asesora ()
"; echo ""; $total_provincia = 0; foreach ($estados_provincia as $e) { $total_provincia += $data['pedidos'][$e]; } foreach ($estados_provincia as $estado): $cantidad = (int)($data['pedidos'][$estado] ?? 0); $totals_provincia[$estado] += $cantidad; echo ""; endforeach; echo ""; $grand_total_provincia += $total_provincia; echo ""; endforeach; ?>
Asesora Total
No hay datos para el período seleccionado.
" . htmlspecialchars($data['nombre']) . ""; echo $cantidad; if ($total_provincia > 0) { $porcentaje = round(($cantidad / $total_provincia) * 100, 1); echo " ({" . $porcentaje . "}%)"; } echo "" . $total_provincia . "
Total Provincia
Reporte Mensual de Pedidos por Asesora - Contraentrega ()
No hay asesoras configuradas para mostrar en este reporte.
' . ($cantidad > 0 ? $cantidad : '-') . ''; endforeach; ?>
Día Total Día
Total Mes
Resumen Contraentrega por Asesora ()
'Ruta Contraentrega', 'RETORNADO' => 'Retornado', 'ENTREGA EXITOSA' => 'Entrega Exitosa' ]; ?> "; echo ""; $total_contraentrega = 0; foreach ($estados_contraentrega as $e) { $total_contraentrega += $data['pedidos'][$e]; } foreach ($estados_contraentrega as $estado): $cantidad = (int)($data['pedidos'][$estado] ?? 0); $totals_contraentrega[$estado] += $cantidad; echo ""; endforeach; echo ""; $grand_total_contraentrega += $total_contraentrega; echo ""; endforeach; ?>
Asesora Total
No hay datos para el período seleccionado.
" . htmlspecialchars($data['nombre']) . ""; echo $cantidad; if ($total_contraentrega > 0) { $porcentaje = round(($cantidad / $total_contraentrega) * 100, 1); echo " ({" . $porcentaje . "}%)"; } echo "" . $total_contraentrega . "
Total Contraentrega