/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JTUejbTU0021KRCK
*	ソースファイル名：JTUejbTU0021KRCK.java
*	作成者			：FJ
*	日付			：2014年01月08日
*＜機能概要＞
*	同番移転制約部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v6.00.00	2014/01/08	FJ)谷川		新規作成
*
**********************************************************************/

package eo.ejb.common.entity;


import java.util.ArrayList;

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.JTUStrConst;
import eo.ejb.cbm.entity.TU0021ETMsg;
import eo.ejb.cbm.entity.TU0021LE;
import eo.ejb.common.db.JTUejbTU0021DBABase;

/**
 * <p>
 * 同番移転制約部品クラスです。
 * </p>
 * @author FJ
 */
public class JTUejbTU0021KRCK
{

	/**
	 * 登録対象外になる現行レコードの同番移転ステータス
	 */
	private static final 	String[] ADD_ERR_STAT = new String[]{
		JTUStrConst.NTT_SEND_STAY
		, JTUStrConst.NTT_SEND_ZUMI
		, JTUStrConst.DOBANITEN_FIN
	};
	
	/**
	 * コンストラクタです。
	 */
	private JTUejbTU0021KRCK()
	{
	}
	
	/**
	 * 同番移転送信実績取消対象データのチェックを行う部品。
	 * @param inMsg 
	 * @param inContext 
	 * @param dobaniten_no 同番移転番号
	 * @return データの存在有無
	 */
	public static boolean isSendJskClCheck001(CAANMsg inMsg, AgentDispatchContext inContext
			, Object dobaniten_no)
	{
		if(dobaniten_no == null)
		{
			return false;
		}
		
		JTUejbTU0021DBABase base = new JTUejbTU0021DBABase();
		
		// 検索条件の設定
		CAANMsg searchMsg = new CAANMsg(TU0021ETMsg.class.getName());
		searchMsg.set(TU0021ETMsg.DOBANITEN_NO, dobaniten_no);
		
		// チェック対象データの取得
		CAANMsg outMsg = base.findByCurrent(searchMsg);

		if (outMsg == null)
		{
			return false;
		}
		
		String gene_add_dtm = outMsg.getString(TU0021ETMsg.GENE_ADD_DTM);
		
		// 検索条件の設定
		searchMsg = new CAANMsg(TU0021ETMsg.class.getName());
		searchMsg.set(TU0021ETMsg.SVC_KEI_UCWK_NO, outMsg.getString(TU0021ETMsg.SVC_KEI_UCWK_NO));
		searchMsg.set(TU0021ETMsg.HJIN_EO_YKAE_SVKEI_NO, outMsg.getString(TU0021ETMsg.HJIN_EO_YKAE_SVKEI_NO));
		searchMsg.set(TU0021ETMsg.MK_FLG, JTUStrConst.MK_FLG_YK);
		
		// 法人の場合は同番移転番号を条件に加える
		if(JTUStrConst.HOJIN.equals(outMsg.getString(TU0021ETMsg.HOJIN_KOJIN_CD)))
		{
			searchMsg.set(TU0021ETMsg.DOBANITEN_NO, outMsg.getString(TU0021ETMsg.DOBANITEN_NO));
		}

		// 同一サービスの一覧を取得
		CAANMsg[] outMsgList = null;
		try
		{
			outMsgList = new TU0021LE().findByCondition(searchMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		if(outMsgList == null || outMsgList.length == 0)
		{
			return false;
		}
		
		// 送信実績対象データを取得
		CAANMsg trgtMsg = null;
		for(CAANMsg msg : outMsgList)
		{
			if(trgtMsg == null 
					|| msg.getString(TU0021ETMsg.GENE_ADD_DTM).compareTo(trgtMsg.getString(TU0021ETMsg.GENE_ADD_DTM)) > 0)
			{
				trgtMsg = msg;
			}
		}
		
		// 送信実績対象データがチェック対象と同一であれば True
		if(dobaniten_no.equals(trgtMsg.getString(TU0021ETMsg.DOBANITEN_NO)) 
				&& gene_add_dtm.equals(trgtMsg.getString(TU0021ETMsg.GENE_ADD_DTM)))
		{
			return true;
		}
		
		return false;
		
	}
	
	
	/**
	 * 同番移転登録対象データのチェックを行う部品。
	 * @param inMsg 
	 * @param inContext 
	 * @param svc_kei_ucwk_no サービス契約内訳番号
	 * @param hjin_eo_ykae_svkei_no 法人eo読替サービス契約番号
	 * @return データの存在有無
	 */
	public static boolean isAddCheck001(CAANMsg inMsg, AgentDispatchContext inContext
			, Object svc_kei_ucwk_no, Object hjin_eo_ykae_svkei_no)
	{
		if(svc_kei_ucwk_no == null && hjin_eo_ykae_svkei_no == null)
		{
			return false;
		}
		
		// 検索条件の設定
		CAANMsg searchMsg = new CAANMsg(TU0021ETMsg.class.getName());
		
		// 検索条件の設定
		searchMsg.set(TU0021ETMsg.SVC_KEI_UCWK_NO, svc_kei_ucwk_no);
		searchMsg.set(TU0021ETMsg.HJIN_EO_YKAE_SVKEI_NO, hjin_eo_ykae_svkei_no);
		searchMsg.set(TU0021ETMsg.MK_FLG, JTUStrConst.MK_FLG_YK);

		// 同一サービスの一覧を取得
		CAANMsg[] outMsgList = null;
		try
		{
			outMsgList = new TU0021LE().findByCondition(searchMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 現行レコードが取得できなかった場合True
		if(outMsgList == null || outMsgList.length == 0)
		{
			return true;
		}
		
		// 同番移転番号の重複を取り除く
		ArrayList<String> dobanitenNoList = new ArrayList<String>();
		ArrayList<CAANMsg> curMsgList = new ArrayList<CAANMsg>();
		for(CAANMsg tu0011Msg: outMsgList)
		{
			if (!dobanitenNoList.contains(tu0011Msg.getString(TU0021ETMsg.DOBANITEN_NO)))
			{
				dobanitenNoList.add(tu0011Msg.getString(TU0021ETMsg.DOBANITEN_NO));
			}
		}
		
		// 同番移転番号から同番移転レコードのカレントを取得しリストに格納する
		CAANMsg outTU0011MsgCur = null;
		for(String dobanitenNo: dobanitenNoList)
		{
			searchMsg = new CAANMsg(TU0021ETMsg.class.getName());
			searchMsg.set(TU0021ETMsg.DOBANITEN_NO, dobanitenNo);
			outTU0011MsgCur = new JTUejbTU0021DBABase().findByCurrent(searchMsg);

			if(outTU0011MsgCur != null)
			{
				curMsgList.add(outTU0011MsgCur);
			}
		}
		
		// ステータスチェック
		for(CAANMsg dobanitenMsg : curMsgList)
		{
			if(!isRcntStatus(dobanitenMsg))
			{
				return false;
			}
		}
		
		return true;

	}
	
	/**
	 * 最新情報のステータス判定
	 * 「021：NTT送信待ち」
	 * 「022：NTT送信済み」
	 * 「023：同番移転結果不可」
	 * 「031：同番移転結果可」
	 * 「050：同番移転完了」
	 * 「090：同番移転取消」の場合False
	 * @param inCBSMsg
	 * @return boolean
	 */
	private static boolean isRcntStatus(CAANMsg inCBSMsg)
	{
		String stat = inCBSMsg.getString(TU0021ETMsg.DOBANITEN_STAT);
		
		for(String err_stat : ADD_ERR_STAT)
		{
			if(err_stat.equals(stat))
			{
				// エラー
				return false;
			}
		}
		
		// 正常
		return true;
	}

}
