2
1
0

ワークフロー遷移時に、ある特定日付項目のバリデータを設けたく、

Script Validator [ScriptRunner]にて、特定項目に入っている日付の値が「現在日付+3日<=特定項目」

となるように設定したい思っております。

こちらは実現可能でしょうか。

また、エラー時の文言等は設定できるのでしょうか。

    Commentコメントを追加...

    2 回答

    1.  
      3
      2
      1

      こちらは実現可能でしょうか。

      また、エラー時の文言等は設定できるのでしょうか。

      はい、どちらもできます。


      Script Validator [ScriptRunner] を選択すると、4パターンぐらいValidatorがあり

      Simple Scripted Validator が一番シンプルで以下サンプルの通りスクリプトから true,false のどちらかを return することでfalseの時に指定したエラーメッセージが表示できるようになります。

      https://scriptrunner.adaptavist.com/5.4.12/jira/recipes/workflow/validators/simple-scripted-validators.html

      今回のケースだと以下のようなスクリプトになりますかね。

      import com.atlassian.jira.component.ComponentAccessor;
      import com.atlassian.jira.issue.CustomFieldManager;
      import com.atlassian.jira.issue.fields.CustomField;
      import com.atlassian.jira.issue.Issue;
      import com.opensymphony.workflow.InvalidInputException;
      
      import java.util.Date;;
      import java.sql.Timestamp;
      import org.apache.commons.lang.time.DateUtils;
      
      CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
      CustomField  customField = customFieldManager.getCustomFieldObject(10400L);
      // フィールドに値が入っている場合
      if (issue.getCustomFieldValue(customField) != null) {
      	Date customFieldDate = new Date((issue.getCustomFieldValue(customField) as Timestamp).getTime() as Long);
          // 現在時刻から3日後
          Date checkDate = DateUtils.addDays(new Date(), 3);
          // 日付のみで比較(時刻は比較しない)
          if (DateUtils.truncatedCompareTo(checkDate, customFieldDate, Calendar.DAY_OF_MONTH) > 0) {
              // 設定したエラーメッセージ表示
              return false;
          }
      }
      // エラーメッセージなし
      return true;
      
      
      

      (警告) スクリプト内の 10400 は御社の特定項目のカスタムフィールドIDに変更してください。

      (ティック) Jira標準の日付処理関数でもできますが、楽するためライブラリ使っています。


      もう少し柔軟にエラーメッセージを処理したい場合は Custom script validator を選択して

      以下のように InvalidInputException  を発生させる必要があります。

      https://scriptrunner.adaptavist.com/latest/jira/custom-workflow-functions.html

      今回のケースだと以下のようなスクリプトになりますかね。

      import com.atlassian.jira.component.ComponentAccessor;
      import com.atlassian.jira.issue.CustomFieldManager;
      import com.atlassian.jira.issue.fields.CustomField;
      import com.atlassian.jira.issue.Issue;
      import com.opensymphony.workflow.InvalidInputException;
      
      import java.util.Date;;
      import java.sql.Timestamp;
      import org.apache.commons.lang.time.DateUtils;
      
      CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
      CustomField customField = customFieldManager.getCustomFieldObject(10400L);
      // フィールドに値が入っている場合
      if (issue.getCustomFieldValue(customField) != null) {
       Date customFieldDate = new Date((issue.getCustomFieldValue(customField) as Timestamp).getTime() as Long);
       // 現在時刻から3日後
       Date checkDate = DateUtils.addDays(new Date(), 3);
       // 日付のみで比較(時刻は比較しない)
       if (DateUtils.truncatedCompareTo(checkDate, customFieldDate, Calendar.DAY_OF_MONTH) > 0) {
       throw new InvalidInputException(customField.getId(), String.format("現在日付+3日(%s) <= フィールドの値(%s) になるように設定してください", checkDate, customFieldDate));
       }
      }
      // エラーメッセージなし

      (警告) スクリプト内の 10400 は御社の特定項目のカスタムフィールドIDに変更してください。

      (ティック) Jira標準の日付処理関数でもできますが、楽するためライブラリ使っています。


      https://community.atlassian.com/t5/Marketplace-Apps-questions/How-to-Script-a-Validator-for-a-Date-Time-Picker-Field/qaq-p/115031

      のスクリプトとかも参考になると思います。


        Commentコメントを追加...
      1.  
        1
        0
        -1

        ありがとうございます。

        大変助かりました。

        1. Kengo Ohsaki

          せるおん-san,

          ご確認ありがとうございます。

          参考になりましたら幸いです。

        2. せるおん

          すいません、もう1点だけよろしいでしょうか。

          バリデータにて、報告者本人以外はトランジションできるが、

          報告者のみトランジションできないようにはできるでしょうか。


          お手数をお掛けいたしますが、よろしくお願い致します。

        3. Kengo Ohsaki

          せるおん-san,

          バリデータにて、報告者本人以外はトランジションできるが、

          報告者のみトランジションできないようにはできるでしょうか。

          はい、できます。

          Simple Scripted Validator だと以下のようなスクリプトになるかと思います。

          import com.atlassian.jira.component.ComponentAccessor;
          
          
          // 報告者が設定されている かつ 報告者が現在ログインしている人以外であればトランジションOK
          if (issue.getReporter() != null && issue.getReporter().equals(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()) == false) {
          	return true;
          }
          return false;
        4. せるおん

          大変助かりました。

          ありがとうございました。

        Commentコメントを追加...