/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKAddSvcPaywayCC
 *   ソースファイル名：JKKAddSvcPaywayCC.java
 *   作成者          ：富士通
 *   日付            ：2011年06月03日
 *＜機能概要＞
 *   登録部品
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/06/03   FJ）山川    新規作成
 *   v1.00.00    2011/10/11   FJ）関      処理修正
 *   v4.00.00    2012/06/26   FJ) 佐藤    【ANK-0398-00-00】「例外登録」の管理追加
 *   v4.00.00    2012/07/13   FJ) 多田(真)【ANK-0398-00-00】「例外登録」の管理追加
 *   v4.00.00    2012/09/06   FJ）多田(真)【課題-165／262／KAD-2012-122】オーソリバッチ化。オンラインでの作成分をバッチへ変更
 *   v4.01.00    2012/10/31   FJ）多田    【IT1-2012-0001640】住所手動入力対応
 *   v5.00.00    2013/04/26   FJ) 中山    【TAI-2013-0000025】Findbugsの指摘修正
 *   v11.00.00   2014/11/28   FJ) 川島    【OM-2014-0003751】
 *   v20.00.00   2015/11/17   FJ) 澤田    【ANK-2565-00-00】クレジットカード番号預かりサービス導入（step3：預かり番号化
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.KKSV0354_KKSV0354OP_KKSV035401CC;
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.CCException;
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.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0491D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501C080CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0521D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0521D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0531A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0531A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1031D010CBSMsg;

/**
 * 支払方法登録チェックを行う。
 * <br>
 * @author 富士通
 */
public class JKKAddSvcPaywayCC extends AbstractCommonComponent
{

	/** 作業マップ名：請求オプションサービス契約 */
	private static final String CC_WORK_AREA_APLY_SEIOPSVC_KEI  = "JKKAplySeiopsvcKeiCC";

	/**
	 * 入力チェックメイン処理
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccName ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite checkMain(SessionHandle handle, IRequestParameterReadWrite param, String ccName) throws Throwable
	{
		// エラーフラグ(実行判定用)
		String errFlgCc = "0";

		Map<?, ?> result = null;
		String seikyWayCd = null;

		// 下りユーザデータ
		Map resUserMap = new HashMap();

		/***************************************************/
		/** 入力パラメータの取得                           */
		/***************************************************/
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		seikyWayCd = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SEIKY_WAY_CD);

		// 請求方法コードが 預金口座振替 または 郵便自動振込 の場合
		if (JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(seikyWayCd) || JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(seikyWayCd))
		{
			/***************************************************/
			/** 口座登録チェック                               */
			/***************************************************/
			result = callAddKozaSc(handle, param, "2", ccName);
			if (JKKBpCommon.isSuccess(result))
			{
				// 処理なし
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}
		// 請求方法コードが クレジット の場合
		else if (JKKStrConst.SEIKY_WAY_CD_CREDIT.equals(seikyWayCd))
		{
			/***************************************************/
			/** クレジットカード登録チェック                   */
			/***************************************************/
			result = callAddCreditSc(handle, param, "2", ccName);
			if (JKKBpCommon.isSuccess(result))
			{
				// 処理なし
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}

		/***************************************************/
		/** 請求契約登録チェック                           */
		/***************************************************/
		result = callAddSeikyKeiSc(handle, param, "2", ccName, null);
		if (JKKBpCommon.isSuccess(result))
		{
			// 処理なし
		}
		else
		{
			errFlgCc = "1";
			JKKBpCommon.setResultCtrlData(param, result);
		}

		/***************************************************/
		/** 下りユーザデータマッピング処理開始             */
		/***************************************************/
		JKKBpCommon.setResultUserData(param, ccName, resUserMap);
		if ("0".equals(errFlgCc))
		{
			JKKBpCommon.setResultCtrlData(param, result, ccName , 0, 0);
		}
		else
		{
			String errMsg = "支払方法登録チェックCCで例外が発生しました";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * 登録メイン処理
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccName ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite addMain(SessionHandle handle, IRequestParameterReadWrite param, String ccName) throws Throwable
	{
		// マップに値が設定されていない場合は処理を行わない。
		if (param.getData(ccName) == null)
		{
			return param;
		}

		// エラーフラグ(実行判定用)
		String errFlgCc = "0";

		Map<?, ?> result = null;
		String seikyWayCd = null;

		// 下りユーザデータ
		Map resUserMap = new HashMap();

		/***************************************************/
		/** 入力パラメータの取得                           */
		/***************************************************/
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		seikyWayCd = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SEIKY_WAY_CD);
		
		String seikyWayNo = null;
		String seikyKeiNo = null;
		String seikyKeiGeneAddDtm = null;
		String crecardGeneAddDtm = null;
		List eKK0531A010List = new ArrayList<Map<?, ?>>();

		// 請求方法コードが 預金口座振替 または 郵便自動振込 の場合
		if (JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(seikyWayCd) || JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(seikyWayCd))
		{
			/***************************************************/
			/** 口座登録                                       */
			/***************************************************/
			result = callAddKozaSc(handle, param, "1", ccName);
			if (JKKBpCommon.isSuccess(result))
			{
				seikyWayNo = JKKBpCommon.getResultString(result, EKK0501D010CBSMsg.SEIKY_WAY_NO_KOZA);
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}
		// 請求方法コードが クレジット の場合
		else if (JKKStrConst.SEIKY_WAY_CD_CREDIT.equals(seikyWayCd))
		{
			/***************************************************/
			/** クレジットカード登録                           */
			/***************************************************/
			//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 mod start ++++++++++++++++ //
//			result = callAddCreditSc(handle, param, "1", ccName);
			result = callAddCreditSinsaSc(handle, param, "1", ccName);
			//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 mod end   ++++++++++++++++ //
			if (JKKBpCommon.isSuccess(result))
			{
				//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 mod start ++++++++++++++++ //
				//seikyWayNo = JKKBpCommon.getResultString(result, EKK0521D010CBSMsg.SEIKY_WAY_NO_CRECARD);
				//crecardGeneAddDtm = JKKBpCommon.getResultString(result, EKK0521D010CBSMsg.GENE_ADD_DTM);
				seikyWayNo = JKKBpCommon.getResultString(result, EKK0521D020CBSMsg.SEIKY_WAY_NO_CRECARD);
				crecardGeneAddDtm = JKKBpCommon.getResultString(result, EKK0521D020CBSMsg.GENE_ADD_DTM);
				//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 mod end   ++++++++++++++++ //
			}
			else
			{
				errFlgCc = "1";
				JKKBpCommon.setResultCtrlData(param, result);
			}
		}

		/***************************************************/
		/** 請求契約登録                                   */
		/***************************************************/
		result = callAddSeikyKeiSc(handle, param, "1", ccName, seikyWayNo);
		if (JKKBpCommon.isSuccess(result))
		{
			CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg template = templates[0];
			
			Map workMap = param.getMappingWorkArea();
			if (workMap == null)
			{
				workMap = new HashMap();
				param.setMappingWorkArea(workMap);
			}
			HashMap workDataMap = (HashMap)workMap.get("JKKAddSvcPaywayCCWork");
			if (workDataMap == null)
			{
				workDataMap = new HashMap();
				workMap.put("JKKAddSvcPaywayCCWork", workDataMap);

			}
			workDataMap.put("seiky_kei_no", template.getString(EKK0491D010CBSMsg.SEIKY_KEI_NO));
			setSiopsvcKeiWork(param, "seiky_kei_no", template.getString(EKK0491D010CBSMsg.SEIKY_KEI_NO));
			// 契約新規申込ワークエリアへ請求契約番号を登録
			JKKBpCommon.setWkSeikyKeiNo(param, template.getString(EKK0491D010CBSMsg.SEIKY_KEI_NO));

			seikyKeiNo = JKKBpCommon.getResultString(result, EKK0491D010CBSMsg.SEIKY_KEI_NO);
			seikyKeiGeneAddDtm = JKKBpCommon.getResultString(result, EKK0491D010CBSMsg.GENE_ADD_DTM);
			
			if (JKKStrConst.SEIKY_WAY_CD_CREDIT.equals(seikyWayCd))
			{
				// 請求方法コードが クレジット の場合
				result =
						callCreditAuthJsk(handle, param, "1", ccName, seikyKeiNo,
								seikyKeiGeneAddDtm, seikyWayNo, crecardGeneAddDtm, eKK0531A010List);
				if (!JKKBpCommon.isSuccess(result))
				{
					errFlgCc = "1";
					JKKBpCommon.setResultCtrlData(param, result);
				}
			}
		}
		else
		{
			errFlgCc = "1";
			JKKBpCommon.setResultCtrlData(param, result);
		}

		/***************************************************/
		/** 下りユーザデータマッピング処理開始             */
		/***************************************************/
		JKKBpCommon.setResultUserData(param, ccName, resUserMap);
		if ("0".equals(errFlgCc))
		{
			JKKBpCommon.setResultCtrlData(param, result, ccName , 0, 0);
		}
		else
		{
			String errMsg = "支払方法登録CCで例外が発生しました";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * 口振手続SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> callAddKozaSc(SessionHandle handle, IRequestParameterReadWrite param, String funcCd, String ccName) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		String opeDateTime = (String)param.getControlMapData(SCControlMapKeys.OPE_TIME);

		/***************************************************/
		/** 口振手続SCへの上りマッピング                   */
		/***************************************************/
		// 請求方法コード
		String seikyWayCd = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SEIKY_WAY_CD);

		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0501D010CBSMsg.KOZA_MEIGIN_KANJI, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.KOZA_MEIGIN_KANJI));
		inMap.put(EKK0501D010CBSMsg.KOZA_MEIGIN_KANA, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.KOZA_MEIGIN_KANA));

		// 請求方法コードが 預金口座振替 の場合
		if (JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(seikyWayCd))
		{
			inMap.put(EKK0501D010CBSMsg.BANK_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.BANK_CD));
			inMap.put(EKK0501D010CBSMsg.BANK_SHITEN_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.BANK_SHITEN_CD));
			inMap.put(EKK0501D010CBSMsg.KOZA_NO, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.KOZA_NO));
			inMap.put(EKK0501D010CBSMsg.YOKIN_SHUMOKU_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.YOKIN_SHUMOKU));
		}
		// 請求方法コードが 郵便自動振込 の場合
		else if (JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(seikyWayCd))
		{
			// 金融機関コード、金融機関支店コードに郵便局のコード値を設定（金融機関マスタの値）
			inMap.put(EKK0501D010CBSMsg.BANK_CD, "9900");
			inMap.put(EKK0501D010CBSMsg.BANK_SHITEN_CD, "001");
			inMap.put(EKK0501D010CBSMsg.TSUCHO_SYMBOL, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.TSUCHO_SYMBOL));
			inMap.put(EKK0501D010CBSMsg.TSUCHO_NO, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.TSUCHO_NO));
		}
		inMap.put(EKK0501D010CBSMsg.IDO_DIV, ccParam.get("ido_div"));
		
		// 新規コード
		inMap.put(EKK0501D010CBSMsg.NEW_CD, ccParam.get("new_cd"));

		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0501D010", EKK0501D010CBSMsg.class, inMap, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "口振手続SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "口振手続SC呼び出し完了" + result);

		if (!JKKBpCommon.isSuccess(result))
		{
			return result;
		}
		
		//機能コード１の場合マッピングを行う。
		if(JPCModelConstant.FUNC_CD_1.equals(funcCd))
		{
			String seikyWayNo = JKKBpCommon.getResultString(result, EKK0501D010CBSMsg.SEIKY_WAY_NO_KOZA);
			String updDtm = JKKBpCommon.getResultString(result, EKK0501D010CBSMsg.UPD_DTM);
	
			/***************************************************/
			/** 口振審査依頼SCへの上りマッピング               */
			/***************************************************/
			Map<Object, Object> inMap2 = new HashMap<Object, Object>();
			
			inMap2.put(EKK0501C030CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNo);
			inMap2.put(EKK0501C030CBSMsg.PAY_JUDGE_REQYMD, opeDateTime.substring(0, 8));
			inMap2.put(EKK0501C030CBSMsg.UPD_DTM_BF, updDtm);
			
			paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0501C030", EKK0501C030CBSMsg.class, inMap2, funcCd);
			
			/***************************************************/
			/** ＳＣ呼出実行                                   */
			/***************************************************/
			scCall = new ServiceComponentRequestInvoker();
			JKKBpCommon.printBpDebugLog(this.getClass(), "口振審査依頼SC呼び出し開始");
			Map<?, ?> result2 = scCall.run(paramMap, handle);
			JKKBpCommon.printBpDebugLog(this.getClass(), "口振審査依頼SC呼び出し完了" + result2);
	
			if (!JKKBpCommon.isSuccess(result2))
			{
				return result2;
			}
	
			/***************************************************/
			/** 口振審査結果OK登録SCへの上りマッピング         */
			/***************************************************/
			Map<Object, Object> inMap3 = new HashMap<Object, Object>();
	
			inMap3.put(EKK0501C080CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNo);
			inMap3.put(EKK0501C080CBSMsg.PAY_SKEKKA_CD, "00");
			inMap3.put(EKK0501C080CBSMsg.OUT_KHRI_JUDGE_FIN_YMD, opeDateTime.substring(0, 8));
			inMap3.put(EKK0501C080CBSMsg.IDO_DIV, ccParam.get("ido_div"));
			inMap3.put(EKK0501C080CBSMsg.RSV_APLY_YMD, opeDateTime.substring(0, 8));
			inMap3.put(EKK0501C080CBSMsg.UPD_DTM_BF, updDtm);
	
			paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0501C080", EKK0501C080CBSMsg.class, inMap3, funcCd);
			
			/***************************************************/
			/** ＳＣ呼出実行                                   */
			/***************************************************/
			scCall = new ServiceComponentRequestInvoker();
			JKKBpCommon.printBpDebugLog(this.getClass(), "口振審査結果OK登録SC呼び出し開始");
			Map<?, ?> result3 = scCall.run(paramMap, handle);
			JKKBpCommon.printBpDebugLog(this.getClass(), "口振審査結果OK登録SC呼び出し完了" + result3);
			
			if (!JKKBpCommon.isSuccess(result3))
			{
				return result3;
			}
		}

		return result;
	}

	/**
	 * クレジット請求手続SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> callAddCreditSc(SessionHandle handle, IRequestParameterReadWrite param,
			String funcCd, String ccName) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);

		/***************************************************/
		/** クレジット請求手続SCへの上りマッピング         */
		/***************************************************/
		String crecardYkKigen = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_YK_KIGEN);
		if (crecardYkKigen != null && !"".equals(crecardYkKigen))
		{
			// 4桁年月(yyMM)を6桁(yyyyMM)に変換
			crecardYkKigen = "20" + crecardYkKigen;
		}

		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0521D010CBSMsg.CRECARD_JIGYO_CD, "2");
		inMap.put(EKK0521D010CBSMsg.CRECARD_COMP_CD, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_COMP_CD));
		inMap.put(EKK0521D010CBSMsg.CRECARD_NO, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NO));
		inMap.put(EKK0521D010CBSMsg.CRECARD_YK_KIGEN, crecardYkKigen);
		inMap.put(EKK0521D010CBSMsg.CRECARD_NM_KANA, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NM_KANA));
		//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
		if (funcCd.equals("2") == true) 
		{
			inMap.put(EKK0521D010CBSMsg.SHIKOSAKI_COMP_CD, "12345");
		}
		//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //
		inMap.put(EKK0521D010CBSMsg.IDO_DIV, ccParam.get("ido_div"));

		HashMap<String, Object> paramMap =
				JKKBpCommon.createScParamForSearch(param, "EKK0521D010", EKK0521D010CBSMsg.class,
						inMap, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジット請求手続SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジット請求手続SC呼び出し完了" + result);

		return result;
	}
	//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
	
	/**
	 * 審査済クレジットカード登録SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> callAddCreditSinsaSc(SessionHandle handle, IRequestParameterReadWrite param,
			String funcCd, String ccName) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		String opeDateTime = (String)param.getControlMapData(SCControlMapKeys.OPE_TIME);
		/***************************************************/
		/** 審査済クレジットカード登録SCへの上りマッピング         */
		/***************************************************/
		String crecardYkKigen = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_YK_KIGEN);
		if (crecardYkKigen != null && !"".equals(crecardYkKigen))
		{
			// 4桁年月(yyMM)を6桁(yyyyMM)に変換
			crecardYkKigen = "20" + crecardYkKigen;
		}

		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0521D020CBSMsg.CRECARD_JIGYO_CD, "2");
		inMap.put(EKK0521D020CBSMsg.CRECARD_COMP_CD, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_COMP_CD));
		inMap.put(EKK0521D020CBSMsg.CRECARD_NO, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NO));
		inMap.put(EKK0521D020CBSMsg.CRECARD_YK_KIGEN, crecardYkKigen);
		inMap.put(EKK0521D020CBSMsg.CRECARD_NM_KANA, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NM_KANA));
		inMap.put(EKK0521D020CBSMsg.PAY_SKEKKA_CD, ccParam.get("ido_div"));
		inMap.put(EKK0521D020CBSMsg.SHIKOSAKI_COMP_CD, ccParam.get("shikosaki_comp_cd"));
		inMap.put(EKK0521D020CBSMsg.PAY_SKEKKA_CD, "40");
		inMap.put(EKK0521D020CBSMsg.CRECARD_NO_AZKRI_ID, ccParam.get("crecard_no_azkri_id"));
		inMap.put(EKK0521D020CBSMsg.AUTHORI_SHONIN_NO, ccParam.get("authori_shonin_no"));
		inMap.put(EKK0521D020CBSMsg.AUTHORI_CFM_DTM, opeDateTime);
		inMap.put(EKK0521D020CBSMsg.IDO_DIV, ccParam.get("ido_div"));

		HashMap<String, Object> paramMap =
				JKKBpCommon.createScParamForSearch(param, "EKK0521D020", EKK0521D020CBSMsg.class,
						inMap, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "審査済クレジットカード登録SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "審査済クレジットカード登録SC呼び出し完了" + result);

		//editResultEKK0521D020(result, param, "EKK0521D020");
		
		return result;
	}
	//++++++++++++++ 2015/11/18 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //

	/**
	 * 請求契約登録SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @param seikyWayNo 請求方法番号
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> callAddSeikyKeiSc(SessionHandle handle, IRequestParameterReadWrite param, String funcCd, String ccName,
			String seikyWayNo) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);

		/***************************************************/
		/** 請求契約登録SCへの上りマッピング               */
		/***************************************************/
		// 請求方法コード
		String seikyWayCd = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SEIKY_WAY_CD);

		Map<Object, Object> inMap = new HashMap<Object, Object>();

		inMap.put(EKK0491D010CBSMsg.SYSID, getSysId(param, ccName));
		inMap.put(EKK0491D010CBSMsg.MANSION_OWNR_ID, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.MANSION_OWNR_ID));
		inMap.put(EKK0491D010CBSMsg.MSKM_DTL_NO, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.MSKM_DTL_NO));
		inMap.put(EKK0491D010CBSMsg.SHS_HOJIN_SBT_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SHS_HOJIN_SBT_CD));
		inMap.put(EKK0491D010CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SHS_HOJIN_ZENGO_SHITEI_CD));
		inMap.put(EKK0491D010CBSMsg.SHS_KANA, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SHS_KANA));
		inMap.put(EKK0491D010CBSMsg.SOHUS_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_BKM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_BKM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_TNTSHA_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_TNTSHA_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_TELNO, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_TELNO));
		inMap.put(EKK0491D010CBSMsg.SEIKY_WAY_CD, seikyWayCd);
		inMap.put(EKK0491D010CBSMsg.SEIKYUS_HAKKO_YH, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SEIKYUS_HAKKO_YH));
		inMap.put(EKK0491D010CBSMsg.SOHUS_AD_CD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_AD_CD));
		inMap.put(EKK0491D010CBSMsg.SOHUS_PCD, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_PCD));
		inMap.put(EKK0491D010CBSMsg.SOHUS_AD_MAN_INPUT_FLG, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_AD_MAN_INPUT_FLG));
		inMap.put(EKK0491D010CBSMsg.SOHUS_STATE_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_STATE_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_CITY_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_CITY_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_OAZTSU_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_OAZTSU_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_AZCHO_NM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_AZCHO_NM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_BNCHIGO, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_BNCHIGO));
		inMap.put(EKK0491D010CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD, ccParam.get("first_pay_mskmsho_rcp_ymd"));
		inMap.put(EKK0491D010CBSMsg.SOHUS_ADRTTM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_ADRTTM));
		inMap.put(EKK0491D010CBSMsg.SOHUS_ADRRM, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SOHUS_ADRRM));
		inMap.put(EKK0491D010CBSMsg.KEI_CNC_YMD, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.KEI_CNC_YMD));
		
		// お客様差異フラグ、住所差異フラグを取得
		inMap.put(EKK0491D010CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG, ccParam.get("sks_shs_nm_cust_nm_sai_flg"));
		inMap.put(EKK0491D010CBSMsg.SKS_SHS_KSH_AD_SAI_FLG, ccParam.get("sks_shs_ksh_ad_sai_flg"));
		
		inMap.put(EKK0491D010CBSMsg.IDO_DIV, ccParam.get("ido_div"));
		
		//送付先住所チェックレベル
		inMap.put(EKK0491D010CBSMsg.SOHUS_AD_CHK_LV, ccParam.get("sohus_ad_chk_lv"));

		// 請求方法コードが 預金口座振替 または 郵便自動振込 の場合
		if (JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(seikyWayCd) || JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(seikyWayCd))
		{
			inMap.put(EKK0491D010CBSMsg.SEIKY_KEI_KANA, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.KOZA_MEIGIN_KANA));
			if (seikyWayNo != null && !"".equals(seikyWayNo))
			{
				inMap.put(EKK0491D010CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNo);
			}
		}
		// 請求方法コードが クレジット の場合
		else if (JKKStrConst.SEIKY_WAY_CD_CREDIT.equals(seikyWayCd))
		{
			inMap.put(EKK0491D010CBSMsg.SEIKY_KEI_KANA, ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NM_KANA));
			if (seikyWayNo != null && !"".equals(seikyWayNo))
			{
				inMap.put(EKK0491D010CBSMsg.SEIKY_WAY_NO_CRECARD, seikyWayNo);
			}
		}

		HashMap workDataMap_MskmList = null;
		Map workMap = param.getMappingWorkArea();
		if (workMap != null)
		{
			HashMap workDataMap_Mskm = (HashMap)workMap.get("JKKAddMskmServiceCCWork");
			if (workDataMap_Mskm != null)
			{
				ArrayList inList1 = ((ArrayList)workDataMap_Mskm.get("JKKAddMskmServiceCCWorkList"));
				if (inList1 != null)
				{
					workDataMap_MskmList = (HashMap)inList1.get(0);
				}
			}
		}
		if (workDataMap_MskmList != null)
		{
			inMap.put(EKK0491D010CBSMsg.MSKM_DTL_NO, (String)workDataMap_MskmList.get("mskm_dtl_no"));
		}
		HashMap<String, Object> paramMap =  JKKBpCommon.createScParamForSearch(param, "EKK0491D010", EKK0491D010CBSMsg.class, inMap, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "請求契約登録SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "請求契約登録SC呼び出し完了" + result);

		return result;
	}
	
	/**
	 * ＢＰチェック用の入力パラメータを作成する。
	 * <br />
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return HashMap
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		return JKKBpCommon.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JKKBpCommon.editErrorInfo(param, caanMsgs, returnCode);
	}

	/**
	 * ＢＰチェック結果を編集する。
	 * <br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode, String fixedText)
			throws Throwable
	{
		return editErrorInfo(param, caanMsgs, returnCode);
	}

	/**
	 * クレジットオーソリ実績登録SC呼出の実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @param seikyKeiNo 請求契約番号
	 * @param seikyKeiGeneAddDtm 請求契約世代登録年月日時分秒
	 * @param seikyWayNoCrecard 請求方法番号(クレジットカード)
	 * @param crecardGeneAddDtm クレジットカード世代登録年月日時分秒
	 * @param eKK0531A010List EKK0531A010の結果マップ受け渡しリスト
	 * @return 実行結果
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private Map<?, ?> callCreditAuthJsk(SessionHandle handle, IRequestParameterReadWrite param,
			String funcCd, String ccName, String seikyKeiNo, String seikyKeiGeneAddDtm,
			String seikyWayNoCrecard, String crecardGeneAddDtm, List<Map<?, ?>> eKK0531A010List)
			throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		
		/***************************************************/
		/** クレジットオーソリ実績登録SCへの上りマッピング         */
		/***************************************************/
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		String cardExp = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_YK_KIGEN);
		StringBuilder exp = new StringBuilder();
		if (4 == cardExp.length())
		{
			exp.append("20").append(cardExp.substring(0, 2)).append(cardExp.substring(2, 4));
		}
		else
		{
			exp.append(cardExp);
		}
		
		inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_NO, seikyKeiNo);
		inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM, seikyKeiGeneAddDtm);
		inMap.put(EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD, seikyWayNoCrecard);
		inMap.put(EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM, crecardGeneAddDtm);
		inMap.put(EKK1031D010CBSMsg.CRECARD_COMP_CD, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_COMP_CD));
		inMap.put(EKK1031D010CBSMsg.CRECARD_NO, ccParam
				.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_NO));
		inMap.put(EKK1031D010CBSMsg.MEMBSTR_NO, callCreCard2(handle, param, ccName,
				eKK0531A010List));
		inMap.put(EKK1031D010CBSMsg.CRECARD_YK_KIGEN, exp.toString());
		inMap.put(EKK1031D010CBSMsg.AUTH_TRAN_CD, "02");
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 DEL start ++++++++++++++++ //
//		inMap.put(EKK1031D010CBSMsg.TRN_FLG, "0");
//		inMap.put(EKK1031D010CBSMsg.CHSHT_FLG, "0");
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 DEL end ++++++++++++++++ //
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
		inMap.put(EKK1031D010CBSMsg.SALES_AUTHORI_AMNT, "0");
		inMap.put(EKK1031D010CBSMsg.TRN_FLG, "1");
		inMap.put(EKK1031D010CBSMsg.CHSHT_FLG, "1");
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //
		inMap.put(EKK1031D010CBSMsg.CL_CD, "0");
		inMap.put(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD, ccParam.get(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD));
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
		inMap.put(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID, ccParam.get(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID));
		inMap.put(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD, ccParam.get(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD));
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //		
		
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK1031D010", EKK1031D010CBSMsg.class, inMap, funcCd);

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジットオーソリ実績登録SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジットオーソリ実績登録SC呼び出し完了" + result);

		/***************************************************/
		/** 下りマッピング                                 */
		/***************************************************/
		editRetEKK1031D010(result, param, "EKK1031D010");
		
		return result;
	}
	
	/**
	 * クレジット契約番号を取得する
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @param eKK0531A010List EKK0531A010の結果マップ受け渡しリスト
	 * @return クレジット契約番号
	 * @throws Throwable
	 */
	private String callCreCard2(SessionHandle handle, IRequestParameterReadWrite param,
			String ccName, List<Map<?, ?>> eKK0531A010List) throws Throwable
	{
		if (0 == eKK0531A010List.size())
		{	//getCreKokanCd()未実行の場合
			if("".equals(getCreKokanCd(handle, param, ccName, eKK0531A010List)))
			{	//失敗の場合
				return "";
			}
		}
		Map<?, ?> result = eKK0531A010List.get(0);
		
		String listNamePre = EKK0531A010CBSMsg.EKK0531A010CBSMSG1LIST + "[0].";
		String no15 = JKKBpCommon.getResultString(result, listNamePre + EKK0531A010CBSMsg1List.MEMBSTR_NO_15);
		String no12 = JKKBpCommon.getResultString(result, listNamePre + EKK0531A010CBSMsg1List.MEMBSTR_NO_12);
		
		String retNo = (no12 == null || no12.length() == 0 ? no15 : no12).trim();

		return retNo;
	}

	/**
	 * SYSIDを取得する
	 * @param param リクエストパラメータ
	 * @param ccName CC名
	 * @return sysid
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private String getSysId(IRequestParameterReadWrite param, String ccName) throws RequestParameterException
	{
		
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		String sysId = (String)ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.SYSID);
		Map workMap = param.getMappingWorkArea();
		HashMap workDataMap = (HashMap)workMap.get("JKKAddKeishaServiceCCWork");
		if (workDataMap != null)
		{
			
			if (nullValue(sysId).length() == 0)
			{
				sysId = (String)workDataMap.get("sysid");
			}
			return nullValue(sysId);
		}
		else
		{
			return sysId;
		}
	}
	
	/**
	 * NULLを空白に変える
	 * @param target 対象文字列
	 * @return 変換後文字列
	 */
	private String nullValue(String target) 
	{
		return (target == null || target.trim().length() == 0 ? "" : target); 
	}
	
	/**
	 * クレジット交換コードを取得する
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param funcCd 機能コード
	 * @param ccName CC名
	 * @param eKK0531A010List EKK0531A010の結果マップ受け渡しリスト
	 * @return クレジット交換コード 取得に失敗した場合は空文字
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String getCreKokanCd(SessionHandle handle, IRequestParameterReadWrite param,
			String ccName, List<Map<?, ?>> eKK0531A010List) throws Throwable
	{
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		Map<Object, Object> inMap = new HashMap<Object, Object>();
		inMap.put(EKK0531A010CBSMsg.KEY_CRECARD_COMP_CD , ccParam.get(KKSV0354_KKSV0354OP_KKSV035401CC.CRECARD_COMP_CD));
		inMap.put(EKK0531A010CBSMsg.KEY_CRECARD_JIGYO_CD , "2");
		inMap.put(EKK0531A010CBSMsg.KEY_RSV_APLY_YMD , ccParam.get("ope_date"));
		HashMap<String, Object> paramMap = JKKBpCommon.createScParamForSearch(param, "EKK0531A010", EKK0531A010CBSMsg.class, inMap, "2");

		/***************************************************/
		/** ＳＣ呼出実行                                   */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジットカード会社一意照会SC呼び出し開始");
		Map<?, ?> result = scCall.run(paramMap, handle);
		JKKBpCommon.printBpDebugLog(this.getClass(), "クレジットカード会社一意照会SC呼び出し完了" + result);

		if (!JKKBpCommon.isSuccess(result))
		{
			return "";
		}
		if (null != eKK0531A010List)
		{	//callCreCard2()から呼ばれた場合
			eKK0531A010List.add(result);
		}
		
		return JKKBpCommon.getResultString(result, EKK0531A010CBSMsg.EKK0531A010CBSMSG1LIST +
				"[0]." + EKK0531A010CBSMsg1List.CREDIT_KOKAN_CD);
	}
	// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param msgList (I) CAANMsgクラス 
	 * @param param (I) 業務データ取得・書込用I/F
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.18
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editResultEKK0521D020(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText) throws Exception{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		


		/* 業務データ設定 */
		HashMap dataMap = (HashMap)param.getData(fixedText);
		if (dataMap == null)
		{
			dataMap = new HashMap();
			param.setData(fixedText, dataMap);
		}
		
		// 審査済クレジットカード登録.請求方法番号（クレジットカード） ← 請求方法番号(クレジットカード)
		if (parentTemplate.isNull(EKK0521D020CBSMsg.SEIKY_WAY_NO_CRECARD)) {
			dataMap.put("seiky_way_no_crecard", new String());
		} else {
			dataMap.put("seiky_way_no_crecard", parentTemplate.getString(EKK0521D020CBSMsg.SEIKY_WAY_NO_CRECARD));
		}

		// 審査済クレジットカード登録.世代登録年月日時分秒 ← 世代登録年月日時分秒
		if (parentTemplate.isNull(EKK0521D020CBSMsg.GENE_ADD_DTM)) {
			dataMap.put("gene_add_dtm", new String());
		} else {
			dataMap.put("gene_add_dtm", parentTemplate.getString(EKK0521D020CBSMsg.GENE_ADD_DTM));
		}

		// 審査済クレジットカード登録.クレジットカードステータス ← クレジットカードステータス
		if (parentTemplate.isNull(EKK0521D020CBSMsg.CRECARD_STAT)) {
			dataMap.put("crecard_stat", new String());
		} else {
			dataMap.put("crecard_stat", parentTemplate.getString(EKK0521D020CBSMsg.CRECARD_STAT));
		}

		// 審査済クレジットカード登録.登録年月日時分秒 ← 登録年月日時分秒
		if (parentTemplate.isNull(EKK0521D020CBSMsg.ADD_DTM)) {
			dataMap.put("add_dtm", new String());
		} else {
			dataMap.put("add_dtm", parentTemplate.getString(EKK0521D020CBSMsg.ADD_DTM));
		}

		// 審査済クレジットカード登録.登録オペレータアカウント ← 登録オペレータアカウント
		if (parentTemplate.isNull(EKK0521D020CBSMsg.ADD_OPEACNT)) {
			dataMap.put("add_opeacnt", new String());
		} else {
			dataMap.put("add_opeacnt", parentTemplate.getString(EKK0521D020CBSMsg.ADD_OPEACNT));
		}

		// 審査済クレジットカード登録.更新年月日時分秒 ← 更新年月日時分秒
		if (parentTemplate.isNull(EKK0521D020CBSMsg.UPD_DTM)) {
			dataMap.put("upd_dtm", new String());
		} else {
			dataMap.put("upd_dtm", parentTemplate.getString(EKK0521D020CBSMsg.UPD_DTM));
		}

		// 審査済クレジットカード登録.更新オペレータアカウント ← 更新オペレータアカウント
		if (parentTemplate.isNull(EKK0521D020CBSMsg.UPD_OPEACNT)) {
			dataMap.put("upd_opeacnt", new String());
		} else {
			dataMap.put("upd_opeacnt", parentTemplate.getString(EKK0521D020CBSMsg.UPD_OPEACNT));
		}

		// 審査済クレジットカード登録.無効フラグ ← 無効フラグ
		if (parentTemplate.isNull(EKK0521D020CBSMsg.MK_FLG)) {
			dataMap.put("mk_flg", new String());
		} else {
			dataMap.put("mk_flg", parentTemplate.getString(EKK0521D020CBSMsg.MK_FLG));
		}

        // エラー情報の設定
        param = editErrInfoEKK0521D020(param, templates, (Integer)return_code,"EKK0521D020");

		//エラー情報のマップを取得
		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));
        

		return param;
	}
	// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //

	/**
	 * クレジットオーソリ実績登録の下りマッピング処理を行います。
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK1031D010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(EKK1031D010CBSMsg.STATUS);

		boolean errFlg = false;
		
		if ("E1".equals(template.getString(EKK1031D010CBSMsg.SEIKY_KEI_NO_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD_ERR)))
		{
			errFlg = true;
		}
		else if ("E1".equals(template.getString(EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.CRECARD_COMP_CD_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.CRECARD_NO_ERR)))
		{
			errFlg = true;
		}
		else if ("E1".equals(template.getString(EKK1031D010CBSMsg.MEMBSTR_NO_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.CRECARD_YK_KIGEN_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.TRN_FLG_ERR)))
		{
			errFlg = true;
		}
		else if ("E1".equals(template.getString(EKK1031D010CBSMsg.CHSHT_FLG_ERR)) ||
				"E1".equals(template.getString(EKK1031D010CBSMsg.CL_CD_ERR)))
		{
			errFlg = true;
		}
		
		if (1000 == templateStatus && errFlg)
		{
			
			Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
	
			/* 業務データ設定 */
			HashMap dataMap = (HashMap)param.getData(fixedText);
			if (dataMap == null)
			{
				dataMap = new HashMap();
				param.setData(fixedText, dataMap);
			}
			
			// エラー情報の設定
			IRequestParameterReadWrite reParam = editErrInfoEKK1031D010(param, templates, (Integer)returnCode, fixedText);
	
			// エラー情報のマップを取得
			ArrayList<Object> errList = (ArrayList<Object>)reParam.getControlMapData(SCControlMapKeys.ERROR_INFO);
			if (errList == null)
			{
				errList = new ArrayList<Object>();
			}
			// コントロールマップに設定
			reParam.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
			
			return reParam;
		}
		else if (0 == templateStatus)
		{
			/* 業務データ設定 */
			HashMap dataMap = (HashMap)param.getData(fixedText);
			if (dataMap == null)
			{
				dataMap = new HashMap();
				param.setData(fixedText, dataMap);
			}
			
			dataMap.put("credit_auth_jsk_no", template.getString(EKK1031D010CBSMsg.CREDIT_AUTH_JSK_NO));
		}
		
		return param;
	}
	// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @since 2011.11.18
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0521D020(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws RequestParameterException{
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = null;
		int templateStatus = template.getInt(EKK0521D020CBSMsg.STATUS);
		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);
		}
		
		HashMap inMap = null;
		ArrayList inList = null;
		
		// 作業項目領域
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData(fixedText);

		// 審査済クレジットカード登録.クレジットカード事業コード → クレジットカード事業コード のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_JIGYO_CD_ERR)) {
			if (!inMap.containsKey("crecard_jigyo_cd_err")) {
				inMap.put("crecard_jigyo_cd_err", template.getString(EKK0521D020CBSMsg.CRECARD_JIGYO_CD_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジットカード会社コード → クレジットカード会社コード のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_COMP_CD_ERR)) {
			if (!inMap.containsKey("crecard_comp_cd_err")) {
				inMap.put("crecard_comp_cd_err", template.getString(EKK0521D020CBSMsg.CRECARD_COMP_CD_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジットカード番号 → クレジットカード番号 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_NO_ERR)) {
			if (!inMap.containsKey("crecard_no_err")) {
				inMap.put("crecard_no_err", template.getString(EKK0521D020CBSMsg.CRECARD_NO_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジットカード有効期限 → クレジットカード有効期限 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_YK_KIGEN_ERR)) {
			if (!inMap.containsKey("crecard_yk_kigen_err")) {
				inMap.put("crecard_yk_kigen_err", template.getString(EKK0521D020CBSMsg.CRECARD_YK_KIGEN_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジット交換コード → クレジット交換コード のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CREDIT_KOKAN_CD_ERR)) {
			if (!inMap.containsKey("credit_kokan_cd_err")) {
				inMap.put("credit_kokan_cd_err", template.getString(EKK0521D020CBSMsg.CREDIT_KOKAN_CD_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジットカード名義（ローマ字） → クレジットカード名義(ローマ字) のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_NM_ROMAJI_ERR)) {
			if (!inMap.containsKey("crecard_nm_romaji_err")) {
				inMap.put("crecard_nm_romaji_err", template.getString(EKK0521D020CBSMsg.CRECARD_NM_ROMAJI_ERR));
			}
		}
		// 審査済クレジットカード登録.クレジットカード名義カナ名 → クレジットカード名義カナ名 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.CRECARD_NM_KANA_ERR)) {
			if (!inMap.containsKey("crecard_nm_kana_err")) {
				inMap.put("crecard_nm_kana_err", template.getString(EKK0521D020CBSMsg.CRECARD_NM_KANA_ERR));
			}
		}
		// 審査済クレジットカード登録.支払い審査結果コード → 支払い審査結果コード のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.PAY_SKEKKA_CD_ERR)) {
			if (!inMap.containsKey("pay_skekka_cd_err")) {
				inMap.put("pay_skekka_cd_err", template.getString(EKK0521D020CBSMsg.PAY_SKEKKA_CD_ERR));
			}
		}
		// 審査済クレジットカード登録.オーソリ確認年月日時分秒 → オーソリ確認年月日時分秒 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.AUTHORI_CFM_DTM_ERR)) {
			if (!inMap.containsKey("authori_cfm_dtm_err")) {
				inMap.put("authori_cfm_dtm_err", template.getString(EKK0521D020CBSMsg.AUTHORI_CFM_DTM_ERR));
			}
		}
		// 審査済クレジットカード登録.オーソリ承認番号 → オーソリ承認番号 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.AUTHORI_SHONIN_NO_ERR)) {
			if (!inMap.containsKey("authori_shonin_no_err")) {
				inMap.put("authori_shonin_no_err", template.getString(EKK0521D020CBSMsg.AUTHORI_SHONIN_NO_ERR));
			}
		}
		// 審査済クレジットカード登録.異動区分 → 異動区分 のエラー情報返却
		if (!template.isNull(EKK0521D020CBSMsg.IDO_DIV_ERR)) {
			if (!inMap.containsKey("ido_div_err")) {
				inMap.put("ido_div_err", template.getString(EKK0521D020CBSMsg.IDO_DIV_ERR));
			}
		}
		return param;
	}
	// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //
	/**
	 * クレジットオーソリ実績登録のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK1031D010(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKK1031D010CBSMsg.STATUS);
		
		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);
		}

		HashMap inMap = null;

		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData(fixedText);
		
		// 請求契約番号エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.SEIKY_KEI_NO_ERR))
		{
			if (!inMap.containsKey("seiky_kei_no_err"))
			{
				inMap.put("seiky_kei_no_err", template.getString(EKK1031D010CBSMsg.SEIKY_KEI_NO_ERR));
			}
		}
		
		// 請求契約世代登録年月日時分秒エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM_ERR))
		{
			if (!inMap.containsKey("seiky_kei_gene_add_dtm_err"))
			{
				inMap.put("seiky_kei_gene_add_dtm_err", template.getString(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM_ERR));
			}
		}
		
		// 請求方法番号(クレジットカード)エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD_ERR))
		{
			if (!inMap.containsKey("seiky_way_no_crecard_err"))
			{
				inMap.put("seiky_way_no_crecard_err", template.getString(EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD_ERR));
			}
		}
		
		// クレジットカード世代登録年月日時分秒エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM_ERR))
		{
			if (!inMap.containsKey("crecard_gene_add_dtm_err"))
			{
				inMap.put("crecard_gene_add_dtm_err", template.getString(EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM_ERR));
			}
		}
		
		// クレジットカード会社コードエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CRECARD_COMP_CD_ERR))
		{
			if (!inMap.containsKey("crecard_comp_cd_err"))
			{
				inMap.put("crecard_comp_cd_err", template.getString(EKK1031D010CBSMsg.CRECARD_COMP_CD_ERR));
			}
		}
		
		// オーソリ処理コードエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.AUTH_TRAN_CD_ERR))
		{
			if (!inMap.containsKey("auth_tran_cd_err"))
			{
				inMap.put("auth_tran_cd_err", template.getString(EKK1031D010CBSMsg.AUTH_TRAN_CD_ERR));
			}
		}
		
		// 売上オーソリ金額エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.SALES_AUTHORI_AMNT_ERR))
		{
			if (!inMap.containsKey("sales_authori_amnt_err"))
			{
				inMap.put("sales_authori_amnt_err", template.getString(EKK1031D010CBSMsg.SALES_AUTHORI_AMNT_ERR));
			}
		}
		
		// クレジットカード番号エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CRECARD_NO_ERR))
		{
			if (!inMap.containsKey("crecard_no_err"))
			{
				inMap.put("crecard_no_err", template.getString(EKK1031D010CBSMsg.CRECARD_NO_ERR));
			}
		}
		
		// 加盟店番号エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.MEMBSTR_NO_ERR))
		{
			if (!inMap.containsKey("membstr_no_err"))
			{
				inMap.put("membstr_no_err", template.getString(EKK1031D010CBSMsg.MEMBSTR_NO_ERR));
			}
		}
		
		// クレジットカード有効期限エラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CRECARD_YK_KIGEN_ERR))
		{
			if (!inMap.containsKey("crecard_yk_kigen_err"))
			{
				inMap.put("crecard_yk_kigen_err", template.getString(EKK1031D010CBSMsg.CRECARD_YK_KIGEN_ERR));
			}
		}
		
		// オーソリ要求コードエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD_ERR))
		{
			if (!inMap.containsKey("authori_yokyu_cd_err"))
			{
				inMap.put("authori_yokyu_cd_err", template.getString(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD_ERR));
			}
		}
		
		// 処理フラグエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.TRN_FLG_ERR))
		{
			if (!inMap.containsKey("trn_flg_err"))
			{
				inMap.put("trn_flg_err", template.getString(EKK1031D010CBSMsg.TRN_FLG_ERR));
			}
		}
		
		// 抽出フラグエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CHSHT_FLG_ERR))
		{
			if (!inMap.containsKey("chsht_flg_err"))
			{
				inMap.put("chsht_flg_err", template.getString(EKK1031D010CBSMsg.CHSHT_FLG_ERR));
			}
		}
		
		// 取消コードエラー情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CL_CD_ERR))
		{
			if (!inMap.containsKey("cl_cd_err"))
			{
				inMap.put("cl_cd_err", template.getString(EKK1031D010CBSMsg.CL_CD_ERR));
			}
		}
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD start ++++++++++++++++ //
		// クレジットカード番号預りID情報返却
		if (!template.isNull(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID_ERR))
		{
			if (!inMap.containsKey("crecard_no_azkri_id_err"))
			{
				inMap.put("crecard_no_azkri_id_err", template.getString(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID_ERR));
			}
		}
		
		// 仕向先会社コード情報返却
		if (!template.isNull(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD_ERR))
		{
			if (!inMap.containsKey("shikosaki_comp_cd_err"))
			{
				inMap.put("shikosaki_comp_cd_err", template.getString(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD_ERR));
			}
		}
		// ++++++++++++++ 2015/11/17 v20.00.00 【ANK-2565-00-00】 ADD end ++++++++++++++++ //
		
		return param;
	}
	
	/**
	 * 請求オプションサービスのワークエリアに値を設定する。。
	 * <br>
	 * @param param  リクエストパラメータ
	 * @param key    キー
	 * @param value  値
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void setSiopsvcKeiWork(IRequestParameterReadWrite param, String key, String value) throws RequestParameterException
	{
		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap seiopsvcWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_SEIOPSVC_KEI);
		if (seiopsvcWorkMap == null)
		{
			seiopsvcWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_SEIOPSVC_KEI, seiopsvcWorkMap);
		}

		seiopsvcWorkMap.put(key, value);

	}

}
