クラウド型 ワークフロー

難題!代理承認を実現してみる!

承認や決裁権限を第三者に一時的に渡すワークフロー。 タイマー中間イベント、ワークフロー APIs 等を活用することで、極力人を介さない自動処理で実現します。

こんにちは、古久保です。

Questetra BPM Suite のサービス開始からよく質問/要望をされたテーマ「代理承認」に挑みたいと思います。
(と言っても特定のご利用者に1年以上利用されているのですが…)

あーっと、自動化機能を活用しております。(ウチ、自動化推進しておりますもんで
「自動化実現例」の文脈でも見てもらえれば幸いです。

まず、「代理承認」の発生するケースですが、(一般的に)

* 承認者が休暇等で一定期間、「承認」作業ができない。
* 代わりの人に「承認」作業を依頼する。

ものであります。
ポイントは、「代わりの人」です。
「代わりの人」は、誰でも良いわけでありません。

* 職制上、(代理を依頼する)承認者の代わりをできる権限を保有する人
* (代理を依頼する)承認者が代わりの「承認」作業を行えると認めた人
* (代理を依頼する)承認者の職制の上位者が「承認」作業を行えると認めた人

のいずれかになろうかと思います。
(おそらく、社内規定に記載されているのではないでしょうか?)

これらの制約を実現できるアプリを作ることができれば代理承認が実現できることになります。

一時代前でありましたら

上司:「俺は、やんごとない用事で休む!休みの間、代理を頼む!お前を信じてる!」(熱い目)
….部下の手に力強くハンコを手渡す….
部下:「は!はいっ!」(感動の目うるうる)

等という上司と部下とのアツいトークが展開されていたことでしょう。(今でもあるんだろうか…)
社内規定上もさることながら、(代理)承認の責任の所在も心配されます。
今時は、紛れもなくアウトな事案でございます。

◆ 実現方法概要

様々な業務で「承認」作業を行う担当者 を Questetra の組織/ロールで実現していることを前提にします。
(そもそも、ユーザ指定で承認者を指定しているのであれば考慮する必要ありませんね)

要は、

1.(代理を依頼する)承認者の所属する組織やロールに代理承認者を所属させる
2.所属するのは指定された期間のみとし、期間がすぎれば元の所属に戻す

が実現できれば良いのです。
<実現イメージ>

1.(代理を依頼する)承認者の所属する組織やロールに代理承認者を所属させる

については、

* ソフト開発API: システム設定APIs > メンバーシップ設定 API
* ソフト開発API: システム設定APIs > ロールメンバー設定 API

を使用することで可能です。
少しやっかいなのは、「自分の所属する組織やロールを選択する必要がある」ことです。
API + (ブラウザ側)JavaScript にて実現を図ります。

2.所属するのは指定された期間のみとし、期間がすぎれば元の所属に戻す

については、1.の API に加えて実行タイミングを図る手段としてタイマ中間イベントを使用します。

御託はいらん!モノを見せい!」という方には、Questetra にインポート可能なアーカイブファイルをダウンロードして確認して見て下さい。
代理承認申請-ブログ_ver_editing.qar

(ZIP ファイルを解凍して使用して下さい。)

◆具体的な実現

◆◆フロー図

<業務フロー図> 

上記のように

1.「申請〜承認工程」ブロック
2.「開始時自動設定」ブロック
3.「終了時自動設定」ブロック

でフローを構成しています。

◆◆ API +(ブラウザ側)JavaScriptを活用した申請工程

「申請」工程では、

* どの組織/ロールを代理承認対象者に割り当てるか?

を行う必要があります。
申請者(代理を依頼する承認者)の所属組織/ロールを取得し、選択させることで実現します。

表示・選択させる処理を JavaScript + API にて実現をしています。

1.申請を行っているユーザのユーザ ID を取得(/AP/User/Quser/self)
2.1.のユーザ ID のユーザがリーダ属性を保有して所属している組織を取得(/API/User/Membership/listByQuser)
3.2.で取得した情報を元に選択用のチェックボックスの HTML タグを作成
4.1.のユーザ ID のユーザが所属しているロールを取得(/API/User/RoleMembership/listByQuser)
5.4.で取得した情報を元に選択用のチェックボックスの HTML タグを作成

3. と 5. で作成された HTML タグをガイドパネルにセットし、選択を可能にします。

<ブラウザ側JavaScript:対象組織情報/ロール選択>

<font corlor=black><b>代理承認の対象となる権限をチェックしてください。</b></font>

<table border=0><tr>
<td><h4><リード属性を持つ所属する組織リスト></h4></td>
<td><h4><所属するロールリスト></h4></td>
</tr>
<tr>
<td valign="top"><div id="groupList"></div></td>
<td valign="top"><div id="roleList"></div></td>
</tr></table>
<script type="text/javascript">
jQuery(document).ready(function(){
	var id;
	var checkList = "";
	// 申請者自身の情報を取得
	jQuery.ajaxSetup({ async: false });
	jQuery.getJSON("/API/User/Quser/self", function(json){
		id = json.quser.id;
	});
	jQuery.ajaxSetup({ async: true });
	// 申請者の所属組織を取得し、チェックボックスの選択肢に設定
	jQuery.ajaxSetup({ async: false });
	var membership;
	jQuery.getJSON("/API/User/Membership/listByQuser?id="+id, function(json){
		for (var i = 0; i < json.memberships.length; i++) {
			membership = json.memberships[i];
			if (membership.role == "_leader"){
				checkList += "<label><input type=\"checkbox\" name=\"selectedGroup\" value=\"" + membership.qgroupId + "\">" + membership.qgroupName + "<\/label><\/br>";
			}
		}
	});
	jQuery.ajaxSetup({ async: true });
	jQuery('div#groupList').html(checkList);
	// 申請者の所属ロールを取得し、チェックボックスの選択肢に設定
	jQuery.ajaxSetup({ async: false });
	var roleCheckList = "";
	var roleMembership;
	jQuery.getJSON("/API/User/RoleMembership/listByQuser?id="+id, function(json){
		for (var i = 0; i < json.roleMemberships.length; i++) {
			roleMembership = json.roleMemberships[i];
			roleCheckList += "<label><input type=\"checkbox\" name=\"selectedRole\" value=\"" + roleMembership.qroleId + "\">" + roleMembership.qroleName + "<\/label><\/br>";
		}
	});
	jQuery.ajaxSetup({ async: true });
	jQuery('div#roleList').html(roleCheckList);
});
</script>

選択された代理承認対象組織/ロールは、工程終了時のボタン押下にてデータ項目にセットされるようにしています。

<ブラウザ側JavaScript:対象組織情報/ロールセット>

<script type="text/javascript">
jQuery(document).ready(function(){
        // 処理完了ボタン押下時に実行できる設定
	var newfunc = 'return taskFinishButtonClick();';  
	jQuery('#submitButton').attr('onclick',newfunc);
});
</script>

<script type="text/javascript">
function taskFinishButtonClick(){
	var checkedGroupList = "";
	var checkedGroupListCount = 0;
	var checkedRoleList = "";
	var checkedRoleListCount = 0;
	jQuery('input[name="selectedGroup"]:checked').each(function(){
		checkedGroupList += jQuery(this).val() + "," + jQuery(this).parent('label').text() + "\n";
		checkedGroupListCount++;
	});
	if (checkedGroupList != ""){
		jQuery('textarea[name="data[6].input"]').val(checkedGroupList);
		jQuery('input[name="data[8].input"]').val(checkedGroupListCount);
	}
	jQuery('input[name="selectedRole"]:checked').each(function(){
		checkedRoleList += jQuery(this).val() + "," + jQuery(this).parent('label').text() + "\n";
		checkedRoleListCount++;
	});
	if (checkedRoleList != ""){
		jQuery('textarea[name="data[7].input"]').val(checkedRoleList);
		jQuery('input[name="data[9].input"]').val(checkedRoleListCount);
	}
	if (checkedGroupListCount == 0 && checkedRoleListCount ==0){
		alert("「リード属性を持つ所属する組織リスト」もしくは\n「所属するロールリスト」のいずれかで\n対象となる権限を1つ以上選択してください。");
		return false;
	}
	return true;
}
</script>

◆◆ スクリプトタスクを用いた組織/ロールの追加/更新処理

申請工程にて入力された

* 代理承認者
* 変更対象組織/ロール群

のチェックを行いつつ、変更情報を作成します。

* 代理承認者が変更対象組織に存在する場合、リーダ属性付与用のフラグ(update)を付ける
* 代理承認者が変更対象組織に存在しない場合、組織へ追加する用のフラグ(insert)を付ける
* 代理承認者が変更対象ロールに存在する場合、更新処理をスキップするフラグ(exist)を付ける
* 代理承認者が変更対象ロールに存在しない場合、ロールへ追加する用のフラグ(insert)を付ける

上記のチェックを行いつつ、組織/ロール変更用の API へ渡す情報を作成します。
<作成された情報リスト例>
* 代理承認対象組織リスト

1,00 本社,insert
8,11 総務課,exist
9,12 経理課,update
10,ユーザレクチャー,insert

* 代理承認対象ロールリスト

1,100万円以上決裁,insert
2,500万円以上決裁,insert

(長くなりますのでコードをダウンロードして参照下さい)
所属状況確認-スクリプトタスク.txt

◆◆ 代理承認者を対象組織/ロールへセット

2.「開始時自動設定」ブロック
3.「終了時自動設定」ブロック

にて、
前節で記載した情報リストにセットされているフラグを用いて対象組織/ロール分、API を切り替えつつ実行します。

<使用する API>
* リーダ属性付与用フラグのある情報の場合、組織所属の情報変更(/API/UGA/Membership/update)
* 組織へ追加する用フラグのある情報の場合、組織へ追加(/API/UGA/Membership/add)
* ロールへ追加する用フラグのある情報の場合、ロールへ追加(/API/UGA/RoleMembership/add)

リストの全ての行を実行すれば完了です。

◆ あとがき

1年以上前にご利用者からの要望により作成したアプリとなります。
本来であれば同様の処理をしているスクリプトタスクはアドオンで実現すると設定や今後の変更も楽になります。

業務プロセス定義で利用可能な自動工程を自作する
“文字数とハッシュ値を取得する” といった処理工程を自動化したい場合、[スクリプト工程]を使ってスクリプトを記述することになります。もし同様の[スクリプト工程]を何か所にも配置する必要があるなら[アドオンXML]としてパッケージ化しておくことを検討します。(Service-Task Addon)

http://www.questetra.com/ja/tour/m4/m416/

「代理承認」という要件は、非常に範囲が広くあります。
ワークフローがシステムでなく、紙で運用されている場合には、書類の入っているタスクトレイを代理承認者に渡すことで実現できてしまいます。
紙での運用をそのまま実現するのであれば、(代理承認を依頼する)承認者に既に割り振られているタスクも渡す必要があるかもしれません。

また、代理承認を必要とするシナリオとして緊急でお休みが決まった場合の「代理承認設定を代理申請」する仕組みが必要かもしれません。

上記、いずれも対応は可能でありますが、今回はここまでにしたいと思います。

2017-12-26

Masato Furukubo の紹介

Questetra, Inc. Sales Department
Masato Furukubo の投稿をすべて表示

あわせて読みたい
50.Questetra Tips の前の記事 イケてる?アンケート管理システムを作ろう!(その2)
50.Questetra Tips の次の記事 zendesk とクラウドワークフローとの連携方法
Masato Furukubo の他の記事 入力画面でデータ項目名を多言語対応させる方法

アーカイブ

 RSS