/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCreditInfoSearchCC
*	ソースファイル名：JKKCreditInfoSearchCC.java
*	作成者			：Fujitsu
*	日付			：2015年10月28日
*＜機能概要＞
*	金融機関検索の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v20.00.00    2015/11/24   FJ）原田    新規作成
*   v20.00.01    2015/11/29   FJ）原田    【IT1-2015-0000135】ページングの実現
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
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.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.EKK0511B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0511B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0531B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0531B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0010002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0010002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171A010CBSMsg1List;
import eo.ejb.common.JKKejbPagingUtil;



/**
 * クレジットカード情報一覧を抽出します。<p>
 * <BR>
 * @author 富士通
 */
public class JKKCreditInfoSearchCC extends AbstractCommonComponent
{
	private static final String TEMPLATE_ID_EKKA0010002 = "EKKA0010002";
	private static final String TEMPLATE_ID_EZM0171A010 = "EZM0171A010";
	/** 会員種別：コンシューマ */
	protected static final String MEMBERBUNRUI_CONSUMER = "1";
	/** 会員種別：コンテンツ */
	protected static final String MEMBERBUNRUI_CONTENTS = "2";
	/** 会員種別：法人 */
	protected static final String MEMBERBUNRUI_HOUJIN = "3";
	/** 会員種別名：コンシューマ */
	protected static final String NAME_CONSUMER = "コンシューマ";
	/** 会員種別：コンテンツ */
	protected static final String NAME_CONTENTS = "コンテンツ";
	/** 会員種別：法人 */
	protected static final String NAME_HOUJIN = "法人";
	/** 会員分類コード */
	private static final String MEMBERBUNRUI_CODE = "CD01679";
	/** 文字編集：- */
	private static final String HYPHEN = "-";
	
	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	public IRequestParameterReadWrite searchList(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Exception{
		String dataMapKey = fixedText;
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);
		Object AUTH_PTERN = ccMsg.get("auth_ptern");
		Object resultCd = "000";

		// リクエストパラメータを引数に上りマッピング処理メソッドを実行
		//権限の判定（判定の仕方は未定）
		if(AUTH_PTERN.equals("1") ) {
			// ◇ SC呼出実行
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			///////////////////////////////
			// 法人情報の取得
			///////////////////////////////
			// EKKA0010002（クレジットカード情報一覧照会）実行
			CAANMsg msgHoujin = callSC(handle, scCall, param,dataMapKey, MEMBERBUNRUI_HOUJIN);
			CAANMsg[] result_Houjin = msgHoujin.getCAANMsgList(EKKA0010002CBSMsg.EKKA0010002CBSMSG1LIST);
			Object strResultCd = msgHoujin.getString(EKKA0010002CBSMsg.RESULT_CD);
			if(!"000".equals(strResultCd))
			{
				resultCd = strResultCd;
			}
			
			// EZM0171A010CBSMsg（コード名称管理一意照会）実行
			CAANMsg[] result_member_bunrui_houjin 
						= callSC_memberCode(handle, scCall, param,dataMapKey, MEMBERBUNRUI_HOUJIN).getCAANMsgList(EZM0171A010CBSMsg.EZM0171A010CBSMSG1LIST);
			// 会員分類コードの取得
			String memberBunrui_houjin = "";
			if (result_member_bunrui_houjin != null && result_member_bunrui_houjin.length >0)
			{
				memberBunrui_houjin = result_member_bunrui_houjin[0].getString(EZM0171A010CBSMsg1List.CD_DIV_NM);
			}
			
			// 業務データ設定
			ccMsg = (HashMap<String, Object>)param.getData("KKSV082801CC");
			if (ccMsg == null){
				ccMsg = new HashMap<String, Object>();
				param.setData("KKSV082801CC", ccMsg);
			}
			setInfo(result_Houjin, ccMsg, memberBunrui_houjin);
		}
		else if(AUTH_PTERN.equals("2")) {
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			///////////////////////////////
			// コンシューマ情報の取得
			///////////////////////////////
			// EKKA0010002（クレジットカード情報一覧照会）実行
			CAANMsg msgConsumer = callSC(handle, scCall, param,dataMapKey, MEMBERBUNRUI_CONSUMER);
			CAANMsg[] result_consumer = msgConsumer.getCAANMsgList(EKKA0010002CBSMsg.EKKA0010002CBSMSG1LIST);
			Object strResultCd = msgConsumer.getString(EKKA0010002CBSMsg.RESULT_CD);
			if(!"000".equals(strResultCd))
			{
				resultCd = strResultCd;
			}
			// EZM0171A010CBSMsg（コード名称管理一意照会）実行
			CAANMsg[] result_member_bunrui_consumer 
						= callSC_memberCode(handle, scCall, param,dataMapKey, MEMBERBUNRUI_CONSUMER).getCAANMsgList(EZM0171A010CBSMsg.EZM0171A010CBSMSG1LIST);
			// 会員分類コードの取得
			String memberBunrui_consumer = "";
			if (result_member_bunrui_consumer != null && result_member_bunrui_consumer.length >0)
			{
				memberBunrui_consumer = result_member_bunrui_consumer[0].getString(EZM0171A010CBSMsg1List.CD_DIV_NM);
			}
			
			// 業務データ設定
			ccMsg = (HashMap<String, Object>)param.getData("KKSV082801CC");
			if (ccMsg == null){
				ccMsg = new HashMap<String, Object>();
				param.setData("KKSV082801CC", ccMsg);
			}
			setInfo(result_consumer, ccMsg, memberBunrui_consumer);

			///////////////////////////////
			// コンテンツ情報の取得
			///////////////////////////////
			// EKKA0010002（クレジットカード情報一覧照会）実行
			CAANMsg msgContents = callSC(handle, scCall, param,dataMapKey, MEMBERBUNRUI_CONTENTS);
			CAANMsg[] result_contents = msgContents.getCAANMsgList(EKKA0010002CBSMsg.EKKA0010002CBSMSG1LIST);
			strResultCd = msgContents.getString(EKKA0010002CBSMsg.RESULT_CD);
			if(!"000".equals(strResultCd))
			{
				resultCd = strResultCd;
			}
			// EZM0171A010CBSMsg（コード名称管理一意照会）実行
			CAANMsg[] result_member_bunrui_contents 
						= callSC_memberCode(handle, scCall, param,dataMapKey, MEMBERBUNRUI_CONTENTS).getCAANMsgList(EZM0171A010CBSMsg.EZM0171A010CBSMSG1LIST);
			// 会員分類コードの取得
			String memberBunrui_contents = "";
			if (result_member_bunrui_contents != null && result_member_bunrui_contents.length >0)
			{
				memberBunrui_contents = result_member_bunrui_contents[0].getString(EZM0171A010CBSMsg1List.CD_DIV_NM);
			}
			
			// 業務データ設定
			ccMsg = (HashMap<String, Object>)param.getData("KKSV082801CC");
			if (ccMsg == null){
				ccMsg = new HashMap<String, Object>();
				param.setData("KKSV082801CC", ccMsg);
			}
			setInfo(result_contents, ccMsg, memberBunrui_contents);
			
		}

		// 結果コードの取得
		ccMsg.put(EKKA0010002CBSMsg.RESULT_CD, resultCd);
		
		// 結果を詰めるマップを取得
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		// 業務データ設定
		param.setData("KKSV082801CC", ccMsg);
		
// IT1-2015-0000135 2015/11/29 DEL START
//		// ページリンクの設定
//		// 検索結果総数
//		ArrayList<HashMap<String, Object>> list = (ArrayList<HashMap<String, Object>>)ccMsg.get("record");
//		Long DataCount = Long.valueOf(0);
//		if(list != null)
//		{
//			DataCount = Long.parseLong(list.size() + "");
//		}
//		// 1ページ当たりの表示件数
//		String aaa = (String)((HashMap<String, Object>)param.getData("KKSV082801CC")).get("display_num");
//		Long DispNum = Long.parseLong(aaa);
// IT1-2015-0000135 2015/11/29 DEL END
// IT1-2015-0000135 2015/11/29 ADD START 
		// ページリンクの設定
		// 検索結果総数
		List<HashMap<String, Object>> retList = new ArrayList<HashMap<String, Object>>();
		retList = (ArrayList<HashMap<String, Object>>)ccMsg.get("record");
		Long DataCount = Long.valueOf(0);
		if(retList != null)
		{
			DataCount = Long.parseLong(retList.size() + "");
		}
		// 1ページ当たりの表示件数
		String viewNum = (String)((HashMap<String, Object>)param.getData("KKSV082801CC")).get("display_num");
		Long DispNum = Long.parseLong(viewNum);
// IT1-2015-0000135 2015/11/29 ADD END
		// 総ページ数
		String strMaxPage = JKKejbPagingUtil.calcTotalPage(DataCount, DispNum);
		// リターンコード取得
		Object return_code = ccMsg.get(JCMConstants.RET_CD_INT_KEY);
		
// IT1-2015-0000135 2015/11/29 ADD START
	// ※※※※※※※※※※※独自ページング処理開始※※※※※※※※※※※※※
	// ※-------------------------検索結果総数のソート START--------------------------※
		// 検索結果表示用リスト
		List<HashMap<String, Object>> retViewList = new ArrayList<HashMap<String, Object>>();
		if (retList != null ) {
			// カード預りIDの昇順で並び替える。
			sortList(retList);
	// ※-------------------------検索結果総数のソート END----------------------------※
			
	// ※-------------------------初期化／データ指定部 START--------------------------※
			// 表示件数（1ページ最大件数）
			int dispIntNum = Integer.parseInt(viewNum);
			// 表示したいページのページ番号
			String displayPageNum = (String)((HashMap<String, Object>)param.getData("KKSV082801CC")).get("display_page_num");
			// 表示したいページのページ番号（内部処理用）
			int dispPageApUseNum = Integer.parseInt(displayPageNum) - 1;
	// ※-------------------------初期化／データ指定部 END----------------------------※
			
	// ※-------------------------画面表示レコード指定／出力用リストの編集 START--------------------------※
			// 検索結果総数＜＝表示件数1ページ最大件数）
			if (retList.size() <= dispIntNum)
			{
				// 表示開始・終了を意識せずに索結果表示用リストに格納
				for (HashMap<String, Object>eKKA0010002hash: retList) {
					retViewList.add(eKKA0010002hash);
				}
			}
			// 検索結果総数＞表示件数1ページ最大件数）
			else
			{
				// 表示したいページのページ番号（内部処理用）が「０」の場合（１ページ目／初回表示の場合）
				if (dispPageApUseNum == 0)
				{
					// 初回／１ページ目の最大件数のみ「検索結果表示用リスト」に詰める
					for (int pageNum = 0; pageNum < dispIntNum; pageNum ++) {
						retViewList.add((HashMap<String, Object>)retList.get(pageNum));
					}
				}
				else {
					// 繰り返し開始点算出(初期化)
					int StartInt = 0;
					// 繰り返し終了点算出（初期化）
					int EndInt = 0;
					
					// 開始基準は表示したいページのページ番号（内部処理用）×1ページ最大件数
					StartInt = dispPageApUseNum * dispIntNum;
					// 終了点基準
					// 開始点＋１ページ最大件数　＞＝　検索結果の総数
					if ((int)(StartInt+dispIntNum) >= retList.size()) {
						// 終了点基準に検索結果の総数を代入
						EndInt = (int)retList.size();
					}
					// 開始点＋１ページ最大件数　＜　検索結果の総数
					else {
						// 終了点基準に開始点＋１ページ最大件数を代入
						EndInt = (int)(StartInt+dispIntNum);
					}
					// 開始点をセットし、終了点をセットする
					for (int pageNum2 = StartInt; pageNum2 < EndInt; pageNum2 ++) {
						retViewList.add((HashMap<String, Object>)retList.get(pageNum2));
					}
				}
			}
		}
		else
		{
			// 検索結果０件時のNULL回避
			retViewList = retList;
		}
// ※-------------------------画面表示レコード指定／出力用リストの編集 END----------------------------※
// IT1-2015-0000135 2015/11/29 ADD END
		dataMap = (HashMap<String, Object>)param.getData("KKSV082801CC");
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
		}
// IT1-2015-0000135 2015/11/29 ADD START
// ※-------------------------戻り値再設定 START----------------------------※
		// 画面よりページングの要素数を取得し、画面に別名リスト
		// （eKKA0010002HashList/表示したい件数のレコードのみ）を用意し
		// "record"からデータを特定・編集してセットする。
		dataMap.put("eKKA0010002HashList", retViewList);
// ※-------------------------戻り値再設定 END------------------------------※
// ※※※※※※※※※※※独自ページング処理終了※※※※※※※※※※※※※
// IT1-2015-0000135 2015/11/29 ADD END
		// 検索系 共通部
		dataMap.put(EKKA0010002CBSMsg.DISPLAY_NUM, DispNum);
		dataMap.put(EKKA0010002CBSMsg.TOTAL_SEARCH_NUM, DataCount);
		dataMap.put(EKKA0010002CBSMsg.TOTAL_PAGE_NUM, strMaxPage);
		param.setData("KKSV082801CC", dataMap);
		
		return param;
		}
	
	/**
	 * IRequestParameterReadWriteにエラー情報をマッピングする。<br>
	 * <br>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
													CAANMsg[] templates,
													int returnCode,
													String fixedText)
	throws RequestParameterException
	{
		for (int i = 0; i < templates.length; i++)
		{
			editErrorInfoCom(param, templates, returnCode, fixedText);
		}
		return param;
	}
	
	/**
	 * @param param
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 * 検索をかけるときのデータ設定
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, String memberBunruiCd) 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));
	
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData("KKSV082801CC");
	
		CAANMsg template = new CAANMsg(EKKA0010002CBSMsg.class.getName());
	
		// テンプレートID
		template.set(EKKA0010002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0010002);
	
		template.set(EKKA0010002CBSMsg.FUNC_CODE, "1");
	
		// オペレータ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);
	
		// 検索処理パターン
		if (inMap == null || inMap.get("search_type") == null || "".equals(inMap.get("search_type"))){
			template.setNull(EKKA0010002CBSMsg.SEARCH_TYPE);
		}
		else{
			template.set(EKKA0010002CBSMsg.SEARCH_TYPE, (String)inMap.get("search_type"));
		}
	
		// 最大検索件数
		if (inMap == null || inMap.get("max_search_num") == null || "".equals(inMap.get("max_search_num"))){
			template.setNull(EKKA0010002CBSMsg.MAX_SEARCH_NUM);
		}
		else{
			template.set(EKKA0010002CBSMsg.MAX_SEARCH_NUM, (String)inMap.get("max_search_num"));
		}
	
		// 表示件数
		if (inMap == null || inMap.get("display_num") == null || "".equals(inMap.get("display_num"))){
			template.setNull(EKKA0010002CBSMsg.DISPLAY_NUM);
		}
		else{
			template.set(EKKA0010002CBSMsg.DISPLAY_NUM, (String)inMap.get("display_num"));
		}
	
		// 表示ページ番号
		if (inMap == null || inMap.get("display_page_num") == null || "".equals(inMap.get("display_page_num"))){
			template.setNull(EKKA0010002CBSMsg.DISPLAY_PAGE_NUM);
		}
		else{
			template.set(EKKA0010002CBSMsg.DISPLAY_PAGE_NUM, (String)inMap.get("display_page_num"));
		}
	
		// 検索エラーフラグ
		if (inMap == null || inMap.get("search_err_flg") == null || "".equals(inMap.get("search_err_flg"))){
			template.setNull(EKKA0010002CBSMsg.SEARCH_ERR_FLG);
		}
		else{
			template.set(EKKA0010002CBSMsg.SEARCH_ERR_FLG, (String)inMap.get("search_err_flg"));
		}
	
		// ◇ 業務データの設定
		//コマンドタイプ
		template.set(EKKA0010002CBSMsg.CMD, (String)"SAVEINFO");
		
		if(MEMBERBUNRUI_HOUJIN.equals(memberBunruiCd)) {
			//システム接続設定番号
			template.set(EKKA0010002CBSMsg.CONNECT_NO, JCCBPCommon.getApplicationConst("CLARIS_CONNECT_NO"));
			
			//接続キー
			template.set(EKKA0010002CBSMsg.CONNECT_KEY, JCCBPCommon.getApplicationConst("CLARIS_CONNECT_KEY"));
			
			//グループコード
			template.set(EKKA0010002CBSMsg.COMP_CD, JCCBPCommon.getApplicationConst("CLARIS_COMP_CD"));
			
			//事業者コード
			template.set(EKKA0010002CBSMsg.SHOP_CD, JCCBPCommon.getApplicationConst("CLARIS_SHOP_CD"));
		}
		else if(MEMBERBUNRUI_CONTENTS.equals(memberBunruiCd)) {
			template.set(EKKA0010002CBSMsg.CONNECT_NO, JCCBPCommon.getApplicationConst("CN_CONNECT_NO"));
			
			//接続キー
			template.set(EKKA0010002CBSMsg.CONNECT_KEY, JCCBPCommon.getApplicationConst("CN_CONNECT_KEY"));
			
			//グループコード
			template.set(EKKA0010002CBSMsg.COMP_CD, JCCBPCommon.getApplicationConst("CN_COMP_CD"));
			
			//事業者コード
			template.set(EKKA0010002CBSMsg.SHOP_CD, JCCBPCommon.getApplicationConst("CN_SHOP_CD"));
		}
		else if(MEMBERBUNRUI_CONSUMER.equals(memberBunruiCd)) {
			template.set(EKKA0010002CBSMsg.CONNECT_NO, JCCBPCommon.getApplicationConst("KK_CONNECT_NO"));
			
			//接続キー
			template.set(EKKA0010002CBSMsg.CONNECT_KEY, JCCBPCommon.getApplicationConst("KK_CONNECT_KEY"));
			
			//グループコード
			template.set(EKKA0010002CBSMsg.COMP_CD, JCCBPCommon.getApplicationConst("KK_COMP_CD"));
			
			//事業者コード
			template.set(EKKA0010002CBSMsg.SHOP_CD, JCCBPCommon.getApplicationConst("KK_SHOP_CD"));
		}
		//会員分類
		template.set(EKKA0010002CBSMsg.MEMBER_BUNRUI, memberBunruiCd);
		
		//IPアドレス
		template.set(EKKA0010002CBSMsg.IP_ADDRESS, "");
		
		// クレジットカード情報一覧照会マップ.照会フラグ → 照会フラグ 1:カード預り情報,2:生カード情報
		if (inMap == null || inMap.get("key_inq_card") == null || "".equals(inMap.get("key_inq_card"))) {
			template.setNull(EKKA0010002CBSMsg.INQ_CARD);
		} 
		else {
			template.set(EKKA0010002CBSMsg.INQ_CARD, (String)inMap.get("key_inq_card"));
		}
		
		// クレジットカード情報一覧照会マップ.カード番号 → カード番号
		if (inMap == null
				|| inMap.get("key_credit_card_no1") == null
				|| inMap.get("key_credit_card_no2") == null
				|| inMap.get("key_credit_card_no3") == null
				|| inMap.get("key_credit_card_no4") == null
				|| "".equals(inMap.get("key_credit_card_no1"))
				|| "".equals(inMap.get("key_credit_card_no2"))
				|| "".equals(inMap.get("key_credit_card_no3"))
				|| "".equals(inMap.get("key_credit_card_no4"))) {
			template.setNull(EKKA0010002CBSMsg.CARD_CD);
		} 
		else {
			// クレジットカード番号の結合
			String card_cd_1 = (String)inMap.get("key_credit_card_no1");
			String card_cd_2 = (String)inMap.get("key_credit_card_no2");
			String card_cd_3 = (String)inMap.get("key_credit_card_no3");
			String card_cd_4 = (String)inMap.get("key_credit_card_no4");
			
			StringBuffer buf = new StringBuffer();
			buf.append(card_cd_1);
			buf.append(card_cd_2);
			buf.append(card_cd_3);
			buf.append(card_cd_4);
			String card_cd = buf.toString();
			
			template.set(EKKA0010002CBSMsg.CARD_CD, card_cd);
		}
	
		// クレジットカード情報一覧照会マップ.カード預りID → カード預りID
		if (inMap == null || inMap.get("key_save_id") == null || "".equals(inMap.get("key_save_id"))) {
			template.setNull(EKKA0010002CBSMsg.SAVE_ID);
		} 
		else {
			template.set(EKKA0010002CBSMsg.SAVE_ID, (String)inMap.get("key_save_id"));
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
	
		return paramMap;
	}
	
	/**
	 * @param param
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 * 検索をかけるときのデータ設定
	 */
	private HashMap<String, Object> editforCodeName(IRequestParameterReadWrite param, String memberBunruiCd) throws RequestParameterException{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		CAANMsg template = new CAANMsg(EZM0171A010CBSMsg.class.getName());
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));

		// テンプレートID
		template.set(EZM0171A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0171A010);

		// 機能コード:"1"
		template.set(EZM0171A010CBSMsg.FUNC_CODE, "1");

		// オペレータ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);

		// 会員分類コード
		template.set (EZM0171A010CBSMsg.KEY_CD_SBT_CD, MEMBERBUNRUI_CODE);
		
		// 会員種別
		template.set (EZM0171A010CBSMsg.KEY_CD_DIV, memberBunruiCd);
		
		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
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 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);
		}
		return param;
	}
	
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							String memberBunruiCd) throws Exception{
		HashMap<String, Object> paramMap = editInMsg(param, memberBunruiCd);
		
		CAANMsg[] templates = new CAANMsg[1];
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null){
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		return msg;
	}
	
	@SuppressWarnings("unchecked")
	private CAANMsg callSC_memberCode(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							String memberBunruiCd) throws Exception{
		HashMap<String, Object> paramMap = editforCodeName(param, memberBunruiCd);
		
		CAANMsg[] templates = new CAANMsg[1];
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null){
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		return msg;
	}


	/**
	 * サービスＩＦ処理結果をもとにマッピングする。
	 * 
	 * @param msgList
	 * @param ccMsg
	 */
	private void setInfo(CAANMsg[] msgList, HashMap<String, Object> ccMsg, String memberBunrui){
		// データが存在する場合
		if (msgList != null && msgList.length > 0){
			ArrayList<HashMap<String, Object>> dataList = (ArrayList<HashMap<String, Object>>)ccMsg.get("record");
			if(dataList == null)
			{
				dataList = new ArrayList<HashMap<String, Object>>();
			}
			
			for (int i = 0; i < msgList.length;i++ ){
				HashMap<String, Object> setMap = new HashMap<String, Object>();
				
//				// 結果コード
//				String result_cd = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.RESULT_CD));
//				setMap.put("result_cd", result_cd);
//				// 詳細コード
//				String result_info_cd = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.RESULT_INFO_CD));
//				setMap.put("result_info_cd", result_info_cd);
//				// エラーコード
//				String err_cd = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.ERR_CD));
//				setMap.put("err_cd", err_cd);
//				// 預かり状態 1:有効カード,2:無効カード,3:該当なし
//				String save_status = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.SAVE_STATUS));
//				if (save_status.equals("1")){
//					setMap.put("save_status", "有効カード");
//				}	
//				else if (save_status.equals("2")){
//					setMap.put("save_status", "無効カード");
//				}
//				else if (save_status.equals("3")){
//					setMap.put("save_status", "該当なし");
//				}
//				// カード情報
//				String card_no = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.CARD_NO));
//				setMap.put("card_no", card_no);
				// カード預りID
				String save_id = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.SAVE_ID));
				setMap.put("save_id", save_id);
//				// カードブランド 01:VISA,02:MasterCard,03:JCB,04:AMEX,05:Diners,
//				String card_brand_cd = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.CARD_BRAND_CD));
//				if(card_brand_cd.equals("01")){
//					setMap.put("card_brand_cd", "VISA");
//				}
//				else if(card_brand_cd.equals("02")){
//					setMap.put("card_brand_cd", "MasterCard");
//				}
//				else if(card_brand_cd.equals("03")){
//					setMap.put("card_brand_cd", "JCB");
//				}
//				else if(card_brand_cd.equals("04")){
//					setMap.put("card_brand_cd", "AMEX");
//				}
//				else if(card_brand_cd.equals("05")){
//					setMap.put("card_brand_cd", "Diners");
//				}
				// カード番号
				String sub_card_cd = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.CARD_CD));
				String card_cd_1 = sub_card_cd.substring(0,4);
				String card_cd_2 = sub_card_cd.substring(4,8);
				String card_cd_3 = sub_card_cd.substring(8,12);
				String card_cd_4 = sub_card_cd.substring(12);
				
				StringBuffer disp_card_cd = new StringBuffer();
				disp_card_cd.append(card_cd_1);
				disp_card_cd.append(HYPHEN);
				disp_card_cd.append(card_cd_2);
				disp_card_cd.append(HYPHEN);
				disp_card_cd.append(card_cd_3);
				disp_card_cd.append(HYPHEN);
				disp_card_cd.append(card_cd_4);
				String card_cd = disp_card_cd.toString();
				
				setMap.put("card_cd", card_cd);
				// カード有効期限
				String card_exp_date = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.CARD_EXP_DATE));
				setMap.put("card_exp_date", card_exp_date);
//				// カード名義人
//				String card_user_name = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.CARD_USER_NAME));
//				setMap.put("card_user_name", card_user_name);
//				// 決済タイプ 1:通常決済,2:継続課金決済
//				String settle_type = getNullToStr(msgList[i].getString(EKKA0010002CBSMsg1List.SETTLE_TYPE));
//				if(settle_type.equals("1")){
//					setMap.put("settle_type", "通常決済");
//				}
//				else if(settle_type.equals("2")){
//					setMap.put("settle_type", "継続課金決済");
//				}
				// 会員分類
				setMap.put("member_bunrui", memberBunrui);
				
				
				dataList.add(setMap);
			}
			ccMsg.put("record", dataList);
		}
	}

	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str){
		if (str == null || "".equals(str.trim())){
			return "";
		}
		return str;
	}
	
// IT1-2015-0000135 2015/11/29 ADD START	
	/**
	 * 検索結果のｓ独自ソート(カード預りID（昇順）)
	 * <br>
	 * @param sortList
	 */
	private void sortList(List sortList)
	{

		// カード預りID（昇順）で並び替える。
		Collections.sort(sortList, new Comparator<Map<String, String>>()
		{

			/**
			 *検索結果の並び替え
			 * 
			 * <br>
			 * 検索結果をカード預りID（昇順）で並び替えます。
			 * @param map1 検索結果の明細が格納されているMap
			 * @param map2 検索結果の明細が格納されているMap
			 * @return 比較結果
			 */
			@Override
			public int compare(Map<String, String> map1, Map<String, String> map2)
			{
				// オプションサービス契約番号で並び替える(昇順)
				int result = map1.get("save_id").compareTo(map2.get("save_id"));
				if (result != 0)
				{
					// 同一でない場合は、並び替える
					return result;
				}

				return 0;
			}

		});

	}
// IT1-2015-0000135 2015/11/29 ADD END
}
