/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbKK0361SecProc
 *	ソースファイル名：JKKejbKK0361SecProc.java
 *	作成者			：EKek0017
 *	日付			：2011年03月14日
 *＜機能概要＞
 *	オプションサービス契約<ISP>に対する副次処理を行う部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *  v5.00.00    2013/08/01  FJ)寺本     OT-2013-0000697
 *  v5.00.01    2013/09/04  FJ)沖田     OM-2013-0001590
 *  v5.00.02    2013/09/20  FJ)寺本     OM-2013-0002318
 *  v5.00.03    2013/09/23  FJ)寺本     OM-2013-0002256
 * v23.00.00    2016/02/23  FJ)栗秋    【ANK-2350-00-00】【ＮＯ．１８２３】POPIDパスワード、WebIDパスワードの再振不正
 ********************************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0361ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0171C012CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0171C014CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C111CBSMsg;
//ANK-2350-00-00 2016/02/23 ADD START
import eo.ejb.cbs.cbsmsg.EKK0361C112CBSMsg;
//ANK-2350-00-00 2016/02/23 ADD END
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbBusinessException;

/**
* <p>
* オプションサービス契約<ISP>に対する副次処理を行う部品です。
* </p>
* @author 富士通
*/
public class JKKejbKK0361SecProc extends JKKejbKK0361DBABase
{
	/** 無効フラグ(有効) **/
	private static final String MK_FLG_YUKO = "0";

	/** 異動区分(新規登録) **/
	private static final String IDO_DEV_NEW = "00001";

	/** 予約適用コード(予約確定) **/
	private static final String RSV_APLY_CD_KAKUTEI = "2";

	/**
	 * <p>
	 * オプションサービス契約<ISP>の照査締結を行います。（新規申込かつ面開発以外かつ工事不要)
	 * </p>
	 * @param cbsMsg CBSメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @param shosaYmd 照査年月日
	 * @param idoDiv 異動区分
	 */
	public void opSvKeiShosaCnc(CAANMsg cbsMsg, String mskmDtlNo, String shosaYmd, String idoDiv)
	{
		// オプションサービス契約のETメッセージに以下の値を設定し、オプションサービス契約の一覧照会を行う。
		CAANMsg msgOp = new CAANMsg(KK0351ETMsg.class.getName());
		msgOp.set(KK0351ETMsg.MSKM_DTL_NO, mskmDtlNo);

		CAANMsg[] retOp = null;
		try
		{
			retOp = new KK0351LE().findByCondition(msgOp);
		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}

		// 申込明細番号に紐付く契約が存在しない場合は終了
		int listCnt = retOp.length;
		if (listCnt == 0)
		{
			return;
		}
		// 処理済みオプションサービス契約番号保持用
		HashMap<String, String> hash = new HashMap<String, String>();

		for (int j = 0; j < listCnt; j++)
		{
			
			if (hash.containsKey(retOp[j].getString(KK0351ETMsg.OP_SVC_KEI_NO)))
			{
				continue;
			}

			// 読み込んだオプションサービス契約番号を控える
			hash.put(retOp[j].getString(KK0351ETMsg.OP_SVC_KEI_NO), retOp[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));
			
			// オプションサービス契約のETメッセージに以下の値を設定し、オプションサービス契約のカレントレコードの照会を行う。
			CAANMsg msgOpCrt = new CAANMsg(KK0351ETMsg.class.getName());

			msgOpCrt.set(KK0351ETMsg.OP_SVC_KEI_NO, retOp[j].getString(KK0351ETMsg.OP_SVC_KEI_NO));
			msgOpCrt.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(cbsMsg));

			// 副次の判定を行う
			JKKejbKK0351DBABase kk0351 = new JKKejbKK0351DBABase();
			CAANMsg retKK0351 = kk0351.findByCurrent(msgOpCrt);

			// 異動区分の値が"00001"(新規登録)のでない場合は次のレコードへ
			if (!IDO_DEV_NEW.equals(retKK0351.getString(KK0351ETMsg.IDO_DIV)))
			{
				continue;
			}

			// オプションサービス契約<ISP>のETメッセージに以下の値を設定し、オプションサービス契約<ISP>のカレントレコードの照会を行う。
			CAANMsg msgOpIspCrt = new CAANMsg(KK0361ETMsg.class.getName());

			msgOpIspCrt.set(KK0361ETMsg.OP_SVC_KEI_NO, retOp[j].getString(KK0361ETMsg.OP_SVC_KEI_NO));

			CAANMsg crtKK0361 = findByCurrent(msgOpIspCrt);
			// カレントレコードが取得できたかつ、ステータスが受付済の場合照査締結を行う
			if (!(crtKK0361 == null))
			{
				new JKKejbKK0351SecProc().opSvKeiShosaCnc(cbsMsg, msgOpCrt, shosaYmd, idoDiv);

				// オプションサービス契約<ISP>照査締結処理を行う。
				crtKK0361.set(KK0361ETMsg.GENE_ADD_DTM, JKKModelCommon.getSysDateTimeStamp());
				crtKK0361.set(KK0361ETMsg.RSV_APLY_CD, RSV_APLY_CD_KAKUTEI);
				crtKK0361.set(KK0361ETMsg.ADD_DTM, cbsMsg.getString(EKK0021C060CBSMsg.OPERATEDATETIME));
				crtKK0361.set(KK0361ETMsg.ADD_OPEACNT, cbsMsg.getString(EKK0021C060CBSMsg.ADD_OPEACNT));
				crtKK0361.set(KK0361ETMsg.UPD_DTM, cbsMsg.getString(EKK0021C060CBSMsg.OPERATEDATETIME));
				crtKK0361.set(KK0361ETMsg.UPD_OPEACNT, cbsMsg.getString(EKK0021C060CBSMsg.UPD_OPEACNT));
				crtKK0361.setNull(KK0361ETMsg.DEL_DTM);
				crtKK0361.setNull(KK0361ETMsg.DEL_OPEACNT);
				crtKK0361.set(KK0361ETMsg.MK_FLG, MK_FLG_YUKO);

				try
				{
					create(crtKK0361);
				}
				catch (CAANCreateException e2)
				{
					throw new CAANRuntimeException(e2);
				}
			}
		}
	}

	/**
	 * <p>
	 * EKK0361C111_POPパスワード再振出　副次処理
	 * 入力のオプションサービス契約番号に紐付くサービス契約配下のオプションサービス契約の
	 * オプションサービスコードが"Eメール"の場合、オプションサービス契約＜ISP＞に持つ「初期POPIDパスワード」を更新する。
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void insPopIdPass(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 初期POPIDパスワードが未設定の場合は副次処理を実施しない
		// （POPIDパスワードが未設定という事は、オプションが"Eメール"ではないということ）
		if (inCBSMsg.isNull(EKK0361C111CBSMsg.SHK_POP_ID_PWD))
		{
			return;
		}

		// 入力のオプション契約番号を取得する
		String opSvcKeiNo = inCBSMsg.getString(EKK0361C111CBSMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();

		// オプションサービス契約カレント取得
		CAANMsg kk0351CurDate = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// 親サービス契約に紐付くオプションサービス契約を取得する
		CAANMsg[] kk0351InsList = kk0351dba.getKK0351bySvcKei(kk0351CurDate.getString(KK0351ETMsg.SVC_KEI_NO), null, opeDate, "3");
		// 受付済、解約済、キャンセル済を除外する
		// ANK-2350-00-00 2016/02/23 DEL START
		//kk0351InsList = kk0351dba.getKK0351OutUkDsLCl(kk0351InsList);
		// ANK-2350-00-00 2016/02/23 DEL END

		ArrayList<String> execList = new ArrayList<String>();
		execList.add(opSvcKeiNo);	// 自分自身は省く

		// オプションサービス契約番号が取得できた分繰り返し
		for (CAANMsg kk0351info : kk0351InsList)
		{
			// オプションサービス契約番号を取得する
			String optSvcKeiNo = kk0351info.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			String optSvcCd = kk0351info.getString(KK0351ETMsg.OP_SVC_CD);

			// 一度更新されているオプションサービス契約は振舞わない
			if (execList.contains(optSvcKeiNo))
			{
				continue;
			}

			// 対象のオプションサービス契約が"Eメール"ではない場合
			if (!JKKModelConst.OP_SVC_CD_EMAIL.equals(optSvcCd))
			{
				continue;
			}

			// 更新対象のオプションサービス契約を保持する
			execList.add(optSvcKeiNo);

			// オプションサービス契約＜ISP＞更新
			this.updKK0361PopIdPassword(kk0351info, inCBSMsg);

			// オプションサービス契約更新
			this.updKK0351PopIdPassword(kk0351info, inCBSMsg);
		}
	}

	/**
	 * <p>
	 * 入力のサービス契約内訳番号に紐付くサービス契約内訳配下のオプションサービス契約の
	 * オプションサービスコードが"固定グローバルIPアドレス"、"マルチセッション"の場合、
	 * オプションサービス契約＜ISP＞に持つ「マルチセッション用認証IDパスワード」、「マルチセッション用初期認証IDパスワード」を更新する。
	 * コース変更中の場合、元の内訳に紐付くオプションサービス契約＜ISP＞の「マルチセッション用認証IDパスワード」、
	 * 「マルチセッション用初期認証IDパスワード」も更新する。
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void multiSessionNinshoIdPwdRenm(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String svcKeiUcwkNo = inCBSMsg.getString(EKK0171C014CBSMsg.SVC_KEI_UCWK_NO); // サービス契約内訳番号
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg); // 運用日付

		// サービス契約内訳番号を検索keyに「サービス契約内訳」のカレントレコードを取得する
		CAANMsg kk0161Msg = new JKKejbKK0161DBABase().getKK0161Current(svcKeiUcwkNo, opeDate);

		// 該当の「サービス契約内訳」配下の「オプションサービス契約」を取得する。
		// ("固定グローバルIPアドレス"、"マルチセッション"はサービス契約内訳に紐付く)
		CAANMsg[] kk0351MsgList = new JKKejbKK0351DBABase().getKK0351bySvcKei(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO), null, opeDate, "2");

		boolean opSvcCdIP = false;
		boolean opSvcCdMltise = false;
		CAANMsg createKK0351Msg = null;
		String retSvcKeiUcwkNo = null;
		
		for (CAANMsg kk0351Msg : kk0351MsgList)
		{
			// サービス契約内訳番号が異なるタイミング(次のサービス契約内訳番号)でフラグを初期化
			if (!kk0351Msg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO).equals(retSvcKeiUcwkNo)) {
				retSvcKeiUcwkNo = kk0351Msg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO);
				opSvcCdIP = false;
				opSvcCdMltise = false;
			}

			// オプションサービス契約ステータスが"締結済"、"サービス提供中"以外の場合は対象外
			if (!JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT))
					&& !JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT)))
			{
				continue;
			}
			
			if (JKKModelConst.OP_SVC_CD_KOTEI_GLOBAL_IPAD.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD))) {
				opSvcCdIP = true;
			}
			if (JKKModelConst.OP_SVC_CD_MLTISE.equals(kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD))) {
				opSvcCdMltise = true;
				// マルチセッションのレコードが更新対象のため、レコードを保持
				createKK0351Msg = kk0351Msg;
			}
			

			// オプションサービスコードが"固定グローバルIPアドレス"、"マルチセッション"ともに存在する場合に
			// オプションサービス契約、オプションサービス契約<ISP>に振舞う
			if (opSvcCdIP && opSvcCdMltise) {
				String ninshoIdPwd = (String) JKKModelCommon.getIspNinshoIdPwdKK0171(inCBSMsg, inContext);
				upd0361MltseNinshoIdPwd(inCBSMsg, inContext, createKK0351Msg, ninshoIdPwd, ninshoIdPwd);
				upd0351MltseNinshoIdPwd(inCBSMsg, inContext, createKK0351Msg, svcKeiUcwkNo);
				// フラグ初期化
				opSvcCdIP = false;
				opSvcCdMltise = false;
				createKK0351Msg = null;
				
			}
		}
	}

	/**
	 * <p>
	 * EKK0171C014_ISP認証IDパスワード再振出　副次処理
	 * 入力のサービス契約内訳番号に紐付くサービス契約内訳配下のオプションサービス契約の
	 * オプションサービスコードが"固定グローバルIPアドレス"、"マルチセッション"の場合、
	 * オプションサービス契約＜ISP＞に持つ「マルチセッション用認証IDパスワード」、「マルチセッション用初期認証IDパスワード」を更新する。
	 * コース変更中の場合、元の内訳に紐付くオプションサービス契約＜ISP＞の「マルチセッション用認証IDパスワード」、
	 * 「マルチセッション用初期認証IDパスワード」も更新する。
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param 
	 */
	private void upd0351MltseNinshoIdPwd(CAANMsg inCBSMsg, AgentDispatchContext inContex, CAANMsg kk0351Msg, String svcKeiUcwkNo)
	{

		// オプションサービス契約レコードを作成する
		kk0351Msg.set(KK0351ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContex));
		kk0351Msg.set(KK0351ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0171C014CBSMsg.MSKM_DTL_NO));
		// サービス契約内訳番号が入力値と一致しない場合、コース変更前の内訳のため、異動区分はカレント引継
		// 上記以外の場合、固定で「各種IDパスワード初期化・再振・再発行」を設定する。
		if (svcKeiUcwkNo.equals(kk0351Msg.getString(KK0351ETMsg.SVC_KEI_UCWK_NO))) {
			kk0351Msg.set(KK0351ETMsg.IDO_DIV, JKKModelConst.IDO_DIV_ID_PWD_SHK_SAIFURI_SAIHAKKO);
		}
		kk0351Msg.set(KK0351ETMsg.ADD_DTM, inCBSMsg.getString(EKK0171C014CBSMsg.ADD_DTM));
		kk0351Msg.set(KK0351ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0171C014CBSMsg.ADD_OPEACNT));
		kk0351Msg.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(EKK0171C014CBSMsg.UPD_DTM));
		kk0351Msg.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0171C014CBSMsg.UPD_OPEACNT));

		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(kk0351Msg);
		dbaUtil.create(kk0351Msg);
	}
	
	
	private void upd0361MltseNinshoIdPwd(CAANMsg inCBSMsg, AgentDispatchContext inContex, CAANMsg kk0351Msg, String mltiseNinshoIdPwd, String mltiseShkNinshoIdPwd)
	{
		// オプションサービス契約<ISP>を取得する。
		CAANMsg kk0361Msg = findPrimaryKK0361(kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO), kk0351Msg.getString(KK0351ETMsg.GENE_ADD_DTM));
		if (kk0361Msg == null)
		{
			throw new JKKejbBusinessException("同一世代の「オプションサービス契約<ISP>」が取得できません。");
		}

		// サービスIFIDを取得する
		String templateID = inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY);

		// オプションサービス契約<ISP>のマルチセッション用認証IDパスワード、マルチセッション用初期認証IDパスワードに
		// サービス契約内訳で払い出した認証IDパスワードを設定したレコードを作成する
		kk0361Msg.set(KK0361ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContex));

		// 実施されたIFが「ISP認証IDパスワード初期化」の場合
		if ("EKK0171C013".equals(templateID))
		{
			kk0361Msg.set(KK0361ETMsg.MLTISE_NINSHO_ID_PWD, kk0361Msg.getString(KK0361ETMsg.MLTISE_SHK_NINSHO_ID_PWD));
		}
		// 実施されたIFが「ISP認証IDパスワード変更」の場合
		else if ("EKK0171C012".equals(templateID))
		{
			kk0361Msg.set(KK0361ETMsg.MLTISE_NINSHO_ID_PWD, inCBSMsg.getString(EKK0171C012CBSMsg.ISP_NINSHO_ID_PWD));
		}
		// 実施されたIFが「ISP認証IDパスワード再振出」の場合
		else
		{
			kk0361Msg.set(KK0361ETMsg.MLTISE_NINSHO_ID_PWD, mltiseNinshoIdPwd);
			kk0361Msg.set(KK0361ETMsg.MLTISE_SHK_NINSHO_ID_PWD, mltiseShkNinshoIdPwd);
		}

		kk0361Msg.set(KK0361ETMsg.ADD_DTM, inCBSMsg.getString(EKK0171C014CBSMsg.ADD_DTM));
		kk0361Msg.set(KK0361ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0171C014CBSMsg.ADD_OPEACNT));
		kk0361Msg.set(KK0361ETMsg.UPD_DTM, inCBSMsg.getString(EKK0171C014CBSMsg.UPD_DTM));
		kk0361Msg.set(KK0361ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0171C014CBSMsg.UPD_OPEACNT));

		try
		{
			super.create(kk0361Msg);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約＜ISP＞の「初期POPIDパスワード」を更新します。
	 * </p>
	 * @param kk0351upd オプションサービス契約カレント情報
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 */
	private void updKK0361PopIdPassword(CAANMsg kk0351upd, CAANMsg inCBSMsg)
	{
		JKKejbKK0361DBABase kk0361dba = new JKKejbKK0361DBABase();

		CAANMsg searchKey = new CAANMsg(KK0361ETMsg.class.getName());
		searchKey.set(KK0361ETMsg.OP_SVC_KEI_NO, kk0351upd.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		searchKey.set(KK0361ETMsg.GENE_ADD_DTM, kk0351upd.getString(KK0351ETMsg.GENE_ADD_DTM));

		CAANMsg kk0361PrimInfo = kk0361dba.findByPrimaryKey(searchKey);

		// 取得できない場合
		if (kk0361PrimInfo == null)
		{
			throw new CAANRuntimeException();
		}

		// 更新対象のKEYを設定する
		kk0361PrimInfo.set(KK0361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.KK0361_GENE_ADD_DTM));
		// 初期POPIDパスワードを設定する
		kk0361PrimInfo.set(KK0361ETMsg.SHK_POP_ID_PWD, inCBSMsg.getString(EKK0361C111CBSMsg.SHK_POP_ID_PWD));

		// 更新・登録年月日時分秒及びオペレーターIDを設定する
		kk0361PrimInfo.set(KK0361ETMsg.ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_DTM));
		kk0361PrimInfo.set(KK0361ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_OPEACNT));
		kk0361PrimInfo.set(KK0361ETMsg.UPD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_DTM));
		kk0361PrimInfo.set(KK0361ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_OPEACNT));

		try
		{
			super.create(kk0361PrimInfo);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコードを作成します。
	 * </p>
	 * @param kk0351upd オプションサービス契約カレント情報
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 */
	private void updKK0351PopIdPassword(CAANMsg kk0351upd, CAANMsg inCBSMsg)
	{
		kk0351upd.set(KK0351ETMsg.OP_SVC_KEI_NO, kk0351upd.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		kk0351upd.set(KK0351ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.KK0351_GENE_ADD_DTM));
		kk0351upd.set(KK0351ETMsg.ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_DTM));
		kk0351upd.set(KK0351ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_OPEACNT));
		kk0351upd.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_DTM));
		kk0351upd.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_OPEACNT));

		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(kk0351upd);
		dbaUtil.create(kk0351upd);
	}
	

	/**
	 * <p>
	 * オプションサービス契約<ISP>の一意検索を行う。
	 * </p>
	 * @param opSvcKeiNo オプションサービス契約.オプションサービス契約番号
	 * @param geneAddDtm オプションサービス契約.世代登録年月日時分秒
	 * @return オプションサービス契約<ISP>レコード
	 */
	private CAANMsg findPrimaryKK0361(String opSvcKeiNo, String geneAddDtm)
	{
		// 一意検索用のメッセージを作成
		CAANMsg inETMsgKK0361 = new CAANMsg(KK0361ETMsg.class.getName());
		inETMsgKK0361.set(KK0361ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0361.set(KK0361ETMsg.GENE_ADD_DTM, geneAddDtm);

		// オプションサービス契約<ISP>の一意検索を行う
		return new JKKejbKK0361DBABase().findByPrimaryKey(inETMsgKK0361);
	}

	// ANK-2350-00-00 2016/02/23 ADD START
	/**
	 * <p>
	 * EKK0361C112_WEBパスワード再振出　副次処理
	 * 入力のオプションサービス契約番号に紐付くサービス契約配下のオプションサービス契約の
	 * オプションサービスコードが"Myホームページ"の場合、オプションサービス契約＜ISP＞に持つ「初期WEBIDパスワード」を更新する。
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 */
	public void insWebIdPass(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 入力のオプション契約番号を取得する
		String opSvcKeiNo = inCBSMsg.getString(EKK0361C112CBSMsg.OP_SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		JKKejbKK0351DBABase kk0351dba = new JKKejbKK0351DBABase();

		// オプションサービス契約カレント取得
		CAANMsg kk0351CurDate = kk0351dba.getKK0351Current(opSvcKeiNo, opeDate);

		// 親サービス契約に紐付くオプションサービス契約を取得する
		CAANMsg[] kk0351InsList = kk0351dba.getKK0351bySvcKei(kk0351CurDate.getString(KK0351ETMsg.SVC_KEI_NO), null, opeDate, "3");

		ArrayList<String> execList = new ArrayList<String>();
		execList.add(opSvcKeiNo);	// 自分自身は省く

		// オプションサービス契約番号が取得できた分繰り返し
		for (CAANMsg kk0351info : kk0351InsList)
		{
			// オプションサービス契約番号を取得する
			String optSvcKeiNo = kk0351info.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			String optSvcCd = kk0351info.getString(KK0351ETMsg.OP_SVC_CD);

			// 一度更新されているオプションサービス契約は振舞わない
			if (execList.contains(optSvcKeiNo))
			{
				continue;
			}

			// 対象のオプションサービス契約が"Myホームページ"ではない場合
			if (!JKKModelConst.OP_SVC_CD_MY_HP.equals(optSvcCd))
			{
				continue;
			}

			// 更新対象のオプションサービス契約を保持する
			execList.add(optSvcKeiNo);

			// オプションサービス契約＜ISP＞更新
			this.updKK0361WebIdPassword(kk0351info, inCBSMsg);

			// オプションサービス契約更新
			this.updKK0351WebIdPassword(kk0351info, inCBSMsg);
		}
	}

	/**
	 * <p>
	 * オプションサービス契約＜ISP＞の「初期WEBIDパスワード」を更新します。
	 * </p>
	 * @param kk0351upd オプションサービス契約カレント情報
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 */
	private void updKK0361WebIdPassword(CAANMsg kk0351upd, CAANMsg inCBSMsg)
	{
		JKKejbKK0361DBABase kk0361dba = new JKKejbKK0361DBABase();

		CAANMsg searchKey = new CAANMsg(KK0361ETMsg.class.getName());
		searchKey.set(KK0361ETMsg.OP_SVC_KEI_NO, kk0351upd.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		searchKey.set(KK0361ETMsg.GENE_ADD_DTM, kk0351upd.getString(KK0351ETMsg.GENE_ADD_DTM));

		CAANMsg kk0361PrimInfo = kk0361dba.findByPrimaryKey(searchKey);

		// 取得できない場合
		if (kk0361PrimInfo == null)
		{
			throw new CAANRuntimeException();
		}

		// 更新対象のKEYを設定する
		kk0361PrimInfo.set(KK0361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.KK0361_GENE_ADD_DTM));
		// 初期WEBIDパスワードを設定する
		kk0361PrimInfo.set(KK0361ETMsg.SHK_WEB_ID_PWD, inCBSMsg.getString(EKK0361C112CBSMsg.SHK_WEB_ID_PWD));

		// 更新・登録年月日時分秒及びオペレーターIDを設定する
		kk0361PrimInfo.set(KK0361ETMsg.ADD_DTM, inCBSMsg.getString(EKK0361C112CBSMsg.ADD_DTM));
		kk0361PrimInfo.set(KK0361ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0361C112CBSMsg.ADD_OPEACNT));
		kk0361PrimInfo.set(KK0361ETMsg.UPD_DTM, inCBSMsg.getString(EKK0361C112CBSMsg.UPD_DTM));
		kk0361PrimInfo.set(KK0361ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0361C112CBSMsg.UPD_OPEACNT));

		try
		{
			super.create(kk0361PrimInfo);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコードを作成します。
	 * </p>
	 * @param kk0351upd オプションサービス契約カレント情報
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 */
	private void updKK0351WebIdPassword(CAANMsg kk0351upd, CAANMsg inCBSMsg)
	{
		kk0351upd.set(KK0351ETMsg.OP_SVC_KEI_NO, kk0351upd.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		kk0351upd.set(KK0351ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.KK0351_GENE_ADD_DTM));
		kk0351upd.set(KK0351ETMsg.ADD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_DTM));
		kk0351upd.set(KK0351ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.ADD_OPEACNT));
		kk0351upd.set(KK0351ETMsg.UPD_DTM, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_DTM));
		kk0351upd.set(KK0351ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK0361C111CBSMsg.UPD_OPEACNT));

		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(kk0351upd);
		dbaUtil.create(kk0351upd);
	}
	// ANK-2350-00-00 2016/02/23 ADD END
}
