プロセス自己承認の制限

いつもお世話になっております。日々kintoneの開発を挑んているJoanです。

現在プロセスについて悩んでいます。

一言で言うと自己承認を防ぎたい。

自分が申請者の場合はプロセスの条件で管理していますが、

アプリ内には同行者の欄(ユーザー選択)があり、もし同行者(上司)が承認者になる場合があったら制限したい。

大雑把で考えてすると、実際の承認者と同行者が同じならアラート発生、一人なら出来るけど、複数いると判断が出来ない。

多分ループで何度も判断するかもしれない、ユーザー選択のフィールドの人数って取れますが?

それとも他にいい案やアドバイスがあれば幸です。よろしくお願いします。

一応現在作ったコードを添付します。

(function() {
"use strict";
kintone.events.on("app.record.detail.process.proceed", function(event) {
var record = event.record;
var nStatus = event.nextStatus.value;
var authorizer = kintone.getLoginUser().code;
var together = record["選擇使用者_4"]['value'][0]['code'];
if (nStatus == "一次承認者確認中") {
if (authorizer == together) {
alert("自己承認です。");
}
}
return event;
});
})();

Joanさん、こんにちは。プロジェクト・アスノートの松田です。

標準機能の工夫でこんなやり方はいかがでしょうか?
承認の作業者が何人いるのかにもよりますが、初めから作業者(承認者)にしない、という考え方です。

  1. その上司の人の承認を行う人が作業者となる承認中ステータスを別に作る
  2. プロセスの条件設定で、レコード内の同行者で行き先分岐
    参考 https://developer.cybozu.io/hc/ja/community/posts/360053062891/comments/360008115432

もう1つは、
承認者を設定するフィールドをフォームに置いておき、そこを承認ステータスの作業者に設定。
承認者フィールドへの登録をコントロール

  1. 都度人が選択
  2. カスタマイズでコントロール

松田様、早速の回答ありがとうございます。

いまプログラムにはテスト用ですので、実際のプロセスは既に行き先分岐をしています。

ただ作業者は作成者以外選べないので、同行者と言うフィールドを選択できない。

そして社内のことを考えて、結局プロセスの実行は許可したい。ただ注意しておきたい。

こんにちは~。
こんな感じでループ回してはどうでしょうか。

松田さんのやり方もいいですね!ぜひご参考になさってくださいませ。

for(var i = 0; i<together.length; i++) {
if (nStatus =="一次承認者確認中") {
if (authorizer == together[i].code) {
alert("自己承認です。");
}
}

あ、var together = record[“選擇使用者_4”][‘value’][0][‘code’];を

var together = record[“選擇使用者_4”][‘value’];

に変えないといけませんでした。失礼しました。

Teru様

返事ありがとうございます。

この方法で一回やってみます!

現在こんな感じで動きました、ただモバイルがうまく作動しませんでした。

(function() {
"use strict";
kintone.events.on(["app.record.detail.process.proceed","mobile.app.record.detail.process.proceed"], function(event) {
var record = event.record;
var nStatus = event.nextStatus.value;
var authorizer = kintone.getLoginUser().code;
var together = record["選擇使用者_4"]['value'];

if (nStatus == "一次承認者確認中" || nStatus == "二次承認者確認中" || nStatus == "直接承認者確認中" || nStatus == "部門長確認中" || nStatus == "社長確認中") {
for(var i = 0; i<together.length; i++) {
if (authorizer == together[i].code) {
alert("自己承認です。");
}
}
}
return event;
});
})();

Joan様

お世話になっております。無事動いたとのこと、よかったです。

スマホについてですが、スマホ用JSは設定されておりますでしょうか。

添付画像部分をご確認ください。

Teru様

回答ありがとうございます。

スマートフォン用の設定はありますが、動きませんでした。

削除し、再アップロードしたら無事動きました。

お騒がせしてすみません、ありがとうございます。

動くことはうれしいですが、もう少し皆様のアドバイスが欲しいです。

 

現在は簡単に承認者がもし同行者の中に入ったらアラート表示するですか、

理想は、もし承認者全部合わせて=同行者だったらアラート表示する、

例えば:

申請者A、同行者BCD→承認者B(一回目の承認者)C(二回目の承認者)D(三回目の承認者)

以上の場合はアラート表示

申請者A、同行者BCD→承認者B(一回目の承認者)C(二回目の承認者)E(三回目の承認者)

以上の場合はアラート表示しない

つまり、承認者の中に、一人でも申請者や同行者じゃあない場合はアラート表示しないとのことです。

これは作りとして可能でしょか?うまく判断の基準が想像つかない。

 

関する項目は、申請者(作成者)、同行者、一回承認者、二回承認者、直接承認者(自動入力)、部長(自動入力)、社長(自動入力)

プロセスの設定は、

提出して、直接承認者(場合によって部長や社長)に回す、

一回承認者、二回承認者はもし自己承認の場合だったら、他の人を指定するとの仕組みです。

もし一回や二回承認者を指定したら、提出は一回や二回承認者に回す。

お世話になります。

新規のご要望の件ですが、全ての承認者を取得後配列に格納、配列内にそれぞれが存在するかを判別していく方式はいかがでしょうか。

var together = record.選擇使用者\_4.value;

var checkValue = 0;

var authorizers = []; //配列を作成

authorizers.push(record.一回承認者.value); //配列に追加

authorizers.push(record.二回承認者.value); //配列に追加

authorizers.push(record.三回承認者.value); //配列に追加

//ここまででauthorizersの中には[B , C , D]が格納されています。



//ここから同行者に含まれるcodeごとに承認者の配列に含まれるかをチェックしていきます

for( var i = 0; i < together.length; i++ ) {

 if ( authorizes.indexOf(together[i].code) >= 0 ) {

 checkValue ++; //配列内に存在する場合のみcheckValueに1を足す

 }

}



//ここまでくると、checkValueが3ならば承認者と同行者がすべて一致した、ということになります。2や1や0なら一致しません

if( checkValue === 3 ) {

 alert ("自己承認です");

}

 

ちょっとイメージと違ったらすみません。ご確認ください。

Teru様

回答ありがとうございます。

checkValueまだ考えたが、全ての承認者を取得後配列に格納し、indexOfを使うことは思いつかなかった、

この方法でやってみます、ありがとうございました。

現在以下の作りになっています、

アラート表示は成功しました。

ただ項目のエラーが出てないです。

ユーザー選択の空欄の判断は[]じゃあないですか?

もし同行者=承認者なら、別の承認者を設定する必要があります。

まだ、その承認者は同行者ではないとの判断も必要ですね…

(function() {

"use strict";

kintone.events.on(["app.record.creat.submit",

   "app.record.edit.submit"], function(event) {


var record = event.record;


var together = record["我方接待者"]['value'];

var onepeople = record["一次承認者"]['value'];

var twopeople = record["二次承認者"]['value'];

var strpeople = record["直接承認者"]['value'];

var bopeople = record["部門長"]['value'];

var speople = record["社長"]['value'];


var checkValue = 0;

var authorizers = []; //配列を作成

//if(onepeople != []){authorizers.push(onepeople[0].code);}

//if(twopeople != []){authorizers.push(twopeople[0].code);}

authorizers.push(strpeople[0].code); 

authorizers.push(bopeople[0].code); 

authorizers.push(speople[0].code);




//ここから同行者に含まれるcodeごとに承認者の配列に含まれるかをチェックしていきます

for( var i = 0; i < together.length; i++ ) {

if ( authorizers.indexOf(together[i].code) >= 0 ) {

checkValue ++; //配列内に存在する場合のみcheckValueに1を足す

}

}




if(checkValue == 3)

{

alert("自己承認の可能性があります。")




if(onepeople == [])

{

record["一次承認者"].error = "正しく入力してください。";

}

}


return event;




});

})();
if(onepeople == [])
{
record["一次承認者"].error ="正しく入力してください。";
}

の部分はlengthで判定した方が良いと思います。

onepeople.length === 0で判断しましょう。

 

 

Tere様

回答ありがとうございます。

修正してみます。