Redmine wikiマクロを作成する方法２（完了チケットの割合をグラフで表示）

# Redmine wikiマクロを作成する方法２（完了チケットの割合をグラフで表示）

[Redmine Advent Calendar 2024](https://adventar.org/calendars/10311)の8日目の記事として作成しました。

今年のRedmine Advent Calendarに空白が多く残っており、クリスマスが過ぎる前までになんとか空白の日付の記事を書いて、空白の日付を埋めることを優先して記事を作成しました。そのため、濃くない内容の記事になるかもしれませんが、ご容赦ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633321/82403854-92df-03e9-a306-03db57ffe07d.png)

## 完成形
下図のようにwikiマクロの実行結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633321/fe27bca5-3dba-ae7e-e217-4cd1f206cb5e.png)



* * *
## 背景

Redmineには自作のwikiマクロを作成して登録することができます。
その方法としてはプラグインを作成しますがwikiマクロの登録のためのプラグインは比較的開発が簡単であるため、プラグインを作ったことがない方でも簡単に試してみることができるメリットがあります。

wikiマクロでは色々な処理をすることができるためRedmineの構造を理解したり、Rubyを理解したり、プラグインの仕組みを理解したりするためには良い教材になるかと思います。
今年のRedmine Advent Calendarを通して、何回かに分けてwikiマクロの作り方を紹介したいと思います。

今回の記事では「Redmine wikiマクロを作成する方法２」として「完了チケットの割合をグラフで表示」する方法を説明します。


## 前提条件：
使用するwikiマクロ登録用プラグインは[Redmine wikiマクロを作成する方法１](https://qiita.com/yam_asaki/items/1dfd349e078fc6d0f764)で説明したプラグインを使用します。/plugins/wiki_macro_plugin/init.rbの「init.rb」ファイルにwikiマクロを登録します。


---

### 1. **マクロを実装**

1. /plugins/wiki_macro_plugin/init.rbの「`init.rb`」ファイルを編集して、Wikiマクロを登録します：
   ```ruby
   Redmine::Plugin.register :wiki_macro_plugin do
    省略
   end

   Redmine::WikiFormatting::Macros.register do

      desc "Display progress bar for a project's issues"
      macro :progress_bar do |obj, args|
        project = Project.find_by_identifier(args.first || obj.project.identifier)
        total = project.issues.count
        closed = project.issues.where(status_id: IssueStatus.where(is_closed: true).pluck(:id)).count
        progress = total > 0 ? (closed * 100 / total) : 0
        <<~HTML.html_safe
          <div>完了チケットの割合</div>
          <div style="border: 1px solid #ccc; width: 100%; height: 20px; position: relative; background-color: #f5f5f5;">
            <div style="width: #{progress}%; height: 100%; background-color: #4caf50;"></div>
            <span style="position: absolute; left: 50%; top: 0; transform: translateX(-50%); font-size: 12px;">
             #{progress}%(total: #{total} closed: #{closed})
            </span>
          </div>
        HTML
      end
  
   end
   ```

   - `Project.find_by_identifier(args.first || obj.project.identifier)`で、引数で与えられたProjectを取得します。
   - `total = project.issues.count`で該当プロジェクトのチケットの個数を取得します。
   - `closed = project.issues.where(status_id: IssueStatus.where(is_closed: true).pluck(:id)).count`で、該当プロジェクトに所属しているチケットで、完了したチケットの数を取得しています。
   - `progress = total > 0 ? (closed * 100 / total) : 0`で、該当プロジェクトの全体のチケット数の中で占める完了チケットの数の割合を取得しています。
   - `<<~HTML.html_safe`で、マクロの返り値をhtmlで出力します。
   - プログレス表示用のdivの幅をprogressに合わせて、完了チケットの割合をグラフで表示できるようにしています。



---

### 2. **マクロの使い方:**

wikiページで下記の形式でwikiマクロを実行します。
   
   ```ruby
    {{progress_bar(project_identifier)}}
   ```

   - project_identifierにプロジェクトの識別子を引数として渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633321/96ab4b11-2f46-288f-1504-feff39686c01.png)

下図のようにwikiマクロの実行結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633321/fe27bca5-3dba-ae7e-e217-4cd1f206cb5e.png)


* * *
## 感想

* wikiマクロ登録用のプラグインがあれば、簡単にwikiマクロを登録できることが分かります。
* 色があるグラフで完了チケットの割合を表示できるので、見た目が華やかな感じになります。
* プロジェクトの取得や、チケット数の取得など、Redmineプラグインで必要な要素技術の習得用に wikiマクロで色々と遊んでみてください。
* `<<~HTML.html_safe`の部分が肝になっていますので、`<<~HTML.html_safe`の部分を色々と改善、修正したら、より実用的なグラフを表示させることができると思います。

* * *
### この記事の作成者の紹介
* * *
山崎進
* Redmine、Jquery、JavaScript,Rails、Ruby、SQL、VBA、RPAの開発を行なっています。
* 自動化、業務の効率化に高い関心があります。
* 下記の媒体で情報を発信しています。Redmineのプラグインの開発などに対応が可能ですので、お気軽にご連絡ください。

　* Qiita：https://qiita.com/ankosoft
　* Twitter：https://twitter.com/yamasaki24
　* Redmine Advent Calendarで記事投稿
　* redmine.tokyoで講演多数
　* Redmine Japan Vol.1 前夜祭、Redmine Japan Vol.3で講演
　* https://ankosoft.co.jp/blog/
　* https://technology.ankosoft.co.jp/

* * *
### 関連記事（2024年のRedmine Advent Calendarの記事です。）

 *　[Redmine wikiマクロを作成する方法１](https://qiita.com/yam_asaki/items/1dfd349e078fc6d0f764)

 *　[Redmine wikiマクロを作成する方法２（完了チケットの割合をグラフで表示）](https://qiita.com/yam_asaki/items/5e09143f93104c5590a1)

 *　[Redmine wikiマクロを作成する方法３（ステータスごとのチケットの割合をグラフで表示）](https://qiita.com/yam_asaki/items/ff108e081dc421fe2b10)

 *　[Redmine wikiマクロを作成する方法４（ステータスごとのチケットの割合を一つのグラフで表示）](https://qiita.com/yam_asaki/items/d0f0bba1b0caa892bd46)

 *　[Redmine wikiマクロを作成する方法５（特定のユーザーのチケット状態の確認）](https://qiita.com/yam_asaki/items/4138dc71505c7c33f63f)

 *　[Redmine wikiマクロを作成する方法６（プロジェクトに所属する全てのユーザーのチケット状態の確認）](https://qiita.com/yam_asaki/items/e80f9252a50caee14f1d)

### 関連記事（2023年のRedmine Advent Calendarの記事です。）
 *　[JqueryでRedmineのメニューにアイコンを入れる方法](https://qiita.com/yam_asaki/items/32097598cb0a653dd916)

 *　[JqueryでRedmineのメニューを閉じたり開いたりする方法](https://qiita.com/yam_asaki/items/5ac4a1127beeed53059c)

　*　[JqueryでRedmineの「活動ページ」をもっと便利に(タイトルを開閉したり、曜日を入れたり)](https://qiita.com/yam_asaki/items/718513b52b30b30f65bc)

　*　[JqueryでRedmineの「活動ページ」をもっと便利に②(フィルタリング機能と移動機能)](https://qiita.com/yam_asaki/items/2428610fd89bc73ce0ab)

　*　[JqueryでRedmineの「wikiページ」をもっと便利に(フィルタリング機能と移動機能)](https://qiita.com/yam_asaki/items/a6a32c45dbbc72a28836)

　*　[JqueryでRedmineの「チケットページ」をもっと便利に(年ごと、月ごと、四半期ごとの集計機能の開発)](https://qiita.com/yam_asaki/items/176d07588793b3e66b5d)

　*　[RedmineのパスワードやログインIDを忘れた時の復旧方法](https://qiita.com/yam_asaki/items/6881c92b30dc85f589ad)

　*　[「rails console」を使ってRedmine上のスケジュールを一括変更する方法](https://qiita.com/yam_asaki/items/1d41dc8653773f3522e6)