/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK2811C150KRCK
*   ソースファイル名：JEKK2811C150KRCK.java
*	作成者			：富士通
*	日付			：2013年11月14日
*＜機能概要＞
*   機器オプションサービス契約解約確定の関連制約部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v7.00.00	2013/11/14	富士通		新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

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.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK2811C150CBSMsg;

/**
 * <p>
 * 機器オプションサービス契約解約確定の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK2811C150KRCK
{

	/** 関連チェックエラーフラグ&エラー返却項目(機器オプションサービス契約 機器オプションサービス存在チェック) */
	private static final String[] KRCK_KKOP_EXISTS_ERR = {"EA", EKK2811C150CBSMsg.KKOP_SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(異動予約 存在チェック) */
	private static final String[] KRCK_IDORSV_EXISTS_ERR = {"EB", EKK2811C150CBSMsg.KKOP_SVC_KEI_NO_ERR};

	/** 異動予約詳細コード 機器オプション解約 */
	private static final String IDORSVDTL_KKOP_DISSOLVE = "024";
	
	/** 異動予約状態コード 予約手続中 */
	private static final String IDORSVSTAT_RSV_PROC = "03";
	
	/**
	 * <p>
	 * 新しいJEKK0341C350KRCKを作成します。
	 * </p>
	 */
	public JEKK2811C150KRCK()
	{
	}

	/**
	 * <p>
	 * 機器オプションサービス契約解約確定の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 機器オプションサービス契約番号
		String kkopSvcKeiNo = inCBSMsg.getString(EKK2811C150CBSMsg.KKOP_SVC_KEI_NO);

		// 機器オプションサービス契約関連チェック部品
		JKKejbKK2811KRCK kk2811KRCK = new JKKejbKK2811KRCK();
	
		// 機器オプションサービス契約 機器オプションサービス存在チェック
		if (!kk2811KRCK.isExistsNonGene(kkopSvcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KKOP_EXISTS_ERR);
			return;
		}
		
		// 更新対象データの存在チェック
		if (!isExistsIdoRsv(kkopSvcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_IDORSV_EXISTS_ERR);
			return;			
		}
	}
	
	/**
	 * <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;
		
	}

	/**
	 * <p>
	 * 異動予約の存在チェックを行います。
	 * 以下の条件を満たす異動予約レコードが存在する場合にtrueを返却します。
	 * <ol>
	 * <li>機器オプションサービス契約番号に紐付く
	 * <li>異動予約詳細コードが"機器オプション解約"
	 * <li>異動予約状態コードが"予約手続中"
	 * <li>無効フラグが"有効"
	 * </ol>
	 * </p>
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @return 条件に一致する異動予約が存在する場合はtrue
	 */
	private boolean isExistsIdoRsv(String kkopSvcKeiNo)
	{
		if (kkopSvcKeiNo == null)
		{
			return true;
		}

		CAANMsg kk1681 = new CAANMsg(KK1681ETMsg.class.getName());
		kk1681.set(KK1681ETMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		kk1681.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDORSVDTL_KKOP_DISSOLVE);
		kk1681.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDORSVSTAT_RSV_PROC);
		kk1681.set(KK1681ETMsg.MK_FLG, "0");
		
		CAANMsg[] condKK1681 = null;
		
		try
		{
			// 異動予約に対し、機器解約予約手続中のデータ検索
			condKK1681 = new KK1681LE().findByCondition(kk1681);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		if (0 < condKK1681.length)
		{
			// 機器解約予約手続中のデータが存在する場合
			return true;
		}

		// 機器解約予約手続中のデータが存在しない場合
		return false;
	}

}

