Redmineでステータスと連動して進捗率と担当者を変更する(View customize plugin)

5 min read読了の目安(約5000字

Redmineを使っていて、ステータスは変えたけど、進捗率や担当者といった情報を変更し忘れた、、といった経験は無いでしょうか。

今回は、View customize pluginを使って、ステータスに応じて進捗率と担当者を変更するようにカスタマイズを行ってみます。
変更しなければならない項目を減らせるので、漏れを無くすだけでなく、ユーザの利便性も上げることができます。

View customize plugin とは

Redmineの画面をカスタマイズするためのプラグインです。下記で公開しています。

特定の画面に対して、JavaScriptとCSSを埋め込む機能を提供します。

View customize pluginの利用方法については本記事では説明しませんので、View customize pluginを知らない方は、ぜひ一度下記に目を通していただいたうえで、先に進んでいただければと思います。
2021年5月時点で、View customize pluginについて一番詳しく説明した資料になります。

どのようにして担当者を決めるか

ステータスに応じて担当者を切り替える方法ですが、そのステータスに応じた担当者の情報をどこかに持っていないと切り替えられません。
そこで、ユーザのカスタムフィールドを利用し、その情報を元に担当者を設定します。

ここで重要なのは「担当者はあくまでそのタイミングでの担当者とし、状態に応じて変わるもの」として考えることです。
担当者=そのチケットの主担当とするのではなく、そのチケットに関わる人の情報をカスタムフィールドとして設定しておき、ステータスに応じて、担当者を切り替えるような形で考えます。

タスクの設計

資料を作成し、レビューをしてOKとなったら終了となるタスクを例として考えてみます。

  • 登場人物
    • 作業者:資料を作成する人
    • レビューア:作成した資料をレビューする人
  • 作業の流れ
    • 作業者を決定
    • 作業者が資料作成開始
    • 資料作成が完了したら、レビューアによるレビュー実施
    • レビューによって指摘があれば、作業者が修正
    • レビューが完了(指摘の反映も完了)したら終了

上記を元に、ステータスおよびステータス毎の進捗率と担当者を定義します。

ステータス 進捗率 担当者
新規 0 なし
担当 10 作業者
作成中 30 作業者
レビュー待ち 50 レビューア
レビュー結果反映待ち 70 作業者
終了 100 作業者

Redmineの設定

作業者とレビューアを選択するためのカスタムフィールド(ユーザ)を追加します。
形式をユーザとすることで、そのプロジェクトのユーザを選択できるカスタムフィールドが作成できます。

カスタムフィールド作成

ステータスについても、必要なものを追加します。

ステータス作成

どのステータスに遷移できるかをワークフローとして設定します。

ワークフロー

View customizeの設定

設計した内容を元に、View customize でステータス毎に進捗率と担当者を切り替えるスクリプトを作成、設定します。

挿入位置は「チケット入力欄の下」にします。

View customize

コードは下記の通りです。ステータスやカスタムフィールドのIDは、適宜環境に合わせて変える必要があります。

$(function () {

  const trackerElementId = 'issue_tracker_id';
  const statusElementId = 'issue_status_id';
  const doneRatioElementId = 'issue_done_ratio';
  const assigneeElementId = 'issue_assigned_to_id';

  const workerElementId = 'issue_custom_field_values_1';
  const reviewerElementId = 'issue_custom_field_values_2';

  // ステータスに応じた進捗率と担当者の情報
  const statusConditions = {
    // トラッカー毎に定義
    '4': {
      '7' : {done:  10, assignee: workerElementId},   // 担当                 :  10% / 作業者
      '8' : {done:  30, assignee: workerElementId},   // 作成中               :  30% / 作業者
      '10': {done:  50, assignee: reviewerElementId}, // レビュー待ち         :  50% / レビューア
      '11': {done:  70, assignee: workerElementId},   // レビュー結果反映待ち :  70% / 作業者
      '5' : {done: 100, assignee: workerElementId}    // 終了                 : 100% / 作業者
    }
  };

  $('#all_attributes').change(function(e) {

    const trackerCondtion = statusConditions[$('#' + trackerElementId).val()];
    if (trackerCondtion == null) {
      // 現在のトラッカーに対する設定が無い
      return null;
    }

    const statusCondition = trackerCondtion[$('#' + statusElementId).val()];
    if (statusCondition == null) {
      // ステータスに対する設定が無い
      return;
    }

    if (e.target.id == statusElementId) {
      // ステータスが変更された場合
      // 進捗と担当者を変更
      changeDone(statusCondition.done);
      changeAssignee(statusCondition.assignee);

    } else {
      // ステータス以外が変更された場合
      // 担当者の基にするフィールドが変わっていたら担当者を変える
      if (e.target.id == statusCondition.assignee) {
        changeAssignee(statusCondition.assignee);
      }
    }
  });

  function changeDone(doneRatio) {
    const currnetDoneRatio = parseInt($('#' + doneRatioElementId).val());
    if (currnetDoneRatio < doneRatio) {
      // 現在の進捗率が指定の進捗率より低いときは進捗率を変える
      // (進捗率を戻すことはしない)
      $('#' + doneRatioElementId).val(doneRatio);
    }
  }

  function changeAssignee(fromElementId) {
    const userId = $('#' + fromElementId).val();
    if (userId != '') {
      $('#' + assigneeElementId).val(userId);
    }
  }
});

上記コードでは、下記のようなことを行っています。

  • ステータスが変更された場合、ステータスに応じた進捗率と担当者を設定
    • 進捗率は戻すようなことはしない。現在の進捗率よりステータス毎の進捗率の方が大きい場合のみ設定する。
  • 作業者(またはレビューア)が変更された場合、担当者として作業者(またはレビューア)を設定するステータスならば、担当者も同期を取って変更する

動作

下記のようにステータスに応じて進捗率と担当者が変わるようになりました。

動作

終わりに

コード上の statusConditions に条件を集約しているので、statusConditions の内容を変えることで様々なワークフローが設定できます。
今回のコードを参考に、プロジェクトに応じたカスタマイズを試してみていただければと思います。

また、Redmine issue assign notice plugin を使うと、担当者が切り替わった際にSlackやTeams、Google Chatなどに通知できますので、あわせて利用することをおススメします。