HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/gmartinmartin.sumar.com.py-2/tiempos13.php
<?php

// Incluimos la configuración y el entorno de Moodle
require_once(__DIR__ . '/config.php');

// Verifica que el usuario tiene los permisos necesarios (solo administradores, por ejemplo)
require_login();
if (!is_siteadmin()) {
    echo "No tienes permisos suficientes para acceder a esta información.";
    exit;
}

// Obtener las fechas de inicio y fin del formulario (si están definidas)
$startdate = optional_param('startdate', 0, PARAM_INT);
$enddate = optional_param('enddate', 0, PARAM_INT);

// Si no se han definido las fechas, mostramos todos los datos
if ($startdate == 0 && $enddate == 0) {
    $startdate = 0;  // Sin filtro de fecha de inicio
    $enddate = time();  // Fecha actual
}

// Convertimos las fechas a formato timestamp si es necesario
if ($startdate != 0) {
    $startdate = strtotime($startdate);
}
if ($enddate != 0) {
    $enddate = strtotime($enddate);
}

// Mostrar el formulario para ingresar las fechas de inicio y fin
echo '<form method="get" action="">';
echo 'Fecha de inicio: <input type="date" name="startdate" value="' . date('Y-m-d', $startdate) . '">';
echo 'Fecha de fin: <input type="date" name="enddate" value="' . date('Y-m-d', $enddate) . '">';
echo '<input type="submit" value="Filtrar">';
echo '</form>';

// Consulta para obtener todos los eventos de los usuarios en la tabla logstore_standard_log con el filtro por fecha
global $DB, $USER;

$sql = "
    SELECT u.id AS user_id, u.firstname, u.lastname, u.username, l.action, l.timecreated
    FROM {logstore_standard_log} l
    JOIN {user} u ON u.id = l.userid
    WHERE (l.action = 'loggedin' OR l.action = 'loggedout') 
";

$params = [];

// Solo agregamos los filtros de fecha si se han establecido
if ($startdate != 0 && $enddate != 0) {
    $sql .= " AND l.timecreated BETWEEN :startdate AND :enddate";
    $params['startdate'] = $startdate;
    $params['enddate'] = $enddate;
}

$sql .= " ORDER BY l.userid, l.timecreated";

$records = $DB->get_recordset_sql($sql, $params);

// Verificar si se obtuvieron registros
if (empty($records)) {
    echo "No se encontraron registros de actividad.";
    exit;
}

// Inicializamos las variables para almacenar el tiempo por usuario
$users_times = [];
$current_session_start = null;
$current_user_id = null;
$last_activity_time = null;

// Iterar sobre los registros y calcular las sesiones
foreach ($records as $record) {
    $user_id = $record->user_id;

    // Si encontramos un nuevo login (verificar si 'action' tiene el nombre correcto)
    if ($record->action == 'loggedin') {  // Este es el evento de login
        // Si ya tenemos una sesión previa, sumamos el tiempo hasta el último evento de actividad
        if ($current_session_start !== null && $last_activity_time !== null && $current_user_id == $user_id) {
            $session_duration = $last_activity_time - $current_session_start; // Duración en segundos
            if (!isset($users_times[$user_id])) {
                $users_times[$user_id] = 0;
            }
            $users_times[$user_id] += $session_duration; // Sumar al total de tiempo del usuario
        }

        // Iniciar una nueva sesión con el evento de login
        $current_session_start = $record->timecreated;
        $last_activity_time = $record->timecreated; // Inicializamos la actividad
        $current_user_id = $user_id;
    } else {
        // Si no es un login, es una actividad del usuario, actualizamos el último evento de actividad
        if ($current_user_id == $user_id) {
            $last_activity_time = $record->timecreated;
        }
    }
}

// Al final, si hay una sesión activa sin un login posterior, la cerramos usando el último evento de actividad
if ($current_session_start !== null && $last_activity_time !== null && $current_user_id !== null) {
    $session_duration = $last_activity_time - $current_session_start; // Duración en segundos
    if (!isset($users_times[$current_user_id])) {
        $users_times[$current_user_id] = 0;
    }
    $users_times[$current_user_id] += $session_duration; // Sumar al total de tiempo del usuario
}

// Mostrar los resultados en una tabla
echo "<h2>Usuarios y sus tiempos de conexión (entre " . date('d-m-Y', $startdate) . " y " . date('d-m-Y', $enddate) . ")</h2>";
echo "<table border='1'>";
echo "<tr><th>Usuario</th><th>Nombre</th><th>Total Tiempo Conectado (minutos)</th></tr>";

foreach ($users_times as $user_id => $total_time) {
    // Traer el nombre completo del usuario
    $user = $DB->get_record('user', ['id' => $user_id]);

    // Verificar si se pudo obtener el usuario
    if ($user) {
        // Convertir el tiempo total a minutos
        $total_minutes = round($total_time / 60); // Convertir segundos a minutos

        // Mostrar el tiempo total conectado para el usuario
        echo "<tr>
                <td>{$user->username}</td>
                <td>{$user->firstname} {$user->lastname}</td>
                <td>{$total_minutes} minutos</td>
              </tr>";
    }
}

echo "</table>";

// Exportar los resultados a Excel
echo '<form method="post" action="export_to_excel.php">';
echo '<input type="hidden" name="startdate" value="' . $startdate . '">';
echo '<input type="hidden" name="enddate" value="' . $enddate . '">';
echo '<input type="submit" value="Exportar a Excel">';
echo '</form>';

?>