event.error を返しているのにステータスが進んでしまうことがあるのは仕様でしょうか?

プロセスでステータスを進めるとき、event.error を設定して return event; しているにも関わらず、 稀にステータスが進んでしまう現象があり困っています。
自分の端末では正しくエラーが出て止まるのですが、他のユーザーで「完了日が未入力のまま次のステータスへ進んでしまった」ケースが複数回確認されました。
現在のコードは以下のようになっており、app.record.detail.process.proceed イベントで制御しています。

javascript

(function () {
“use strict”;
kintone.events.on([‘app.record.detail.process.proceed’], function (event) {
var record = event.record;
var currentStatus = event.status.value;
var nextStatus = event.nextStatus.value;

if (currentStatus === 'ステータス1' && nextStatus === 'ステータス2' && !record['完了日'].value) {
  event.error = '「完了日」が未入力のまま、完了に進めることはできません。';
  return event;
} else if (nextStatus === 'ステータス2' && ['ステータスx', 'ステータスy', 'ステータス1'].includes(currentStatus)) {
  setTimeout(() => {
    copyxxxx(record)
      .then(() => {
        location.reload();
      })
      .catch((err) => {
        alert("処理に失敗しました。");
        console.error("処理失敗", err);
      });
  }, 300);
}

return event;

});
})();


この現象について、
 `event.error` を返してもプロセスが進むことがあるのは仕様でしょうか?
 通信状況やUI操作(連打や戻るボタンなど)で発生する可能性はありますか?
これを確実に防ぐ手段(プロセス制御以外)に何か心当たりはありますか?
もし類似事例や回避策をご存じの方がいれば、ぜひ教えてください。

パッと見たところ構文で変な部分は無いのですが、

この部分の if 文を見ると「ステータス2」に遷移するときの currentStatus が取り得るステータスが「ステータスx」「ステータスy」「ステータス1」の3種類?あるように見えます。

完了日の判定をしている部分では

currentStatus が「ステータス1」のときしか判定していないので、判定が漏れているのではないでしょうか?


ちなみに、基本機能としてプロセスを遷移させるアクションに条件を設定できるので、そちらで制限を掛けることもできるかと思います。

「いいね!」 1

app.record.detail.process.proceedイベントでevent.errorを設定してreturn event;しても、ステータスが進んでしまうということですね。

「完了日」が未入力でもステータスを進められるパターンを3件ほど確認できたため投稿します(※網羅的に調査したわけではないので、パターン漏れがあってもあしからず、、)。

また、解決策としては 住田知基さん投稿のとおり、アクションが実行できる条件を設定することかと思います。必要に応じてご検討ください。

パターン1 : モバイル版でアクションを実行したとき
app.record.detail.process.proceedイベントはモバイル版に適用されません。モバイル版でも同様の制御が必要な場合は、mobile.app.record.detail.process.proceedイベントを用いたスマートフォン用のJavaScriptファイルやCSSファイルを適用する必要があります。

パターン2 : 言語ごとの名称が設定されているとき
たとえば、プロセス管理のステータス「ステータス1」が言語ごとの名称の英語表記で「Status1」の場合、英語表記のユーザーではステータスの名称が「ステータス1」と「Status1」で一致せず、ステータスを進めることが可能です。
これは、event.status.valueevent.nextStatus.valueユーザーの表示言語に従う仕様によるものです。

パターン3 : APIを利用してアクションを実行したとき
1件のレコードのステータスを更新するのようなkintone REST APIを実行すると、完了日フィールドが未入力であってもステータスを進めることが可能です。

補足

  • APIの仕様や通信状況を検討する前に、考慮漏れのパターンがないか等を含めてcybozu developer networkの記事を確認するとよいと思います。
  • アクションを実行できる条件を設定した場合、完了日が未入力であればPC版とモバイル版ともにアクションボタンが表示されない、kintone REST APIでステータスを進めようとしても400 Bad Requestのエラーが発生しました。
「いいね!」 1