/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0171NumberParts
*	ソースファイル名：JKKejbKK0171NumberParts.java
*	作成者			：富士通
*	日付			：2011年05月12日
*＜機能概要＞
*	サービス契約<eo光ネット>採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/12	富士通		新規作成
*   v4.00.00    2013/05/07  FJ)竹内     IT1-2013-0001173
*   v5.00.00    2013/08/30  FJ)寺園     OM-2013-0001307
*   v6.00.00    2013/11/29  FJ)大山     IT2-2013-0000811
*   v10.00.00   2014/09/02  FJ)乾       ANK-2237-00-00
*   v10.00.01   2014/09/12  FJ)乾       ANK-2237-00-00
*	v23.00.00	2015/12/17	FJ)笠川		ANK-2612-00-00
*	v26.00.00	2016/06/29	FJ)栗秋		ANK-2765-00-00
*	v40.00.00	2018/10/18	FJ)田原		ANK-3412-00-00
**********************************************************************/

package eo.ejb.common.edit;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbSucceedDataAccess;
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.KK1681ETMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0171DBABase;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;

/**
 * <p>
 * サービス契約<eo光ネット>採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0171NumberParts extends JKKejbNumberPartsBase
{
	/** サービス契約<eo光ネット>シーケンス名（ISP認証ID） */
	public static final String SEQ_ISP_NINSHO_ID = "SEQ_ISP_NINSHO_ID";

	/** サービス契約<eo光ネット>シーケンス名（ISP認証IDパスワード） */
	public static final String SEQ_ISP_NINSHO_ID_PWD = "SEQ_ISP_NINSHO_ID_PWD";

	/** 桁数(ISP認証ID) */
	public static final int SEQ_ISP_NINSHO_ID_LENGTH = 8;

	/** 桁数(ISP認証IDパスワード) */
	public static final int SEQ_ISP_NINSHO_ID_PWD_LENGTH = 10;

	/** 乱数(ISP認証PASS) */
	public static final int RANDOM_LENGTH = 10;

	/** 乱数(ISP認証PASS.eoADSL) */
	public static final int RANDOM_LENGTH_ADSL = 8;

	/** 接頭語(N) */
	public static final String PREFIX_N = "N";

	/** 接頭語(A) */
	public static final String PREFIX_A = "A";

	/** 接頭語(SP) */
//	ANK-2237-00-00 MOD START
//	public static final String PREFIX_S = "S";
	public static final String PREFIX_SP = "SP";
//	ANK-2237-00-00 MOD END

	/** 引継ぎデータアクセスキー（ISP認証IDパスワード） */
	private static final String ISP_NINSYO_PWD = "ISPNINSHOIDPWD";

	/** 変換表Ａ */
	private static final HashMap<String, String> CHANGE_LIST_A = new HashMap<String, String>();
	
	/** 料金コースコード(２００Ｍコース) */
	public static final String PCRS_CD_200M = "A07";
	
	/** 料金コースコード(メゾンタイプ２００Ｍ) */
	public static final String PCRS_CD_MEZONTYPE_200M = "A11";
	
	/** 料金コースコード(１ギガコース) */
	public static final String PCRS_CD_1G = "A05";
	
	// 20151217 ANK-2612-00-00 Add Start
	/** 料金コースコード(１０ギガコース) */
	public static final String PCRS_CD_10G = "A83";
	// 20151217 ANK-2612-00-00 Add End

	/** 料金コースコード(メゾンタイプ１ギガ) */
	public static final String PCRS_CD_MEZONTYPE_1G = "A10";
	
	// 20151217 ANK-2612-00-00 Add Start
	/** 料金コースコード(メゾンタイプ１０ギガ) */
	public static final String PCRS_CD_MEZONTYPE_10G = "A84";
	// 20151217 ANK-2612-00-00 Add End
	
	/** 料金コースコード(マンションタイプグローバル１００ＭＶＤＳＬ２) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_VDSL2 = "A50";
	
	/** 料金コースコード(マンションタイプグローバル１００ＭＶＤＳＬ３) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_VDSL3 = "A51";
	
	/** 料金コースコード(マンションタイプグローバル１００ＭＶＤＳＬ４) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_VDSL4 = "A52";
	
	/** 料金コースコード(マンションタイプグローバル１００ＭＶＤＳＬ５) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_VDSL5 = "A53";
	
	/** 料金コースコード(マンションタイプグローバル１００Ｍイーサネット) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_ETH = "A54";
	
	/** 料金コースコード(マンションタイプグローバル１ギガイーサネット) */
	public static final String PCRS_CD_MANSIONTYPE_GL_1G_ETH = "A55";
	
	/** 料金コースコード(マンションタイプ　光配線１ギガ) */
	public static final String PCRS_CD_MANSIONTYPE_HIKARI_1G = "A57";
	
	/** 料金コースコード(マンションタイプグローバル１００ＭＶＤＳＬ６) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_VDSL6 = "A69";
	
	/** 料金コースコード(マンションタイプグローバル１００Ｍイーサネット２) */
	public static final String PCRS_CD_MANSTYPE_GL_100M_ETH2 = "A70";
	
	/** 住所変更異動詳細コード(コース変更) */
	public static final String ADCHG_IDO_DTL_CD_COURSECHG = "003";
	
	/** アットマーク */
	private static final String ATSIGN = "@";
	
	// ANK-2765-00-00 DEL START
//	/** アットマークHFA */
//	private static final String ATSIGN_HFA = "@HFA";
//	
//	/** アットマークHF1G */
//	private static final String ATSIGN_HF1G = "@HF1G";
	// ANK-2765-00-00 DEL END
	
	// 20151217 ANK-2612-00-00 Add Start
	/** アットマークHF10G */
	private static final String ATSIGN_HF10G = "@HF10G";
	// 20151217 ANK-2612-00-00 Add End

	// ANK-2765-00-00 DEL START
//	/** アットマークMF1 */
//	private static final String ATSIGN_MF1 = "@MF1";
	// ANK-2765-00-00 DEL END

	static
	{
		// 変換配列設定
		CHANGE_LIST_A.put("0", "KMNPQRSTUV");
		CHANGE_LIST_A.put("1", "PQRSTUVWXY");
		CHANGE_LIST_A.put("2", "TUVWXYZABC");
		CHANGE_LIST_A.put("3", "IJKMNPQRST");
		CHANGE_LIST_A.put("4", "CDEFGHIJKM");
		CHANGE_LIST_A.put("5", "MNPQRSTUVW");
		CHANGE_LIST_A.put("6", "ABCDEFGHIJ");
		CHANGE_LIST_A.put("7", "STUVWXYZAB");
		CHANGE_LIST_A.put("8", "HIJKMNPQRS");
		CHANGE_LIST_A.put("9", "NPQRSTUVWX");
	}

	/** 変換表Ｂ */
	private static final HashMap<String, String> CHANGE_LIST_B = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_B.put("0", "PQRSTUVWXY");
		CHANGE_LIST_B.put("1", "TUVWXYZABC");
		CHANGE_LIST_B.put("2", "IJKMNPQRST");
		CHANGE_LIST_B.put("3", "CDEFGHIJKM");
		CHANGE_LIST_B.put("4", "MNPQRSTUVW");
		CHANGE_LIST_B.put("5", "ABCDEFGHIJ");
		CHANGE_LIST_B.put("6", "STUVWXYZAB");
		CHANGE_LIST_B.put("7", "HIJKMNPQRS");
		CHANGE_LIST_B.put("8", "NPQRSTUVWX");
		CHANGE_LIST_B.put("9", "KMNPQRSTUV");
	}

	/** 変換表Ｃ */
	private static final HashMap<String, String> CHANGE_LIST_C = new HashMap<String, String>();

	static
	{
		// 変換配列設定
		CHANGE_LIST_C.put("0", "kmnpqrstuv");
		CHANGE_LIST_C.put("1", "pqrstuvwxy");
		CHANGE_LIST_C.put("2", "tuvwxyzabc");
		CHANGE_LIST_C.put("3", "ijkmnpqrst");
		CHANGE_LIST_C.put("4", "cdefghijkm");
		CHANGE_LIST_C.put("5", "mnpqrstuvw");
		CHANGE_LIST_C.put("6", "abcdefghij");
		CHANGE_LIST_C.put("7", "stuvwxyzab");
		CHANGE_LIST_C.put("8", "hijkmnpqrs");
		CHANGE_LIST_C.put("9", "npqrstuvwx");
	}

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0171NumberParts()
	{
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証ID採番処理を行います（コンシューマ用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証ID
	 */
	public Object getIspNinshoId(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		value = JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID , PREFIX_N , SEQ_ISP_NINSHO_ID_LENGTH); 

		// 変換処理
		StringBuffer buffer = new StringBuffer();

		// (1)シーケンスの1桁目を設定する
		buffer.append(value.substring(0, 1));
		// (2)シーケンスの2桁目,3桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(2, 3), value.substring(3, 4)));
		// (3)シーケンスの6桁目,7桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(6, 7), value.substring(7, 8)));
		// (4)シーケンスの5桁目を設定する
		buffer.append(value.substring(5, 6));
		// (5)シーケンスの6桁目を設定する
		buffer.append(value.substring(6, 7));
		// (6)シーケンスの1桁目,2桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(1, 2), value.substring(2, 3)));
		// (7)シーケンスの3桁目,4桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(3, 4), value.substring(4, 5)));
		// (8)シーケンスの7桁目を設定する
		buffer.append(value.substring(7, 8));
		// (9)シーケンスの8桁目を設定する
		buffer.append(value.substring(8, 9));
		// (10)設定された値からチェックデジットを算出して設定する
		buffer.append(getCheckDigit21(buffer.toString()));

		String ispNinshoId = buffer.toString();

		return ispNinshoId;
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証ID編集処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inSvcKeiUcwkNo サービス契約内訳番号
	 * @param inIdoDiv 異動区分
	 * @param inAdchgIdoDtlCd 住所変更異動詳細コード
	 * @return 編集されたサービス契約<eo光ネット>のISP認証ID
	 */
	public Object getIspNinshoIdEdit(CAANMsg inMsg, AgentDispatchContext inContext, String inSvcKeiUcwkNo, String inIdoDiv, String inAdchgIdoDtlCd)
	{
		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		String value = null;
		String svcKeiNo = null;
		
		// 対象のサービス内訳契約番号でカレント検索を行う
		CAANMsg ret0161 = new JKKejbKK0161DBABase().getKK0161Current(inSvcKeiUcwkNo, JKKModelCommon.getOpeDate(inMsg));
		
		svcKeiNo = ret0161.getString(KK0161ETMsg.SVC_KEI_NO);
		
		// 異動区分が"コース変更"、または異動区分が"住所変更・登録"かつ住所変更異動詳細コードが"コース変更"の場合、旧ISP認証IDを取得する
		if (JKKModelConst.IDO_DIV_COURSE_CHG.equals(inIdoDiv)
				|| (JKKModelConst.IDO_DIV_ADCHG_ADD.equals(inIdoDiv) && ADCHG_IDO_DTL_CD_COURSECHG.equals(inAdchgIdoDtlCd)))
		{
			value = getOldIspNinshoId(inMsg, svcKeiNo, inSvcKeiUcwkNo);
			if (null == value)
			{
				return value;
			}
		}
		// 上記以外の場合、ISP認証IDを採番する
		else
		{
			value = new JKKejbKK0171NumberParts().getIspNinshoId(inMsg, inContext).toString();
		}
		
		String vrShikibetsu = getVrShikibetsu(inMsg, svcKeiNo);
		
		// VR識別が無い場合
		if (null == vrShikibetsu)
		{
			return value;
		}
		
		return value.concat(vrShikibetsu);
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証ID採番処理を行います（eoADSL用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証ID
	 */
	public Object getIspNinshoIdAdsl(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		value = JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID , PREFIX_A , SEQ_ISP_NINSHO_ID_LENGTH); 

		// 変換処理
		StringBuffer buffer = new StringBuffer();

		// (1)シーケンスの1桁目を設定する
		buffer.append(value.substring(0, 1));
		// (2)シーケンスの2桁目,3桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(2, 3), value.substring(3, 4)));
		// (3)シーケンスの6桁目,7桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(6, 7), value.substring(7, 8)));
		// (4)シーケンスの5桁目を設定する
		buffer.append(value.substring(5, 6));
		// (5)シーケンスの6桁目を設定する
		buffer.append(value.substring(6, 7));
		// (6)シーケンスの1桁目,2桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(1, 2), value.substring(2, 3)));
		// (7)シーケンスの3桁目,4桁目を元に変換表Ａ変換処理を呼び出す
		buffer.append(toAlphabetA(value.substring(3, 4), value.substring(4, 5)));
		// (8)シーケンスの7桁目を設定する
		buffer.append(value.substring(7, 8));
		// (9)シーケンスの8桁目を設定する
		buffer.append(value.substring(8, 9));
		// (10)設定された値からチェックデジットを算出して設定する
		buffer.append(getCheckDigit21(buffer.toString()));

		String ispNinshoId = buffer.toString();

		return ispNinshoId;
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証ID採番処理を行います（インターネットオフィス用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証ID
	 */
	public Object getIspNinshoIdNet(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 採番処理
		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
//		ANK-2237-00-00 MOD START
//		value = JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID , PREFIX_S , SEQ_ISP_NINSHO_ID_LENGTH); 
		value = JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID , PREFIX_SP , SEQ_ISP_NINSHO_ID_LENGTH);
//		ANK-2237-00-00 MOD END

		// 変換処理
		StringBuffer buffer = new StringBuffer();

//		ANK-2237-00-00 MOD START
//		// (1)シーケンスの1桁目を設定する
//		buffer.append(value.substring(0, 1));
//		// (2)シーケンスの2桁目,3桁目を元に変換表Ｂ変換処理を呼び出す
//		buffer.append(toAlphabetB(value.substring(2, 3), value.substring(3, 4)));
//		// (3)シーケンスの6桁目,7桁目を元に変換表Ｂ変換処理を呼び出す
//		buffer.append(toAlphabetB(value.substring(6, 7), value.substring(7, 8)));
//		// (4)シーケンスの5桁目を設定する
//		buffer.append(value.substring(5, 6));
//		// (5)シーケンスの6桁目を設定する
//		buffer.append(value.substring(6, 7));
//		// (6)シーケンスの1桁目,2桁目を元に変換表Ｂ変換処理を呼び出す
//		buffer.append(toAlphabetB(value.substring(1, 2), value.substring(2, 3)));
//		// (7)シーケンスの3桁目,4桁目を元に変換表Ｂ変換処理を呼び出す
//		buffer.append(toAlphabetB(value.substring(3, 4), value.substring(4, 5)));
//		// (8)シーケンスの7桁目を設定する
//		buffer.append(value.substring(7, 8));
//		// (9)シーケンスの8桁目を設定する
//		buffer.append(value.substring(8, 9));
//		// (10)設定された値からチェックデジットを算出して設定する
//		buffer.append(getCheckDigit21(buffer.toString()));
		// (1)シーケンスの1桁目を設定する
		buffer.append(value.substring(0, 1));
		// (2)シーケンスの2桁目を設定する
		buffer.append(value.substring(1, 2));
		// (3)シーケンスの4桁目,5桁目と8桁目,9桁目を変換表Ｂ変換処理を行い英字２文字を再度英字に変換
		buffer.append(changeNumIntoAlphabet(changeAlphabetIntoNum(toAlphabetB(value.substring(3, 4), value.substring(4, 5)))
						+ changeAlphabetIntoNum(toAlphabetB(value.substring(7, 8), value.substring(8, 9)))));
		// (4)シーケンスの7桁目を設定する
		buffer.append(value.substring(6, 7));
		// (5)シーケンスの8桁目を設定する
		buffer.append(value.substring(7, 8));
		// (6)シーケンスの3桁目,4桁目を元に変換表Ｂ変換処理を呼び出す
		buffer.append(toAlphabetB(value.substring(2, 3), value.substring(3, 4)));
		// (7)シーケンスの5桁目,6桁目を元に変換表Ｂ変換処理を呼び出す
		buffer.append(toAlphabetB(value.substring(4, 5), value.substring(5, 6)));
		// (8)シーケンスの9桁目を設定する
		buffer.append(value.substring(8, 9));
		// (9)シーケンスの10桁目を設定する
		buffer.append(value.substring(9, 10));
		// (10)設定された値からチェックデジットを算出して設定する
		buffer.append(getCheckDigit21(buffer.toString()));
//		ANK-2237-00-00 MOD END

		String ispNinshoId = buffer.toString();

		return ispNinshoId;
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証IDパスワードの採番処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証IDパスワード
	 */
	public Object getIspNinshoIdPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得
		value = (String)JSYejbSucceedDataAccess.getSucceedData(ISP_NINSYO_PWD);

		// 取得結果がnullの場合、パスワードを生成
		if (value == null)
		{
			// モデル共通アクセッサー部品・Oracleシーケンス取得処理
			Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID_PWD, "", SEQ_ISP_NINSHO_ID_PWD_LENGTH));

			// シード値を使用して乱数を発生
			String random = getRandomNumberSeed(RANDOM_LENGTH, seq);

			// 変換処理
			StringBuffer pwd = new StringBuffer();

			// (1)乱数の9桁目,10桁目を元に変換表Ｃ変換処理を呼び出す
			pwd.append(toAlphabetC(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(toAlphabetC(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(toAlphabetC(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(toAlphabetC(random.substring(6, 7), random.substring(7, 8)));

			value = pwd.toString();

			// 引継データの設定
			JSYejbSucceedDataAccess.setSucceedData(ISP_NINSYO_PWD, value);
		}

		// 結果を返却
		return value;
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証IDパスワードの採番処理を行います（コンシューマ用、インターネットオフィス用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証IDパスワード
	 */
	public Object getIspNinshoIdPwdCons(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID_PWD, "", SEQ_ISP_NINSHO_ID_PWD_LENGTH));

		// シード値を使用して乱数を発生
		String random = getRandomNumberSeed(RANDOM_LENGTH, seq);

		// 変換処理
		StringBuffer pwd = new StringBuffer();

		// (1)乱数の9桁目,10桁目を元に変換表Ｃ変換処理を呼び出す
		pwd.append(toAlphabetC(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(toAlphabetC(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(toAlphabetC(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(toAlphabetC(random.substring(6, 7), random.substring(7, 8)));

		value = pwd.toString();

		// 結果を返却
		return value;
	}

	/**
	 * <p>
	 * サービス契約内訳<eo光ネット>-ISP認証IDパスワードの採番処理を行います（eoADSL用）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番されたサービス契約<eo光ネット>のISP認証IDパスワード
	 */
	public Object getIspNinshoIdPwdAdsl(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String value = null;

		// 機能コードのチェック（チェックモードの場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// モデル共通アクセッサー部品・Oracleシーケンス取得処理
		Long seq = Long.parseLong(JCCModelCommon.getFormatedNextSeq(SEQ_ISP_NINSHO_ID_PWD, "", SEQ_ISP_NINSHO_ID_PWD_LENGTH));

		// シード値を使用して乱数を発生
		String random = getRandomNumberSeed(RANDOM_LENGTH_ADSL, seq);

		// 変換処理
		StringBuffer pwd = new StringBuffer();

		// (1)乱数の7桁目,8桁目を元に変換表Ｃ変換処理を呼び出す
		pwd.append(toAlphabetC(random.substring(6, 7), random.substring(7, 8)));
		// (2)乱数の8桁目を設定する
		pwd.append(random.substring(7, 8));
		// (3)乱数の1桁目,2桁目を元に変換表Ｃ変換処理を呼び出す
		pwd.append(toAlphabetC(random.substring(0, 1), random.substring(1, 2)));
		// (4)乱数の7桁目を設定する
		pwd.append(random.substring(6, 7));
		// (5)乱数の6桁目を設定する
		pwd.append(random.substring(5, 6));
		// (6)乱数の3桁目,4桁目を元に変換表Ｃ変換処理を呼び出す
		pwd.append(toAlphabetC(random.substring(2, 3), random.substring(3, 4)));
		// (7)乱数の2桁目を設定する
		pwd.append(random.substring(1, 2));
		// (8)乱数の5桁目,6桁目を元に変換表Ｃ変換処理を呼び出す
		pwd.append(toAlphabetC(random.substring(4, 5), random.substring(5, 6)));

		value = pwd.toString();

		// 結果を返却
		return value;
	}

	/**
	 * <p>
	 * 変換表Ａを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetA(String str1, String str2)
	{
		// 変換表Ａを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_A);
	}

	/**
	 * <p>
	 * 変換表Ｂを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetB(String str1, String str2)
	{
		// 変換表Ｂを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_B);
	}

	/**
	 * <p>
	 * 変換表Ｃを使用して英字変換を行います。
	 * </p>
	 * @param str1 変換元データの１桁目
	 * @param str2 変換元データの２桁目
	 * @return 変換した英字。
	 */
	private String toAlphabetC(String str1, String str2)
	{
		// 変換表Ｃを使用して英字変換を行う
		return toAlphabetTarget(str1, str2, CHANGE_LIST_C);
	}

	/**
	 * <p>
	 * VR識別を取得する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return VR識別
	 */
	private String getVrShikibetsu(CAANMsg inCBSMsg, String svcKeiNo)
	{
		// 判定用料金コースコード保持用
		String jdgPcrsCd = null;

		// 異動予約に予約が存在するかを判定
		// 予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvAdChgSvcKeiNo(svcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));

		// 異動予約詳細コードが"コース変更"、
		// 異動区分が"コース変更"の予約に設定されている、新料金コースコードを判定対象とする
		for (CAANMsg msgKK1681 : retList)
		{
			// 異動予約詳細コードが"コース変更"以外の場合は次のリストへ
			if (!JKKModelConst.IDO_RSV_DTL_CD_COURSECHG.equals(msgKK1681.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
			{
				continue;
			}

			// 異動区分が"コース変更"以外の場合は次のリストへ
			if (!JKKModelConst.IDO_DIV_COURSE_CHG.equals(msgKK1681.getString(KK1681ETMsg.IDO_DIV))
					&& !JKKModelConst.IDO_DIV_ADCHG_ADD.equals(msgKK1681.getString(KK1681ETMsg.IDO_DIV)))
			{
				continue;
			}

			// 新料金コースコードを取得してループ終了
			jdgPcrsCd = msgKK1681.getString(KK1681ETMsg.NEW_PCRS_CD);
			break;
		}

		// 異動予約に該当の予約が存在しない場合、サービス契約のカレントレコードの料金コースコードを判定対象とする
		if (null == jdgPcrsCd) 
		{
			// カレントレコードの検索
			CAANMsg ret0081 = getCurrentKK0081(inCBSMsg, svcKeiNo);

			// サービス契約が存在しない場合
			if (null == ret0081)
			{
				return null;
			}

			// 料金コースコードの取得
			jdgPcrsCd = ret0081.getString(KK0081ETMsg.PCRS_CD);
		}
		// ANK-2765-00-00 MOD START
//		// 料金コースコードが"２００Ｍコース","メゾンタイプ２００Ｍ"の場合
//		if (PCRS_CD_200M.equals(jdgPcrsCd)
//			|| PCRS_CD_MEZONTYPE_200M.equals(jdgPcrsCd))
//		{
//			return ATSIGN_HFA;
//		}
//		// 料金コースコードが"１ギガコース","メゾンタイプ１ギガ","マンションタイプ　光配線１ギガ"の場合
//		else if (PCRS_CD_1G.equals(jdgPcrsCd)
//			|| PCRS_CD_MEZONTYPE_1G.equals(jdgPcrsCd)
//			|| PCRS_CD_MANSIONTYPE_HIKARI_1G.equals(jdgPcrsCd))
//		{
//			return ATSIGN_HF1G;
//		}
//		// 20151217 ANK-2612-00-00 Add Start
//		// 料金コースコードが"１０ギガコース","メゾンタイプ１０ギガ"の場合
//		else if (PCRS_CD_10G.equals(jdgPcrsCd)
//			|| PCRS_CD_MEZONTYPE_10G.equals(jdgPcrsCd))
//		{
//			return ATSIGN_HF10G;
//		}
//		// 20151217 ANK-2612-00-00 Add End
//		// 料金コースコードが"マンションタイプグローバル１ギガイーサネット","マンションタイプグローバル１００ＭＶＤＳＬ２"
//		// ,"マンションタイプグローバル１００ＭＶＤＳＬ３"の場合
//		else if (PCRS_CD_MANSIONTYPE_GL_1G_ETH.equals(jdgPcrsCd)
//			|| PCRS_CD_MANSTYPE_GL_100M_VDSL2.equals(jdgPcrsCd)
//			|| PCRS_CD_MANSTYPE_GL_100M_VDSL3.equals(jdgPcrsCd))
//		{
//			return ATSIGN_MF1;
//		}
//		//"マンションタイプグローバル１００ＭＶＤＳＬ４","マンションタイプグローバル１００ＭＶＤＳＬ５"
//		//,"マンションタイプグローバル１００Ｍイーサネット",
//		//,"マンションタイプグローバル１００ＭＶＤＳＬ６"(A69),"マンションタイプグローバル１００Ｍイーサネット２"(A70)の場合
//		else if (PCRS_CD_MANSTYPE_GL_100M_VDSL4.equals(jdgPcrsCd)
//				|| PCRS_CD_MANSTYPE_GL_100M_VDSL5.equals(jdgPcrsCd)
//				|| PCRS_CD_MANSTYPE_GL_100M_ETH.equals(jdgPcrsCd)
//				|| PCRS_CD_MANSTYPE_GL_100M_VDSL6.equals(jdgPcrsCd)
//				|| PCRS_CD_MANSTYPE_GL_100M_ETH2.equals(jdgPcrsCd))
//		{
//			return ATSIGN_MF1;
//		}
		
		// ANK-3412-00-00 DEL START 認証ＩＤにＶＲ識別は付けない
		// 料金コースコードが"１０ギガコース","メゾンタイプ１０ギガ"の場合
//		if (PCRS_CD_10G.equals(jdgPcrsCd)
//				|| PCRS_CD_MEZONTYPE_10G.equals(jdgPcrsCd))
//		{
//				return ATSIGN_HF10G;
//		}
		// ANK-2765-00-00 MOD END
		// ANK-3412-00-00 DEL END

		return null;
	}

	/**
	 * <p>
	 * 旧ISP認証IDを取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo 処理対象の「サービス契約内訳」の親「サービス契約」のサービス契約番号
	 * @param svcKeiUcwkNo 処理対象の「サービス契約内訳」のサービス契約内訳番号
	 * @return 検索結果のレコード
	 */
	private String getOldIspNinshoId(CAANMsg inCBSMsg, String svcKeiNo, String svcKeiUcwkNo)
	{
		CAANMsg[] kk0161MsgList = new JKKejbKK0161DBABase().getKK0161bySvcKei(svcKeiNo, null, JKKModelCommon.getOpeDate(inCBSMsg));
		
		for (CAANMsg kk0161Msg : kk0161MsgList)
		{
			// 入力値のサービス契約内訳番号の「サービス契約内訳」は対象外
			if (svcKeiUcwkNo.equals(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO)))
			{
				continue;
			}
			
			// サービス契約内訳ステータスが"照査済"、"締結済"、"サービス提供中"の場合
			String svcKeiUcwkStat = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT);
			if (JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(svcKeiUcwkStat)
					|| JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(svcKeiUcwkStat)
					|| JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(svcKeiUcwkStat)
					|| JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(svcKeiUcwkStat)
					|| JKKModelConst.SVC_KEI_STAT_STP_CHU.equals(svcKeiUcwkStat))

					{
				CAANMsg ret0171 = new JKKejbKK0171DBABase().getKK0171Primary(
						kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO), kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM));
				
				// ISP認証IDが設定されていない場合
				if (null == ret0171.getString(KK0171ETMsg.ISP_NINSHO_ID))
				{
					return null;
				}
				
				String[] oldIspNinshoId = ret0171.getString(KK0171ETMsg.ISP_NINSHO_ID).split(ATSIGN);
				
				return oldIspNinshoId[0];
			}
		}
		return null;
	}

	/**
	 * <p>
	 * サービス契約のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0081(CAANMsg inCBSMsg, String svcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約のカレント検索を行う
		return new JKKejbKK0081DBABase().findByCurrent(inETMsg);
	}

//	ANK-2237-00-00 ADD START
	/**
	 * <p>
	 * 英字を数字に変換
	 * </p>
	 * @param alphabet 変換元の英字
	 * @return 変換後の数字
	 */
	private int changeAlphabetIntoNum(String alphabet){
		
		String[] str = new String[]{"A","B","C","D","E","F","G","H","I","J","K","M"
				                    ,"N","P","Q","R","S","T","U","V","W","X","Y","Z"};
		int i = 0;
		int retNum = 0;
		while(!alphabet.equals(str[i])){
			
			i++;
			retNum = i;
			
		}
		return retNum;
	}
	
	/**
	 * <p>
	 * 数字を英字に変換
	 * </p>
	 * @param num 変換元数字
	 * @return 変換後数字
	 */
	private String changeNumIntoAlphabet(int num){
		
		HashMap<String,String> map = new HashMap<String,String>();
		map.put("0", "A");
		map.put("1", "B");
		map.put("2", "C");
		map.put("3", "D");
		map.put("4", "E");
		map.put("5", "F");
		map.put("6", "G");
		map.put("7", "H");
		map.put("8", "I");
		map.put("9", "J");
		map.put("10", "K");
		map.put("11", "M");
		map.put("12", "N");
		map.put("13", "P");
		map.put("14", "Q");
		map.put("15", "R");
		map.put("16", "S");
		map.put("17", "T");
		map.put("18", "U");
		map.put("19", "V");
		map.put("20", "W");
		map.put("21", "X");
		map.put("22", "Y");
		map.put("23", "Z");
		
		int amari = num%24;
		
		String retAlphabet = map.get(String.valueOf(amari));
		
		return retAlphabet;
	}
//	ANK-2237-00-00 ADD END
}
