157 lines
7.6 KiB
PHP
157 lines
7.6 KiB
PHP
<?php
|
|
require_once 'config/database.php';
|
|
require_once 'includes/header.php';
|
|
|
|
// Obtener estadísticas
|
|
$stats = [
|
|
'total' => 0,
|
|
'entradas' => 0,
|
|
'salidas' => 0,
|
|
'archivos' => 0,
|
|
'usuarios' => 0
|
|
];
|
|
|
|
try {
|
|
$stmt = $db->query("SELECT type, COUNT(*) as count FROM documents GROUP BY type");
|
|
while ($row = $stmt->fetch()) {
|
|
if ($row['type'] == 'entrada') $stats['entradas'] = $row['count'];
|
|
if ($row['type'] == 'salida') $stats['salidas'] = $row['count'];
|
|
if ($row['type'] == 'archivo_interno') $stats['archivos'] = $row['count'];
|
|
$stats['total'] += $row['count'];
|
|
}
|
|
|
|
$stmt = $db->query("SELECT COUNT(*) FROM users");
|
|
$stats['usuarios'] = $stmt->fetchColumn();
|
|
|
|
// Documentos recientes
|
|
$stmt = $db->query("SELECT d.*, u.name as user_name FROM documents d LEFT JOIN users u ON d.uploaded_by = u.id ORDER BY d.created_at DESC LIMIT 5");
|
|
$recent_docs = $stmt->fetchAll();
|
|
} catch (PDOException $e) {
|
|
$error = "Error al cargar las estadísticas.";
|
|
}
|
|
?>
|
|
|
|
<div class="mb-8 animate-fade-in">
|
|
<h1 class="text-3xl font-bold text-slate-800 tracking-tight">Panel de Control</h1>
|
|
<p class="text-slate-500 mt-2">Resumen de la actividad del departamento de Consultoría Jurídica.</p>
|
|
</div>
|
|
|
|
<?php if(isset($error)): ?>
|
|
<div class="bg-red-50 border-l-4 border-red-500 p-4 mb-8 rounded-r-lg shadow-sm">
|
|
<p class="text-sm text-red-700 font-medium"><?= $error ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<!-- Stats Grid -->
|
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8 animate-fade-in-delayed">
|
|
<!-- Total Documentos -->
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-sm font-bold text-slate-500 uppercase tracking-wider">Total Registros</h3>
|
|
<div class="w-10 h-10 rounded-full bg-blue-50 flex items-center justify-center">
|
|
<i class="fas fa-folder-open text-blue-600 text-lg"></i>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-slate-800"><?= $stats['total'] ?></p>
|
|
</div>
|
|
|
|
<!-- Entradas -->
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-sm font-bold text-slate-500 uppercase tracking-wider">Oficios Entrada</h3>
|
|
<div class="w-10 h-10 rounded-full bg-emerald-50 flex items-center justify-center">
|
|
<i class="fas fa-inbox text-emerald-600 text-lg"></i>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-slate-800"><?= $stats['entradas'] ?></p>
|
|
</div>
|
|
|
|
<!-- Salidas -->
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-sm font-bold text-slate-500 uppercase tracking-wider">Oficios Salida</h3>
|
|
<div class="w-10 h-10 rounded-full bg-amber-50 flex items-center justify-center">
|
|
<i class="fas fa-paper-plane text-amber-600 text-lg"></i>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-slate-800"><?= $stats['salidas'] ?></p>
|
|
</div>
|
|
|
|
<!-- Usuarios -->
|
|
<div class="bg-white rounded-2xl p-6 shadow-sm border border-slate-100 hover:shadow-md transition-shadow">
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="text-sm font-bold text-slate-500 uppercase tracking-wider">Usuarios Activos</h3>
|
|
<div class="w-10 h-10 rounded-full bg-purple-50 flex items-center justify-center">
|
|
<i class="fas fa-users text-purple-600 text-lg"></i>
|
|
</div>
|
|
</div>
|
|
<p class="text-3xl font-bold text-slate-800"><?= $stats['usuarios'] ?></p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Actividad Reciente -->
|
|
<div class="bg-white rounded-2xl shadow-sm border border-slate-100 overflow-hidden animate-fade-in-delayed">
|
|
<div class="px-6 py-5 border-b border-slate-100 bg-slate-50/50">
|
|
<h3 class="text-lg font-bold text-slate-800">Documentos Recientes</h3>
|
|
</div>
|
|
|
|
<div class="overflow-x-auto">
|
|
<table class="w-full text-left border-collapse">
|
|
<thead>
|
|
<tr>
|
|
<th class="px-6 py-4 text-xs font-bold text-slate-500 uppercase tracking-wider bg-slate-50">Referencia / Expediente</th>
|
|
<th class="px-6 py-4 text-xs font-bold text-slate-500 uppercase tracking-wider bg-slate-50">Asunto</th>
|
|
<th class="px-6 py-4 text-xs font-bold text-slate-500 uppercase tracking-wider bg-slate-50">Tipo</th>
|
|
<th class="px-6 py-4 text-xs font-bold text-slate-500 uppercase tracking-wider bg-slate-50">Fecha Registro</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-slate-100">
|
|
<?php if(empty($recent_docs)): ?>
|
|
<tr>
|
|
<td colspan="4" class="px-6 py-8 text-center text-slate-500 font-medium">No hay documentos registrados aún.</td>
|
|
</tr>
|
|
<?php else: ?>
|
|
<?php foreach($recent_docs as $doc): ?>
|
|
<tr class="hover:bg-slate-50 transition-colors">
|
|
<td class="px-6 py-4">
|
|
<span class="inline-flex items-center gap-2 font-semibold text-slate-800">
|
|
<i class="fas fa-file-alt text-accent"></i>
|
|
<?= htmlspecialchars($doc['reference_number']) ?>
|
|
</span>
|
|
</td>
|
|
<td class="px-6 py-4">
|
|
<p class="text-sm text-slate-800 font-medium line-clamp-1"><?= htmlspecialchars($doc['title']) ?></p>
|
|
<p class="text-xs text-slate-500 mt-1">Por: <?= htmlspecialchars($doc['user_name'] ?? 'Sistema') ?></p>
|
|
</td>
|
|
<td class="px-6 py-4">
|
|
<?php
|
|
$typeClasses = [
|
|
'entrada' => 'bg-emerald-100 text-emerald-800 border-emerald-200',
|
|
'salida' => 'bg-amber-100 text-amber-800 border-amber-200',
|
|
'archivo_interno' => 'bg-slate-100 text-slate-800 border-slate-200'
|
|
];
|
|
$typeLabels = [
|
|
'entrada' => 'Entrada',
|
|
'salida' => 'Salida',
|
|
'archivo_interno' => 'Archivo Interno'
|
|
];
|
|
$class = $typeClasses[$doc['type']] ?? 'bg-gray-100 text-gray-800 border-gray-200';
|
|
$label = $typeLabels[$doc['type']] ?? ucfirst($doc['type']);
|
|
?>
|
|
<span class="px-3 py-1 rounded-full text-[10px] font-bold border <?= $class ?> uppercase tracking-wider">
|
|
<?= $label ?>
|
|
</span>
|
|
</td>
|
|
<td class="px-6 py-4 text-sm text-slate-600 font-medium">
|
|
<?= date('d/m/Y H:i', strtotime($doc['created_at'])) ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<?php require_once 'includes/footer.php'; ?>
|