/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0321C020KRCK
*   ソースファイル名：JEKK0321C020KRCK.java
*   作成者          ：富士通
*   日付            ：2011年10月21日
*＜機能概要＞
*   課金先請求契約変更の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/21  富士通      新規作成
*
**********************************************************************/

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.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0021LE;
import eo.ejb.cbm.entity.KK0321ETMsg;
import eo.ejb.cbm.entity.KK0321LE;
import eo.ejb.cbm.entity.KK0491ETMsg;
import eo.ejb.cbm.entity.KK0491LE;
import eo.ejb.cbs.cbsmsg.EKK0321C020CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 課金先請求契約変更の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0321C020KRCK
{

	/** 関連チェックエラーフラグ&エラー返却項目(課金先 存在チェック) */
	private static final String[] KRCK_KAKINS_EXISTS_ERR = {"EA", EKK0321C020CBSMsg.KAKINS_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(請求契約 存在チェック) */
	private static final String[] KRCK_SEIKY_EXISTS_ERR = {"EA", EKK0321C020CBSMsg.SEIKY_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(課金先 課金先適用中チェック) */
	private static final String[] KRCK_KAKINS_TEKIYO_ERR = {"EB", EKK0321C020CBSMsg.KAKINS_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(課金先 サービス契約課金先チェック) */
	private static final String[] KRCK_KAKINS_SVCKEI_ERR = {"EC", EKK0321C020CBSMsg.KAKINS_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(課金先 過去日チェック) */
	private static final String[] KRCK_KAKINS_BFYMD_ERR = {"EA", EKK0321C020CBSMsg.KAKINS_TSTAYMD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(申込明細 存在チェック) */
	private static final String[] KRCK_MSKMDTL_XISTS_ERR = {"EA", EKK0321C020CBSMsg.MSKM_DTL_NO_ERR};

	/**
	 * <p>
	 * 新しいJEKK0321C020KRCKを作成します。
	 * </p>
	 */
	public JEKK0321C020KRCK()
	{
	}

	/**
	 * <p>
	 * 課金先請求契約変更の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{

		// 課金先番号
		String kakinsNo = inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_NO);

		// 課金先 存在チェック
		if (kakinsNo != null)
		{
			// 課金先レコードを取得
			CAANMsg ret = getKakins(kakinsNo);

			if (ret == null)
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KAKINS_EXISTS_ERR);
				return;
			}

		}

		//請求契約の存在チェック
		String seikyKeiNo = inCBSMsg.getString(EKK0321C020CBSMsg.SEIKY_KEI_NO);
		if (seikyKeiNo != null)
		{
			if (!isSeikyKei(seikyKeiNo))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SEIKY_EXISTS_ERR);
				return;
			}
		}

		// 課金先 課金先適用中チェック
		// 課金先レコードが適用中でない＝（課金先適用開始年月日>運用日付 or 課金先適用終了年月日<運用日付）の場合、エラー
		if (kakinsNo != null)
		{
			// 課金先レコードを取得
			CAANMsg ret = getKakins(kakinsNo);

			String kakins_tstaymd = ret.getString(KK0321ETMsg.KAKINS_TSTAYMD);
			String kakins_tendymd = ret.getString(KK0321ETMsg.KAKINS_TENDYMD);

			//課金先適用開始年月日>運用日付の判定
			if (JKKModelCommon.isFutureDate(kakins_tstaymd, JKKModelCommon.getOpeDate(inCBSMsg), "0"))
			{
				
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KAKINS_TEKIYO_ERR);
				return;
			}
			
			//課金先適用終了年月日<運用日付の判定
			if (JKKModelCommon.isPastDate(kakins_tendymd, JKKModelCommon.getOpeDate(inCBSMsg), "0"))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KAKINS_TEKIYO_ERR);
				return;

			}
			
		}

		// 課金先 サービス契約課金先チェック
		if (kakinsNo != null)
		{
			// 課金先レコードを取得
			CAANMsg ret = getKakins(kakinsNo);

			String svcKeiNo = ret.getString(KK0321ETMsg.SVC_KEI_NO);
			if (svcKeiNo == null)
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KAKINS_SVCKEI_ERR);
				return;

			}
		}

		// 課金先 過去日チェック
		String kakins_tstaymd_input = inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD);

		if (kakinsNo != null && kakins_tstaymd_input != null)
		{
			// 課金先レコードを取得
			CAANMsg ret = getKakins(kakinsNo);

			String kakins_tstaymd = ret.getString(KK0321ETMsg.KAKINS_TSTAYMD);

			if (kakins_tstaymd != null && JKKModelCommon.isPastDate(kakins_tstaymd_input, kakins_tstaymd, "0"))
			{
				// 指定された「課金先」の課金先適用開始年月日より入力値の課金先適用開始年月日が
				// 過去日の場合、エラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_KAKINS_BFYMD_ERR);
				return;
			}
		}
		
		// 申込明細　存在チェック
		String mskmDtlNo = inCBSMsg.getString(EKK0321C020CBSMsg.MSKM_DTL_NO);
		if (null != mskmDtlNo)
		{
			if (!isMskmDtlNo(mskmDtlNo))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MSKMDTL_XISTS_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>
	 * 課金先レコードの検索を行います。
	 * </p>
	 * @param kakinsNo 課金先番号
	 * @return 検索結果の課金先レコード
	 */
	private CAANMsg getKakins(String kakinsNo)
	{
		// 検索パラメータの設定
		CAANMsg msg = new CAANMsg(KK0321ETMsg.class.getName());
		msg.set(KK0321ETMsg.KAKINS_NO, kakinsNo);
		msg.set(KK0321ETMsg.MK_FLG, "0");

		KK0321LE le = new KK0321LE();
		CAANMsg[] otETMsg;
		
		try
		{
			otETMsg = le.findByCondition(msg);
			
			if (otETMsg == null || otETMsg.length == 0)
			{
				return null;
			}
			
			//PKが課金先番号のみなので一件しか取得しない
			return otETMsg[0];

		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}

	}

	/**
	 * <p>
	 * 請求契約レコードの存在チェックを行います。
	 * </p>
	 * @param seikyKeiNo 請求契約番号
	 * @return レコードが存在した場合はtrue、それ以外はfalseを返却
	 */
	private boolean isSeikyKei(String seikyKeiNo)
	{
		CAANMsg kk0491ETMsg = new CAANMsg(KK0491ETMsg.class.getName());
		kk0491ETMsg.set(KK0491ETMsg.SEIKY_KEI_NO, seikyKeiNo);
		kk0491ETMsg.set(KK0491ETMsg.MK_FLG, "0");

		KK0491LE le = new KK0491LE();
		CAANMsg[] otETMsg;
		try
		{
			otETMsg = le.findByCondition(kk0491ETMsg);

			if (otETMsg == null || otETMsg.length == 0)
			{
				return false;
			}
			
			return true;

		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}
	}
	
	/**
	 * <p>
	 * 申込明細レコードの存在チェックを行います。
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @return レコードが存在した場合はtrue、それ以外はfalseを返却
	 */
	private boolean isMskmDtlNo(String mskmDtlNo)
	{
		CAANMsg kk0021ETMsg = new CAANMsg(KK0021ETMsg.class.getName());
		kk0021ETMsg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);
		kk0021ETMsg.set(KK0021ETMsg.MK_FLG, "0");

		KK0021LE le = new KK0021LE();
		CAANMsg[] otETMsg;
		try
		{
			otETMsg = le.findByCondition(kk0021ETMsg);

			if (null == otETMsg || 0 == otETMsg.length)
			{
				return false;
			}
			
			return true;

		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}
	}

}
