/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKBankTohaigoInfAddCC
 *	ソースファイル名：JKKBankTohaigoInfAddCC.java
 *	作成者			：GDC)J.Hortilano
 *	日付			：2022年05月25日
 *＜機能概要＞
 *	金融機関統廃合情報登録CC
 *＜修正履歴＞
 *	バージョン	     修正日		 修正者		            修正内容
 *   v58.00.00       2022/05/26  GDC）J.Hortilano      【ANK-4234-00-00】廃止金融機関に紐づく口座情報一括更新対応
 *   v66.00.00       2023/05/19  FJ)謝                 【ANK-4408-00-00】口振請求及びWeb申込システム移行 事前対応
 *   v67.00.00       2023/07/19  FJ)辻野               【ANK-4415-00-00】口振請求及びWeb申込システム移行 STEP1
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
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.ErrorInfoMapKeys;
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.common.util.JCCGetSystemDateUtil;
import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491C240CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0501C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501C080CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0501D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0511A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;

public class JKKBankTohaigoInfAddCC extends AbstractCommonComponent {
	
	/** APLConst.properties KEY:KK_IVR_API_KEY */
	public final static String APL_CONST_KK_IVR_API_KEY = "KK_IVR_API_KEY";
	/** APLConst.properties KEY:KK_IVR_API_PASSWORD */
	public final static String APL_CONST_KK_IVR_API_PASSWORD = "KK_IVR_API_PASSWORD";
	/** APLConst.properties KEY: マーチャントID */
	public final static String KK_PAYGENT_MERCHANT_ID = "KK_PAYGENT_MERCHANT_ID";
	
	
	/** 金融機関統廃合情報登録マップ */
	private static final String KKSV100401CC = "KKSV100401CC";
	/** 請求契約番号コード */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";
	/** サービス契約番号 */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** 請求方法番号(口座) */
	private static final String SEIKY_WAY_NO_KOZA = "seiky_way_no_koza";
	/** 変更後金融機関コード */
	private static final String AF_BANK_CD = "af_bank_cd";
	/** 変更後支店コード */
	private static final String AF_SHITEN_CD = "af_shiten_cd";
	/** 変更後口座番号 */
	private static final String AF_KOZA_NO = "af_koza_no";
	/** SYSID */
	private static final String SYSID = "sysid";
	
		
	/** 空白 */
	private static final String EMPTY = "";
	
	
	/** テンプレートID EKK0511A010 */
	private static final String TEMPLATE_ID_EKK0511A010 = "EKK0511A010";
	/** テンプレートID EKK0011D020 */
	private static final String TEMPLATE_ID_EKK0011D020 = "EKK0011D020";
	/** テンプレートID EKK0011D020 */
	private static final String TEMPLATE_ID_EKK0011A010 = "EKK0011A010";
	/** テンプレートID EKK0011D020 */
	private static final String TEMPLATE_ID_EKK0021C060 = "EKK0021C060";
	/** テンプレートID EKK0491A010 */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";
	/** テンプレートID EKK0491C060 */
	private static final String TEMPLATE_ID_EKK0491C060 = "EKK0491C060";
	/** テンプレートID EKK0501A010 */
	private static final String TEMPLATE_ID_EKK0501A010 = "EKK0501A010";
	/** テンプレートID EKK0501D010 */
	private static final String TEMPLATE_ID_EKK0501D010 = "EKK0501D010";
	/** テンプレートID EKK0501C030 */
	private static final String TEMPLATE_ID_EKK0501C030 = "EKK0501C030";
	/** テンプレートID EKK0501C080 */
	private static final String TEMPLATE_ID_EKK0501C080 = "EKK0501C080";
	/** テンプレートID EKK0491C240 */
	private static final String TEMPLATE_ID_EKK0491C240 = "EKK0491C240";
	/** テンプレートID EKK1091D010 */
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
	
	
	/** エラーコード */
	private static final String ERR_CD = "err_cd";
	/** エラー項目 */
	private static final String ERR_KMK = "err_kmk";
	/** E140 */
	private static final String E140 = "E140";
	/** E150 */
	private static final String E150 = "E150";
	
	/** "請求契約番号" */
	private static final String BILLING_AGREEMENT_NO = "請求契約番号";
	
	/** "00013"(請求契約情報変更申込) */
	private static final String MSKM_SBT_CD_00013 = "00013";
	
	/** "04"(承認済) */
	private static final String CONSMBSN_MSKM_STAT_SKBT_CD_04 = "04";
	/** "100"(後続業務依頼済) */
	private static final String MSKM_DTL_STAT_100 = "100";
	/** "2"(口座振替)を設定 */
	private static final String SHIHARAI_CD_2	= "2";
	/** "00015"(請求契約情報変更)を設定 */
	private static final String IDO_DIV_00015 = "00015";
// ANK-4415-00-00 MOD START
	/** "IF"(金融機関統廃合)を設定 */
	//private static final String IDO_RSN_CD = "56";
	private static final String IDO_RSN_CD = "IF";
// ANK-4415-00-00 MOD END
	/** "2"(口座振替)を設定 */
	private static final String PAY_SKEKKA_CD_20 = "20";
	/** "2"(口座振替)を設定 */
	private static final String SEIKY_WAY_CD_2 = "2";
	/** "4100"(請求契約情報変更)を設定 */
	private static final String PRG_STAT_4100 = "4100";
	/** "処理区分：請求先変更" */
	private static final String PROCESSING_CATEGORY = "処理区分：請求先変更";
	/** "金融機関統廃合一括登録" */
	private static final String PRG_MEMO = "金融機関統廃合一括登録";
	/** 1 */
	private static final String SOHUS_AD_CHK_LV_1 = "1";
	
	
	
	
	/**
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText)
			throws Throwable {
		
		Map<String, Object> kksv100401cc = (Map<String, Object>) param.getData(KKSV100401CC);
		
		// 請求契約番号
		String seikyKeiNo = (String)kksv100401cc.get(SEIKY_KEI_NO);
		// 変更後金融機関コード
		String afBankCd = (String)kksv100401cc.get(AF_BANK_CD);
		// 変更後支店コード
		String afShittenCd = (String) kksv100401cc.get(AF_SHITEN_CD);
		// 変更後口座番号
		String afKozaNo = (String) kksv100401cc.get(AF_KOZA_NO);
		// SYSID
		String sysId = (String)kksv100401cc.get(SYSID);
		// サービス契約番号
		String svcKeiNo = (String)kksv100401cc.get(SVC_KEI_NO);
		// 請求方法番号(口座)
		String seikyWayNoKoza = (String) kksv100401cc.get(SEIKY_WAY_NO_KOZA);
		
		// 運用日付
//		String opeDate = (String) param.getControlMapData(SCControlMapKeys.OPE_DATE);
		String opeDate = JKKBpCommon.getOpeDate(null);
		// 運用日時
//		String opeDateTime = (String) param.getControlMapData(SCControlMapKeys.OPE_TIME);
		String opeDateTime = JKKBpCommon.getOpeDateTimeStamp(null);

		String mskmNo = null;
		String mskmDtlNo = null;
		String updDtm = null;
		String yokinShumokuCd = null;
		String newCd = null;
		String tsuchoSymbol = null;
		String tsuchoNo = null;
		String kozaMeiginKanji = null;
		String kozaMeiginKana = null;
		String payJudgeReqYmd = null;
		String outKhriJudgeFinYmd = null;
		String newKozaNo = null;
// ANK-4408-00-00 ADD START
		String kozaPaywayUkDiv = null;
// ANK-4408-00-00 ADD END
		
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 3.1 金融機関存在チェック
		// (1)金融機関テーブルを検索する
		// サービスIF結果取得(EKK0511A010): 金融機関一意照会
		CAANMsg[] ekk0511a010CbsMsg1List = getEKK0511A010(handle, scCall, param, fixedText, afBankCd, afShittenCd, opeDate);
		
		
		if (JKKCommonUtil.isNull(ekk0511a010CbsMsg1List) || 0 == ekk0511a010CbsMsg1List.length)
		{
			// (2)検索結果が存在しない場合、エラーコードを設定
			resultMap.put(ERR_CD, E140);
			// 3.2 エラーコード存在チェック
			param.setData(fixedText, resultMap);
			// 3.2 エラーコード存在チェック
			// (1)エラーコードが存在する場合、リターンする
			return param;
		}
		
		// (2)エラーコードが存在しない場合、登録処理を行います。
		
		// 3.3 サービスI/F（申込内容承認登録）
		// サービスIF結果取得(EKK0011D020): 申込内容承認登録
		CAANMsg ekk0011d020CbsMsg = execEKK0011D020(handle, scCall, param, fixedText, sysId, opeDate, opeDateTime);
		
		if (!JKKCommonUtil.isNull(ekk0011d020CbsMsg))
		{
			// 申込番号
			mskmNo = ekk0011d020CbsMsg.getString(EKK0011D020CBSMsg.MSKM_NO);
			
			CAANMsg[] ekk0011d020CbsMsg1List = (CAANMsg[])ekk0011d020CbsMsg.getCAANMsgList(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
			// 申込明細番号
			mskmDtlNo = ekk0011d020CbsMsg1List[0].getString(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
		}
		
		// 3.3 サービスI/F（申込内容承認登録）
		// サービスIF結果取得(EKK0511A010): 申込一意照会マップ
		CAANMsg[] ekk0011A010CbsMsg1list = getEKK0011A010(handle, scCall, param, fixedText, mskmNo);
		
		if (!JKKCommonUtil.isNull(ekk0011A010CbsMsg1list) &&  0 != ekk0011A010CbsMsg1list.length)
		{
			// 更新年月日時分秒
			updDtm = ekk0011A010CbsMsg1list[0].getString(EKK0011A010CBSMsg1List.UPD_DTM);
		}
		
		// 3.5 申込明細照査・後続業務依頼
		// サービスIF結果取得(EKK0021C060): 申込明細照査・後続業務依頼
		execEKK0021C060(handle, scCall, param, fixedText, mskmDtlNo, opeDateTime, opeDate, updDtm);
		
		// 3.6 請求契約一意照会
		// サービスIF結果取得(EKK0491A010): 請求契約一意照会
		CAANMsg[] ekk0491a010cbsmsg1list = getEKK0491A010(handle, scCall, param, fixedText, opeDate, seikyKeiNo);
		
		
		CAANMsg ekk0491c060CbsMsg = null;
		// *条件：請求契約一意照会から取得データが存在する場合、I/Fを実行する
		if (!JKKCommonUtil.isNull(ekk0491a010cbsmsg1list) && 0 != ekk0491a010cbsmsg1list.length)
		{
			// 更新年月日時分秒
			updDtm = new String (ekk0491a010cbsmsg1list[0].getString(EKK0491A010CBSMsg1List.LAST_UPD_DTM));
			
			try{
				// 3.6 請求契約内容変更
				// サービスIF結果取得(EKK0491C060): 請求契約内容変更
				ekk0491c060CbsMsg = execEKK0491C060(handle, scCall, param, fixedText, seikyKeiNo, mskmDtlNo, ekk0491a010cbsmsg1list[0], opeDate);
			}
			catch(SCCallException e)
			{
				// *条件：処理結果.更新年月日時分秒（更新前）がエラーの場合、エラーコード、エラー項目を設定
				ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
				if(errList != null && !errList.isEmpty())
				{
					Map errMap = (Map) errList.get(0);
					
					if(errMap != null)
					{
						HashMap<String, Object> itemCheckErrorMap = (HashMap<String, Object>) errMap.get(ErrorInfoMapKeys.ITEM_CHECK_ERRORS);
						if(itemCheckErrorMap != null)
						{
							if (itemCheckErrorMap != null && "EA".equals(itemCheckErrorMap.get(EKK0491C060CBSMsg.UPD_DTM_BF_ERR)))
							{
								resultMap.put(ERR_CD, E150);
								resultMap.put(ERR_KMK, BILLING_AGREEMENT_NO);
								param.setData(fixedText, resultMap);
							}
						}
					}
				}
				
				throw e;
			}
		}
		
		// 3.7 口座照会
		// サービスIF結果取得(EKK0501A010): 口座一意照会マップ
		CAANMsg[] ekk0501a010CbsMsg1List = execEKK0501A010(handle, scCall, param, fixedText, seikyWayNoKoza);
		
		if (!JKKCommonUtil.isNull(ekk0501a010CbsMsg1List) && 0 != ekk0501a010CbsMsg1List.length)
		{
			// 預金種目コード
			yokinShumokuCd = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.YOKIN_SHUMOKU_CD);
			// 新規コード
			newCd = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.NEW_CD);
			// 通帳記号
			tsuchoSymbol = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.TSUCHO_SYMBOL);
			// 通帳番号
			tsuchoNo = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.TSUCHO_NO);
			// 口座名義人(漢字)
			kozaMeiginKanji = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.KOZA_MEIGIN_KANJI);
			// 口座名義人カナ名
			kozaMeiginKana = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.KOZA_MEIGIN_KANA);
			// 更新年月日時分秒(更新前)
			updDtm = new String(ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.LAST_UPD_DTM));
			// 請求方法番号(口座)
			seikyWayNoKoza = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.SEIKY_WAY_NO_KOZA);
			// 支払い審査依頼年月日
			payJudgeReqYmd = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.PAY_JUDGE_REQYMD);
			// 外部口振審査完了年月日
			outKhriJudgeFinYmd = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.OUT_KHRI_JUDGE_FIN_YMD);
// ANK-4408-00-00 ADD START
			// 口座支払方法受付区分
			kozaPaywayUkDiv = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.KOZA_PAYWAY_UK_DIV);
// ANK-4408-00-00 ADD END
			
			if (!JKKCommonUtil.isNull(afKozaNo))
			{
				newKozaNo = afKozaNo;
			}
			else
			{
				newKozaNo = ekk0501a010CbsMsg1List[0].getString(EKK0501A010CBSMsg1List.KOZA_NO);
			}
		}
		
		
		// 3.8 口振番号取得部品を用いて新規コード検索処理を行う。
		// サービスIF結果取得(KozaNewCdCC): 口振手続作成時新規コード取得CC
		String geneNewCd = execKozaNewCd(handle, scCall, param, fixedText, 
					seikyKeiNo, afBankCd, afShittenCd, yokinShumokuCd, 
					newKozaNo, newCd, tsuchoSymbol, tsuchoNo);
		
		// 3.9 口振手続
		// サービスIF結果取得(EKK0501D010): 口振手続マップ
		CAANMsg ekk0501d010CbsMsg = execEKK0501D010(handle, scCall, param, fixedText, 
					afBankCd, afShittenCd, yokinShumokuCd, newKozaNo, 
// ANK-4408-00-00 ADD START
//					geneNewCd, kozaMeiginKanji, kozaMeiginKana, updDtm);
					geneNewCd, kozaMeiginKanji, kozaMeiginKana, kozaPaywayUkDiv, updDtm);
// ANK-4408-00-00 ADD END
		
		if (!JKKCommonUtil.isNull(ekk0501d010CbsMsg))
		{
			// 請求方法番号(口座)
			seikyWayNoKoza = new String(ekk0501d010CbsMsg.getString(EKK0501D010CBSMsg.SEIKY_WAY_NO_KOZA));
			// 更新年月日時分秒(更新前)
			updDtm = new String(ekk0501d010CbsMsg.getString(EKK0501D010CBSMsg.UPD_DTM));
		}
		
		// 3.10 口振審査依頼
		// サービスIF結果取得(EKK0501C030): 口振審査依頼マップ
		CAANMsg ekk0501c030CbsMsg = execEKK0501C030(handle, scCall, param, fixedText, seikyWayNoKoza, payJudgeReqYmd, updDtm);
		
		if (!JKKCommonUtil.isNull(ekk0501c030CbsMsg))
		{
			updDtm = new String(ekk0501d010CbsMsg.getString(EKK0501D010CBSMsg.UPD_DTM));
		}
		
		// 3.11 口振審査結果OK登録
		// サービスIF結果取得(EKK0501C080): 口振審査結果OK登録マップ
		execEKK0501C080(handle, scCall, param, fixedText, seikyWayNoKoza, outKhriJudgeFinYmd, opeDate, updDtm);
		
		
		
		if(ekk0491c060CbsMsg != null)
		{
			updDtm = ekk0491c060CbsMsg.getString(EKK0491C060CBSMsg.UPD_DTM);
		}
		// 3.12 請求支払先変更
		// サービスIF結果取得(EKK0491C240): 請求支払先変更
		execEKK0491C240(handle, scCall, param, fixedText, seikyKeiNo, seikyWayNoKoza, opeDate, updDtm, opeDate);
		
		// 3.14 進捗登録（請求契約情報変更）
		String sysDateTimestamp = JCCGetSystemDateUtil.getSystemDateTime().get(JCCGetSystemDateUtil.KEY_YYYYMMDDHHMMSS_SSS);
		
		// サービスIF結果取得(EKK1091D010): 進捗登録（請求契約情報変更）
		execEKK1091D010(handle, scCall, param, fixedText, mskmDtlNo, seikyKeiNo, seikyWayNoKoza, svcKeiNo, sysDateTimestamp, opeDate);
		
		// 正常終了
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
		param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		param.setData(fixedText, resultMap);
		
		return param;
	}
	
	
	/**
	 * コード名称管理一覧照会(1)
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return CAANMsg[] コード名称管理一覧照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg[] getEKK0511A010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String afBankCd,
			String afBankShittenCd,
			String opeDate) throws Exception
	{
		CAANMsg[] result = null;
		CAANMsg ekk0511a010Msg = null;
		
		Object[][] ekk0511a010 =
		{
			{EKK0511A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0511A010},
			{EKK0511A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0511A010CBSMsg.KEY_BANK_CD, afBankCd},
			{EKK0511A010CBSMsg.KEY_BANK_SHITEN_CD, afBankShittenCd},
			{EKK0511A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
			
		};
		
		ekk0511a010Msg = callSC(handle, scCall, param, fixedText, ekk0511a010);
		result = ekk0511a010Msg.getCAANMsgList(EKK0511A010CBSMsg.EKK0511A010CBSMSG1LIST);
		
		return result;
	}
	
	
	/**
	 * 申込内容承認登録
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysId SYSID
	 * @param mskmUkDtm 申込種別コード
	 * @param mskmYmd 申込年月日
	 * @return CAANMsg コード名称管理照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg execEKK0011D020(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String sysId,
			String mskmYmd,
			String mskmUkDtm) throws Exception
	{
		
		Object[][] ekk0011d020 =
		{
			{EKK0011D020CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011D020},
			{EKK0011D020CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0011D020CBSMsg.OPERATORID, (String) param.getControlMapData(SCControlMapKeys.OPERATOR_ID)},
//			{EKK0011D020CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0011D020CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0011D020CBSMsg.SYSID, sysId},
			{EKK0011D020CBSMsg.MSKM_SBT_CD, MSKM_SBT_CD_00013},
			{EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD, CONSMBSN_MSKM_STAT_SKBT_CD_04},
			{EKK0011D020CBSMsg.MSKM_UK_DTM, mskmUkDtm},
			{EKK0011D020CBSMsg.MSKM_YMD, mskmYmd},
			{EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST, new CAANMsg[]{new CAANMsg(EKK0011D020CBSMsg1List.class.getName())}},
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0011d020);
	}
	
	
	/**
	 * 申込一意照会マップ
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmNo 申込番号
	 * @return CAANMsg[] コード名称管理一覧照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg[] getEKK0011A010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String mskmNo) throws Exception
	{
		CAANMsg[] result = null;
		CAANMsg ekk0011a010Msg = null;
		
		Object[][] ekk0011a010 =
		{
			{EKK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011A010},
			{EKK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0011A010CBSMsg.KEY_MSKM_NO, mskmNo}
		};
		
		ekk0011a010Msg = callSC(handle, scCall, param, fixedText, ekk0011a010);
		result = ekk0011a010Msg.getCAANMsgList(EKK0011A010CBSMsg.EKK0011A010CBSMSG1LIST);
		
		return result;
	}
	
	
	/**
	 * 申込明細照査・後続業務依頼
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @param mskmDtlShosaDtm 申込明細照査年月日時分秒
	 * @param kzkwrkReqymd 後続業務依頼年月日
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @throws Exception 例外が発生した場合
	 */
	private void execEKK0021C060(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String mskmDtlNo,
			String mskmDtlShosaDtm,
			String kzkwrkReqymd,
			String updDtmBf) throws Exception
	{
		
		Object[][] ekk0021c060 =
		{
			{EKK0021C060CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021C060},
//			{EKK0021C060CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0021C060CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0021C060CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0021C060CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{EKK0021C060CBSMsg.MSKM_DTL_NO, mskmDtlNo},
			{EKK0021C060CBSMsg.MSKM_DTL_SHOSA_DTM, mskmDtlShosaDtm},
			{EKK0021C060CBSMsg.KZKWRK_REQYMD, kzkwrkReqymd},
			{EKK0021C060CBSMsg.MSKM_DTL_STAT, MSKM_DTL_STAT_100},
			{EKK0021C060CBSMsg.UPD_DTM_BF, updDtmBf}
		};
		
		callSC(handle, scCall, param, fixedText, ekk0021c060);
	}
	
	
	/**
	 * 請求契約一意照会
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param rsvApplyYmd 予約適用年月日
	 * @param seikyKeiNo 請求契約番号
	 * @return CAANMsg[] コード名称管理一覧照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg[] getEKK0491A010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String rsvApplyYmd,
			String seikyKeiNo) throws Exception
	{
		CAANMsg[] result = null;
		CAANMsg ekk0491a010Msg = null;
		
		Object[][] ekk0491a010 =
		{
			{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010},
			{EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, rsvApplyYmd},
			{EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
		};
		
		ekk0491a010Msg = callSC(handle, scCall, param, fixedText, ekk0491a010);
		result = ekk0491a010Msg.getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
		
		return result;
	}
	
	/**
	 * 請求契約内容変更
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyKeiNo 請求契約番号
	 * @param mskmDtlno 申込明細番号
	 * @param ekk0491a010CbsMsg 請求契約一意照会
	 * @param opeDate オンライン運用日
	 * @return CAANMsgコード名称管理照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg execEKK0491C060(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyKeiNo,
			String mskmDtlno,
			CAANMsg ekk0491a010CbsMsg,
			String opeDate) throws Exception
	{
		
		Object[][] ekk0491c060 =
		{
			{EKK0491C060CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491C060},
			{EKK0491C060CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0491C060CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0491C060CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0491C060CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0491C060CBSMsg.SEIKY_KEI_NO, seikyKeiNo},
			{EKK0491C060CBSMsg.MSKM_DTL_NO, mskmDtlno},
			{EKK0491C060CBSMsg.SEIKY_KEI_KANA, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SEIKY_KEI_KANA)},
			{EKK0491C060CBSMsg.INFO_DSP_CD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.INFO_DSP_CD)},
			{EKK0491C060CBSMsg.SEIKYUS_HAKKO_YH, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SEIKYUS_HAKKO_YH)},
			{EKK0491C060CBSMsg.SKS_SHS_KSH_AD_SAI_FLG, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SKS_SHS_KSH_AD_SAI_FLG)},
			{EKK0491C060CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SKS_SHS_NM_CUST_NM_SAI_FLG)},
			{EKK0491C060CBSMsg.SHS_HOJIN_SBT_CD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SHS_HOJIN_SBT_CD)},
			{EKK0491C060CBSMsg.SHS_HOJIN_ZENGO_SHITEI_CD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SHS_HOJIN_ZENGO_SHITEI_CD)},
			{EKK0491C060CBSMsg.SHS_KANA, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SHS_KANA)},
			{EKK0491C060CBSMsg.SOHUS_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_NM)},
			{EKK0491C060CBSMsg.SOHUS_BKM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_BKM)},
			{EKK0491C060CBSMsg.SOHUS_TNTSHA_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_TNTSHA_NM)},
			{EKK0491C060CBSMsg.SOHUS_AD_CD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_AD_CD)},
			{EKK0491C060CBSMsg.SOHUS_PCD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_PCD)},
			{EKK0491C060CBSMsg.SOHUS_STATE_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_STATE_NM)},
			{EKK0491C060CBSMsg.SOHUS_CITY_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_CITY_NM)},
			{EKK0491C060CBSMsg.SOHUS_OAZTSU_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_OAZTSU_NM)},
			{EKK0491C060CBSMsg.SOHUS_AZCHO_NM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_AZCHO_NM)},
			{EKK0491C060CBSMsg.SOHUS_ADRTTM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_ADRTTM)},
			{EKK0491C060CBSMsg.SOHUS_ADRRM , ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_ADRRM)},
			{EKK0491C060CBSMsg.SOHUS_BNCHIGO, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_BNCHIGO)},
			{EKK0491C060CBSMsg.SOHUS_TELNO, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_TELNO)},
			{EKK0491C060CBSMsg.SOHUS_FAX_NO, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_FAX_NO)},
			{EKK0491C060CBSMsg.SOHUS_MLAD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_MLAD)},
			{EKK0491C060CBSMsg.SEIKYUS_SOHUS_CHGE_YMD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SEIKYUS_SOHUS_CHGE_YMD)},
			{EKK0491C060CBSMsg.SEIKY_WAY_APLY_ADJ_YMD, opeDate},
			{EKK0491C060CBSMsg.RSV_TSTA_KIBO_YMD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.RSV_TSTA_KIBO_YMD)},
			{EKK0491C060CBSMsg.IDO_DIV, IDO_DIV_00015},
			{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YH, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YH)},
			{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_SOHU_YMD, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.FIRST_PAY_MSKMSHO_SOHU_YMD)},
			{EKK0491C060CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD, opeDate},
			{EKK0491C060CBSMsg.SOHUS_AD_MAN_INPUT_FLG, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.SOHUS_AD_MAN_INPUT_FLG)},
			{EKK0491C060CBSMsg.SOHUS_AD_CHK_LV, SOHUS_AD_CHK_LV_1},
			{EKK0491C060CBSMsg.RSV_APLY_YMD, opeDate},
			{EKK0491C060CBSMsg.FIRST_SEIKY_YM, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.FIRST_SEIKY_YM)},
			{EKK0491C060CBSMsg.UPD_DTM_BF, ekk0491a010CbsMsg.getString(EKK0491A010CBSMsg1List.LAST_UPD_DTM)}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0491c060);
	}
	
	
	/**
	 * 口座一意照会マップ
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyWayNoKoza 請求方法番号(口座)
	 * @return CAANMsg[] コード名称管理一覧照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg[] execEKK0501A010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyWayNoKoza) throws Exception
	{
		CAANMsg[] result = null;
		CAANMsg ekk0501a010Msg = null;
		
		Object[][] ekk0501a010 =
		{
			{EKK0501A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0501A010},
			{EKK0501A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0501A010CBSMsg.KEY_SEIKY_WAY_NO_KOZA, seikyWayNoKoza},
		};
		
		ekk0501a010Msg = callSC(handle, scCall, param, fixedText, ekk0501a010);
		result = ekk0501a010Msg.getCAANMsgList(EKK0501A010CBSMsg.EKK0501A010CBSMSG1LIST);
		
		return result;
	}
	
	
	/**
	 * 口振手続作成時新規コード取得CC
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyKeiNo 請求契約番号
	 * @param bankCd 金融機関コード
	 * @param bankShittenCd 金融機関支店コード
	 * @param yokinShumokuCd 預金種目コード
	 * @param kozaNo 口座番号
	 * @param newCd 新規コード
	 * @param tsuchoSymbol 通帳記号
	 * @param tsuchoNo 通帳番号
	 * @param shiharaiCd 支払方法
	 * @param idoRsnCd 異動理由コード
	 * @return String 新規コード(new_cd)
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private String execKozaNewCd(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyKeiNo,
			String bankCd,
			String bankShittenCd,
			String yokinShumokuCd,
			String kozaNo,
			String newCd,
			String tsuchoSymbol,
			String tsuchoNo) throws Throwable
	{
		// 口振手続作成時新規コード取得CC実行処理
		String workKozaNewCdDataKey = "KozaNewCdCC";
		param.setData(workKozaNewCdDataKey, new HashMap<String, Object>());
		
		HashMap<String, Object> ccMap = (HashMap<String, Object>)param.getData(workKozaNewCdDataKey);
		
		// 機能コード
		ccMap.put("func_code", param.getData("1"));
//		// オペレーションID
//		ccMap.put("operatorID", param.getOperationID());
//		// 運用日付
//		ccMap.put("operateDate", param.getControlMapData (SCControlMapKeys.OPE_DATE));
//		// 運用日時
//		ccMap.put("operateDatetime",  param.getControlMapData (SCControlMapKeys.OPE_TIME));
		// 請求契約番号
		ccMap.put("key_seiky_kei_no", seikyKeiNo);
		// 金融機関コード
		ccMap.put("key_bank_cd", bankCd);
		// 支店コード
		ccMap.put("key_bank_shiten_cd", bankShittenCd);
		// 預金種目コード
		ccMap.put("key_yokin_shumoku_cd", yokinShumokuCd);
		// 口座番号
		ccMap.put("key_koza_no", kozaNo);
		// 新規コード
		ccMap.put("key_new_cd", newCd);
		// 通帳記号
		ccMap.put("key_tsucho_symbol", tsuchoSymbol);
		// 通帳番号
		ccMap.put("key_tsucho_no", tsuchoNo);
		// 支払方法
		ccMap.put("shiharai_cd", SHIHARAI_CD_2);
// ANK-4415-00-00 ADD START
		// 異動理由コード
		ccMap.put("ido_rsn_cd", IDO_RSN_CD);
// ANK-4415-00-00 ADD END
		
		JKKSeikeiKozaNewCdCC seikeiKozaNewCdCC = new JKKSeikeiKozaNewCdCC();
		// ◇ CC呼出実行
		seikeiKozaNewCdCC.searchKozaInfo(handle, param, workKozaNewCdDataKey);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null) 
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* 作業領域データ設定 */
		HashMap ccOutMap = (HashMap)workMap.get("KozaNewCdCCWORK");
		if (ccOutMap == null) 
		{
			ccOutMap = new HashMap();
			workMap.put("KozaNewCdCCWORK", ccOutMap);
		}
		
		String rsltnNewCd = null;

		// CCの結果の新規コードを取得
		if(ccOutMap == null || ccOutMap.get("new_cd_work") == null || "".equals(ccOutMap.get("new_cd_work")))
		{
			rsltnNewCd = new String();
		}
		else
		{
			rsltnNewCd = (String)ccOutMap.get("new_cd_work");
		}

		// マッピングした情報を削除
		param.removeData(workKozaNewCdDataKey);
		
		return rsltnNewCd;
	}
	
	
	/**
	 * 口振手続マップ
	* @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param bankCd 金融機関コード
	 * @param bankShittenCd 金融機関支店コード
	 * @param yokinShumokuCd 預金種目コード
	 * @param kozaNo 口座番号
	 * @param newCd 新規コード
	 * @param kozaMeiginKanji 口座名義人(漢字)
	 * @param kozaMeiginKana 口座名義人カナ名
	 * @param kozaPaywayUkDiv 口座支払方法受付区分
	 * @param updDtm 更新年月日時分秒
	 * @return CAANMsgコード名称管理照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg execEKK0501D010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String bankCd,
			String bankShittenCd,
			String yokinShumokuCd,
			String kozaNo,
			String newCd,
			String kozaMeiginKanji,
			String kozaMeiginKana,
// ANK-4408-00-00 ADD START
			String kozaPaywayUkDiv,
// ANK-4408-00-00 ADD END
			String updDtm) throws Exception
	{
		
		Object[][] ekk0501d010 =
		{
			{EKK0501D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0501D010},
			{EKK0501D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0501D010CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0501D010CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0501D010CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0501D010CBSMsg.BANK_CD, bankCd},
			{EKK0501D010CBSMsg.BANK_SHITEN_CD, bankShittenCd},
			{EKK0501D010CBSMsg.YOKIN_SHUMOKU_CD, yokinShumokuCd},
			{EKK0501D010CBSMsg.KOZA_NO, kozaNo},
			{EKK0501D010CBSMsg.NEW_CD, newCd},
			{EKK0501D010CBSMsg.KOZA_MEIGIN_KANJI, kozaMeiginKanji},
			{EKK0501D010CBSMsg.KOZA_MEIGIN_KANA, kozaMeiginKana},
			{EKK0501D010CBSMsg.IDO_DIV, IDO_DIV_00015},
// ANK-4408-00-00 ADD START
			{EKK0501D010CBSMsg.KOZA_PAYWAY_UK_DIV, kozaPaywayUkDiv},
// ANK-4408-00-00 ADD END
			{EKK0501D010CBSMsg.UPD_DTM_BF, updDtm}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0501d010);
	}
	
	
	/**
	 * 口振審査依頼マップ
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyWayNoKoza 請求方法番号(口座)
	 * @param payJudgeReqymd 支払い審査依頼年月日
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg execEKK0501C030(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyWayNoKoza,
			String payJudgeReqymd,
			String updDtmBf) throws Exception
	{
		
		Object[][] ekk0501c030 =
		{
			{EKK0501C030CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0501C030},
			{EKK0501C030CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0501C030CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0501C030CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0501C030CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0501C030CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNoKoza},
			{EKK0501C030CBSMsg.PAY_JUDGE_REQYMD, payJudgeReqymd},
			{EKK0501C030CBSMsg.UPD_DTM_BF, updDtmBf}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0501c030);
	}
	
	/**
	 * 口振審査結果OK登録マップ
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyWayNoKoza 請求方法番号(口座)
	 * @param outKhriJudgeFinYmd 外部口振審査完了年月日
	 * @param rsvApplyYmd 予約適用年月日
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @throws Exception 例外が発生した場合
	 */
	private void execEKK0501C080(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyWayNoKoza,
			String outKhriJudgeFinYmd,
			String rsvApplyYmd,
			String updDtmBf) throws Exception
	{
		
		Object[][] ekk0501c080 =
		{
			{EKK0501C080CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0501C080},
			{EKK0501C080CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0501C080CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0501C080CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0501C080CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0501C080CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNoKoza},
			{EKK0501C080CBSMsg.PAY_SKEKKA_CD, PAY_SKEKKA_CD_20},
			{EKK0501C080CBSMsg.OUT_KHRI_JUDGE_FIN_YMD, outKhriJudgeFinYmd},
			{EKK0501C080CBSMsg.IDO_DIV, IDO_DIV_00015},
			{EKK0501C080CBSMsg.RSV_APLY_YMD, rsvApplyYmd},
			{EKK0501C080CBSMsg.UPD_DTM_BF, updDtmBf}
		};
		
		callSC(handle, scCall, param, fixedText, ekk0501c080);
	}
	
	
	/**
	 * 請求支払先変更
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyKeiNo 請求契約番号
	 * @param seikyWayNoKoza 請求方法番号(口座)
	 * @param rsvApplyYmd 予約適用年月日
	 * @param updDtmBf 更新年月日時分秒(更新前)
	 * @param firstPayMskmshoRcpYmd 初回支払申込書受領年月日
	 * @return CAANMsgコード名称管理照会明細
	 * @throws Exception 例外が発生した場合
	 */
	private CAANMsg execEKK0491C240(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String seikyKeiNo,
			String seikyWayNoKoza,
			String rsvApplyYmd,
			String updDtmBf,
			String firstPayMskmshoRcpYmd) throws Exception
	{
		
		Object[][] ekk0491c240 =
		{
			{EKK0491C240CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491C240},
			{EKK0491C240CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK0491C240CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK0491C240CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK0491C240CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK0491C240CBSMsg.SEIKY_KEI_NO, seikyKeiNo},
			{EKK0491C240CBSMsg.SEIKY_WAY_CD, SEIKY_WAY_CD_2},
			{EKK0491C240CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNoKoza},
			{EKK0491C240CBSMsg.SEIKY_WAY_NO_CRECARD, null},
			{EKK0491C240CBSMsg.RSV_APLY_YMD, rsvApplyYmd},
			{EKK0491C240CBSMsg.UPD_DTM_BF, updDtmBf},
			{EKK0491C240CBSMsg.FIRST_PAY_MSKMSHO_RCP_YMD, firstPayMskmshoRcpYmd}
		};
		
		return callSC(handle, scCall, param, fixedText, ekk0491c240);
	}
	
	
	/**
	 * 進捗登録（請求契約情報変更）
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @param seikyKeiNo 請求契約番号
	 * @param seikyWayNoKoza 請求方法番号(口座)
	 * @param svcKeiNo サービス契約番号
	 * @param idoDtm 異動年月日時分秒
	 * @param opeDate 進捗年月日時分秒
	 * @throws Exception 例外が発生した場合
	 */
	private void execEKK1091D010(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			String mskmDtlNo,
			String seikyKeiNo,
			String seikyWayNoKoza,
			String svcKeiNo,
			String idoDtm,
			String opeDate) throws Exception
	{
		
		CAANMsg[] ekk1091d010CbsMsgLlist = new CAANMsg[1];
		ekk1091d010CbsMsgLlist[0] = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
		ekk1091d010CbsMsgLlist[0].set(EKK1091D010CBSMsg1List.IDO_RSN_CD, IDO_RSN_CD);
		
		Object[][] ekk1091d010 =
		{
			{EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010},
			{EKK1091D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
//			{EKK1091D010CBSMsg.OPERATORID, param.getControlMapData (SCControlMapKeys.OPERATOR_ID)},
//			{EKK1091D010CBSMsg.OPERATEDATE, param.getControlMapData (SCControlMapKeys.OPE_DATE)},
//			{EKK1091D010CBSMsg.OPERATEDATETIME, param.getControlMapData (SCControlMapKeys.OPE_TIME)},
			{EKK1091D010CBSMsg.MSKM_DTL_NO, mskmDtlNo},
			{EKK1091D010CBSMsg.SEIKY_KEI_NO, seikyKeiNo},
			{EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA, seikyWayNoKoza},
			{EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo},
			{EKK1091D010CBSMsg.IDO_DIV, IDO_DIV_00015},
			{EKK1091D010CBSMsg.IDO_DTM, idoDtm},
			{EKK1091D010CBSMsg.PRG_MEMO, PRG_MEMO},
			{EKK1091D010CBSMsg.PRG_STAT, PRG_STAT_4100},
//			{EKK1091D010CBSMsg.PRG_DTM, prgDtm},
			{EKK1091D010CBSMsg.PRG_TKJK_1, PROCESSING_CATEGORY},
			{EKK1091D010CBSMsg.PRG_DTM_I, opeDate + "000000000"},
			{EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, ekk1091d010CbsMsgLlist}
		};
		
		callSC(handle, scCall, param, fixedText, ekk1091d010);
	}
	
	
	/**
	 * @param param リクエストパラメータ
	 * @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++)
		{
			/* CAANMsg[]の場合 */
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			/* CAANMsg[]の以外 */
			else
			{
				/* nullの場合*/
				if (EMPTY.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 fixedText サービスメッセージ
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates,
														int returnCode,
														String fixedText,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		/* 0以外のとき */
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		/* nullのとき */
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		/* nullの場合 */
		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<String, String> inMap = null;
		
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			/* nullチェック　*/
			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"));
				}
			}
		}
		return param;
	}


	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			Object[][] mappingData) throws Exception
	{
		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, fixedText, mappingData);
		
		//エラー情報のマップを取得
		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));
		
		/* 異常の場合、SCCallExceptionを生成してスローする */
		if (!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}

}
