/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKejbCK0201SecProc
*	ソースファイル名：JCKejbCK0201SecProc.java
*	作成者			：富士通
*	日付			：2017年09月21日
*＜機能概要＞
*	連絡先に対する副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v33.00.00	2017/08/21	FJ)孫		新規作成 ANK-3035-00-00 未来予約データ存在時のお客様スキーマの挙動
**********************************************************************/

package eo.ejb.common.db;

import java.util.HashMap;

import com.fujitsu.futurity.common.JCCWebAddTrnId;
import com.fujitsu.futurity.common.JCMConstants;
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.CK0201ETMsg;

/**
 * <p>
 * 連絡先に対する副次処理を行う部品です。
 * </p>
 * @author 富士通
 */
public class JCKejbCK0201SecProc extends JCKejbCK0201DBABase
{
	/** お客様情報本登録マスター会員場合のサービスID. */
	public static final String SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN_MASTER_USER = "CKSV9023";
	
	/** お客様情報本登録移行のサービスID. */
	public static final String SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN = "CKSV9024";
	
	/** お客様情報変更のサービスID. */
	private static final String SERVICE_ID_CUST_INFO_MOD = "CKSV9025";
	
	/** メールアドレス本登録のサービスID. */
	private static final String SERVICE_ID_CUST_INFO_UPD_MAIL_ADDREES_MAIN_UPD = "CKSV9029";
	
	/** メールアドレス本登録移行のサービスID. */
	private static final String SERVICE_ID_CUST_INFO_UPD_MAIL_ADDREES_MAIN_UPD_START = "CKSV9030";
	
	/**
	 * コンストラクタです。
	 */
	public JCKejbCK0201SecProc()
	{
		super();
	}
	
	/**
	 * <p>
	 * 連絡先の予約取消処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 */
	public void updateCustRrksRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, String sysid, String rsvAplyYmd)
	{
		if (null == sysid || null == rsvAplyYmd)
		{
			return ;
		}
		
		// 共通メッセージからサービス呼び出し元の区分を取得する
		HashMap<String, Object> commonMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);
		String serviceId = (String)commonMsg.get(JCMConstants.USECASE_ID_KEY);
		
		//呼び出し元サービスID確認
		if(serviceIdCheck(serviceId))
		{
			return ;
		}
		
		// 予約レコード検索
		CAANMsg rsnInMsg = new CAANMsg(CK0201ETMsg.class.getName());
		rsnInMsg.set(CK0201ETMsg.SYSID, sysid);
		rsnInMsg.set(CK0201ETMsg.RSV_APLY_YMD, rsvAplyYmd);
		rsnInMsg.set(CK0201ETMsg.MLAD, inCBSMsg.getString(CK0201ETMsg.MLAD));
		rsnInMsg.set(CK0201ETMsg.TELNO, inCBSMsg.getString(CK0201ETMsg.TELNO));
		CAANMsg[] rsvRetMsg = new JCKejbCK0201DBABase().findByReserveRrks(rsnInMsg);
		
		for (CAANMsg retMsg : rsvRetMsg)
		{
			if(null == inCBSMsg.getString(CK0201ETMsg.MLAD))
			{
				setColumnForUpdateTelNo(inCBSMsg, inContext, retMsg);
				
				update(inCBSMsg, retMsg);
			}
			if(null == inCBSMsg.getString(CK0201ETMsg.TELNO))
			{
				setColumnForUpdateMlad(inCBSMsg, inContext, retMsg);
				
				update(inCBSMsg, retMsg);
			}
		}
	}
	/**
	 * <p>
	 * 予約更新時の項目の設定を行います。<br>
	 * メールアドレス本登録、メールアドレス本登録移行からのみ呼び出される前提です。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param retMsg 更新対象のETMsg
	*/
	private void setColumnForUpdateMlad(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg retMsg)
	{
		// 項目名称
		String mlad = inCBSMsg.getString(CK0201ETMsg.MLAD);
		String mlad_chge_ymd = CK0201ETMsg.MLAD_CHGE_YMD;
		String mlad_chge_uk_ymd = CK0201ETMsg.MLAD_CHGE_UK_YMD;
		String telNo = inCBSMsg.getString(CK0201ETMsg.TELNO);
		
		if(mlad != null)
		{
			retMsg.set(CK0201ETMsg.MLAD, mlad);													//メールアドレス
			retMsg.set(CK0201ETMsg.MLAD_CHGE_YMD, inCBSMsg.getString(mlad_chge_ymd));			//メールアドレス変更年月日
			retMsg.set(CK0201ETMsg.MLAD_CHGE_UK_YMD, inCBSMsg.getString(mlad_chge_uk_ymd));		//メールアドレス変更受付年月日
		}
		else if(telNo != null)
		{
			retMsg.set(CK0201ETMsg.TELNO, inCBSMsg.getString(telNo));							//電話番号
		}
		//更新共通項目
		retMsg.set(CK0201ETMsg.UPD_DTM, inCBSMsg.getString(CK0201ETMsg.UPD_DTM));				//更新年月日時分秒
		retMsg.set(CK0201ETMsg.UPD_UNYO_YMD, inCBSMsg.getString(CK0201ETMsg.UPD_UNYO_YMD));		//更新運用年月日
		retMsg.set(CK0201ETMsg.UPD_OPEACNT, inCBSMsg.getString(CK0201ETMsg.UPD_OPEACNT));		//更新オペレータアカウント
		retMsg.set(CK0201ETMsg.UPD_TRN_ID, inCBSMsg.getString(CK0201ETMsg.UPD_TRN_ID));			//更新処理ID
	}
	
	/**
	 * <p>
	 * 予約更新時の項目の設定を行います。<br>
	 * お客様情報変更からのみ呼び出される前提です。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param retMsg 更新対象のETMsg
	*/
	private void setColumnForUpdateTelNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg retMsg)
	{
		// 項目名称
		String telNo = CK0201ETMsg.TELNO;
		
		retMsg.set(CK0201ETMsg.TELNO, inCBSMsg.getString(telNo));								//電話番号
		//更新共通項目
		retMsg.set(CK0201ETMsg.UPD_DTM, inCBSMsg.getString(CK0201ETMsg.UPD_DTM));				//更新年月日時分秒
		retMsg.set(CK0201ETMsg.UPD_UNYO_YMD, inCBSMsg.getString(CK0201ETMsg.UPD_UNYO_YMD));		//更新運用年月日
		retMsg.set(CK0201ETMsg.UPD_OPEACNT, inCBSMsg.getString(CK0201ETMsg.UPD_OPEACNT));		//更新オペレータアカウント
		retMsg.set(CK0201ETMsg.UPD_TRN_ID, inCBSMsg.getString(CK0201ETMsg.UPD_TRN_ID));			//更新処理ID
	}
	
	/**
	 * 呼び出し元サービスIDが、
	 * お客様情報本登録移行(CKSV9023)、お客様情報本登録(CKSV9024)、お客様情報更新(CKSV9025)
	 * メールアドレス本登録(CKSV9029)、メールアドレス本登録移行(CKSV9030)
	 * で始まる場合
	 * 
	 * @param serviceId サービスID
	 * @return false 未来予約レコード検索実施 
	 * @return true  未来予約レコード検索しない
	 * */
	private boolean serviceIdCheck(String serviceId)
	{
		if(serviceId != null && (serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN_MASTER_USER)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_MOD)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_UPD_MAIL_ADDREES_MAIN_UPD)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_UPD_MAIL_ADDREES_MAIN_UPD_START)))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 更新処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg 更新用のETMsg
	*/
	private void update(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		try
		{
			super.update(inETMsg);
		}
		catch (CAANException e2)
		{
			throw new CAANRuntimeException(e2);
		}
	}
}