/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKOpSvcHktgiSearchCC
 *   ソースファイル名：JKKOpSvcHktgiSearchCC.java
 *   作成者          ：FJ
 *   日付            ：2011年11月11日
 *＜機能概要＞
 * 
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/11/11   FJ）　　    新規作成
 *   v8.00.00    2014/04/02   FJ)北谷     OM-2014-0001247 Myホームページの交換引継ぎができない
 *   v32.00.00   2017/04/13   FJ)三原     ANK-3149-00-00 新セキュリティパック導入
 *   v32.00.01   2017/05/19   FJ)三原     ANK-3149-08-00 新セキュリティパック導入(オプション引継でのセキュリティーパック引継)
 *  v71.00.00    2024/04/22   FJ)渋谷     ANK-4468-00-00 eo光ネット「シンプルプラン」追加対応 
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
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.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B006CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0091A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B007CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B007CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2131B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2131B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
 * オプション引継対象検索コモンコンポーネント部品
 * 
 * @author FJ
 */
public class JKKOpSvcHktgiSearchCC extends AbstractCommonComponent
{

	/** ユーザデータのマップキー */
	private static final String USER_DATA_KEY = "OpSvcHktgiSearch";

	/** サービスインターフェイスのパッケージ */
	private static final String PACKAGE_NAME = "eo.ejb.cbs.cbsmsg.";

	/** LISTサフィックス */
	private static final String SAF_LIST = "CBSMsg1List";

	/** MSGサフィックス */
	private static final String SAF_MSG = "CBSMsg";

	/** 空文字 */
	private static final String STR_EMPTY = "";

	/** お客様一意照会 */
	private static final String ECK0011A010 = "ECK0011A010";

	/** サービス契約一意照会 */
	private static final String EKK0081A010 = "EKK0081A010";

	/** 引継元情報サービス契約一覧照会 */
	private static final String EKK0081B006 = "EKK0081B006";

	/** オプションサービス契約一覧照会 */
	private static final String EKK0361B001 = "EKK0361B001";

	/** オプションサービス契約一覧照会（回復可能チェック） */
	private static final String EKK0351B007 = "EKK0351B007";

	/** 割引サービス契約一覧照会（割引サービス指定） */
	private static final String EKK0451B010 = "EKK0451B010";

	/** サブオプションサービス契約<ISP>一意照会 */
	private static final String EKK0411A010 = "EKK0411A010";

	/** 業務パラメータ管理一意照会 */
	private static final String EZM0321A010 = "EZM0321A010";
	
	/** サービス契約内訳一覧照会 */
	private static final String EKK0161B004 = "EKK0161B004";
	
	//ANK-3149-08-00 ADD START
	/** 割引サービス契約一覧照会（サービス契約番号） */
	private static final String EKK0451B002 = "EKK0451B002";
	/** 割引サービス契約一意照会 */
	private static final String EKK0451A010 = "EKK0451A010";
	//ANK-3149-08-00 ADD END
	
	// ANK-4468-00-00 ADD START
	/** サービス契約<eo光ネット>一意照会 */
	private static final String EKK0091A010 = "EKK0091A010";
	// ANK-4468-00-00 ADD END
	
	/**
	 * オプション引継可能条件一覧照会
	 * @since 02012-01-04
	 */
	private static final String EKK2131B001 = "EKK2131B001";

	// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 START
	/** オプションサービス一覧照会 */
	private static final String EKK0821A010 = "EKK0821A010";
	// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 END
	
	/** 機能コード；１ */
	private static final String FUNC_CD_1 = "1";

	/** 機能コード：２ */
	private static final String FUNC_CD_2 = "2";

	/** サービスコード：インターネットサービス */
	private static final String SVC_CD_01 = "01";

	/** オプションサービスコード：Ｅメール */
	private static final String OP_SVC_CD_B001 = "B001";

	/** オプションサービスコード：Ｍｙホームページ */
	private static final String OP_SVC_CD_B002 = "B002";

	// ANK-3149-00-00 ADD START
	/** オプションサービスコード：マカフィーマルチアクセス */
	private static final String OP_SVC_CD_B130 = "B130";

	/** オプションサービスコード（インターネットサギウォール　ｆｏｒ　ｅｏ）*/
	public static final String OP_SVC_CD_B131 = "B131";

	/** オプションサービスコード（ノートンファミリープレミア　ｆｏｒ　ｅｏ）*/
	public static final String OP_SVC_CD_B132 = "B132";
	// ANK-3149-00-00 ADD END

	/** サブオプションサービスコード：メールウィルスチェック */
	private static final String SBOP_SVC_CD_D03 = "D03";

	/** サービス契約ステータス：010 受付済 */
	private static final String SVC_KEI_STAT_010 = "010";

	/** サービス契約ステータス：020 照査済 */
	private static final String SVC_KEI_STAT_020 = "020";

	/** サービス契約ステータス：030 締結済 */
	private static final String SVC_KEI_STAT_030 = "030";

	/** サービス契約ステータス：100 サービス提供中 */
	private static final String SVC_KEI_STAT_100 = "100";

	/** サービス契約ステータス：210 休止・中断中 */
	private static final String SVC_KEI_STAT_210 = "210";

	/** サービス契約ステータス：910 解約中 */
	private static final String SVC_KEI_STAT_910 = "910";

	/** 割引サービスコード：ファミリーパック */
	private static final String WRIB_SVC_CD_FP_WRIB = "W00000006";
	//ANK-3149-08-00 ADD START
	/** 割引サービスコード：ｅｏセキュリティーパック */
	private static final String WRIB_SVC_CD_SP_WRIB = "W00000010";
	//ANK-3149-08-00 ADD END

	/** お客様一意照会 返却項目 */
	private static final String[] KEYARRAY_ECK0011A010 =
	{
//		// 2012.3.28 IT1-2012-0000280 MOD Start
////			"cust_nm", "cust_kana", "cust_birthd", "keisha_pcd", "keisha_telno"
//			"cust_nm", "cust_kana", "cust_birthd", "keisha_pcd", "keisha_telno", "keisha_ad"
//		// 2012.3.28 IT1-2012-0000280 MOD End
// KT1-2013-0000236 引継元のSYSIDを返却 EDIT_START
			"cust_nm", "cust_kana", "cust_birthd", "keisha_pcd", "keisha_telno", "keisha_ad", "sysid"
// KT1-2013-0000236 EDIT_END
	};

	/** 引継元情報サービス契約一覧照会 返却項目 */
	private static final String[] KEYARRAY_EKK0081B006 =
	{
			"svc_kei_no", "svc_kei_stat", "svc_kei_stat_nm", "svc_cd", "prc_grp_cd", "prc_grp_cd_nm", EKK0081B006CBSMsg1List.PCRS_CD
	};

	/** オプションサービス契約一覧照会 返却項目 */
	private static final String[] KEYARRAY_EKK0361B001 =
	{
			"op_svc_cd", "op_svc_kei_no", "op_svc_kei_stat", "op_svc_kei_stat_nm", "op_svc_cd", "op_svc_nm", "pcrs_cd", "pcrs_cd_nm",
			"svc_staymd", "op_svc_upd_dtm", "mlad", "mllist_nm", "kotei_ip_ad", "netmask", "capa", "op_svc_isp_upd_dtm"
			// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない 2012/12/17 START
			, "url_domain", "url_account", "gene_add_dtm"
			// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない 2012/12/17 END
	};

	private static final String[] KEYARRAY_EKK2131B001 = 
		{
			EKK2131B001CBSMsg1List.HKTGI_MOTO_PCRS_CD, 
			EKK2131B001CBSMsg1List.HKTGI_SAKI_PCRS_CD,
			EKK2131B001CBSMsg1List.HKTGI_TG_OP_SVC_CD
		};


	/**
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite opSvcHktgiSearch(SessionHandle handle, IRequestParameterReadWrite param,
			String fixedText) throws Throwable
	{
		Map<String, Object> userData = (HashMap<String, Object>)param.getData(USER_DATA_KEY);
		Map<String, Object> inputMap = new HashMap<String, Object>();

		String sysid = (String)userData.get("search_sysid");
		String svcKeiNo = (String)userData.get("search_svc_kei_no");
		String hikisakiSysid = (String)userData.get("sysid");
		String hikisakiSvcKeiNo = (String)userData.get("svc_kei_no");

		// 検索用のSYSIDがない場合、SYSIDを取得する
		if (sysid == null || "".equals(sysid)) {
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
			inputMap.put(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
			inputMap.put(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
			inputMap.put(EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, null);
			CAANMsg[] retMsg = runSc(handle, param, EKK0081A010, inputMap);
			if (retMsg == null || retMsg.length == 0)
			{
				return param;
			}
			sysid = retMsg[0].getString(EKK0081A010CBSMsg1List.SYSID);
		}

		// S-IF@：お客様一意照会 を実施
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
		inputMap.put("key_sysid", sysid);
		inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
		inputMap.put("key_gene_add_dtm", null);
		CAANMsg[] retMsg = runSc(handle, param, ECK0011A010, inputMap);
		if (retMsg == null || retMsg.length == 0)
		{
			return param;
		}
		userData.put("ECK0011A010CBSMsg1List", copyMsgsToList(retMsg, KEYARRAY_ECK0011A010));

		// S-IFA：サービス契約一覧照会 を実施
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_sysid", sysid);
		if ("".equals(svcKeiNo))
		{
			inputMap.put("key_svc_kei_no", null);
		}
		else
		{
			inputMap.put("key_svc_kei_no", svcKeiNo);
		}
		retMsg = runSc(handle, param, EKK0081B006, inputMap);
		List<Map<String, Object>> ekk0081B006CbsMsgList = copyMsgsToList(retMsg, KEYARRAY_EKK0081B006);
		
		// S-IF：業務パラメータ管理一意照会
		// メーリングリストのドメインを取得する
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_work_param_id", "KK_MLLIST_NM_DOMAIN");

		retMsg = runSc(handle, param, EZM0321A010, inputMap);
		
		String mlListDomain = null;
		if (retMsg.length > 0)
		{
			mlListDomain = retMsg[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		}
		
		//ANK-4468-00-00 ADD START
		
		// 引継先情報を取得する
		// S-IF ：サービス契約一覧照会 を実施（引継先情報の取得）
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_sysid", hikisakiSysid);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);

		retMsg = runSc(handle, param, EKK0081B006, inputMap);
		
		// 引継ぎ先.サービス契約ステータス
		String hikisakiSvcKeiStat = null;
		if(retMsg.length > 0)
		{
			hikisakiSvcKeiStat = retMsg[0].getString("svc_kei_stat");
		}
		userData.put("hikisaki_svc_kei_stat_cd", hikisakiSvcKeiStat);
		userData.put("hikisaki_svc_kei_stat", retMsg[0].getString("svc_kei_stat_nm"));
		userData.put("hikisaki_svc_cd", retMsg[0].getString("svc_cd"));
		userData.put("hikisaki_prc_grp_cd", retMsg[0].getString("prc_grp_cd"));
		userData.put("hikisaki_prc_grp_nm", retMsg[0].getString("prc_grp_cd_nm"));
		userData.put("hikisaki_pcrs_cd", retMsg[0].getString("pcrs_cd"));

		// 排他制御用にサービス契約一意照会を実施
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
		inputMap.put("key_gene_add_dtm", null);
		inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));

		retMsg = runSc(handle, param, EKK0081A010, inputMap);

		userData.put("hikisaki_last_upd_dtm", retMsg[0].getString("last_upd_dtm"));
		
		// 乗換先サービス判定を行い、結果をマッピングする
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
		
		CAANMsg[] rsltMsg1 = runSc(handle, param, EKK0091A010, inputMap);
		// 乗換元サービス契約番号
		String nrkemtSvkeiNo = null;

		if (rsltMsg1.length > 0)
		{
			nrkemtSvkeiNo = rsltMsg1[0].getString(EKK0091A010CBSMsg1List.NRKEMT_SVKEI_NO);
		}
		userData.put("nrkemt_svkei_no", nrkemtSvkeiNo);
		
		// ANK-4468-00-00 ADD END
		
		// 繰り返し処理@
		List<Map<String, Object>> opList = new ArrayList<Map<String, Object>>();
		List<Map<String, Object>> svcList = new ArrayList<Map<String,Object>>();

		for (int i = 0; null != ekk0081B006CbsMsgList && i < ekk0081B006CbsMsgList.size(); i++)
		{
			Map<String, Object> ekk0081B006Map = ekk0081B006CbsMsgList.get(i);

			String svcKeiStat = (String)ekk0081B006Map.get(EKK0081B006CBSMsg1List.SVC_KEI_STAT);
			String pcrs_cd = (String)ekk0081B006Map.get(EKK0081B006CBSMsg1List.PCRS_CD);
	
			// 引継可能なオプションの一覧を取得する
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
			inputMap.put(EKK2131B001CBSMsg.KEY_HKTGI_MOTO_PCRS_CD, pcrs_cd);
			inputMap.put(EKK2131B001CBSMsg.KEY_HKTGI_TG_OP_SVC_CD, "");
			retMsg = runSc(handle, param, EKK2131B001, inputMap);

			List<Map<String, Object>> targetOpList = copyMsgsToList(retMsg, KEYARRAY_EKK2131B001);


			// @契約ステータス
			if (!SVC_KEI_STAT_010.equals(svcKeiStat) && !SVC_KEI_STAT_020.equals(svcKeiStat)
					&& !SVC_KEI_STAT_030.equals(svcKeiStat) && !SVC_KEI_STAT_100.equals(svcKeiStat))
			{
				// @契約ステータス
				if (!SVC_KEI_STAT_210.equals(svcKeiStat) && !SVC_KEI_STAT_910.equals(svcKeiStat))
				{
					continue;
				}
				else
				{

				}
			}

			// Aネット契約であること
			if (!SVC_CD_01.equals((String)ekk0081B006Map.get("svc_cd")))
			{
				continue;
			}

			String svcKeiNoIn = (String)ekk0081B006Map.get(EKK0081B006CBSMsg1List.SVC_KEI_NO);
			// B引継ぎ先と同一契約者(SYSID)が指定された場合について
			// 引継ぎ先サービスのサービス契約番号は引継ぎサービス一覧欄には表示しない。
			if (hikisakiSysid.equals(sysid) && hikisakiSvcKeiNo.equals(svcKeiNoIn))
			{
				continue;
			}

			// 排他制御用にサービス契約一意照会を実施
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
			inputMap.put("key_svc_kei_no", svcKeiNoIn);
			inputMap.put("key_gene_add_dtm", null);
			inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));

			retMsg = runSc(handle, param, EKK0081A010, inputMap);

			ekk0081B006CbsMsgList.get(i).put("last_upd_dtm", retMsg[0].getString("last_upd_dtm"));
			
// IT2-2012-0000585 2012/06/14 add start
			// サービス契約内訳番号取得用にサービス契約内訳一覧照会
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, JPCModelConstant.FUNC_CD_1);
			inputMap.put(EKK0161B004CBSMsg.KEY_SVC_KEI_NO, svcKeiNoIn);
			retMsg = (CAANMsg[])runSc(handle, param, EKK0161B004, inputMap);
			if(retMsg.length > 0)
			{
				ekk0081B006CbsMsgList.get(i).put("svc_kei_ucwk_no", retMsg[0].getString("svc_kei_ucwk_no"));
			}
// IT2-2012-0000585 2012/06/14 add end

			// S-IFB：オプションサービス契約一覧照会 を実施
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);	//2012-09-10変更　IT2-2012-0001495（"2" ← "1"）
			inputMap.put("key_svc_kei_no", svcKeiNoIn);

			retMsg = runSc(handle, param, EKK0361B001, inputMap);

			List<Map<String, Object>> ekk0361B001CbsMsgList = copyMsgsToList(retMsg, KEYARRAY_EKK0361B001);

			// 20130713 LT-2013-0000391 Myホームページの引継ぎ対象の取得処理 ADD START
			int opSvcMyHomePageCnt = 0;
			// OM-2014-0001247 2014/04/02 start
			List<Map<String, Object>> myhpOpList = new ArrayList<Map<String, Object>>();
			
			// Myホームページ情報の確認を実施する
			for (int j = 0; j < ekk0361B001CbsMsgList.size(); j++)
			{
				
				Map<String, Object> map = ekk0361B001CbsMsgList.get(j);

				if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
				{
					String opSvcKeiStat = (String)map.get("op_svc_kei_stat");
					// サービス提供中のMyホームページがいる場合
					if (SVC_KEI_STAT_010.equals(opSvcKeiStat) 
							|| SVC_KEI_STAT_020.equals(opSvcKeiStat)
							|| SVC_KEI_STAT_030.equals(opSvcKeiStat)
							|| SVC_KEI_STAT_100.equals(opSvcKeiStat)
							|| SVC_KEI_STAT_210.equals(opSvcKeiStat)
							|| SVC_KEI_STAT_910.equals(opSvcKeiStat)
						)
					{
						// Myホームページオプションをカウント
						opSvcMyHomePageCnt++;
					}
				}
			}

			if (opSvcMyHomePageCnt == 0)
			{
				// 何もしない
			}
			else
			{
				if (opSvcMyHomePageCnt == 1)
				{
					// Myホームページが１件のみの場合
					for (int j = 0; j < ekk0361B001CbsMsgList.size(); j++)
					{
						Map<String, Object> map = ekk0361B001CbsMsgList.get(j);
						if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
						{
							String opSvcKeiStat = (String)map.get("op_svc_kei_stat");
							if (SVC_KEI_STAT_010.equals(opSvcKeiStat) 
									|| SVC_KEI_STAT_020.equals(opSvcKeiStat)
									|| SVC_KEI_STAT_030.equals(opSvcKeiStat)
									|| SVC_KEI_STAT_100.equals(opSvcKeiStat)
									|| SVC_KEI_STAT_210.equals(opSvcKeiStat)
									|| SVC_KEI_STAT_910.equals(opSvcKeiStat)
								)
							{
								myhpOpList.add(map);
								break;
							}
						}
					}
				}
				else
				{
					// Myホームページが複数件の場合
					
					// 提供中のMyホームページオプション
					for (int j = 0; j < ekk0361B001CbsMsgList.size(); j++)
					{
						Map<String, Object> map = ekk0361B001CbsMsgList.get(j);
						if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
						{
							String opSvcKeiStat = (String)map.get("op_svc_kei_stat");
							if (SVC_KEI_STAT_100.equals(opSvcKeiStat)
									|| SVC_KEI_STAT_210.equals(opSvcKeiStat)
							)
							{
								myhpOpList.add(map);
								break;
							}
						}
					}

					// 解約済のMyホームページオプション
					for (int j = 0; j < ekk0361B001CbsMsgList.size(); j++)
					{
						Map<String, Object> map = ekk0361B001CbsMsgList.get(j);
						if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
						{
							if (SVC_KEI_STAT_910.equals(map.get("op_svc_kei_stat")))
							{
								if (map.get("url_account") != null && ! "".equals(map.get("url_account")))
								{
									myhpOpList.add(map);
								}
							}
						}
					}
				}

				for(int k=0; k<myhpOpList.size(); k++){
					Map<String, Object> tmpOpSvcMyHpMap = myhpOpList.get(k);
					tmpOpSvcMyHpMap.put("svc_kei_no", svcKeiNoIn);
					tmpOpSvcMyHpMap.put("op_svc_kei_rvc_flg", false);
					if (SVC_KEI_STAT_910.equals((String)tmpOpSvcMyHpMap.get("op_svc_kei_stat")))
					{
						// 回復可能期間チェック
						if (checkKaihkPsbPrd(handle, param, tmpOpSvcMyHpMap))
						{
							continue;
						}
						else
						{
							// 回復可能フラグを設定
							tmpOpSvcMyHpMap.put("op_svc_kei_rvc_flg", true);
						}
					}

					if (!isEmptyKey(tmpOpSvcMyHpMap, "url_domain") && !isEmptyKey(tmpOpSvcMyHpMap, "url_account"))
					{
						tmpOpSvcMyHpMap.put("url", (String)tmpOpSvcMyHpMap.get("url_domain") + (String)tmpOpSvcMyHpMap.get("url_account"));
					}

					tmpOpSvcMyHpMap.put("sbop_svc_kei_no", null);
				}
				// ANK-4468-00-00 MOD START
//				opList.addAll(myhpOpList);
				// 光ネット（シンプルプラン以外）⇔eo光シンプルプラン間の乗換による引継対象外レコード除去処理
				// 引継ぎ先のサービス契約番号が乗換先サービス契約かつ、サービス契約ステータスがサービス提供中未満の場合、
				// Myホームページオプションをオプションリストに表示させないようにする
				if (!judgeNrkeSaki(nrkemtSvkeiNo,hikisakiSvcKeiStat))
				{
					opList.addAll(myhpOpList);
				}
				// ANK-4468-00-00 MOD END
			// OM-2014-0001247 2014/04/02 end
				
			}
			// 20130713 LT-2013-0000391 Myホームページの引継ぎ対象の取得処理 ADD END

			for (int j = 0; j < ekk0361B001CbsMsgList.size(); j++)
			{
				Map<String, Object> map = ekk0361B001CbsMsgList.get(j);
				String opSvcKeiStat = (String)map.get("op_svc_kei_stat");

				// ANK-4468-00-00 ADD START
				// 光ネット（シンプルプラン以外）⇔eo光シンプルプラン間の乗換による引継対象外レコード除去処理
				// 引継ぎ先のサービス契約番号が乗換先サービス契約かつ、サービス契約ステータスがサービス提供中未満
				if (judgeNrkeSaki(nrkemtSvkeiNo,hikisakiSvcKeiStat))
				{
					// オプションサービスコードがEメール以外
					if(!OP_SVC_CD_B001.equals(map.get("op_svc_cd")))
					{
						continue;
					}

				}
				// ANK-4468-00-00 ADD END
				// 20130713 LT-2013-0000391 Myホームページの引継ぎ対象は上で取得済のため本ループ内では取得しない ADD START
				if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
				{
					continue;
				}
				// 20130713 LT-2013-0000391 Myホームページの引継ぎ対象は上で取得済のため本ループ内では取得しない ADD END
				// ANK-3149-00-00 ADD START
				// マカフィーマルチアクセスを除外する。
				if (OP_SVC_CD_B130.equals(map.get("op_svc_cd")))
				{
					continue;
				}
				
				// インターネットサギウォールとノートンファミリープレミアのオプションサービス契約ステータスが
				// 照査済、締結済、サービス提供中以外の場合を除外する。
				if(OP_SVC_CD_B131.equals(map.get("op_svc_cd")) || OP_SVC_CD_B132.equals(map.get("op_svc_cd")) )
				{
					if(!SVC_KEI_STAT_020.equals(opSvcKeiStat) && !SVC_KEI_STAT_030.equals(opSvcKeiStat)
						&& !SVC_KEI_STAT_100.equals(opSvcKeiStat) )
					{
						continue;
					}
				}
				// ANK-3149-00-00 ADD END
				// @ステータス
				if (!SVC_KEI_STAT_010.equals(opSvcKeiStat) && !SVC_KEI_STAT_020.equals(opSvcKeiStat)
						&& !SVC_KEI_STAT_030.equals(opSvcKeiStat) && !SVC_KEI_STAT_100.equals(opSvcKeiStat))
				{
					// @ステータス
					if (!SVC_KEI_STAT_210.equals(opSvcKeiStat) && !SVC_KEI_STAT_910.equals(opSvcKeiStat))
					{
						continue;
					}
					else
					{

					}
				}


				// A引継可能なオプションであること。（外部定義による）
				if (!isTargetOption((String)map.get(EKK0361B001CBSMsg1List.OP_SVC_CD), targetOpList))
				{
					continue;
				}

				// サービス契約番号を
				map.put("svc_kei_no", svcKeiNoIn);

				// 判定@ オプションサービスの契約ステータスが"解約中"であるか判定を行う
				map.put("op_svc_kei_rvc_flg", false);
				// 2013-03-28 OT-2013-0000522 MOD START
				//if (SVC_KEI_STAT_910.equals(svcKeiStat))
				if (SVC_KEI_STAT_910.equals(opSvcKeiStat))
				// 2013-03-28 OT-2013-0000522 MOD END
				{
					// 20130713 LT-2013-0000391 checkKaihkPsbPrd内へ移動したため削除 DEL START
//					// S-IFC：オプションサービス契約一覧照会（回復可能チェック）
//					inputMap = new HashMap<String, Object>();
//					inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
//					inputMap.put("key_svc_kei_no", map.get("svc_kei_no"));
//					inputMap.put("key_op_svc_cd", map.get("op_svc_cd"));
//					//↓↓↓2012-03-14追加（SQLファシリティ内でヌルポ）↓↓↓
//					inputMap.put(EKK0351B007CBSMsg.MAX_SEARCH_NUM, "2000");
//					//↑↑↑2012-03-14追加（SQLファシリティ内でヌルポ）↑↑↑
//					retMsg = runSc(handle, param, EKK0351B007, inputMap);
					// 20130713 LT-2013-0000391 checkKaihkPsbPrd内へ移動したため削除 DEL END
					
					// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 START
//					// 回復不可の場合は表示させない
//					if (retMsg == null || retMsg.length == 0)
//					{
////						continue;
//					}
					// 回復可能期間チェック
					// 20130713 LT-2013-0000391 オプションサービス契約一覧照会（回復可能チェック）を移動したため引数変更 MOD START
//					if (checkKaihkPsbPrd(handle, param, map, retMsg))
					if (checkKaihkPsbPrd(handle, param, map))
					// 20130713 LT-2013-0000391 オプションサービス契約一覧照会（回復可能チェック）を移動したため引数変更 MOD END
					{
						continue;
					}
					// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 END

					// 回復可能フラグを設定
					else
					{
						map.put("op_svc_kei_rvc_flg", true);
					}
				}

				// Ｅメールの場合はウィルスチェックの有無を取得
				if (OP_SVC_CD_B001.equals(map.get("op_svc_cd")))
				{
					// サブオプションサービス契約<ISP>一意照会
					inputMap = new HashMap<String, Object>();
					inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
					inputMap.put("key_op_svc_kei_no", map.get("op_svc_kei_no"));
					inputMap.put("key_sbop_svc_kei_no", SBOP_SVC_CD_D03);

					retMsg = runSc(handle, param, EKK0411A010, inputMap);

					if (retMsg != null && retMsg.length > 0)
					{
						map.put("sbop_svc_kei_no", retMsg[0].getString("sbop_svc_kei_no"));
					}
					else
					{
						map.put("sbop_svc_kei_no", null);
					}
				}
				else
				{
					map.put("sbop_svc_kei_no", null);
				}

				// メーリングリストにドメインを追加する
				if (!isEmptyKey(map, "mllist_nm"))
				{
					map.put("mllist_nm", map.get("mllist_nm") + "@" + mlListDomain);
				}
				// 20130713 LT-2013-0000391 Myホームページは上に移動したため削除 DEL START
//				// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない（下のほうにも同様の処理があるがそこはおいておく） 2012/12/17 START
//				if (!isEmptyKey(map, "url_domain") && !isEmptyKey(map, "url_account"))
//				{
//					map.put("url", (String)map.get("url_domain") + (String)map.get("url_account"));
//				}
//				// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない（下のほうにも同様の処理があるがそこはおいておく） 2012/12/17 END
				// 20130713 LT-2013-0000391 Myホームページは上に移動したため削除 DEL END
				opList.add(map);

			}
			svcList.add(ekk0081B006CbsMsgList.get(i));
			//ANK-3149-08-00 ADD START
			//引継元のオプションパック情報を表示する
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
			inputMap.put("key_svc_kei_no", svcKeiNoIn);
			
			CAANMsg[] retMsg2 = runSc(handle, param, EKK0451B002, inputMap);
			
			for(int j=0;j<retMsg2.length;j++){
				if(((String)retMsg2[j].getString("wrib_svc_cd")).equals(WRIB_SVC_CD_SP_WRIB)
						&& ((String)retMsg2[j].getString("wrib_svc_kei_stat")).equals(SVC_KEI_STAT_100)
						&& !((String)retMsg2[j].getString("svc_chrg_staymd")).equals(JKKSvcConst.MAX_YMD)){
					inputMap = new HashMap<String, Object>();
					inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
					inputMap.put("key_wrib_svc_kei_no", (String)retMsg2[j].getString("wrib_svc_kei_no"));
					inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
					
					retMsg = runSc(handle, param, EKK0451A010, inputMap);
					
					userData.put("hikimoto_wrib_svc_kei_stat_nm", (String)retMsg[0].getString("wrib_svc_kei_stat_nm"));
					userData.put("hikimoto_wrib_svc_cd_nm", (String)retMsg[0].getString("wrib_svc_cd_nm"));
					userData.put("hikimoto_svc_chrg_staymd", (String)retMsg[0].getString("svc_chrg_staymd"));
					if(!((String)retMsg[0].getString("svc_chrg_endymd")).equals(JKKSvcConst.MAX_YMD)){
						userData.put("hikimoto_svc_chrg_endymd", (String)retMsg[0].getString("svc_chrg_endymd"));
					}
					else{
						userData.put("hikimoto_svc_chrg_endymd", "");
					}
					userData.put("hikimoto_mskm_kisan_ymd", (String)retMsg[0].getString("mskm_kisan_ymd"));
					//オプション引継CCで一意照会をするためにuserDataに入れる
					userData.put("key_wrib_svc_kei_no", (String)retMsg2[j].getString("wrib_svc_kei_no"));
					userData.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
					break;
				}
				else{
					userData.put("hikimoto_wrib_svc_kei_stat_nm", "");
					userData.put("hikimoto_wrib_svc_cd_nm", "");
					userData.put("hikimoto_svc_chrg_staymd", "");
					userData.put("hikimoto_svc_chrg_endymd", "");
					userData.put("hikimoto_mskm_kisan_ymd", "");
				}
			}
			//ANK-3149-08-00 ADD END
		}
		// 20130713 LT-2013-0000391 ソート順の仕様は明記されていないが、画面設計書の画面イメージにあわせてソート ADD START
		// オプションサービスコード順の昇順でソート
		if (opList.size() > 0)
		{
			Collections.sort(opList, new Comparator<Map<String, Object>>()
					{
						public int compare(Map<String, Object> map1, Map<String, Object> map2)
						{
							String key1 = (String)map1.get("op_svc_cd")+(String)map1.get("op_svc_kei_no")+(String)map1.get("sbop_svc_kei_no");
							String key2 = (String)map2.get("op_svc_cd")+(String)map2.get("op_svc_kei_no")+(String)map2.get("sbop_svc_kei_no");
							return key1.compareTo(key2);
						}
					});
		}
		// 20130713 LT-2013-0000391 ソート順の仕様は明記されていないが、画面設計書の画面イメージにあわせてソート ADD END
		
		
		userData.put("EKK0081B006CBSMsg1List", svcList);
		userData.put("EKK0361B001CBSMsg1List", opList);

		// 引継先情報を取得する
		// S-IF ：お客様一意照会 を実施
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
		inputMap.put("key_sysid", hikisakiSysid);
		inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
		inputMap.put("key_gene_add_dtm", null);
		retMsg = runSc(handle, param, ECK0011A010, inputMap);
		userData.put("hikisaki_cust_nm", retMsg[0].getString("cust_nm"));

		// ANK-4468-00-00 DEL START
//		// S-IF ：サービス契約一覧照会 を実施（引継先情報の取得）
//		inputMap = new HashMap<String, Object>();
//		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
//		inputMap.put("key_sysid", hikisakiSysid);
//		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
//
//		retMsg = runSc(handle, param, EKK0081B006, inputMap);
//
//		userData.put("hikisaki_svc_kei_stat_cd", retMsg[0].getString("svc_kei_stat"));
//		userData.put("hikisaki_svc_kei_stat", retMsg[0].getString("svc_kei_stat_nm"));
//		userData.put("hikisaki_svc_cd", retMsg[0].getString("svc_cd"));
//		userData.put("hikisaki_prc_grp_cd", retMsg[0].getString("prc_grp_cd"));
//		userData.put("hikisaki_prc_grp_nm", retMsg[0].getString("prc_grp_cd_nm"));
//// IT2-2012-0000585 2012/06/14 add end
//		userData.put("hikisaki_pcrs_cd", retMsg[0].getString("pcrs_cd"));
//
//		// 排他制御用にサービス契約一意照会を実施
//		inputMap = new HashMap<String, Object>();
//		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
//		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
//		inputMap.put("key_gene_add_dtm", null);
//		inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
//
//		retMsg = runSc(handle, param, EKK0081A010, inputMap);
//
//		userData.put("hikisaki_last_upd_dtm", retMsg[0].getString("last_upd_dtm"));
//// IT2-2012-0000585 2012/06/14 add end
		// ANK-4468-00-00 DEL END

		// S-IFD：割引サービス契約一覧照会（割引サービス指定）
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
		inputMap.put("key_wrib_svc_cd", WRIB_SVC_CD_FP_WRIB);

		retMsg = runSc(handle, param, EKK0451B010, inputMap);

		userData.put("hikisaki_fami_pack_umu", (retMsg.length > 0));

		// S-IF ：オプションサービス契約一覧照会 を実施
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);

		// TAI-2012-0000081 2012/11/06 ADD START
		//ソート情報をセット
		String key_sort_item_no = (String)userData.get("key_sort_item_no");
		String key_sort_kbn = (String)userData.get("key_sort_kbn");
		inputMap.put("key_sort_item_no", key_sort_item_no);
		inputMap.put("key_sort_kbn", key_sort_kbn);
		// TAI-2012-0000081 2012/11/06 ADD END

		retMsg = runSc(handle, param, EKK0361B001, inputMap);

		// 繰り返し処理@
		List<Map<String, Object>> hikisakiOpList = copyMsgsToList(retMsg, KEYARRAY_EKK0361B001);
		List<Map<String, Object>> viewOpList = new ArrayList<Map<String, Object>>();
		
		for (int i = 0; i < hikisakiOpList.size(); i++)
		{
			Map<String, Object> map = hikisakiOpList.get(i);
			// (9)引継ぎ先オプションサービス一覧の表示条件
			// ｢Ｍｙホームページ」については
			if (OP_SVC_CD_B002.equals(map.get("op_svc_cd")))
			{
				// サービス開始日年月日=未設定 且つ URL=未設定である場合には表示対象外とする。
				if (isEmptyKey(map, "svc_staymd") && isEmptyKey(map, "url_domain") && isEmptyKey(map, "url_account"))
				{
					continue;
				}
			}
			// ANK-3149-00-00 ADD START
			// マカフィーマルチアクセスを除外する。
			String opSvcKeiStat = (String)map.get("op_svc_kei_stat");
			if (OP_SVC_CD_B130.equals(map.get("op_svc_cd")))
			{
				continue;
			}
			
			// インターネットサギウォールとノートンファミリープレミアのオプションサービス契約ステータスが
			// 照査済、締結済、サービス提供中以外の場合を除外する。
			if(OP_SVC_CD_B131.equals(map.get("op_svc_cd")) || OP_SVC_CD_B132.equals(map.get("op_svc_cd")) )
			{
				if(!SVC_KEI_STAT_020.equals(opSvcKeiStat) && !SVC_KEI_STAT_030.equals(opSvcKeiStat)
					&& !SVC_KEI_STAT_100.equals(opSvcKeiStat) )
				{
					continue;
				}
			}
			// ANK-3149-00-00 ADD END
			
			// メーリングリストにドメインを追加する
			if (!isEmptyKey(map, "mllist_nm"))
			{
				map.put("mllist_nm", map.get("mllist_nm") + "@" + mlListDomain);
			}

			// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない 2012/12/17 START
			if (!isEmptyKey(map, "url_domain") && !isEmptyKey(map, "url_account"))
			{
				map.put("url", (String)map.get("url_domain") + (String)map.get("url_account"));
			}
			// IT1-2012-0002373 オプション引継画面にホームページアドレスが表示されない 2012/12/17 END

			viewOpList.add(map);
		}

		// 引継先のオプションサービス一覧を設定
		userData.put("hikisaki_option_svc_info", viewOpList);

		//ANK-3149-08-00 ADD START
		//引継先のオプションパック情報を表示する
		inputMap = new HashMap<String, Object>();
		inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		inputMap.put("key_svc_kei_no", hikisakiSvcKeiNo);
		
		CAANMsg[] retMsg1 = runSc(handle, param, EKK0451B002, inputMap);
		
		for(int i=0;i<retMsg1.length;i++){
			if( ( JPCUtilCommon.Rtrim(((String)retMsg1[i].getString("wrib_svc_cd"))).equals(WRIB_SVC_CD_SP_WRIB)
				|| JPCUtilCommon.Rtrim(((String)retMsg1[i].getString("wrib_svc_cd"))).equals(JKKStrConst.WRIB_SVC_SMARTLINK_PREMIUM) )
					&& (JPCUtilCommon.Rtrim(((String)retMsg1[i].getString("wrib_svc_kei_stat"))).equals(SVC_KEI_STAT_100)
						|| JPCUtilCommon.Rtrim(((String)retMsg1[i].getString("wrib_svc_kei_stat"))).equals(SVC_KEI_STAT_010) )
					&& !JPCUtilCommon.Rtrim(((String)retMsg1[i].getString("svc_chrg_staymd"))).equals(JKKSvcConst.MAX_YMD)){
				inputMap = new HashMap<String, Object>();
				inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
				inputMap.put("key_wrib_svc_kei_no", (String)retMsg1[i].getString("wrib_svc_kei_no"));
				inputMap.put("key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
				
				retMsg = runSc(handle, param, EKK0451A010, inputMap);
				
				userData.put("hikisaki_wrib_svc_kei_stat_nm", (String)retMsg[0].getString("wrib_svc_kei_stat_nm"));
				userData.put("hikisaki_wrib_svc_cd_nm", (String)retMsg[0].getString("wrib_svc_cd_nm"));
				userData.put("hikisaki_svc_chrg_staymd", (String)retMsg[0].getString("svc_chrg_staymd"));
				if(!JPCUtilCommon.Rtrim(((String)retMsg[0].getString("svc_chrg_endymd"))).equals(JKKSvcConst.MAX_YMD)){
					userData.put("hikisaki_svc_chrg_endymd", JPCUtilCommon.Rtrim((String)retMsg[0].getString("svc_chrg_endymd")));
				}
				else{
					userData.put("hikisaki_svc_chrg_endymd", "");
				}
				userData.put("hikisaki_mskm_kisan_ymd", JPCUtilCommon.Rtrim((String)retMsg[0].getString("mskm_kisan_ymd")));
				break;
			}
			else{
				userData.put("hikisaki_wrib_svc_kei_stat_nm", "");
				userData.put("hikisaki_wrib_svc_cd_nm", "");
				userData.put("hikisaki_svc_chrg_staymd", "");
				userData.put("hikisaki_svc_chrg_endymd", "");
				userData.put("hikisaki_mskm_kisan_ymd", "");
			}
		}
		//ANK-3149-08-00 ADD END
		return param;
	}

	/**
	 * @param msgs
	 * @param keyArray
	 * @return <code>CAANMsg</code>を<code>ArrayList</code>に変換した結果
	 */
	private List<Map<String, Object>> copyMsgsToList(CAANMsg[] msgs, String[] keyArray)
	{
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		for (int i = 0; i < msgs.length; i++)
		{
			Map<String, Object> map = new HashMap<String, Object>();
			for (int j = 0; j < keyArray.length; j++)
			{
				if ("prc_grp_cd_nm".equals(keyArray[j]))
				{
					map.put("prc_grp_nm", msgs[i].getString(keyArray[j]));
				}
				else if ("pcrs_cd_nm".equals(keyArray[j]))
				{
					map.put("pcrs_nm", msgs[i].getString(keyArray[j]));
				}
				else if ("op_svc_nm".equals(keyArray[j]))
				{
					map.put("op_svc_nm", msgs[i].getString("op_svc_cd_nm"));
				}
				// 2012.3.28 IT1-2012-0000280 ADD Start
				else if ("keisha_ad".equals(keyArray[j]))
				{
					//契約者都道府県名,契約者市区町村名,契約者大字通称名,契約者字丁目名,契約者番地号
					//契約者住所補記・建物名,契約者住所補記・部屋番号
					//を連結
					map.put(
							"keisha_ad", 
							convertNullString(msgs[i].getString("keisha_state_nm")) + 
							convertNullString(msgs[i].getString("keisha_city_nm")) + 
							convertNullString(msgs[i].getString("keisha_oaztsu_nm")) + 
							convertNullString(msgs[i].getString("keisha_azcho_nm")) + 
							convertNullString(msgs[i].getString("keisha_bnchigo")) + 
							convertNullString(msgs[i].getString("keisha_adrttm")) + 
							convertNullString(msgs[i].getString("keisha_adrrm")));
				}
				// 2012.3.28 IT1-2012-0000280 ADD End
				else
				{
					map.put(keyArray[j], msgs[i].getString(keyArray[j]));
				}
			}
			list.add(map);
		}
		return list;
	}

	// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 START
	/**
	 * 回復可能期間チェックを行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param 業務データ取得用I/F
	 * @param ekk0361B001CbsMsg オプションサービス契約＜ISP＞一覧照会結果
	 * @param ekk0351B007CbsMsgList オプションサービス契約一覧照会（回復可能チェック）結果
	 * @return チェックエラーの場合はtrue、エラーでない場合はfalse
	 * @throws RequestParameterException 
	 * @throws SCException サービスIF実行時にエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	// 20130713 LT-2013-0000391 ekk0351B007CbsMsgListを削除 MOD START
//	private boolean checkKaihkPsbPrd(SessionHandle handle, IRequestParameterReadWrite param, Map ekk0361B001CbsMsg, CAANMsg[] ekk0351B007CbsMsgList)
	private boolean checkKaihkPsbPrd(SessionHandle handle, IRequestParameterReadWrite param, Map ekk0361B001CbsMsg)
// 	20130713 LT-2013-0000391 ekk0351B007CbsMsgListを削除 MOD END
	throws RequestParameterException, SCException
	{
		// 20130713 LT-2013-0000391 opSvcHktgiSearchからへ移動し追加 ADD START
		HashMap<String, Object> ekk0361B001InMap = new HashMap<String, Object>();
		ekk0361B001InMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		ekk0361B001InMap.put("key_svc_kei_no", ekk0361B001CbsMsg.get("svc_kei_no"));
		ekk0361B001InMap.put("key_op_svc_cd", ekk0361B001CbsMsg.get("op_svc_cd"));
		ekk0361B001InMap.put(EKK0351B007CBSMsg.MAX_SEARCH_NUM, "2000");
		CAANMsg[] ekk0351B007CbsMsgList = runSc(handle, param, EKK0351B007, ekk0361B001InMap);
		// 20130713 LT-2013-0000391 opSvcHktgiSearchからへ移動し追加 ADD END
		
		
		
		String opSvcKeiNo = (String)ekk0361B001CbsMsg.get(EKK0361B001CBSMsg1List.OP_SVC_KEI_NO);
		String svcDslYmd = "";
		// オプションサービス契約一覧照会（回復可能チェック）結果からサービス解約年月日を取得
		for (int i = 0; i < ekk0351B007CbsMsgList.length; i++)
		{
			if (opSvcKeiNo.equals(ekk0351B007CbsMsgList[i].getString(EKK0351B007CBSMsg1List.OP_SVC_KEI_NO)))
			{
				svcDslYmd = ekk0351B007CbsMsgList[i].getString(EKK0351B007CBSMsg1List.SVC_DSL_YMD);
				break;
			}
		}

		if (null != svcDslYmd && !"".equals(svcDslYmd))
		{
			String opSvcCd = (String)ekk0361B001CbsMsg.get(EKK0361B001CBSMsg1List.OP_SVC_CD);
			// オプションサービス一意照会
			Map<String, Object> inputMap = new HashMap<String, Object>();
			inputMap = new HashMap<String, Object>();
			inputMap.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_2);
			inputMap.put(EKK0821A010CBSMsg.KEY_OP_SVC_CD, opSvcCd);
			inputMap.put(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
			inputMap.put(EKK0821A010CBSMsg.KEY_GENE_ADD_DTM, null);
			CAANMsg[] retMsg = runSc(handle, param, EKK0821A010, inputMap);
			// 回復可能期間を取得
			String kaihkPsbPrd = "0";
			if (null != retMsg && 0 < retMsg.length)
			{
				kaihkPsbPrd = retMsg[0].getString(EKK0821A010CBSMsg1List.KAIHK_PSB_PRD);
			}

			// 回復判定基準日(回復可能日数 + 解約年月日)を算出
			String kaihkJudgeYmd = JPCUtilCommon.addDay(svcDslYmd, Integer.parseInt(kaihkPsbPrd));

			// 運用日付＞回復判定基準日の場合
			if (JPCUtilCommon.isFutureDate(JCCBPCommon.getOpeDate(null), kaihkJudgeYmd, "0"))
			{
				// 回復可能期間を過ぎているのでエラー
				return true;
			}
		}

		return false;
	}
	// IT1-2012-0002352 回復不可のオプションが引継元に表示される 2012/12/17 END

	/**
	 * @param handle
	 * @param param
	 * @param templateId
	 * @param inMap
	 * @return CAANMsg[]
	 * @throws SCException
	 * @throws RequestParameterException
	 */
	private CAANMsg[] runSc(SessionHandle handle, IRequestParameterReadWrite param, String templateId,
			Map<String, Object> inMap) throws SCException, RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		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));
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		CAANMsg template = new CAANMsg(PACKAGE_NAME + templateId + SAF_MSG);
		template.set(JCMConstants.TEMPLATE_ID_KEY, templateId);
		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));

		// 
		if (inMap != null)
		{
			Set<String> setKey = inMap.keySet();
			Iterator<String> iter = setKey.iterator();
			while (iter.hasNext())
			{
				String key = iter.next();
				if (!isEmptyKey(inMap, key))
				{
					template.set(key, inMap.get(key));
				}
				else
				{
					template.setNull(key);
				}
			}
		}

		// リクエスト用クラスの設定
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		/* ◇ＳＣ呼出実行 */
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] resultTemplates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		return resultTemplates[0].getCAANMsgList(templateId + SAF_LIST);
	}

	/**
	 * @param map
	 * @param key
	 * @return boolean
	 */
	private boolean isEmptyKey(Map<String, ?> map, String key)
	{
		if (map == null || map.get(key) == null || STR_EMPTY.equals(map.get(key)))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * チェック処理<br>
	 * サービスコンポーネント実行用CAANMsgを返却します。<br>
	 * <br>
	 * 
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            (I) 業務データ取得用I/F
	 * @param fixedText
	 *            (I) ユーザ定義文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @throws RequestParameterException
	 * @exception Throwableがスローされます
	 *                。
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		HashMap<String, Object> map = new HashMap<String, Object>();
		// SCインプット共通データ
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		map.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		map.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		map.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		map.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		map.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		map.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		map.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		map.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		map.put(JCMConstants.TEMPLATE_LIST_KEY, null);

		return map;
	}

	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * 
	 * @param param
	 *            デルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates
	 *            CAANMsgクラス配列
	 * @param returnCode
	 *            リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates,
			Integer returnCode) throws Throwable
	{
		return param;
	}

	/**
	 * @param opSvcCd
	 * @param trgtList
	 * @return 引継対象のオプションコードの場合<code>true</code>を返却します
	 */
	private boolean isTargetOption(String opSvcCd, List<Map<String, Object>> trgtList)
	{
		for (int i = 0; i < trgtList.size(); i++)
		{
			Map<String, Object> map = trgtList.get(i);
			if (opSvcCd.equals((String)map.get(EKK2131B001CBSMsg1List.HKTGI_TG_OP_SVC_CD)))
			{
				return true;
			}
		}

		return false;
	}
	
	// 2012.3.28 IT1-2012-0000280 ADD Start
	/**
	 * Null文字列を空文字として返却する。
	 */
	private String convertNullString(String str)
	{
		if(str == null)
		{
			return "";
		}
		return str;
	}
	// 2012.3.28 IT1-2012-0000280 ADD End
	// ANK-4468-00-00 ADD START
	/**
	 * 引継ぎ先のサービス契約番号が乗換先サービス契約かつ、サービス契約ステータスがサービス提供中未満
	 * であるか判断する。
	 * 
	 */
	private boolean judgeNrkeSaki(String nrkemtSvkeiNo,String hikisakiSvcKeiStat)
	{
		// 光ネット（シンプルプラン以外）⇔eo光シンプルプラン間の乗換による引継対象外レコード除去処理
		// 引継ぎ先のサービス契約番号が乗換先サービス契約かつ、サービス契約ステータスがサービス提供中未満の場合、
		if (!JKKStringUtil.isNullBlank(nrkemtSvkeiNo) &&
				(SVC_KEI_STAT_020.equals(hikisakiSvcKeiStat) ||
						SVC_KEI_STAT_030.equals( hikisakiSvcKeiStat)))
		{
			return true;
		}
		return false;
	}
	// ANK-4468-00-00 ADD END
}
