ネクストセット・組織ワークフロー for Office 365の活用例、テクニック集

のページでは、ワークフロー特有の機能を中心に、よくあるQ&Aを記載してみます!

※以下のページも合わせてご参照ください。
こちらはワークフローではなくJavaScript、jQuery、HTMLなどのよくあるお問い合わせをまとめてあります。
ワークフローのサンプルソースコードはこちら(HTML、JavaScript、jQuery編)

なおワークフローを作成する際に、テンプレートからカスタマイズすると簡単に構築が可能です!  






ひな形HTML編

印鑑領域内に「印」のような文字を表示するには?

印鑑領域内に「印」と表示

<input type="hidden" name="workflow_doc_load_handler" onclick="

// 申請書を示すフォームオブジェクト
var form = arguments[0];

$(form).find('canvas').each(function(){
  var canvas = this;
  if ( ! canvas || ! canvas.getContext ) {
    return;
  }
  var context = canvas.getContext('2d');
  context.font = 'normal 12px \'Gothic Pro\'';
  context.textAlign = 'center';
  context.textBaseline = 'middle';
  context.fillStyle = 'gray';
  context.fillText('印', canvas.width / 2, canvas.height / 2);
});
"/>

複数の項目の情報をつなげてカレンダー予定作成画面を開く方法

複数の項目の情報をつなげてカレンダー予定作成画面を開く方法

日時:<input class="date" name="event_from"> ~ <input class="date" name="event_to"><br/>
題名:<input name="doc_title" /><br/>
場所:<input name="location" /><br/>
項目1:<input name="exp_part1" class="exp_part" /><br/>
項目2:<input name="exp_part2" class="exp_part" /><br/>
項目3:<input name="exp_part3" class="exp_part" /><br/>

内容(HIDDEN):<input name="exp" type="hidden" /><br/>

<img class="add_to_google_calendar" data_fields="title:doc_title;location:location;details:exp;from:event_from;to:event_to" 
 alt="Googleカレンダーに予定を追加" />

<input type="hidden" name="new_workflow_doc_handler" onclick="

var form = arguments[0];

// 予定の内容を作成する関数
var createEventDescription = function(){
  var exp_part1 = SateraitoWF.getFormValue(form, 'exp_part1');
  var exp_part2 = SateraitoWF.getFormValue(form, 'exp_part2');
  var exp_part3 = SateraitoWF.getFormValue(form, 'exp_part3');
  // 隠し項目に内容の文字列をセット
  SateraitoWF.setFormValue(form, 'exp', exp_part1 + '\n' + exp_part2 + '\n' + exp_part3);
};

// 項目1~3が変更された際に、隠し項目(内容)を更新するイベントを登録
$(form).find('.exp_part').change(function(){
  // ↑の関数をコール
  createEventDescription();
});

">






年ベースで通しの発番をする申請書番号を定義する

クラス「apply_no」と「today_date」を用い、年(YYYY)を発番カウンターのキーの一部とすることにより、年ベースでリセットされる連番を使った申請書番号を作成することができます。




年ベースで通しの発番をする申請書番号

稟議番号:<input type="text" name="ringi_no" class="apply_no" num_digits="5"  key_fields="prefix_ringi prefix_year" prefix_fields="prefix_ringi prefix_year" suffix_fields="" start_from="1" readonly>

<!-- 稟議番号の先頭部 -->
<input type="hidden" name="prefix_ringi" value="稟-">

<!-- 稟議番号の先頭部2 -->
<input type="hidden" name="prefix_year" value="">

<!-- 本日の日付を取得するための隠しフィールド -->
<input type="hidden" name="dummy_date" class="today_date nocopy" set_value_only_empty_or_draft >


<input type="hidden" name="new_workflow_doc_before_submit_handler" onclick="

//// 申請の実行直前に実行されるコード

// 申請フォームを取得
var form = arguments[0];

// 本日日付(YYYY-MM-DD形式)を取得
var todayDate = SateraitoWF.getFormValue(form, 'dummy_date');

// 本日日付を「-」で分割
var todayDateSplited = todayDate.split('-');

// 本日日付の年の部分と「-」をつなげたものを、「稟議番号の先頭部2」フィールドにセット
SateraitoWF.setFormValue(form, 'prefix_year', todayDateSplited[0] + '-');

">

この例では日付の年を発番カウンターの一部とすることで年ベースの連番を発番していますが、応用として
申請者の部署名を発番カウンターの一部とすると、申請者の部署名ごとの連番を発番した申請書番号とすることができます。

クラス「apply_no」には色々なオプションがあり、細かな設定が可能になっております。詳しくはマニュアルのひな形本文に指定できるタグリファレンスの「apply_no」の項目をご参照下さい。
※ 再申請/改訂版作成/コピー新規作成の際に番号を引き継ぎたくない場合は、クラス「nocopy」を用いる事ができます。

注意点) 自動採番は、一度番号の発行が始まると番号をリセットすることができません。番号を1から始めるには、採番キーを変更する必要があります。
  テスト的に採番をおこなう場合、必ず採番キーにダミー文字列を入れ、本番で使う採番キーで発番がおこなわれないようにして下さい。



承認ルート編

ラジオボタンの選択によって承認者を変更するには?


ラジオボタンの選択によって承認者を変更するには
ひな形にスクリプトを記載いただく必要がございます。

~参考~

SateraitoWF.addApprover(form, process_number, user_key, user_key_column)
 --> 指定された承認プロセスに承認者を追加します
  ※該当のユーザーが存在しない場合は何も処理しません

□process_number:承認者(回覧者)を追加する承認ステップ番号(1~)
□user_key:ユーザーのメールアドレスあるいは社員番号
□user_key_column:employee_id…user_keyが社員番号の場合に指定(オプション)


ラジオボタンの選択によって承認者を変更 - ひな形HTML


<!-- ■ スクリプト -->
<input type="hidden" name="new_workflow_doc_handler" onclick="
var form = arguments[0];

//ラジオボタンを選択した際のイベント検知
$(form).find('input[name=approver_1]').change(function(){

//選択されたラジオボタンの値からメールアドレスを取得
var approver = SateraitoWF.getFormValue(form, 'approver_1');

//第一承認者をクリアした後、選択したメールアドレスを承認者として登録
SateraitoWF.clearApprovers(form,1);
SateraitoWF.addApprover(form, 1, approver);
});
">


承認者を選択してください<br>
<label><input type="radio" name="approver_1" value="user1@xxxxx.com">ユーザー1</label><br>
<label><input type="radio" name="approver_1" value="user2@xxxxx.com">ユーザー2</label><br>
<label><input type="radio" name="approver_1" value="user3@xxxxx.com">ユーザー3</label><br>
<label><input type="radio" name="approver_1" value="user4@xxxxx.com">ユーザー4</label><br>


※承認者として指定できるのは、ユーザー情報に登録されているメールアドレスとなります。
上記、ユーザーに登録されているメールアドレスに書き換えてお試し下さい。


ラジオボタンの選択によって承認者を変更 - 承認ルート


<table class="detail" width="80%">
<tr>
<td class="detail_name" width="30%">標準化推進部長承認</td>
<td class="detail_value" width="70%">
<input type="text" name="process" number="1" approver="" >
</td>
</tr>
</table>

※このサンプルでは、メールアドレスにて承認者を追加するスクリプトを使用しています。
指定するメールアドレスは、管理画面の「ユーザー情報」に登録されている必要がございますので、
お試しいただく際は、サンプルひな形のメールアドレス部分を書き換えてからお試しください。


承認状況を申請一覧に表示


ワークフローの標準機能では、最終決裁情報は一覧に表示することができますが、それ以外の情報を一覧に表示することができません。
そこで、詳細な承認状況を一覧に表示する方法をご案内します。

~イメージ~


~処理概要~
承認直前にキックされるイベントハンドラ「workflow_doc_before_approve_handler」にて特定の承認者が承認するタイミングで「list_key」の項目に各種情報をセット

承認状況を一覧に表示 - ひな形HTML

<input type="hidden" name="workflow_doc_before_approve_handler" onclick="

  var form = arguments[0];

  // ログインユーザー(承認者、回覧者)情報を取得
  var viewerUserInfo = SateraitoWF.getViewerUserInfo();
  // 現在どのステップの承認フローかを取得
  var current_process_number = SateraitoWF.getCurrentApproveProcessNumber(form);

  // どの承認プロセスまで進んでいるかを一覧表示用の項目(list_key項目)にセット(ここではプロセス名と承認者名をセット)
  var current_process_disp = '';
  if(current_process_number == 1){
    current_process_disp = '課長';
  }else if(current_process_number == 2){
    current_process_disp = '部長';
  }else if(current_process_number == 3){
    current_process_disp = '総務部長';
  }
  
  if(current_process_disp != ''){
      SateraitoWF.setFormValue(form, 'current_process_disp',  current_process_disp);
      SateraitoWF.setFormValue(form, 'current_approver_name',  viewerUserInfo.family_name + ' ' + viewerUserInfo.given_name );
  }

">

<input type="hidden" name="current_process_disp" value=""  list_key="approve_process" class="approver_info" />
<input type="hidden" name="current_approver_name" value=""  list_key="approver_name" class="approver_info" />


~承認ルート設定のポイント~

<input type="text" name="process" number="1" approver="boss_email_1" ok_to_remove ok_to_update_class="approver_info"  >

のように「list_key」項目に対して各承認プロセスに編集権限を与える必要があります。

承認状況を一覧に表示 - 承認ルート

<table class="detail" width="80%">
<tr>
<td class="detail_name" width="30%">課長決裁</td>
<td class="detail_value" width="70%">
<!-- 申請者のユーザー情報の、「承認者1」がセットされます -->
<input type="text" name="process" number="1" approver="boss_email_1" ok_to_remove ok_to_update_class="approver_info"  >
</td>
</tr>
<tr>
<td class="detail_name">部長決裁</td>
<td class="detail_value">
<!-- 申請者のユーザー情報の、「承認者2」がセットされます -->
<input type="text" name="process" number="2" approver="boss_email_2" need_all_approve_to_go_next final_approve ok_to_remove ok_to_remove_process_number="1"   ok_to_update_class="approver_info" >
</td>
</tr>
<tr>
<td class="detail_name">総務部長回覧</td>
<td class="detail_value">
<!-- メールアドレス「soumu_bucho@example.com」を持ったユーザーが指定されます。 -->
<input type="text" name="process" number="3" approver="email:soumu_bucho@example.com" need_all_approve_to_go_next approve_type="look" ok_to_remove ok_to_remove_process_number="1 2" ok_to_update_class="approver_info"  >
</td>
</tr>
</table>


□一覧表示項目のカスタマイズ

「list_key」を指定した項目を一覧に出すように設定します。
 参考URL:
 ・申請一覧追加項目設定

  




承認者に特定のメンバーが入っているかをチェック


金額などの入力条件によって、承認者に特定のメンバーが含まれているかなどの詳細なチェックを行うサンプルです。
ここでは、
金額設定が5000~99999円の場合、 承認ルート1~3に承認者「approver1@yourdomain.com」が設定されていて、
かつ最終承認者に「approver2@yourdomain.com」が設定されている場合のみ申請可能、というシナリオでチェックしたいと思います。

承認者に特定のメンバーが入っているかをチェック

<!-- ■ 申請書を申請する際のハンドラ -->
<input type="hidden" name="new_workflow_doc_handler" onclick="
var form = arguments[0];

//申請時「申請する」ボタンをクリックしたときにコールされるハンドラ
SateraitoWF.registerWFHandler(form, 'onFormValidate', function(action_type){

// 承認者のチェックを行う ~チェック内容~
// ◆金額設定が5000~99999円の場合、 承認ルート1~3に承認者「approver1@yourdomain.com」が設定されていて、
// かつ最終承認者に「approver2@yourdomain.com」が設定されている場合のみ申請可能

//必須承認者のメールアドレス
var strRequiredApprover1 = 'approver1@yourdomain.com';
var strRequiredApprover2 = 'approver2@yourdomain.com';

//チェックする承認ルートの最小値/最大値を設定(例:process=1~3をチェック)
var min_process = 1;
var max_process = 3;

// 金額欄「amount」に入力された数値を取得
var intAmount = parseInt(SateraitoWF.removeComma(SateraitoWF.getFormValue(form, 'amount')), 10);
Sateraito.Util.console(intAmount);
// 金額が5千円以上、10万円未満の場合
if (intAmount >= 5000 && intAmount < 100000) {
var isExist1 = false;
var isExist2 = false;
// 承認ルート1~3のいずれかに「approver1@yourdomain.com」が含まれているかチェック
for (var i = min_process; i<=max_process; i++) {
// 承認ルートに設定されている承認者を取得
var approvers = SateraitoWF.getApprovers(form, i);
// 「approver1@yourdomain.com」が含まれているかをチェック
if($.inArray(strRequiredApprover1, approvers) >= 0) {
isExist1 = true;
break; // 含まれていたらこれ以降のチェックは不要なのでループを抜ける
}
}
// 最終承認プロセスに「approver2@yourdomain.com」が含まれているかをチェック
var final_approvers = SateraitoWF.getApprovers(form, max_process);
if($.inArray(strRequiredApprover2, final_approvers) >= 0) {
isExist2 = true;
}
// 必須承認者が検知できない場合は警告を出して申請を中断
if(!isExist1 || !isExist2)
{
SateraitoWF.alert('必須承認者を追加してください');
return false;
}
}
// 申請処理を実行します
return true;
});
">

<table class="detail" width="80%">
<tr>
<td class="detail_name" width="20%">金額</td>
<td class="detail_value" colspan="3"><input type="text" class="mandatory number" mandatory_msg="金額を入力してください" name="amount">&nbsp;円</td>
</tr>
</table>


フォーム上に入力された社員番号から氏名などを補完しつつ、同時に承認者としても設定する


公開関数「SateraitoWF.getUser」を使うことで、メールアドレスあるいは社員番号からユーザー情報を取得できます。
また、「SateraitoWF.addApprover」、「SateraitoWF.removeApprover」、「SateraitoWF.clearApprovers」を使うことで
指定した承認プロセスに対して、承認者(回覧者)の追加、削除、ができます。

 
以下に、入力された社員番号から氏名や部署を自動セットしつつ、承認者としても追加するサンプルを示します。

フォーム上に入力された社員番号から氏名などを補完しつつ、同時に承認者としても設定する

<input type="hidden" name="new_workflow_doc_handler" onclick="

 
var form = arguments[0];

 
// 社員番号変更ハンドラ
$(form).find('input.syain_num').change(function(){
// 名称などを自動セット
var element = this;
var idx = $(element).attr('name').replace('syain_num_', '');
var target_syain_num = SateraitoWF.getFormValue(form, 'syain_num_' + idx);
var is_exist_user = false;
if(target_syain_num != ''){
var target_user = SateraitoWF.getUser(form, target_syain_num, 'employee_id');
if(target_user != null){
SateraitoWF.setFormValue(form, 'sankasha_name_' + idx, target_user.family_name + ' ' + target_user.given_name);
SateraitoWF.setFormValue(form, 'busho_' + idx, target_user.department_1);
SateraitoWF.setFormValue(form, 'ka_' + idx, target_user.department_2);
is_exist_user = true;
}
}
if(!is_exist_user){
SateraitoWF.setFormValue(form, 'sankasha_name_' + idx, '');
SateraitoWF.setFormValue(form, 'busho_' + idx, '');
SateraitoWF.setFormValue(form, 'ka_' + idx, '');
}

 
// 承認者自動セット
// まず全承認者をクリア
SateraitoWF.clearApprovers(form, 1);
// 参加者をループして全員承認者として追加
for(var i = 1; i <= 10; i++){
var syain_num = SateraitoWF.getFormValue(form, 'syain_num_' + i);
// 承認者を自動セット(process_number=1の回覧者)
if(syain_num != ''){
SateraitoWF.addApprover(form, 1, syain_num, 'employee_id');
}
}
});
">

 
<table class="detail" style="width:99%">
<tr>
<td class="detail_name" nowrap>社員番号</td>
<td class="detail_name" nowrap>氏名</td>
<td class="detail_name" nowrap>部署</td>
<td class="detail_name" nowrap>課</td>
</tr>
<tr>
<td style="width:10%;"><input type="text" class="syain_num" size="9" name="syain_num_1" ></td>
<td style="width:17%;"><input type="text" class="" size="15" name="sankasha_name_1" ></td>
<td style="width:15%;"><input type="text" class="" size="15" name="busho_1"></td>
<td style="width:20%;"><input type="text" class="" size="19" name="ka_1"></td>
</tr>
<tr>
<td style="width:10%;"><input type="text" class="syain_num" size="9" name="syain_num_2" ></td>
<td style="width:17%;"><input type="text" class="" size="15" name="sankasha_name_2" ></td>
<td style="width:15%;"><input type="text" class="" size="15" name="busho_2"></td>
<td style="width:20%;"><input type="text" class="" size="19" name="ka_2"></td>
</tr>
</table>


 
・社員番号を入力
 ⇒氏名、部署、課が自動セット
 ⇒「参加者」が自動セット

 ↓↓↓↓↓↓↓↓
 
                               
 
・もう一人追加


 
・社員番号を消す…
 ⇒氏名、部署、課がクリア
 ⇒参加者からも削除


申請書新規作成時に申請者の情報によって承認ルートを切り替える


 申請者の情報などによって承認ルートを自動で切り替えることができます。
 以下は申請書の新規作成フォームを開いた際に、申請者の「役職」によって承認ルートを切り替えるサンプルです。
 ※一連の流れの中で複数回「selectRoute」をコールしてはいけませんのでご注意ください。​

申請書新規作成時に申請者の情報によって承認ルートを切り替える

<input type="hidden" name="new_workflow_doc_handler" onclick="

 
  // 申請書を指すフォームオブジェクトを取得
  var form = arguments[0];

 
  // 承認ルート選択ボックスを非表示に設定(表示したままでもOK)
  SateraitoWF.hideRouteSelection(form);

 
  // 申請者のユーザー情報を取得
  var authorUserInfo = SateraitoWF.getSubmitterUserInfo(form );

 
  // 申請者のユーザー情報より「部署名1」「部署名2」「部署名3」「部署名4」「部署名5」「役職」を取得
  var busho_name_1 = authorUserInfo.department_1;
  var busho_name_2 = authorUserInfo.department_2;
  var busho_name_3 = authorUserInfo.department_3;
  var busho_name_4 = authorUserInfo.department_4;
  var busho_name_5 = authorUserInfo.department_5;
  var job_title = authorUserInfo.job_title;

 
  // 部長なら承認ルート2をセット
  if(job_title == '部長') {
    SateraitoWF.selectRoute(form, 2);
  // 部長以外なら承認ルート1をセット
  }else{
    SateraitoWF.selectRoute(form, 1);
  }

 
">


下書保存を開いた際に最新の定義で承認候補者を上書きする


ひな形管理にて
・「下書き保存」を開くときに最新のひな形設定を使用して決裁ルートを再構築する」
にチェックを入れると、下書き保存された文書を開くタイミングで常に最新の定義に基づいて承認候補者を更新します。
※古い組織構成による承認者を使わせたくない場合に便利です。


 
承認ルートHTMLのプロセス単位にて、「draft_with_approvers」というオプションを指定することで
指定プロセスのみ上書きしない(下書き時の承認候補者をそのまま表示)させることも可能です。

<!-- ■ 回覧 選択 -->
<tr>
<td class="detail_name" width="30%">回覧</td>
<td class="detail_value" width="70%">
<input type="text" name="process" number="4" approver="" approve_type="look" ok_to_remove draft_with_approvers>
<input type="button" class="user_select_button" process_number="4" value="ユーザー追加">
</td>
</tr>


 
 




マスター編

マスターから情報を取得して各ボックスにセット(同期処理版)

ここでは、事業部マスターを例に、事業部コードを直接入力して検索する機能と、マスター選択ウインドウを開いて検索してセットの両方の機能を実現してみます。

~イメージ~



~処理概要~

・「preload_master_codes_on_new_doc」にてマスターを事前読み込み
・事業部コード「jigyobu_code」の値変更時にマスター検索する処理を実装
・マスター選択ウインドウを表示するボタンをクラス「sateraito_master_select」で配置

このサンプルは、参照用マスターデータとして「jigyobu_master」が必要になります。

マスターから値を取得して情報をセット - ひな形HTML

<!-- マスター情報を事前取得する設定 -->
<input type="hidden" name="workflow_template_setting" preload_master_codes_on_new_doc="jigyobu_master">

<!-- 申請書を開いたときに実行されるJavascript -->
<input type="hidden" name="new_workflow_doc_handler" onclick="
var form = arguments[0];
// 事業部コードが変更になった時のイベントハンドラ
$(form).find('input[name=jigyobu_code]').change(function(){
  // 入力された事業部コードを取得
  var jigyobuCode = SateraitoWF.getFormValue(form, 'jigyobu_code');
  // 事業部マスターを取得
  var jigyobuMaster = SateraitoWF.getMasterData('jigyobu_master');
  var is_hit = false;
  // 事業部マスターデータを一件ずつループして該当データを処理
  $.each(jigyobuMaster, function(){
    var row = this;
    // 入力したコードに一致するデータがあったら
    if (row.data_key == jigyobuCode) {
      // 各ボックスに値をセット
      SateraitoWF.setFormValue(form, 'jigyobu_name', row.attribute_1);
      SateraitoWF.setFormValue(form, 'jigyobu_address', row.attribute_2);
      is_hit = true;
      return;  // これ以降のマスターはチェック不要なのでループを抜ける
    }
  });
  // 該当の事業所データが見つからなければ、各ボックスの値をクリア
  if(!is_hit){
    SateraitoWF.setFormValue(form, 'jigyobu_name', '');
    SateraitoWF.setFormValue(form, 'jigyobu_address', '');
  }
});

">

<table class="detail" width="80%">
<tr>
<td class="detail_name" width="20%">事業部コード</td>
<td class="detail_value" width="30%" >
<input type="text" name="jigyobu_code" size="10" >
&nbsp;
<input type="button" class="sateraito_master_select" master_code="jigyobu_master" assign="data_key:jigyobu_code;attribute_1:jigyobu_name;attribute_2:jigyobu_address;" col_width="data_key:80;attribute_1:80;attribute_2:100" window_width="300" value="事業部選択"><br>
</td>
<td class="detail_name" width="20%">事業部名</td>
<td class="detail_value" width="30%" ><input name="jigyobu_name"></td>
</tr>
<tr>
<td class="detail_name" width="20%">住所</td>
<td class="detail_value" width="80%" colspan="3"><input name="jigyobu_address"></td>
</tr>
</table>


~応用ポイント~

・マスターの件数が多い場合は、「preload_master_codes_on_new_doc」にて事前読み込みが難しい場合があります。
この場合は、「SateraitoWF.requestMasterDataRow」という公開JavaScript関数を使ってその場で一件読み込む方法が便利です。

入力内容をもとにマスターの値を更新する

公開関数「SateraitoWF.appendUpdateMasterData」を使うことで、マスターのレコードの値を更新することができます。
以下に、申請された金額に基づいて、予算マスターを更新するサンプルを示します。

 
 
□予算マスター「budget_master」
 …data_key:ユーザ所属部署コード
 …attribute_1:申請金額
 …attribute_2:決裁金額

 
□処理概要
 …申請時:申請金額に加算
 …決裁時:決裁金額に加算
 …否決時:申請金額から減算

金額を予算マスターに反映する

<!-- ■ 予算マスタープリロード処理 -->
<input type="hidden" name="workflow_template_setting" preload_master_codes_on_new_doc="budget_master" preload_master_codes_on_existing_doc="budget_master" >

 
<!-- ■ スクリプト_申請直前処理 -->
<input type="hidden" name="new_workflow_doc_before_submit_handler" onclick="

 
var form = arguments[0];
///////////////////////////////////////////
// 申請者の部署の予算を加減算する
// 申請者の部署を取得
var author_department_id = SateraitoWF.getFormValue(form, 'department_id');
// 予算マスター取得
var aBudgetMaster = SateraitoWF.getMasterData('budget_master');
Ext.each(aBudgetMaster, function(){
var row = this;
// 申請者の所属部署に関して処理(予算マスターのキーが部署コードであるイメージ)
if(row.data_key == author_department_id){
// マスターレコードの属性1に「kessai_price」項目の値を加算
var attribute_id = 'attribute_1';
var update_data = {};
update_data[attribute_id] = 'kessai_price';
var update_option = {};
update_option[attribute_id] = ['sum', 'input_name']; // sum…加算 input_name…値ではなく項目名指定であることを示す
var target_approve_type = 'submit'; // submit…申請時の処理であることを示す
var is_overwrite = false;
SateraitoWF.appendUpdateMasterData(form, row.master_code, row.data_key, target_approve_type, update_data, update_option, is_overwrite);
return;
}
});
">

 
<!-- ■ スクリプト_承認直前処理 -->
<input type="hidden" name="workflow_doc_before_approve_handler" onclick="

 
var form = arguments[0];
///////////////////////////////////////////
// 申請者の部署の予算を加減算する
// 申請者の部署を取得
var author_department_id = SateraitoWF.getFormValue(form, 'department_id');

 
// 予算マスター取得
var aBudgetMaster = SateraitoWF.getMasterData('budget_master');
Ext.each(aBudgetMaster, function(){
var row = this;
// 申請者の所属部署に関して処理
if(row.data_key == author_department_id){
var attribute_id = 'attribute_2';
var update_data = {};
update_data[attribute_id] = 'kessai_price'; // 項目名指定
var update_option = {};
update_option[attribute_id] = ['sum', 'input_name']; // sum…加算 input_name…値ではなく項目名指定
var target_approve_type = 'final_approve'; // 通常の承認ではなく決裁時のみ処理することを示す
var is_overwrite = true; // true…同レコードに対する処理を最後の1つだけ実施する指定(target_approve_typeごと)(複数回加減算されないように) 
SateraitoWF.appendUpdateMasterData(form, row.master_code, row.data_key, target_approve_type, update_data, update_option, is_overwrite);
return;
}
});
">

 
<!-- ■ スクリプト_否決直前処理 -->
<input type="hidden" name="workflow_doc_before_reject_handler" onclick="

 
var form = arguments[0];

 
///////////////////////////////////////////
// 申請者の部署の予算を加減算する
// 申請者の部署を取得
var author_department_id = SateraitoWF.getFormValue(form, 'department_id');

 
// 予算マスター取得
var aBudgetMaster = SateraitoWF.getMasterData('budget_master');
Ext.each(aBudgetMaster, function(){
var row = this;
// 申請者の所属部署に関して処理
if(row.data_key == author_department_id){
var attribute_id = 'attribute_1';
var update_data = {};
update_data[attribute_id] = 'kessai_price'; // 項目名指定
var update_option = {};
update_option[attribute_id] = ['diff', 'input_name']; // diff…減算 (決裁時の追加だけ反映されるように) input_name…値ではなく項目名指定
var target_approve_type = 'reject'; // 否決時に処理することを示す
SateraitoWF.appendUpdateMasterData(form, row.master_code, row.data_key, target_approve_type, update_data, update_option);
return;
}

 
});
">

 
<table class="detail" style="width:100%">
<tr>
<td class="detail_name" nowrap>申請者所属部署コード</td>
<td class="detail_value" nowrap>
<input type="text" name="department_id" size="7" >
</td>
<td class="detail_name" nowrap>決裁金額</td>
<td class="detail_value" nowrap>
<input type="text" name="kessai_price" class="number" >円
</td>
</tr>
</table>

 


2つのコンボボックスの内容を連動(参照用マスターデータ利用)

参照用マスターデータを利用したコンボボックスを2つ配置し、1つ目のコンボボックスで何が選択されたかにより、
2つ目のコンボボックスの選択肢を入れ替えたい、という場合、jQueryを用いて以下のように記述することができます。

このサンプルは、参照用マスターデータとして「daibunrui_master」、「menu_master」が必要になります。

2つのコンボボックス(参照用マスターデータ利用)を連動させるサンプル

大分類:<select name="daibunrui_code" class="master_list" master_code="daibunrui_master">
<option value="">
</select>

メニュー:<select name="menu_code"></select>


<!-- SateraitoWF.getMasterData使うため、メニューマスターのプリロードおこないます -->
<input type="hidden" name="workflow_template_setting" preload_master_codes_on_new_doc="menu_master">

<!-- 申請書開いたときに実行されるJavascript -->
<input type="hidden" name="new_workflow_doc_handler" onclick="

// 申請書のフォーム取得します
var form = arguments[0];

// 大分類コンボボックスが変更になった時のイベントハンドラ
$(form).find('select[name=daibunrui_code]').change(function(){

  // 大分類コード取得します
  var daibunruiCode = $(this).val();

  // メニューコンボボックスいったん空にします
  var menuComboBox = $(form).find('select[name=menu_code]');
  $(menuComboBox).html('<option value=\'\'>');
  
  // メニューマスタ取得します
  var menuMaster = SateraitoWF.getMasterData('menu_master');

  // メニューマスターのデータ1件づつコンボボックスに追加します
  $.each(menuMaster, function(){
    var row = this;
    if (row.attribute_1 == daibunruiCode) {
      var optionHtml = '<option value=\'' + row.data_key + '\'>' + row.attribute_2 + '</option>';
      $(menuComboBox).append(optionHtml);
    }
  })

});


">


参照マスター1「大分類マスター」)

参照マスター2「メニューマスター」)


(申請書画面で、大分類に「和食」選択したところ)

(申請書画面で、大分類に「中華」選択したところ)





その他

各ハンドラで実行する共通の処理の書き方

ワークフローでは、新規申請を開いた時用ハンドラ「new_workflow_doc_handler」、既存申請書を開いた時用のハンドラ「existing_workflow_doc_load_handler」など、いろいろなハンドラがありますが
それらのハンドラで共通の処理を一箇所に記述する方法です。

共通処理を一箇所で記述する方法

<!-- 新規申請を開いた際の処理 -->
<input type="hidden" name="new_workflow_doc_handler" onclick="

var form = arguments[0];

var shared_function = $(form).find('input[type=hidden][name=shared_function]');
shared_function[0].onclick('new', 'doc');
">

<!-- 既存申請書を開いた際の処理 -->
<input type="hidden" name="existing_workflow_doc_load_handler" onclick="

var form = arguments[0];

var shared_function = $(form).find('input[type=hidden][name=shared_function]');
shared_function[0].onclick('existing', 'doc');
">

<!-- 共通処理用関数 -->
<input type="hidden" name="shared_function" class="do_not_save" onclick="

  var form = SateraitoWF.getForm(); // フォームオブジェクトの取得

  var param1 = arguments[0]; // 関数の引数は「arguments」配列から取得できます
  var param2 = arguments[1];

  SateraitoWF.alert(param1 + ' ' + param2);

" />


OWAのメール作成画面を開いて件名、本文、宛先をセットする方法

ワークフローでは、任意の宛先に自由にメールを送信する機能はありません。
そこでここでは、OWAの新規作成画面を開いて、件名、本文、宛先をセットする方法をご紹介します。
※OWAの機能を使用していますので、セットできる文字数など、細かい動作はOWA側の動作に準拠します。

OWAのメール作成画面を開いて件名、本文、宛先をセットする方法

<input type="hidden" style="width:100%" name="new_workflow_doc_handler" onclick="

var form = arguments[0];
var submitterInfo = SateraitoWF.getSubmitterUserInfo(form);

$(form).find('.sendmail').click(function(){

var subject = '【申請内容確認】交通費申請';

var body_text = submitterInfo.family_name + ' ' + submitterInfo.given_name + ' 様\n\n';
body_text += '申請内容を再度確認してください。\nよろしくお願いします。';

var to = submitterInfo.email;

var url = 'https://outlook.office365.com/owa/?realm=outlook.jp&path=/mail/action/compose&ispopout=1&subject=' + escape(subject) + '&body=' + escape(body_text) + '&to=' + escape(to);

window.open(url);

});

"/>

<input type="button" value="申請者に内容確認メールを送信" class="sendmail" />







Comments