/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKNetflixKeiyakuRnkApiCC
 *   ソースファイル名：JKKNetflixKeiyakuRnkApiCC.java
 *   作成者          ：富士通
 *   日付            ：2020年10月26日
 *＜機能概要＞
 *   Netflix契約連携コモンコンポーネント部品
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *	v51.00.00	2020/10/26	FJ）大島	【ANK-3949-00-00】Netflix導入対応（STEP1）
*	v51.00.01	2020/11/05  FJ)西窪		【ANK-3949-08-00】Netflix導入対応（STEP1）
 *	v52.00.00	2021/10/26	FJ）澤田	【ANK-3987-00-00】Netflix導入対応(STEP2)
 *	v52.00.01	2021/01/29  FJ) 吉田	【ANK-3987-19-00】Netflix導入対応（STEP2）
 *	v61.00.00   2023/04/11  FJ）藤本涼 	【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
 *	v72.00.00   2024/08/02  FJ）丸田 	【ANK-4577-00-00】eo光ネット「シンプルプラン」追加対応(Step2)
 *	v73.00.00	2024/09/24  GDC)R.DelaRosa/GDC)jn.franco	【ANK-4427-00-00】NTT卸対応
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
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.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
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 com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
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.EKK0091A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0091A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191B002CBSMsg1List;
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.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3081D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3261B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3261B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3531A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3531A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0090001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0090002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKU0011B030CBSMsg1List;

/**
 * Netflix契約連携コモンコンポーネント部品 <br>
 * 
 * @author 富士通
 */
@SuppressWarnings("serial")
public class JKKNetflixKeiyakuRnkApiCC extends JFUBaseCC
{

	/** IN項目：サービス契約番号 */
	private static final String REQ_SVC_KEI_NO = "svc_kei_no";
	/** IN項目：メールアドレス */
	private static final String REQ_MLAD = "mlad";
	/** IN項目：タイプ */
	private static final String REQ_TYPE = "type";
	/** IN項目：チャンネル */
	private static final String REQ_CHANNEL = "channel";
	/** IN項目：トークンエラーＵＲＬ */
	private static final String REQ_TOKENERRORURL = "tokenErrorURL";
	// ANK-3987-00-00 ADD START
	/** IN項目：電話番号 */
	private static final String REQ_TELNO = "telno";
	// ANK-3987-00-00 ADD END
	// ANK-3987-19-00 ADD START
	/** IN項目：機能区分 */
	private static final String REQ_FUNC_CODE = "func_code";
	// ANK-3987-19-00 ADD END

	/** OUT項目：トークン */
	private static final String RES_TOKEN = "token";
	/** OUT項目：トークン有効期限 */
	private static final String RES_TOKENEXPIRYDATE = "tokenExpiryDate";
	// ANK-3987-19-00 ADD START
	/** OUT項目：Activation可否 */
	private static final String RES_ACT_KH = "act_kh";
	/** OUT項目：Activation状態区分 */
	private static final String RES_ACT_JTI_DIV = "act_jti_div";
	/** OUT項目：Activation日時 */
	private static final String RES_ACT_NTJ = "act_ntj";
	/** OUT項目：Enroll状態区分 */
	private static final String RES_ENR_JTI_DIV = "enr_jti_div";
	// ANK-3987-19-00 ADD END

	/** 属性チェック タイプ(Bundle) */
	private static final String TYPE_BUNDLE = "Bundle";
	/** 属性チェック タイプ(AccountRecovery) */
	private static final String TYPE_ACCOUNTRECOVERY = "AccountRecovery";
	/** 属性チェック チャンネル(Web) */
	private static final String CHANNEL_WEB = "Web";
	/** 属性チェック チャンネル(Email) */
	private static final String CHANNEL_EMAIL = "Email";
	/** 属性チェック チャンネル(Mobile) */
	private static final String CHANNEL_MOBILE = "Mobile";
	/** 属性チェック チャンネル(Store) */
	private static final String CHANNEL_STORE = "Store";
	/** 属性チェック チャンネル(SMS) */
	private static final String CHANNEL_SMS = "SMS";
	/** 属性チェック チャンネル(Other) */
	private static final String CHANNEL_OTHER = "Other";

	/** APIエラーコード_1001：必須チェックエラー */
	private static final String RES_KEY_ERROR_CODE_1001 = "1001";
	/** APIエラーコード_1002：属性チェックエラー */
	private static final String RES_KEY_ERROR_CODE_1002 = "1002";
	/** APIエラーコード_1003：桁数チェックエラー */
	private static final String RES_KEY_ERROR_CODE_1003 = "1003";
	// ANK-3987-19-00 ADD START
	/** APIエラーコード_1004：区分チェックエラー */
	private static final String RES_KEY_ERROR_CODE_1004 = "1004";
	// ANK-3987-19-00 ADD END
	/** APIエラーコード_2001：契約サービスチェック１ */
	private static final String RES_STATUS_ERROR_CODE_2001 = "2001";
	/** APIエラーコード_2002：契約サービスチェック２ */
	private static final String RES_STATUS_ERROR_CODE_2002 = "2002";
	/** APIエラーコード_2003：契約サービスチェック３ */
	private static final String RES_STATUS_ERROR_CODE_2003 = "2003";
	/** APIエラーコード_3001：連携エラー */
	private static final String RES_RENKEI_ERROR_CODE_3001 = "3001";

	/** CCパラメータ：エラー情報 */
	private static final String ERROR_INFO = "ERROR_INFO";
	/** CCパラメータ：エラーコード */
	private static final String ERROR_CODE = "errCode";
	/** CCパラメータ：エラーメッセージ */
	private static final String ERROR_MESSAGE = "errMessage";

	/** APIリターンコード_0000 正常終了 */
	private static final String RETURN_CD_0000 = "0000";
	/** APIリターンコード_9000_システムエラー */
	private static final String RETURN_CD_9000 = "9000";
	/** リターンメッセージ_システムエラー */
	public static final String RETURN_MESSAGE_SYSTEM_ERROR = "システムエラー";
	/** リターンメッセージ_サービス契約が存在しません */
	public static final String RETURN_MESSAGE_SVCKEI_NOTFOUND = "サービス契約が存在しません。";
	/** リターンメッセージ_利用可能な契約状態ではありません。 */
	public static final String RETURN_MESSAGE_SVCKEISTAT_FAULT = "利用可能な契約状態ではありません。";
	/** リターンメッセージ_工事完了予定日（%1）に到達していません。 */
	public static final String RETURN_MESSAGE_KOJIBI_NOT_REACH_FRONT = "工事完了予定日（";
	public static final String RETURN_MESSAGE_KOJIBI_NOT_REACH_BACK = "）に到達していません。";
	/** リターンメッセージ_サービス開始年月日に到達していません。 */
	public static final String RETURN_MESSAGE_SVCSTART_NOT_REACH = "サービス開始年月日に到達していません。";
	/** リターンメッセージ_変更後の料金コースがNパック以外。 */
	public static final String RETURN_MESSAGE_AFTERCOURSE_NOTNPACK = "変更後の料金コースがNパック以外。";
	/** リターンメッセージ_料金コースがNパック以外。 */
	public static final String RETURN_MESSAGE_CURRENTOURSE_NOTNPACK = "料金コースがNパック以外。";

	/** 半角コロン */
	private static final String COLON = ":";
	/** カンマ */
	public static final String COMMA = ",";

	/** SIF */
	/** テンプレートID(EKK0081A010) サービス契約一意照会(機能コード：2) */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** テンプレートID(EKK0091A010) サービス契約＜eo光ネット＞一意照会(機能コード：2) */
	private static final String TEMPLATE_ID_EKK0091A010 = "EKK0091A010";
	/** テンプレートID(EKK0791A010) 料金コース一意照会 */
	private static final String TEMPLATE_ID_EKK0791A010 = "EKK0791A010";
	/** テンプレートID(EKU0011B030) 工事案件一覧照会（複合検索） */
	private static final String TEMPLATE_ID_EKU0011B030 = "EKU0011B030";
	/** テンプレートID(EKK1681B001) 異動予約一覧照会 */
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";
	/** テンプレートID(EKKA0090001) Netflix契約依頼(Enroll) */
	private static final String TEMPLATE_ID_EKKA0090001 = "EKKA0090001";
	/** テンプレートID(EKKA0090002) Netflix利用開始依頼(Token) */
	private static final String TEMPLATE_ID_EKKA0090002 = "EKKA0090002";
	/** テンプレートID(EKK3081D010) 他事業者契約異動通知登録 */
	private static final String TEMPLATE_ID_EKK3081D010 = "EKK3081D010";
	// ANK-3987-00-00 ADD START
	/** オプションサービス契約一覧照会（サービス契約番号） */
	private static final String TEMPLATE_ID_EKK0351B002 = "EKK0351B002";
	// ANK-3987-00-00 ADD END
	// ANK-3987-19-00 v52.00.01 ADD START
	/** 他事業者契約利用開始実績情報 */
	private static final String TEMPLATE_ID_EKK3261B010 = "EKK3261B010";
	// ANK-3987-19-00 v52.00.01 ADD END
	// ANK-4427-00-00 ADD START
	/** WAO連携情報一意照会） */
	private static final String TEMPLATE_ID_EKK3531A010 = "EKK3531A010";
	// ANK-4427-00-00 ADD END
	/** APLConst */
	/** バンドルID */
	private static final String KK_NETFLIX_STANDARD_BUNDLEID = "KK_NETFLIX_STANDARD_BUNDLEID";
	/** Netflix提供ID(Standard) */
	private static final String KK_NETFLIX_STANDARD_NETFLIXOFFERID = "KK_NETFLIX_STANDARD_NETFLIXOFFERID";
	// ANK-3987-00-00 ADD START
	/** Netflix提供ID(Premium) */
	private static final String KK_NETFLIX_PREMIUM_NETFLIXOFFERID = "KK_NETFLIX_PREMIUM_NETFLIXOFFERID";
	// ANK-3987-00-00 ADD END
	/** EnrollAPI パラメータ固定値 */
	/** イベントタイプ New:新規 */
	private static final String EVENTTYPE = "New";
	// ANK-3987-00-00 ADD START
	/** イベントタイプ Plan:プラン変更 */
	private static final String EVENTTYPE_PLAN = "Plan";
	// ANK-3987-00-00 ADD END
	/** 優先言語 */
	private static final String PREFERREDLANGUAGE = "ja-JP";
	/** 居住国 */
	private static final String PARTNERCHARGECOUNTRY = "JP";

	// ANK-3987-19-00 v52.00.01 ADD START
	/** 項目規定値 */
	/** 機能コード:Avtivation可否チェック */
	private static final String FUNC_CODE_CHECK  = "0";
	/** 機能コード:Avtivation実行 */
	private static final String FUNC_CODE_EXECUTE = "1";
	/** Activation可否:可 */
	private static final String ACT_KH_OK = "1";
	/** Activation可否:否 */
	private static final String ACT_KH_NG = "2";
	/** Activation状態区分:未実行 */
	private static final String ACT_JTI_DIV_UNEXECUTED = "0";
	/** Activation状態区分:実行済み */
	private static final String ACT_JTI_DIV_EXECUTED = "1";
	/** Enroll状態区分:未実行 */
	private static final String ENR_JTI_DIV_UNEXECUTED = "0";
	/** Enroll状態区分:実行済み */
	private static final String ENR_JTI_DIV_EXECUTED = "1";
	// ANK-3987-19-00 v52.00.01 ADD END

	/**
	 * Netflix契約連携コモンコンポーネント部品実行処理<br>
	 * 
	 * <br>
	 * 
	 * @param handle
	 *            セッションハンドル
	 * @param param
	 *            リクエストパラメータ
	 * @param fixedText
	 *            サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable
	 *             例外
	 */
	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();
		// ===========================================================================
		// 返却値の初期値を設定する。
		// ===========================================================================
		HashMap resultMap = new HashMap();
		resultMap.putAll(ccMsg);

		// 単項目チェック
		// エラーリスト
		List<Map<String, String>> errorList = new ArrayList<Map<String, String>>();
		StringBuilder erroMsgrSb = new StringBuilder();
		// ●サービス契約番号
		String reqSvcKeiNo = (String) ccMsg.get(REQ_SVC_KEI_NO);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_SVC_KEI_NO).append(COLON).append(reqSvcKeiNo);
		if (JFUBPCommon.isNull(reqSvcKeiNo)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1001);
		} else if (reqSvcKeiNo.length() != 10) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1003);
		} else if (!HalfCharCheck.isEnNumber1Check(reqSvcKeiNo)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
		}
		// ●メールアドレス
		String reqMlad = (String) ccMsg.get(REQ_MLAD);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_MLAD).append(COLON).append(reqMlad);
		if (!JFUBPCommon.isNull(reqMlad)) {
			if (!(reqMlad.length() >= 1 && reqMlad.length() <= 256)) {
				errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1003);
			} else if (!HalfCharCheck.isEmail1Check(reqMlad)) {
				errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
			}
		}
		// ●タイプ
		String reqType = (String) ccMsg.get(REQ_TYPE);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_TYPE).append(COLON).append(reqType);
		if (JFUBPCommon.isNull(reqType)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1001);
		} else if (!(TYPE_BUNDLE.equals(reqType) || TYPE_ACCOUNTRECOVERY
				.equals(reqType))) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
		}
		// ●チャンネル
		String reqChannel = (String) ccMsg.get(REQ_CHANNEL);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_CHANNEL).append(COLON).append(reqChannel);
		if (JFUBPCommon.isNull(reqChannel)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1001);
		} else if (!(CHANNEL_WEB.equals(reqChannel)
				|| CHANNEL_EMAIL.equals(reqChannel)
				|| CHANNEL_MOBILE.equals(reqChannel)
				|| CHANNEL_STORE.equals(reqChannel)
				|| CHANNEL_SMS.equals(reqChannel) || CHANNEL_OTHER.equals(reqChannel))) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
		}
		// ●トークンエラーＵＲＬ
		String reqTokenErrorURL = (String) ccMsg.get(REQ_TOKENERRORURL);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_TOKENERRORURL).append(COLON).append(reqTokenErrorURL);
		if (JFUBPCommon.isNull(reqTokenErrorURL)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1001);
		} else if (!HalfCharCheck.isEnNumber2Check(reqTokenErrorURL)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
		}
		// ANK-3987-00-00 ADD START
		// ●電話番号
		String reqTelNo = (String) ccMsg.get(REQ_TELNO);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_TELNO).append(COLON).append(reqTelNo);
		if (!JFUBPCommon.isNull(reqTelNo)) {
			if (!(reqTelNo.length() >= 10 && reqTelNo.length() <= 11)) {
				errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1003);
			} else if (!HalfCharCheck.isTelno2Check(reqTelNo)) {
				errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1002);
			}
		}
		// ANK-3987-00-00 ADD END
		// ANK-3987-19-00 ADD START
		// ●機能区分
		String reqFuncCode = (String) ccMsg.get(REQ_FUNC_CODE);
		erroMsgrSb.setLength(0);
		erroMsgrSb.append(REQ_FUNC_CODE).append(COLON).append(reqFuncCode);
		if (JFUBPCommon.isNull(reqFuncCode)) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1001);
		} else if (!(FUNC_CODE_CHECK.equals(reqFuncCode) || FUNC_CODE_EXECUTE.equals(reqFuncCode))) {
			errorList = setGyomuErrorList(errorList, erroMsgrSb.toString(), RES_KEY_ERROR_CODE_1004);
		}
		// ANK-3987-19-00 ADD END
		if (errorList.size() > 0) {
			// エラーが存在する場合
			param.removeData(fixedText);
			resultMap.put(ERROR_INFO, errorList);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
			outBusLog(resultMap, "単項目チェックエラー");
			param.setData(fixedText, resultMap);
			return param;
		}

		try {
			// ANK-3987-19-00 ADD START
			// バンドルID(後続のEnroll用)
			String tmpBundleId = JFUStrConst.EMPTY;
			// ANK-3987-19-00 ADD END
			// ===========================================================================
			// サービス契約情報の取得。
			// ===========================================================================
			// 「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) {
				// サービス契約番号で該当データが存在しない場合
				param.removeData(fixedText);
				errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCKEI_NOTFOUND, RES_STATUS_ERROR_CODE_2001);
				resultMap.put(ERROR_INFO, errorList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				outBusLog(resultMap, "サービス契約情報(サービス契約番号)の存在チェックエラー");
				// ANK-3987-19-00 ADD START
				checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
				// ANK-3987-19-00 ADD END
				param.setData(fixedText, resultMap);
				return param;
			}
			// サービス契約ステータス
			String svcKeiStat = nullToStr(ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT));
			String shosaDslFinCd = nullToStr(ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.SHOSA_DSL_FIN_CD));
			if ((JKKStrConst.CD00037_UK_ZM.endsWith(svcKeiStat) || JKKStrConst.CD00037_STAT_PAUSE.equals(svcKeiStat) || JKKStrConst.CD00037_STAT_STP.equals(svcKeiStat) 
					|| JKKStrConst.CD00037_DSL_ZM.equals(svcKeiStat) || JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat))
				|| (JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat) && JKKStrConst.CD00469_2.equals(shosaDslFinCd)))
			{
				// "010"(受付済),"220"(停止中),"210"(休止・中断中),"910"(解約済),"920"(キャンセル済)
				// "020"(照査済)で 照査解約完了コード(shosa_dsl_fin_cd) が "2"(照査NG)の場合。
				param.removeData(fixedText);
				errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCKEISTAT_FAULT, RES_STATUS_ERROR_CODE_2003);
				resultMap.put(ERROR_INFO, errorList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				outBusLog(resultMap, "サービス契約情報(サービス契約番号)の存在チェックエラー");
				// ANK-3987-19-00 ADD START
				checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
				// ANK-3987-19-00 ADD END
				param.setData(fixedText, resultMap);
				return param;
			}
			// 料金コース
			String pcrsCd = nullToStr(ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.PCRS_CD));
			// サービス開始日
			String svcStaYmd = nullToStr(ekk0081a010Msg1List[0].getString(EKK0081A010CBSMsg1List.SVC_STA_YMD));
			
			if (JFUStrConst.TAJGS_BUNDLE_DIV_001.equals(searchTajgsBundleDiv(pcrsCd, handle, param, fixedText, scCall)))
			{
				// ANK-4427-00-00 ADD START
				// NTT卸区分
				String nttors_div = searchNttorsDiv(pcrsCd, handle, param, fixedText, scCall);
				if(JFUStrConst.EMPTY.equals(nttors_div))
				{
					// ANK-4427-00-00 ADD END
					// 現コースがNパック
					// ANK-3987-19-00 ADD START
					// バンドルIDを取得しておく
					tmpBundleId = searchTajgsBundleId(pcrsCd, handle, param, fixedText, scCall);
					
					// ANK-4315-00-00 ADD START
					// ONU交換工事の工事案件を取得
					CAANMsg[] eku0011b030Msg1ListOnu = getEKU0011B030(reqSvcKeiNo, JKKStrConst.KOJIAK_SBT_CD_ONU_RPLC_WRK , handle, param, fixedText, scCall);
					
					// ONU交換工事の工事予定がある場合
					if (eku0011b030Msg1ListOnu.length > 0)
					{
						// 宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)を取得
						String taknikjWorkStaHm = getTaknikjWorkStaHm(eku0011b030Msg1ListOnu);
						
						// サービス開始日が未設定、または運用日がサービス開始日より未来の場合
						if (JFUStrConst.EMPTY.equals(svcStaYmd) 
								|| !JPCUtilCommon.isPastDate(svcStaYmd, JCCBPCommon.getOpeDate(null), "1"))
						{
							// 工事連携未、または運用日が宅内工事完了予定年月日より未来の場合
							if (JFUStrConst.EMPTY.equals(taknikjWorkStaHm)
									|| !JPCUtilCommon.isPastDate(taknikjWorkStaHm, JCCBPCommon.getOpeDate(null), "1"))
							{
								param.removeData(fixedText);
								errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCSTART_NOT_REACH, RES_STATUS_ERROR_CODE_2003);
								resultMap.put(ERROR_INFO, errorList);
								param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
								param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		
								outBusLog(resultMap, "サービス開始年月日未到達エラー");
								// ANK-3987-19-00 ADD START
								checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
								// ANK-3987-19-00 ADD END
								param.setData(fixedText, resultMap);
								return param;
							}
						}
					}
					// ANK-4315-00-00 ADD END
					
					// ANK-3987-19-00 ADD END
					// 新設工事・住変(新設)工事の工事案件を取得
					// ANK-3987-00-00 MOD START
	//				CAANMsg[] eku0011b030Msg1List = getEKU0011B030(reqSvcKeiNo, JKKStrConst.CD00577_NEWESTA, handle, param, fixedText, scCall);
					CAANMsg[] eku0011b030Msg1List = getEKU0011B030(reqSvcKeiNo, JKKStrConst.CD00577_NEWESTA + "," + JKKStrConst.CD00577_ADCHG_NEWESTA , handle, param, fixedText, scCall);
					// ANK-3987-00-00 MOD END
					// ANK-4315-00-00 MOD START
	//				if (eku0011b030Msg1List.length > 0)
					if (eku0011b030Msg1List.length > 0 && eku0011b030Msg1ListOnu.length <= 0)
					// ANK-4315-00-00 MOD END
					{
						// 新設工事の工事予定がある場合
						// 宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)を取得
						String taknikjWorkStaHm = getTaknikjWorkStaHm(eku0011b030Msg1List);
						// 工事連携未、または
						if (JFUStrConst.EMPTY.equals(taknikjWorkStaHm)
								|| !JPCUtilCommon.isPastDate(taknikjWorkStaHm, JCCBPCommon.getOpeDate(null), "1"))
						{
							// 工事連携未、または運用日が宅内工事完了予定年月日より未来の場合
							param.removeData(fixedText);
							StringBuilder sb = new StringBuilder();
							sb.append(RETURN_MESSAGE_KOJIBI_NOT_REACH_FRONT).append("新設").append(RETURN_MESSAGE_KOJIBI_NOT_REACH_BACK);
							errorList = setGyomuErrorList(errorList, sb.toString(), RES_STATUS_ERROR_CODE_2003);
							resultMap.put(ERROR_INFO, errorList);
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
	
							outBusLog(resultMap, "工事完了予定日（新設）未到達エラー");
							// ANK-3987-19-00 ADD START
							checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
							// ANK-3987-19-00 ADD END
							param.setData(fixedText, resultMap);
							return param;
						}
					// ANK-4315-00-00 MOD START
	//				} else {
					} else if (eku0011b030Msg1List.length <= 0 && eku0011b030Msg1ListOnu.length <= 0){
					// ANK-4315-00-00 MOD END
						// 新設工事・住変(新設)工事かつ、ONU交換工事の工事予定がない場合
						if (JFUStrConst.EMPTY.equals(svcStaYmd) 
								|| !JPCUtilCommon.isPastDate(svcStaYmd, JCCBPCommon.getOpeDate(null), "1"))
						{
							// 運用日がサービス開始日より未来の場合
							param.removeData(fixedText);
							errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCSTART_NOT_REACH, RES_STATUS_ERROR_CODE_2003);
							resultMap.put(ERROR_INFO, errorList);
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
	
							outBusLog(resultMap, "サービス開始年月日未到達エラー");
							// ANK-3987-19-00 ADD START
							checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
							// ANK-3987-19-00 ADD END
							param.setData(fixedText, resultMap);
							return param;
						}
					}
				// ANK-4427-00-00 ADD START
				// 1-2)eo光type N(料金コースの「NTT卸区分」が設定あり)の場合
				} 
				else
				{
					if (JFUStrConst.EMPTY.equals(svcStaYmd) 
								|| !JPCUtilCommon.isPastDate(svcStaYmd, JCCBPCommon.getOpeDate(null), "1")) {
//								// サービス契約の「サービス開始年月日」が到来している(当日含む)こと。
//								param.removeData(fixedText);
//								errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCSTART_NOT_REACH, RES_STATUS_ERROR_CODE_2003);
//								resultMap.put(ERROR_INFO, errorList);
//								param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
//								param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
//								outBusLog(resultMap, "サービス開始年月日未到達エラー");
//								checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
//								param.setData(fixedText, resultMap);
//								return param;
//					} else {
						// サービス契約の「サービス開始年月日」が到来していない場合。
						// WAO連携情報の「宅内工事完了予定年月日」が到来している(当日含む)こと。
						// 上りマッピング
						Object[][] ekk3531a010In = {
								{ EKK3531A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3531A010 },
								{ EKK3531A010CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo },
								{ EKK3531A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 }};
						// サービスIF実行
						CAANMsg ekk3531a010Msg = callSC(handle, scCall, param, fixedText,
								ekk3531a010In, new EKK3531A010CBSMsg().getContents());
						// サービス契約一意照会明細
						CAANMsg[] ekk3531a010Msg1List = ekk3531a010Msg
								.getCAANMsgList(EKK3531A010CBSMsg.EKK3531A010CBSMSG1LIST);
						String waoTaknikjWorkStaHm = "";
						if (ekk3531a010Msg1List != null && ekk3531a010Msg1List.length > 0)
						{
							waoTaknikjWorkStaHm = nullToStr(ekk3531a010Msg1List[0].getString(EKK3531A010CBSMsg1List.TAKNI_KOJI_FIN_RSV_YMD));
						}
						if (JFUStrConst.EMPTY.equals(waoTaknikjWorkStaHm) 
								|| !JPCUtilCommon.isPastDate(waoTaknikjWorkStaHm, JCCBPCommon.getOpeDate(null), "1"))
						{
							// サービス契約の「サービス開始年月日」が到来している(当日含む)こと。
							param.removeData(fixedText);
							StringBuilder sb = new StringBuilder();
							sb.append("WAO").append(RETURN_MESSAGE_KOJIBI_NOT_REACH_FRONT).append("新設").append(RETURN_MESSAGE_KOJIBI_NOT_REACH_BACK);
							errorList = setGyomuErrorList(errorList, sb.toString(), RES_STATUS_ERROR_CODE_2003);
							resultMap.put(ERROR_INFO, errorList);
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
							outBusLog(resultMap, "サービス開始年月日未到達エラー");
							checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
							param.setData(fixedText, resultMap);
							return param;
						}
					}
				}
				// ANK-4427-00-00 ADD END
				// ANK-4577-00-00 ADD STAR
				// 「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 (ekk0091a010Msg1List != null && ekk0091a010Msg1List.length != 0) {
					// サービス契約＜eo光ネット＞一意照会明細から乗り換え元サービス契約番号を取得する。
					String nrkemtSvkeiNo = nullToStr(ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.NRKEMT_SVKEI_NO));
					if (!JKKStrConst.KARA.equals(nrkemtSvkeiNo)){
						// 乗り換え元サービス契約番号が存在する場合
						if (JKKStrConst.CD00037_SVCTK_CHU.compareTo(svcKeiStat) > 0) {
							//サービス契約ステータスが"100"(サービス提供中)未満の場合
							param.removeData(fixedText);
							errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCKEISTAT_FAULT, RES_STATUS_ERROR_CODE_2003);
							resultMap.put(ERROR_INFO, errorList);
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

							outBusLog(resultMap, "乗換中の存在チェックエラー");
							checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
							param.setData(fixedText, resultMap);
							return param;
						}
					}
				}
				// ANK-4577-00-00 ADD END
			} else {
				// 現コースがNパックではない
				// ===========================================================================
				// サービス契約情報の取得。
				// ===========================================================================
				// 「EKK1681B001_異動予約一覧照会(機能コード：2)」で検索し、異動予約情報を取得する。
				// 上りマッピング
				Object[][] ekk1681b001In = {
						{ EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001 },
						{ EKK1681B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK1681B001CBSMsg.KEY_SVC_KEI_NO, reqSvcKeiNo } };
				// サービスIF実行
				CAANMsg ekk1681b001Msg = callSC(handle, scCall, param, fixedText,
						ekk1681b001In, new EKK0081A010CBSMsg().getContents());
				// 異動予約一覧照会明細
				CAANMsg[] ekk1681b001Msg1List = ekk1681b001Msg
						.getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);
				String couseChgflg = "0"; //* 0:Nパックへのコース変更なし
				// サービスIF実行結果チェック
				for (int i = 0; i < ekk1681b001Msg1List.length; i++)
				{
					CAANMsg ekk1681b001MsgDtl = ekk1681b001Msg1List[i];
					String idoDiv = nullToStr(ekk1681b001MsgDtl.getString(EKK1681B001CBSMsg1List.IDO_DIV));
					String idoRsvDtlCd = nullToStr(ekk1681b001MsgDtl.getString(EKK1681B001CBSMsg1List.IDO_RSV_DTL_CD));
					String idoRsvStatCd = nullToStr(ekk1681b001MsgDtl.getString(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD));
					String newPcrsCd = nullToStr(ekk1681b001MsgDtl.getString(EKK1681B001CBSMsg1List.NEW_PCRS_CD));
					if (JKKStrConst.CD00576_00009.equals(idoDiv) || JKKStrConst.CD00576_ADCHG_ADD.equals(idoDiv))
					{
						// 異動区分(IDO_DIV)が "00009"(コース変更) または "00019"(住所変更・登録)
						if (JFUStrConst.CD01167_003.equals(idoRsvDtlCd)
							&& (JKKStrConst.CD01168_IDO_RSV_STAT_CD_00.equals(idoRsvStatCd) || JKKStrConst.CD01168_IDO_RSV_STAT_CD_03.equals(idoRsvStatCd)))
						{
							// 異動予約詳細(IDO_RSV_DTL_CD)が "003"(コース変更)で異動予約状態(IDO_RSV_STAT_CD)が "00"(未反映),"03"(予約手続中)
							couseChgflg = "1";
							if (JFUStrConst.TAJGS_BUNDLE_DIV_001.equals(searchTajgsBundleDiv(newPcrsCd, handle, param, fixedText, scCall)))
							{
								// ANK-4427-00-00 ADD START
								String nttors_div = searchNttorsDiv(newPcrsCd, handle, param, fixedText, scCall);
								if(JFUStrConst.EMPTY.equals(nttors_div))
								{
								// ANK-4427-00-00 ADD END
								// 変更後の料金コースがNパック
								// ANK-3987-19-00 ADD START
								// バンドルIDを取得しておく
								tmpBundleId = searchTajgsBundleId(newPcrsCd, handle, param, fixedText, scCall);
								// ANK-3987-19-00 ADD END
								// 工事案件種別コード(KOJIAK_SBT_CD)が "009"(プラン変更(収容替)) または "003"(住所変更(新設))の宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)を取得
								StringBuilder sb = new StringBuilder();
								sb.append(JKKStrConst.CD00577_PLAN_CHG_SHYO_CHG).append(COMMA).append(JKKStrConst.CD00577_ADCHG_NEWESTA);
								// プラン変または住変の工事案件を取得
								CAANMsg[] eku0011b030Msg1List = getEKU0011B030(reqSvcKeiNo, sb.toString(), handle, param, fixedText, scCall);
								if (eku0011b030Msg1List.length > 0)
								{
									// プラン変更の工事予定がある場合
									// 宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)を取得
									String taknikjWorkStaHm = getTaknikjWorkStaHm(eku0011b030Msg1List);
									if (JFUStrConst.EMPTY.equals(taknikjWorkStaHm)
											|| !JPCUtilCommon.isPastDate(taknikjWorkStaHm, JCCBPCommon.getOpeDate(null), "1"))
									{
										// 工事連携未、または運用日が宅内工事完了予定年月日より過去の場合
										param.removeData(fixedText);
										sb.setLength(0);
										sb.append(RETURN_MESSAGE_KOJIBI_NOT_REACH_FRONT).append("プラン変更").append(RETURN_MESSAGE_KOJIBI_NOT_REACH_BACK);
										errorList = setGyomuErrorList(errorList, sb.toString(), RES_STATUS_ERROR_CODE_2003);
										resultMap.put(ERROR_INFO, errorList);
										param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
										param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

										outBusLog(resultMap, "工事完了予定日（プラン変更）未到達エラー");
										// ANK-3987-19-00 ADD START
										checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
										// ANK-3987-19-00 ADD END
										param.setData(fixedText, resultMap);
										return param;								
									}
								} else {
									// プラン変更の工事予定がない場合
									if (JFUStrConst.EMPTY.equals(svcStaYmd)
											|| !JPCUtilCommon.isPastDate(svcStaYmd, JCCBPCommon.getOpeDate(null), "1"))
									{
										// 運用日がサービス開始日より過去の場合
										param.removeData(fixedText);
										errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCSTART_NOT_REACH, RES_STATUS_ERROR_CODE_2003);
										resultMap.put(ERROR_INFO, errorList);
										param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
										param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

										outBusLog(resultMap, "サービス開始年月日未到達エラー");
										// ANK-3987-19-00 ADD START
										checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
										// ANK-3987-19-00 ADD END
										param.setData(fixedText, resultMap);
										return param;
										}
									}
								}
							} else {
								// 変更後の料金コースがNパックでない
								param.removeData(fixedText);
								errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_AFTERCOURSE_NOTNPACK, RES_STATUS_ERROR_CODE_2002);
								resultMap.put(ERROR_INFO, errorList);
								param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
								param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

								outBusLog(resultMap, "変更後の料金コースがNパック以外エラー");
								// ANK-3987-19-00 ADD START
								checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
								// ANK-3987-19-00 ADD END
								param.setData(fixedText, resultMap);
								return param;
							}
						}
					}
				}
				if (!"1".equals(couseChgflg))
				{
					// 現在のコースがNパックではなく、コース変更異動予約がない場合。
					param.removeData(fixedText);
					errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_CURRENTOURSE_NOTNPACK, RES_STATUS_ERROR_CODE_2002);
					resultMap.put(ERROR_INFO, errorList);
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

					outBusLog(resultMap, "現在の料金コースがNパック以外エラー");
					// ANK-3987-19-00 ADD START
					checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
					// ANK-3987-19-00 ADD END
					param.setData(fixedText, resultMap);
					return param;
				}
			}
			// ===========================================================================
			// サービス契約＜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) {
				// サービス契約番号で該当データが存在しない場合
				param.removeData(fixedText);
				errorList = setGyomuErrorList(errorList, RETURN_MESSAGE_SVCKEI_NOTFOUND, RES_STATUS_ERROR_CODE_2001);
				resultMap.put(ERROR_INFO, errorList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				outBusLog(resultMap, "サービス契約＜eo光ネット＞(サービス契約番号)の存在チェックエラー");
				// ANK-3987-19-00 ADD START
				checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_NG);
				// ANK-3987-19-00 ADD END
				param.setData(fixedText, resultMap);
				return param;
			}
			// パートナーアカウントID
			String ptnracntId = nullToStr(ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.PTNRACNT_ID));

			// ANK-3987-19-00 v52.00.01 ADD START
			// 機能コードがチェックなら以降の処理を行わず、Activationチェックを行う。
			if(FUNC_CODE_CHECK.equals(reqFuncCode))
			{
				
				param.removeData(fixedText);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				
				checkActivation(handle, scCall, param, fixedText, ccMsg, resultMap, ACT_KH_OK);
				param.setData(fixedText, resultMap);
				return param;
			}
			// ANK-3987-19-00 v52.00.01 ADD END

			String retHttpStatus = "500";
			String retErrorCode = JFUStrConst.EMPTY;
			String retErrorCode_enroll = JFUStrConst.EMPTY;
			// 承認時間
			String authorizationTime = JFUStrConst.EMPTY;
			// ANK-3987-00-00 ADD START
			if (!TYPE_ACCOUNTRECOVERY.equals(reqType))
			{
				// ===========================================================================
				// オプションサービス契約一覧照会（サービス契約番号）の取得。
				// ===========================================================================
				// 「オプションサービス契約一覧照会（サービス契約番号）(機能コード：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;
						}
					}
				}
				// ANK-3987-00-00 ADD END
				// ANK-3987-00-00 DEL START
	//			if (JFUStrConst.EMPTY.equals(ptnracntId))
	//			{
				// ANK-3987-00-00 DEL END
				// パートナーアカウントIDが設定されていない場合のみ EnrollAPIを実行する。
				// ===========================================================================
				// EnrollAPIの実行依頼。
				// ===========================================================================
				// 「EKKA0090001_Netflix契約依頼(Enroll)」でNetflix社にEnrollAPIを実行依頼する。
				// 上りマッピング
				// ANK-3987-19-00 MOD START
				// バンドルID
//				String bundleId = JCMAPLConstMgr.getString(KK_NETFLIX_STANDARD_BUNDLEID);
				String bundleId = tmpBundleId; 
				// ANK-3987-19-00 MOD START
				// ANK-3987-00-00 MOD START
	//				// Netflix提供ID
	//				String netflixOfferId = JCMAPLConstMgr.getString(KK_NETFLIX_STANDARD_NETFLIXOFFERID);
				// 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 eventType;
				// パートナーアカウントID が存在しない場合　New:新規
				if (JFUStrConst.EMPTY.equals(ptnracntId))
				{
					eventType = EVENTTYPE;
				}
				// パートナーアカウントID が存在する場合　Plan:プラン変更
				else
				{
					eventType = EVENTTYPE_PLAN;
				}
				// ANK-3987-00-00 MOD END
				// 連携日付
				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 },
						// ANK-3987-00-00 MOD START
						//{ EKKA0090001CBSMsg.EVENTTYPE, EVENTTYPE },
						{ EKKA0090001CBSMsg.EVENTTYPE, eventType },
						// ANK-3987-00-00 MOD END
						{ EKKA0090001CBSMsg.NETFLIXEMAIL, reqMlad },
						// ANK-3987-00-00 ADD START
						{ EKKA0090001CBSMsg.NETFLIXPHONE, reqTelNo },
						{ EKKA0090001CBSMsg.PTNRACNT_ID, ptnracntId },
						// ANK-3987-00-00 ADD END
						{ EKKA0090001CBSMsg.PREFERREDLANGUAGE, PREFERREDLANGUAGE },
						{ EKKA0090001CBSMsg.NETFLIXOFFER_ID, netflixOfferId },
						{ EKKA0090001CBSMsg.BILLINGSTARTDATE, offerDate },
						{ EKKA0090001CBSMsg.PARTNERCHARGECOUNTRY, PARTNERCHARGECOUNTRY }, 
						// ANK-3949-08-00 MOD START
						//{ EKKA0090001CBSMsg.NETFLIXBASEOFFER_ID, netflixOfferId } };
						// ANK-3978-13-00 DEL START
						//{ EKKA0090001CBSMsg.NETFLIXBASEOFFER_ID, netflixOfferId },
						// ANK-3978-13-00 DEL END
						{ EKKA0090001CBSMsg.UPD_DTM_BF, ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.LAST_UPD_DTM)} };
						// ANK-3949-08-00 MOD END
				// サービスIF実行
				CAANMsg ekka0090001Msg = callSC(handle, scCall, param, fixedText,
						ekka0090001In, new EKKA0090001CBSMsg().getContents());
				// 戻り値の取得
				retHttpStatus = ekka0090001Msg.getString(EKKA0090001CBSMsg.HTTPSTATUSCODE);
				retErrorCode = ekka0090001Msg.getString(EKKA0090001CBSMsg.ERRORCODE);
				retErrorCode_enroll = ekka0090001Msg.getString(EKKA0090001CBSMsg.ERRORCODE);
				// 採番されたパートナーアカウントIDを取得(プラン変更の場合は採番なし)
				ptnracntId = ekka0090001Msg.getString(EKKA0090001CBSMsg.PTNRACNT_ID);
				// 承認時間を取得
				authorizationTime = ekka0090001Msg.getString(EKKA0090001CBSMsg.AUTHORIZATIONTIME);
				// HTTPステータスが200番台以外は処理終了
				if (!(Integer.parseInt(retHttpStatus) >= 200 && Integer.parseInt(retHttpStatus) < 300))
				{
					param.removeData(fixedText);
					errorList = setGyomuErrorList(errorList, retErrorCode, RES_RENKEI_ERROR_CODE_3001);
					resultMap.put(ERROR_INFO, errorList);
					param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
					param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
	
					outBusLog(resultMap, "連携エラー：" + retErrorCode);
					param.setData(fixedText, resultMap);
					return param;
				}
				// ANK-3987-00-00 ADD START
				// パートナーIDが新規の場合
				if (EVENTTYPE.equals(eventType))
				{
				// ANK-3987-00-00 ADD END
					// ===========================================================================
					// 他事業者契約異動通知登録の登録
					// ===========================================================================
					// 「EKK3081D010_他事業者契約異動通知登録」で他事業者契約異動通知に連携情報を登録する。
					// 上りマッピング
					Object[][] ekk3081d010In = {
							{ EKK3081D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3081D010 },
							{ EKK3081D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_SK_SKCD, JFUStrConst.CD01705_04 },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDO_SBT_CD, JFUStrConst.CD01706_0401 },
							{ EKK3081D010CBSMsg.SVC_KEI_NO, reqSvcKeiNo },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_STAT_CD, JKKStrConst.TAJGS_KEI_IDT_STAT_CD_TCHI_ZUMI },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDO_HSI_YMD, JCCBPCommon.getOpeDate(null) },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_RSV_YMD, JCCBPCommon.getOpeDate(null) },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_DTM, authorizationTime + "000" },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_RSLT_CD, "0" },
							{ EKK3081D010CBSMsg.TAJGS_KEI_IDT_RSLT_DTL_CD, retErrorCode_enroll },
							{ EKK3081D010CBSMsg.PTNRACNT_ID, ptnracntId }, 
							{ EKK3081D010CBSMsg.TAJGS_KEI_STA_END_YMD, offerDate } };
					// サービスIF実行
					callSC(handle, scCall, param, fixedText, ekk3081d010In, new EKK3081D010CBSMsg().getContents());
				// ANK-3987-00-00 ADD START
				}
				// ANK-3987-00-00 ADD END
				// ANK-3987-00-00 DEL START
				//}
				// ANK-3987-00-00 DEL END
			// ANK-3987-00-00 ADD START
			}
			// ANK-3987-00-00 ADD END
			// ===========================================================================
			// TokenAPIの実行依頼。
			// ===========================================================================
			// 「EKKA0090002_Netflix利用開始依頼(Token)」でNetflix社にTokenAPIを実行依頼する。
			// 上りマッピング
			Object[][] ekka0090002In = {
					{ EKKA0090002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0090002 },
					{ EKKA0090002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
					{ EKKA0090002CBSMsg.PTNRACNT_ID, ptnracntId },
					{ EKKA0090002CBSMsg.TYPE, reqType },
					{ EKKA0090002CBSMsg.CHANNEL, reqChannel },
					{ EKKA0090002CBSMsg.TOKENERRORURL, reqTokenErrorURL },
					{ EKKA0090002CBSMsg.PARTNERCHARGECOUNTRY, PARTNERCHARGECOUNTRY } };
			// サービスIF実行
			CAANMsg ekka0090002Msg = callSC(handle, scCall, param, fixedText,
					ekka0090002In, new EKKA0090002CBSMsg().getContents());
			retHttpStatus = ekka0090002Msg.getString(EKKA0090002CBSMsg.HTTPSTATUSCODE);
			retErrorCode = ekka0090002Msg.getString(EKKA0090002CBSMsg.ERRORCODE);
			if (!(Integer.parseInt(retHttpStatus) >= 200 && Integer.parseInt(retHttpStatus) < 300))
			{
				param.removeData(fixedText);
				errorList = setGyomuErrorList(errorList, retErrorCode, RES_RENKEI_ERROR_CODE_3001);
				resultMap.put(ERROR_INFO, errorList);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);

				outBusLog(resultMap, "連携エラー：" + retErrorCode);
				param.setData(fixedText, resultMap);
				return param;
			}
			// トークン
			String retToken = ekka0090002Msg.getString(EKKA0090002CBSMsg.TOKEN);
			// トークン有効期限
			String retTokenExpiryDate = ekka0090002Msg.getString(EKKA0090002CBSMsg.TOKENEXPIRYDATE);

			// 正常終了として戻り値の設定。
			resultMap.put(RES_TOKEN, retToken);
			resultMap.put(RES_TOKENEXPIRYDATE, retTokenExpiryDate);

		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx) {
			// システムエラーを設定する
			errorList = setGyomuErrorList(errorList,
					RETURN_MESSAGE_SYSTEM_ERROR, RES_RENKEI_ERROR_CODE_3001);
			param.removeData(fixedText);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE,
					RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE,
					RETURN_MESSAGE_SYSTEM_ERROR);
			outBusLog(resultMap, RETURN_MESSAGE_SYSTEM_ERROR);
			param.setData(fixedText, resultMap);
			return param;
		}

		param.removeData(fixedText);
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CD_0000);
		param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		param.setData(fixedText, resultMap);

		return param;
	}

	// ANK-3987-00-00 ADD START
	/**
	 * Acivattionのチェックを行います。
	 * サービス契約番号のパラメータチェックが正常であることが最低条件です。
	 * 
	 * @throws Throwable 
	 */
	private void checkActivation(SessionHandle handle, ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, String fixedText, Map<String, Object> ccMsg, HashMap resultMap, String actKh) throws Throwable
	{
		
		// ●サービス契約番号
		String reqSvcKeiNo = (String) ccMsg.get(REQ_SVC_KEI_NO);
		// ●機能コード
		String reqFuncCode = (String) ccMsg.get(REQ_FUNC_CODE);
		
		// 機能コードが1(Avtivation実行)なら実行しない
		if(FUNC_CODE_EXECUTE.equals(reqFuncCode)){
			return;
		}
		
		// Activation可否を返却値に設定しておく
		resultMap.put(RES_ACT_KH, actKh);
		
		String resActJtiDiv = ACT_JTI_DIV_UNEXECUTED;			// Activation状態区分	：0(未実行)
		String resActNtj = JFUStrConst.EMPTY;					// Activation日時		：""(空)
		String resEnrJtiDiv = ENR_JTI_DIV_UNEXECUTED;			// Enroll状態区分		：0(未実行)
		
		// ===========================================================================
		// サービス契約＜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) {
			// 取得結果がなければ結果を返却する
			resultMap.put(RES_ACT_JTI_DIV, resActJtiDiv);
			resultMap.put(RES_ACT_NTJ, resActNtj);
			resultMap.put(RES_ENR_JTI_DIV, resEnrJtiDiv);
			
			return;
		}
		// PAI
		String ptnracntId = nullToStr(ekk0091a010Msg1List[0].getString(EKK0091A010CBSMsg1List.PTNRACNT_ID));
		
		// PAIが未設定の場合
		if (JFUStrConst.EMPTY.equals(ptnracntId))
		{
			// 結果を返却する
			resultMap.put(RES_ACT_JTI_DIV, resActJtiDiv);
			resultMap.put(RES_ACT_NTJ, resActNtj);
			resultMap.put(RES_ENR_JTI_DIV, resEnrJtiDiv);
			
			return;
		}
		// PAIが設定済みの場合
		resEnrJtiDiv = ENR_JTI_DIV_EXECUTED;	// Enroll状態区分		：1(実行済み)

		
		// ===========================================================================
		// 他事業者契約利用開始実績情報の取得。
		// ===========================================================================
		// 「EKK3261B010_他事業者契約利用開始実績一覧照会(機能コード：1)」で検索し、他事業者契約利用開始実績情報を取得する。
		// 上りマッピング
		Object[][] ekk3261b010In = {
				{ EKK3261B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3261B010 },
				{ EKK3261B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
				{ EKK3261B010CBSMsg.KEY_PTNRACNT_ID, ptnracntId } };
		// サービスIF実行
		CAANMsg ekk3261a010Msg = callSC(handle, scCall, param, fixedText,
				ekk3261b010In, new EKK3261B010CBSMsg().getContents());
		// 他事業者契約利用開始実績一覧照会明細
		CAANMsg[] ekk3261a010Msg1List = ekk3261a010Msg
				.getCAANMsgList(EKK3261B010CBSMsg.EKK3261B010CBSMSG1LIST);
		// サービスIF実行結果チェック
		if (ekk3261a010Msg1List == null || ekk3261a010Msg1List.length == 0) {
			// PAIで該当データが存在しない場合
			resActJtiDiv = ACT_JTI_DIV_UNEXECUTED;
		}
		else
		{
			// PAIで該当データが存在する場合
			// Activation状態区分を"1"(実行済み)にする。
			resActJtiDiv = ACT_JTI_DIV_EXECUTED;	// Activation状態区分	：1(実行済み)
			// Activation日時を他事業者契約利用開始実績から取得する。
			resActNtj = ekk3261a010Msg1List[0].getString(EKK3261B010CBSMsg1List.TAJGS_KEI_UEST_HMS);
		}
		
		resultMap.put(RES_ACT_JTI_DIV, resActJtiDiv);
		resultMap.put(RES_ACT_NTJ, resActNtj);
		resultMap.put(RES_ENR_JTI_DIV, resEnrJtiDiv);
		return;
	}
	// ANK-3987-00-00 ADD END

	/**
	 * サービス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;
	}

	/**
	 * 業務エラー情報作成処理
	 * 
	 * @param itemName
	 * @param itemValue
	 * @param errorCode
	 * @return
	 * @throws Exception
	 */
	private List<Map<String, String>> setGyomuErrorList(List<Map<String, String>> errorList, String errMessage, String errorCode) throws Exception
	{

		if (errorList == null) {
			errorList = new ArrayList<Map<String, String>>();
		}

		Map<String, String> returnMap = new HashMap<String, String>();

		// 業務エラー設定
		returnMap.put(ERROR_CODE, errorCode);
		returnMap.put(ERROR_MESSAGE, errMessage);

		if (!errorList.contains(returnMap)) {
			errorList.add(returnMap);
		}

		return errorList;
	}

	/**
	 * 引数がnullの場合、""(空文字)を返却する。
	 * 
	 * @param str
	 *            項目名
	 * @return 項目名
	 */
	private String nullToStr(Object obj)
	{
		if (obj == null) {
			return JFUStrConst.EMPTY;
		}
		return (String) obj;
	}

	/**
	 * ビジネスログ出力メッセージ
	 * 
	 * @param ccMsg
	 * @param msg
	 */
	private void outBusLog(Map<String, Object> ccMsg, String msg)
	{
		StringBuffer outBusLogMsg = new StringBuffer();
		outBusLogMsg.append("KKIFE445#JKKNetflixKeiyakuRnkApiCC#svc_kei_no(")
				.append(ccMsg.get(REQ_SVC_KEI_NO)).append(")：mlad(").append(
						ccMsg.get(REQ_MLAD)).append(")：type(").append(
						ccMsg.get(REQ_TYPE)).append(")：channel(").append(
						ccMsg.get(REQ_CHANNEL)).append(")：tokenErrorURL(")
				.append(ccMsg.get(REQ_TOKENERRORURL)).append(")：").append(msg);

		JSYejbLog.println(JSYLogBase.DEBUG, this.getClass(), outBusLogMsg);
	}

	/**
	 * 料金マスタより、他事業者バンドル区分(TAJGS_BUNDLE_DIV)を取得する。
	 * 
	 * @param pcrsCd
	 *            対象料金コース
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * 
	 * @throws Throwable
	 */
	private String searchTajgsBundleDiv(String pcrsCd, SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText,
			ServiceComponentRequestInvoker scCall) throws Throwable
	{
		// 「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) {
			// 料金コースが存在しない場合
			return null;
		}
		// サービス契約ステータス
		String tajgsBundleDiv = nullToStr(ekk07911a010Msg1List[0]
				.getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_DIV));
		return tajgsBundleDiv;
	}
	
	// ANK-3987-19-00 ADD START
	/**
	 * 料金マスタより、他事業者バンドルID(TAJGS_BUNDLE_ID)を取得する。
	 * 
	 * @param pcrsCd
	 *            対象料金コース
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * 
	 * @throws Throwable
	 */
	private String searchTajgsBundleId(String pcrsCd, SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText,
			ServiceComponentRequestInvoker scCall) throws Throwable
	{
		// 「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) {
			// 料金コースが存在しない場合
			return null;
		}
		// 他事業者バンドルID
		String tajgsBundleDiv = nullToStr(ekk07911a010Msg1List[0]
				.getString(EKK0791A010CBSMsg1List.TAJGS_BUNDLE_ID));
		return tajgsBundleDiv;
	}
	// ANK-3987-19-00 ADD END

	/**
	 * 工事案件一覧照会（複合検索）を実行。
	 * 
	 * @param svcKeiNo
	 *            サービス契約番号
	 * @param kojiakSbt
	 *            工事案件種別
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * 
	 * @throws Throwable
	 */
	private CAANMsg[] getEKU0011B030(String svcKeiNo, String kojiakSbt,
			SessionHandle handle, IRequestParameterReadWrite param,
			String fixedText, ServiceComponentRequestInvoker scCall)
			throws Throwable
	{
		// ===========================================================================
		// 工事案件情報の取得。
		// ===========================================================================
		// 「EKU0011B030_工事案件一覧照会（複合検索）(機能コード：1)」で検索し、工事案件情報を取得する。
		// 上りマッピング
		// 工事案件ステータス("130"(受付済),"140"(依頼済),"150"(宅内調査完了済),"160"(工事会社決定済),"170"(宅内機器予定登録済),"180"(仮鍵開発行依頼済),"190"(現場作業完了済))
		StringBuilder sbKojiakStat = new StringBuilder();
		sbKojiakStat.append(JKKStrConst.CD00474_130).append(COMMA)
				.append(JKKStrConst.CD00474_140).append(COMMA)
				.append(JKKStrConst.CD00474_150).append(COMMA)
				.append(JKKStrConst.CD00474_160).append(COMMA)
				.append(JKKStrConst.CD00474_170).append(COMMA)
				.append(JKKStrConst.CD00474_180).append(COMMA)
				.append(JKKStrConst.CD00474_190);
		Object[][] eku0011b030In = {
				{ EKU0011B030CBSMsg.TEMPLATEID, TEMPLATE_ID_EKU0011B030 },
				{ EKU0011B030CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
				{ EKU0011B030CBSMsg.KEY_SVC_KEI_NO, svcKeiNo },
				{ EKU0011B030CBSMsg.KEY_KOJIAK_STAT, sbKojiakStat.toString() },
				{ EKU0011B030CBSMsg.KEY_KOJIAK_SBT_CD, kojiakSbt } };
		// サービスIF実行
		CAANMsg eku0011b030Msg = callSC(handle, scCall, param, fixedText,
				eku0011b030In, new EKU0011B030CBSMsg().getContents());
		// 工事案件一覧照会明細
		CAANMsg[] eku0011b030Msg1List = eku0011b030Msg
				.getCAANMsgList(EKU0011B030CBSMsg.EKU0011B030CBSMSG1LIST);
		return eku0011b030Msg1List;
	}
	/**
	 * 宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)を取得する。
	 * @param eku0011b030Msg1List
	 * @return 宅内工事完了予定年月日
	 */
	private String getTaknikjWorkStaHm(CAANMsg[] eku0011b030Msg1List)
	{
		// サービスIF実行結果チェック
		List<String> taknikjWorkStaHmList = new ArrayList<String>();
		for (int i = 0; i < eku0011b030Msg1List.length; i++) {
			CAANMsg eku0011b030MsgDtl = eku0011b030Msg1List[i];
			// 宅内工事完了予定年月日(TAKNIKJ_WORK_STA_HM)
			String tmpTaknikjWorkStaHm = nullToStr(eku0011b030MsgDtl
					.getString(EKU0011B030CBSMsg1List.TAKNI_KOJI_FIN_RSV_YMD));
			if (tmpTaknikjWorkStaHm.length() > 0) {
				taknikjWorkStaHmList.add(tmpTaknikjWorkStaHm);
			}
		}
		String taknikjWorkStaHm = JFUStrConst.EMPTY;
		if (taknikjWorkStaHmList.size() > 0) {
			// 複数取れた場合は一番最近の日付を宅内工事完了予定年月日とする。
			Collections.sort(taknikjWorkStaHmList, Collections.reverseOrder());
			taknikjWorkStaHm = taknikjWorkStaHmList.get(0);
		}
		return taknikjWorkStaHm;
	}

	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText)
			throws Exception {
		// TODO 自動生成されたメソッドスタブ
		return null;
	}

	// ANK-4427-00-00 ADD START
	/**
	 * 料金マスタより、他事業者バンドルID(NTTORS_DIV)を取得する。
	 * 
	 * @param pcrsCd
	 *            対象料金コース
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param scCall
	 * 
	 * @throws Throwable
	 */
	private String searchNttorsDiv(String pcrsCd, SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText,
			ServiceComponentRequestInvoker scCall) throws Throwable
	{
		// 「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) {
			// 料金コースが存在しない場合
			return null;
		}
		// 他事業者バンドルID
		String nttorsDiv = nullToStr(ekk07911a010Msg1List[0]
				.getString(EKK0791A010CBSMsg1List.NTTORS_DIV));
		return nttorsDiv;
	}
	// ANK-4427-00-00 ADD END
}
