/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JZMEditOrgAndAuthInfo
*   ソースファイル名：JZMEditOrgAndAuthInfo.java
*   作成者          ：富士通
*   日付            ：2012年03月12日
*＜機能概要＞
*   組織権限情報編集部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00       2012/03/12   FJ) 宮前    新規作成
*   v3.00       2012/03/12   FJ) 宮前    【SGY-2012-000006】統合認証対応
*   v3.01       2012/08/09   FJ) 宮前    【ST1-2012-0000282】統合認証連携 不具合対応
*
**********************************************************************/
package eo.web.webview.common;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 組織権限情報編集部品<BR>
 * @author FJ
 */
public class JZMEditOrgAndAuthInfo
{
	/** KEY 特別権限組織 一覧 */
	private static final String KEY_AUTH_SPCL_LIST = "ECCTGN00001CBSMsg4List";
	
	/** KEY 中間組織 一覧 */
	private static final String KEY_AUTH_CHUKAN_LIST = "ECCTGN00001CBSMsg3List";
	
	/** KEY ワークグループ 一覧 */
	private static final String KEY_AUTH_WKGRP_LIST = "ECCTGN00001CBSMsg2List";
	
	/** KEY 実組織 一覧 */
	private static final String KEY_AUTH_ORG_LIST = "ECCTGN00001CBSMsg1List";
	
	/** KEY 特別権限立場コード */
	private static final String KEY_SPCL_POSITION_CD = "spcl_position_cd";
	
	/** KEY 特別権限組織コード */
	private static final String KEY_SPCL_ORG_CD = "spcl_org_cd";
	
	/** KEY 中間組織コード */
	private static final String KEY_CHUKAN_JOI_ORG_CD = "chukan_joi_org_cd";
	
	/** KEY 中間組織立場コード */
	private static final String KEY_CHUKAN_POSITION_CD = "chukan_position_cd";
	
	/** KEY 中間組織コード */
	private static final String KEY_CHUKAN_ORG_CD = "chukan_org_cd";
	
	/** KEY ワークグループ上位組織コード */
	private static final String KEY_WKGRP_JOI_ORG_CD = "wkgrp_joi_org_cd";
	
	/** KEY ワークグループ 立場コード */
	private static final String KEY_WKGRP_POSITION_CD = "wkgrp_position_cd";
	
	/** KEY ワークグループ 組織コード */
	private static final String KEY_WKGRP_ORG_CD = "wkgrp_org_cd";
	
	/** KEY 実組織コード 兼務 */
	private static final String KEY_KENMU_SYOKUI_CD = "kenmu_syokui_cd";
	
	/** KEY 実組織 立場コード 兼務 */
	private static final String KEY_KENMU_SYOZK_CD = "kenmu_syozk_cd";
	
	/** KEY 実組織 職位コード */
	private static final String KEY_SYOKUI_CD = "syokui_cd";
	
	/** KEY 従業員管理区分CD */
	private static final String KEY_WORKER_KANRI_DIV_CD = "worker_kanri_div_cd";
	
	/** KEY 実組織 所属コード */
	private static final String KEY_SYOZK_CD = "syozk_cd";
	
	/** 組織選択 インデックス指定の区切り文字 */
	public static final String ORG_SELECTED_INDEX_DELIM = ";";
	
	/** 組織選択 すべてを選択する場合 */
	public static final String ORG_SELECTED_ALL = "ALL";
	
	/** エラーメッセージ サービスフォームBean NULL */
	private static final String ERR_MSG_SERVICE_FORM_BEAN_NULL = "サービスフォームBeanへの参照がNullです。";
	
	/** エラーメッセージ 共有フォームBean NUll */
	private static final String ERR_MSG_COMMON_FROM_BEAN_NULL = "共有フォームBeanへの参照がNullです。";
	
	/** エラーメッセージ データタイプBean名 NULL */
	private static final String ERR_MSG_LIST_NAME_NULL = "データタイプBean名がNullです。";
	
	/** エラーメッセージ サービスフォームBean項目名リスト NULL */
	private static final String ERR_MSG_KEY_LIST_NULL = "サービスフォームBean項目名リストがNullです。";
	
	/** エラーメッセージ 画面引継ぎ用HashMap NULL */
	private static final String ERR_MSG_HKTGI_HASHMAP_NULL = "画面引継ぎ用HashMapがNullです。";
	
	/** エラーメッセージ 権限リスト NULL */
	private static final String ERR_MSG_AUTHORITY_LIST_NULL = "権限リストへの参照がNullです。";
	
	/** エラーメッセージ 権限グループコード項目名 NULL */
	private static final String ERR_MSG_AUTHORITY_GRP_CD_NULL = "権限グループコード項目名への参照がNullです。";
	
	/** エラーメッセージ 権限コード項目名 NULL */
	private static final String ERR_MSG_AUTHORITY_CD_NULL = "権限コード項目名への参照がNullです。";
	
	/** KEY リスト インデックス 実組織 */
	private static final int ORG_LIST = 0;
	
	/** KEY リスト インデックス 業務個別設定組織 */
	private static final int WKGRP_ORG_LIST = 1;
	
	/** KEY リスト インデックス 中間組織 */
	private static final int CHUKAN_ORG_LIST = 2;
	
	/** KEY リスト インデックス 特別権限組織 */
	private static final int SPA_ORG_LIST = 3;
	
	/** KEY リスト インデックス リスト名 */
	private static final int ORG_LIST_NM = 0;
	
	/** KEY リスト インデックス 項目名 組織コード */
	private static final int ORG_LIST_ORG_CD_KMK = 1;
	
	/** KEY リスト インデックス 項目名 立場コード */
	private static final int ORG_LIST_POS_CD_KMK = 2;
	
	/** KEY リスト インデックス 項目名 上位組織コード */
	private static final int ORG_LIST_JOI_CD_KMK = 3;



	/**
	 * No.1 引継ぎ情報作成処理<BR>
	 * サービスフォームBeanから組織情報を取得し、画面間引継ぎ用のHashMapを作成する。<BR>
	 * 
	 * @param sv_bean サービスフォームBean
	 * @param list_name データタイプBean名
	 * @param key_list サービスフォームBean項目名リスト
	 * @param data_map 画面引継ぎ情報用HashMap
	 * @throws IllegalArgumentException
	 */
	public static void createHktgiOrgInfo(X31SDataBeanAccess sv_bean, String list_name, 
									String[] key_list, HashMap<String, Object> data_map) throws IllegalArgumentException
	{
		
		// (1)引数チェック
		//    以下の項目がNullの場合、例外をスローする
		//    サービスフォームBean
		if(sv_bean == null)
		{
			throw new IllegalArgumentException(ERR_MSG_SERVICE_FORM_BEAN_NULL);
		}
		
		//    データタイプBean名
		if(list_name == null)
		{
			throw new IllegalArgumentException(ERR_MSG_LIST_NAME_NULL);
		}
		
		//	    サービスフォームBean項目名リスト
		if(key_list == null || key_list.length == 0)
		{
			throw new IllegalArgumentException(ERR_MSG_KEY_LIST_NULL);
		}
		
		//	    画面引継ぎ情報用HashMap
		if(data_map == null)
		{
			throw new IllegalArgumentException(ERR_MSG_HKTGI_HASHMAP_NULL);
		}
		
		// (2)サービスフォームBeanArray取得
		X31SDataBeanAccessArray svBeanArray = sv_bean.getDataBeanArray(list_name);
		
		// (3) (2)で取得したサービスフォームBeanArrayからArrayListを取得
		ArrayList<HashMap<String, Object>> list = getArrayListForSetScreenInfo(svBeanArray, key_list);
		
		// (4)引数で指定されたHashMapへ(1)で取得したArrayListをセット
		data_map.put(list_name, list);
	}
	
	/**
	 * No.2 共有フォームBean設定処理<BR>
	 * サービスフォームBeanから組織情報と権限情報を共有フォームBeanへセットする。<BR>
	 * 
	 * @param cf_bean 共有フォームBean 権限リストにセットされている要素そのもの
	 * @param sv_bean サービスフォームBean
	 * @param org_list_name サービスフォームBeanで組織一覧として設定しているデータタイプBeanの名称
	 * @param index 共有フォームBeanへセットする組織一覧のインデックスを";"で区切ったもの
	 * @param key_kmk_nm_list 共有フォームBeanおよびサービスフォームBean 項目名リスト
	 * @param auth_list 権限コードリスト
	 * @param key_kggrp_cd_kmk 権限コード一覧 権限グループコード項目名
	 * @param key_auth_sbt_cd_kmk 権限コード一覧 権限コード項目名
	 */
	public static void setOrgAndAuthInfoForCfBean(X31SDataBeanAccess cf_bean, 
											X31SDataBeanAccess sv_bean, 
											String org_list_name, 
											int index, 
											String[][] key_kmk_nm_list, 
											X31SDataBeanAccessArray auth_list, 
											String key_kggrp_cd_kmk, 
											String key_auth_sbt_cd_kmk)
	{
		
		// (1) 引数チェック
		// 共有フォームBean
		if(cf_bean == null)
		{
			throw new IllegalArgumentException(ERR_MSG_COMMON_FROM_BEAN_NULL);
		}
		
		// サービスフォームBean
		if(sv_bean == null)
		{
			throw new IllegalArgumentException(ERR_MSG_SERVICE_FORM_BEAN_NULL);
		}
		
		// サービスフォームBeanで組織一覧として設定しているデータタイプBeanの名称
		if(org_list_name == null)
		{
			throw new IllegalArgumentException(ERR_MSG_KEY_LIST_NULL);
		}
		
		// 共有フォームBeanおよびサービスフォームBean 項目名リスト
		if(key_kmk_nm_list == null)
		{
			throw new IllegalArgumentException(ERR_MSG_KEY_LIST_NULL);
		}
		
		// 権限コードリスト
		if(auth_list == null)
		{
			throw new IllegalArgumentException(ERR_MSG_AUTHORITY_LIST_NULL);
		}
		
		// 権限グループコード項目名
		if(key_kggrp_cd_kmk == null)
		{
			throw new IllegalArgumentException(ERR_MSG_AUTHORITY_GRP_CD_NULL);
		}
		
		// 権限コード項目名
		if(key_auth_sbt_cd_kmk == null)
		{
			throw new IllegalArgumentException(ERR_MSG_AUTHORITY_CD_NULL);
		}
		
		// (2) 組織一覧取得（実組織、業務個別設定組織、中間組織、特別権限組織）
		X31SDataBeanAccessArray svBeanList = sv_bean.getDataBeanArray(org_list_name);
		
		// (3)サービスフォームBeanから共有フォームBeanへセットする
		X31SDataBeanAccess svSubBean = svBeanList.getDataBean(index);
		
		//   (a) 共有フォームBeanへ特別権限組織 セット
		setCfBeanForOrgList(cf_bean, svSubBean, key_kmk_nm_list);
		
		//   (b) 共有フォームBeanへ特別権限組織 権限コードセット
		setKengen(cf_bean, auth_list, key_kggrp_cd_kmk, key_auth_sbt_cd_kmk);
	}
	
	/**
	 * No.3 
	 * 統合認証システム連携部品から取得した組織、立場情報をサービスフォームBeanへセットする<BR>
	 * 
	 * @param bean サービスフォームBean
	 * @param map 統合認証システム連携部品で取得した組織情報
	 * @param key_list サービスフォームBean 項目名リスト
	 *                  リスト名,組織コード項目名,立場コード項目名,上位組織コード項目名
	 */
	@SuppressWarnings("unchecked")
	public static void setOrgInfoForSvBean(X31SDataBeanAccess bean, HashMap<String, Object> map, String[][] key_list)
	{
		X31SDataBeanAccess subBean = null;
		ArrayList<HashMap<String, Object>> mapArray = null;
		
		// 実組織一覧
		X31SDataBeanAccessArray beanArray = bean.getDataBeanArray(key_list[ORG_LIST][ORG_LIST_NM]);
		beanArray.clearArray();
		
		subBean = beanArray.addDataBean();
		
		// (1) 実組織一覧.組織コード(所属コード)
		subBean.sendMessageString(key_list[ORG_LIST][ORG_LIST_ORG_CD_KMK], X31CWebConst.DATABEAN_SET_VALUE, (String)map.get(KEY_SYOZK_CD));
		
		//     実組織一覧.立場コード(職位コード)
		//     従業員管理区分+職位コード
		String pos_cd = (String)map.get(KEY_WORKER_KANRI_DIV_CD) + (String)map.get(KEY_SYOKUI_CD);
		subBean.sendMessageString(key_list[ORG_LIST][ORG_LIST_POS_CD_KMK], X31CWebConst.DATABEAN_SET_VALUE, pos_cd);
		
		// (2) 実組織一覧(兼務情報明細)
		mapArray = (ArrayList<HashMap<String, Object>>)map.get(KEY_AUTH_ORG_LIST);
		setServiceFormBeanFromHashMap(mapArray, beanArray, KEY_KENMU_SYOZK_CD, KEY_KENMU_SYOKUI_CD, null, 
				key_list[ORG_LIST][ORG_LIST_ORG_CD_KMK], key_list[ORG_LIST][ORG_LIST_POS_CD_KMK], null, (String)map.get(KEY_WORKER_KANRI_DIV_CD));
		
		// (3) 業務個別設定組織一覧
		beanArray = bean.getDataBeanArray(key_list[WKGRP_ORG_LIST][ORG_LIST_NM]);
		beanArray.clearArray();
		mapArray = (ArrayList<HashMap<String, Object>>)map.get(KEY_AUTH_WKGRP_LIST);
		setServiceFormBeanFromHashMap(mapArray, beanArray, KEY_WKGRP_ORG_CD, KEY_WKGRP_POSITION_CD, KEY_WKGRP_JOI_ORG_CD, 
				key_list[WKGRP_ORG_LIST][ORG_LIST_ORG_CD_KMK], key_list[WKGRP_ORG_LIST][ORG_LIST_POS_CD_KMK], 
				key_list[WKGRP_ORG_LIST][ORG_LIST_JOI_CD_KMK], "");
		
		// (4) 中間組織一覧
		beanArray = bean.getDataBeanArray(key_list[CHUKAN_ORG_LIST][ORG_LIST_NM]);
		beanArray.clearArray();
		mapArray = (ArrayList<HashMap<String, Object>>)map.get(KEY_AUTH_CHUKAN_LIST);
		setServiceFormBeanFromHashMap(mapArray, beanArray, KEY_CHUKAN_ORG_CD, KEY_CHUKAN_POSITION_CD, KEY_CHUKAN_JOI_ORG_CD, 
				key_list[CHUKAN_ORG_LIST][ORG_LIST_ORG_CD_KMK], key_list[CHUKAN_ORG_LIST][ORG_LIST_POS_CD_KMK], 
				key_list[CHUKAN_ORG_LIST][ORG_LIST_JOI_CD_KMK], "");
		
		// (5) 特別権限組織一覧
		beanArray = bean.getDataBeanArray(key_list[SPA_ORG_LIST][ORG_LIST_NM]);
		beanArray.clearArray();
		mapArray = (ArrayList<HashMap<String, Object>>)map.get(KEY_AUTH_SPCL_LIST);
		setServiceFormBeanFromHashMap(mapArray, beanArray, KEY_SPCL_ORG_CD, KEY_SPCL_POSITION_CD, null, 
				key_list[SPA_ORG_LIST][ORG_LIST_ORG_CD_KMK], key_list[SPA_ORG_LIST][ORG_LIST_POS_CD_KMK], null, "");
		
	}
	
	/**
	 * No.4 権限コード設定処理<BR>
	 * サービスフォームBean 権限コード一覧にセットされている権限コードを共有フォームBeanへセットします。<BR>
	 * 
	 * @param cf_sub_bean 共有フォームBean 権限リストに含まれるサブBean
	 * @param sv_bean_list サービスフォームBean 権限コード一覧
	 * @param key_kggrp_cd_kmk 権限コード一覧 権限グループコード項目名
	 * @param key_auth_sbt_cd_kmk 権限コード一覧 権限コード項目名
	 */
	private static void setKengen(X31SDataBeanAccess cf_sub_bean, X31SDataBeanAccessArray sv_bean_list, 
										String key_kggrp_cd_kmk, String key_auth_sbt_cd_kmk) 
	{
		
		// 共有フォームBeanにセットされている権限グループコード
		String cfAuthorityGrpCd = cf_sub_bean.sendMessageString(CommonInfoCFConst.KGGRP_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		if(cfAuthorityGrpCd != null && !"".equals(cfAuthorityGrpCd))
		{
			
			// 共有フォームBeanにセットされている権限グループコードとサービスフォームBean.権限コード一覧にセットされている
			// 権限グループコードが一致する情報を探す。
			for(int iCnt = 0; iCnt < sv_bean_list.getCount(); iCnt++)
			{
				
				// サービスフォームBean.権限コード一覧
				X31SDataBeanAccess svSubBean = sv_bean_list.getDataBean(iCnt);
				
				// サービスフォームBeanにセットされている権限グループコード
				String svAuthorityGrpCd = svSubBean.sendMessageString(key_kggrp_cd_kmk, X31CWebConst.DATABEAN_GET_VALUE);
				
				if(cfAuthorityGrpCd.equals(svAuthorityGrpCd))
				{
					
					// 権限グループコードが一致する権限コード一覧を共有フォームBeanへセットする
					int iCntSbtMax = ((Integer)(svSubBean.sendMessage(key_auth_sbt_cd_kmk, X31CWebConst.DATABEAN_GET_COUNT))).intValue();
					for(int iCntSbt = 0; iCntSbt < iCntSbtMax; iCntSbt++)
					{
						String value = svSubBean.sendMessageString(key_auth_sbt_cd_kmk, X31CWebConst.DATABEAN_GET_VALUE, iCntSbt);
						cf_sub_bean.sendMessageString(CommonInfoCFConst.AUTHORITY_CD_01, X31CWebConst.DATABEAN_ADD_VALUE, value);
					}
				}
			}
		}
	}
	
	/**
	 * No.5 共有フォームBean設定処理<BR>
	 * 引数のkey_listに従って、サービスフォームBeanの値を共有フォームBeanへセットする<BR>
	 * 
	 * @param cf_sub_bean 共有フォームBean
	 * @param sv_sub_bean サービスフォームBean
	 * @param key_list 共有フォームBeanおよびサービスフォームBeanのKey項目名称の配列
	 */
	private static void setCfBeanForOrgList(X31SDataBeanAccess cf_sub_bean, X31SDataBeanAccess sv_sub_bean, String[][] key_list) 
	{
		for(int iCnt = 0; iCnt < key_list.length; iCnt++)
		{
			String value = sv_sub_bean.sendMessageString(key_list[iCnt][1], X31CWebConst.DATABEAN_GET_VALUE);
			cf_sub_bean.sendMessageString(key_list[iCnt][0], X31CWebConst.DATABEAN_SET_VALUE, value);
		}
		
	}
	
	/**
	 * No.6 組織情報取得処理<BR>
	 * 指定された組織リスト（サービスフォームBean）から指定された配列のKeyに一致する情報を取り出し、ArrayListで返却する。<BR>
	 * @param svBeanList 組織リスト
	 * @param keyOrgList Key名リスト
	 * @return ArrayListに格納された組織リスト
	 */
	private static ArrayList<HashMap<String, Object>> getArrayListForSetScreenInfo(X31SDataBeanAccessArray svBeanList, String[] keyOrgList) 
	{
		ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> map = null;
		X31SDataBeanAccess subBean = null;
		boolean skipFlg = false;
		
		// 指定されたサービスフォームBeanのリストの件数だけ繰り返し、ArrayListへセットする
		for(int iCnt = 0; iCnt < svBeanList.getCount(); iCnt++)
		{
			subBean = svBeanList.getDataBean(iCnt);
			map = new HashMap<String, Object>();
			
			// 配列で指定されたKey 名称の件数だけ繰り返し、サービスフォームBeanからHashMapへセットする
			for(int iCntKeyList = 0; iCntKeyList < keyOrgList.length; iCntKeyList++)
			{
				String value = subBean.sendMessageString(keyOrgList[iCntKeyList], X31CWebConst.DATABEAN_GET_VALUE);
				if("".equals(value))
				{
					skipFlg = true;
					break;
				}
				map.put(keyOrgList[iCntKeyList], value);
			}
			if(skipFlg == false)
			{
				list.add(map);
			}
			else
			{
				skipFlg = false;
			}
		}
		
		return list;
	}
	
	/**
	 * No.7 サービスフォームBean設定処理<BR>
	 * 統合認証システム連携部品から取得した組織、立場情報をサービスフォームBeanへセットする
	 * <BR>
	 * @param map_array 統合認証システム連携部品から取得した組織情報リスト
	 * @param beanArray サービスフォームBean 組織情報リスト
	 * @param key_org 統合認証システム連携部品から取得した組織情報の組織コードのKey名称
	 * @param key_pos 統合認証システム連携部品から取得した組織情報の立場コードのKey名称
	 * @param key_joi_org 統合認証システム連携部品から取得した組織情報の上位組織コードのKey名称
	 * @param key_org_bean サービスフォームBean 組織情報リストにセットする組織コードのKey名称
	 * @param key_pos_bean サービスフォームBean 組織情報リストにセットする立場コードのKey名称
	 * @param key_joi_org_bean  サービスフォームBean 組織情報リストにセットする上位組織コードのKey名称
	 * @param kanri_kbn 従業員管理区分CD 実組織を設定する場合のみセットされる。それ以外は空文字("")
	 */
	private static void setServiceFormBeanFromHashMap(ArrayList<HashMap<String, Object>> map_array, X31SDataBeanAccessArray beanArray,
							String key_org, String key_pos, String key_joi_org, String key_org_bean, String key_pos_bean, 
							String key_joi_org_bean, String kanri_kbn)
	{
		HashMap<String, Object> subMap = null;
		String org_cd = null;
		String joi_org_cd = null;
		String pos_cd = null;
		X31SDataBeanAccess subBean = null;
		
		if(map_array != null)
		{
			for(int iCnt = 0; iCnt < map_array.size(); iCnt++)
			{
				
				// 兼務情報明細 から取得したHashMap
				subMap = map_array.get(iCnt);
				if(subMap != null)
				{
					
					// 組織コード 取得
					org_cd = (String)subMap.get(key_org);
					
					// 立場コード 取得
					pos_cd = kanri_kbn + (String)subMap.get(key_pos);
					
					// 上位組織コード
					if(key_joi_org != null && !"".equals(key_joi_org))
					{
						joi_org_cd = (String)subMap.get(key_joi_org);
					}
					if((org_cd != null && !"".equals(org_cd)) && (pos_cd != null && !"".equals(pos_cd)))
					{
						subBean = beanArray.addDataBean();
						
						// 組織コード 設定
						subBean.sendMessageString(key_org_bean, X31CWebConst.DATABEAN_SET_VALUE, org_cd);
						
						// 立場コード 設定
						subBean.sendMessageString(key_pos_bean, X31CWebConst.DATABEAN_SET_VALUE, pos_cd);
						if(key_joi_org_bean != null && !"".equals(key_joi_org_bean))
						{
							
							// 上位組織コード
							subBean.sendMessageString(key_joi_org_bean, X31CWebConst.DATABEAN_SET_VALUE, joi_org_cd);
						}
					}
				}
			}
		}
	}
}
