/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKIntrInfoCfmCC
 *	ソースファイル名：JKKIntrInfoCfmCC.java
 *	作成者			：FJ
 *	日付			：2014年01月09日
 *＜機能概要＞
 *	紹介コード更新CC
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v7.00.00	2014/01/21	FJ			新規作成
 *	v7.00.01	2014/02/07	FJ)西面		【ANK-1756-00-00】紹介コード対応
 *	v7.00.02	2014/02/14	FJ)西面		【IT1-2014-0000062】マンション名対応
 *  v68.00.00	2023/10/06	FJ)大路		【ANK-4416-00-00】紹介コード、提携先企業向けエントリーコード同時入力対応
 *  v68.00.00	2024/02/05	FJ)吉川		【#83918】クーポンコード初期表示・クリア処理障害対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
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.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0151D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0311B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0311B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2311B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0311B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0311B002CBSMsg1List;

public class JKKIntrInfoCfmCC extends AbstractCommonComponent {

	// ******************************************
	// 機能コード
	// ******************************************

	// 機能コード：1
	private static final String FUNC_CD_1 = "1";
	// 機能コード：2：
	private static final String FUNC_CD_2 = "2";

	// *********************************************
	// サービスIF
	// *********************************************

	// サービス契約共通情報一覧
	private static final String EKK0081B010 = "EKK0081B010";

	// サービス契約一覧照会<SYSID>
	private static final String EKK0081B002 = "EKK0081B002";

	// 紹介一覧照会
	private static final String EKK0311B001 = "EKK0311B001";

// ANK-4416-00-00 ADD START
	// クーポンコード一覧照会
	private static final String EKK0311B002 = "EKK0311B002";
// ANK-4416-00-00 ADD END

	// ******************************************
	// ユーザ定義文字列
	// ******************************************
	/** 日時書式(yyyyMMdd) */
	private static final String FMT_YMD = "yyyyMMdd";

	/** 日時編集書式(yyyy/MM/dd)  */
	private static final String EDIT_YMD = "yyyy/MM/dd";
	
	//v7.00.02 Del Start
	// 初期表示フラグ
	//private static boolean startFlg = false;
	//v7.00.02 Del End

	/**
	 * 
	 * 紹介コード一覧取得処理
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getIntrInfo(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText)
			throws Throwable {

		// 作業用マップ
		HashMap<String, Object> workMap = new HashMap<String, Object>();

		// ユーザデータ情報
		HashMap inMap = (HashMap) param.getData(fixedText);

		// 処理結果格納用マップ
		HashMap intrInfoCC = new HashMap<String, Object>();

		// SYSID配下のサービス契約リスト格納用
		ArrayList<Object> svcKeiMapList = new ArrayList<Object>();

		// サービス契約一覧表示用リスト
		ArrayList<Object> svcKeiList = new ArrayList<Object>();

		// サービス契約共通情報一覧を取得する
		callEKK0081B010SC(param, handle, workMap, inMap, intrInfoCC);

		// サービス契約一覧を取得する
		svcKeiMapList = callEKK0081B002SC(param, handle, workMap, inMap);

		for (int i = 0; i < svcKeiMapList.size(); i++) {

			HashMap<String, Object> svcKeiMap = (HashMap<String, Object>) svcKeiMapList.get(i);
			
// ANK-4416-00-00 ADD START
			// クーポンコードを取得する
			callEKK0311B002SC(param, handle, workMap, inMap, svcKeiMap);
// ANK-4416-00-00 ADD END
			
			// サービス契約に紐付く紹介コードが存在するかを判定する
			if (isIntrCd(svcKeiMap)) {

				// 紹介コードが存在した場合、紹介コードに紐付く紹介者情報を取得する
				callEKK0311B001SC(param, handle, workMap, inMap, svcKeiMap);

			}
			svcKeiList.add(svcKeiMap);
		}
		
// #83918 ADD START
		//新規申込・照査前登録のクーポンコード初期表示時
		//もしくは新規申込・照査前登録のクーポンコードクリア処理時
		//比較用のネットサービス契約番号格納
		intrInfoCC.put("net_svc_kei_no", (String) inMap.get("hktg_svc_kei_no"));
// #83918 ADD END

		intrInfoCC.put("svc_kei_list", svcKeiList);

		param.setData(fixedText, intrInfoCC);

		// 結果を返却する。
		return param;

	}

	/**
	 * サービス契約一覧紹介インターフェイスを呼び出す
	 * 
	 * @param param
	 * @param handle
	 * @param workMap
	 * @param inMap
	 * @return SYSID配下のサービス契約リスト
	 * @throws Throwable
	 */
	private ArrayList<Object> callEKK0081B002SC(IRequestParameterReadWrite param, 
													SessionHandle handle,
													HashMap<String, Object> workMap, 
													HashMap<String, Object> inMap)
													throws Throwable {
		
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		ArrayList<Object> svcKeiMapList = new ArrayList<Object>();
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081B002への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081B002CBSMsg.class.getName());
		mappingEKK0081B002InMsg(template, inMap);
		editBasicCmn(param, template, workMap);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY,
				new CAANMsg[] { template });

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング
		editResultRP(sIFResult, param, inMap);

		// SIFの実行結果を設定
		svcKeiMapList = getEKK0081B002InMsg(sIFResult, workMap ,inMap);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return svcKeiMapList;
	}

	/**
	 * サービス契約共通情報一覧照会インターフェイスを呼び出す
	 * 
	 * @param param
	 * @param handle
	 * @param workMap
	 * @param inMap
	 * @param intrInfoCC
	 * @return ステータスコードを返却
	 * @throws Throwable
	 */
	private int callEKK0081B010SC(IRequestParameterReadWrite param,
									SessionHandle handle, 
									HashMap<String, Object> workMap,
									HashMap<String, Object> inMap, 
									HashMap<String, Object> intrInfoCC)
									throws Throwable {
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081B010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081B010CBSMsg.class.getName());
		mappingEKK0081B010InMsg(template, inMap);
		editBasicCmn(param, template, workMap);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY,
				new CAANMsg[] { template });

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング
		editResultRP(sIFResult, param, inMap);

		// SIFの実行結果を設定
		getEKK0081B010InMsg(sIFResult, intrInfoCC);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}

	/**
	 * 紹介一覧照会インターフェイスを呼び出す
	 * 
	 * @param param
	 * @param handle
	 * @param workMap
	 * @param inMap
	 * @param svcKeiMap
	 * @return ステータスコード
	 * @throws Throwable
	 */
	private int callEKK0311B001SC(IRequestParameterReadWrite param,
									SessionHandle handle, 
									HashMap<String, Object> workMap,
									HashMap<String, Object> inMap, 
									HashMap<String, Object> svcKeiMap)
									throws Throwable {

		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0311B001への呼び出しパラメータ設定
		template = new CAANMsg(EKK0311B001CBSMsg.class.getName());
		mappingEKK0311B001InMsg(template, inMap, svcKeiMap);
		editBasicCmn(param, template, workMap);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY,
				new CAANMsg[] { template });

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, inMap);

		// SIFの実行結果を設定
		getEKK0311B001InMsg(sIFResult, svcKeiMap);
		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}

// ANK-4416-00-00 ADD START
	/**
	 * クーポンコード一覧紹介インターフェイスを呼び出す
	 * 
	 * @param param
	 * @param handle
	 * @param workMap
	 * @param inMap
	 * @param svcKeiMap
	 * @return ステータスコード
	 * @throws Throwable
	 */
	private int callEKK0311B002SC(IRequestParameterReadWrite param, 
									SessionHandle handle,
									HashMap<String, Object> workMap, 
									HashMap<String, Object> inMap,
									HashMap<String, Object> svcKeiMap)
									throws Throwable {
		
		
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0311B002への呼び出しパラメータ設定
		template = new CAANMsg(EKK0311B002CBSMsg.class.getName());
		mappingEKK0311B002InMsg(template, svcKeiMap);
		editBasicCmn(param, template, workMap);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY,
				new CAANMsg[] { template });

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		// エラーマッピング
		editResultRP(sIFResult, param, inMap);

		// SIFの実行結果を設定
		getEKK0311B002InMsg(sIFResult, svcKeiMap);

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
// ANK-4416-00-00 ADD END

	/**
	 * @param param (I) 業務データ取得用I/F
	 * @param msgデータ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます
	 *                。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param)
													throws RequestParameterException {
		
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());

		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());

		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());

		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param
				.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));

		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param
				.getControlMapData(SCControlMapKeys.REQ_HOSTIP));

		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param
				.getControlMapData(SCControlMapKeys.REQ_VIEWID));

		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		return paramMap;

	}

	/**
	 * templateに対してEKK0081B002の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0081B002InMsg(CAANMsg template,
												HashMap<String, Object> inMap) {

		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081B002CBSMsg()
				.getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0081B002CBSMsg.TEMPLATEID, EKK0081B002);

		// 機能コード："2"サービス契約一覧紹介 */
		template.set(EKK0081B002CBSMsg.FUNC_CODE, FUNC_CD_2);

		// SYSID:リクエストより取得した被紹介者SYSIDを設定する
		template.set(EKK0081B002CBSMsg.KEY_SYSID, (String) inMap
				.get("hktg_sysid"));

	}

	/**
	 * templateに対してEKK0311B001の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0311B001InMsg(CAANMsg template,
											HashMap<String, Object> inMap, 
											HashMap<String, Object> svcKeiMap) {

		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0311B001CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0311B001CBSMsg.TEMPLATEID, EKK0311B001);

		// 機能コード："1"
		template.set(EKK0311B001CBSMsg.FUNC_CODE, FUNC_CD_1);

		// 紹介コードを入力する
		template.set(EKK0311B001CBSMsg.KEY_INTR_CD, (String) svcKeiMap.get("intr_cd"));
	}

	/**
	 * templateに対してEKK0081B010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0081B010InMsg(CAANMsg template,
											HashMap<String, Object> inMap) {

		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081B010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		//v7.00.02 Mod Start
		//template.set(EKK0081B010CBSMsg.TEMPLATEID, EKK0081B002);
		template.set(EKK0081B010CBSMsg.TEMPLATEID, EKK0081B010);
		//v7.00.02 Mod End

		// 機能コード："1" サービス契約共通情報一覧 */
		template.set(EKK0081B010CBSMsg.FUNC_CODE, FUNC_CD_1);

		// サービス契約番号:リクエストより取得した被紹介者サービス契約番号を設定する
		template.set(EKK0081B010CBSMsg.KEY_SVC_KEI_NO, (String) inMap
				.get("hktg_svc_kei_no"));

	}
	
// ANK-4416-00-00 ADD START
	/**
	 * templateに対してEKK0311B002の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0311B002InMsg(CAANMsg template,
											HashMap<String, Object> svcKeiMap) { 

		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0311B002CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0311B002CBSMsg.TEMPLATEID, EKK0311B002);

		// 機能コード："1"
		template.set(EKK0311B002CBSMsg.FUNC_CODE, FUNC_CD_1);
		
		// サービス契約番号を入力する
		template.set(EKK0311B002CBSMsg.KEY_SVC_KEI_NO_MSKMSHA, (String) svcKeiMap.get("hi_svc_kei_no"));
	}
// ANK-4416-00-00 ADD END

	/**
	 * サービス契約共通情報一覧の結果を取得する
	 * 
	 * @param sIFResult
	 * @param workMap
	 * @param userData
	 * @throws RequestParameterException
	 */
	private void getEKK0081B010InMsg(Map<?, ?> sIFResult,
										HashMap<String, Object> 
										intrInfoCC)
										throws RequestParameterException {
		
		CAANMsg[] templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0081B010CBSMsg.EKK0081B010CBSMSG1LIST);
		
		if (null == templateArray || 0 == templateArray.length) {
			return;
		}
		
		// 紹介者契約者名
		intrInfoCC.put("hi_cust_nm", templateArray[0]
				.getString(EKK0081B010CBSMsg1List.CUST_NM));
		// 紹介者電話番号
		intrInfoCC.put("hi_telno", templateArray[0]
				.getString(EKK0081B010CBSMsg1List.KEISHA_TELNO));
		// 紹介者SYSID
		intrInfoCC.put("hi_sysid", templateArray[0]
				.getString(EKK0081B010CBSMsg1List.SYSID));
	}

	/**
	 * 紹介一覧照会の結果を取得する
	 * 
	 * @param sIFResult
	 * @param workMap
	 * @param userData
	 * @throws RequestParameterException
	 */
	private void getEKK0311B001InMsg(Map<?, ?> sIFResult,
										HashMap<String, Object> svcKeiMap) 
										throws RequestParameterException {

		CAANMsg[] templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0311B001CBSMsg.EKK0311B001CBSMSG1LIST);
		
		if (null == templateArray || 0 == templateArray.length) {
			return;
		}
		
		// 紹介者お客さまID
		svcKeiMap.put("sho_svc_kei_no", templateArray[0]
				.getString(EKK0311B001CBSMsg1List.SVC_KEI_NO));
		// 紹介者SYSID
		svcKeiMap.put("sho_sysid", templateArray[0]
				.getString(EKK0311B001CBSMsg1List.SYSID));
		// 紹介者料金グループ名
		svcKeiMap.put("sho_prc_grp_nm", templateArray[0]
				.getString(EKK0311B001CBSMsg1List.PRC_GRP_NM));
		//ANK-1756-00-00 2014/02/08 MOD START
		// 紹介者契約者名
//		svcKeiMap.put("sho_cust_nm", templateArray[0]
//				.getString(EKK0311B001CBSMsg1List.SHOKAISHA_NM));
		svcKeiMap.put("sho_cust_nm", templateArray[0]
				.getString(EKK0311B001CBSMsg1List.CUST_NM));
		//ANK-1756-00-00 2014/02/08 MOD END

	}

	/**
	 * サービス契約一覧照会<SYSID>の結果を取得する
	 * 
	 * @param sIFResult
	 * @param workMap
	 * @param userData
	 * @throws RequestParameterException
	 */
	private ArrayList<Object> getEKK0081B002InMsg(Map<?, ?> sIFResult,
														HashMap<String, Object> intrInfoCC,
														HashMap<String, Object> inMap)
														throws RequestParameterException {

		CAANMsg[] templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0081B002CBSMsg.EKK0081B002CBSMSG1LIST);

		ArrayList<Object> svcKeiMapList = new ArrayList<Object>();

		if (null == templateArray || 0 == templateArray.length) {
			return svcKeiMapList;
		}
		
		// サービス契約番号分のリストを取得する
		for (int i = 0; i < templateArray.length; i++) {

			HashMap<String, Object> svcKeiMap = new HashMap<String, Object>();

			// 被紹介者お客さまID
			svcKeiMap.put("hi_svc_kei_no", templateArray[i]
					.getString(EKK0081B002CBSMsg1List.SVC_KEI_NO));

			// 紹介コード
			svcKeiMap.put("intr_cd", templateArray[i]
					.getString(EKK0081B002CBSMsg1List.INTR_CD));

			// サービス契約ステータス
			svcKeiMap.put("hi_svc_kei_stat", templateArray[i]
					.getString(EKK0081B002CBSMsg1List.SVC_KEI_STAT_NM));
			
			// 被紹介者料金グループ名
			svcKeiMap.put("hi_prc_grp_nm", templateArray[i]
					.getString(EKK0081B002CBSMsg1List.PRC_GRP_NM));
			
			// サービス開始年月日
			String svcStaYmd = templateArray[i].getString(EKK0081B002CBSMsg1List.SVC_STA_YMD);
			if (svcStaYmd != null && ! "".equals(svcStaYmd) && svcStaYmd.length() == 8)
			{
				// 書式変換「YYYY/MM/DD」
				svcStaYmd= getYmdString2(svcStaYmd);
			}
			
			svcKeiMap.put("hi_svc_sta_ymd", svcStaYmd);

			// リストにサービス契約情報を格納
			svcKeiMapList.add(svcKeiMap);
		}
		return svcKeiMapList;
	}

// ANK-4416-00-00 ADD START
	/**
	 * クーポンコード一覧照会の結果を取得する
	 * 
	 * @param sIFResult
	 * @param workMap
	 * @param userData
	 * @throws RequestParameterException
	 */
	private void getEKK0311B002InMsg(Map<?, ?> sIFResult,
										HashMap<String, Object> svcKeiMap) 
										throws RequestParameterException {

		CAANMsg[] templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0311B002CBSMsg.EKK0311B002CBSMSG1LIST);
		
		if (null == templateArray || 0 == templateArray.length) {
			return;
		}
		
		// クーポンコード
		svcKeiMap.put("coupon_cd", templateArray[0]
				.getString(EKK0311B002CBSMsg1List.INTR_CD));

	}
// ANK-4416-00-00 ADD END

	/**
	 * 条件部の共通する項目の設定
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param template
	 *            template 条件の設定先
	 * @param workMap
	 * @throws RequestParameterException
	 */
	public void editBasicCmn(IRequestParameterReadOnly param, 
								CAANMsg template,
								HashMap<String, Object> workMap) 
								throws RequestParameterException {

		// オペレータID
		Object operatorId = param
				.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param
				.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		workMap.put(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		//ANK-1756-00-00 2014/02/07 MOD START
		// 取引年月日
//		workMap.put(EKK0081A010CBSMsg.OPERATEDATE,
//				com.fujitsu.futurity.bp.custom.common.JFUBPCommon
//						.getOpeDateTimeStamp(null).substring(0, 8));

		workMap.put(EKK0081A010CBSMsg.OPERATEDATE,
				JCCBPCommon.getOpeDate(null));
		//ANK-1756-00-00 2014/02/07 MOD END

		// リターンコード
		workMap.put(SCControlMapKeys.RETURN_CODE, param
				.getControlMapData(SCControlMapKeys.RETURN_CODE));

		// リターンメッセージ
		workMap.put(SCControlMapKeys.RETURN_MESSAGE, param
				.getControlMapData(SCControlMapKeys.RETURN_MESSAGE));

	}

	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * msgList CAANMsgクラス
	 * param 業務データ取得・書込用I/F
	 * fixedText ユーザ任意文字列
	 * return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editResultRP(Map<?, ?> msgList,
													IRequestParameterReadWrite param, 
													HashMap<String, Object> inMap)
													throws Throwable {

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[]) msgList
				.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer) msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_"
				+ String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String) param
					.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_"
					+ formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		/* ユーザデータ情報 */
		// HashMap inMap = (HashMap)param.getData(fixText);
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;

		contents = new EKK0081A010CBSMsg().getContents();

		// 2014/01/10 IT1-2014-0000022 Add End

		for (int i = 0; contents != null && i < contents.length; i++) {
			String element = null;
			element = (String) contents[i][0];
			if (element.indexOf("_err") > 0) {
				if (!template.isNull(element)) {
					if (!inMap.containsKey(element)) {
						inMap.put(element, template.getString(element));
					}
				}
			}
		}

		// エラー情報のマップを取得
		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));

		/* ◇処理結果の判定 */
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = returnCode.toString();
		int status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// 異常の場合、SCCallExceptionを生成してスローする
		if (!("0".equals(rtnCode) && 0 == status)) {
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode,
					status);
			throw scCallEx;
		}

		return param;
	}

	/**
	 * 業務データの取得処理です。
	 * 
	 * @param rslt SIFの実行結果データ
	 * @return 業務データ
	 */
	private HashMap<String, Object> getWorkCAANMsg(Map<?, ?> rslt) {
		
		CAANMsg[] templates = (CAANMsg[]) rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate.getMsgData();
	}

	/**
	 * Nullマッピングで埋める
	 * 
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents) {
		
		// 要素ごとのループ
		for (int i = 0; i < contents.length; i++) {

			Object element = null;

			// キーに該当する箇所の取得
			element = contents[i][0];
			
			// Nullでマッピング
			msg.setNull((String) element);
		}
	}

	/**
	 * 
	 * 紹介コードが存在するかを確認する
	 * 
	 * @param  parentMap
	 * @return true：紹介、false：以外
	 */
	private boolean isIntrCd(HashMap<String, Object> parentMap) {

		String intrCd = (String) parentMap.get("intr_cd");

		if (!JKKStringUtil.isNullBlank(intrCd)) {
			return true;
		}
		
		return false;
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ定義文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterException がスローされます。
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws RequestParameterException 
	{
		HashMap inMap = null;
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData(fixedText);
		if (inMap == null)
		{
			inMap = new HashMap();
			param.setData(fixedText, inMap);
		}
		
		return param;
		
	}

	/**
	 * 年月日取得<br>
	 * <br>
	 * @param	str			文字列（年月日）
	 * @return	String		文字列（年月日）
	 */
	private String getYmdString2(String str)
	{
		return chgFormat(str, FMT_YMD, EDIT_YMD);
	}

	/**
	 * 文字列フォーマット処理<br>
	 * <br>
	 * @param	str			文字列（年月日時分秒）
	 * @param	fromFormat	フォーマット（ＦＲＯＭ）
	 * @param	toFormat	フォーマット（ＴＯ）
	 * @return	String		フォーマット後の文字列
	 */
	private String chgFormat(String str, String fromFormat, String toFormat)
	{
		try
		{
			return new SimpleDateFormat(toFormat).format(new SimpleDateFormat(fromFormat).parse(str));
		}
		catch (ParseException e)
		{
			return "";
		}
	}
	
}
