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()
];
}
}
}