/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKPcrsInfoCC
*	ソースファイル名：JKKPcrsInfoCC.java
*	作成者			：富士通
*	日付			：2011年12月13日
*＜機能概要＞
*	料金コース情報照会CC
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/13	FJ)古内		新規作成
*	v3.00.00	2012/08/05	FJ)団		【ANK-0545-00-00】サービスコード対応
*	v3.00.01	2012/08/06	FJ)団		ＫＥＹ＿旧ICSコード変換種別コードの設定値02→04に修正
*	v3.00.02	2012/08/20	FJ)団		【ANK-0546-02-00】イオスマートリンク対応
*	v4.00.00	2013/05/08	FJ)強矢		【IT1-2013-0001179】対応
*	v4.00.01	2013/07/11	FJ)団		【LT-2013-0000437】障害対応
*	v4.00.02	2013/07/13	FJ)団		【IT1-2013-0001378】障害対応
*   v51.00.00	2020/10/20	FJ)西窪		【ANK-3949-04-00】Netflix導入対応（STEP1）
**********************************************************************/
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.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0251B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0251B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1631B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1631B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1631B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2141B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2141B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0011B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKU0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0331A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0331A010CBSMsg1List;


/**
 * 料金コース情報の照会を行う部品。
 * 
 * @author 909141
 *
 */
public class JKKPcrsInfoCC extends AbstractCommonComponent
{

	/** CBSMsgのテンプレートID項目 */
	private static final String TEMPLATEID = "templateID";
	
	/** CBSMsgの機能コード項目 */
	private static final String FUNC_CODE = "func_code";
	
	/** CBSMsgのステータス項目 */
	private static final String STATUS = "status";
	
	/** テンプレートID(EKK0081A010) */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	
	/** テンプレートID(EKK1681B001) */
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";
	
	/** テンプレートID(EKK0251B001) */
	private static final String TEMPLATE_ID_EKK0251B001 = "EKK0251B001";
	
	/** テンプレートID(EKK0251A010) */
	private static final String TEMPLATE_ID_EKK0251A010 = "EKK0251A010";
	
	/** テンプレートID(EZM0331A010) */
	private static final String TEMPLATE_ID_EZM0331A010 = "EZM0331A010";
	
	/** テンプレートID(EKK0791A010) */
	private static final String TEMPLATE_ID_EKK0791A010 = "EKK0791A010";
	
	/** テンプレートID(EKU0161A010) */
	private static final String TEMPLATE_ID_EKU0161A010 = "EKU0161A010";
	
	/** テンプレートID(EKU0011B010) */
	private static final String TEMPLATE_ID_EKU0011B010 = "EKU0011B010";
	
	/** テンプレートID(EKU0011A010) */
	private static final String TEMPLATE_ID_EKU0011A010 = "EKU0011A010";
	
	/** テンプレートID(EKK1631B002) */
	private static final String TEMPLATE_ID_EKK1631B002 = "EKK1631B002";
	
	/** テンプレートID(EKK1631B001) */
	private static final String TEMPLATE_ID_EKK1631B001 = "EKK1631B001";
	
	/** テンプレートID(EKK2141B001) */
	private static final String TEMPLATE_ID_EKK2141B001 = "EKK2141B001";
	
	/** テンプレートID(EKK0481B001) */
	private static final String TEMPLATE_ID_EKK0481B001 = "EKK0481B001";
	
	/** テンプレートID(EKK0451A010) */
	private static final String TEMPLATE_ID_EKK0451A010 = "EKK0451A010";
	
	/** テンプレートID(EKK0841A010) */
	private static final String TEMPLATE_ID_EKK0841A010 = "EKK0841A010";
	
	/** サービスID */
	private static final String SERVICE_ID = "KKSV033401CC";
	
//ANK-3949-04-00 ADD START	
	/** Netflixパック */
	private static final String NETFLIX_PACK = "Ｎｅｔｆｌｉｘパック";
//ANK-3949-04-00 ADD END
	
	/**
	 * 料金コース情報の照会を行う。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchPcrsInfo(SessionHandle handle, 
														IRequestParameterReadWrite param, 
														String fixedText) throws Exception
	{
		HashMap<String, Object> work02Map = new HashMap<String, Object>();
		param.setData("KKSV0334WORK02", work02Map);
		
		String curPCRS_CD = "";			// 料金コースコード（カレント）
		String curPCRS_CD_NM = "";		// 料金コースコード名
		//String rsvPCRS_CD = "";			// 料金コースコード（予約）
		String rsvPCRS_CD_NM = "";		// 料金コースコード名（予約）
		String ponSbtCd = "";			// ＰＯＮ種別コード
		String gePonUseKH = "";			// GE-PON利用可否
		String kitenHdshoCd = "";		// 起点変電所コード
		String kojiAkNo = "";			// 工事案件番号
		String webDspYoPrcSetmei = "";	// WEB表示用料金説明
		String koji_um = "";			// 工事有無
		String kojiak_jssi_ymd = "";	// 工事案件実施年月日
		String rsv_aply_ymd = "";		// 予約適用年月日
		String mskm_dtl_no = "";		// 申込明細番号
		String new_prc_grp_cd = "";		// 新料金グループコード
		String new_pcrs_cd = "";		// 新料金コースコード
		String new_pplan_cd = "";		// 新料金プランコード
		
		// 認証ID変更有のデータ０件フラグ(料金コース変更可能条件)
		int ninshoIdChgUm_zero_flg = -1;
		
		// ◇ SC呼出実行
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ◇ 上りマッピング処理
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		HashMap<String, Object> work01Map = (HashMap<String, Object>)param.getData("KKSV0334WORK01");
		
		// *** EKK0081A010(サービス契約一意照会) の実行 ***
		Object[][] ekk0081a010IN = {
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿世代登録年月日時分秒
			{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)},
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0081a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
		
		// 処理結果判定
		CAANMsg[] ekk0081a010MsgList = ekk0081a010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		if (ekk0081a010MsgList.length > 0)
		{
			String svcKeiStat = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
			// "020"(照査済)"030"(締結済)"100"(サービス提供中)"210"(休止・中断中)"220"(停止中)以外は対象データとしない。
			if ("020".equals(svcKeiStat) 
					|| "030".equals(svcKeiStat) 
					|| "100".equals(svcKeiStat) 
					|| "210".equals(svcKeiStat)
					|| "220".equals(svcKeiStat))
			{
				curPCRS_CD = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.PCRS_CD);
			}
		}
		
		// *** EKK1681B001(異動予約一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk1681b001IN = {
			// "00009"(コース変更) => ＫＥＹ＿異動区分
			{EKK1681B001CBSMsg.KEY_IDO_DIV, "00009"},
			// "" => ＫＥＹ＿異動予約詳細コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK1681B001CBSMsg.KEY_RSV_APLY_YMD, ""},
			// "00"(未反映) => ＫＥＹ＿異動予約状態コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00"},
			// "" => ＫＥＹ＿申込明細番号
			{EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, ""},
			// "" => ＫＥＹ＿ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_SYSID, ""},
			// "" => ＫＥＹ＿請求契約番号
			{EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, ""},
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿サービス契約内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
			// "" => ＫＥＹ＿オプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サブオプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿機器提供サービス契約番号
			{EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿割引サービス契約番号
			{EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サービス契約回線内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, ""},
			// "" => ＫＥＹ＿併合先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID, ""},
			// "" => ＫＥＹ＿分割先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, ""},
			// "" => ＫＥＹ＿併合先請求契約番号
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿分割先請求契約番号
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿工事案件番号
			{EKK1681B001CBSMsg.KEY_KOJIAK_NO, ""},
			// "" => ＫＥＹ＿オプション引継先サービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿ソート項目Ｎｏ
			{EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, ""},
			// "" => ＫＥＹ＿ソート区分
			{EKK1681B001CBSMsg.KEY_SORT_KBN, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk1681b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1681B001, "1", ekk1681b001IN);
		
		// 処理結果判定
		CAANMsg[] ekk1681b001MsgList = ekk1681b001Msg.getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
		if (0 < ekk1681b001MsgList.length)
		{
			rsv_aply_ymd = ekk1681b001MsgList[0].getString(EKK1681B001CBSMsg1List.RSV_APLY_YMD);
			mskm_dtl_no = ekk1681b001MsgList[0].getString(EKK1681B001CBSMsg1List.MSKM_DTL_NO);
			new_prc_grp_cd = ekk1681b001MsgList[0].getString(EKK1681B001CBSMsg1List.NEW_PRC_GRP_CD);
			new_pcrs_cd = ekk1681b001MsgList[0].getString(EKK1681B001CBSMsg1List.NEW_PCRS_CD);
			new_pplan_cd = ekk1681b001MsgList[0].getString(EKK1681B001CBSMsg1List.NEW_PPLAN_CD);
		}
		
		// **** 回線内訳取得 *****
		// *** EKK0251B001(ＫＥＹ＿サービス契約番号) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk0251b001IN = {
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK0251B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0251b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0251B001, "1", ekk0251b001IN);
		
		// 処理結果判定
		CAANMsg[] ekk0251b001MsgList = ekk0251b001Msg.getCAANMsgList(EKK0251B001CBSMsg.EKK0251B001CBSMSG1LIST);
		if (ekk0251b001MsgList != null && 0 < ekk0251b001MsgList.length)
		{
			// *** EKK0251A010(サービス契約回線内訳一意照会) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk0251a010IN = {
				// EKK0251B001CBSMsg．サービス回線内訳番号 => ＫＥＹ＿サービス契約番号
				{EKK0251A010CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, ekk0251b001MsgList[0].getString(EKK0251B001CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO)},
				// "" => ＫＥＹ＿サービス契約番号
				{EKK0251A010CBSMsg.KEY_GENE_ADD_DTM, ""},
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0251a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0251A010, "2", ekk0251a010IN);
			
			CAANMsg[] ekk0251a010MsgList = ekk0251a010Msg.getCAANMsgList(EKK0251A010CBSMsg.EKK0251A010CBSMSG1LIST);
			// ※ 回線内訳一覧照会にて取得したキー項目に対する一意照会であるため、必ず取得できる。
			ponSbtCd = ekk0251a010MsgList[0].getString(EKK0251A010CBSMsg1List.PON_SBT_CD);
			kitenHdshoCd = ekk0251a010MsgList[0].getString(EKK0251A010CBSMsg1List.KITEN_HDSHO_CD);
			
			if (kitenHdshoCd != null && !"".equals(kitenHdshoCd))
			{
				// *** EZM0331A010(起点変電所一意照会) の実行 ***
				// ◇ 上りマッピング処理
				Object[][] ezm0331a010IN = {
					// EKK0251A010.起点変電所コード => ＫＥＹ＿起点変電所コード
					{EZM0331A010CBSMsg.KEY_KITEN_HDSHO_CD, kitenHdshoCd}
				};
				
				// ◇ SC呼出実行
				CAANMsg ezm0331a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EZM0331A010, "1", ezm0331a010IN);
				CAANMsg[] ezm0331a010MsgList = ezm0331a010Msg.getCAANMsgList(EZM0331A010CBSMsg.EZM0331A010CBSMSG1LIST);
				
				// 起点変電所一意照会明細の取得件数が１件以外の場合
				if (ezm0331a010MsgList == null || ezm0331a010MsgList.length != 1)
				{
					work02Map.put("return_result_cd", "029019");
					return param;
				}
				
				if (ezm0331a010MsgList.length == 1)
				{
					gePonUseKH = ezm0331a010MsgList[0].getString(EZM0331A010CBSMsg1List.GEPON_USE_KH);
				}
				
				// GE-PON利用可否が "0" または "1" 以外の場合
				if (!("0".equals(gePonUseKH) || "1".equals(gePonUseKH)))
				{
					work02Map.put("return_result_cd", "029003");
					return param;
				}
			}
		}
		
		String pcrs_pon_joken_cd = "";
		if (curPCRS_CD != null && !"".equals(curPCRS_CD))
		{
			// *** EKK0791A010(料金コース一意照会) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk0791a010IN = {
					// EKK0081A010CBSMsg．料金コースコード => ＫＥＹ＿料金コースコード
					{EKK0791A010CBSMsg.KEY_PCRS_CD, curPCRS_CD},
					// "" => ＫＥＹ＿世代登録年月日時分秒
					{EKK0791A010CBSMsg.KEY_GENE_ADD_DTM, ""},
					// 運用日 => ＫＥＹ＿予約適用年月日
					{EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0791a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0791A010, "2", ekk0791a010IN);
			
			// 処理結果判定
			CAANMsg[] ekk0791a010MsgList = ekk0791a010Msg.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
			if (ekk0791a010MsgList != null && 0 < ekk0791a010MsgList.length)
			{
				// 料金コースPON条件コード
				pcrs_pon_joken_cd = ekk0791a010MsgList[0].getString(EKK0791A010CBSMsg1List.PCRS_PON_JOKEN_CD);
			}
		}
		
		// *** EKU0161A010(工事有無判定) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] eku0161a010IN = {
				// "007"（回線変える） => ＫＥＹ＿工事受付コード
				{EKU0161A010CBSMsg.KEY_KOJI_UK_CD, "007"},
				// "50"（速度変える） => ＫＥＹ＿工事受付詳細コード
				{EKU0161A010CBSMsg.KEY_KOJI_UK_DTAIL_CD, "50"},
				// "" => ＫＥＹ＿面開発案件番号
				{EKU0161A010CBSMsg.KEY_MENKAIHAT_ANKEN_NO, ""},
				// "" => ＫＥＹ＿リンクSTBフラグ
				{EKU0161A010CBSMsg.KEY_LINK_STB_FLG, ""},
				// "" => ＫＥＹ＿料金グループコード
				{EKU0161A010CBSMsg.KEY_PRC_GRP_CD, ""},
				// EKK0251A010.PON種別コード => ＫＥＹ＿PON種別コード
				{EKU0161A010CBSMsg.KEY_PON_SBT_CD, ponSbtCd},
				// EKK0791A010.料金コースPON条件コード => ＫＥＹ＿料金コースPON条件コード
				{EKU0161A010CBSMsg.KEY_PCRS_PON_JOKEN_CD, pcrs_pon_joken_cd}
		};
		
		// ◇ SC呼出実行
		CAANMsg eku0161a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKU0161A010, "1", eku0161a010IN);
		
		// 処理結果判定
		CAANMsg[] eku0161a010MsgList = eku0161a010Msg.getCAANMsgList(EKU0161A010CBSMsg.EKU0161A010CBSMSG1LIST);
		koji_um = eku0161a010MsgList[0].getString(EKU0161A010CBSMsg1List.KOJI_UM);
		
		// 工事有無が"1"の場合
		if ("1".equals(koji_um))
		{
			// **** 工事案件取得 *****
			// *** EKU0011B010(工事案件一覧照会) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] eku0011b010IN = {
				// ＫＥＹ＿サービス契約番号 => ＫＥＹ＿工事案件番号サービス契約番号
				{EKU0011B010CBSMsg.KEY_KOJIAK_NO_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
				// *********************************************************************************
				// ■工事案件一覧照会S-IFがページング用のため、、ページング情報のIN項目を設定します
				// 表示ページ番号をセットしないと、工事案件一覧照会S-IF内でシステムエラーとなるため
				// *********************************************************************************
				// "2"(部分取得) => 検索処理パターン
				{EKU0011B010CBSMsg.SEARCH_TYPE, "2"},
				// 表示件数
				{EKU0011B010CBSMsg.DISPLAY_NUM, String.valueOf(Integer.MAX_VALUE)},
				// 表示ページ番号
				{EKU0011B010CBSMsg.DISPLAY_PAGE_NUM, "1"},
				// 最大検索件数
				{EKU0011B010CBSMsg.MAX_SEARCH_NUM, String.valueOf(Integer.MAX_VALUE)}
				// *********************************************************************************
			};
			
			// ◇ SC呼出実行
			CAANMsg eku0011b010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKU0011B010, "1", eku0011b010IN);
			
			// 処理結果判定
			CAANMsg[] eku0011b010MsgList = eku0011b010Msg.getCAANMsgList(EKU0011B010CBSMsg.EKU0011B010CBSMSG1LIST);
			if (eku0011b010MsgList != null)
			{
				for (int i = 0; i < eku0011b010MsgList.length; i++)
				{
					kojiAkNo = eku0011b010MsgList[i].getString(EKU0011B010CBSMsg1List.KOJIAK_NO);
					// *** EKU0011A010(工事案件一意照会) の実行 ***
					// ◇ 上りマッピング処理
					Object[][] eku0011a010IN = {
						// EKU0011B010.工事案件番号 => ＫＥＹ＿工事案件番号
						{EKU0011A010CBSMsg.KEY_KOJIAK_NO, kojiAkNo},
					};
					
					// ◇ SC呼出実行
					CAANMsg eku0011a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKU0011A010, "1", eku0011a010IN);
					CAANMsg[] eku0011a010MsgList = eku0011a010Msg.getCAANMsgList(EKU0011A010CBSMsg.EKU0011A010CBSMSG1LIST);
					if (eku0011a010MsgList.length > 0)
					{
						kojiak_jssi_ymd = eku0011a010MsgList[0].getString(EKU0011A010CBSMsg1List.KOJIAK_JSSI_YMD);
					}
					
				}
			}
			
			// 工事案件実施年月日が未設定の場合
			if (kojiak_jssi_ymd == null || "".equals(kojiak_jssi_ymd))
			{
				if (curPCRS_CD != null && !"".equals(curPCRS_CD))
				{
					ninshoIdChgUm_zero_flg = 0;
					
					// *** EKK1631B002(料金コース変更可能条件一覧照会) の実行 ***
					// ◇ 上りマッピング処理
					Object[][] ekk1631b002IN = {
						// EKK0081A010.料金コースコード => ＫＥＹ＿変更前料金コースコード
						{EKK1631B002CBSMsg.KEY_CHGE_BF_PCRS_CD, curPCRS_CD},
						// "" => ＫＥＹ＿変更後料金コースコード
						{EKK1631B002CBSMsg.KEY_CHAF_PCRS_CD, ""},
						// "1"（有り） => ＫＥＹ＿認証ID変更有無
						{EKK1631B002CBSMsg.KEY_NINSHO_ID_CHG_UM, "1"},
						// 運用日 => ＫＥＹ＿運用日付
						{EKK1631B002CBSMsg.KEY_OPE_YMD, JPCBPCommon.getOpeDate(null)},
						// "" => ＫＥＹ＿料金コース変更可能機能識別コード
						{EKK1631B002CBSMsg.KEY_PCRS_CGPSB_KINO_SKBT_CD, ""}
					};
					
					// ◇ SC呼出実行
					CAANMsg ekk1631b002Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1631B002, "1", ekk1631b002IN);
					
					// 処理結果判定
					CAANMsg[] ekk1631b002MsgList = ekk1631b002Msg.getCAANMsgList(EKK1631B002CBSMsg.EKK1631B002CBSMSG1LIST);
					
					if (ekk1631b002MsgList != null && ekk1631b002MsgList.length > 0)
					{
						for (int i = 0; i < ekk1631b002MsgList.length; i++)
						{
							// 変更後料金コースコード
							String chaf_pcrs_cd = ekk1631b002MsgList[i].getString(EKK1631B002CBSMsg1List.CHAF_PCRS_CD);
							
							// 変更後料金コースコード(PK)が、異動予約一覧照会で取得した新料金コースコードと一致すること
							if (chaf_pcrs_cd.equals(new_pcrs_cd))
							{
								ninshoIdChgUm_zero_flg = 1;
								break;
							}
						}
					}
				}
			}
		}
		
		// *** EKK1681B001(異動予約一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] adch_ekk1681b001IN = {
			// "00019"(住所変更・登録) => ＫＥＹ＿異動区分
			{EKK1681B001CBSMsg.KEY_IDO_DIV, "00019"},
			// "" => ＫＥＹ＿異動予約詳細コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK1681B001CBSMsg.KEY_RSV_APLY_YMD, ""},
			// "00"(未反映) => ＫＥＹ＿異動予約状態コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00"},
			// "" => ＫＥＹ＿申込明細番号
			{EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, ""},
			// "" => ＫＥＹ＿ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_SYSID, ""},
			// "" => ＫＥＹ＿請求契約番号
			{EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, ""},
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿サービス契約内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
			// "" => ＫＥＹ＿オプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サブオプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿機器提供サービス契約番号
			{EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿割引サービス契約番号
			{EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サービス契約回線内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, ""},
			// "" => ＫＥＹ＿併合先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID, ""},
			// "" => ＫＥＹ＿分割先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, ""},
			// "" => ＫＥＹ＿併合先請求契約番号
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿分割先請求契約番号
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿工事案件番号
			{EKK1681B001CBSMsg.KEY_KOJIAK_NO, ""},
			// "" => ＫＥＹ＿オプション引継先サービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿ソート項目Ｎｏ
			{EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, ""},
			// "" => ＫＥＹ＿ソート区分
			{EKK1681B001CBSMsg.KEY_SORT_KBN, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg adch_ekk1681b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1681B001, "1", adch_ekk1681b001IN);
		
		// 処理結果判定(住所変更中レコードの取得)
		CAANMsg[] adch_ekk1681b001MsgList = adch_ekk1681b001Msg.getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
		
		// *** EKK1631B002(料金コース変更可能条件一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk1631b002IN = {
				// KKSV0334WORK01.旧ICS料金プランコード => ＫＥＹ＿変更前料金コースコード
				{EKK1631B002CBSMsg.KEY_CHGE_BF_PCRS_CD, work01Map.get("ryoukn_prn")},
				// "ZZZ" => ＫＥＹ＿変更後料金コースコード
				{EKK1631B002CBSMsg.KEY_CHAF_PCRS_CD, "ZZZ"},
				// "" => ＫＥＹ＿認証ID変更有無
				{EKK1631B002CBSMsg.KEY_NINSHO_ID_CHG_UM, ""},
				// 運用日 => ＫＥＹ＿運用日付
				{EKK1631B002CBSMsg.KEY_OPE_YMD, JPCBPCommon.getOpeDate(null)},
				// "" => ＫＥＹ＿料金コース変更可能機能識別コード
				{EKK1631B002CBSMsg.KEY_PCRS_CGPSB_KINO_SKBT_CD, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk1631b002Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1631B002, "1", ekk1631b002IN);
		
		// 処理結果判定
		CAANMsg[] ekk1631b002MsgList = ekk1631b002Msg.getCAANMsgList(EKK1631B002CBSMsg.EKK1631B002CBSMSG1LIST);
		
		if (ekk1631b002MsgList != null && ekk1631b002MsgList.length > 0)
		{
			// WEB表示用料金説明の取得
			webDspYoPrcSetmei = ekk1631b002MsgList[0].getString(EKK1631B002CBSMsg1List.WEB_DSP_YO_PRC_SETMEI);
		}
		
		int ekk1631b001ReqCnt = 0;
		if (curPCRS_CD != null && !"".equals(curPCRS_CD))
		{
			// *** EKK1631B001(eo光ネット プラン変更対象一覧照会 (料金コース・料金プラン)) の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk1631b001IN = {
					// EKK0081A010.料金コースコード => ＫＥＹ＿料金コースコード
					{EKK1631B001CBSMsg.KEY_PCRS_CD, curPCRS_CD},
					// "" => ＫＥＹ＿料金コース変更可能機能識別コード
					{EKK1631B001CBSMsg.KEY_PCRS_CGPSB_KINO_SKBT_CD, ""}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk1631b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK1631B001, "1", ekk1631b001IN);
			
			// 処理結果判定
			CAANMsg[] ekk1631b001MsgList = ekk1631b001Msg.getCAANMsgList(EKK1631B001CBSMsg.EKK1631B001CBSMSG1LIST);
			
			if (ekk1631b001MsgList != null)
			{
				// 件数カウンタ(条件：変更前料金コースコードのみ)
				ekk1631b001ReqCnt = ekk1631b001MsgList.length;
			}
		}
		
		// *** EKK2141B001（旧ICSコード変換一覧照会（プラン名称取得）） の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk2141b001_1IN = {
				// "02"（AxM） => ＫＥＹ＿連携先システム識別コード
				{EKK2141B001CBSMsg.KEY_RNK_SAKI_SYS_SKBT_CD, "02"},
				// "02"（料金グループコード） => ＫＥＹ＿旧ICSコード変換種別コード
				{EKK2141B001CBSMsg.KEY_OLD_ICS_CD_CHG_SBT_CD, "04"},
				// "" => ＫＥＹ＿サービス契約ステータス
				{EKK2141B001CBSMsg.KEY_SVC_KEI_STAT, ""},
				// "" => ＫＥＹ＿料金グループコード
				{EKK2141B001CBSMsg.KEY_PRC_GRP_CD, ""},
				// "" => ＫＥＹ＿料金コースコード
				{EKK2141B001CBSMsg.KEY_PCRS_CD, ""},
				// "" => ＫＥＹ＿料金プランコード
				{EKK2141B001CBSMsg.KEY_PPLAN_CD, ""},
				// "" => ＫＥＹ＿即割有無
				{EKK2141B001CBSMsg.KEY_SOKU_WARI_UM, ""},
				// "" => ＫＥＹ＿旧ICS契約状態コード
				{EKK2141B001CBSMsg.KEY_OLD_ICS_KEI_STAT_CD, ""},
				// CC.旧ICS契約サービスコード => ＫＥＹ＿旧ICS契約サービスコード
				{EKK2141B001CBSMsg.KEY_OLD_ICS_KEI_SVC_CD, work01Map.get("kiyk_sbs")},
				// CC.旧ICS料金プランコード => ＫＥＹ＿旧ICS料金プランコード
				{EKK2141B001CBSMsg.KEY_OLD_ICS_PPLAN_CD, work01Map.get("ryoukn_prn")}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk2141b001_1Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK2141B001, "1", ekk2141b001_1IN);
		
		// 処理結果判定
		CAANMsg[] ekk2141b001_1_MsgList = ekk2141b001_1Msg.getCAANMsgList(EKK2141B001CBSMsg.EKK2141B001CBSMSG1LIST);
		if (ekk2141b001_1_MsgList != null && ekk2141b001_1_MsgList.length > 0)
		{
			for (int i = 0; i < ekk2141b001_1_MsgList.length; i++)
			{
				curPCRS_CD_NM = ekk2141b001_1_MsgList[i].getString(EKK2141B001CBSMsg1List.OLD_ICS_PPLAN_NM);
			}
			
			//ANK-3949-04-00 ADD START
			if (curPCRS_CD_NM != null && !"".equals(curPCRS_CD_NM))
			{
				String pcrsCd = "";
				
				if (ekk0081a010MsgList.length > 0){
					pcrsCd = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.PCRS_CD);
				}
				
				if (pcrsCd != null && !"".equals(pcrsCd))
				{
					// *** EKK0791A010(料金コース一意照会) の実行 ***
					// ◇ 上りマッピング処理
					Object[][] ekk0791a010IN = {
							// EKK0081A010CBSMsg．料金コースコード => ＫＥＹ＿料金コースコード
							{EKK0791A010CBSMsg.KEY_PCRS_CD, pcrsCd},
							// "" => ＫＥＹ＿世代登録年月日時分秒
							{EKK0791A010CBSMsg.KEY_GENE_ADD_DTM, ""},
							// 運用日 => ＫＥＹ＿予約適用年月日
							{EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
					};
					
					// ◇ SC呼出実行
					CAANMsg ekk0791a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0791A010, "2", ekk0791a010IN);
					
					// 処理結果判定
					CAANMsg[] ekk0791a010MsgList = ekk0791a010Msg.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
					if (ekk0791a010MsgList != null && 0 < ekk0791a010MsgList.length)
					{
						// 他事業者バンドル区分
						String tajgsBundleDiv = ekk0791a010MsgList[0].getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_DIV);
						
						 if (JKKStrConst.TAJGS_BUNDLE_DIV_001.equals(tajgsBundleDiv))
						 {
							 curPCRS_CD_NM = curPCRS_CD_NM + NETFLIX_PACK;
						 }

					}
				}
			}
			//ANK-3949-04-00 ADD END
		}

		// 新料金コードが取得できた場合、旧システムのプラン名称を取得
		if (null != new_pplan_cd && !"".equals(new_pplan_cd))
		{
			// *** EKK2141B001（旧ICSコード変換一覧照会（変更後プラン名称取得）） の実行 ***
			// ◇ 上りマッピング処理
			Object[][] ekk2141b001_2IN = {
					// "02"（AxM） => ＫＥＹ＿連携先システム識別コード
					{EKK2141B001CBSMsg.KEY_RNK_SAKI_SYS_SKBT_CD, "02"},
					// "02"（料金グループコード） => ＫＥＹ＿旧ICSコード変換種別コード
					{EKK2141B001CBSMsg.KEY_OLD_ICS_CD_CHG_SBT_CD, "04"},
					// "" => ＫＥＹ＿サービス契約ステータス
					{EKK2141B001CBSMsg.KEY_SVC_KEI_STAT, ""},
					// EKK1681B001.新料金グループコード => ＫＥＹ＿料金グループコード
					{EKK2141B001CBSMsg.KEY_PRC_GRP_CD, new_prc_grp_cd},
					// EKK1681B001.新料金コースコード => ＫＥＹ＿料金コースコード
					{EKK2141B001CBSMsg.KEY_PCRS_CD, new_pcrs_cd},
					// EKK1681B001.新料金プランコード => ＫＥＹ＿料金プランコード
					{EKK2141B001CBSMsg.KEY_PPLAN_CD, new_pplan_cd},
					// "" => ＫＥＹ＿即割有無
					{EKK2141B001CBSMsg.KEY_SOKU_WARI_UM, getSokuWariUm(handle, param, scCall, (String)ccMsg.get("key_svc_kei_no"))},
					// "" => ＫＥＹ＿旧ICS契約状態コード
					{EKK2141B001CBSMsg.KEY_OLD_ICS_KEI_STAT_CD, ""},
					// "" => ＫＥＹ＿旧ICS契約サービスコード
					{EKK2141B001CBSMsg.KEY_OLD_ICS_KEI_SVC_CD, ""},
					// CC.旧ICS料金プランコード => ""
					{EKK2141B001CBSMsg.KEY_OLD_ICS_PPLAN_CD, ""}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk2141b001_2Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK2141B001, "1", ekk2141b001_2IN);
			
			// 処理結果判定
			CAANMsg[] ekk2141b001_2_MsgList = ekk2141b001_2Msg.getCAANMsgList(EKK2141B001CBSMsg.EKK2141B001CBSMSG1LIST);
			
			if (ekk2141b001_2_MsgList != null && 0 < ekk2141b001_2_MsgList.length)
			{
				// 新料金コース名
				rsvPCRS_CD_NM = ekk2141b001_2_MsgList[0].getString(EKK2141B001CBSMsg1List.OLD_ICS_PPLAN_NM);
				//ANK-3949-04-00 ADD START
				if (rsvPCRS_CD_NM != null && !"".equals(rsvPCRS_CD_NM))
				{
					if (new_pcrs_cd != null && !"".equals(new_pcrs_cd))
					{
						// *** EKK0791A010(料金コース一意照会) の実行 ***
						// ◇ 上りマッピング処理
						Object[][] ekk0791a010IN = {
								// EKK1681B001.新料金コースコード => ＫＥＹ＿料金コースコード
								{EKK0791A010CBSMsg.KEY_PCRS_CD, new_pcrs_cd},
								// "" => ＫＥＹ＿世代登録年月日時分秒
								{EKK0791A010CBSMsg.KEY_GENE_ADD_DTM, ""},
								// 運用日 => ＫＥＹ＿予約適用年月日
								{EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
						};
						
						// ◇ SC呼出実行
						CAANMsg ekk0791a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0791A010, "2", ekk0791a010IN);
						
						// 処理結果判定
						CAANMsg[] ekk0791a010MsgList = ekk0791a010Msg.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
						if (ekk0791a010MsgList != null && 0 < ekk0791a010MsgList.length)
						{
							// 他事業者バンドル区分
							String tajgsBundleDiv = ekk0791a010MsgList[0].getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_DIV);
							
							 if (JKKStrConst.TAJGS_BUNDLE_DIV_001.equals(tajgsBundleDiv))
							 {
								 rsvPCRS_CD_NM = rsvPCRS_CD_NM + NETFLIX_PACK;
							 }

						}
					}
				}
				//ANK-3949-04-00 ADD END
			}
		}		
		// *** 下りデータの作成 ***
		
		// 下りの各種データを設定
		// 料金コース出力フラグ
		ccMsg.put("priceplan_flg", "1");
		
		// (5) 料金情報数・料金情報の設定
		if (webDspYoPrcSetmei == null || "".equals(webDspYoPrcSetmei))
		{
			ccMsg.put("ryokin_joho_su", "0");
		}
		else
		{
			String replace_webDspYoPrcSetmei = webDspYoPrcSetmei.replace("<BR>", "<br>").replace("<Br>", "<br>").replace("<bR>", "<br>");
			String[] priceInfo = replace_webDspYoPrcSetmei.split("<br>");
			ccMsg.put("ryokin_joho_su", String.valueOf(priceInfo.length));
			
			ArrayList<HashMap<String, Object>> priceInfoArray = new ArrayList<HashMap<String, Object>>();
			
			for (int i = 0; i < priceInfo.length; i++)
			{
				HashMap<String, Object> map = new HashMap<String, Object>();
				map.put("web_ryoukn_stmi", priceInfo[i]);
				priceInfoArray.add(map);
			}
			ccMsg.put("ryoukin_stmiList", priceInfoArray);
		}
		
		// 工事有無の設定
		ccMsg.put("work_flg", "1".equals(koji_um) ? "1" : "0");
		
		boolean rsvPCRS_CD_flg = false;
		// 新料金コースが取得できた場合
		if (new_pcrs_cd != null && !"".equals(new_pcrs_cd))
		{
			rsvPCRS_CD_flg = true;
		}
		
		// コース変更予約フラグの設定
		ccMsg.put("reserve_priceplan_flg", rsvPCRS_CD_flg ? "1" : "0");
		
		// (6) コース変更可能フラグの設定
		ccMsg.put("change_priceplan_flg", "1");
		if (rsvPCRS_CD_flg 
				|| (ekk1631b001ReqCnt == 0)
				|| (0 > adch_ekk1681b001MsgList.length)
				|| (kitenHdshoCd == null || "".equals(kitenHdshoCd))
				|| (ponSbtCd == null || "".equals(ponSbtCd))
				|| "".equals(kojiAkNo)
				|| "0".equals(gePonUseKH))
		{
			ccMsg.put("change_priceplan_flg", "0");
		}
		
		// オプション申込みメニューボタン出力フラグ
		ccMsg.put("option_menu_flg", "0");
		if (rsvPCRS_CD_flg == false
				|| "0".equals(koji_um)
				|| (kojiak_jssi_ymd != null && !"".equals(kojiak_jssi_ymd))
				|| (ninshoIdChgUm_zero_flg == 0))
		{
			ccMsg.put("option_menu_flg", "1");
		}
		
		ccMsg.put("pcrs_cd_nm", curPCRS_CD_NM);
		ccMsg.put("kojiak_no", kojiAkNo);
		ccMsg.put("new_pcrs_nm", rsvPCRS_CD_NM);
		
		work02Map.put("return_result_cd", "000000");
		
		return param;
	}
	
	/**
	 * 即割有無の条件値を取得する
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param key_svc_kei_no
	 * @return 即割有無の条件値
	 * @throws Exception
	 */
	private String getSokuWariUm(SessionHandle handle, 
								IRequestParameterReadWrite param, 
								ServiceComponentRequestInvoker scCall,
								String key_svc_kei_no) throws Exception
	{
		
		// ***** EKK0481B001(割引サービス対象契約一覧照会) の実行 *****
		Object[][] ekk0481b001IN = {
				// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
				{EKK0481B001CBSMsg.KEY_SVC_KEI_NO, key_svc_kei_no},
				// "" => ＫＥＹ＿サービス契約内訳番号
				{EKK0481B001CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
				// "" => ＫＥＹ＿オプションサービス契約番号
				{EKK0481B001CBSMsg.KEY_OP_SVC_KEI_NO, ""},
				// "" => ＫＥＹ＿サブオプションサービス契約番号
				{EKK0481B001CBSMsg.KEY_SBOP_SVC_KEI_NO, ""},
				// "" => ＫＥＹ＿機器提供サービス契約番号
				{EKK0481B001CBSMsg.KEY_KKTK_SVC_KEI_NO, ""},
				// "" => ＫＥＹ＿割引サービス契約番号
				{EKK0481B001CBSMsg.KEY_WRIB_SVC_KEI_NO, ""}
		};
		
		// ◇ SC呼出実行
		CAANMsg ekk0481b001Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0481B001, "1", ekk0481b001IN);
		
		// 処理結果
		CAANMsg[] ekk0481b001MsgList = ekk0481b001Msg.getCAANMsgList(EKK0481B001CBSMsg.EKK0481B001CBSMSG1LIST);
		
		for (int i = 0; i < ekk0481b001MsgList.length; i++)
		{
			// ***** EKK0451A010(割引サービス契約一意照会) の実行 *****
			Object[][] ekk0451a010IN = {
					// EKK0481B001.割引サービス契約番号 => ＫＥＹ＿割引サービス契約番号
					{EKK0451A010CBSMsg.KEY_WRIB_SVC_KEI_NO, ekk0481b001MsgList[i].getString(EKK0481B001CBSMsg1List.WRIB_SVC_KEI_NO)},
					// "" => ＫＥＹ＿世代登録年月日時分秒
					{EKK0451A010CBSMsg.KEY_GENE_ADD_DTM, ""},
					// 運用日 => ＫＥＹ＿予約適用年月日
					{EKK0451A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
			};
			
			// ◇ SC呼出実行
			CAANMsg ekk0451a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0451A010, "2", ekk0451a010IN);
			
			// 処理結果
			CAANMsg[] ekk0451a010MsgList = ekk0451a010Msg.getCAANMsgList(EKK0451A010CBSMsg.EKK0451A010CBSMSG1LIST);
			
			if (ekk0451a010MsgList != null && 0 < ekk0451a010MsgList.length)
			{
				// ***** EKK0841A010(割引サービス一意照会) の実行 *****
				Object[][] ekk0841a010IN = {
						// EKK0451A010.割引サービスコード => ＫＥＹ＿割引サービスコード
						{EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, ekk0451a010MsgList[0].getString(EKK0451A010CBSMsg1List.WRIB_SVC_CD)},
						// "" => ＫＥＹ＿世代登録年月日時分秒
						{EKK0841A010CBSMsg.KEY_GENE_ADD_DTM, ""},
						// 運用日 => ＫＥＹ＿予約適用年月日
						{EKK0841A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
				};
				
				// ◇ SC呼出実行
				CAANMsg ekk0841a010Msg = callSC(handle, param, scCall, TEMPLATE_ID_EKK0841A010, "2", ekk0841a010IN);
				
				// 処理結果
				CAANMsg[] ekk0841a010MsgList = ekk0841a010Msg.getCAANMsgList(EKK0841A010CBSMsg.EKK0841A010CBSMSG1LIST);
				
				if (ekk0841a010MsgList != null && 0 < ekk0841a010MsgList.length)
				{
					// 割引タイプコードが"31"（即割）の場合、"1"（有）を返却する
					String wrib_type_cd = ekk0841a010MsgList[0].getString(EKK0841A010CBSMsg1List.WRIB_TYPE_CD);
					if ("31".equals(wrib_type_cd))
					{
						// "1"（有）を返却する
						return "1";
					}
				}
			}
		}
		
		// "0"（無）を返却する
		return "0";
	}

	/**
	 * チェック処理用のサービスインターフェイスを作成し、返却する。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return HashMap<String, Object> サービスインターフェイスマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, 
												IRequestParameterReadWrite param, 
												String fixedText) throws RequestParameterException
	{
		
		ArrayList<CAANMsg> templateList = new ArrayList<CAANMsg>();
		
		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(SERVICE_ID);
		
		// ■*** EKK0081A010(サービス契約一意照会) の実行 ***
		Object[][] ekk0081a010IN = {
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿世代登録年月日時分秒
			{EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)},
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, TEMPLATE_ID_EKK0081A010, "2", ekk0081a010IN);
		templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// ■*** EKK1681B001(異動予約一覧照会) の実行 ***
		// ◇ 上りマッピング処理
		Object[][] ekk1681b001IN = {
			// "00009"(コース変更) => ＫＥＹ＿異動区分
			{EKK1681B001CBSMsg.KEY_IDO_DIV, "00009"},
			// "" => ＫＥＹ＿異動予約詳細コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, ""},
			// 運用日 => ＫＥＹ＿予約適用年月日
			{EKK1681B001CBSMsg.KEY_RSV_APLY_YMD, ""},
			// "00"(未反映) => ＫＥＹ＿異動予約状態コード
			{EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, "00"},
			// "" => ＫＥＹ＿申込明細番号
			{EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, ""},
			// "" => ＫＥＹ＿ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_SYSID, ""},
			// "" => ＫＥＹ＿請求契約番号
			{EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, ""},
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
			// "" => ＫＥＹ＿サービス契約内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO, ""},
			// "" => ＫＥＹ＿オプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サブオプションサービス契約番号
			{EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿機器提供サービス契約番号
			{EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿割引サービス契約番号
			{EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿サービス契約回線内訳番号
			{EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, ""},
			// "" => ＫＥＹ＿併合先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID, ""},
			// "" => ＫＥＹ＿分割先ＳＹＳＩＤ
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, ""},
			// "" => ＫＥＹ＿併合先請求契約番号
			{EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿分割先請求契約番号
			{EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, ""},
			// "" => ＫＥＹ＿工事案件番号
			{EKK1681B001CBSMsg.KEY_KOJIAK_NO, ""},
			// "" => ＫＥＹ＿オプション引継先サービス契約番号
			{EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO, ""},
			// "" => ＫＥＹ＿ソート項目Ｎｏ
			{EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, ""},
			// "" => ＫＥＹ＿ソート区分
			{EKK1681B001CBSMsg.KEY_SORT_KBN, ""}
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		paramMap = editInMsg(param, TEMPLATE_ID_EKK1681B001, "1", ekk1681b001IN);
		templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// **** 回線内訳取得 *****
		// ■*** EKK0251B001(ＫＥＹ＿サービス契約番号) の実行 ***
		Object[][] ekk0251b001IN = {
			// CC.ＫＥＹ＿サービス契約番号 => ＫＥＹ＿サービス契約番号
			{EKK0251B001CBSMsg.KEY_SVC_KEI_NO, ccMsg.get("key_svc_kei_no")},
		};
		
		// 上りマッピングの処理結果を取得するためのマップを生成
		paramMap = editInMsg(param, TEMPLATE_ID_EKK0251B001, "1", ekk0251b001IN);
		templateList.add(((CAANMsg[])paramMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0]);
		
		// リストに追加されたCAANMsgを配列に変換し、TEMPLATE_LIST_KEYに入れなおす
		CAANMsg[] templates = templateList.toArray(new CAANMsg[0]);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * SC呼出
	 * 
	 * @param handle
	 * @param param
	 * @param scCall
	 * @param svcIfId
	 * @param funcCode
	 * @param svcIfMapData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							IRequestParameterReadWrite param, 
							ServiceComponentRequestInvoker scCall,
							String svcIfId,
							String funcCode,
							Object[][] svcIfMapData) throws Exception
	{
		
		// ◇ 上りマッピング処理
		// 上りマッピングの処理結果を取得するためのマップを生成
		HashMap<String, Object> paramMap = editInMsg(param, svcIfId, funcCode, svcIfMapData);
		
		// SC呼出実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果の判定
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		
		// エラー情報の転記
		editErrorInfo(param, templates, (Integer)result.get(JCMConstants.RET_CD_INT_KEY));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		int status = templates[0].getInt(STATUS);
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status))
		{
			throw new SCCallException("戻り値不正", rtnCode, status);
		}
		
		return ((CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
	}
	
	/**
	 * 上りマッピング処理
	 * 
	 * @param param
	 * @param svcIfId
	 * @param funcCode
	 * @param mapData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, 
												String svcIfId, 
												String funcCode,
												Object[][] mapData) 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));

		CAANMsg template = new CAANMsg("eo.ejb.cbs.cbsmsg." + svcIfId + "CBSMsg");

		// テンプレートID
		template.set(TEMPLATEID, svcIfId);

		template.set(FUNC_CODE, funcCode);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
		
		for (int i = 0; i < mapData.length; i++)
		{
			Object[] mapVal = mapData[i];
			if ("".equals(mapVal[1]))
			{
				template.setNull((String)mapVal[0]);
			}
			else
			{
				template.set((String)mapVal[0], (String)mapVal[1]);
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * サービスインターフェイスのエラー情報をマッピングする。
	 * <br>
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, 
													CAANMsg[] templates,
													int returnCode) throws RequestParameterException
	{
		
		for (int i = 0; i < templates.length; i++)
		{
			CAANMsg template = templates[i];
			int templateStatus = template.getInt(STATUS);
			if (returnCode != 0)
			{
				templateStatus = 9000;
			}
			if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
			{
				templateStatus = 0;
			}

			int bpStatus = 0;
			Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
			if (obj == null)
			{
				bpStatus = -1;
			}
			else
			{
				bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
			}

			if (templateStatus > bpStatus)
			{
				// BPにサービスコンポーネントのステータスを設定する。
				String formatStatus = String.format("%1$04d", templateStatus);
				String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
			}
			
			HashMap inMap = (HashMap)param.getData(SERVICE_ID);
			
			HashMap mp = template.getHashMap();
			
			Iterator it = mp.keySet().iterator();
			while (it.hasNext())
			{
				String key = (String)it.next();
				if (key.endsWith("_err"))
				{
					int keyIdx = key.lastIndexOf("_err");
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, mp.get(key));
					}
				}
			}
			
		}
		
		return param;
	}
}
