query( "SELECT estado, COUNT(*) as total FROM oficios WHERE deleted_at IS NULL GROUP BY estado" )->fetchAll(); $resumenResponsables = $db->query( "SELECT CONCAT(u.nombre,' ',u.apellido) AS nombre, COUNT(o.id) AS total, SUM(CASE WHEN o.estado='respondido' THEN 1 ELSE 0 END) AS respondidos, SUM(CASE WHEN o.estado NOT IN('respondido','archivado') AND o.fecha_vencimiento < CURDATE() THEN 1 ELSE 0 END) AS vencidos FROM oficios o JOIN usuarios u ON u.id=o.responsable_id WHERE o.deleted_at IS NULL GROUP BY o.responsable_id ORDER BY total DESC LIMIT 10" )->fetchAll(); $pageTitle = 'Reportes y Respaldo'; $activeNav = 'reportes'; include __DIR__ . '/../../views/layout/header.php'; include __DIR__ . '/../../views/layout/sidebar.php'; include __DIR__ . '/../../views/layout/topbar.php'; ?>
Reporte de Oficios (PDF)

Genera un informe completo de todos los oficios con filtros aplicados, en formato PDF.

Exportar a Excel/CSV

Descarga los oficios en formato Excel o CSV para análisis externo.

Cargar masiva de oficios (Excel/CSV)

Respaldo Base de Datos

Descarga un respaldo completo de la base de datos en formato SQL.

Descargar Respaldo SQL
Guarde el respaldo en un lugar seguro. Contiene datos sensibles.
Resumen por Estado
'badge-primary','en_proceso'=>'badge-warning','respondido'=>'badge-success','vencido'=>'badge-danger','archivado'=>'badge-secondary']; foreach ($resumenEstados as $r): $pct = $total_gral > 0 ? round($r['total']/$total_gral*100,1) : 0; ?>
EstadoTotal%
%
Rendimiento por Responsable
ResponsableTotalRespondidosVencidos
0 ? "{$r['vencidos']}" : '0' ?>