File "MenuModel.php"

Full Path: C:/wamp64/www/Asistencia_Capacitacion/Modelos/MenuModel.php
File size: 6.22 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// File: Modelos/MenuModel.php

require_once 'Modelos/Database.php';

class MenuModel {
    
    private $db;
    
    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
    }
    
// File: Modelos/MenuModel.php (función getDashboardData corregida)

/**
 * Obtiene todos los datos necesarios para el dashboard
 * @param string|null $fecha Fecha seleccionada (opcional)
 * @return array Datos del dashboard
 */
public function getDashboardData($fecha = null) {
    
    // Inicializar array de datos
    $data = [
        'fechaSeleccionada' => date('Y-m-d'), // Inicialmente fecha actual
        'fechasDisponibles' => [],
        'totalAsistencias' => 0,
        'asistenciasHoy' => 0,
        'pendientesSalida' => 0,
        'totalPersonas' => 0,
        'porcentajeCumplimiento' => 0,
        'totalGeneral' => 0,
        'totalCapacitaciones' => 0,
        'asistenciasCompletas' => 0,
        'capacitacionDelDia' => 'Sin capacitación',
        'errorMessage' => ''
    ];
    
    try {
        // 1. Obtener fechas disponibles (IMPORTANTE: ordenadas DESC)
        $stmt = $this->db->query("
            SELECT DISTINCT DATE(fecha) as fecha 
            FROM asistencia 
            WHERE fecha IS NOT NULL
            ORDER BY fecha DESC
        ");
        $data['fechasDisponibles'] = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // 2. Determinar la fecha a usar:
        //    a) Si el usuario seleccionó una fecha ($fecha no es null), usar esa.
        //    b) Si NO seleccionó una fecha, y hay fechas disponibles, usar la más reciente.
        //    c) Si no hay fechas disponibles, usar la fecha actual (que dará 0 en resultados).
        if ($fecha) {
            $data['fechaSeleccionada'] = $fecha;
        } elseif (!empty($data['fechasDisponibles'])) {
            $data['fechaSeleccionada'] = $data['fechasDisponibles'][0]['fecha'];
        }
        
        $fechaFiltro = $data['fechaSeleccionada'];
        
        // 3. Obtener el resto de las métricas usando la fecha de filtro determinada.
        
        // A. Total Asistencias (Entrada) para la fecha seleccionada
        $stmt = $this->db->prepare("
            SELECT COUNT(cedula) as total 
            FROM asistencia 
            WHERE DATE(fecha) = :fechaFiltro
        ");
        $stmt->bindParam(':fechaFiltro', $fechaFiltro);
        $stmt->execute();
        $data['totalAsistencias'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];

        // B. Total Personas Únicas (para el porcentaje)
        $stmt = $this->db->prepare("
            SELECT COUNT(DISTINCT cedula) as total 
            FROM asistencia 
            WHERE DATE(fecha) = :fechaFiltro
        ");
        $stmt->bindParam(':fechaFiltro', $fechaFiltro);
        $stmt->execute();
        $data['totalPersonas'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];

        // C. Asistencias Completas (Entrada y Salida)
        $stmt = $this->db->prepare("
            SELECT COUNT(DISTINCT cedula) as total 
            FROM asistencia 
            WHERE DATE(fecha) = :fechaFiltro AND estado = 1
        ");
        $stmt->bindParam(':fechaFiltro', $fechaFiltro);
        $stmt->execute();
        $data['asistenciasCompletas'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];
        
        // D. Pendientes por Salida (estado = 0)
        $stmt = $this->db->prepare("
            SELECT COUNT(DISTINCT cedula) as total 
            FROM asistencia 
            WHERE DATE(fecha) = :fechaFiltro AND estado = 0
        ");
        $stmt->bindParam(':fechaFiltro', $fechaFiltro);
        $stmt->execute();
        $data['pendientesSalida'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];

        // E. Capacitación del Día (usamos GROUP_CONCAT para obtener todas)
        $stmt = $this->db->prepare("
            SELECT GROUP_CONCAT(DISTINCT capacitacion SEPARATOR ', ') as capacitacion
            FROM asistencia 
            WHERE DATE(fecha) = :fechaFiltro
        ");
        $stmt->bindParam(':fechaFiltro', $fechaFiltro);
        $stmt->execute();
        $capacitacion = $stmt->fetch(PDO::FETCH_ASSOC)['capacitacion'];
        if ($capacitacion) {
            $data['capacitacionDelDia'] = $capacitacion;
        }
        
        // F. Porcentaje de Cumplimiento (Asistencias Completas / Total Personas Únicas)
        if ($data['totalPersonas'] > 0) {
            $data['porcentajeCumplimiento'] = round(($data['asistenciasCompletas'] / $data['totalPersonas']) * 100);
        }

        // G. Datos Históricos (Asistencias Totales y Total Capacitaciones)
        $stmt = $this->db->query("SELECT COUNT(*) as total FROM asistencia");
        $data['totalGeneral'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];
        
        $stmt = $this->db->query("SELECT COUNT(DISTINCT CODIGO) as total FROM capacitaciones");
        $data['totalCapacitaciones'] = $stmt->fetch(PDO::FETCH_ASSOC)['total'];
        
    } catch (Exception $e) {
        $data['errorMessage'] = "Error al obtener datos: " . $e->getMessage();
        error_log("MenuModel ERROR: " . $e->getMessage());
    }
    
    return $data;
}
    
    /**
     * Método de diagnóstico para verificar la estructura de la tabla
     * @return array Información de diagnóstico
     */
    public function diagnosticar() {
        try {
            // Verificar si la tabla existe y tiene datos
            $stmt = $this->db->query("SELECT COUNT(*) as total FROM asistencia");
            $total = $stmt->fetch(PDO::FETCH_ASSOC)['total'];
            
            // Obtener una muestra de datos
            $stmt = $this->db->query("SELECT * FROM asistencia LIMIT 5");
            $muestra = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            // Obtener estructura de la tabla
            $stmt = $this->db->query("DESCRIBE asistencia");
            $estructura = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return [
                'total_registros' => $total,
                'muestra_datos' => $muestra,
                'estructura_tabla' => $estructura
            ];
            
        } catch (Exception $e) {
            return [
                'error' => $e->getMessage()
            ];
        }
    }
}