/*******************************************************************************
* All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
* システム名        ：eo顧客基幹システム
* モジュール名      ：JKKGetKakinInfoCC
* ソースファイル名  ：JKKGetKakinInfoCC.java
* 作成者            ：富士通
* 日付              ：2023年09月17日
*＜機能概要＞
* 課金情報取得取得コモンコンポーネント部品
*＜修正履歴＞
* バージョン    修正日      修正者      修正内容
*	v65.00.00	2023/10/13	FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応 新規作成
*	v65.00.01	2023/12/27	FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*	v65.00.02	2024/01/05	FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応
*	v65.00.03	2024/01/18	FJ)吉田		【ANK-4346-00-00】【eo定期】CCMG再構築対応 性能改善対応
*	v65.00.04	2024/02/02	FJ)吉田		【ST-2024-0000004】CCMG再構築対応
*	v65.00.05	2024/04/18	FJ)渋谷		【#84117】コンテンツ閾値チェックデータでシステムエラー
********************************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.common.constant.JCNStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCNStringUtil;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECN0101B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0101B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECNA0170001CBSMsg4List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0180001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKK0321B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B005CBSMsg1List;

/**
 * 課金契約情報取得コモンコンポーネント部品.<br>
 * 
 * @author user
 *
 */
public class JCNChrgSnshoCCMGCC extends AbstractCommonComponent
{
	/*
	 * ==================
	 * CC入出力パラメータ
	 * ==================
	 */
	/** 
	 *  CC入力パラメータ：機能コード
	 *  1：コンテンツ料金調整登録呼出(課金参照／課金契約情報取得)
	 *  2：コンテンツ請求照会画面呼出(課金参照／課金契約情報取得(LaLaCallのみ))
	 *  3：請求書料金情報参照（社外向）呼出(課金参照)
	 *  4：会員情報照会受付(PMP)（ＩＳＰ・クレジット）呼出
	 */
	public static final String FUNC_CODE = "func_code";
	
	/** 
	 *  CC入力パラメータ：最大取得件数
	 */
	public static final String MAX_SEARCH_NUM = "max_search_num";
	
	/** CC入力パラメータ：コンテンツ契約番号 */
	public static final String CONTRACT_NO = "key_contract_no";

	/** CC入力パラメータ：SYSID */
	public static final String SYSID = "key_sysid";

	/** CCパラメータ：抽出対象年月 */
	public static final String TARGET_DATE = "key_chrg_trgt_ym";

	/** CC入力パラメータ：サービスID */
	public static final String SERVICE_ID = "key_service_id";

	/** CC入力パラメータ：コンテンツID */
	public static final String CONTENTS_ID = "key_contents_id";

	/** CC入力パラメータ：決済方法番号 */
	public static final String SETTLEMENT_WAY_NUMBER = "key_settlement_way_number";

	/** CC入力パラメータ：キャンペーンID */
	public static final String CAMPAIGN_ID = "key_campaign_id";

	/** CC入力パラメータ：テストIDフラグ */
	public static final String TEST_ID = "key_test_id";

	/** CC入力パラメータ：ページ番号 */
	public static final String PAGE = "key_page";

	/** CC入力パラメータ：1ページに表示する件数 */
	public static final String PER_PAGE = "key_per_page";

	/** CC入力パラメータ：ソート順 */
	public static final String SORT = "key_sort";

	/** CC入力パラメータ：昇順/降順 */
	public static final String SORT_ORDER = "key_sort_order";

	/** CC入力パラメータ：1ページに表示する件数 */
	public static final String RETURN_CONTRACT = "key_return_contract";

	/** CC入力パラメータ：ソート順 */
	public static final String RETURN_CHARGE = "key_return_charge";

	/** CC入力パラメータ：昇順/降順 */
	public static final String RETURN_CONTRACT_ADDS = "key_return_contract_adds";



	/** CC出力パラメータ：処理結果コード */
	public static final String RETURN_CODE = "return_code";

	/** CC出力パラメータ：エラー機能識別コード */
	public static final String ERR_SKBT_CODE = "err_skbt_code";

	/** CC出力パラメータ：検索エラーフラグ */
	public static final String SEARCH_ERR_FLG = "search_err_flg";
	
	/** CC出力パラメータ：取得結果リスト */
	public static final String CONT_SEI_LIST = "cont_sei_list";

	/** CC出力パラメータ：コンテンツサービスコード */
	public static final String CONT_SVC_CD = "cont_svc_cd";

	/** CC出力パラメータ：コンテンツサービス名 */
	public static final String CONT_SVC_NM = "cont_svc_nm";

	/** CC出力パラメータ：コンテンツコード */
	public static final String CONT_CD = "cont_cd";

	/** CC出力パラメータ：コンテンツ外部コード */
	public static final String CONT_OUT_CD = "cont_out_cd";

	/** CC出力パラメータ：コンテンツ名 */
	public static final String CONT_NM = "cont_nm";

	/** CC出力パラメータ：コンテンツキャンペーンＩＤ */
	public static final String CONT_CAMPAIGN_ID = "cont_campaign_id";

	/** CC出力パラメータ：コンテンツキャンペーン名 */
	public static final String CONT_CAMPAIGN_NM = "cont_campaign_nm";

	/** CC出力パラメータ：コンテンツ支払い方法コード */
	public static final String CONT_PAYWAY_CD = "cont_payway_cd";

	/** CC出力パラメータ：カード会社コード */
	public static final String CRECARD_COMP_CD = "crecard_comp_cd";

	/** CC出力パラメータ：カード会社名 */
	public static final String CRECARD_COMP_NM = "crecard_comp_nm";

	/** CC出力パラメータ：クレジットカードＩＤ */
	public static final String CRECARD_ID = "crecard_id";

	/** CC出力パラメータ：クレジットカード番号 */
	public static final String CRECARD_NO = "crecard_no";

	/** CC出力パラメータ：ＩＳＰ決済サービス契約番号 */
	public static final String ISP_KSSAI_SVC_KEI_NO = "isp_kssai_svc_kei_no";

	/** CC出力パラメータ：課金額 */
	public static final String CHRG_AMNT = "chrg_amnt";

	/** CC出力パラメータ：コンテンツ単価 */
	public static final String CONT_TANKA = "cont_tanka";

	/** CC出力パラメータ：税率 */
	public static final String TAX_RT = "tax_rt";

	/** CC出力パラメータ：コンテンツ購入数量 */
	public static final String CONT_BUY_CNT = "cont_buy_cnt";

	/** CC出力パラメータ：コンテンツ課金訂正区分 */
	public static final String CONTCHRGTESEI_DIV = "contchrgtesei_div";

	/** CC出力パラメータ：コンテンツ課金訂正区分名 */
	public static final String CONTCHRGTESEI_DIV_NM = "contchrgtesei_div_nm";

	/** CC出力パラメータ：コンテンツ課金訂正額 */
	public static final String DISCOUNT_AMOUNT = "discount_amount";

	/** CC出力パラメータ：050電話番号 */
	public static final String N_050_TELNO = "n_050_telno";

	/** CC出力パラメータ：クレジットカード有効期限 */
	public static final String CRECARD_YK_KIGEN = "crecard_yk_kigen";

	/** CC出力パラメータ：クレジットカード番号預りID */
	public static final String CRECARD_NO_AZKRI_ID = "crecard_no_azkri_id";

	/** CC出力パラメータ：仕入先 */
	public static final String SUPPLIER = "supplier";

	/** CC出力パラメータ：決済ID */
	public static final String KSSAI_ID = "kssai_id";

	/** CC出力パラメータ：請求契約番号 */
	public static final String SEIKY_KEI_NO = "seiky_kei_no";

	/** CC出力パラメータ：契約開始日時（from） */
	public static final String CONTRACT_START_DATE = "contract_start_date";

	/** CC出力パラメータ：総件数 */
	public static final String TOTAL_COUNT = "total_search_num";

	/** CC出力パラメータ：総ページ番号 */
	public static final String TOTAL_PAGE = "total_page_num";
	
	/** CC出力パラメータ：訂正情報有無判定フラグ */
	public static final String TEISEI_INFO_JUDGE_FLG = "teisei_info_judge_flg";
	
	/** CC出力パラメータ：課金フラグ */
	public static final String CHARGE_FLG = "chrg_stat_cd";

	/*
	 * ============
	 * サービスIFID
	 * ============
	 */
	/** テンプレートID（課金参照） */
	private static final String TEMPLATE_ID_ECNA0180001 = "ECNA0180001";

	/** テンプレートID（契約一覧情報取得） */
	private static final String TEMPLATE_ID_ECNA0170001 = "ECNA0170001";

	/** テンプレートID（コンテンツ事業クレジット一意照会） */
	private static final String TEMPLATE_ID_ECN0101B001 = "ECN0101B001";

	/** テンプレートID（課金先一覧照会（サービス契約番号）） */
	private static final String TEMPLATE_ID_EKK0321B005 = "EKK0321B005";

	/*
	 * ========
	 * 固有定数
	 * ========
	 */
	/** リターンコード 正常値 */
	private static final String RETURN_CODE_OK = "00000";
	/** 機能コード(コンテンツ料金調整登録呼出(課金参照／課金契約情報取得)) */
	private static final String FUNC_CODE_1 = "1";
	/** 機能コード(コンテンツ請求照会画面呼出(課金参照／課金契約情報取得(LaLaCallのみ))) */
	private static final String FUNC_CODE_2 = "2";
	//2023/12/22 add start
	/** 機能コード(請求書料金情報参照（社外向）呼出(課金参照)) */
	private static final String FUNC_CODE_3 = "3";
	//2023/12/22 add end
	// ANK-4346-00-00 20240105 ADD START
	/** 機能コード(会員情報照会受付(PMP)（ＩＳＰ・クレジット）呼出) */
	private static final String FUNC_CODE_4 = "4";
	// ANK-4346-00-00 20240105 ADD END
	/** 検索エラーフラグ 正常 */
	private static final String SEARCH_ERR_FLG_NOMAL = "0";
	/** エラー機能識別コード 1（課金参照） */
	private static final String ERR_SKBT_CD_1 = "1";
	/** エラー機能識別コード 2（契約一覧情報取得）*/
	private static final String ERR_SKBT_CD_2 = "2";
	/** 訂正区分 取消 */
	private static final String CORRECTED_DIVISION_1 = "1";
	/** 訂正区分 売上減 */
	private static final String CORRECTED_DIVISION_2 = "2";
	/** 訂正区分名称 取消 */
	private static final String CORRECTED_DIVISION_NM_1 = "取消";
	/** 訂正区分名称 売上減 */
	private static final String CORRECTED_DIVISION_NM_2 = "売上減";

	/*
	 * ========
	 * 共通定数
	 * ========
	 */
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";

	/*
	 * =============
	 * 退避用hashMap
	 * =============
	 */
	// ANK-4346-00-00 20240117 性能改善 MOD START 
	/** コンテンツ事業クレジットカード照会済み情報(key:クレジットカードＩＤ) */
//	private HashMap<String, String> serchResltLaLaCall = new HashMap<String, String>();
	private HashMap<String, HashMap<String, String>> serchResltLaLaCall = new HashMap<String, HashMap<String, String>>();
	// ANK-4346-00-00 20240117 性能改善 MOD END
	/** コンテンツ事業クレジットカード照会済み情報(key:クレジットカードＩＤ) */
	private HashMap<String, HashMap<String, String>> serchResltCN0101 = new HashMap<String, HashMap<String, String>>();
	/** 請求先照会済み情報(key:ISP決済サービス契約番号) */
	private HashMap<String, HashMap<String, String>> serchResltKK0321 = new HashMap<String, HashMap<String, String>>();

	/**
	 * 課金契約情報取得<br>
	 * <br>
	 * 課金参照、コンテンツ事業クレジット照会サービスIFを呼び出し、コンテンツ請求情報を取得する。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		String funcCode =  (String)ccMsg.get(FUNC_CODE);
		
		try
		{
			// 返却用リスト(課金参照の取得結果を全量とした結果が返却されます。)
			ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
			
			/**************/
			/** 課金参照 **/
			/**************/
			Object[][] ecna0180001in = editChrgSnshoInMsg(ccMsg);
			
			// サービスIF実行
			// 課金参照明細
			CAANMsg ecna0180001Msg = callSC(handle, scCall, param, fixedText, ecna0180001in);
			
			// API実行結果の取得
			String errCd = ecna0180001Msg.getString(ECNA0180001CBSMsg.ERR_CD);
			// リターンコードを設定
			ccMsg.put(RETURN_CODE , errCd);
			// リターンコードが正常終了以外の場合、後続処理を実施しない。
			if ( !RETURN_CODE_OK.equals(errCd) )
			{
				// エラー識別コードに "1":課金参照でのエラー を設定
				ccMsg.put(ERR_SKBT_CODE , ERR_SKBT_CD_1);
				// データ取得フラグを設定
				ccMsg.put(SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ZERO );
				ccMsg.put(TOTAL_COUNT, "0");				// 総件数
				ccMsg.put(TOTAL_PAGE,"0");					// 総ページ番号
				return param;
			}
			
			// 課金参照 課金情報明細
			CAANMsg[] ecna0180001Msg1List = ecna0180001Msg.getCAANMsgList(ECNA0180001CBSMsg.ECNA0180001CBSMSG1LIST);
			
			// 最大検索件数設定
			String workTotalCount = ecna0180001Msg.getString(ECNA0180001CBSMsg.TOTAL_COUNT);
			// 総ページ数
			String totalpage = ecna0180001Msg.getString(ECNA0180001CBSMsg.TOTAL_PAGE);
			int totalCount = 0;
			if(!JCNStringUtil.isNullBlank(workTotalCount))
			{
				totalCount = Integer.parseInt(workTotalCount);
			}
			int maxCnt = 0;
			if(!JKKStringUtil.isNullBlank((String)ccMsg.get("max_search_num")))
			{
				maxCnt = Integer.parseInt((String)ccMsg.get("max_search_num"));
			}
			// 取得結果が0件の場合
			if(totalCount == 0)
			{
				// データ取得フラグを設定
				ccMsg.put(SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ZERO );
				ccMsg.put(TOTAL_COUNT, "0");					// 総件数
				ccMsg.put(TOTAL_PAGE,"0");						// 総ページ番号
				return param;
			}
			// 取得結果が最大検索件数を超える場合は処理を終了する。
			else if (maxCnt != 0 && totalCount > maxCnt) 
			{
				// データ取得フラグを設定
				ccMsg.put(SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_OVERMAX );
				ccMsg.put(TOTAL_COUNT, totalCount);				// 総件数
				ccMsg.put(TOTAL_PAGE,"0");						// 総ページ番号
				return param;
			}
			else
			{
				// データ取得フラグを設定
				ccMsg.put(SEARCH_ERR_FLG , SEARCH_ERR_FLG_NOMAL );
				ccMsg.put(TOTAL_COUNT, totalCount);				// 総件数
				ccMsg.put(TOTAL_PAGE, totalpage);				// 総ページ番号
			}
			
			// 結果が取得できていれば取得する。
			if (ecna0180001Msg1List != null && ecna0180001Msg1List.length > 0)
			{
				//2023/12/22 add start
				// ・機能コード３以外の場合はLaLaCallのデータを取得する。
				if(!FUNC_CODE_3.equals(funcCode))
				{
				//2023/12/22 add end
					// SYSIDに紐づくLaLaCallコンテンツをすべて取得する。
					if(!getLaLaCallTELNoList(handle, scCall, param, fixedText))
					{
						// API実行に失敗した場合は処理を終了する。
						return param;
					}
				//2023/12/22 add start
				}
				//2023/12/22 add end
				
				
				for(CAANMsg ecna0180001Msg1ListMap : ecna0180001Msg1List)
				{
					// ============================
					// ==== 返却情報取得処理 ======
					// ============================
					
					// 課金参照 課金訂正情報明細
					CAANMsg[] ecna0180001Msg2List = ecna0180001Msg1ListMap.getCAANMsgList(ECNA0180001CBSMsg1List.ECNA0180001CBSMSG2LIST);
					// 契約一覧情報取得 コンテンツ情報リスト明細
					CAANMsg[] ecna0170001Msg1List = null;
					// 契約一覧情報取得 コンテンツ情報リスト 契約付加情報リスト明細
					CAANMsg[] ecna0170001Msg2List = null;
					// 契約一覧情報取得 契約付加情報リスト明細
					CAANMsg[] ecna0170001Msg4List = null;
					
					HashMap<String, Object> resultMap = new HashMap<String, Object>();
					resultList.add(resultMap);
					
					// 後続処理で使用する値を取得する
					// コンテンツ契約番号
					String contractNo = JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTRACT_NO));
					// コンテンツサービスＩＤ
					String serviceId = JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SERVICE_ID));
					// 決済方法番号
					String settlementWayNo = JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SETTLEMENT_WAY_NO));
					// 決済方法ＩＤ
					String settlementWayId = JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SETTLEMENT_WAY_ID));
					
					// 決済方法番号が"1":クレジット課金の場合
					if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals(settlementWayNo))
					{
						// 既に照会済みのクレジットカードＩＤの場合は、照会しない（性能対応）
						if(!serchResltCN0101.containsKey(settlementWayId))
						{
							// コンテンツ事業クレカから決済方法ＩＤでクレジットカード情報を取得する。
							getContjigyoCrecaInfo(handle, scCall, param, fixedText, settlementWayId);
						}
					}
					// 決済方法番号が"2":ISP課金の場合
					else if(JCNStrConst.S_CONT_PAYWAY_CD_ISP.equals(settlementWayNo))
					{
						// 既に照会済みのサービス契約番号の場合は、照会しない（性能対応）
						if(!serchResltKK0321.containsKey(settlementWayId))
						{
							// 課金先から決済方法ＩＤで請求先を取得する。
							getKakinsInfo(handle, scCall, param, fixedText, settlementWayId);
						}
					}
					
					// 以下のいずれかの場合、契約一覧情報取得は実施しない
					// ・機能コード２
					// ・機能コード３
					// ・機能コード４
					// ANK-4346-00-00 20240117 性能改善 MOD START
//					if(
//							FUNC_CODE_1.equals(funcCode)
//						|| (FUNC_CODE_2.equals(funcCode) && JCNStrConst.CN0011_CONT_SVC_CD_050.equals(serviceId))
//						|| (FUNC_CODE_4.equals(funcCode) && JCNStrConst.CN0011_CONT_SVC_CD_050.equals(serviceId))
//						)
//					{
					if(
							!FUNC_CODE_2.equals(funcCode)
						&& !FUNC_CODE_3.equals(funcCode)
						&& !FUNC_CODE_4.equals(funcCode)
						)
					{
					// ANK-4346-00-00 20240117 性能改善 MOD END
						/**********************/
						/** 契約一覧情報取得 **/
						/**********************/
						Object[][] ecna0170001in = editContIcrnInfoInMsg(ccMsg, contractNo, serviceId);
						
						// サービスIF実行
						// 契約一覧情報取得明細
						CAANMsg ecna0170001Msg = callSC(handle, scCall, param, fixedText, ecna0170001in);
						
						// API実行結果の取得
						errCd = ecna0170001Msg.getString(ECNA0170001CBSMsg.ERR_CD);
						// リターンコードを設定
						ccMsg.put(RETURN_CODE , errCd);
						// リターンコードが正常終了以外の場合、後続処理を実施しない。
						if ( !RETURN_CODE_OK.equals(errCd) )
						{
							// エラー識別コードに "2":契約一覧情報取得でのエラー を設定
							ccMsg.put(ERR_SKBT_CODE , ERR_SKBT_CD_2);
							ccMsg.put(SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ZERO );
							ccMsg.put(TOTAL_COUNT, "0");					// 総件数
							ccMsg.put(TOTAL_PAGE,"0");						// 総ページ番号
							return param;
						}
						
						// 契約一覧情報取得 コンテンツ情報リスト明細
						ecna0170001Msg1List = ecna0170001Msg.getCAANMsgList(ECNA0170001CBSMsg.ECNA0170001CBSMSG1LIST);
						
						// 結果が取得できていれば取得する。
						if (ecna0170001Msg1List != null && ecna0170001Msg1List.length > 0)
						{
							CAANMsg ecna0170001Msg1ListMap = ecna0170001Msg1List[0];
							
							// 契約一覧情報取得 コンテンツ情報リスト 契約付加情報リスト明細
							ecna0170001Msg2List = ecna0170001Msg1ListMap.getCAANMsgList(ECNA0170001CBSMsg1List.ECNA0170001CBSMSG2LIST);
							// 契約一覧情報取得 契約付加情報リスト明細
							ecna0170001Msg4List = ecna0170001Msg1ListMap.getCAANMsgList(ECNA0170001CBSMsg1List.ECNA0170001CBSMSG4LIST);
						}
					}
					
					// ==================================
					// ==== レスポンス情報返却処理 ======
					// ==================================
					resultMap.put(CONTRACT_NO			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTRACT_NO)));				// 契約番号
					resultMap.put(CONT_SVC_CD			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SERVICE_ID)));				// コンテンツサービスID
					resultMap.put(CONT_SVC_NM			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SERVICE_NAME)));			// コンテンツサービス名称
					resultMap.put(CONT_CD				, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTENTS_ID)));				// コンテンツID
					resultMap.put(CONT_NM				, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTENTS_NAME)));			// コンテンツ名称
					resultMap.put(CONT_OUT_CD			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTENTS_ID)));				// コンテンツID
					resultMap.put(CONT_PAYWAY_CD		, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.SETTLEMENT_WAY_NO)));		// 決済方法番号
					resultMap.put(CHRG_AMNT				, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));			// 課金額
					resultMap.put(CONT_TANKA			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.REGULAR_UNIT_PRICE)));		// 単価（税込）
					resultMap.put(TAX_RT				, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.TAX_RATES)));				// 税率
					resultMap.put(CONT_BUY_CNT			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CONTRACT_AMOUNT)));			// 契約数量
					resultMap.put(CHARGE_FLG			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CHARGE_FLG)));				// 課金フラグ
					
					// 決済方法番号が"1":クレジット課金の場合
					if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals(settlementWayNo))
					{
						HashMap<String, String> cn0101resultMap = serchResltCN0101.get(settlementWayId);
						
						resultMap.put(CRECARD_ID				, settlementWayId);								// 決済方法ＩＤ
						resultMap.put(CRECARD_COMP_CD			, cn0101resultMap.get(CRECARD_COMP_CD));		// クレジットカードコード
						resultMap.put(CRECARD_COMP_NM			, cn0101resultMap.get(CRECARD_COMP_NM));		// クレジット会社名
						resultMap.put(CRECARD_NO				, cn0101resultMap.get(CRECARD_NO));				// クレジットカード番号
						resultMap.put(CRECARD_YK_KIGEN			, cn0101resultMap.get(CRECARD_YK_KIGEN));		// クレジット有効期限
						resultMap.put(CRECARD_NO_AZKRI_ID		, cn0101resultMap.get(CRECARD_NO_AZKRI_ID));	// クレジットカード番号預かりＩＤ
						resultMap.put(KSSAI_ID					, cn0101resultMap.get(KSSAI_ID));				// 決済ＩＤ
						resultMap.put(ISP_KSSAI_SVC_KEI_NO		, JCNStrConst.S_BLANK);							// 決済方法ＩＤ
						resultMap.put(SEIKY_KEI_NO				, JCNStrConst.S_BLANK);							// 請求契約番号
					}
					// 決済方法番号が"2":ISP課金の場合
					else if(JCNStrConst.S_CONT_PAYWAY_CD_ISP.equals(settlementWayNo))
					{
						HashMap<String, String> kk0321resultMap = serchResltKK0321.get(settlementWayId);
						
						resultMap.put(CRECARD_ID				, JCNStrConst.S_BLANK);							// 決済方法ID
						resultMap.put(CRECARD_COMP_CD			, JCNStrConst.S_BLANK);							// クレジットカードコード
						resultMap.put(CRECARD_COMP_NM			, JCNStrConst.S_BLANK);							// クレジット会社名
						resultMap.put(CRECARD_NO				, JCNStrConst.S_BLANK);							// クレジットカード番号
						resultMap.put(CRECARD_YK_KIGEN			, JCNStrConst.S_BLANK);							// クレジット有効期限
						resultMap.put(CRECARD_NO_AZKRI_ID		, JCNStrConst.S_BLANK);							// クレジットカード番号預かりＩＤ
						resultMap.put(KSSAI_ID					, JCNStrConst.S_BLANK);							// 決済ＩＤ
						resultMap.put(ISP_KSSAI_SVC_KEI_NO		, settlementWayId);								// 決済方法ＩＤ
						resultMap.put(SEIKY_KEI_NO				, kk0321resultMap.get(SEIKY_KEI_NO));			// 請求契約番号
					}
					
					// ST-2024-0000004 DEL START 処理順変更
//					// 課金訂正情報明細があれば取得する。
//					if (ecna0180001Msg2List != null && ecna0180001Msg2List.length > 0)
//					{
//						CAANMsg ecna0180001Msg2ListMap = ecna0180001Msg2List[0];
//						
//						//課金参照 課金訂正情報明細が存在する場合は訂正区分と値引額を設定する
//
//						resultMap.put(CONT_CAMPAIGN_ID			, JCNStrConst.S_BLANK);																							// キャンペーンID
//						resultMap.put(CONT_CAMPAIGN_NM			, JCNStrConst.S_BLANK);																							// キャンペーン名称
//						resultMap.put(CONTCHRGTESEI_DIV_NM		, getCorrectedDivisionNm(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)));			// 訂正区分名称
//						String contChrgeTeiseiDiv = "";
//						if(!JCNStringUtil.isNullBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)))
//						{
//							contChrgeTeiseiDiv = ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION);
//						}
//						if(CORRECTED_DIVISION_1.equals(contChrgeTeiseiDiv))
//						{
//							// 訂正区分が「取消」の場合、課金額をコンテンツ課金訂正額に設定する
//							resultMap.put(DISCOUNT_AMOUNT			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));		// 課金額
//						}
//						else
//						{
//							resultMap.put(DISCOUNT_AMOUNT			, JCNStringUtil.nullToBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));		// 値引額
//						}
//						resultMap.put(CONTCHRGTESEI_DIV			, contChrgeTeiseiDiv);																							// 訂正区分
//					}
//					// 課金訂正情報明細がなければ空を設定する。
//					else{
//						resultMap.put(CONT_CAMPAIGN_ID			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_ID)));					// キャンペーンID
//						resultMap.put(CONT_CAMPAIGN_NM			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_NAME)));				// キャンペーン名称
//						resultMap.put(CONTCHRGTESEI_DIV			, JCNStrConst.S_BLANK);		// 訂正区分
//						resultMap.put(CONTCHRGTESEI_DIV_NM		, JCNStrConst.S_BLANK);		// 訂正区分名称
//						resultMap.put(DISCOUNT_AMOUNT			, JCNStrConst.S_BLANK);		// 値引額
//					}
					// ST-2024-0000004 DEL END 処理順変更
					
					// 契約一覧情報取得 コンテンツリスト明細があれば取得する。
					if (ecna0170001Msg1List != null && ecna0170001Msg1List.length > 0)
					{
						CAANMsg ecna0170001Msg1ListMap = ecna0170001Msg1List[0];
						resultMap.put(CONTRACT_START_DATE	, JCNStringUtil.nullToBlank(ecna0170001Msg1ListMap.getString(ECNA0170001CBSMsg1List.CONTRACT_START_DATE)));		// 契約開始年月日時
					}
					else
					{
						resultMap.put(CONTRACT_START_DATE	, JCNStrConst.S_BLANK);
					}
					
					// 契約一覧情報取得 コンテンツ情報リスト明細があれば取得する。
					if (ecna0170001Msg2List != null && ecna0170001Msg2List.length > 0)
					{
						CAANMsg ecna0170001Msg2ListMap = ecna0170001Msg2List[0];
						
						resultMap.put(SUPPLIER, ecna0170001Msg2ListMap.getString(ECNA0170001CBSMsg2List.STOCKFROM));
					}
					else
					{
						resultMap.put(SUPPLIER, JCNStrConst.S_BLANK);
					}
					
					// ANK-4346-00-00 20240117 性能改善 MOD START
					// 契約一覧情報取得 コンテンツ情報リスト 契約付加情報リスト明細があれば取得する。
//					if (ecna0170001Msg4List != null && ecna0170001Msg4List.length > 0)
//					{
//						CAANMsg ecna0170001Msg4ListMap = ecna0170001Msg4List[0];
//						
//						// 項目名
//						String itemName = JCNStringUtil.nullToBlank(ecna0170001Msg4ListMap.getString(ECNA0170001CBSMsg4List.ITEM_NAME));
//						// 設定値
//						String value = ecna0170001Msg4ListMap.getString(ECNA0170001CBSMsg4List.VALUE);
//						
//						if(JCNStrConst.CN0011_CONT_SVC_CD_050.equals(serviceId))
//						{
//							// LaLaCallの項目名が「月額基本料契約番号」の場合
//							if("MONTHLY_CONTRACT_NO".equals(itemName))
//							{
//								// 契約番号からLaLaCall電話番号を取得する。
//								resultMap.put(N_050_TELNO, serchResltLaLaCall.get(value));
//							}
//							else
//							{
//								resultMap.put(N_050_TELNO, value);
//							}
//						}
//						else
//						{
//							resultMap.put(N_050_TELNO, JCNStrConst.S_BLANK);
//						}
//					}
//					else
//					{
//						resultMap.put(N_050_TELNO, JCNStrConst.S_BLANK);
//					}
					
					// 処理中のレコードがLaLaCallのデータであれば
					if(JCNStrConst.CN0011_CONT_SVC_CD_050.equals(serviceId))
					{
						// 契約番号から、LaLaCall電話番号情報を取得する。
						HashMap<String, String> LaLaCallTelNoMap = serchResltLaLaCall.get(contractNo);
						if(LaLaCallTelNoMap != null)
						{
							// 項目名
							String itemName = JCNStringUtil.nullToBlank(LaLaCallTelNoMap.get(ECNA0170001CBSMsg4List.ITEM_NAME));
							// 設定値
							String value = JCNStringUtil.nullToBlank(LaLaCallTelNoMap.get(ECNA0170001CBSMsg4List.VALUE));
							
							// LaLaCall付加情報の項目名が「月額基本料契約番号」の場合
							if("MONTHLY_CONTRACT_NO".equals(itemName))
							{
								// 月額基本料契約番号から、もう一度LaLaCall電話番号情報を取得し、親契約の電話番号を取得する。
								HashMap<String, String> LaLaCallTelNoMap_oya = serchResltLaLaCall.get(value);
								resultMap.put(N_050_TELNO, LaLaCallTelNoMap_oya.get(ECNA0170001CBSMsg4List.VALUE));
							}
							else
							{
								// 電話番号の場合はそのまま設定する。
								resultMap.put(N_050_TELNO, value);
							}
						}
						else
						{
							// LalaCall電話番号情報が取得できない場合は空を設定する。(LaLaCall電話番号リストを作成していない場合を想定）
							resultMap.put(N_050_TELNO, JCNStrConst.S_BLANK);
						}
					}
					else
					{
						// 
						resultMap.put(N_050_TELNO, JCNStrConst.S_BLANK);
					}
					// ANK-4346-00-00 20240117 性能改善 MOD START
					// ST-2024-0000004 ADD START 処理順変更
					// 課金訂正情報明細があれば取得する。
					if (ecna0180001Msg2List != null && ecna0180001Msg2List.length > 0)
					{
						CAANMsg ecna0180001Msg2ListMap = ecna0180001Msg2List[0];
						
						// 機能コード2の場合
						if(FUNC_CODE_2.equals(funcCode))
						{
							// 本体の課金データを元に複製し、訂正用のレコードを作成する。
							HashMap<String, Object> resultMapTeisei = new HashMap<String, Object>(resultMap);
							resultList.add(resultMapTeisei);
							
							// 本体の課金データは、訂正なし扱いの設定値を設定する。
							resultMap.put(CONT_CAMPAIGN_ID			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_ID)));					// キャンペーンID
							resultMap.put(CONT_CAMPAIGN_NM			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_NAME)));				// キャンペーン名称
							resultMap.put(CONTCHRGTESEI_DIV			, JCNStrConst.S_BLANK);		// 訂正区分
							resultMap.put(CONTCHRGTESEI_DIV_NM		, JCNStrConst.S_BLANK);		// 訂正区分名称
							resultMap.put(DISCOUNT_AMOUNT			, JCNStrConst.S_BLANK);		// 値引額
							
							// 複製した訂正分の課金データは訂正区分に応じて値を設定する。
							resultMapTeisei.put(CONT_CAMPAIGN_ID			, JCNStrConst.S_BLANK);																							// キャンペーンID
							resultMapTeisei.put(CONT_CAMPAIGN_NM			, JCNStrConst.S_BLANK);																							// キャンペーン名称
							resultMapTeisei.put(CONTCHRGTESEI_DIV_NM		, getCorrectedDivisionNm(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)));			// 訂正区分名称
							String contChrgeTeiseiDiv = "";
							if(!JCNStringUtil.isNullBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)))
							{
								contChrgeTeiseiDiv = ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION);
							}
							if(CORRECTED_DIVISION_1.equals(contChrgeTeiseiDiv))
							{
								// 訂正区分が「取消」の場合、課金額をマイナス値にしてコンテンツ課金訂正額に設定する
								String amnt = Long.toString(Long.parseLong(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));
								resultMapTeisei.put(DISCOUNT_AMOUNT			, amnt);		// 課金額
							}
							else
							{
								// 訂正区分が「売上減」の場合、訂正額をマイナス値にしてコンテンツ課金訂正額に設定する
								// #84117 MOD START
//								String amnt = Long.toString(Long.parseLong(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));
//								resultMapTeisei.put(DISCOUNT_AMOUNT			, amnt);		// 値引額
								String amnt = "0";
								// 値引額が設定されていない場合、"0"を返却する。
								if(!JCNStringUtil.isNullBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)))
								{
									amnt = ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT);
								}
								resultMapTeisei.put(DISCOUNT_AMOUNT			, amnt);			// 値引額
								// #84117 MOD END
							}
							resultMapTeisei.put(CONTCHRGTESEI_DIV			, contChrgeTeiseiDiv);																							// 訂正区分
						}
						// 上記以外の場合
						else
						{
							resultMap.put(CONT_CAMPAIGN_ID			, JCNStrConst.S_BLANK);																							// キャンペーンID
							resultMap.put(CONT_CAMPAIGN_NM			, JCNStrConst.S_BLANK);																							// キャンペーン名称
							resultMap.put(CONTCHRGTESEI_DIV_NM		, getCorrectedDivisionNm(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)));			// 訂正区分名称
							String contChrgeTeiseiDiv = "";
							if(!JCNStringUtil.isNullBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION)))
							{
								contChrgeTeiseiDiv = ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.CORRECTED_DIVISION);
							}
							if(CORRECTED_DIVISION_1.equals(contChrgeTeiseiDiv))
							{
								// 訂正区分が「取消」の場合、課金額をコンテンツ課金訂正額に設定する
								resultMap.put(DISCOUNT_AMOUNT			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CHARGE_AMOUNT)));		// 課金額
							}
							else
							{
								// #84117 MOD START
//								resultMap.put(DISCOUNT_AMOUNT			, JCNStringUtil.nullToBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)));		// 値引額
								String amnt = "0";
								// 値引額が設定されていない場合、"0"を返却する。
								if(!JCNStringUtil.isNullBlank(ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT)))
								{
									amnt = ecna0180001Msg2ListMap.getString(ECNA0180001CBSMsg2List.DISCOUNT_AMOUNT);
								}
								resultMap.put(DISCOUNT_AMOUNT			, amnt);			// 値引額
								// #84117 MOD END
							}
							resultMap.put(CONTCHRGTESEI_DIV			, contChrgeTeiseiDiv);																							// 訂正区分
						}
					}
					// 課金訂正情報明細がなければ空を設定する。
					else{
						resultMap.put(CONT_CAMPAIGN_ID			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_ID)));					// キャンペーンID
						resultMap.put(CONT_CAMPAIGN_NM			, JCNStringUtil.nullToBlank(ecna0180001Msg1ListMap.getString(ECNA0180001CBSMsg1List.CAMPAIGN_NAME)));				// キャンペーン名称
						resultMap.put(CONTCHRGTESEI_DIV			, JCNStrConst.S_BLANK);		// 訂正区分
						resultMap.put(CONTCHRGTESEI_DIV_NM		, JCNStrConst.S_BLANK);		// 訂正区分名称
						resultMap.put(DISCOUNT_AMOUNT			, JCNStrConst.S_BLANK);		// 値引額
					}
					// ST-2024-0000004 ADD END 処理順変更
					
				}
			}
			else
			{
				// データ取得フラグを設定
				ccMsg.put(SEARCH_ERR_FLG , JPCModelConstant.SEARCH_ERR_FLG_ZERO );
				ccMsg.put(TOTAL_COUNT, "0");					// 総件数
				ccMsg.put(TOTAL_PAGE,"0");						// 総ページ番号
			}
			
			ccMsg.put(CONT_SEI_LIST, resultList);
			
			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx)
		{
			// システムエラーを設定する
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
		}
		return param;
	}

	/***
	 * SYSIDに紐づくLaLaCall契約情報を取得します。
	 * 何らかのエラーにより取得に失敗した場合、falseを返却します。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	private boolean getLaLaCallTELNoList(
			SessionHandle handle
			, ServiceComponentRequestInvoker scCall
			, IRequestParameterReadWrite param
			, String fixedText
		) throws Throwable {
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		String errCd = JCNStrConst.S_BLANK;
		
		/**********************/
		/** 契約一覧情報取得 **/
		/**********************/
		Object[][] ecna0170001inLaLaCall =
		{
			  {ECNA0170001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0170001}				// テンプレートＩＤ
			, {ECNA0170001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
			, {ECNA0170001CBSMsg.SYSID, (String)ccMsg.get(SYSID)}					// ＳＹＳＩＤ
			, {ECNA0170001CBSMsg.SERVICE_ID, JCNStrConst.CN0011_CONT_SVC_CD_050}	// コンテンツサービスＩＤ
			// ANK-4346-00-00 20240117 性能改善 MOD START
//			, {ECNA0170001CBSMsg.RETURN_CONTRACT, "0"}								// コンテンツ契約情報要否
			, {ECNA0170001CBSMsg.RETURN_CONTRACT, "1"}								// コンテンツ契約情報要否
			// ANK-4346-00-00 20240117 性能改善 MOD END
			, {ECNA0170001CBSMsg.RETURN_CHARGE, "0"}								// 直近課金情報要否
			, {ECNA0170001CBSMsg.RETURN_CONTRACT_ADDS, "1"}							// 契約付加情報要否
		};
		
		// サービスIF実行
		// 契約一覧情報取得明細
		CAANMsg ecna0170001MsgLaLaCall = callSC(handle, scCall, param, fixedText, ecna0170001inLaLaCall);
		
		// =====実行結果取得=====
		// API実行結果の取得
		errCd = ecna0170001MsgLaLaCall.getString(ECNA0170001CBSMsg.ERR_CD);
		// リターンコードを設定
		ccMsg.put(RETURN_CODE , errCd);
		// リターンコードが正常終了以外の場合、後続処理を実施しない。
		if ( !RETURN_CODE_OK.equals(errCd) )
		{
			// エラー識別コードに "2":契約一覧情報取得でのエラー を設定
			ccMsg.put(ERR_SKBT_CODE , "2");
			ccMsg.put(SEARCH_ERR_FLG , SEARCH_ERR_FLG_NOMAL );
			ccMsg.put(TOTAL_COUNT, "0");				// 総件数
			ccMsg.put(TOTAL_PAGE, "0");				// 総ページ番号
			return false;
		}
		
		// =====取得結果退避=====
		// 契約一覧情報取得 コンテンツ情報リスト明細
		CAANMsg[] ecna0170001Msg1ListLaLaCall = ecna0170001MsgLaLaCall.getCAANMsgList(ECNA0170001CBSMsg.ECNA0170001CBSMSG1LIST);
		
		// 結果が取得できていれば取得する。
		if (ecna0170001Msg1ListLaLaCall != null && ecna0170001Msg1ListLaLaCall.length > 0)
		{
			for(CAANMsg ecna0170001Msg1ListLaLaCallMap  : ecna0170001Msg1ListLaLaCall)
			{
				// 契約一覧情報取得 契約付加情報リスト明細
				CAANMsg[] ecna0170001Msg4ListLaLaCall = ecna0170001Msg1ListLaLaCallMap.getCAANMsgList(ECNA0170001CBSMsg1List.ECNA0170001CBSMSG4LIST);
				
				if (ecna0170001Msg4ListLaLaCall != null && ecna0170001Msg4ListLaLaCall.length > 0)
				{
					CAANMsg ecna0170001Msg4ListLaLaCallMap = ecna0170001Msg4ListLaLaCall[0];
					
					// 契約番号
					String contractNo = JCNStringUtil.nullToBlank(ecna0170001Msg1ListLaLaCallMap.getString(ECNA0170001CBSMsg1List.CONTRACTS_CONTRACT_NO));
					// 項目名
					String itemName = JCNStringUtil.nullToBlank(ecna0170001Msg4ListLaLaCallMap.getString(ECNA0170001CBSMsg4List.ITEM_NAME));
					// 設定値
					String value = ecna0170001Msg4ListLaLaCallMap.getString(ECNA0170001CBSMsg4List.VALUE);
					
					// ANK-4346-00-00 20240117 性能改善 MOD START 
					// LaLaCallの項目名が「電話番号」の場合
//					if("TELEPHONE_NO".equals(itemName))
//					{
//						// 契約番号と電話番号を退避する。
//						serchResltLaLaCall.put(contractNo, value);
//					}
					
					// コンテンツ契約番号をkeyとして、項目名と設定値を退避する。
					HashMap<String, String> dataMap = new HashMap<String, String>();
					dataMap.put(ECNA0170001CBSMsg4List.ITEM_NAME, itemName);
					dataMap.put(ECNA0170001CBSMsg4List.VALUE, value);
					
					serchResltLaLaCall.put(contractNo, dataMap);
					// ANK-4346-00-00 20240117 性能改善 MOD END
				}
			}
		}
		return true;
	}

	/**
	 * ISP決済番号に紐づく
	 * 請求先情報を取得します。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param settlementWayId
	 * @throws Throwable
	 */
	private void getKakinsInfo(
			  SessionHandle handle
			, ServiceComponentRequestInvoker scCall
			, IRequestParameterReadWrite param
			, String fixedText
			, String settlementWayId
		) throws Throwable {
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		/****************************************/
		/** 課金先一覧照会（サービス契約番号） **/
		/****************************************/
		Object[][] ekk0321b005in =
		{
			  {EKK0321B005CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B005}		// テンプレートＩＤ
			, {EKK0321B005CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}		// 機能コード
			, {EKK0321B005CBSMsg.KEY_SVC_KEI_NO, settlementWayId}			// サービス契約番号
		};
		
		// サービスIF実行
		// 課金先一覧照会
		CAANMsg ekk0321b005Msg = callSC(handle, scCall, param, fixedText, ekk0321b005in);
		// 課金先一覧照会明細
		CAANMsg[] ekk0321b005Msg1List = ekk0321b005Msg.getCAANMsgList(EKK0321B005CBSMsg.EKK0321B005CBSMSG1LIST);
		
		HashMap<String, String> kk0321resultMap = new HashMap<String, String>();
		
		// 結果が取得できていれば取得する。
		if (ekk0321b005Msg1List != null && ekk0321b005Msg1List.length > 0)
		{
			CAANMsg ekk0321b005Msg1ListMap = ekk0321b005Msg1List[0];
			
			kk0321resultMap.put(SEIKY_KEI_NO, ekk0321b005Msg1ListMap.getString(EKK0321B005CBSMsg1List.SEIKY_KEI_NO));
			
			// 取得した情報を退避しておく
			serchResltKK0321.put(settlementWayId, kk0321resultMap);
		}
		// 結果が取得できなければ空を設定する。
		else
		{
			kk0321resultMap.put(SEIKY_KEI_NO, JCNStrConst.S_BLANK);
			
			// 取得した情報を退避しておく
			serchResltKK0321.put(settlementWayId, kk0321resultMap);
		}
	}

	/**
	 * クレジットカードIDに紐づく
	 * コンテンツ事業クレジットカード情報を取得します。
	 * 
	 * 取得した結果は退避します。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param settlementWayId
	 * @param sysid
	 * @throws Throwable
	 */
	private void getContjigyoCrecaInfo(
			  SessionHandle handle
			, ServiceComponentRequestInvoker scCall
			, IRequestParameterReadWrite param
			, String fixedText
			, String settlementWayId
			)
	throws Throwable
	{
		
		// CCパラメータ
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
		
		/**********************************/
		/** コンテンツ事業クレカ一覧照会 **/
		/**********************************/
		Object[][] ecn0101b001in =
		{
			  {ECN0101B001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0101B001}		// テンプレートＩＤ
			, {ECN0101B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}		// コンテンツサービスＩＤ
			, {ECN0101B001CBSMsg.KEY_CRECARD_ID, settlementWayId}			// クレジットカードＩＤ
			, {ECN0101B001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}		// ＳＹＳＩＤ
			, {ECN0101B001CBSMsg.KEY_MK_FLG, JCNStrConst.S_MK_FLG}			// 無効フラグ
		};
		
		// サービスIF実行
		// コンテンツ事業クレカ一覧照会
		CAANMsg ecn0101b001Msg = callSC(handle, scCall, param, fixedText, ecn0101b001in);
		
		// コンテンツ事業クレカ一覧照会明細
		CAANMsg[] ecn0101b001Msg1List = ecn0101b001Msg.getCAANMsgList(ECN0101B001CBSMsg.ECN0101B001CBSMSG1LIST);
		
		HashMap<String, String> cn0101resultMap = new HashMap<String, String>();
		
		// 結果が取得できていれば取得する。
		if (ecn0101b001Msg1List != null && ecn0101b001Msg1List.length > 0)
		{
			CAANMsg ecn0101b001Msg1ListMap = ecn0101b001Msg1List[0];
			
			// 決済ＩＤ以外は運用日基準の最新世代を取得する。(決済IDは後続で取得)
			cn0101resultMap.put(CRECARD_COMP_CD			, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.CRECARD_COMP_CD));		// クレジットカードコード
			cn0101resultMap.put(CRECARD_COMP_NM			, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.CRECARD_COMP_NM));		// クレジット会社名
			cn0101resultMap.put(CRECARD_NO				, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.CRECARD_NO));				// クレジットカード番号
			cn0101resultMap.put(CRECARD_YK_KIGEN		, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN));		// クレジット有効期限
			cn0101resultMap.put(CRECARD_NO_AZKRI_ID		, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.CRECARD_NO_AZKRI_ID));	// クレジットカード番号預かりＩＤ
			// ANK-4346-00-00 MOD START
//			cn0101resultMap.put(KSSAI_ID				, ecn0101b001Msg1ListMap.getString(ECN0101B001CBSMsg1List.KSSAI_ID));				// 決済ＩＤ
			cn0101resultMap.put(KSSAI_ID				, JCNStrConst.S_BLANK);																// 決済ＩＤ
			
			// 決済ＩＤは、リクエスト．抽出対象年月に紐づくデータを取得する。
			String chrgTgYm = (String)ccMsg.get(TARGET_DATE);
			for(CAANMsg ecn0101b001Msg1ListMap2 : ecn0101b001Msg1List)
			{
				// コンテンツ事業クレジットカードの課金対象年月を取得する。
				String dataChrgTgYm = ecn0101b001Msg1ListMap2.getString(ECN0101B001CBSMsg1List.CHRG_TRGT_YM);
				
				// リクエスト．抽出対象年月と同じ場合は、決済ＩＤを取得する。
				if(dataChrgTgYm.equals(chrgTgYm)){
					cn0101resultMap.put(KSSAI_ID				, ecn0101b001Msg1ListMap2.getString(ECN0101B001CBSMsg1List.KSSAI_ID));				// 決済ＩＤ
					break;
				}
			}
			// ANK-4346-00-00 MOD END
			
			// 取得した情報を退避しておく
			serchResltCN0101.put(settlementWayId, cn0101resultMap);
		}
		// 結果が取得できなければ空を設定する。
		else
		{
			cn0101resultMap.put(CRECARD_COMP_CD			, JCNStrConst.S_BLANK);																// クレジットカードコード
			cn0101resultMap.put(CRECARD_COMP_NM			, JCNStrConst.S_BLANK);																// クレジット会社名
			cn0101resultMap.put(CRECARD_NO				, JCNStrConst.S_BLANK);																// クレジットカード番号
			cn0101resultMap.put(CRECARD_YK_KIGEN		, JCNStrConst.S_BLANK);																// クレジット有効期限
			cn0101resultMap.put(CRECARD_NO_AZKRI_ID		, JCNStrConst.S_BLANK);																// クレジットカード番号預かりＩＤ
			cn0101resultMap.put(KSSAI_ID				, JCNStrConst.S_BLANK);																// 決済ＩＤ
			
			// 取得した情報を退避しておく
			serchResltCN0101.put(settlementWayId, cn0101resultMap);
		}
	}

	/**
	 * 課金参照呼出のリクエストメッセージを作成します。
	 * 
	 * @param ccMsg
	 * @return
	 */
	private Object[][] editChrgSnshoInMsg(HashMap<String, Object> ccMsg) {
		
		String funcCode =  (String)ccMsg.get(FUNC_CODE);

		if(FUNC_CODE_1.equals(funcCode))
		{
			Object[][] ecna0180001in = 
			{
				  {ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}				// テンプレートＩＤ
				, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
				, {ECNA0180001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}				// ＫＥＹ＿ＳＹＳＩＤ
				, {ECNA0180001CBSMsg.KEY_TARGET_DATE, (String)ccMsg.get(TARGET_DATE)}	// ＫＥＹ＿対象年月
				, {ECNA0180001CBSMsg.KEY_PAGE, (String)ccMsg.get(PAGE)}					// ＫＥＹ＿ページ番号
				, {ECNA0180001CBSMsg.KEY_PER_PAGE, (String)ccMsg.get(PER_PAGE)}			// ＫＥＹ＿１ページに表示する件数
				, {ECNA0180001CBSMsg.KEY_SORT, "2"}										// ＫＥＹ＿ソート順
				, {ECNA0180001CBSMsg.KEY_SORT_ORDER, "0"}								// ＫＥＹ＿昇順/降順
			};
			
			return ecna0180001in;
		}
		else if(FUNC_CODE_2.equals(funcCode))
		{
			Object[][] ecna0180001in = 
			{
				  {ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}				// テンプレートＩＤ
				, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
				, {ECNA0180001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}				// ＫＥＹ＿ＳＹＳＩＤ
				, {ECNA0180001CBSMsg.KEY_TARGET_DATE, (String)ccMsg.get(TARGET_DATE)}	// ＫＥＹ＿対象年月
				, {ECNA0180001CBSMsg.KEY_SORT, "3,4,2"}									// ＫＥＹ＿ソート順
				, {ECNA0180001CBSMsg.KEY_SORT_ORDER, "1,0,0"}							// ＫＥＹ＿昇順/降順
			};
			
			return ecna0180001in;
		}
		//2023/12/22 add start
		else if(FUNC_CODE_3.equals(funcCode))
		{
			Object[][] ecna0180001in = 
			{
				  {ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}				// テンプレートＩＤ
				, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
				, {ECNA0180001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}				// ＫＥＹ＿ＳＹＳＩＤ
				, {ECNA0180001CBSMsg.KEY_TARGET_DATE, (String)ccMsg.get(TARGET_DATE)}	// ＫＥＹ＿対象年月
				, {ECNA0180001CBSMsg.KEY_SETTLEMENT_WAY_NUMBER, "1"}					// ＫＥＹ＿決済方法番号  1:クレジットカード
				, {ECNA0180001CBSMsg.KEY_SORT, "4,2"}									// ＫＥＹ＿ソート順  決済方法ID、コンテンツID
				, {ECNA0180001CBSMsg.KEY_SORT_ORDER, "0,0"}							// ＫＥＹ＿昇順/降順  0(昇順)、0(昇順)
			};
			
			return ecna0180001in;
		}
		//2023/12/22 add end
		// ANK-4346-00-00 20240105 ADD START
		else if(FUNC_CODE_4.equals(funcCode))
		{
			Object[][] ecna0180001in = 
			{
				  {ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}				// テンプレートＩＤ
				, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
				, {ECNA0180001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}				// ＫＥＹ＿ＳＹＳＩＤ
				, {ECNA0180001CBSMsg.KEY_TARGET_DATE, (String)ccMsg.get(TARGET_DATE)}	// ＫＥＹ＿対象年月
				, {ECNA0180001CBSMsg.KEY_SETTLEMENT_WAY_NUMBER, (String)ccMsg.get(SETTLEMENT_WAY_NUMBER)}					// ＫＥＹ＿決済方法番号
				, {ECNA0180001CBSMsg.KEY_SORT, "4,2"}									// ＫＥＹ＿ソート順  決済方法ID、コンテンツID
				, {ECNA0180001CBSMsg.KEY_SORT_ORDER, "0,0"}							// ＫＥＹ＿昇順/降順  0(昇順)、0(昇順)
			};
			
			return ecna0180001in;
		}
		// ANK-4346-00-00 20240105 ADD END
		else
		{
			// ここに入ることはありえない
			Object[][] ecna0180001in = 
			{
				  {ECNA0180001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0180001}				// テンプレートＩＤ
				, {ECNA0180001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
			};
			
			return ecna0180001in;
		}
	}

	/**
	 * 契約情報取得呼出のリクエストメッセージを作成します。
	 * 
	 * @param ccMsg
	 * @param contractNo
	 * @param serviceId
	 * @return
	 */
	private Object[][] editContIcrnInfoInMsg(HashMap<String, Object> ccMsg, String contractNo, String serviceId) {
		
		String funcCode =  (String)ccMsg.get(FUNC_CODE);

		if(FUNC_CODE_1.equals(funcCode))
		{
			Object[][] ecna0170001in =
			{
				  {ECNA0170001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0170001}		// テンプレートＩＤ
				, {ECNA0170001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}		// 機能コード
				, {ECNA0170001CBSMsg.CONTRACT_NO, contractNo}					// 契約番号
				, {ECNA0170001CBSMsg.RETURN_CONTRACT, "1"}						// コンテンツ契約情報要否
				, {ECNA0170001CBSMsg.RETURN_CHARGE, "0"}						// 直近課金情報要否
				, {ECNA0170001CBSMsg.RETURN_CONTRACT_ADDS, "1"}					// 契約付加情報要否
			};
			
			return ecna0170001in;
		}
		// ANK-4346-00-00 20240117 性能改善 DEL START 
//		else if(FUNC_CODE_2.equals(funcCode) || FUNC_CODE_4.equals(funcCode))
//		{
//			Object[][] ecna0170001in =
//			{
//				  {ECNA0170001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0170001}		// テンプレートＩＤ
//				, {ECNA0170001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}		// 機能コード
//				, {ECNA0170001CBSMsg.SERVICE_ID, serviceId}						// コンテンツサービスＩＤ
//				, {ECNA0170001CBSMsg.CONTRACT_NO, contractNo}					// 契約番号
//				, {ECNA0170001CBSMsg.RETURN_CONTRACT, "1"}						// コンテンツ契約情報要否
//				, {ECNA0170001CBSMsg.RETURN_CHARGE, "0"}						// 直近課金情報要否
//				, {ECNA0170001CBSMsg.RETURN_CONTRACT_ADDS, "1"}					// 契約付加情報要否
//			};
//			
//			return ecna0170001in;
//		}
		// ANK-4346-00-00 20240117 性能改善 DEL END
		else
		{
			// ここに入ることはありえない
			Object[][] ecna0170001in = 
			{
				  {ECNA0170001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECNA0170001}				// テンプレートＩＤ
				, {ECNA0170001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}				// 機能コード
			};
			
			return ecna0170001in;
		}
	}

	/**
	 * 訂正区分名称を取得します。
	 * 
	 * @param correctedDivision 訂正区分
	 * @return 訂正区分名称
	 */
	private String getCorrectedDivisionNm (String correctedDivision)
	{
		String value = JCNStrConst.S_BLANK;
		
		if(!JCNStringUtil.isNullEmpty(correctedDivision))
		{
			// 訂正区分が"1"の場合
			if(CORRECTED_DIVISION_1.equals(correctedDivision))
			{
				value = CORRECTED_DIVISION_NM_1;
			}
			// 訂正区分が"2"の場合
			else if(CORRECTED_DIVISION_2.equals(correctedDivision))
			{
				value = CORRECTED_DIVISION_NM_2;
			}
			
		}
		return value;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出します。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @return サービスインターフェイス実行結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData)
	throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object RETURN_CODE = result.get(JCMConstants.RET_CD_INT_KEY);
		
//		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)RETURN_CODE, dataMapKey);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
//		// 異常の場合、SCCallExceptionを生成してスローする
//		if (!("0".equals(RETURN_CODE.toString()) && 0 == status))
//		{
//			throw new SCCallException("戻り値不正", RETURN_CODE.toString(), status);
//		}
		// SCCallExceptionはスローしない
		
		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @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++)
		{
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		
		templates[0] = template;
		
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param errorCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int errorCode, String dataMapKey)
	throws RequestParameterException
	{
		CAANMsg template = templates[0];
		
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != errorCode)
		{
			templateStatus = 9000;
		}
		
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(dataMapKey);
		
		HashMap map = template.getHashMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = map.get(key);
			if (value instanceof HashMap[])
			{
				HashMap[] childMapList = (HashMap[])value;
				for (HashMap childMap : childMapList)
				{
					Iterator childIt = childMap.keySet().iterator();
					while (childIt.hasNext())
					{
						String childKey = (String)childIt.next();
						if (childKey.endsWith(ERRITEM_SUFFIX))
						{
							int keyIdx = childKey.lastIndexOf(ERRITEM_SUFFIX);
							if (inMap.containsKey(childKey.substring(0, keyIdx)))
							{
								inMap.put(childKey, childMap.get(childKey));
							}
						}
					}
				}
			}
			else
			{
				if (key.endsWith(ERRITEM_SUFFIX))
				{
					int keyIdx = key.lastIndexOf(ERRITEM_SUFFIX);
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, map.get(key));
					}
				}
			}
		}
		
		return param;
	}
}
