/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JDKejbKK0321KRCK
*	ソースファイル名：JDKejbKK0321KRCK.java
*	作成者			：EK909134
*	日付			：2011年08月30日
*＜機能概要＞
*	課金先制約部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.common.entity;
import java.util.HashMap;

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.CH0231ETMsg;
import eo.ejb.cbm.entity.CH0231LE;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0321ETMsg;
import eo.ejb.cbm.entity.KK0321LE;
import eo.ejb.cbm.entity.KK0491ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JDKejbKK0081DBABase;
import eo.ejb.common.db.JDKejbKK0491DBABase;

/**
 * <p>
 * 課金先の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JDKejbKK0321KRCK extends JDKejbKK0491DBABase
{

	/** サービス契約ステータス（照査済） */
	private static final String SV_KEI_STATUS_SHOUSA = "020";

	/** サービス契約ステータス（締結済） */
	private static final String SV_KEI_STATUS_JOUKETSU = "030";

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";

	/** 督促ステータス（利用停止済） */
	private static final int TOKU_STATUS_RIYOTEISHI = 20;

	/**
	 * <p>
	 * 新しいJDKejbKK0321KRCKを作成します。
	 * </p>
	 */
	public JDKejbKK0321KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 督促チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 対象のサービス契約に督促が行われている場合にfalse。以外の場合true。
	 */
	public static boolean isCheckTokusoku(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// サービス契約の内部スキーマメッセージを作成
		CAANMsg in0081ETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		in0081ETMsg.set(KK0081ETMsg.SVC_KEI_NO, inMsg.getString(KK0081ETMsg.SVC_KEI_NO));
		in0081ETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// カレント検索を行う
		CAANMsg ot0081ETMsg = new JDKejbKK0081DBABase().findByCurrent(in0081ETMsg);
		if (ot0081ETMsg == null)
		{
			return false;
		}

		// サービス契約ステータスが照査済または締結済かどうか判定
		String svcStat = ot0081ETMsg.getString(KK0081ETMsg.SVC_KEI_STAT);
		if (!(SV_KEI_STATUS_SHOUSA.equals(svcStat) || SV_KEI_STATUS_JOUKETSU.equals(svcStat)))
		{
			// 照査済または締結済でない場合、trueを返却して処理終了
			return true;
		}

		// 課金先の内部スキーマメッセージを作成
		CAANMsg in0321ETMsg = new CAANMsg(KK0321ETMsg.class.getName());
		in0321ETMsg.set(KK0321ETMsg.SVC_KEI_NO, inMsg.getString(KK0081ETMsg.SVC_KEI_NO));
		in0321ETMsg.set(KK0321ETMsg.MK_FLG, MK_FLG_YUKO);

		// 全件検索を行う
		KK0321LE kkLe = new KK0321LE();
		CAANMsg[] ret0321 = null;
		try
		{
			ret0321 = kkLe.findByCondition(in0321ETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		if (0 == ret0321.length)
		{
			// 0件の場合、trueを返却して処理終了
			return true;
		}

		// 課金先単位で下記の処理を行う
		HashMap<String, String> kakinHash = new HashMap<String, String>();
		for (int i = 0; i < ret0321.length; i++)
		{
			// 既に読み込まれている課金先番号は処理しない
			String kakinsNo = ret0321[i].getString(KK0321ETMsg.KAKINS_NO);
			if (kakinHash.containsKey(kakinsNo))
			{
				continue;
			}
			// 読み込んだ課金先番号を控える
			kakinHash.put(kakinsNo, kakinsNo);

			int kakinSta = 0;	// 課金先適用開始年月日
			if (!ret0321[i].isNull(KK0321ETMsg.KAKINS_TSTAYMD))
			{
				kakinSta = Integer.parseInt(ret0321[i].getString(KK0321ETMsg.KAKINS_TSTAYMD));
			}
			else
			{
				// 適用開始年月日が存在しない場合、次のレコードの判定を行う
				continue;
			}

			int kakinEnd = 0;	// 課金先適用終了年月日
			if (!ret0321[i].isNull(KK0321ETMsg.KAKINS_TENDYMD))
			{
				kakinEnd = Integer.parseInt(ret0321[i].getString(KK0321ETMsg.KAKINS_TENDYMD));
			}
			else
			{
				// 適用終了年月日が存在しない場合、次のレコードの判定を行う
				continue;
			}

			int opeDate = Integer.parseInt(JKKModelCommon.getOpeDate(inMsg));	// 運用日付

			if (!((kakinSta <= opeDate) && (opeDate <= kakinEnd)))
			{
				// 課金先適用開始年月日＜＝運用日付＜＝課金先適用終了年月日の範囲にない場合
				// 次のレコードの判定を行う
				continue;
			}
			else
			{
				// 課金先適用開始年月日＜＝運用日付＜＝課金先適用終了年月日の範囲にある場合
				// 課金先の情報から請求契約の情報を取得

				// 請求契約の内部スキーマメッセージを作成
				CAANMsg in0491ETMsg = new CAANMsg(KK0491ETMsg.class.getName());
				in0491ETMsg.set(KK0491ETMsg.SEIKY_KEI_NO, ret0321[i].getString(KK0321ETMsg.SEIKY_KEI_NO));
				in0491ETMsg.set(KK0491ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

				// カレント検索を行う
				CAANMsg ot0491ETMsg = new JDKejbKK0491DBABase().findByCurrent(in0491ETMsg);

				if (null == ot0491ETMsg)
				{
					// 0件の場合、課金先の次のレコードの判定を行う
					continue;
				}
				else
				{
					// 1件の場合、請求契約の情報から督促の情報を取得
					// 全件検索用の督促の内部スキーマメッセージを作成
					CAANMsg in0231ETMsg = new CAANMsg(CH0231ETMsg.class.getName());
					in0231ETMsg.set(CH0231ETMsg.SEIKY_KEI_NO, ot0491ETMsg.getString(KK0491ETMsg.SEIKY_KEI_NO));
					in0231ETMsg.set(CH0231ETMsg.MK_FLG, MK_FLG_YUKO);

					// 全件検索を行う
					CH0231LE chLe = new CH0231LE();
					CAANMsg[] ret0231 = null;
					try
					{
						ret0231 = chLe.findByCondition(in0231ETMsg);
					}
					catch (CAANException ce)
					{
						throw new CAANRuntimeException(ce);
					}

					if (0 == ret0231.length)
					{
						// 0件の場合、課金先の次のレコードの判定を行う
						continue;
					}

					// 督促単位で下記の処理を行う
					HashMap<String, String> tokuHash = new HashMap<String, String>();
					for (int j = 0; j < ret0231.length; j++)
					{
						// 既に読み込まれている督促番号は処理しない
						String tokusokuNo = ret0231[j].getString(CH0231ETMsg.TOKUSOKU_NO);
						if (tokuHash.containsKey(tokusokuNo))
						{
							continue;
						}
						// 読み込んだ督促番号を控える
						tokuHash.put(tokusokuNo, tokusokuNo);

						int tokuSta = 0;	// 督促管理開始年月日
						if (!ret0231[j].isNull(CH0231ETMsg.TOKUSOKU_STAYMD))
						{
							tokuSta = 
								Integer.parseInt(ret0231[j].getString(CH0231ETMsg.TOKUSOKU_STAYMD));
						}
						else
						{
							// 管理開始年月日が存在しない場合、次のレコードの判定を行う
							continue;
						}

						int tokuEnd = 0;	// 督促管理終了年月日
						if (!ret0231[j].isNull(CH0231ETMsg.TOKUSOKU_ENDYMD))
						{
							tokuEnd = 
								Integer.parseInt(ret0231[j].getString(CH0231ETMsg.TOKUSOKU_ENDYMD));
						}
						else
						{
							// 管理終了年月日が存在しない場合、次のレコードの判定を行う
							continue;
						}

						if (!((tokuSta <= opeDate) && (opeDate <= tokuEnd)))
						{
							// 督促管理開始年月日＜＝運用日付＜＝督促管理終了年月日の範囲にない場合
							// 次のレコードの判定を行う
							continue;
						}
						else
						{
							// 督促管理開始年月日＜＝運用日付＜＝督促管理終了年月日の範囲にある場合

							// 督促ステータス判定
							int intStat = 
								Integer.parseInt(ret0231[j].getString(CH0231ETMsg.TOKUSOKU_STAT));
							// 20（利用停止済）以上の場合、処理終了
							if (TOKU_STATUS_RIYOTEISHI <= intStat)
							{
								return false;
							}
							else
							{
								// 上記以外の場合、次のレコードの判定を行う
								continue;
							}
						}
					}
				}
			}
		}
		return true;
	}
}
