/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKNetflixEnrollCC
*   ソースファイル名：JKKNetflixEnrollCC.java
*   作成者          ：FJ
*   日付            ：2020年12月16日
*＜機能概要＞
*   Netflix用Enroll連携コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v51.00.00   2020/12/16  FJ)西窪     ANK-3949-08-00 Netflix導入対応（STEP1）
*	v52.00.01	2021/01/29  FJ) 吉田	【ANK-3987-19-00】Netflix導入対応（STEP2）
*	v52.00.02	2021/02/02	FJ)澤田     【ANK-3987-13-00】Netflix導入対応(STEP2)
*	v52.00.03   2021/01/26  FJ)三原     【ANK-3987-00-00】Netflix導入対応(STEP2)
*	v52.00.04   2021/04/01  FJ)三原     【OM-2021-0000483】Netflix情報連携でシステムエラー
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
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.JFUStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0201B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0091A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0091A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0090001CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

public class JKKNetflixEnrollCC extends AbstractCommonComponent
{
	private static final String TEMPLATE_ID_EKKA0090001 = "EKKA0090001";
	private static final String TEMPLATE_ID_EKK0091A010 = "EKK0091A010";
	// ANK-3987-19-00 ADD START
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	private static final String TEMPLATE_ID_EKK0791A010 = "EKK0791A010";
	// ANK-3987-19-00 ADD END
	// ANK-3987-13-00 ADD START
	/** オプションサービス契約一覧照会（サービス契約番号） */
	private static final String TEMPLATE_ID_EKK0351B002 = "EKK0351B002";
	// ANK-3987-13-00 ADD END
	// ANK-3987-00-00 ADD START
	private static final Object TEMPLATE_ID_EZM0321A010 = "EZM0321A010";
	private static final Object TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	private static final Object TEMPLATE_ID_EKK0361A010 = "EKK0361A010";
	private static final Object TEMPLATE_ID_ECK0201B003 = "ECK0201B003";
	// ANK-3987-00-00 ADD END

	/** APLConst */
	/** バンドルID */
	private static final String KK_NETFLIX_STANDARD_BUNDLEID = "KK_NETFLIX_STANDARD_BUNDLEID";
	/** Netflix提供ID */
	private static final String KK_NETFLIX_STANDARD_NETFLIXOFFERID = "KK_NETFLIX_STANDARD_NETFLIXOFFERID";
	// ANK-3987-13-00 ADD START
	/** Netflix提供ID(Premium) */
	private static final String KK_NETFLIX_PREMIUM_NETFLIXOFFERID = "KK_NETFLIX_PREMIUM_NETFLIXOFFERID";
	// ANK-3987-13-00 ADD END
	/** EnrollAPI パラメータ固定値 */
	/** イベントタイプ */
	private static final String EVENTTYPE = "New";
	// ANK-3987-13-00 ADD START
	/** イベントタイプ Plan:プラン変更 */
	private static final String EVENTTYPE_PLAN = "Plan";
	// ANK-3987-13-00 ADD END
	/** 優先言語 */
	private static final String PREFERREDLANGUAGE = "ja-JP";
	/** 居住国 */
	private static final String PARTNERCHARGECOUNTRY = "JP";
	// ANK-3987-13-00 ADD START
	/** 契約依頼 */
	private static final String KEIREQ = "0401";
	/** 解約依頼 */
	private static final String DSLREQ = "0402";
	/** エラーコード(サービス契約排他制御) */
	private static final String EXCCTLERR = "EXCCTLERR";
	/** NetflixバンドルID変更依頼 */
	private static final String BUNDLE_ID_REQ = "0404";
	// ANK-3987-13-00 ADD END
	// ANK-3987-00-00 ADD START
	/** 業務パラメータID_KK_KKPRC64501_JDGNSU */
	private static final String KK_KKPRC64501_JDGNSU_KK_KKPRC64501_JDGNSU = "KK_KKPRC64501_JDGNSU";
	// ANK-3987-00-00 ADD END

	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable 
	{
		// ==============================================================================================================
		// ■ INPUTデータ
		// ==============================================================================================================

		// ユーザデータ取得
		Map<String, Object> ccMsg = (Map<String, Object>) param.getData(fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 入力パラメータ

		// □サービス契約番号
		String reqSvcKeiNo = (String) ccMsg.get("svc_kei_no");
		// ANK-3987-13-00 ADD START
		// □他事業者契約異動種別コード 
		String reqTajgsKeiIdoSbtCd = (String) ccMsg.get("tajgs_kei_ido_sbt_cd");
		// ANK-3987-13-00 ADD END

		// ===========================================================================
		// サービス契約＜eo光ネット＞情報の取得。
		// ===========================================================================
		// 「EKK0091A010_サービス契約＜eo光ネット＞一意照会(機能コード：2)」で検索し、サービス契約＜eo光ネット＞情報を取得する。
		// 上りマッピング
		Object[][] ekk0091a010In = {
				{ EKK0091A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0091A010 },
				{ EKK0091A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
				{ EKK0091A010CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo } };
				
		// サービスIF実行
		CAANMsg ekk0091a010Msg = callSC(handle, scCall, param, fixedText, ekk0091a010In, new EKK0091A010CBSMsg().getContents());
				
		// サービス契約＜eo光ネット＞一意照会明細
		CAANMsg[] ekk0091a010Msg1List = ekk0091a010Msg.getCAANMsgList(EKK0091A010CBSMsg.EKK0091A010CBSMSG1LIST);
				
		// サービスIF実行結果チェック
		if (ekk0091a010Msg1List == null || ekk0091a010Msg1List.length == 0) {
			// サービス契約番号で該当データが存在しない場合
			// 基本的には発生しない
			ccMsg.put("ERROR_CD", "99998");
			throw new CCException("", new Exception());
		}
		// ANK-3987-13-00 ADD START
		// 契約依頼
		if (KEIREQ.equals(reqTajgsKeiIdoSbtCd))
		{
		// ANK-3987-13-00 ADD END
			// パートナーアカウントID
			String ptnracntId = ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.PTNRACNT_ID);
			if (JKKStringUtil.isNullBlank(ptnracntId))
			{
				// パートナーアカウントIDが設定されていない場合のみ EnrollAPIを実行する。
				// ANK-3987-19-00 ADD START
				// 現状の料金コースを取得する
				// ===========================================================================
				// サービス契約情報の取得。
				// ===========================================================================
				// 「EKK0081A010_サービス契約一意照会(機能コード：2)」で検索し、サービス契約情報を取得する。
				// 上りマッピング
				Object[][] ekk0081a010In = {
						{ EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010 },
						{ EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0081A010CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },
						{ EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null) } };
				// サービスIF実行
				CAANMsg ekk0081a010Msg = callSC(handle, scCall, param, fixedText,
						ekk0081a010In, new EKK0081A010CBSMsg().getContents());
				// サービス契約一意照会明細
				CAANMsg[] ekk0081a010Msg1List = ekk0081a010Msg
						.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
				// サービスIF実行結果チェック
				if (ekk0081a010Msg1List == null || ekk0081a010Msg1List.length == 0) {
					// サービス契約番号で該当データが存在しない場合
					// 基本的には発生しない
					ccMsg.put("ERROR_CD", "99998");
					throw new CCException("", new Exception());
				}
				// 料金コースコード
				String pcrsCd = JKKStringUtil.nullToBlank((ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.PCRS_CD)));
				
				// 「EKK0791A010_料金コース一意照会(機能コード：2)」で検索し、カレントの料金コース情報を取得する。
				// 上りマッピング
				Object[][] ekk07911a010In = {
						{ EKK0791A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0791A010 },
						{ EKK0791A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0791A010CBSMsg.KEY_PCRS_CD, pcrsCd },
						{ EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}};
				// サービスIF実行
				CAANMsg ekk07911a010Msg = callSC(handle, scCall, param, fixedText,
						ekk07911a010In, new EKK0791A010CBSMsg().getContents());
				// 料金コース一意照会
				CAANMsg[] ekk07911a010Msg1List = ekk07911a010Msg
						.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
				// サービスIF実行結果チェック
				if (ekk07911a010Msg1List == null || ekk07911a010Msg1List.length == 0) {
					// 料金コースで該当データが存在しない場合
					// 基本的には発生しない
					ccMsg.put("ERROR_CD", "99998");
					throw new CCException("", new Exception());
				}
				// ANK-3987-19-00 ADD END
				
				// ANK-3987-00-00 ADD START
				// Eメール電話番号取得マップ
				HashMap<String, String> emailPhoneNoMap = new HashMap<String, String>();
				emailPhoneNoMap = getEmailPhoneNo(handle, scCall, param, fixedText, ccMsg, reqSvcKeiNo);
				
				// NetFlixEメール
				String netflixEmail = emailPhoneNoMap.get("netflixeMail");
				// NetFlix電話番号
				String netflixPhone = emailPhoneNoMap.get("netflixPhone");
				// ANK-3987-00-00 ADD END
				
				// ===========================================================================
				// EnrollAPIの実行依頼。
				// ===========================================================================
				// 「EKKA0090001_Netflix契約依頼(Enroll)」でNetflix社にEnrollAPIを実行依頼する。
				// 上りマッピング
				// バンドルID
//				String bundleId = JCMAPLConstMgr.getString(KK_NETFLIX_STANDARD_BUNDLEID);
				String bundleId = JKKStringUtil.nullToBlank((ekk07911a010Msg1List[0].getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_ID)));
				
				// Netflix提供ID
				String netflixOfferId = JCMAPLConstMgr.getString(KK_NETFLIX_STANDARD_NETFLIXOFFERID);
				// 連携日付
				String offerDate = JCCBPCommon.getSysDate();
				
				Object[][] ekka0090001In = {
						{ EKKA0090001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0090001 },
						{ EKKA0090001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKKA0090001CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },
						{ EKKA0090001CBSMsg.BUNDLE_ID, bundleId },
						{ EKKA0090001CBSMsg.EVENTTYPE, EVENTTYPE },
						{ EKKA0090001CBSMsg.PREFERREDLANGUAGE, PREFERREDLANGUAGE },
						{ EKKA0090001CBSMsg.NETFLIXOFFER_ID, netflixOfferId },
						{ EKKA0090001CBSMsg.BILLINGSTARTDATE, offerDate },
						{ EKKA0090001CBSMsg.PARTNERCHARGECOUNTRY, PARTNERCHARGECOUNTRY }, 
						// ANK-3987-19-00 DEL START
//						{ EKKA0090001CBSMsg.NETFLIXBASEOFFER_ID, netflixOfferId },
						// ANK-3987-19-00 DEL END
						// ANK-3987-00-00 MOD START
						//{ EKKA0090001CBSMsg.UPD_DTM_BF, ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.LAST_UPD_DTM)} };
						{ EKKA0090001CBSMsg.UPD_DTM_BF, ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.LAST_UPD_DTM)},
						{ EKKA0090001CBSMsg.NETFLIXEMAIL, netflixEmail},
						{ EKKA0090001CBSMsg.NETFLIXPHONE, netflixPhone}};
						// ANK-3987-00-00 MOD END
				
				// サービスIF実行
				CAANMsg ekka0090001Msg = callSC(handle, scCall, param, fixedText, ekka0090001In, new EKKA0090001CBSMsg().getContents());

				// 戻り値の取得
				String retHttpStatus = ekka0090001Msg.getString(EKKA0090001CBSMsg.HTTPSTATUSCODE);
				String retErrorCode = ekka0090001Msg.getString(EKKA0090001CBSMsg.ERRORCODE);

				// 採番されたパートナーアカウントIDを取得
				ptnracntId = ekka0090001Msg.getString(EKKA0090001CBSMsg.PTNRACNT_ID);

				// 承認時間を取得
				String authorizationTime = ekka0090001Msg.getString(EKKA0090001CBSMsg.AUTHORIZATIONTIME);
				
				// 結果をマップに詰め込む
				ccMsg.put("HTTP_STATUS", retHttpStatus);
				ccMsg.put("ERROR_CD", retErrorCode);
				ccMsg.put("PAI", ptnracntId);
				ccMsg.put("AUTH_TIME", authorizationTime);
				ccMsg.put("BILLINGSTARTDATE", offerDate);
				
				// HTTPステータスが200番台以外は処理終了
				if (!(Integer.parseInt(retHttpStatus) >= 200 && Integer.parseInt(retHttpStatus) < 300))
				{
					// CCExceptionを発行してロールバックさせる。
					throw new CCException("", new Exception());
				}
				
			}
			else
			{
				ccMsg.put("ERROR_CD", "99999");	// このエラーコードの場合、既にEnroll済のため異動通知を無効化する必要がある。
			}
		// ANK-3987-13-00 ADD START
		}
		//NetflixバンドルID変更依頼
		else if (BUNDLE_ID_REQ.equals(reqTajgsKeiIdoSbtCd))
		{
			// パートナーアカウントID
			String reqPtnracnt_id = (String) ccMsg.get("ptnracnt_id");

			// 現状の料金コースを取得する
			// ===========================================================================
			// サービス契約情報の取得。
			// ===========================================================================
			// 「EKK0081A010_サービス契約一意照会(機能コード：2)」で検索し、サービス契約情報を取得する。
			// 上りマッピング
			Object[][] ekk0081a010In = {
					{ EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010 },
					{ EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
					{ EKK0081A010CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },
					{ EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null) } };
			// サービスIF実行
			CAANMsg ekk0081a010Msg = callSC(handle, scCall, param, fixedText,
					ekk0081a010In, new EKK0081A010CBSMsg().getContents());
			// サービス契約一意照会明細
			CAANMsg[] ekk0081a010Msg1List = ekk0081a010Msg
					.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
			// サービスIF実行結果チェック
			if (ekk0081a010Msg1List == null || ekk0081a010Msg1List.length == 0) {
				// サービス契約番号で該当データが存在しない場合
				// 基本的には発生しない
				ccMsg.put("ERROR_CD", "99998");
				throw new CCException("", new Exception());
			}
			// 料金コースコード
			String pcrsCd = JKKStringUtil.nullToBlank((ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.PCRS_CD)));
			
			// 「EKK0791A010_料金コース一意照会(機能コード：2)」で検索し、カレントの料金コース情報を取得する。
			// 上りマッピング
			Object[][] ekk07911a010In = {
					{ EKK0791A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0791A010 },
					{ EKK0791A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
					{ EKK0791A010CBSMsg.KEY_PCRS_CD, pcrsCd },
					{ EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}};
			// サービスIF実行
			CAANMsg ekk07911a010Msg = callSC(handle, scCall, param, fixedText,
					ekk07911a010In, new EKK0791A010CBSMsg().getContents());
			// 料金コース一意照会
			CAANMsg[] ekk07911a010Msg1List = ekk07911a010Msg
					.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
			// サービスIF実行結果チェック
			if (ekk07911a010Msg1List == null || ekk07911a010Msg1List.length == 0) {
				// 料金コースで該当データが存在しない場合
				// 基本的には発生しない
				ccMsg.put("ERROR_CD", "99998");
				throw new CCException("", new Exception());
			}

			// ===========================================================================
			// EnrollAPIの実行依頼。
			// ===========================================================================
			// 「EKKA0090001_Netflix契約依頼(Enroll)」でNetflix社にEnrollAPIを実行依頼する。
			// 上りマッピング
			// バンドルID
			String bundleId = JKKStringUtil.nullToBlank((ekk07911a010Msg1List[0].getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_ID)));
			
			// ===========================================================================
			// オプションサービス契約一覧照会（サービス契約番号）の取得。
			// ===========================================================================
			// 「オプションサービス契約一覧照会（サービス契約番号）(機能コード：1)」で検索し、オプションサービス契約一覧照会（サービス契約番号）を取得する。
			// 上りマッピング
			//オプションサービス契約一覧照会（サービス契約番号）の上りマッピング
			Object[][] eKK0351B002In =
			{
				{EKK0351B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0351B002}
				// 機能コード
				, {EKK0351B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				// ＫＥＹ＿サービス契約番号
				, {EKK0351B002CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo}
				// ＫＥＹ＿ソート項目Ｎｏ
				, {EKK0351B002CBSMsg.KEY_SORT_ITEM_NO, "7"}
				// ＫＥＹ＿ソート区分
				, {EKK0351B002CBSMsg.KEY_SORT_KBN, "2"}
			};
			// サービスIF実行
			CAANMsg eKK0351B002Msg = callSC(handle, scCall, param, fixedText,
					eKK0351B002In, new EKK0351B002CBSMsg().getContents());
			// オプションサービス契約一覧照会（サービス契約番号）明細
			CAANMsg[] eKK0351B002Msg1List = eKK0351B002Msg
					.getCAANMsgList(EKK0351B002CBSMsg.EKK0351B002CBSMSG1LIST);
			
			boolean netflixPremium = false;
			if (null != eKK0351B002Msg1List)
			{
				for (CAANMsg eKK0351B002CAANMsg : eKK0351B002Msg1List)
				{
					//Ｎｅｔｆｌｉｘプレミアムの場合 かつ　オプションステータスが解約済またはキャンセル済以外
					if (JKKStrConst.OP_SVC_CD_B136.equals(eKK0351B002CAANMsg.getString(EKK0351B002CBSMsg1List.OP_SVC_CD)) &&
							!(JKKStrConst.OP_SVC_STAT_DSLZUMI.equals(eKK0351B002CAANMsg.getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_STAT)) ||
								JKKStrConst.OP_SVC_STAT_CANCELZUMI.equals(eKK0351B002CAANMsg.getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_STAT))))
					{
						netflixPremium = true;
					}
				}
			}
			// Netflix提供ID
			String netflixOfferId;
			if (netflixPremium)
			{
				//Netflix提供ID(Premium) 
				netflixOfferId =  JCMAPLConstMgr.getString(KK_NETFLIX_PREMIUM_NETFLIXOFFERID);
			}
			else
			{
				//Netflix提供ID
				netflixOfferId =  JCMAPLConstMgr.getString(KK_NETFLIX_STANDARD_NETFLIXOFFERID);
			}
			
			// 連携日付
			String offerDate = JCCBPCommon.getSysDate();
			
			Object[][] ekka0090001In = {
					{ EKKA0090001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0090001 },
					{ EKKA0090001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
					{ EKKA0090001CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },
					{ EKKA0090001CBSMsg.BUNDLE_ID, bundleId },
					{ EKKA0090001CBSMsg.EVENTTYPE, EVENTTYPE_PLAN },
					{ EKKA0090001CBSMsg.PTNRACNT_ID, reqPtnracnt_id },
					{ EKKA0090001CBSMsg.PREFERREDLANGUAGE, PREFERREDLANGUAGE },
					{ EKKA0090001CBSMsg.NETFLIXOFFER_ID, netflixOfferId },
					{ EKKA0090001CBSMsg.BILLINGSTARTDATE, offerDate },
					{ EKKA0090001CBSMsg.PARTNERCHARGECOUNTRY, PARTNERCHARGECOUNTRY }, 
					// ANK-3987-13-00 DEL START
					//{ EKKA0090001CBSMsg.NETFLIXBASEOFFER_ID, netflixOfferId },
					// ANK-3987-13-00 DEL END
					{ EKKA0090001CBSMsg.UPD_DTM_BF, ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.LAST_UPD_DTM)} };
			
			// サービスIF実行
			CAANMsg ekka0090001Msg = callSC(handle, scCall, param, fixedText, ekka0090001In, new EKKA0090001CBSMsg().getContents());

			// 戻り値の取得
			String retHttpStatus = ekka0090001Msg.getString(EKKA0090001CBSMsg.HTTPSTATUSCODE);
			String retErrorCode = ekka0090001Msg.getString(EKKA0090001CBSMsg.ERRORCODE);

			// 承認時間を取得
			String authorizationTime = ekka0090001Msg.getString(EKKA0090001CBSMsg.AUTHORIZATIONTIME);
			
			// 結果をマップに詰め込む
			ccMsg.put("HTTP_STATUS", retHttpStatus);
			ccMsg.put("ERROR_CD", retErrorCode);
			ccMsg.put("PAI", reqPtnracnt_id);
			ccMsg.put("AUTH_TIME", authorizationTime);
			ccMsg.put("BILLINGSTARTDATE", offerDate);
			
			// HTTPステータスが200番台以外は処理終了
			if (!(Integer.parseInt(retHttpStatus) >= 200 && Integer.parseInt(retHttpStatus) < 300))
			{
				// CCExceptionを発行してロールバックさせる。
				throw new CCException("", new Exception());
			}
				

		}
		// ANK-3987-13-00 ADD END
		return param;
	}
	
	/**
	 * サービスIF呼出処理
	 * 
	 * @param handle
	 *            セッションハンドル
	 * @param scCall
	 *            SC呼び出し部品
	 * @param param
	 *            リクエストパラメータ
	 * @param dataMapKey
	 *            パラメータキー
	 * @param mappingData
	 *            マッピングデータ
	 * @param contents
	 *            CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable
	 *             例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			Object[][] mappingData, Object[][] contents) 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];

		// リターンコード取得
		int return_code = (Integer) result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, return_code, dataMapKey,
				mappingData, contents);

		// エラー情報のマップを取得
		ArrayList<Object> errorList = (ArrayList<Object>) param
				.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errorList) {
			errorList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil
				.getErrorInfo(result, errorList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if (JPCModelConstant.NORMAL_END < return_code
				|| JPCModelConstant.WARNING < status) {
			throw new SCCallException("戻り値不正", String.valueOf(return_code),
					status);
		}

		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 (JFUStrConst.EMPTY.equals(mappingData[i][1])) {
				template.setNull((String) mappingData[i][0]);
			} else {
				template.set((String) mappingData[i][0], mappingData[i][1]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	/**
	 * エラー情報を取得します。
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param templates
	 *            CAANMsgクラス
	 * @param returnCode
	 *            リターンコード
	 * @param dataMapKey
	 *            パラメータキー
	 * @param mappingData
	 *            マッピングデータ
	 * @param contents
	 *            CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 *             リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates,
			int returnCode, String dataMapKey, Object[][] mappingData, Object[][] contents) throws RequestParameterException 
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode) {
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_"
				+ String.format("%1$04d", 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("%1$04d", templateStatus);

			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_"
					+ formatStatus);

			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);

			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		Map<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (Map<String, String>) param.getData(dataMapKey);

		for (int i = 0; null != contents && i < contents.length; i++) {
			String itemNm = (String) contents[i][0];
			if (itemNm.endsWith("_err")) {
				String errCd = template.getString(itemNm);
				if (!JFUBPCommon.isNull(errCd)) {
					inMap.put(itemNm, errCd);
				}
			}
		}
		return param;
	}

	// ANK-3987-00-00 ADD START
	/**
	 * Eメールアドレスと電話番号を取得します。
	 * 
	 * @param param
	 *            リクエストパラメータ
	 * @param mappingData
	 *            マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws Throwable 
	 * @throws RequestParameterException
	 *             リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, String> getEmailPhoneNo(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, String reqSvcKeiNo) throws Throwable
	{
		// ===========================================================================
		// EZM0321A010_業務パラメータ管理一意照会
		// ===========================================================================
		// 上りマッピング
		Object[][] eZM0321A010In = {
				{ EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010 },
				{ EZM0321A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
				{ EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, KK_KKPRC64501_JDGNSU_KK_KKPRC64501_JDGNSU } };		// ＫＥＹ＿業務パラメータID
		
		// サービスIF実行
		CAANMsg eZM0321A010Msg = callSC(handle, scCall, param, fixedText, eZM0321A010In, new EZM0321A010CBSMsg().getContents());
		
		// サービス契約＜eo光ネット＞一意照会明細
		CAANMsg[] eZM0321A010Msg1List = eZM0321A010Msg.getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		
		// 入会後期間
		String nyukaigoKikan = "";
		
		if (eZM0321A010Msg1List != null && eZM0321A010Msg1List.length > 0) 
		{
			// 入会後期間を取得
			nyukaigoKikan  = eZM0321A010Msg1List[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
		}
		else
		{
			// 基本的には発生しない
			ccMsg.put("ERROR_CD", "99998");
			throw new CCException("", new Exception());
		}
		
		
		// SYSID
		String sysid = "";
		
		if (reqSvcKeiNo != null && !"".equals(reqSvcKeiNo))
		{
			// ===========================================================================
			// EKK0081A010_サービス契約一意照会
			// ===========================================================================
			// 上りマッピング
			Object[][] eKK0081A010In = {
					{ EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010 },
					{ EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
					{ EKK0081A010CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo } ,									// ＫＥＹ＿サービス契約番号
					{ EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, (String)JCCBPCommon.getOpeDate(null) } };		// 予約適用年月日
			
			// サービスIF実行
			CAANMsg eKK0081A010Msg = callSC(handle, scCall, param, fixedText, eKK0081A010In, new EKK0081A010CBSMsg().getContents());
			
			// お客様情報一意照会明細
			CAANMsg[] eKK0081A010Msg1List = eKK0081A010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
			
			if (eKK0081A010Msg1List != null && eKK0081A010Msg1List.length > 0) 
			{
				// SYSIDを取得
				sysid  = eKK0081A010Msg1List[0].getString(EKK0081A010CBSMsg1List.SYSID);
			}
			else
			{
				// 基本的には発生しない
				ccMsg.put("ERROR_CD", "99998");
				throw new CCException("", new Exception());
			}
		}
		
		// 入会年月日
		String joinYmd = "";
		// 契約者電話番号
		String keishaTelno = "";
		
		if (sysid != null && !"".equals(sysid))
		{
			// ===========================================================================
			// ECK0011A010_お客様情報一意照会
			// ===========================================================================
			// 上りマッピング
			Object[][] eCK0011A010In = {
					{ ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010 },
					{ ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
					{ ECK0011A010CBSMsg.KEY_SYSID, sysid },												// ＫＥＹ＿SYSID
					{ ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, (String)JCCBPCommon.getOpeDate(null) } };		// 予約適用年月日
			
			// サービスIF実行
			CAANMsg eCK0011A010Msg = callSC(handle, scCall, param, fixedText, eCK0011A010In, new ECK0011A010CBSMsg().getContents());
			
			// お客様情報一意照会明細
			CAANMsg[] eCK0011A010Msg1List = eCK0011A010Msg.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
			
			if (eCK0011A010Msg1List != null && eCK0011A010Msg1List.length > 0) 
			{
				// 入会年月日を取得
				joinYmd  = eCK0011A010Msg1List[0].getString(ECK0011A010CBSMsg1List.JOIN_YMD);
				// 契約者電話番号を取得
				keishaTelno  = eCK0011A010Msg1List[0].getString(ECK0011A010CBSMsg1List.KEISHA_TELNO);
			}
			else
			{
				// 基本的には発生しない
				ccMsg.put("ERROR_CD", "99998");
				throw new CCException("", new Exception());
			}
		}
		
		// オプションサービス契約情報リスト
		ArrayList<HashMap<String, String>> opSvcKeiInfoList = new ArrayList<HashMap<String, String>>();
		
		if (reqSvcKeiNo != null && !"".equals(reqSvcKeiNo))
		{
			// ===========================================================================
			// EKK0351B002_オプションサービス契約一覧照会（サービス契約番号）
			// ===========================================================================
			// 上りマッピング
			// OM-2021-0000483 MOD START
			//Object[][] eKK0351B002In = {
			//		{ EKK0351B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0351B002 },
			//		{ EKK0351B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
			//		{ EKK0351B002CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },					// ＫＥＹ＿サービス契約番号
			//		{ EKK0351B002CBSMsg.KEY_OP_SVC_CD, JKKStrConst.OP_SVC_CD_EMAIL} };	// ＫＥＹ＿オプションサービスコード(B001:Eメール)
			Object[][] eKK0351B002In = {
					{ EKK0351B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0351B002 },
					{ EKK0351B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
					{ EKK0351B002CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },					// ＫＥＹ＿サービス契約番号
					{ EKK0351B002CBSMsg.KEY_OP_SVC_CD, JKKStrConst.OP_SVC_CD_EMAIL} };	// ＫＥＹ＿オプションサービスコード(B001:Eメール)
			// OM-2021-0000483 MOD END
			
			// サービスIF実行
			CAANMsg eKK0351B002Msg = callSC(handle, scCall, param, fixedText, eKK0351B002In, new EKK0351B002CBSMsg().getContents());
			
			// オプションサービス契約一覧照会（サービス契約番号）明細
			CAANMsg[] eKK0351B002Msg1List = eKK0351B002Msg.getCAANMsgList(EKK0351B002CBSMsg.EKK0351B002CBSMSG1LIST);
			
			if (eKK0351B002Msg1List != null && eKK0351B002Msg1List.length > 0) 
			{
				for (int i = 0; i < eKK0351B002Msg1List.length; i++)
				{
					// オプションサービス契約マップ
					HashMap<String, String> opSvcKeiMap = new HashMap<String, String>();
					
					// オプションサービス契約ステータスを設定
					opSvcKeiMap.put("op_svc_kei_stat", eKK0351B002Msg1List[i].getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_STAT));
					// オプションサービス契約番号を設定
					opSvcKeiMap.put("op_svc_kei_no", eKK0351B002Msg1List[i].getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_NO));
					
					// OM-2021-0000483 ADD START
					// オプションサービス契約番号
					String opSvcKeiStat = eKK0351B002Msg1List[i].getString(EKK0351B002CBSMsg1List.OP_SVC_KEI_STAT);
					// オプションサービス契約ステータスが"020"(照査済)または"030"(締結済)または"100"(サービス提供中)の場合
					if (JKKStrConst.CD01616_STAT_SHOSAZUMI.equals(opSvcKeiStat) || JKKStrConst.CD01616_STAT_TEIKETSUZUMI.equals(opSvcKeiStat) ||
						JKKStrConst.CD01616_STAT_SVCTK_CHU.equals(opSvcKeiStat))
					{
					// OM-2021-0000483 ADD END
						// オプションサービス契約情報リストに追加(オプションサービス契約情報リスト:op_svc_kei_stat,op_svc_kei_no)
						opSvcKeiInfoList.add(opSvcKeiMap);
					// OM-2021-0000483 ADD START
					}
					// OM-2021-0000483 ADD END
				}
			}
		}
		
		// オプションサービス契約情報リストにデータがある場合
		if (opSvcKeiInfoList != null && opSvcKeiInfoList.size() > 0)
		{
			for (int i = 0; i < opSvcKeiInfoList.size(); i++)
			{
				// オプションサービス契約情報リストからオプションサービス契約情報マップを取り出す
				HashMap<String, String> opSvcKeiMap = (HashMap<String, String>)opSvcKeiInfoList.get(i);
				
				// OM-2021-0000483 DEL START
				//// オプションサービス契約ステータス
				//String opSvcKeiStat = "";
				// OM-2021-0000483 DEL END
				// オプションサービス契約番号
				String opSvcKeiNo = "";
				
				if (opSvcKeiMap != null)
				{
					// OM-2021-0000483 DEL START
					//// オプションサービス契約ステータスを取得
					//opSvcKeiStat = (String)opSvcKeiMap.get("op_svc_kei_stat");
					// OM-2021-0000483 DEL END
					// オプションサービス契約番号を取得
					opSvcKeiNo = (String)opSvcKeiMap.get("op_svc_kei_no");
				}
				
				// OM-2021-0000483 DEL START
				//// オプションサービス契約ステータスが"020"(照査済)または"030"(締結済)または"100"(サービス提供中)の場合
				//if (JKKStrConst.CD01616_STAT_SHOSAZUMI.equals(opSvcKeiStat) || JKKStrConst.CD01616_STAT_TEIKETSUZUMI.equals(opSvcKeiStat) ||
				//	JKKStrConst.CD01616_STAT_SVCTK_CHU.equals(opSvcKeiStat))
				//{
				// OM-2021-0000483 DEL END
				// ===========================================================================
				// EKK0361A010_オプションサービス契約<ISP>一意照会
				// ===========================================================================
				// 上りマッピング
				Object[][] eKK0361A010In = {
						{ EKK0361A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0361A010 },
						{ EKK0361A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0361A010CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo } };			// ＫＥＹ＿オプションサービス契約番号
				
				// サービスIF実行
				CAANMsg eKK0361A010Msg = callSC(handle, scCall, param, fixedText, eKK0361A010In, new EKK0361A010CBSMsg().getContents());
				
				// オプションサービス契約<ISP>一意照会明細
				CAANMsg[] eKK0361A010Msg1List = eKK0361A010Msg.getCAANMsgList(EKK0361A010CBSMsg.EKK0361A010CBSMSG1LIST);
				
				if (eKK0361A010Msg1List != null && eKK0361A010Msg1List.length > 0) 
				{
					// オプションサービス契約情報マップにメールアドレスを設定
					opSvcKeiMap.put("mlad", eKK0361A010Msg1List[0].getString(EKK0361A010CBSMsg1List.MLAD));
					// オプションサービス契約情報マップに他システム連携サービス契約コード通番を設定
					opSvcKeiMap.put("tsyrn_svkei_cd_seq", eKK0361A010Msg1List[0].getString(EKK0361A010CBSMsg1List.TSYRN_SVKEI_CD_SEQ));
					// (オプションサービス契約情報リスト:op_svc_kei_stat,op_svc_kei_no,mlad,tsyrn_svkei_cd_seq)
				}
				else
				{
					// 基本的には発生しない
					ccMsg.put("ERROR_CD", "99998");
					throw new CCException("", new Exception());
				}
				// OM-2021-0000483 DEL START
				//}
				//// 上記以外のステータスの場合
				//else
				//{
				//	// 処理対象外のステータスのため、オプションサービス契約情報リストからi番目の要素を削除する
				//	opSvcKeiInfoList.remove(i);
				//}
				// OM-2021-0000483 DEL END
			}
		}
		
		// メールアドレス(オプションサービス契約)判定処理
		// オプションサービス契約のメールアドレス
		String opSvcKeiMlad = "";
		
		// オプションサービス契約情報リストにデータがある場合
		if (opSvcKeiInfoList != null && opSvcKeiInfoList.size() > 0)
		{
			// 一時保存マップ
			HashMap<String, String> tempMap = new HashMap<String, String>();
			
			for (int i = 0; i < opSvcKeiInfoList.size(); i++)
			{
				// オプションサービス契約情報リストからオプションサービス契約情報マップを取り出す
				// (オプションサービス契約情報リスト:op_svc_kei_stat,op_svc_kei_no,mlad,tsyrn_svkei_cd_seq)
				HashMap<String, String> opSvcKeiMap = (HashMap<String, String>)opSvcKeiInfoList.get(i);
				
				// 一時保存マップとオプションサービス契約情報マップのそれぞれの他システム連携サービス契約コード通番に値が入っている場合
				// OM-2021-0000483 MOD START
				//if (tempMap != null && tempMap.get("tsyrn_svkei_cd_seq") != null && !"".equals(tempMap.get("tsyrn_svkei_cd_seq")) &&
				//	opSvcKeiMap != null && !"".equals(opSvcKeiMap.get("tsyrn_svkei_cd_seq")))
				if (tempMap != null && !JKKStringUtil.isNullBlank(tempMap.get("tsyrn_svkei_cd_seq")) &&
						opSvcKeiMap != null && !JKKStringUtil.isNullBlank(opSvcKeiMap.get("tsyrn_svkei_cd_seq")))
				// OM-2021-0000483 MOD END
				{
					// 一時保存マップ.他システム連携サービス契約コード通番とオプションサービス契約情報マップ.他システム連携サービス契約コード通番を
					// 比較し、他システム連携サービス契約コード通番の値が少ない方のマップを一時保存マップに上書きする
					if (tempMap.get("tsyrn_svkei_cd_seq").compareTo(opSvcKeiMap.get("tsyrn_svkei_cd_seq")) > 0)
					{
						// 一時保存マップにオプションサービス契約情報マップをコピーする
						tempMap = opSvcKeiMap;
					}
					else
					{
						// 何もしない(tempMap = tempMap;)
					}
				}
				// 上記以外の場合
				else
				{
					// 一時保存マップにオプションサービス契約情報マップをコピーする
					tempMap = opSvcKeiMap;
				}
			}
			
			if (tempMap != null && tempMap.containsKey("mlad"))
			{
				opSvcKeiMlad = tempMap.get("mlad");
			}
		}
		
		// KKIFE446_Netflix契約依頼(Enroll)の「Netflix登録メール」判定処理
		// KKIFE446_Netflix契約依頼(Enroll)の「Netflix登録電話番号」判定処理
		// 比較年月日
		String compareYmd = "";
		// NetflixEメール
		String NetflixEmail = "";
		// Netflix電話番号
		String NetflixPhone = "";
		
		if (joinYmd != null && !"".equals(joinYmd) && nyukaigoKikan != null && !"".equals(nyukaigoKikan))
		{
			// 比較年月日を設定する(ECK0011A010_お客様情報一意照会.入会年月日 ＋ 入会後期間)
			compareYmd = JPCUtilCommon.addDay(joinYmd, Integer.parseInt(nyukaigoKikan));
			
			// 「比較年月日 >= 運用日」の場合
			if (compareYmd.compareTo((String)JCCBPCommon.getOpeDate(null)) >= 0)
			{
				// 仮登録中ではないメールアドレス
				String notKariAddMlad = "";
				
				if (sysid != null && !"".equals(sysid))
				{
					// ===========================================================================
					// ECK0201B003_連絡先履歴一覧照会
					// ===========================================================================
					// 上りマッピング
					Object[][] eCK0201B003In = {
							{ ECK0201B003CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0201B003 },
							{ ECK0201B003CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ ECK0201B003CBSMsg.KEY_SYSID, sysid }};							// ＫＥＹ＿ＳＹＳＩＤ
					
					// サービスIF実行
					CAANMsg eCK0201B003Msg = callSC(handle, scCall, param, fixedText, eCK0201B003In, new ECK0201B003CBSMsg().getContents());
					
					// お客様スキーマから仮登録中のメールアドレス以外(本登録済)のアドレスを取得する
					// 仮登録中のメールアドレス
					String kariAddMlad = "";
					
					// 連絡先一覧照会明細
					CAANMsg[] eCK0201B003Msg1List = eCK0201B003Msg.getCAANMsgList(ECK0201B003CBSMsg.ECK0201B003CBSMSG1LIST);
					
					if (eCK0201B003Msg1List != null && eCK0201B003Msg1List.length > 0) 
					{
						// 仮登録中のメールアドレスの判定処理
						for (int i = 0; i < eCK0201B003Msg1List.length; i++)
						{
							// 連絡方法コード
							String rrkWayCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRK_WAY_CD);
							// 連絡先種別コード
							String rrksSbtCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRKS_SBT_CD);
							// 連絡先分類コード
							String rrksBunruiCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRKS_BUNRUI_CD);
							// 予約適用コード
							String rsvAplyCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RSV_APLY_CD);
							
							// 連絡方法コードが"001"(メールアドレス)である、かつ、連絡先種別コードが"5"(その他(勤務連絡先等))である、かつ、
							// 連絡先分類コードが"0"(回線系連絡先)である場合
							if (JKKStrConst.CD00790_MLAD.equals(rrkWayCd) && JKKStrConst.CD00254_OTHER.equals(rrksSbtCd)
									&& JKKStrConst.CD00871_KAISEN_RRS.equals(rrksBunruiCd))
							{
								// 予約適用コードが"1"のレコード(仮登録中のメールアドレス)を特定する
								if ("1".equals(rsvAplyCd))
								{
									// 仮登録中のメールアドレスを取得
									kariAddMlad  = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.MLAD);
									break;
								}
							}
						}
						
						// 仮登録中ではないメールアドレスの判定処理
						for (int i = 0; i < eCK0201B003Msg1List.length; i++)
						{
							String mlad  = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.MLAD);
							// 連絡方法コード
							String rrkWayCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRK_WAY_CD);
							// 連絡先種別コード
							String rrksSbtCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRKS_SBT_CD);
							// 連絡先分類コード
							String rrksBunruiCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RRKS_BUNRUI_CD);
							// 予約適用コード
							String rsvAplyCd = eCK0201B003Msg1List[i].getString(ECK0201B001CBSMsg1List.RSV_APLY_CD);
							
							// 連絡方法コードが"001"(メールアドレス)である、かつ、連絡先種別コードが"5"(その他(勤務連絡先等))である、かつ、
							// 連絡先分類コードが"0"(回線系連絡先)である場合
							if (JKKStrConst.CD00790_MLAD.equals(rrkWayCd) && JKKStrConst.CD00254_OTHER.equals(rrksSbtCd)
									&& JKKStrConst.CD00871_KAISEN_RRS.equals(rrksBunruiCd))
							{
								// 仮登録中のメールアドレスを取得できている場合
								if (kariAddMlad != null && !"".equals(kariAddMlad))
								{
									// メールアドレスが仮登録中のメールアドレスではない場合
									if (!kariAddMlad.equals(mlad))
									{
										// 予約適用コードが"2"の場合
										if ("2".equals(rsvAplyCd))
										{
											// 仮登録中ではないメールアドレスとして保持する
											notKariAddMlad = mlad;
										}
									}
								}
								// 仮登録中のメールアドレスを取得できていない場合
								else
								{
									// 予約適用コードが"2"の場合
									if ("2".equals(rsvAplyCd))
									{
										// 仮登録中ではないメールアドレスとして保持する
										notKariAddMlad = mlad;
										// OM-2021-0000483 ADD START
										break;
										// OM-2021-0000483 ADD END
									}
								}
							}
						}
					}
				}
				
				// 仮登録中ではないメールアドレスが存在する場合
				if (notKariAddMlad != null && !"".equals(notKariAddMlad))
				{
					// NetflixEメールに仮登録中ではないメールアドレスを設定
					NetflixEmail = notKariAddMlad;
				}
				// 仮登録中ではないメールアドレスが取得できない場合
				else
				{
					// NetflixEメールにオプションサービス契約のメールアドレス設定
					NetflixEmail = opSvcKeiMlad;
				}
				
				// 契約者電話番号が携帯電話番号である場合
				if (JKKCommonUtil.judgeKeitaiTelno(keishaTelno))
				{
					// Netflix電話番号に契約者電話番号を設定
					NetflixPhone = keishaTelno;
				}
				// 契約者電話番号が携帯電話番号ではない場合
				else
				{
					// Netflix電話番号に""(空文字)を設定
					NetflixPhone = "";
				}
			}
			// 「比較年月日 < 運用日」の場合
			else
			{
				// NetflixEメールにオプションサービス契約のメールアドレス設定
				NetflixEmail = opSvcKeiMlad;
				
				// Netflix電話番号に""(空文字)を設定
				NetflixPhone = "";
			}
		}
		
		// Eメール電話番号マップ
		HashMap<String, String> emailPhoneNoMap = new HashMap<String, String>();
		emailPhoneNoMap.put("netflixeMail", NetflixEmail);
		emailPhoneNoMap.put("netflixPhone", NetflixPhone);
		
		return emailPhoneNoMap;
	}
	// ANK-3987-00-00 ADD END

}
