/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0361NumberParts
*	ソースファイル名：JKKejbKK0361NumberParts.java
*	作成者			：富士通
*	日付			：2011年05月18日
*＜機能概要＞
*	オプションサービス契約<ISP>採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/18	富士通		新規作成
*   v4.00.00    2013/05/02  FJ）寺園    ST1-2013-0000536
*   v4.00.01    2013/05/04  FJ）寺園    ST1-2013-0000536
*   v8.00.00    2014/01/13  FJ）大山    ANK-1586-00-00
*   v8.00.01    2014/03/25  FJ）小島    OM-2014-0000286
*  v10.00.00    2014/09/27  FJ）横田    OM-2014-0003006
*  v11.00.00    2014/11/10  FJ）伊藤    【ANK-2184-00-00】【ＮＯ．１５８４】新型フェムトセル対応
*  v23.00.00    2016/02/23  FJ）栗秋    【ANK-2350-00-00】【ＮＯ．１８２３】POPIDパスワード、WebIDパスワードの再振不正
*  v32.00.00    2017/03/27  FJ) 三宅    【ANK-3149-00-00】新セキュリティパック導入
*  v39.00.00	2018/09/26	FJ）澤田	【ANK-3484-00-00】端末補償
*  v66.00.00	2023/04/26	GDC)v.auditor	ANK-4369-00-00 楽天フェムトセル対応
**********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.JSYejbSucceedDataAccess;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0171ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbm.entity.ZM0111ETMsg;
//ANK-2350-00-00 2016/02/23 ADD START
import eo.ejb.cbs.cbsmsg.EKK0361C111CBSMsg;
//ANK-2350-00-00 2016/02/23 ADD END
import eo.ejb.cbs.cbsmsg.EKK0361D010CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbCallTypeChecker;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0171DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0361DBABase;
import eo.ejb.common.db.JKKejbZM0111DBABase;
import eo.ejb.common.db.JKKejbZM0171DBAccess;
import eo.ejb.common.db.JKKejbZM0321DBAccess;

/**
 * <p>
 * オプションサービス契約<ISP>採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0361NumberParts extends JKKejbNumberPartsBase
{

	/** 引継データアクセスキー(初期POPパスワード) */
	private static final String KEY_SHKPOPPWD = "SHKPOPPWD";

	/** 引継データアクセスキー(初期WebIDパスワード) */
	private static final String KEY_SHKWEBIDPWD = "SHKWEBIDPWD";

	/** シーケンス定義名(WebID) */
	private static final String SEQ_WEBID_NAME = "SEQ_WEB_ID";

	/** 接頭語(WebID) */
	private static final String PREFIX_WEBID = "H";

	/** シーケンス補正桁数(WebID) */
	private static final int SEQ_WEBID_LENGTH = 8;

	/** シーケンス定義名(ダイヤルパッドMAPID) */
	private static final String SEQ_DPAD_MAPID_NAME = "SEQ_DPAD_MAPID";

	/** 接頭語(ダイヤルパッドMAPID) */
	private static final String PREFIX_DPAD_MAPID = "";

	/** シーケンス補正桁数(ダイヤルパッドMAPID) */
	private static final int SEQ_DPAD_MAPID_LENGTH = 9;

	/** アノテーション */
	private static final String ANNOTATION = "@";

	/** パーセント */
	private static final String PERSENT = "%";

	/** ドット */
	private static final String DOTTO = ".";

	/** シーケンス定義名(メールアドレス) */
	private static final String SEQ_KKMLAD_ACCOUNT = "SEQ_KKMLAD_ACCOUNT";
	//OM-2014-0003006 ADD START
	/** シーケンス定義名(メールアドレス) */
	private static final String SEQ_KKMLAD_SUBDOMAIN = "SEQ_KKMLAD_SUBDOMAIN";
	//OM-2014-0003006 ADD END
	/** 接頭語(メールアドレス) */
	private static final String PREFIX_MAIL = "";

	/** シーケンス補正桁数(メールアドレス) */
	private static final int SEQ_ACCOUNT_LENGTH = 8;
	// OM-2014-0003006 ADD START
	/** シーケンス補正桁数(初回メールサブドメイン) */
	private static final int SEQ_SUBDOMAIN_LENGTH = 10;
	// OM-2014-0003006 ADD END
	/** メールアドレス引き継ぎKEY項目 */
	private static final String KEY_MAILADDRESS = "MAILADDRESS";

	// ANK-3149-00-00 ADD START
	/** シーケンス定義名(マカフィー会員ID) */
	private static final String SEQ_MCAFEE_MEMBER_ID = "SEQ_MCAFEE_MEMBER_ID";

	/** 接頭語(マカフィー会員ID) */
	private static final String PREFIX_MCAFEE_MEMBER_ID = "";

	/** シーケンス補正桁数(マカフィー会員ID) */
	private static final int SEQ_MCAFEE_MEMBER_ID_LENGTH = 12;
	
	/** シーケンス定義名(マカフィー用認証パスワード) */
	private static final String SEQ_MCAFEE_NINSHO_PWD = "SEQ_MCAFEE_NINSHO_PWD";

	/** 接頭語(マカフィー用認証パスワード) */
	private static final String PREFIX_MCAFEE_NINSHO_PWD = "";

	/** シーケンス補正桁数(マカフィー用認証パスワード) */
	private static final int SEQ_MCAFEE_NINSHO_PWD_LENGTH = 10;
	
	/** シーケンス定義名(BBSS会員ID) */
	private static final String SEQ_BBSS_MEMBER_ID = "SEQ_BBSS_MEMBER_ID";

	/** 接頭語(BBSS会員ID) */
	private static final String PREFIX_BBSS_MEMBER_ID = "";

	/** シーケンス補正桁数(BBSS会員ID) */
	private static final int SEQ_BBSS_MEMBER_ID_LENGTH = 12;
	
	private static final String KEY_MCAFEE_MEMBER_ID = "MCAFEE_MEMBER_ID";
	// ANK-3149-00-00 ADD END
	// ANK-3484-00-00 ADD START
	/** シーケンス定義名(端末補償契約番号) */
	private static final String SEQ_TMCP_KEI_NO = "SEQ_TMCP_KEI_NO";

	/** 接頭語(端末補償契約番号) */
	private static final String PREFIX_TMCP_KEI_NO = "";

	/** シーケンス補正桁数(端末補償契約番号) */
	private static final int SEQ_TMCP_KEI_NO_LENGTH = 10;
	// ANK-3484-00-00 ADD END

	/** メールアドレスサブドメインコード値 */
	private static final String CODE_SUB_DOMAIN = "CD00897";

	/** 無効フラグ(有効) */
	private static final String MK_FLG_VALID = "0";
	
	/** オプションサービスコード(Ｅメール) */
	private static final String OP_SVC_CD_EMAIL = "B001";
	
	/** オプションサービスコード(マルチセッション) */
	private static final String OP_SVC_CD_MLTI = "B015";
	
	/** オプションサービスコード(固定グローバルＩＰアドレス) */
	private static final String OP_SVC_CD_FIXED_GL_ID_ADD = "B004";
	
	/** アルファベットＰ */
	private static final String ALPHABET_P = "P";
	
	/** 料金コースコード(マンションタイプ　光配線　１００Ｍ) */
	private static final String PCRS_CD_MANS_HHAISEN_100M = "A56";
	
	/** 料金コースコード(マンションタイプ　光配線　１ギガ) */
	private static final String PCRS_CD_MANS_HHAISEN_1G = "A57";

	/** シーケンス定義名(フェムトセル用認証ID) */
	private static final String SEQ_FMTCEL_NINSHO_ID_PWD = "SEQ_FMTCEL_NINSHO_ID_PWD";

	/** 接頭語(フェムトセル用認証ID) */
	private static final String PREFIX_FMTCEL_NINSHO_ID_PWD = "";

	/** シーケンス補正桁数(フェムトセル用認証ID) */
	private static final int EQ_FMTCEL_NINSHO_ID_PWD_LENGTH = 10;
	
	/** 乱数(フェムトセル用認証ID) */
	public static final int RANDOM_LENGTH_FMTCEL_NINSHO_ID = 10;
	
	/** 変換表Ｂ */
	private static final HashMap<String, String> CHANGE_LIST_B = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_B.put("0", "kmnpqrstuv");
		CHANGE_LIST_B.put("1", "pqrstuvwxy");
		CHANGE_LIST_B.put("2", "tuvwxyzabc");
		CHANGE_LIST_B.put("3", "ijkmnpqrst");
		CHANGE_LIST_B.put("4", "cdefghijkm");
		CHANGE_LIST_B.put("5", "mnpqrstuvw");
		CHANGE_LIST_B.put("6", "abcdefghij");
		CHANGE_LIST_B.put("7", "stuvwxyzab");
		CHANGE_LIST_B.put("8", "hijkmnpqrs");
		CHANGE_LIST_B.put("9", "npqrstuvwx");
	}
	
	/** 関連チェックエラーフラグ&エラー返却項目(エイジング 未存在チェック) */
	private static final String[] KRCK_OP_SVC_KEI_NO_ERR = {"EE", "op_svc_kei_no_err"};

	// 20141110 ANK-2184-00-00 Add Start
	/** 新型のフェムトセル認証IDの接頭語 L */
	private static final String PREFIX_FMTCEL_NEW = "L";
	// 20141110 ANK-2184-00-00 Add End
	
	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0361NumberParts()
	{
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のPOPIDを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inOpSvcKeiNo オプションサービス契約番号
	 * @return 採番されたオプションサービス契約<ISP>のPOPID
	 */
	public Object getPopId(CAANMsg inMsg, AgentDispatchContext inContext, Object inOpSvcKeiNo)
	{
		String value = null;

		// パラメータチェック
		if (inOpSvcKeiNo == null)
		{
			return null;
		}

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得
		value = (String)JSYejbSucceedDataAccess.getSucceedData(KEY_MAILADDRESS);

		if (value == null)
		{
			// カレントレコードの検索
			CAANMsg crMsg = new CAANMsg(KK0361ETMsg.class.getName());
			crMsg.set(KK0361ETMsg.OP_SVC_KEI_NO, inOpSvcKeiNo.toString());
			CAANMsg outMsg = new JKKejbKK0361DBABase().findByCurrent(crMsg);

			// メールアドレスが設定されていない場合
			if (outMsg == null || outMsg.isNull(KK0361ETMsg.MLAD))
			{
				return null;
			}

			value = outMsg.getString(KK0361ETMsg.MLAD);
		}

		// メールアドレスからPOPIDを生成
		value = value.replace(ANNOTATION, PERSENT);

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>の初期POPパスワードを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inOpSvcKeiNo オプションサービス契約番号
	 * @return 採番されたオプションサービス契約<ISP>の初期POPパスワード
	 */
	public Object getShkPopPwd(CAANMsg inMsg, AgentDispatchContext inContext, Object inOpSvcKeiNo)
	{
		String value = null;

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得
		value = (String)JSYejbSucceedDataAccess.getSucceedData(KEY_SHKPOPPWD);

		if (value != null)
		{
			// 引継データが設定されている場合はそのまま返却
			return value;
		}

		// サービス契約の初期デフォルトパスワードを設定する
		value = getSvcShkDefaultPwd(inMsg, inOpSvcKeiNo.toString());

		// ANK-2350-00-00 2016/02/23 ADD START
		// 入力のオプション契約番号を取得する
		String opSvcKeiNo = inMsg.getString(EKK0361C111CBSMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();

		// オプションサービス契約カレント取得
		CAANMsg kk0351CurDate = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// 親サービス契約に紐付くオプションサービス契約を取得する
		CAANMsg[] kk0351InsList = kk0351dba.getKK0351bySvcKei(kk0351CurDate.getString(KK0351ETMsg.SVC_KEI_NO), null, opeDate, "1");

		//最大の世代登録年月日時分秒
		String geneAddDtmMax = null;
		// オプションサービス契約番号が取得できた分繰り返し
		for (CAANMsg kk0351info : kk0351InsList)
		{
			// オプションサービスコードを取得する
			String optSvcCd = kk0351info.getString(KK0351ETMsg.OP_SVC_CD);

			// 対象のオプションサービス契約が"Eメール"ではない場合
			if (!JKKModelConst.OP_SVC_CD_EMAIL.equals(optSvcCd))
			{
				continue;
			}

			// オプションサービス契約番号を取得する
			String optSvcKeiNo = kk0351info.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			String geneAddDtm = kk0351info.getString(KK0351ETMsg.GENE_ADD_DTM);

			// 一意検索用のメッセージを作成
			CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
			inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, optSvcKeiNo);
			inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, geneAddDtm);

			// オプションサービス契約<ISP>の一意検索を行う
			CAANMsg kk0361Msg = new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);
			String shkPopIdPwd = kk0361Msg.getString(KK0361ETMsg.SHK_POP_ID_PWD);

			// 初期POPIDPWがNULLの場合
			if (shkPopIdPwd == null)
			{
				continue;
			}

			// 世代年月日時分秒の最大値がNULLの場合
			if (geneAddDtmMax == null)
			{
				geneAddDtmMax = geneAddDtm;
			}else if(geneAddDtm.compareTo(geneAddDtmMax) > 0)
			{
				// 対象のオプションサービス契約の世代年月日時分秒が最大より大きい場合、最大値を上書き
				geneAddDtmMax = geneAddDtm;
			}else{
				// 世代年月日時分秒が最大でない場合
				continue;
			}

			// オプションサービス契約<ISP>の初期POPIDパスワードを設定する
			if(!value.equals(shkPopIdPwd)){
				value = shkPopIdPwd;
			}
		}
		// ANK-2350-00-00 2016/02/23 ADD END

		// 引継データの設定
		JSYejbSucceedDataAccess.setSucceedData(KEY_SHKPOPPWD, value);

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のホスティングメール管理者IDを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のホスティングメール管理者ID
	 */
	public Object getHosmlKrishaId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		String seq = null; // シーケンス
		String checkDidit = null; // チェックデジット
		String value = null; // 採番値

		StringBuffer buffer = new StringBuffer();

		// 採番処理
		seq = "E10203040";

		// チェックデジット取得
		checkDidit = getCheckDigit21(seq);

		// 採番値設定
		buffer.append(seq);
		buffer.append(checkDidit);
		value = buffer.toString();

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のホスティング初期メール管理者IDパスワードを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のホスティング初期メール管理者IDパスワード
	 */
	public Object getHostingShkmKrishaIdPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		value = getPwd();

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のホスティングメール管理者POPIDを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のホスティングメール管理者POPID
	 */
	public Object getHosmlKrishaPopId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		value = "admin%k-opti.co.jp";

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のホスティング初期メール管理者POPIDパスワードを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のホスティング初期メール管理者POPIDパスワード
	 */
	public Object getHostingShkmKrishaPopPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		value = getPwd();

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のWebIDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のWebID
	 */
	public Object getWebId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		String seq = null; // Oracleシーケンス
		String checkDidit = null; // チェックデジット
		String value = null; // 採番値

		StringBuffer buffer = new StringBuffer();

		// 採番処理
		// Oracleシーケンス取得
		seq = JCCModelCommon.getFormatedNextSeq(SEQ_WEBID_NAME, PREFIX_WEBID, SEQ_WEBID_LENGTH);

		// チェックデジット取得
		checkDidit = getCheckDigit21(seq);

		// 採番値設定
		buffer.append(seq);
		buffer.append(checkDidit);
		value = buffer.toString();
		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>の初期WebIDパスワードの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inOpSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約<ISP>の初期WebIDパスワード
	 */
	public Object getShkWebIdPwd(CAANMsg inMsg, AgentDispatchContext inContext, Object inOpSvcKeiNo)
	{
		String value = null;

		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得
		value = (String)JSYejbSucceedDataAccess.getSucceedData(KEY_SHKWEBIDPWD);

		if (value != null)
		{
			// 引継データが設定されている場合はそのまま返却
			return value;
		}

		// 採番処理
		value = getSvcShkDefaultPwd(inMsg, inOpSvcKeiNo.toString());

		// ANK-2350-00-00 2016/02/23 ADD START
		// 入力のオプション契約番号を取得する
		String opSvcKeiNo = inMsg.getString(EKK0361C111CBSMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();

		// オプションサービス契約カレント取得
		CAANMsg kk0351CurDate = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// 親サービス契約に紐付くオプションサービス契約を取得する
		CAANMsg[] kk0351InsList = kk0351dba.getKK0351bySvcKei(kk0351CurDate.getString(KK0351ETMsg.SVC_KEI_NO), null, opeDate, "1");

		//最大の世代登録年月日時分秒
		String geneAddDtmMax = null;
		// オプションサービス契約番号が取得できた分繰り返し(初期WEBIDパスワードを設定できたら終了)
		for (CAANMsg kk0351info : kk0351InsList)
		{
			// オプションサービスコードを取得する
			String optSvcCd = kk0351info.getString(KK0351ETMsg.OP_SVC_CD);

			// 対象のオプションサービス契約が"Ｍｙホームページ"ではない場合
			if (!JKKModelConst.OP_SVC_CD_MY_HP.equals(optSvcCd))
			{
				continue;
			}

			// オプションサービス契約番号を取得する
			String optSvcKeiNo = kk0351info.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			String geneAddDtm = kk0351info.getString(KK0351ETMsg.GENE_ADD_DTM);

			// 一意検索用のメッセージを作成
			CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
			inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, optSvcKeiNo);
			inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, geneAddDtm);

			// オプションサービス契約<ISP>の一意検索を行う
			CAANMsg kk0361Msg = new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);
			String shkWebIdPwd = kk0361Msg.getString(KK0361ETMsg.SHK_WEB_ID_PWD);

			// 初期WEBIDPWがNULLの場合
			if (shkWebIdPwd == null)
			{
				continue;
			}

			// 世代年月日時分秒の最大値がNULLの場合
			if (geneAddDtmMax == null)
			{
				geneAddDtmMax = geneAddDtm;
			}else if(geneAddDtm.compareTo(geneAddDtmMax) > 0){
				// 対象のオプションサービス契約の世代年月日時分秒が最大でない場合で初期WEBIDPWがNULLでなければ最大値を上書き
				geneAddDtmMax = geneAddDtm;
			}else{
				// 世代年月日時分秒が最大でない場合
				continue;
			}

			// オプションサービス契約<ISP>の初期WEBIDパスワードを設定する
			if(!value.equals(shkWebIdPwd)){
				value = shkWebIdPwd;
			}
		}
		// ANK-2350-00-00 2016/02/23 ADD END

		// 引継データの設定
		JSYejbSucceedDataAccess.setSucceedData(KEY_SHKWEBIDPWD, value);

		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のダイヤルパッドMAPIDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたオプションサービス契約<ISP>のダイヤルパッドMAPID
	 */
	public Object getDpadMapid(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		String seq = null; // Oracleシーケンス
		String checkDidit = null; // チェックデジット
		String value = null; // 採番値

		StringBuffer buffer = new StringBuffer();

		// 採番処理
		// Oracleシーケンス取得
		seq = JCCModelCommon.getFormatedNextSeq(SEQ_DPAD_MAPID_NAME, PREFIX_DPAD_MAPID, SEQ_DPAD_MAPID_LENGTH);

		// チェックデジット取得
		checkDidit = getCheckDigit21(seq);

		// 採番値設定
		buffer.append(seq);
		buffer.append(checkDidit);
		value = buffer.toString();
		return value;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレスを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号 
	 * @return 採番されたオプションサービス契約<ISP>のメールアドレス
	 */
	public Object getMlad(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current(opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));

		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary(opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));

		// OM-2014-0003006 ADD START
		String mlad = null;
		// カレントよりサービス契約番号を設定
		String svcKeiNo = kk0351Msg.getString(KK0351ETMsg.SVC_KEI_NO);
		// 最古の「オプションサービス契約」を取得
		CAANMsg kk0351MsgOld = new JKKejbKK0351DBABase().getKK0351OldRireki(svcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		if (kk0351MsgOld != null)
		{
			// 最古の「オプションサービス契約」にひもづく「オプションサービス契約<ISP>」を取得
			CAANMsg kk0361MsgOld = new JKKejbKK0361DBABase().getKK0361Primary(kk0351MsgOld.getString(KK0351ETMsg.OP_SVC_KEI_NO), kk0351MsgOld.getString(KK0351ETMsg.GENE_ADD_DTM));
			// 希望メールアカウントを用いてメールアドレスを採番する。
			mlad = getMladFromKiboMlAccountNew(kk0361Msg, kk0361MsgOld);
		}
		else
		{
			// 希望メールアカウントを用いてメールアドレスを採番する。
			mlad = getMladFromKiboMlAccount(kk0361Msg);
		}
		// OM-2014-0003006 ADD END
		
		// 希望メールアカウントを用いてメールアドレスを採番する。
		// OM-2014-0003006 DEL START
		// String mlad = getMladFromKiboMlAccount(kk0361Msg);
		// OM-2014-0003006 DEL END

		if (mlad == null)
		{
			// エイジングチェックにより、希望メールアカウント１〜３を使用したメールアドレスが取得できなかった場合
			if (!kk0361Msg.isNull(KK0361ETMsg.KIBO_ML_ACCOUNT_1)
					|| !kk0361Msg.isNull(KK0361ETMsg.KIBO_ML_ACCOUNT_2)
					|| !kk0361Msg.isNull(KK0361ETMsg.KIBO_ML_ACCOUNT_3))
			{
				// エイジングチェックエラーとし、処理を終了する。
				setErrInfo(inMsg, StatusCodes.RELATION_ERR, KRCK_OP_SVC_KEI_NO_ERR);
				return null;
			}

			// 希望メールアカウント１〜３が未設定(無料オプション分のＥメール)の場合、Oracleシーケンスを用いて自動で採番する。
			mlad = getMladAuto();
		}

		// 採番されたメールアドレスを保持しておく（POPID採番時に使用するため）
		JSYejbSucceedDataAccess.setSucceedData(KEY_MAILADDRESS, mlad);

		return mlad;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレスを採番します。（希望メールアカウント使用）<br>
	 * （希望メールアカウントを用いて生成したメールアドレスのうち、エイジング未登録のメールアドレスを採用します。）<br>
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 採番されている場合:true,されていない場合:false
	 */
	private String getMladFromKiboMlAccount(CAANMsg inMsg)
	{
		// サブドメインの一覧をコード管理より取得
		JKKejbZM0171DBAccess codeNameDba = new JKKejbZM0171DBAccess();
		String[] subDomainList = codeNameDba.getCodeNameE(CODE_SUB_DOMAIN);
		// メールアドレスドメイン取得
		String mladDomain = getMladDomain();

		// 希望メールアカウント１〜３について、順次ドメインと結合し、メールアドレスを生成する。
		// 対象のメールアドレスが「エイジング」に未登録であれば、該当の「オプションサービス契約<ISP>」のメールアドレスとして採用する。
		String[] kiboMlAccountList = {
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_1),
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_2),
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_3)};
		for (String kiboMlAccount : kiboMlAccountList)
		{
			// 希望メールアカウントの指定がない場合は、チェック対象外
			if (kiboMlAccount == null)
			{
				continue;
			}
			for (String subDomain : subDomainList)
			{
				// メールアドレス = 希望メールアカウント + "@" + サブドメイン + "." + メールアドレスドメイン
				String mlad = kiboMlAccount.concat(ANNOTATION).concat(subDomain).concat(DOTTO).concat(mladDomain);

				//エイジングチェック
				if (isMladAgingChk(mlad))
				{
					// チェックＯＫの場合、該当のメールアドレスを採用
					return mlad;
				}
			}
		}

		return null;
	}
	// OM-2014-0003006 ADD START
	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレスを採番します。（希望メールアカウント使用）<br>
	 * （希望メールアカウントを用いて生成したメールアドレスのうち、エイジング未登録のメールアドレスを採用します。）<br>
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inMsgOld 処理対象のメッセージキャリア（最古レコード）
	 * @return 採番されている場合:true,されていない場合:false
	 */
	private String getMladFromKiboMlAccountNew(CAANMsg inMsg, CAANMsg inMsgOld)
	{
		// サブドメインの一覧をコード管理より取得
		JKKejbZM0171DBAccess codeNameDba = new JKKejbZM0171DBAccess();
		String[] subDomainList = codeNameDba.getCodeNameE(CODE_SUB_DOMAIN);
		
		// メールアドレスの取得
		String mlad = inMsgOld.getString(KK0361ETMsg.MLAD);
		
		if (mlad != null && !mlad.equals(""))
		{
			int index = mlad.indexOf("@");
			// 文字列"@"の次から4桁を取得
			String subDomain = mlad.substring(index+1).substring(0,4);
			// コード管理より取得したサブドメイン一覧の位置を取得
			int i;
			for (i=0; i < subDomainList.length; i++)
			{
				if (subDomainList[i].equals(subDomain))
				{
					break;
				}
			}
			ArrayList<String> arraylist = new ArrayList<String>();
			// サブドメイン一覧の格納順を変更
			int j;
			for (j=i; j < subDomainList.length; j++)
			{
				arraylist.add(subDomainList[j]);
			}
			for (j=0; j < i; j++)
			{
				arraylist.add(subDomainList[j]);
			}
			subDomainList = arraylist.toArray(new String[0]); 
		}
		
		// メールアドレスドメイン取得
		String mladDomain = getMladDomain();

		// 希望メールアカウント１〜３について、順次ドメインと結合し、メールアドレスを生成する。
		// 対象のメールアドレスが「エイジング」に未登録であれば、該当の「オプションサービス契約<ISP>」のメールアドレスとして採用する。
		String[] kiboMlAccountList = {
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_1),
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_2),
				inMsg.getString(KK0361ETMsg.KIBO_ML_ACCOUNT_3)};
		for (String kiboMlAccount : kiboMlAccountList)
		{
			// 希望メールアカウントの指定がない場合は、チェック対象外
			if (kiboMlAccount == null)
			{
				continue;
			}
			for (String subDomain : subDomainList)
			{
				// メールアドレス = 希望メールアカウント + "@" + サブドメイン + "." + メールアドレスドメイン
				String mladress = kiboMlAccount.concat(ANNOTATION).concat(subDomain).concat(DOTTO).concat(mladDomain);

				//エイジングチェック
				if (isMladAgingChk(mladress))
				{
					// チェックＯＫの場合、該当のメールアドレスを採用
					return mladress;
				}
			}
		}

		return null;
	}
	// OM-2014-0003006 ADD END

	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレスを採番します。（Oracleシーケンス使用）<br>
	 * （Oracleシーケンスを用いて生成したメールアドレスのうち、エイジング未登録のメールアドレスを採用します。）<br>
	 * </p>
	 * @return 採番されている場合:true,されていない場合:false
	 */
	private String getMladAuto()
	{
		// サブドメインの一覧をコード管理より取得
		JKKejbZM0171DBAccess codeNameDba = new JKKejbZM0171DBAccess();
		String[] subDomainList = codeNameDba.getCodeNameE(CODE_SUB_DOMAIN);
		// OM-2014-0003006 ADD START
		//初回メールサブドメインのシーケンス値を取得
		String firstmladAccount = getNextFirstAdSeq();
		//サブドメインの割り当て
		int intChkdigt = (int)(Long.parseLong(firstmladAccount) % subDomainList.length);
		// OM-2014-0003006 ADD END
		// メールアドレスドメイン取得
		String mladDomain = getMladDomain();

		// エイジング未登録のメールアドレスが取得できるまで採番を続ける
		while (true)
		{
			String mladAccount = getNextSeq();
			// メールアドレス = Oracleシーケンス変換値 + "@" + サブドメイン + "." + メールアドレスドメイン
			// OM-2014-0003006 MOD START
			// String mlad = mladAccount.concat(ANNOTATION).concat(subDomainList[0]).concat(DOTTO).concat(mladDomain);
			String mlad = mladAccount.concat(ANNOTATION).concat(subDomainList[intChkdigt]).concat(DOTTO).concat(mladDomain);
			// OM-2014-0003006 MOD END
			//エイジングチェック
			if (isMladAgingChk(mlad))
			{
				// チェックＯＫの場合、該当のメールアドレスを採用
				return mlad;
			}
		}
	}

	/**
	 * Oracleシーケンス取得処理
	 * @return 取得した採番値
	 */
	private String getNextSeq()
	{
		//希望メールアドレスが取得できなかった場合、Oracleシーケンスを特殊変換
		String seq = null; // Oracleシーケンス
		StringBuffer buffer = new StringBuffer();

		// 採番処理
		// Oracleシーケンス取得
		seq = JCCModelCommon.getFormatedNextSeq(SEQ_KKMLAD_ACCOUNT, PREFIX_MAIL, SEQ_ACCOUNT_LENGTH);

		buffer.append(toAlphabetLower(seq.substring(1, 2), seq.substring(2, 3)));
		buffer.append(toAlphabetLower(seq.substring(5, 6), seq.substring(6, 7)));
		buffer.append(toAlphabetLower(seq.substring(0, 1), seq.substring(1, 2)));
		buffer.append(toAlphabetLower(seq.substring(2, 3), seq.substring(3, 4)));
		buffer.append(seq.substring(4, 5));
		buffer.append(seq.substring(5, 6));
		buffer.append(seq.substring(6, 7));
		buffer.append(seq.substring(7, 8));
		buffer.append(getCheckDigit21(buffer.toString()));
		return buffer.toString();
	}
	// OM-2014-0003006 ADD START
	/**
	 * 初回メールサブドメインのシーケンス取得処理
	 * @return 取得した採番値
	 */
	private String getNextFirstAdSeq()
	{
		//初回メールサブドメインのシーケンスを特殊変換
		String seq = null; // 初回メールサブドメインのシーケンス
		
		// 採番処理
		// Oracleシーケンス取得
		seq = JCCModelCommon.getFormatedNextSeq(SEQ_KKMLAD_SUBDOMAIN, PREFIX_MAIL, SEQ_SUBDOMAIN_LENGTH);

		return seq;
	}
	// OM-2014-0003006 ADD END
	/**
	 * メールアドレスエイジングチェック処理（メールアドレス払出用）
	 * @param mlad メールアドレス
	 * @return チェック結果 true:チェックＯＫ、false:チェックＮＧ
	 */
	private boolean isMladAgingChk(String mlad)
	{
		// 個別検索条件マップ
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();

		// 追加検索条件：エイジング.エイジング種別コード = "メールエイリアス"、"メールアドレス"、"メーリングリスト"
		String [] agingSbTList = {JKKModelConst.AGING_SBT_CD_MAILALIAS, JKKModelConst.AGING_SBT_CD_MLAD, JKKModelConst.AGING_SBT_CD_MLLIST};

		// 追加検索条件：エイジング.エイジングステータス = "使用中"、"回復可能"、"エージング中"
		String [] agingStatList = {JKKModelConst.AGING_STAT_USE_CHU, JKKModelConst.AGING_STAT_KAIHK_PSB, JKKModelConst.AGING_STAT_AGING_CHU};
		searchJknMap.put(ZM0111ETMsg.AGING_STAT, agingStatList);

		// エイジング対象値に紐づく「エイジング」を取得する。
		CAANMsg[] zm0111MsgList = new JKKejbZM0111DBABase().getZM0111byAgingTgValue(
				agingSbTList, mlad, searchJknMap);

		// １件でも存在する場合、チェックＮＧ
		if (zm0111MsgList.length > 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のダイヤルパッドIDを編集する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inDpadId ダイヤルパッドID
	 * @return 編集されたオプションサービス契約<ISP>のダイヤルパッドID
	 */
	public Object getDpadId(CAANMsg inMsg, AgentDispatchContext inContext, Object inDpadId)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		//入力値のチェック
		if (null == inDpadId)
		{
			return null;
		}
		// ダイヤルパッドIDの返却
		return inDpadId.toString().concat(ANNOTATION).concat(getDialPadDomain());
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>のマルチセッション用認証IDを編集する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inOpSvcCd オプションサービスコード
	 * @param inSvcKeiNo サービス契約番号
	 * @param inMltiseNinshoId マルチセッション用認証ID
	 * @return 編集されたオプションサービス契約<ISP>のマルチセッション用認証ID
	 */
	public Object getMltiseNinshoId(CAANMsg inMsg, AgentDispatchContext inContext, Object inOpSvcCd, Object inSvcKeiNo, Object inMltiseNinshoId)
	{
		// 機能コードのチェック（偶数の場合は編集しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// 入力値(マルチセッション用認証ID)のチェック
		if (null == inMltiseNinshoId)
		{
			return null;
		}
		
		// フロントからの呼び出し以外の場合は編集を行わない
		if (!JKKejbCallTypeChecker.isCallTypeFront(inContext))
		{
			return inMltiseNinshoId;
		}
		
		// オプションサービスコードが"マルチセッション"以外はnullを返却する
		if (!OP_SVC_CD_MLTI.equals(inOpSvcCd))
		{
			return null;
		}
		
		// 入力値(サービス契約番号)のチェック
		if (null == inSvcKeiNo)
		{
			return inMltiseNinshoId;
		}
		
		// オプションサービス契約レコード検索
		CAANMsg msg = new CAANMsg(KK0351ETMsg.class.getName());
		msg.set(KK0351ETMsg.SVC_KEI_NO, inSvcKeiNo);
		msg.set(KK0351ETMsg.OP_SVC_CD, OP_SVC_CD_FIXED_GL_ID_ADD);
		msg.set(KK0351ETMsg.MK_FLG, MK_FLG_VALID);
		
		KK0351LE le = new KK0351LE();
		CAANMsg[] outOpSvcKei = null;
		
		try
		{
			// サービス契約番号で紐づくオプションサービス契約を取得する。
			outOpSvcKei = le.findByCondition(msg);
		}
		catch(CAANException ce)
		{
			return inMltiseNinshoId;
		}
		
		// レコードが取得出来ない場合は編集せずに返す
		if (null == outOpSvcKei || 0 == outOpSvcKei.length)
		{
			return inMltiseNinshoId;
		}
		// レコードが取得出来た場合は"@"の前に"P"を付加し返す
		else
		{
			int anoPoint = inMltiseNinshoId.toString().lastIndexOf(ANNOTATION);
			
			if (0 > anoPoint)
			{
				return inMltiseNinshoId.toString().concat(ALPHABET_P);
			}
			
			return inMltiseNinshoId.toString().substring(0, anoPoint).concat(ALPHABET_P).concat(inMltiseNinshoId.toString().substring(anoPoint));
		}
	}

	/**
	 * <p>
	 * メールアドレスからPOPIDに変換を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMlad メールアドレス
	 * @return PopId
	 */
	public Object toPopid(CAANMsg inMsg, AgentDispatchContext inContext, Object inMlad)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		//入力値のチェック
		if (null == inMlad)
		{
			return null;
		}

		// メールアドレスからPOPIDを生成
		return inMlad.toString().replace(ANNOTATION, PERSENT);
	}

	/**
	 * <p>
	 * オプションサービス契約に紐づくサービス契約の初期デフォルトパスワードを取得する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inOpSvcKeiNo オプションサービス契約番号
	 * @return 初期デフォルトパスワード
	 */
	private String getSvcShkDefaultPwd(CAANMsg inMsg, String inOpSvcKeiNo)
	{
		// サービス契約の初期デフォルトパスワードを設定する
		// カレントレコードの検索
		CAANMsg crMsg = new CAANMsg(KK0351ETMsg.class.getName());
		crMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inOpSvcKeiNo);
		crMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));
		CAANMsg outMsg = new JKKejbKK0351DBABase().findByCurrent(crMsg);

		// 存在しない、または、サービス契約番号が設定されていない場合
		if (outMsg == null || outMsg.isNull(KK0351ETMsg.SVC_KEI_NO))
		{
			return null;
		}

		// サービス契約のカレントレコード検索
		CAANMsg crSvcMsg = new CAANMsg(KK0081ETMsg.class.getName());
		crSvcMsg.set(KK0081ETMsg.SVC_KEI_NO, outMsg.getString(KK0351ETMsg.SVC_KEI_NO));
		crSvcMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));
		CAANMsg outSvcMsg = new JKKejbKK0081DBABase().findByCurrent(crSvcMsg);

		// 存在しない場合
		if (outSvcMsg == null)
		{
			return null;
		}

		return outSvcMsg.getString(KK0081ETMsg.SHK_DFLT_PWD);
	}

	/**
	 * メールアドレスドメイン取得処理
	 * @return メールアドレスドメイン
	 */
	private String getMladDomain()
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_MLAD_DOMAIN);
	}

	/**
	 * ダイヤルパッドドメイン取得処理
	 * @return ダイヤルパッドドメイン
	 */
	private String getDialPadDomain()
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_DPAD_ID_DOMAIN);
	}

// ANK-3149-00-00 ADD START
	/**
	 * マカフィー用認証メールアドレスドメイン取得処理
	 * @return マカフィー用認証メールアドレスドメイン
	 */
	private String getMcfDomain()
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_MACFEE_DOMAIN);
	}
// ANK-3149-00-00 ADD END
	
	/**
	 * ダイヤルアップ接続用(ホームタイプ)取得処理
	 * @return ダイヤルアップ接続用(ホームタイプ)
	 */
	private String getDupConHome()
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_DUPCON_HOME_TYPE);
	}

	/**
	 * ダイヤルアップ接続用(マンションタイプ)取得処理
	 * @return ダイヤルアップ接続用(マンションタイプ)
	 */
	private String getDupConMans()
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_DUPCON_MANS_TYPE);
	}

	/**
	 * ダイヤルアップ接続用(グローバルVR識別コード)取得処理
	 * @param pcrsCd 料金コースコード
	 * @return ダイヤルアップ接続用(グローバルVR識別コード)またはダイヤルアップ接続用(光配線VR識別コード)
	 */
	private String getDupConVascdGl(String pcrsCd)
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		
		if (PCRS_CD_MANS_HHAISEN_100M.equals(pcrsCd) || PCRS_CD_MANS_HHAISEN_1G.equals(pcrsCd))
		{
			return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_DUPCON_VASCD_HCBL);
		}
		
		return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_DUPCON_VASCD_GL);
	}

	/**
	 * <p>
	 * フェムトセル認証ID識別子取得処理
	 * </p>
	 * @param fmtcelJgsCd　フェムトセル事業者コード
	 * @return フェムトセル認証ID識別子
	 */
	private String getFmtcelNinshoIdSkbt(String fmtcelJgsCd)
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();

		// フェムトセル事業者コードが"エーユー"の場合
		if (JKKModelConst.JIGYOSHA_CD_AU.equals(fmtcelJgsCd))
		{
			return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_FMTCEL_SKBT_AU);
		}
		// フェムトセル事業者コードが"ソフトバンクモバイル"の場合
		else if (JKKModelConst.JIGYOSHA_CD_SOFTBANK_MBL.equals(fmtcelJgsCd))
		{
			return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_FMTCEL_SKBT_SBM);
		}
		// ANK-4369-00-00 ADD START
		// フェムトセル事業者コードが"楽天"の場合
		else if (JKKModelConst.JIGYOSHA_CD_RAKUTEN.equals(fmtcelJgsCd))
		{
			return wkParamDba.getParamE(JKKModelConst.WORK_PARAM_KK_FMTCEL_SKBT_RM);
		}
		// ANK-4369-00-00 ADD END
		else
		{
			throw new CAANRuntimeException("未定義のフェムトセル事業者コードです。");
		}
	}

	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレス変更年月日を取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param inMlad メールアドレス
	 * @return メールアドレス変更年月日
	 */
	public Object getMladChgeYmd(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo, String inMlad)
	{
		// 機能コードのチェック（偶数の場合は設定しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// オプションサービス契約番号が未設定の場合
		if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
		{
			return null;
		}

		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg searchKey = new CAANMsg(KK0351ETMsg.class.getName());
		searchKey.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		searchKey.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));			
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().findByCurrent(searchKey);
		
		// オプションサービス契約番号が存在しない場合、対象外
		if (kk0351Msg == null)
		{
			return null;
		}

		// オプションサービスコードが"Ｅメール"以外の場合、対象外
		if (!JKKModelConst.OP_SVC_CD_EMAIL.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return null;
		}

		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary(opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));

		// メールアドレスに変更がない場合(入力値、カレントレコードともにnullの場合を含む)、カレントレコードの同項目を設定
		// ** 入力のメールアドレスが未設定の場合、nullで設定される為、次の判定分で例外が発生する。
		// ** 値の変更判定を行っているのでnullを空文字にコンバートしてオブジェクトのnullPointerを逃れる。
		if (inMlad == null)
		{
			inMlad = "";
		}

		if ((inMlad.isEmpty() && kk0361Msg.isNull(KK0361ETMsg.MLAD)) || (inMlad.equals(kk0361Msg.getString(KK0361ETMsg.MLAD))))
		{
			return kk0361Msg.getString(KK0361ETMsg.MLAD_CHGE_YMD);
		}
		// メールアドレスに変更がある場合、当日を設定
		else
		{
			return JKKModelCommon.getOpeDate(inMsg);
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>のメールアドレス変更年月日を取得します。(採番判定あり)
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return メールアドレス変更年月日
	 */
	public Object getMladChgeYmdSaiban(CAANMsg inMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は設定しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// オプションサービス契約番号が未設定の場合
		if (opSvcKeiNo == null || "".equals(opSvcKeiNo))
		{
			return null;
		}

		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current(opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));

		// オプションサービスコードが"Ｅメール"以外の場合、対象外
		if (!JKKModelConst.OP_SVC_CD_EMAIL.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD)))
		{
			return null;
		}

		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary(opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));

		String mlad = null;
		// メールアドレスが設定されている場合
		if (kk0361Msg.isNull(KK0361ETMsg.MLAD))
		{
			// 希望メールアカウントを用いてメールアドレスを採番する。
			mlad = getMladFromKiboMlAccount(kk0361Msg);
		}
		
		// 希望メールアカウントのメールアドレスを取得できた場合、当日を設定
		if (mlad != null)
		{
			return JKKModelCommon.getOpeDate(inMsg);
		}

		// 希望メールアカウントのメールアドレスを取得できなかった(自動採番によりメールアドレスを取得した)場合、カレントレコードの同項目を設定
		return kk0361Msg.getString(KK0361ETMsg.MLAD_CHGE_YMD);
	}
	

	/**
	 * <p>
	 * オプションサービス契約<ISP>のダイヤルアップ接続用認証IDを採番します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inOpSvcKeiNo オプションサービス契約番号
	 * @return 採番されたオプションサービス契約<ISP>のダイヤルアップ接続用認証ID
	 */
	public Object getDupconNinshoId(CAANMsg inMsg, AgentDispatchContext inContext, Object inOpSvcKeiNo)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 対象の「オプションサービス契約」のカレントレコードを取得する。
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		CAANMsg crKK0351 = new JKKejbKK0351DBABase().getKK0351Current((String)inOpSvcKeiNo, opeDate);

		// 対象の「オプションサービス契約」の親「サービス契約」を取得する。
		String svcKeiNo = crKK0351.getString(KK0351ETMsg.SVC_KEI_NO);
		CAANMsg crKK0081 = new JKKejbKK0081DBABase().getKK0081Current(svcKeiNo, opeDate);

		// 該当の「サービス契約」配下の「サービス契約内訳」を取得する。
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		CAANMsg[] kk0161MsgList = kk0161dba.getKK0161bySvcKei(svcKeiNo, null, opeDate);

		// 解約済、キャンセル済を除外する
		kk0161MsgList = kk0161dba.getKK0161OutDsLCl(kk0161MsgList);
		if (kk0161MsgList.length == 0)
		{
			throw new CAANRuntimeException("ネット契約に紐づく「サービス契約内訳」(ISP認証ID)が存在しません。");
		}

		// 対象の「サービス契約内訳<eo光ネット>」を取得する。
		// ※同一の「サービス契約」(eo光ネット)配下の「サービス契約内訳」は、ISP認証IDのアカウント部は同じため、
		//   ここでは、取得した複数の「サービス契約内訳」のうち、１件目を使用する。
		CAANMsg kk0161Msg = kk0161MsgList[0];
		CAANMsg kk0171Msg = new JKKejbKK0171DBABase().getKK0171Primary(
				kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO), kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM));

		// ISP認証ID(アカウント)を取得
		String ispNinshoId = kk0171Msg.getString(KK0171ETMsg.ISP_NINSHO_ID);
		String ispNinshoIdAccount = ispNinshoId.split(ANNOTATION)[0];

		// 料金グループコードを取得
		String sPrcGrpCd = crKK0081.getString(KK0081ETMsg.PRC_GRP_CD);
		// 採番値返却用変数
		StringBuffer sbResult = new StringBuffer();

		// 料金グループコードが「eo光ネットホームタイプ」、または「eo光ネットメゾンタイプ」の場合
		if (JKKModelConst.PRC_GRP_CD_EOHNT_HOME_TYPE.equals(sPrcGrpCd) || JKKModelConst.PRC_GRP_CD_EOHNT_MAISON_TYPE.equals(sPrcGrpCd))
		{
			// ISP認証ID(アカウント) + ドメイン(ホームタイプ)
			sbResult.append(ispNinshoIdAccount);
			sbResult.append(getDupConHome());
		}
		// 料金グループコードが「eo光ネットマンションタイプ」の場合
		else if (JKKModelConst.PRC_GRP_CD_EOHNT_MANS_TYPE.equals(sPrcGrpCd))
		{
			// 料金コースコードを取得
			String spcrsCd = crKK0081.getString(KK0081ETMsg.PCRS_CD);
			
			// ISP認証ID(アカウント) + グローバルVR識別コード + ドメイン(マンションタイプ)
			sbResult.append(ispNinshoIdAccount);
			sbResult.append(getDupConVascdGl(spcrsCd));
			sbResult.append(getDupConMans());
		}

		return sbResult.toString();
	}

	/**
	 * <p>
	 * フェムトセル認証IDの採番を行います
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return フェムトセル承認ID
	 */
	public Object getFmtcelNinshoId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// フェムトセル照合対象コード
		String fmtcelShogoTgCd = inMsg.getString(EKK0361D010CBSMsg.FMTCEL_SYOGO_TG_CD);
		// フェムトセル事業者コード
		String fmtcelJgsCd = inMsg.getString(EKK0361D010CBSMsg.FMTCEL_JGS_CD);
		// 20141110 ANK-2184-00-00 Add Start
		// 料金コースコード
		String pcrsCd = inMsg.getString(EKK0361D010CBSMsg.PCRS_CD);
		// 20141110 ANK-2184-00-00 Add End

		// オプションサービスコードが未設定、または"フェムトセル"以外の場合は、処理対象外
		if (!JKKModelConst.OP_SVC_CD_FMTCEL.equals(inMsg.getString(EKK0361D010CBSMsg.OP_SVC_CD)))
		{
			return null;
		}
		// ANK-4369-00-00 MOD START
		// フェムトセル事業者コードが未設定、または"エーユー"、"ソフトバンクモバイル"、"楽天"以外の場合は、処理対象外
		if (!JKKModelConst.JIGYOSHA_CD_AU.equals(fmtcelJgsCd) && !JKKModelConst.JIGYOSHA_CD_SOFTBANK_MBL.equals(fmtcelJgsCd)
				&& !JKKModelConst.JIGYOSHA_CD_RAKUTEN.equals(fmtcelJgsCd))
		{
			return null;
		}
		// ANK-4369-00-00 MOD END
		// フェムトセル照合対象コードが未入力の場合は、処理対象外
		if (fmtcelShogoTgCd == null)
		{
			return null;
		}

		// フェムトセル認証ID識別子を取得
		String teigiValue = getFmtcelNinshoIdSkbt(fmtcelJgsCd);

		// フェムトセル照合対象コードが"認証IDでの照合"の場合
		if (JKKModelConst.FMTCEL_SHOGO_TG_CD_NINSHO_ID.equals(fmtcelShogoTgCd))
		{
			// サービス契約内訳番号が未設定(未採番)の場合は、処理を終了する。
			String svcKeiUcwkNo = inMsg.getString(EKK0361D010CBSMsg.SVC_KEI_UCWK_NO);
			if (svcKeiUcwkNo == null)
			{
				return null;
			}

			// 対象の「オプションサービス契約」の親「サービス契約内訳」を取得する。
			CAANMsg kk0161Msg = new JKKejbKK0161DBABase().getKK0161Current(svcKeiUcwkNo, JKKModelCommon.getOpeDate(inMsg));
			// 対象の「サービス契約内訳<eo光ネット>」を取得する。
			CAANMsg kk0171Msg = new JKKejbKK0171DBABase().getKK0171Primary(
					kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO), kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM));

			// ISP認証IDが未設定(未採番)の場合は、処理を終了する。
			String ispNinshoId = kk0171Msg.getString(KK0171ETMsg.ISP_NINSHO_ID);
			if (ispNinshoId == null)
			{
				return null;
			}
			// ANK-4369-00-00 MOD START
			// フェムトセル事業者コードが"ソフトバンクモバイル"、"楽天"の場合
			if (JKKModelConst.JIGYOSHA_CD_SOFTBANK_MBL.equals(fmtcelJgsCd) || JKKModelConst.JIGYOSHA_CD_RAKUTEN.equals(fmtcelJgsCd))
			{
				// 先頭10文字を使用する。
				if (ispNinshoId.length() > 10)
				{
					ispNinshoId = ispNinshoId.substring(0, 10);
				}
			}
			// ANK-4369-00-00 MOD END
			// フェムトセル事業者コードが"エーユー"の場合
			else if (JKKModelConst.JIGYOSHA_CD_AU.equals(fmtcelJgsCd))
			{
				// アカウント部を使用する
				ispNinshoId = ispNinshoId.split(ANNOTATION)[0];
				
				// 20141110 ANK-2184-00-00 Add Start
				// 料金コースコード＝「BC5：【管理用】フェムトセル　LTE」の場合
				if (JKKModelConst.PCRS_CD_FMTCEL_NEW.equals(pcrsCd)) {
					// "L" + ISP認証IDの2桁目以降
					ispNinshoId = PREFIX_FMTCEL_NEW.concat(ispNinshoId.substring(1));
				}
				// 20141110 ANK-2184-00-00 Add End
			}
			else
			{
				throw new CAANRuntimeException("未定義のフェムトセル事業者コードです。");
			}
			// ISP認証ID(アカウント部、または先頭10文字) + フェムトセル認証ID識別子
			return ispNinshoId.concat(teigiValue);
		}
		// フェムトセル照合対象コードが"サービス契約番号での照合"の場合
		else if (JKKModelConst.FMTCEL_SHOGO_TG_CD_SVKEI_NO.equals(fmtcelShogoTgCd))
		{
			// フェムトセル事業者コードが"ソフトバンクモバイル"以外の場合は、処理対象外
			if (!JKKModelConst.JIGYOSHA_CD_SOFTBANK_MBL.equals(fmtcelJgsCd))
			{
				return null;
			}
			// サービス契約番号が未設定(未採番)の場合は、処理を終了する。
			if (inMsg.isNull(EKK0361D010CBSMsg.SVC_KEI_NO))
			{
				return null;
			}
			// サービス契約番号 + フェムトセル認証ID識別子
			return inMsg.getString(EKK0361D010CBSMsg.SVC_KEI_NO).concat(teigiValue);
		}
		else
		{
			throw new CAANRuntimeException("未定義のフェムトセル照合対象コードです。");
		}
	}

	/**
	 * <p>
	 * フェムトセル認証IDパスワードの採番を行います
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return　フェムトセル認証IDパスワード
	 */
	public Object getFmtcelNinshoIdPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// オプションサービスコードが"フェムトセル"以外の場合
		if (!JKKModelConst.OP_SVC_CD_FMTCEL.equals(inMsg.getString(EKK0361D010CBSMsg.OP_SVC_CD)))
		{
			return null;
		}
		
		// フェムトセル事業者コード
		String fmtcelJgsCd = inMsg.getString(EKK0361D010CBSMsg.FMTCEL_JGS_CD);

		// ANK-4369-00-00 MOD START
		// フェムトセル事業者コードが未設定、または"エーユー"、"ソフトバンクモバイル"、"楽天"以外の場合は、処理対象外
		if (!JKKModelConst.JIGYOSHA_CD_AU.equals(fmtcelJgsCd) && !JKKModelConst.JIGYOSHA_CD_SOFTBANK_MBL.equals(fmtcelJgsCd)
				&& !JKKModelConst.JIGYOSHA_CD_RAKUTEN.equals(fmtcelJgsCd))
		{
			return null;
		}
		// ANK-4369-00-00 MOD END
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_FMTCEL_NINSHO_ID_PWD, PREFIX_FMTCEL_NINSHO_ID_PWD, EQ_FMTCEL_NINSHO_ID_PWD_LENGTH));

		// シード値を使用して乱数を発生
		String random = getRandomNumberSeed(RANDOM_LENGTH_FMTCEL_NINSHO_ID, seq);

		// 変換処理
		StringBuffer pwd = new StringBuffer();

		// (1)乱数の9桁目,10桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(8, 9), random.substring(9, 10)));
		// (2)乱数の1桁目,10桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(0, 1), random.substring(9, 10)));
		// (3)乱数の3桁目,4桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(2, 3), random.substring(3, 4)));
		// (4)乱数の9桁目を設定する
		pwd.append(random.substring(8, 9));
		// (5)乱数の8桁目を設定する
		pwd.append(random.substring(7, 8));
		// (6)乱数の5桁目,6桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(4, 5), random.substring(5, 6)));
		// (7)乱数の2桁目,4桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(1, 2), random.substring(3, 4)));
		// (8)乱数の7桁目,8桁目を元に変換表Ｂ変換処理を呼び出す
		pwd.append(toAlphabetB(random.substring(6, 7), random.substring(7, 8)));
		
		return pwd.toString();
	}

	/**
	 * <p>
	 * 変換表Ｂを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetB(String str1, String str2)
	{
		// 変換表Ｂを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_B);
	}

	/**
	 * <p>
	 * 他システム連携サービス契約コード通番の編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param オプションサービス契約番号
	 * @return 編集された他システム連携サービス契約コード通番
	 */
	public Object getTsyrnSvkeiCdSeq(CAANMsg inCBSMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inCBSMsg))
		{
			return null;
		}

		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		int maxTsyrnSvkeiCdSeq = 1;

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		CAANMsg curMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());
		curMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		curMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
		CAANMsg retCurMsg = new JKKejbKK0351DBABase().findByCurrent(curMsgKK0351);
		try
		{
			if(!OP_SVC_CD_EMAIL.equals(retCurMsg.getString(KK0351ETMsg.OP_SVC_CD)))
			{
				CAANMsg curMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
				curMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				curMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, retCurMsg.getString(KK0351ETMsg.GENE_ADD_DTM));
				CAANMsg retCurMsg2 = new JKKejbKK0361DBABase().findByPrimaryKey(curMsgKK0361);
				String tsyrnSvkeiCdSeq = retCurMsg2.getString(KK0361ETMsg.TSYRN_SVKEI_CD_SEQ);

				return tsyrnSvkeiCdSeq;
			}
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0361ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("    MAX(KK0361.TSYRN_SVKEI_CD_SEQ) AS TSYRN_SVKEI_CD_SEQ")
					.append(" FROM  KK_T_OPSVKEI_ISP KK0361 ")
					.append(" WHERE  ")
					.append("       KK0361.TSYRN_SVKEI_CD_SEQ IS NOT NULL ")
					.append("       AND EXISTS ( ")
					.append("             SELECT 1 ")
					.append("             FROM   KK_T_OP_SVC_KEI KK0351 ")
					.append("             INNER JOIN  KK_T_OP_SVC_KEI KK0351_01 ")
					.append("                ON KK0351_01.SVC_KEI_NO = KK0351.SVC_KEI_NO ")
					.append("             WHERE ")
					.append("               KK0351.OP_SVC_KEI_NO = KK0361.OP_SVC_KEI_NO ")
					.append("               AND  KK0351.GENE_ADD_DTM = KK0361.GENE_ADD_DTM ")
					.append("               AND  KK0351.OP_SVC_CD = 'B001' ")
					.append("               AND  KK0351_01.OP_SVC_KEI_NO = ? ")
					.append(" 			    AND (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ")
					.append("			        (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) ")
					.append("			         FROM   KK_T_OP_SVC_KEI KK0351_GENE ")
					.append("				     WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ")
					.append("				     AND    KK0351_GENE.RSV_APLY_YMD <= ? ")
					.append("				     AND    KK0351_GENE.RSV_APLY_CD = '2' ")
					.append("				     AND    KK0351_GENE.MK_FLG = '0' ")
					.append("				     GROUP BY KK0351_GENE.OP_SVC_KEI_NO ")
					.append("			        ) ")
					.append(" 			    AND (KK0351_01.OP_SVC_KEI_NO, KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) = ")
					.append("			        (SELECT KK0351_01_GENE.OP_SVC_KEI_NO, MAX(KK0351_01_GENE.RSV_APLY_YMD || KK0351_01_GENE.GENE_ADD_DTM) ")
					.append("			         FROM   KK_T_OP_SVC_KEI KK0351_01_GENE ")
					.append("				     WHERE  KK0351_01_GENE.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ")
					.append("				     AND    KK0351_01_GENE.RSV_APLY_YMD <= ? ")
					.append("				     AND    KK0351_01_GENE.RSV_APLY_CD = '2' ")
					.append("				     AND    KK0351_01_GENE.MK_FLG = '0' ")
					.append("				     GROUP BY KK0351_01_GENE.OP_SVC_KEI_NO ")
					.append("			        ) ")
					.append("  	    ) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(オプションサービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, opSvcKeiNo);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inCBSMsg));
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inCBSMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 最大の他システム連携サービス契約コード通番を取得する
			if (rsltQuery.next())
			{
				maxTsyrnSvkeiCdSeq = rsltQuery.getInt("TSYRN_SVKEI_CD_SEQ") + 1;
			}

			return String.valueOf(maxTsyrnSvkeiCdSeq);
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

// ANK-3149-00-00 ADD START
	/**
	 * <p>
	 * マカフィー会員IDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return マカフィー会員ID
	 */
	public Object getMcafeeMemberId(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current((String)opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		
		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary((String)opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		
		String mcfMbrId = kk0361Msg.getString(KK0361ETMsg.MCAFEE_MEMBER_ID);
		
		if (mcfMbrId != null) {
			
			// 採番されたIDを保持しておく（マカフィー用認証メールアドレスの採番時に使用するため）
			JSYejbSucceedDataAccess.setSucceedData(KEY_MCAFEE_MEMBER_ID, mcfMbrId);
			
			// マカフィー会員IDを返却する。
			return mcfMbrId;
		}
		
		// 採番処理
		// Oracleシーケンス取得
		String seq = JCCModelCommon.getFormatedNextSeq(SEQ_MCAFEE_MEMBER_ID, PREFIX_MCAFEE_MEMBER_ID, SEQ_MCAFEE_MEMBER_ID_LENGTH);
		
		// 採番されたIDを保持しておく（マカフィー用認証メールアドレスの採番時に使用するため）
		JSYejbSucceedDataAccess.setSucceedData(KEY_MCAFEE_MEMBER_ID, seq);
		
		return seq;
	}
	
	/**
	 * <p>
	 * マカフィー用認証メールアドレスの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return マカフィー用認証メールアドレス
	 */
	public Object getMcafeeNinshoMlad(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current((String)opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		
		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary((String)opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		
		String mcfNinMlad = kk0361Msg.getString(KK0361ETMsg.MCAFEE_NINSHO_MLAD);
		
		if (mcfNinMlad != null) {
			
			// マカフィー用認証メールアドレスを返却する。
			return mcfNinMlad;
		}
		
		// 採番処理
		StringBuffer mlad = new StringBuffer();

		// マカフィー会員ID + "@" + ドメイン名
		mlad.append((String)JSYejbSucceedDataAccess.getSucceedData(KEY_MCAFEE_MEMBER_ID));
		mlad.append(ANNOTATION);
		mlad.append(getMcfDomain());
		
		return mlad.toString();
		
	}
	
	
	/**
	 * <p>
	 * マカフィー用認証パスワードの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return マカフィー用認証パスワード
	 */
	public Object getMcafeeNinshoPwd(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current((String)opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		
		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary((String)opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		
		String mcfNinPwd = kk0361Msg.getString(KK0361ETMsg.MCAFEE_NINSHO_PWD);
		
		if (mcfNinPwd != null) {
			
			// マカフィー用認証パスワードを返却する。
			return mcfNinPwd;
		}
		
		// 採番処理
		// Oracleシーケンス取得
		Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_MCAFEE_NINSHO_PWD, PREFIX_MCAFEE_NINSHO_PWD, SEQ_MCAFEE_NINSHO_PWD_LENGTH));
		
		// シード値を使用して乱数を発生
		String random = getRandomNumberSeed(RANDOM_LENGTH_FMTCEL_NINSHO_ID, seq);
		
		// 変換処理
		StringBuffer pwd = new StringBuffer();
		
		// (1)乱数の9桁目,10桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabetLower(random.substring(8, 9), random.substring(9, 10)));
		// (2)乱数の1桁目,10桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(0, 1), random.substring(9, 10)));
		// (3)乱数の3桁目,4桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabetLower(random.substring(2, 3), random.substring(3, 4)));
		// (4)乱数の9桁目を設定する
		pwd.append(random.substring(8, 9));
		// (5)乱数の8桁目を設定する
		pwd.append(random.substring(7, 8));
		// (6)乱数の5桁目,6桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabetLower(random.substring(4, 5), random.substring(5, 6)));
		// (7)乱数の2桁目,4桁目の加算値の下1桁目を設定する
		pwd.append(toNumLastDigit(random.substring(1, 2), random.substring(3, 4)));
		// (8)乱数の7桁目,8桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabetLower(random.substring(6, 7), random.substring(7, 8)));
		// (9)乱数の5桁目を設定する
		pwd.append(random.substring(4, 5));
		// (10)乱数の1桁目,2桁目を元に英小文字変換処理を呼び出す
		pwd.append(toAlphabetLower(random.substring(0, 1), random.substring(1, 2)));
		
		return pwd.toString();
	}
	
	
	/**
	 * <p>
	 * BBSS会員IDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return BBSS会員ID
	 */
	public Object getBbssMemberId(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcKeiNo)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// 対象の「オプションサービス契約」カレントレコードを取得する。
		CAANMsg kk0351Msg = new JKKejbKK0351DBABase().getKK0351Current((String)opSvcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		
		// 対象の「オプションサービス契約<ISP>」を取得する。
		CAANMsg kk0361Msg = new JKKejbKK0361DBABase().getKK0361Primary((String)opSvcKeiNo, kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		
		String BbsMbrId = kk0361Msg.getString(KK0361ETMsg.BBSS_MEMBER_ID);
		
		if (BbsMbrId != null) {
			
			// BBSS会員IDを返却する。
			return BbsMbrId;
		}
		
		// 採番処理
		return JCCModelCommon.getFormatedNextSeq(SEQ_BBSS_MEMBER_ID, PREFIX_BBSS_MEMBER_ID, SEQ_BBSS_MEMBER_ID_LENGTH);
	}
// ANK-3149-00-00 ADD END
	
	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;
		
	}
	//ANK-3484-00-00 ADD START
	/**
	 * <p>
	 * 端末補償契約番号の採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcCd オプションサービスコード
	 * @return マカフィー会員ID
	 */
	public String getTmcpKeiNo(CAANMsg inMsg, AgentDispatchContext inContext, Object opSvcCd)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		// オプションサービスコードが"PCプラン"または"TVプラン"以外の場合
		if (!(JKKModelConst.OP_SVC_CD_B133.equals(opSvcCd) || JKKModelConst.OP_SVC_CD_B134.equals(opSvcCd)))
		{
			return null;
		}
		
		String tmcpKeiNo = inMsg.getString(EKK0361D010CBSMsg.TMCP_KEI_NO);
		
		//端末補償契約番号が存在する場合
		if (tmcpKeiNo != null) {
			
			// 端末補償契約番号を返却する。
			return tmcpKeiNo;
		}
		
		// 採番処理
		return (String)JCCModelCommon.getFormatedNextSeq(SEQ_TMCP_KEI_NO, PREFIX_TMCP_KEI_NO, SEQ_TMCP_KEI_NO_LENGTH);
	}
	//ANK-3484-00-00 ADD END
}
