/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：ZMW11201SFLogic
*   ソースファイル名：ZMW11201SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年03月25日
*＜機能概要＞
*   ログイン画面の画面制御を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00       2011/03/25   FJ) 宮前    新規作成
*	v3.00		2012/04/06   FJ) 宮前    【SGY-2012-000006】統合認証対応
*	v3.00		2012/04/06   FJ) 宮前    【ANK-0025-00-00】ギガルータ対応
*	v3.01		2012/06/11   FJ) 宮前    【ANK-0023-00-00】CTI対応 マージ
*	v3.02		2012/08/09   FJ) 宮前    【ST1-2012-0000286】Claris連携 不具合対応
*
**********************************************************************/

package eo.web.webview.ZMW11201SF;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.ZMW06901SF.ZMW06901SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCRWebCommon;
import eo.web.webview.common.JZMScreenConst;
import eo.web.webview.common.JZMWebCommon;
import eo.web.webview.mapping.ZMSV0001_ZMSV0001OPDBMapper;
import eo.web.webview.mapping.ZMSV0003_ZMSV0003OPDBMapper;
import eo.web.webview.mapping.ZMSV0004_ZMSV0004OPDBMapper;
import eo.web.webview.mapping.ZMSV0089_ZMSV0089OPDBMapper;

import com.fujitsu.futurity.web.x31.X31CHashMap;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

/**
 * <dd>クラス名：ログイン画面 Viewロジック
 * <dd>クラス説明：ログイン画面のViewロジック。
 * <dd>備考：
 * @version  1.0 2011/05/21
 * @author   FJ
 */
public class ZMW11201SFLogic extends JCCWebBusinessLogic 
{
	
	/** 統合認証システム連携部品からサービスフォームBeanへ設定する際に必要な項目名リスト */
	private static final String[][] KEY_LIST_FOR_LDAP_RESULT =
	{
			// リスト名,組織コード項目名,立場コード項目名,上位組織コード項目名
			{ZMW11201SFConst.ORG_LIST, ZMW11201SFConst.ORG_CD_01, ZMW11201SFConst.POSITION_CD_01, ""}, 
			{ZMW11201SFConst.WKKBT_ORG_LIST, ZMW11201SFConst.WKKBT_ORG_CD_02, ZMW11201SFConst.WKKBT_POSITION_CD_02, 
				ZMW11201SFConst.WKORG_CD_02}, 
			{ZMW11201SFConst.CHUKAN_ORG_LIST, ZMW11201SFConst.CHUKAN_ORG_CD_03, ZMW11201SFConst.CHUKAN_POSITION_CD_03, 
					ZMW11201SFConst.CHUKAN_JOI_ORG_CD_03}, 
			{ZMW11201SFConst.SPA_ORG_LIST, ZMW11201SFConst.SPA_ORG_CD_04, ZMW11201SFConst.SPA_POSITION_CD_04, ""}
	};
	
	/** 実組織 Key項目一覧 */
	private static final String[] KEY_ORG_LIST = 
	{
		ZMW11201SFConst.ORG_CD_01,
		ZMW11201SFConst.ORG_NM_01,
		ZMW11201SFConst.POSITION_CD_01,
		ZMW11201SFConst.POSITION_NM_01,
		ZMW11201SFConst.KGGRP_CD_01,
		ZMW11201SFConst.AUTHORITY_GRP_NM_01
	};
	
	/** 業務個別設定組織 Key項目一覧 */
	private static final String[] KEY_WKKBT_ORG_LIST = 
	{
		ZMW11201SFConst.WKORG_CD_02,
		ZMW11201SFConst.WKKBT_ORG_CD_02,
		ZMW11201SFConst.WKKBT_ORG_NM_02,
		ZMW11201SFConst.WKKBT_POSITION_CD_02,
		ZMW11201SFConst.WKKBT_POSITION_NM_02,
		ZMW11201SFConst.WKKBT_KGGRP_CD_02,
		ZMW11201SFConst.WKKBT_AUTHORITY_GRP_NM_02
	};
	
	/** 中間組織 Key項目一覧 */
	private static final String[] KEY_CHUKAN_ORG_LIST = 
	{
		ZMW11201SFConst.CHUKAN_JOI_ORG_CD_03,
		ZMW11201SFConst.CHUKAN_ORG_CD_03,
		ZMW11201SFConst.CHUKAN_ORG_NM_03,
		ZMW11201SFConst.CHUKAN_POSITION_CD_03,
		ZMW11201SFConst.CHUKAN_POSITION_NM_03,
		ZMW11201SFConst.CHUKAN_KGGRP_CD_03,
		ZMW11201SFConst.CHUKAN_AUTHORITY_GRP_NM_03
	};
	
	/** 特別権限組織 Key項目一覧 */
	private static final String[] KEY_SPA_ORG_LIST = 
	{
		ZMW11201SFConst.SPA_ORG_CD_04,
		ZMW11201SFConst.SPA_ORG_NM_04,
		ZMW11201SFConst.SPA_POSITION_CD_04,
		ZMW11201SFConst.SPA_POSITION_NM_04,
		ZMW11201SFConst.SPA_KGGRP_CD_04,
		ZMW11201SFConst.SPA_KGGRP_NM_04
	};
	
	/** 実組織 Key項目一覧（共有フォームBean設定用） */
	private static final String[][] KEY_ORG_LIST_FOR_CF = 
	{
		{CommonInfoCFConst.ORG_CD_01, ZMW11201SFConst.ORG_CD_01},
		{CommonInfoCFConst.ORG_NM_01, ZMW11201SFConst.ORG_NM_01},
		{CommonInfoCFConst.POSITION_CD_01, ZMW11201SFConst.POSITION_CD_01},
		{CommonInfoCFConst.POSITION_NM_01, ZMW11201SFConst.POSITION_NM_01},
		{CommonInfoCFConst.KGGRP_CD_01, ZMW11201SFConst.KGGRP_CD_01},
		{CommonInfoCFConst.KGGRP_NM_01, ZMW11201SFConst.AUTHORITY_GRP_NM_01}
	};
	
	/** 業務個別設定組織 Key項目一覧（共有フォームBean設定用） */
	private static final String[][] KEY_WKKBT_ORG_LIST_FOR_CF =
	{
		{CommonInfoCFConst.ORG_CD_01, ZMW11201SFConst.WKKBT_ORG_CD_02},
		{CommonInfoCFConst.ORG_NM_01, ZMW11201SFConst.WKKBT_ORG_NM_02},
		{CommonInfoCFConst.POSITION_CD_01, ZMW11201SFConst.WKKBT_POSITION_CD_02},
		{CommonInfoCFConst.POSITION_NM_01, ZMW11201SFConst.WKKBT_POSITION_NM_02},
		{CommonInfoCFConst.KGGRP_CD_01, ZMW11201SFConst.WKKBT_KGGRP_CD_02},
		{CommonInfoCFConst.KGGRP_NM_01, ZMW11201SFConst.WKKBT_AUTHORITY_GRP_NM_02}
	};
	
	/** 中間組織 Key項目一覧（共有フォームBean設定用） */
	private static final String[][] KEY_CHUKAN_ORG_LIST_FOR_CF =
	{
		{CommonInfoCFConst.ORG_CD_01, ZMW11201SFConst.CHUKAN_ORG_CD_03},
		{CommonInfoCFConst.ORG_NM_01, ZMW11201SFConst.CHUKAN_ORG_NM_03},
		{CommonInfoCFConst.POSITION_CD_01, ZMW11201SFConst.CHUKAN_POSITION_CD_03},
		{CommonInfoCFConst.POSITION_NM_01, ZMW11201SFConst.CHUKAN_POSITION_NM_03},
		{CommonInfoCFConst.KGGRP_CD_01, ZMW11201SFConst.CHUKAN_KGGRP_CD_03},
		{CommonInfoCFConst.KGGRP_NM_01, ZMW11201SFConst.CHUKAN_AUTHORITY_GRP_NM_03}
	};
	
	/** 特別権限組織 Key項目一覧（共有フォームBean設定用） */
	private static final String[][] KEY_SPA_ORG_LIST_FOR_CF =
	{
		{CommonInfoCFConst.ORG_CD_01, ZMW11201SFConst.SPA_ORG_CD_04},
		{CommonInfoCFConst.ORG_NM_01, ZMW11201SFConst.SPA_ORG_NM_04},
		{CommonInfoCFConst.POSITION_CD_01, ZMW11201SFConst.SPA_POSITION_CD_04},
		{CommonInfoCFConst.POSITION_NM_01, ZMW11201SFConst.SPA_POSITION_NM_04},
		{CommonInfoCFConst.KGGRP_CD_01, ZMW11201SFConst.SPA_KGGRP_CD_04},
		{CommonInfoCFConst.KGGRP_NM_01, ZMW11201SFConst.SPA_KGGRP_NM_04}
	};
	
	/** 外部連携用 貸与品確認 KEY 認証状態 */
	private static final String KEY_NINSHO_STAT = "ninsho_stat";
	
	/** 外部連携用 KEY 初期パスワードフラグ */
	private static final String KEY_SHK_PASSWORD = "shk_password_flg";
	
	/** 外部連携用 初期パスワード NG */
	private static final String SHOKI_PASSWORD_NG = "1";
	
	/** 外部連携用 ワンタイムパスワード 認証 NG */
	private static final String NINSHO_NG = "1";
	
	/** 外部連携用 リクエストパラメータKey（引継ぎ不要なパラメータ） */
	private static final String KEY_NON_HKTGI_KMK = "ZM_NON_HKTGI_KMK";
	
	/** 外部連携用 リクエストパラメータKey（引継ぎ不要なパラメータ） 区切り文字 */
	private static final String KEY_NON_HKTGI_KMK_DELMI = ";";
	
	/** 外部連携用 アプリケーションプロパティ */
	private static final String KEY_TSYRN_KENMU = "ZM_TSYRN_KENMU";
	
	/** 外部連携用 アプリケーションプロパティZM_TSYRN_KENMU 区切り文字 */
	private static final String SYS_ID_DELMI = ";";
	
	/** 外部連携用 リクエストパラメータ Key：ワンタイムパスワード */
	private static final String KEY_ONETIME_PWD = "oneTimePwd";
	
	/** 外部連携用 リクエストパラメータ Key：画面ID */
	private static final String KEY_SCREEN_ID = "screenId";
	
	/** 外部連携用 リクエストパラメータ Key：ePOP引継キー情報 */
	private static final String KEY_KEY_INFO = "epop_tenso_rnki_key";
	
	/** 外部連携用 リクエストパラメータ Key：起動画面ID */
	private static final String KEY_GMNID = "gmnid";
	
	/** 外部連携用 兼務判定 要・否：要 */
	private static final String KENMU_HANTEI_ARI = "1";
	
	/** 外部連携用 兼務判定 要・否：否 */
	private static final String KENMU_HANTEI_NASHI = "0";
	
	/** 外部連携用 メニューへ渡す画面ID */
	private static final String KEY_NEXT_SCREEN_ID = "SCREEN_ID";
	
	/** 兼務フラグ */
	private static final String KENMU_FLG_ARI = "1";
	
	/** 兼務フラグ */
	private static final String KENMU_FLG_NASHI = "0";
	
	/** ステータス（ログイン認証エラー） */
	private static final String STATUS_LOGIN_FAILURE = "0";
	
	/** ステータス（二重ログインチェック） */
	private static final String STATUS_DLOGIN_CHK = "2";
	
	/** 兼務チェック */
	private static final String STATUS_KENMU_CHK = "3";
	
	/** 兼務判定後 */
	private static final String STATUS_FIN = "4";
	
	/** サービス ZMSV0001 */
	private static final String USECASE_ID_0001 = "ZMSV0001";
	
	/** サービス ZMSV0003 */
	private static final String USECASE_ID_0003 = "ZMSV0003";
	
	/** サービス ZMSV0004 */
	private static final String USECASE_ID_0004 = "ZMSV0004";
	
	/** サービス ZMSV0089 */
	private static final String USECASE_ID_0089 = "ZMSV0089";
	
	/** KEY 統合認証 実組織 兼務一覧 */
	private static final String KEY_AUTH_ORG_LIST = "ECCTGN00001CBSMsg1List";
	
	/** KEY 統合認証 ワークグループ 一覧 */
	private static final String KEY_AUTH_WKGRP_LIST = "ECCTGN00001CBSMsg2List";
	
	/** KEY 統合認証 中間組織 一覧 */
	private static final String KEY_AUTH_CHUKAN_GRP_LIST = "ECCTGN00001CBSMsg3List";
	
	/** KEY 統合認証 特別権限組織 一覧 */
	private static final String KEY_AUTH_SPCL_GRP_LIST =  "ECCTGN00001CBSMsg4List";
	
	/** アプリケーションプロパティ KEY 特別権限組織 SPRi */
	private static final String KEY_PROP_SPCL_SPRI = "ZM_SPCL_AUTHORITY_ORG_FOR_SPRI";
	
	/** 区切り文字 */
	private static final String DELIM = ";";
	
	/** KEY 特別権限組織コード */
	private static final String KEY_SPCL_ORG_CD = "spcl_org_cd";
	
	/** ログインフラグ ログアウト */
	private static final String LOGIN_FLG_OFF = "0";
	
	/**
	 * ログイン画面　初期表示処理
	 * @return boolean
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{
		
		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		X31SDataBeanAccess svBean = getServiceFormBean();
		
		// ログインフラグ
		svBean.sendMessageString(ZMW11201SFConst.LOGIN_FLG, X31CWebConst.DATABEAN_SET_VALUE, LOGIN_FLG_OFF);
		
		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		X31SDataBeanAccess[] beans = {svBean};
		
		// ユースケースID格納用マップ
		HashMap<Object, String> paramMap = new HashMap<Object, String>();
		
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_0003);
		
		// マッピング用Map
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// マッピングクラス
		ZMSV0003_ZMSV0003OPDBMapper mapper = new ZMSV0003_ZMSV0003OPDBMapper();
		mapper.setZMSV000301SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		mapper.setZMSV000302SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		mapper.setZMSV000303SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, inMap, outputMap);
		
		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		// サービスの処理結果を取得する。
		mapper.getZMSV000301SC(beans, outputMap);
		mapper.getZMSV000302SC(beans, outputMap);
		mapper.getZMSV000303SC(beans, outputMap);
		
		// -------------------------------------------------- //
		// (5)引継情報の設定
		// -------------------------------------------------- //
		// ログイン画面
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6070__I);

		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 共有フォームBean
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		
		// 遷移先画面IDを共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_ID_ZMW11201);
		
		// 遷移先画面名を共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_NAME_ZMW11201);

		return true;
	}
	
	/**
	 * 二重ログイン画面 初期表示処理
	 * @return boolean
	 * @throws Exception
	 */
	public boolean initZMW11202() throws Exception
	{
		
		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (5)引継情報の設定
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (6)メッセージ表示処理
		// -------------------------------------------------- //
		// 二重ログイン画面
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6080__I);
		
		// -------------------------------------------------- //
		// (7)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 共有フォームBean
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		
		// 遷移先画面IDを共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_ID_ZMW11202);
		
		// 遷移先画面名を共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_NAME_ZMW11202);

		return true;
	}
	
	/**
	 * 外部連携画面 初期表示処理
	 * @return boolean
	 * @throws Exception
	 */
	public boolean initZMW11203() throws Exception
	{
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		X31SDataBeanAccess svBean = getServiceFormBean();

		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// (a)アプリケーションプロパティファイル(key=ZM_NON_HKTGI_KMK)から業務画面へ引継ぎ不要なパラメータのKeyを取得する。
		String nonHktgiKmk = JCCWebCommon.getApplicationConst(KEY_NON_HKTGI_KMK);
		String[] nonHktgiKmkArray = nonHktgiKmk.split(KEY_NON_HKTGI_KMK_DELMI);
		
		// (b) (a)で取得したKeyを除くすべてのリクエストパラメータを取得し引き継ぎ情報(DataMap)を作成する。
		// リクエストパラメータ
		X31CHashMap reqParam =  this.getRequestParams();
		
		// 引継ぎ用マップ
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		Iterator it = reqParam.entrySet().iterator();
		while(it.hasNext())
		{
			Map.Entry<String, Object> entry = (Map.Entry<String, Object>)it.next();
			String key = entry.getKey();
			if(!isNonHktgiKmk(key, nonHktgiKmkArray))
			{
				dataMap.put(key, entry.getValue());
			}
		}
		
		// (c)メニュー画面からのワンタイムパスワード認証エラーチェック
		// 画面情報設定部品（JCRWebCommon.getScreenInfo)を使用し、引継情報を取得する。
		JCRWebCommon.getScreenInfo(this);
		
		// 認証状態取得
		String ninshoStat = svBean.sendMessageString(ZMW11201SFConst.NINSHO_STAT, X31CWebConst.DATABEAN_GET_VALUE);
		
		// サービスフォームBean.認証状態が"1"(ワンタイムパスワード認証NG)の場合
		if (NINSHO_NG.equals(ninshoStat))
		{
			
			// @ メッセージID：EKB6040-JW「認証に失敗しました。」のメッセージを表示する
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6040_JW);
			
			// A エラー画面を表示するために、共有フォームBeanを設定する。
			// 遷移先画面IDを共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_ID_ZMW11203);
			
			// 遷移先画面名を共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_NAME_ZMW11203);
			
			// B サービスフォームBean項目の設定。
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_LOGIN_FAILURE);
			
			// C 処理を終了する。
			return true;
		}
		
		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		//  サービスフォームBean項目の設定
		//     ワンタイムパスワード
		svBean.sendMessageString(ZMW11201SFConst.ONETIME_PWD, X31CWebConst.DATABEAN_SET_VALUE, (String)dataMap.get(KEY_ONETIME_PWD));
		
		//    システム日付
		svBean.sendMessageString(ZMW11201SFConst.BASE_YMD, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getSysDate());
		
		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		X31SDataBeanAccess[] beans = {svBean};
		
		// ユースケースID格納用マップ
		HashMap<Object, String> paramMap = new HashMap<Object, String>();
		
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_0089);
		
		// マッピング用Map
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// マッピングクラス
		ZMSV0089_ZMSV0089OPDBMapper mapper = new ZMSV0089_ZMSV0089OPDBMapper();
		mapper.setZMSV008901(beans, inMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, inMap, outputMap);
		
		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		// (a)サービスの処理結果を取得する。
		X31SDataBeanAccess[] outBeans = {svBean, cfBean};
		mapper.getZMSV008901(outBeans, outputMap);
		
		// (b)ワンタイムパスワード認証がNGの場合
		if(NINSHO_NG.equals(svBean.sendMessageString(ZMW11201SFConst.NINSHO_STAT, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			
			//  @メッセージID：EKB6040-JW「認証に失敗しました。」のメッセージを表示する
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6040_JW);
			
			//  Aエラー画面を表示するために、画面IDを以下の項目に設定する。
			// 遷移先画面IDを共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_ID_ZMW11203);
			
			// 遷移先画面名を共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_NAME_ZMW11203);
			
			//  B処理を終了する。
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_LOGIN_FAILURE);
			return true;
		}
		
		// (c)貸与品確認
		// ユーザID
		String userId = svBean.sendMessageString(ZMW11201SFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);
		HashMap<String, Object> retMap = getCertifyResultByUserId(userId);
		
		// 統合認証システム連携部品(getLdapCertifyResultUserId)の認証結果を取得する。
		//  認証状態取得
		String ninsho_ret = (String)retMap.get(KEY_NINSHO_STAT);
		
		//  初期パスワードフラグ取得
		String shk_pass = (String)retMap.get(KEY_SHK_PASSWORD);
		
		// ・認証結果がNGの場合
		if(NINSHO_NG.equals(ninsho_ret))
		{
			
			// @認証結果がNG("1")の場合、認証NGとし、メッセージを表示する。メッセージID：EKB6040-JW「認証に失敗しました。」
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6040_JW);
			
			// B処理を終了する。
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, "0");
			
			// 遷移先画面IDを共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_ID_ZMW11203);

			// 遷移先画面名を共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_NAME_ZMW11203);
			return true;
		}
		if(SHOKI_PASSWORD_NG.equals(shk_pass))
		{
			
			//     A初期パスワードフラグが未変更("1")の場合、認証NGとし、メッセージを表示する。
			//       メッセージID：EKB9980-JW「認証に失敗しました。パスワードの変更が必要です。」
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB9980_JW);
			
			//     B処理を終了する。
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_LOGIN_FAILURE);
			
			// 遷移先画面IDを共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_ID_ZMW11203);

			// 遷移先画面名を共有フォームBeanに設定
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
					JZMScreenConst.SCREEN_NAME_ZMW11203);
			
			//  B処理を終了する。
			return true;
		}
		
		// (d)兼務判定
		// ワンタイムパスワード認証で組織コード、立場コードが取得できた場合かつ
		// パラメータのシステムIDがプロパティに定義されているシステムIDと一致する場合
		if(isGetOrgCdPosCdFromOTP(svBean) && !isKenmuHanteiAri((String)dataMap.get("sysId")))
		{
			
			// 兼務なし ステータス変更
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_FIN);
			
			// 兼務なし 兼務有無
			svBean.sendMessageString(ZMW11201SFConst.KENMU_FLG, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_NASHI);
			svBean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_NASHI);
			
			// (e)組織コード、立場コード
			String orgCode = svBean.sendMessageString(ZMW11201SFConst.ONE_ORG_CD, X31CWebConst.DATABEAN_GET_VALUE);
			String posCode = svBean.sendMessageString(ZMW11201SFConst.ONE_POS_CD, X31CWebConst.DATABEAN_GET_VALUE);
			svBean.getDataBeanArray(ZMW11201SFConst.ORG_LIST).clearArray();
			X31SDataBeanAccess subBean = svBean.getDataBeanArray(ZMW11201SFConst.ORG_LIST).addDataBean();
			
			// 組織コードセット
			subBean.sendMessageString(ZMW11201SFConst.ORG_CD_01, X31CWebConst.DATABEAN_SET_VALUE, orgCode);
			
			// 立場コードセット
			subBean.sendMessageString(ZMW11201SFConst.POSITION_CD_01, X31CWebConst.DATABEAN_SET_VALUE, posCode);
		}
		else
		{
			
			// 統合認証連携部品から取得した情報から兼務かどうかを判定する。
			if(isKenmuJuge(retMap))
			{
				
				// 兼務あり ステータス変更
				svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_KENMU_CHK);
				
				// 兼務あり 兼務有無
				svBean.sendMessageString(ZMW11201SFConst.KENMU_FLG, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_ARI);
				svBean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_ARI);
				
				// 次画面への引継情報(dataMap)を作成する。
				dataMap.put(ZMW06901SFConst.KENMU_FLG, true);
			}
			else
			{
				
				// 兼務なし ステータス変更
				svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_FIN);
				
				// 兼務なし 兼務有無
				svBean.sendMessageString(ZMW11201SFConst.KENMU_FLG, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_NASHI);
				svBean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_NASHI);
			}
			
			// 組織情報設定
			JZMWebCommon.setOrgInfoForSvBean(svBean, retMap, KEY_LIST_FOR_LDAP_RESULT);
		}
		
		// (f) 共有フォームBeanにユーザーIDおよびユーザ名をセット
		cfBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_SET_VALUE, userId);
		String userNm = (String)retMap.get("kanji_nm_fmlnm") + (String)retMap.get("kanji_nm_fstnm");
		cfBean.sendMessageString(CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_SET_VALUE, userNm);
		
		// -------------------------------------------------- //
		// (6)サービス呼出処理
		// -------------------------------------------------- //
		X31SDataBeanAccess[] sv0001Beans = {svBean, cfBean};
		
		// ユースケースID格納用マップ
		paramMap = new HashMap<Object, String>();
		
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_0001);
		
		// マッピング用Map
		inMap = new HashMap<String, Object>();
		
		// サービス実行結果データ用Map
		outputMap = new HashMap<String, Object>();
		
		// マッピングクラス
		ZMSV0001_ZMSV0001OPDBMapper sv0001Mapper = new ZMSV0001_ZMSV0001OPDBMapper();
		sv0001Mapper.setZMSV000101CC(sv0001Beans, inMap, JPCModelConstant.FUNC_CD_1);
		sv0001Mapper.setZMSV000101SC(sv0001Beans, inMap, JPCModelConstant.FUNC_CD_1);
		sv0001Mapper.setZMSV000102SC(sv0001Beans, inMap, JPCModelConstant.FUNC_CD_1);
		sv0001Mapper.setZMSV000103SC(sv0001Beans, inMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, inMap, outputMap);
		
		// -------------------------------------------------- //
		// (7)サービス処理結果の設定
		// -------------------------------------------------- //
		// (a)サービスの処理結果を取得する。
		sv0001Mapper.getZMSV000101CC(sv0001Beans, outputMap);
		sv0001Mapper.getZMSV000101SC(sv0001Beans, outputMap);
		sv0001Mapper.getZMSV000102SC(sv0001Beans, outputMap);
		sv0001Mapper.getZMSV000103SC(sv0001Beans, outputMap);
		
		// (b)ユーザーIDおよびログイン時間を共有フォームBeanへセット
		String cfUserId = cfBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);
		String loginTime = svBean.sendMessageString(ZMW11201SFConst.LOGIN_TIME, X31CWebConst.DATABEAN_GET_VALUE);
		String cfLoginTime = cfBean.sendMessageString(CommonInfoCFConst.LOGIN_DTM, X31CWebConst.DATABEAN_GET_VALUE);
		
		if("".equals(cfUserId))
		{
			cfBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_SET_VALUE, userId);
		}
		if("".equals(cfLoginTime))
		{
			cfBean.sendMessageString(CommonInfoCFConst.LOGIN_DTM, X31CWebConst.DATABEAN_SET_VALUE, loginTime);
		}
		
		// -------------------------------------------------- //
		// (8)兼務処理
		// -------------------------------------------------- //
		kenmuShori(cfBean, svBean);
		
		// -------------------------------------------------- //
		// (9)引継情報の設定
		// -------------------------------------------------- //
		// (a)次画面への引継情報(dataMap)を作成する。
		String nextScreenId = null;
		String keyInfo = (String)dataMap.get(KEY_KEY_INFO);
		
		// ePOP連携の場合
		if (keyInfo != null && keyInfo.length() > 0)
		{
			nextScreenId = (String)dataMap.get(KEY_GMNID);
		}
		else
		{
			nextScreenId = (String)dataMap.get(KEY_SCREEN_ID);
		}
		dataMap.put(KEY_NEXT_SCREEN_ID, nextScreenId);
		
		// (b)画面情報設定部品（JCCWebCommon.setScreenInfo)を使用し、次画面への引継情報を設定する。
		JCCWebCommon.setScreenInfo(this, JZMScreenConst.SCREEN_ID_ZMW06901, dataMap);
		
		// (c)戻り先画面ID設定（JCCWebCommon.setScreenId)を使用し、次画面への引継情報を設定する。
//		JCCWebCommon.setScreenId(this, JZMScreenConst.SCREEN_ID_ZMW06901, JZMScreenConst.SCREEN_ID_ZMW11201);
		
		// -------------------------------------------------- //
		// (10)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 遷移先画面IDを共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_ID_ZMW11203);
		
		// 遷移先画面名を共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_NAME_ZMW11203);

		return true;
	}

	/**
	 * ログイン処理
	 * 処理結果により開くウィンドウが異なるため、画面遷移は次のサブミットで呼び出すnextメソッドにて行う。
	 * @return boolean
	 * @throws Exception
	 */
	public boolean login() throws Exception
	{
		
		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (2)ログイン認証
		// -------------------------------------------------- //
		X31SDataBeanAccess svBean = getServiceFormBean();
		
		// (a) 入力されたユーザーIDとパスワードをサービスフォームBean(ZMW11201BeanSF)から取得し、それらをInputとし、
		//     統合認証システム連携部品(JCCLdapCertifyUtil)を呼出す。
		// ユーザID
		String userId = svBean.sendMessageString(ZMW11201SFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);
		
		// (b) サービスフォームBean(ZMW11201BeanSF)のパスワード(PASSWORD)項目を削除する。
		// パスワード
		String pass = svBean.sendMessageString(ZMW11201SFConst.PASSWORD, X31CWebConst.DATABEAN_GET_VALUE);
		
		// パスワード未入力の場合、認証NGとし、メッセージを表示し、処理を中断する。
		if("".equals(pass))
		{
			
			// パスワード未入力
			// メッセージID：EKB6040-JW「認証に失敗しました。」
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6040_JW);
			return true;
		}
		
		// (c) 統合認証システム連携部品(JCCLdapCertifyUtil)の認証結果を取得する。
		HashMap<String, Object> retMap = getCertifyResult(userId, pass);
		if("1".equals(retMap.get(KEY_NINSHO_STAT)))
		{
			
			// ・認証結果がNG("1")の場合、認証NGとし、メッセージを表示し、処理を中断する。
			//   メッセージID：EKB6040-JW「認証に失敗しました。」
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6040_JW);
			return true;
		}
		if("1".equals(retMap.get(KEY_SHK_PASSWORD)))
		{
			
			// ・初期パスワードフラグが未変更("1")の場合、認証NGとし、メッセージを表示し、処理を中断する。	
			// メッセージID：EKB9980-JW「認証に失敗しました。パスワードの変更が必要です。」
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB9980_JW);
			return true;
		}
		
		// (d) セッション再発行処理（setReformSession メソッド：Viewロジックのスーパークラスにて定義）を行う。
		this.setReformSession(true);
		
		// (e) 兼務の判定
		if(isKenmuJuge(retMap))
		{
			
			// 兼務と判定された場合、以下の項目を設定する。
			// 兼務判定有無
			svBean.sendMessageString(ZMW11201SFConst.KENMU_FLG, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_ARI);
			
			// 兼務有無
			svBean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_SET_VALUE, KENMU_FLG_ARI);
			
			// メニューに渡す兼務フラグをセット
			// 次画面への引継情報(dataMap)を作成する。
			HashMap<String, Object> dataMap = new HashMap<String, Object>();
			dataMap.put(ZMW06901SFConst.KENMU_FLG, true);
			
			// 画面情報設定部品（JCCWebCommon.setScreenInfo)を使用し、次画面への引継情報を設定する。
			JCCWebCommon.setScreenInfo(this, JZMScreenConst.SCREEN_ID_ZMW06901, dataMap);
			
			// 戻り先画面ID設定（JCCWebCommon.setScreenId)を使用し、次画面への引継情報を設定する。
			JCCWebCommon.setScreenId(this, JZMScreenConst.SCREEN_ID_ZMW06901, JZMScreenConst.SCREEN_ID_ZMW01201);
		}
		else
		{
			
			// 兼務と判定されなかった場合、以下の項目を設定する。
			// 兼務判定有無
			svBean.sendMessageString(ZMW11201SFConst.KENMU_FLG, X31CWebConst.DATABEAN_SET_VALUE, KENMU_HANTEI_NASHI);
			
			// 兼務有無
			svBean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_SET_VALUE, KENMU_FLG_NASHI);
		}
		
		// (f) 共有フォームBeanにユーザーIDおよびユーザ名をセット
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		cfBean.sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_SET_VALUE, userId);
		String userNm = (String)retMap.get("kanji_nm_fmlnm") + (String)retMap.get("kanji_nm_fstnm");
		cfBean.sendMessageString(CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_SET_VALUE, userNm);
		
		// -------------------------------------------------- //
		// (3)サービスフォームBeanの設定
		// -------------------------------------------------- //
		// 組織情報設定
		JZMWebCommon.setOrgInfoForSvBean(svBean, retMap, KEY_LIST_FOR_LDAP_RESULT);
		
		// 基準日設定
		svBean.sendMessageString(ZMW11201SFConst.BASE_YMD, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon.getSysDate());
		
		// -------------------------------------------------- //
		// (4)サービス呼出処理
		// -------------------------------------------------- //
		X31SDataBeanAccess[] beans = {svBean, cfBean};
		
		// ユースケースID格納用マップ
		HashMap<Object, String> paramMap = new HashMap<Object, String>();
		
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_0001);
		
		// マッピング用Map
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// マッピングクラス
		ZMSV0001_ZMSV0001OPDBMapper mapper = new ZMSV0001_ZMSV0001OPDBMapper();
		mapper.setZMSV000101CC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		mapper.setZMSV000101SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		mapper.setZMSV000102SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		mapper.setZMSV000103SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, inMap, outputMap);
		
		// -------------------------------------------------- //
		// (5)サービス処理結果の設定
		// -------------------------------------------------- //
		// (a)サービスの処理結果を取得する。
		mapper.getZMSV000101CC(beans, outputMap);
		mapper.getZMSV000101SC(beans, outputMap);
		mapper.getZMSV000102SC(beans, outputMap);
		mapper.getZMSV000103SC(beans, outputMap);
		
		// (b)二重ログインチェック
		String loginFlg = svBean.sendMessageString(ZMW11201SFConst.LOGIN_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		if("1".equals(loginFlg))
		{
			
			// 二重ログインの場合
			svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, "2");
		}
		else
		{
			
			// (c)兼務処理（二重ログイン以外の場合実行する）
			kenmuShori(cfBean, svBean);
		}
		
		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 遷移先画面IDを共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_ID_ZMW11201);
		
		// 遷移先画面名を共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_NAME_ZMW11201);

		return true;
	}
	
	/**
	 * ログイン処理後の次画面（次ウィンドウ）への遷移処理
	 * @return 
	 * @throws Exception
	 */
	public boolean next() throws Exception 
	{
		
		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 共有フォームBean
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		
		// サービスフォームBean
		X31SDataBeanAccess svBean = getServiceFormBean();
		
		// ステータス
		String status = svBean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_GET_VALUE);
		
		// (a) サービスフォームBean.ステータスを取得し、ステータスにより以下のとおり画面遷移先を決定する。
		if (STATUS_DLOGIN_CHK.equals(status)) 
		{
			
			// ・ステータスが"2"の場合
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW11202);
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW11202);
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6080__I);

		}
		else if (STATUS_KENMU_CHK.equals(status))
		{
			
			// ・ステータスが"3"の場合
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW11301);
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW11301);
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB6310__I);

		}
		else if (STATUS_FIN.equals(status)) 
		{
			
			// ・ステータスが"4"の場合
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_ID_ZMW06901);
			cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JZMScreenConst.SCREEN_NAME_ZMW06901);
		}

		return true;
	}
	
	/**
	 * 二重ログイン画面 ログインボタン押下処理
	 * @return boolean
	 * @throws Exception
	 */
	public boolean dddLogin() throws Exception
	{
		
		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		// なし
		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		X31SDataBeanAccess svBean = getServiceFormBean();
		X31SDataBeanAccess cfBean = getCommonInfoBean();
		X31SDataBeanAccess[] beans = {svBean, cfBean};
		
		// ユースケースID格納用マップ
		HashMap<Object, String> paramMap = new HashMap<Object, String>();
		
		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_0004);
		
		// マッピング用Map
		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		// マッピングクラス
		ZMSV0004_ZMSV0004OPDBMapper mapper = new ZMSV0004_ZMSV0004OPDBMapper();
		mapper.setZMSV000401SC(beans, inMap, JPCModelConstant.FUNC_CD_1);
		
		// サービス実行
		invokeService(paramMap, inMap, outputMap);
		
		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		mapper.getZMSV000401SC(beans, outputMap);
		
		// -------------------------------------------------- //
		// (5)兼務処理
		// -------------------------------------------------- //
		kenmuShori(cfBean, svBean);
		
		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 遷移先画面IDを共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_ID_ZMW11202);
		
		// 遷移先画面名を共有フォームBeanに設定
		cfBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JZMScreenConst.SCREEN_NAME_ZMW11202);
		
		return true;
	}
	
	/**
	 * 兼務の判定を行います。<BR>
	 * 兼務の場合、組織選択画面を表示するために、引継ぎ情報を作成し、セッションへセットします。<BR>
	 *     引継ぎ元画面：ZMW11201 引継ぎ先画面:ZMW11301<BR>
	 * 兼務が無い場合、共有フォームBeanへ組織情報および権限コードをセットします。<BR>
	 * 前提条件：ZMSV0001サービスが呼ばれており、組織情報や権限コードがサービスフォームBeanにセットされている事。
	 * @param cf_bean 共有フォームBean
	 * @param sv_bean サービスフォームBean
	 */
	private void kenmuShori(X31SDataBeanAccess cf_bean, X31SDataBeanAccess sv_bean)
	{
		
		// 兼務処理
		String kenmu = sv_bean.sendMessageString(ZMW11201SFConst.RET_KENMU_UM, X31CWebConst.DATABEAN_GET_VALUE);
		if("1".equals(kenmu))
		{
			
			// ・兼務の場合
			//@ 次画面への引継情報(dataMap)を作成する。
			HashMap<String, Object> dataMap = new HashMap<String, Object>();
			
			//  実組織一覧
			JZMWebCommon.createHktgiOrgInfo(sv_bean, ZMW11201SFConst.ORG_LIST, KEY_ORG_LIST, dataMap);
			
			//  業務個別設定組織一覧
			JZMWebCommon.createHktgiOrgInfo(sv_bean, ZMW11201SFConst.WKKBT_ORG_LIST, KEY_WKKBT_ORG_LIST, dataMap);
			
			//  中間組織一覧
			JZMWebCommon.createHktgiOrgInfo(sv_bean, ZMW11201SFConst.CHUKAN_ORG_LIST, KEY_CHUKAN_ORG_LIST, dataMap);

			//  特別権限組織一覧
			JZMWebCommon.createHktgiOrgInfo(sv_bean, ZMW11201SFConst.SPA_ORG_LIST, KEY_SPA_ORG_LIST, dataMap);
			
			// A 画面情報設定部品（JCCWebCommon.setScreenInfo)を使用し、次画面への引継情報を設定する。
			JCCWebCommon.setScreenInfo(this, JZMScreenConst.SCREEN_ID_ZMW11301, dataMap);
			
			// B 戻り先画面ID設定（JCCWebCommon.setScreenId)を使用し、次画面への引継情報を設定する。
			JCCWebCommon.setScreenId(this, JZMScreenConst.SCREEN_ID_ZMW11301, JZMScreenConst.SCREEN_ID_ZMW11201);
			
			// C ステータスを以下のとおり変更する。
			//  "3"ログイン時間セット完了(兼務あり)
			sv_bean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_KENMU_CHK);
			
		}
		else
		{
			
			// ・兼務がない場合
			// 共有フォームBean 権限リスト
			X31SDataBeanAccessArray cfBeanList = cf_bean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);
			
			//  サービスフォームBean 権限コード一覧
			X31SDataBeanAccessArray svBeanKengenList = sv_bean.getDataBeanArray(ZMW11201SFConst.AUTHORITY_CD_LIST);
			cfBeanList.clearArray();
			
			//  @ 実組織 組織情報のセット
			X31SDataBeanAccess cfSubBean = cfBeanList.addDataBean();
			JZMWebCommon.setOrgAndAuthInfoForCfBean(cfSubBean, sv_bean, ZMW11201SFConst.ORG_LIST, 0, KEY_ORG_LIST_FOR_CF, svBeanKengenList, 
														ZMW11201SFConst.KGGRP_CD_05, ZMW11201SFConst.AUTHORITY_CD_05);
			
			//  A 業務個別設定組織のセット
			cfSubBean = cfBeanList.addDataBean();
			if(sv_bean.getDataBeanArray(ZMW11201SFConst.WKKBT_ORG_LIST).getCount() > 0)
			{
				JZMWebCommon.setOrgAndAuthInfoForCfBean(cfSubBean, sv_bean, ZMW11201SFConst.WKKBT_ORG_LIST, 0, KEY_WKKBT_ORG_LIST_FOR_CF, 
						svBeanKengenList, ZMW11201SFConst.KGGRP_CD_05, ZMW11201SFConst.AUTHORITY_CD_05);
			}
			
			
			//  B 中間組織のセット
			cfSubBean = cfBeanList.addDataBean();
			if(sv_bean.getDataBeanArray(ZMW11201SFConst.CHUKAN_ORG_LIST).getCount() > 0)
			{
				JZMWebCommon.setOrgAndAuthInfoForCfBean(cfSubBean, sv_bean, ZMW11201SFConst.CHUKAN_ORG_LIST, 0, KEY_CHUKAN_ORG_LIST_FOR_CF, 
						svBeanKengenList, ZMW11201SFConst.KGGRP_CD_05, ZMW11201SFConst.AUTHORITY_CD_05);
			}
			
			//  C 特別権限組織のセット
			X31SDataBeanAccessArray spBeanArray = sv_bean.getDataBeanArray(ZMW11201SFConst.SPA_ORG_LIST);
			for(int iCnt = 0; iCnt < spBeanArray.getCount(); iCnt++)
			{
				cfSubBean = cfBeanList.addDataBean();
				JZMWebCommon.setOrgAndAuthInfoForCfBean(cfSubBean, sv_bean, ZMW11201SFConst.SPA_ORG_LIST, iCnt, KEY_SPA_ORG_LIST_FOR_CF, 
						svBeanKengenList, ZMW11201SFConst.KGGRP_CD_05, ZMW11201SFConst.AUTHORITY_CD_05);
			}
			
			//  ステータスを設定
			sv_bean.sendMessageString(ZMW11201SFConst.LOGIN_PROC_STATUS, X31CWebConst.DATABEAN_SET_VALUE, STATUS_FIN);
		}
	}
	
	/**
	/**
	 * 兼務の判定を行います。
	 * @param retMap 統合認証システム連携部品にて取得したユーザ認証結果情報
	 * @return true:兼務あり false:兼務なし
	 */
	@SuppressWarnings("unchecked")
	private boolean isKenmuJuge(HashMap<String, Object> retMap)
	{
		boolean retValue = false;
		
		// 兼務情報明細
		ArrayList<HashMap<String, Object>> list = (ArrayList<HashMap<String, Object>>)retMap.get(KEY_AUTH_ORG_LIST);
		if(list != null && list.size() >= 1)
		{
			retValue = true;
		}
		
		// ワークグループ組織コード・立場コード明細
		list = (ArrayList<HashMap<String, Object>>)retMap.get(KEY_AUTH_WKGRP_LIST);
		if(list != null && list.size() >= 2)
		{
			retValue = true;
		}
		
		// 中間組織コード・立場コード明細
		list = (ArrayList<HashMap<String, Object>>)retMap.get(KEY_AUTH_CHUKAN_GRP_LIST);
		if(list != null && list.size() >= 2)
		{
			retValue = true;
		}
		
		// 特別権限組織コード・立場コード明細
		list = (ArrayList<HashMap<String, Object>>)retMap.get(KEY_AUTH_SPCL_GRP_LIST);
		if(list != null)
		{
			
			// SPRi 組織コード取得
			String spriOrgCode = JCCWebCommon.getApplicationConst(KEY_PROP_SPCL_SPRI);
			if(spriOrgCode != null)
			{
				String[] trtgOrgCode = spriOrgCode.split(DELIM);
				if(trtgOrgCode != null)
				{
					int hitCnt = 0;
					
					// 特別権限組織コード・立場コード明細の件数分繰り返して、SPRi 特別権限が2つ以上ある場合
					// 兼務と判定する
					for(int iCnt = 0; iCnt < list.size(); iCnt++)
					{
						String key = (String)list.get(iCnt).get(KEY_SPCL_ORG_CD);
						if(key == null)
						{
							
							// 特別権限組織コードがセットされたいない場合無視する。
							continue;
						}
						if(isNonHktgiKmk(key, trtgOrgCode))
						{
							hitCnt++;
						}
						if(hitCnt >= 2)
						{
							retValue = true;
							break;
						}
					}
				}
			}
		}
		return retValue;
	}
	
	/**
	 * 統合認証部品 認証を呼び出します。
	 * @param user_id ユーザーID
	 * @param pass パスワード
	 * @return ユーザー認証結果情報
	 * @throws Exception
	 */
	private HashMap<String, Object> getCertifyResult(String user_id, String pass) throws Exception
	{
		return JCCWebCommon.getLdapCertifyResult(this, user_id, pass);
	}

	
	/**
	 * 統合認証部品 貸与品確認を呼び出します。
	 * @param user_id ユーザーID
	 * @return ユーザー認証結果情報
	 * @throws Exception
	 */
	private HashMap<String, Object> getCertifyResultByUserId(String user_id) throws Exception
	{
		
		return JCCWebCommon.getLdapCertifyResultUserId(this, user_id);
		
	}
	
	/**
	 * 兼務判定が必要かどうかの判定。外部連携されるシステムにより要件がことなる。
	 * 兼務判定不要なシステムはアプリケーションプロパティに設定済み
	 * @param sys_id システムID
	 * @return boolean true:兼務判定あり false:兼務判定なし
	 */
	private boolean isKenmuHanteiAri(String sys_id) 
	{
		boolean retValue = true;
		
		// アプリケーションプロパティから兼務判定不要のシステムIDを取得
		String sys_ids = JCCWebCommon.getApplicationConst(KEY_TSYRN_KENMU);
		if(sys_ids == null || "".equals(sys_ids))
		{
			
			// プロパティに設定がないため、すべての外部連携において兼務判定が必要。
			retValue = true;
		}
		else
		{
			
			// 外部連携のリクエストにシステムIDが設定されている場合
			// アプリケーションプロパティに定義されているシステムIDと比較する
			// (外部連携のリクエストにシステムIDがない場合は兼務判定ありとする)
			if (sys_id != null)
			{
				String[] sysIdArray = sys_ids.split(SYS_ID_DELMI);
				for(int iCnt = 0; iCnt < sysIdArray.length; iCnt++)
				{
					if(sys_id.equals(sysIdArray[iCnt]))
					{
						retValue = false;
						break;
					}
				}
			}
		}
		return retValue;
	}
	
	/**
	 * 指定されたkeyが配列に含まれている場合、trueを返す。
	 * @param key 検査するKey項目
	 * @param nonHktgiKmkArray 検査対象となる配列
	 * @return nonHktgiKmkArrayにkeyが含まれている場合、trueを返す。
	 */
	private boolean isNonHktgiKmk(String key, String[] nonHktgiKmkArray)
	{
		boolean retValue = false;
		
		for(int iCnt = 0; iCnt < nonHktgiKmkArray.length; iCnt++)
		{
			if(key.equals(nonHktgiKmkArray[iCnt]))
			{
				retValue = true;
				break;
			}
		}
		return retValue;
	}
	
	/**
	 * ワンタイムパスワード認証で取得した組織コードおよび立場コードを返却します。
	 * @param sv_bean サービスフォームBean
	 * @return true:組織コード、立場コード取得できた
	 */
	private boolean isGetOrgCdPosCdFromOTP(X31SDataBeanAccess sv_bean) 
	{
		boolean retValue = false;
		String orgCode = sv_bean.sendMessageString(ZMW11201SFConst.ONE_ORG_CD, X31CWebConst.DATABEAN_GET_VALUE);
		String posCode = sv_bean.sendMessageString(ZMW11201SFConst.ONE_POS_CD, X31CWebConst.DATABEAN_GET_VALUE);
		
		if((!"".equals(orgCode)) && (!"".equals(posCode)))
		{
			retValue = true;
		}
		return retValue;
	}
}
