= htmlspecialchars($oficio['numero_oficio']) ?>
= ucfirst($semaforo) ?> Confidencial= htmlspecialchars($oficio['asunto']) ?>
Sin historial registrado.
buscarPorId($id); if (!$oficio) { http_response_code(404); redirect(APP_URL . '/views/oficios/lista.php?error='.urlencode('Oficio no encontrado.')); } // Marcar notificación si viene de ella if (isset($_GET['notif'])) { $db = getDB(); $db->prepare("UPDATE notificaciones SET leida=1,leida_at=NOW() WHERE id=? AND usuario_id=?") ->execute([(int)$_GET['notif'], $_SESSION['usuario_id']]); } $historial = $model->historial($id); $comentarios = $model->comentarios($id, !AuthController::esAdmin()); $etiquetas = $model->etiquetasDeOficio($id); $adjuntos = getDB()->prepare("SELECT * FROM documentos_adjuntos WHERE oficio_id=? ORDER BY created_at DESC"); $adjuntos->execute([$id]); $adjuntos = $adjuntos->fetchAll(); $usuarios = (new UsuarioModel())->usuariosParaSelector(); $esAdmin = AuthController::esAdmin(); $userId = $_SESSION['usuario_id']; // Calcular semáforo $semaforo = $oficio['semaforo'] ?? 'vigente'; $semaforoColors = ['vigente'=>'success','proximo'=>'warning','vencido'=>'danger','completado'=>'info']; $semaColor = $semaforoColors[$semaforo] ?? 'secondary'; $pageTitle = 'Oficio: '.$oficio['numero_oficio']; $activeNav = $oficio['tipo'] === 'recibido' ? 'entrada' : 'salida'; include __DIR__ . '/../../views/layout/header.php'; include __DIR__ . '/../../views/layout/sidebar.php'; include __DIR__ . '/../../views/layout/topbar.php'; ?>
= htmlspecialchars($oficio['asunto']) ?>
Sin historial registrado.