/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKCtcMikstCdKoshin
*   ソースファイル名：JKKCtcMikstCdKoshin.java
*   作成者          ：富士通
*   日付            ：2013年09月23日
*＜機能概要＞
*   会員ISP決済状態コード更新用部品クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2013/09/23   FJ）阮        新規作成
*   v20.00.00   2016/01/24   FJ)中野       【OM-2015-0003406】エラーハンドリングの見直し
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0021C010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0031A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0031C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;

/**
 * 会員ISP決済状態コード更新用部品クラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKCtcMikstCdKoshin extends AbstractCommonComponent {
	
	
	/** お客様一意照会 **/
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	
	/** サービス契約一意照会 **/
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	
	/** お客様＜個人＞一意照会 **/
	private static final String TEMPLATE_ID_ECK0021A010 = "ECK0021A010";
	
	/** お客様＜個人＞内容変更 **/
	private static final String TEMPLATE_ID_ECK0021C010 = "ECK0021C010";
	
	/** お客様＜法人＞一意照会 **/
	private static final String TEMPLATE_ID_ECK0031A010 = "ECK0031A010";
	
	/** お客様＜個人＞内容変更 **/
	private static final String TEMPLATE_ID_ECK0031C010 = "ECK0031C010";
	
	/** サービス契約番号 */
	public static final String SVC_KEI_NO = "svc_kei_no";
	
	/** 運用日を取得する関数 */
	private String opeDate = "";
	
	/** 契約者タイプコード：個人 */
	private final String KEISHA_TYPE_CD_1 = "1";
	/** 契約者タイプコード：法人 */
	private final String KEISHA_TYPE_CD_2 = "2";
	/** 契約者タイプコード：保守用 */
	private final String KEISHA_TYPE_CD_3 = "3";
	/** 契約者タイプコード：自社利用 */
	private final String KEISHA_TYPE_CD_4 = "4";
	/** 契約者タイプコード：マンションオーナ */
	private final String KEISHA_TYPE_CD_5 = "5";
	
	/** 会員種別コード：非eo会員 */
	private final String MENBER_SBT_CD_00 = "00";
	/** 会員種別コード：マスター会員（個人） */
	private final String MENBER_SBT_CD_10 = "10";
	/** 会員種別コード：ファミリー会員（個人） */
	private final String MENBER_SBT_CD_11 = "11";
	/** 会員種別コード：マスター会員（法人） */
	private final String MENBER_SBT_CD_20 = "20";
	/** 会員種別コード：ファミリー会員（法人） */
	private final String MENBER_SBT_CD_21 = "21";
	/** 会員種別コード：オープン会員 */
	private final String MENBER_SBT_CD_30 = "30";
	

	/**
	 * 会員ISP決済状態コード「０：通常」に更新
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite mikstCdKoshinUseStart(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText) throws Throwable
	{
		//  会員ISP決済状態コードを「0」に更新する
		return mikstCdKoshinMain(handle, param, requestParam, fixedText, "0");
	}
	
	/**
	 * 会員ISP決済状態コード「１：すべてのISP決済先が利用停止中」に更新
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite mikstCdKoshinUseStop(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText) throws Throwable
	{
		//  会員ISP決済状態コードを「1」に更新する
		return mikstCdKoshinMain(handle, param, requestParam, fixedText, "1");
	}

	/**
	 * 会員ISP決済状態コード更新メイン処理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @throws Throwable
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	private IRequestParameterReadWrite mikstCdKoshinMain(SessionHandle handle, IRequestParameterReadWrite param,HashMap<String, Object> requestParam, String fixedText,String updMikstCd) throws Throwable
	{
		// S-IF結果格納用
		HashMap<String, Object> resultHash =  new HashMap<String, Object>();
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 対象サービス契約
		String prm_svc_kei_no = (String)requestParam.get(SVC_KEI_NO);
		
		// ステータスコード
		int statusCode = 0;
		
		// 運用日の取得
		opeDate = JCCBPCommon.getOpeDate(null);
		
		//****************************************
		// ■サービス契約一意照会
		//****************************************
		statusCode = callEKK0081A010SC(param, handle, requestParam, resultHash, prm_svc_kei_no);
		if(statusCode != 0)
		{
			return param;
		}
		// サービス契約一意照会結果を取得
		HashMap<String, Object> eKK0081A010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_EKK0081A010);
		
		// 対象サービス契約に紐づくSYSIDを取得
		String sysid = (String)eKK0081A010Hash.get(EKK0081A010CBSMsg1List.SYSID);
		
		//****************************************
		// ■お客様一意照会
		//****************************************
		statusCode = callECK0011A010SC(param, handle, requestParam, resultHash, sysid);
		if(statusCode != 0)
		{
			return param;
		}
			
		// お客様一意照会結果を取得
		HashMap<String, Object> eCK0011A010Hash = (HashMap<String, Object>)resultHash.get(TEMPLATE_ID_ECK0011A010);

		// 会員ISP決済状態コード
		String mmbIspKssaiStatCd = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.MMB_ISP_KSSAI_STAT_CD);
		// 契約者タイプコード
		String keishaTypeCd = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.KEISHA_TYPE_CD);
		// 会員種別コード
		String menberSbtCd = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		
		// お客様一意照会カレントの会員ISP決済状態コードが更新要求会員ISP決済状態コードが一致している場合更新は不要
		// お客様一意照会カレントの会員ISP決済状態コードが空白またはNULLの場合は無条件に更新を行う
		// 更新可否フラグ
		boolean mikscdCgFlg = false;
		
		if (mmbIspKssaiStatCd != null && !"".equals(mmbIspKssaiStatCd) ) 
		{
			if (!mmbIspKssaiStatCd.equals(updMikstCd))
			{
				// 更新処理を実行
				mikscdCgFlg = true;
			}
			else
			{
				// 更新処理を実行しない
				mikscdCgFlg = false;
			}
		}
		else
		{
			// 更新処理を実行
			mikscdCgFlg = true;
		}
		
		if (mikscdCgFlg)
		{
			// 対象更新するお客様は個人の場合
			if (chkKojin(keishaTypeCd, menberSbtCd))
			{
				// お客様＜個人＞内容変更を実施する
				updateCustKojin(handle, param, fixedText, scCall, eCK0011A010Hash,updMikstCd);
			}
			// 対象更新するお客様は法人の場合
			else
			{
				// お客様＜法人＞内容変更を実施する
				updateCustHojin(handle, param, fixedText, scCall, eCK0011A010Hash,updMikstCd);
				
			}
		}
		
		return param;
	}
	
	/**
	 * サービス契約一意照会SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	svcKeiNo	サービス契約番号
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callEKK0081A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		mappingEKK0081A010InMsg(template, inHash, svcKeiNo);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param);

		// エラーチェック
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_EKK0081A010, mappingEKK0081A010SCOutMsg(resultMsgs));
		}

		return status;
		
	}
	
	/**
	 * お客様一意照会SIFを呼び出し
	 * @param	param		リクエストパラメータ	
	 * @param	handle		セッションハンドル
	 * @param	inHash		条件用Hash
	 * @param	resultHash	結果のハッシュ
	 * @param	sysid	SYSID
	 * @return				サービスインターフェースのリターンコード
	 * @throws	RequestParameterException, SCException 例外時にスローされます
	 */
	private int callECK0011A010SC(
			IRequestParameterReadWrite param,
			SessionHandle handle,
			HashMap<String, Object> inHash,
			HashMap<String, Object> resultHash,
			String sysid
	) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg[] resultMsgs = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(ECK0011A010CBSMsg.class.getName());
		mappingECK0011A010InMsg(template, inHash, sysid);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング処理
		editResultRP(sIFResult, param);

		// エラーチェック
		errChk(sIFResult);

		// 結果の取得
		resultMsgs = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// ステータスが0以外はエラーとなっている
		if(status == 0)
		{
			resultHash.put(TEMPLATE_ID_ECK0011A010, mappingECK0011A010SCOutMsg(resultMsgs));
		}

		return status;
		
	}
	
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param) 
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		//電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		//ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		//オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		//サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		//依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		//依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		//依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		//オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		return paramMap;
	}
	

	/**
	 * templateに対してEKK0081A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingEKK0081A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String svcKeiNo)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010);

		//機能コード--サービス契約一意照会
		template.set(EKK0081A010CBSMsg.FUNC_CODE, "2");

		//ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		
		//ＫＥＹ＿予約適用年月日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
		
		//ＫＥＹ＿世代登録年月日時分
		template.setNull(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * templateに対してECK0011A010の条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param inHash 設定条件
	 * @param svcKeiNo サービス契約番号
	 * @param requestParam アプリ固有のパラメータ
	 */
	private void mappingECK0011A010InMsg(CAANMsg template, HashMap<String, Object> inHash, String sysid)
	{

		//まずは全条件のNullマッピング
		fillCAANMSGNullMapping(template, new ECK0011A010CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010);

		//機能コード--お客様一意照会カレント検索
		template.set(ECK0011A010CBSMsg.FUNC_CODE, "2");

		// KEY_SYSID
		template.set(ECK0011A010CBSMsg.KEY_SYSID, sysid);
		
		// KEY_予約適用年月日
		template.set(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, opeDate);
		
		// KEY_世代登録年月日時分
		template.setNull(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM);
	}
	
	/**
	 * 持ちうるフィールドにNullマッピングで埋める
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		
		//要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			
			Object element = null;
			
			//キーに該当する箇所の取得
			element = contents[i][0];

			//Nullでマッピング
			msg.setNull((String)element);
			
		}
	}
	
	/**
	 * 条件部の共通する項目の設定
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	private void editBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
	}
	
	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * </pre>
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	private void editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Throwable 
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
	}
	
	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス
		int templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);

		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * EKK0081A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0081A010のテンプレートリスト
	 * @return EKK0081A010の結果部分
	 */
	private HashMap<String, Object> mappingEKK0081A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	/**
	 * EKK0081A010の結果をHashとして抽出する
	 * @param resultMsgs EKK0081A010のテンプレートリスト
	 * @return EKK0081A010の結果部分
	 */
	private HashMap<String, Object> mappingECK0011A010SCOutMsg(CAANMsg[] resultMsgs)
	{
		
		HashMap<String, Object> retHash = null;
		CAANMsg msg = null;
		CAANMsg[] msgList = null;
		
		//結果の抽出
		msg = resultMsgs[0];
		
		//結果の取得
		msgList = 
			(CAANMsg[])msg.getMsgData().get(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		retHash = msgList[0].getMsgData();
		
		return retHash;
	}
	
	private boolean chkKojin(String keishaTypeCd, String menberSbtCd)
	{
		boolean ret = false;

		if (this.KEISHA_TYPE_CD_1.equals(keishaTypeCd))
		{
			/********************************/
			/** 個人                       **/
			/********************************/
			ret = true;
		}
		else if (
				this.KEISHA_TYPE_CD_2.equals(keishaTypeCd)
				|| this.KEISHA_TYPE_CD_4.equals(keishaTypeCd)
		)
		{
			/********************************/
			/** 法人                       **/
			/** 自社利用                   **/
			/********************************/
			ret = false;
		}
		else if (this.KEISHA_TYPE_CD_3.equals(keishaTypeCd))
		{
			/********************************/
			/** 保守用                     **/
			/********************************/
			if (this.MENBER_SBT_CD_10.equals(menberSbtCd))
			{
				/********************************/
				/** マスター会員＜個人＞       **/
				/********************************/
				ret = true;
			}
			else if (
					this.MENBER_SBT_CD_00.equals(menberSbtCd)
					|| this.MENBER_SBT_CD_20.equals(menberSbtCd)
			)
			{
				/********************************/
				/** 非ｅｏ会員                 **/
				/** マスター会員＜法人＞       **/
				/********************************/
				ret = false;
			}
		}

		return ret;
	}
	
	/**
	 * お客様＜個人＞の更新処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @param contInfAddFlg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void updateCustKojin(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									HashMap<String, Object> eCK0011A010Hash,
									String bfMikstCd
									) throws Throwable
	{
		// お客様＜個人＞一意照会
		Object[][] eCK0021a010IN = getArraysDataECK0021A010(eCK0011A010Hash);
		
		CAANMsg eCK0021a010MsgData = callSC(handle, scCall, param, fixedText, eCK0021a010IN);

		HashMap custKojinMap = eCK0021a010MsgData.getCAANMsgList(ECK0021A010CBSMsg.ECK0021A010CBSMSG1LIST)[0].getHashMap();
		
		eCK0011A010Hash.putAll(custKojinMap);
		
		// お客様＜個人＞内容変更
		Object[][] eCK0021c010IN = getArraysDataECK0021C010(eCK0011A010Hash,bfMikstCd);
		
		CAANMsg eCK0021C010MsgData = callSC(handle, scCall, param, fixedText, eCK0021c010IN);
		
		// 更新年月日時分秒を格納
		Map workMap = (Map)param.getMappingWorkArea();
		
		HashMap workDataMap = new HashMap();
		
		workDataMap.put("work_upd_dtm", getNullToStr(eCK0021C010MsgData.getString(ECK0021C010CBSMsg.UPD_DTM)));
		
		workMap.put("WORK", workDataMap);
		
		param.setMappingWorkArea(workMap);
	}
	
	/**
	 * お客様＜法人＞の更新処理を行います。<br>
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @param scCall
	 * @param msgData
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void updateCustHojin(SessionHandle handle,
									IRequestParameterReadWrite param,
									String fixedText,
									ServiceComponentRequestInvoker scCall,
									HashMap<String, Object> eCK0011A010Hash,
									String bfMikstCd
									) throws Throwable
	{
		// お客様＜法人＞一意照会
		Object[][] eCK0031a010IN = getArraysDataECK0031A010(eCK0011A010Hash);
		
		CAANMsg eCK0031a010MsgData = callSC(handle, scCall, param, fixedText, eCK0031a010IN);
		
		HashMap custKojinMap = eCK0031a010MsgData.getCAANMsgList(ECK0031A010CBSMsg.ECK0031A010CBSMSG1LIST)[0].getHashMap();
		
		eCK0011A010Hash.putAll(custKojinMap);
		
		// お客様＜法人＞内容変更
		Object[][] eCK0031c010IN = getArraysDataECK0031C010(eCK0011A010Hash,bfMikstCd);
		
		CAANMsg eCK0031C010MsgData = callSC(handle, scCall, param, fixedText, eCK0031c010IN);
		
		// 更新年月日時分秒を格納
		Map workMap = (Map)param.getMappingWorkArea();
		
		HashMap workDataMap = new HashMap();
		
		workDataMap.put("work_upd_dtm", getNullToStr(eCK0031C010MsgData.getString(ECK0031C010CBSMsg.UPD_DTM)));
		
		workMap.put("WORK", workDataMap);
		
		param.setMappingWorkArea(workMap);
	}
	
	/**
	 * お客様＜個人＞一意照会サービスIFに格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @param msgData 
	 * @return Object[][]
	 */
	private Object[][] getArraysDataECK0021A010(HashMap<String, Object> eCK0011A010Hash)
	{
		String sysid = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.SYSID);
		
		String geneAddDtm = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.GENE_ADD_DTM);
		
		Object[][] arraysParam = {
				{ECK0021A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_ECK0021A010},
				{ECK0021A010CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1},
				{ECK0021A010CBSMsg.KEY_SYSID,        sysid},
				{ECK0021A010CBSMsg.KEY_GENE_ADD_DTM, geneAddDtm},
			};
		
		return arraysParam;
	}
	
	/**
	 * お客様＜法人＞一意照会サービスIFに格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @param msgData 
	 * @return Object[][]
	 */
	private Object[][] getArraysDataECK0031A010(HashMap<String, Object> eCK0011A010Hash)
	{
		String sysid = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.SYSID);
		
		String geneAddDtm = (String)eCK0011A010Hash.get(ECK0011A010CBSMsg1List.GENE_ADD_DTM);
		
		Object[][] arraysParam = {
				{ECK0031A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_ECK0031A010},
				{ECK0031A010CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1},
				{ECK0031A010CBSMsg.KEY_SYSID,        sysid},
				{ECK0031A010CBSMsg.KEY_GENE_ADD_DTM, geneAddDtm},
			};
		
		return arraysParam;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			if(!("0".equals(return_code.toString()) && 4 == status))
			{
				throw new SCCallException("戻り値不正", return_code.toString(), status);
			}
		}
		
		return msg;
	}
	

	/**
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)))
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
// OM-2015-0003406 エラーハンドリング見直し 2016/01/24 DEL START
//		HashMap<String, String> inMap = null;
//		
//		// ユーザデータ情報
//		inMap = (HashMap<String, String>)param.getData(dataMapKey);
//		
////		for (int i = 0; i <= mappingData.length; i++)
////		{
////				if (!template.isNull(mappingData[i][0] + "_err"))
////				{
////					if (!inMap.containsKey(mappingData[i][0] + "_err"))
////					{
////						inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
////					}
////				}
////		}
// OM-2015-0003406 エラーハンドリング見直し 2016/01/24 DEL END
		
		return param;
	}
	
	/**
	 * お客様＜個人＞内容変更サービスIFに格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @param contInfAddFlg
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataECK0021C010(HashMap custMap, String bfMikstCd)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(custMap, TEMPLATE_ID_ECK0021C010);
		
		// 画面からの入力項目等を上書きする。
		map.put(ECK0021C010CBSMsg.FUNC_CODE,               JPCModelConstant.FUNC_CD_1);
		map.put(ECK0021C010CBSMsg.SYSID,                   (String)custMap.get(ECK0011A010CBSMsg1List.SYSID));
		map.put(ECK0021C010CBSMsg.UPD_DTM_BF,              (String)custMap.get(ECK0011A010CBSMsg1List.LAST_UPD_DTM));
		map.put(ECK0021C010CBSMsg.RSV_APLY_YMD,            opeDate);
		map.put(ECK0021C010CBSMsg.MMB_ISP_KSSAI_STAT_CD,   bfMikstCd);

		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, ECK0021C010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0021C010);
		
		return arraysParam;
	}
	
	/**
	 * お客様＜法人＞内容変更サービスIFに格納するデータ群の組み立て<br>
	 * <br>
	 * @param ccMsg
	 * @param custMap
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysDataECK0031C010(HashMap custMap, String bfMikstCd)
	{
		// 検索してきた値を更新用のパラメータに格納
		HashMap map = getInputMap(custMap, TEMPLATE_ID_ECK0031C010);
		
		// 画面からの入力項目等を上書きする。
		map.put(ECK0031C010CBSMsg.FUNC_CODE,               JPCModelConstant.FUNC_CD_1);
		map.put(ECK0031C010CBSMsg.SYSID,                   (String)custMap.get(ECK0011A010CBSMsg1List.SYSID));
		map.put(ECK0031C010CBSMsg.UPD_DTM_BF,              (String)custMap.get(ECK0011A010CBSMsg1List.LAST_UPD_DTM));
		map.put(ECK0031C010CBSMsg.RSV_APLY_YMD,            opeDate);
		map.put(ECK0031C010CBSMsg.MMB_ISP_KSSAI_STAT_CD,   bfMikstCd);

		// 更新用のHashMapを二次元配列に格納
		Object[][] arraysParam = getArraysParam(map, ECK0031C010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0031C010);
		
		return arraysParam;
	}
	
	/**
	 * 検索してきた項目を更新用の項目に格納します。
	 * @param custMap
	 * @param svcIf
	 * @return HashMap<String, String>
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, String> getInputMap(HashMap<String, String> custMap, String svcIf)
	{
		CAANMsg inMsg = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		HashMap<String, String> map = new HashMap<String, String>();
		
		Iterator<String> ite = inMsg.getSchema().getSchemaKeySet().iterator();
		while (ite.hasNext())
		{
			String key = (String)ite.next();
			
			if(key.endsWith("_err"))
			{
				
				String tmpKey = key.substring(0, key.length() - 4);
				
				if(custMap.containsKey(tmpKey))
				{
					
					map.put(tmpKey, custMap.get(tmpKey));
					
				}
			}
		}
		return map;
	}
	
	/**
	 * 更新用のHashMapを二次元配列に格納します。
	 * @param map
	 * @param paramKey
	 * @param templateId
	 * @return Object[][]
	 */
	@SuppressWarnings("unchecked")
	private Object[][] getArraysParam(HashMap<String, String> map, String paramKey, String templateId)
	{
		// 先頭の要素にはTemplateIDを格納するため要素をひとつ多く生成しておく。
		Object[][] arraysParam = new Object[map.size() + 1][2];
		
		// TemplateIDを格納
		arraysParam[0][0] = paramKey;
		arraysParam[0][1] = templateId;
		
		// 更新用のHashMapを二次元配列に格納
		Iterator iter = map.keySet().iterator();
		int i = 1;
		while (iter.hasNext())
		{
			String key = (String)iter.next();
			
			arraysParam[i][0] = key;
			arraysParam[i][1] = map.get(key);
			
			i++;
			
		}
		return arraysParam;
	}
	
	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null || "".equals(str.trim()))
		{
			return "";
		}
		return str;
	}

}