/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JDKejbDK0521KRCK
*	ソースファイル名：JDKejbDK0521KRCK.java
*	作成者			：EK912305
*	日付			：2012年11月02日
*＜機能概要＞
*	配送指示依頼制約部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.common.entity;

import java.util.Arrays;
import java.util.Comparator;

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.common.constant.JDKStrConst;
import eo.ejb.cbm.entity.DK0521ETMsg;
import eo.ejb.cbm.entity.DK0521LE;
import eo.ejb.cbm.entity.DK0531ETMsg;
import eo.ejb.cbm.entity.DK0531LE;

/**
 * <p>
 * 配送指示依頼の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JDKejbDK0521KRCK
{

	/**
	 * <p>
	 * 新しいJDKejbDK0521KRCKを作成します。
	 * </p>
	 */
	public JDKejbDK0521KRCK()
	{
	}

	/**
	 * <p>
	 * 未存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 配送指示依頼明細の同一の配送番号で配送指示依頼番号の最大値を取得し、
	 *          配送指示依頼の配送指示処理状態識別コードが
	 *          "004"（処理エラー）以外のデータが存在する場合にfalseを返す。
	 *          それ以外はtrueを返す。
	 */
	public static boolean isNotExistsCheck(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 全件検索用の配送指示依頼明細の内部スキーマメッセージを作成
		CAANMsg in0531ETMsg = new CAANMsg(DK0531ETMsg.class.getName());
		in0531ETMsg.set(DK0531ETMsg.HAISO_NO, inMsg.getString(DK0531ETMsg.HAISO_NO));
		in0531ETMsg.set(DK0531ETMsg.MK_FLG, "0");

		// 全件検索を行う
		DK0531LE dk0531Le = new DK0531LE();
		CAANMsg[] ret0531 = null;
		try
		{
			ret0531 = dk0531Le.findByCondition(in0531ETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 最大配送指示依頼番号を取得
		String maxHaisoSjiReqNo = getMaxHaisoSjiReqNo(ret0531);

		if (maxHaisoSjiReqNo != null)
		{
			// 配送指示処理状態識別コードを判定
			return isAvailable(maxHaisoSjiReqNo);
		}

		return true;
	}

	/**
	 * 最大配送指示依頼番号を返却します。
	 * @param ret0531 配送指示依頼明細情報
	 * @return 最大配送指示依頼番号
	 */
	private static String getMaxHaisoSjiReqNo(CAANMsg[] ret0531)
	{
		if (ret0531.length <= 0) {
			return null;
		}

		// 配送指示依頼番号でソート
		Arrays.sort(ret0531,
				new Comparator<CAANMsg>()
				{
					@Override
					public int compare(CAANMsg arg0, CAANMsg arg1)
					{
						return arg0.getString(DK0531ETMsg.HAISO_SJI_REQ_NO).compareTo(
								arg1.getString(DK0531ETMsg.HAISO_SJI_REQ_NO));
					}
				}
		);

		// 最大配送指示依頼番号を返却
		return ret0531[ret0531.length - 1].getString(DK0531ETMsg.HAISO_SJI_REQ_NO);
	}

	/**
	 * 配送指示処理状態識別コードを判定します
	 * @param haisoSjiReqNo 
	 * @return 配送指示処理状態識別コードが"004"（処理エラー）以外のデータが存在する場合にfalseを返す。
	 *          それ以外はtrueを返す。
	 */
	private static boolean isAvailable(String haisoSjiReqNo)
	{
		// 全件検索用の配送指示依頼の内部スキーマメッセージを作成
		CAANMsg in0521ETMsg = new CAANMsg(DK0521ETMsg.class.getName());
		in0521ETMsg.set(DK0521ETMsg.HAISO_SJI_REQ_NO, haisoSjiReqNo);
		in0521ETMsg.set(DK0521ETMsg.MK_FLG, "0");

		// 全件検索を行う
		DK0521LE dk0521Le = new DK0521LE();
		CAANMsg[] ret0521 = null;
		try
		{
			ret0521 = dk0521Le.findByCondition(in0521ETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		if (0 < ret0521.length) {
			// 配送指示処理状態識別コードが"004"（処理エラー）かを判定
			return JDKStrConst.HAISO_SJI_STAT_SYRERR.equals(
					ret0521[0].getString(DK0521ETMsg.HAISO_SJI_TRN_STAT_SKCD));
		}

		return true;
	}

}
