/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0251C070ETDA
*	ソースファイル名：JEKK0251C070ETDA.java
*	作成者			：富士通
*	日付			：2011年10月06日
*＜機能概要＞
*	サービス契約回線内訳キャンセル時の副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/06	富士通		新規作成
*	v4.00.01	2013/01/25	FJ）藤本	ST1-2012-0000846
*
**********************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;

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 com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0251C070CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * サービス契約回線内訳キャンセルの副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0251C070ETDA implements TemplateMainHandler
{
	
	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";
	
	/** 異動予約詳細コード 回線利用場所変更 */
	private static final String IDODTL_KAISEN_CHANGE = "009";
	
	/** 異動予約状態コード 取消済 */
	private static final String IDOSTAT_CANCELED = "02";
	
	/** 異動予約状態コード 異動予約対象外 */
	private static final String IDOSTAT_NOTTARGET = "04";
	
	/** 同日包含フラグ 含まない */
	private static final String SAMEDAY_NOTINCLUDED = "0";
	
	/**
	 * <p>
	 * サービス契約回線内訳キャンセルの副次処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 異動予約更新処理を実行
		update(inCBSMsg, inContext);
	}

	/**
	 * <p>
	 * 異動予約更新処理のDBアクセス処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	private void update(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		CAANMsg updateInfo = new CAANMsg(KK1681ETMsg.class.getName());
		
		// 更新対象の異動予約番号を取得
		String[] idoRsvNoList = getUpdateTarget(inCBSMsg, inContext);

		for (String idoRsvNo : idoRsvNoList)
		{
			// 異動予約番号	IDO_RSV_NO
			updateInfo.set(KK1681ETMsg.IDO_RSV_NO, idoRsvNo);
			
			// 異動予約取消年月日	IDO_RSV_CL_YMD
			updateInfo.set(KK1681ETMsg.IDO_RSV_CL_YMD, opeDate);
			
			// 異動予約状態コード	IDO_RSV_STAT_CD
			updateInfo.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDOSTAT_CANCELED);
			
			// 更新年月日時分秒	UPD_DTM
			updateInfo.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			
			// 更新オペレータアカウント	UPD_OPEACNT
			updateInfo.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 異動予約の更新
			JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
			dba.update(updateInfo);
		}
	}

	/**
	 * <p>
	 * 更新対象の異動予約番号を取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 更新対象の異動予約番号の配列
	*/
	private String[] getUpdateTarget(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// サービス契約回線内訳番号を検索条件にサービス契約番号を取得
		CAANMsg[] kk0081MsgList = new JKKejbKK0081DBABase().getKK0081bySvcKeiKaisenUcwk(
				inCBSMsg.getString(EKK0251C070CBSMsg.SVC_KEI_KAISEN_UCWK_NO), null, opeDate, "1");
		
		ArrayList<String> idoRsvNoList = new ArrayList<String>();
		String idoRsvNo = null;
		
		// サービス契約番号を検索条件に異動予約を取得
		for (CAANMsg kk0081Msg : kk0081MsgList)
		{
			String svcKeiNo = kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO);
			
			idoRsvNo = getIdoRsvNo(inCBSMsg, inContext, svcKeiNo);
			
			if (null != idoRsvNo)
			{
				idoRsvNoList.add(getIdoRsvNo(inCBSMsg, inContext, svcKeiNo));
			}
		}
		
		return idoRsvNoList.toArray(new String[0]);
	}
	
	/**
	 * <p>
	 * サービス契約番号に紐付く異動予約番号を取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo 検索するサービス契約番号
	 * @return 「サービス契約番号」に紐付く「異動予約詳細コード」が"回線利用場所変更"、
	 *          「異動予約状態コード」が"異動予約対象外"の異動予約番号
	 */
	private String getIdoRsvNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// 「サービス契約番号」に紐付く「異動予約詳細コード」が"回線利用場所変更"、
		// 「異動予約状態コード」が"異動予約対象外"の異動予約を取得
		KK1681LE kk1681le = new KK1681LE();
		CAANMsg kk1681Cond = new CAANMsg(KK1681ETMsg.class.getName());
		kk1681Cond.set(KK1681ETMsg.SVC_KEI_NO, svcKeiNo);
		kk1681Cond.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDODTL_KAISEN_CHANGE);
		kk1681Cond.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDOSTAT_NOTTARGET);
		kk1681Cond.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);

		CAANMsg[] msgList = null;
		
		try
		{
			msgList = kk1681le.findByCondition(kk1681Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		if (0 == msgList.length)
		{
			// 取得結果が0件の場合
			return null;
		}
		
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		if (!JKKModelCommon.isFutureDate(msgList[0].getString(KK1681ETMsg.RSV_APLY_YMD), opeDate, SAMEDAY_NOTINCLUDED))
		{
			// 予約適用年月日が運用日付以前の場合
			return null;
		}
		
		// 予約適用年月日が運用日付より未来日の場合、異動予約番号を返却
		return msgList[0].getString(KK1681ETMsg.IDO_RSV_NO);
	}
}
	