/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JTUejbTU0011KRCK
*	ソースファイル名：JTUejbTU0011KRCK.java
*	作成者			：FJ
*	日付			：2011年06月14日
*＜機能概要＞
*	番ポ工事制約部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2011/06/14	FJ)楠神		新規作成
*	v3.00.00	2012/03/17	FJ)楠神		ANK-0045-00-00
*	v3.00.00	2012/03/17	FJ)楠神		ANK-0045-01-00
*	v3.00.00	2012/03/17	FJ)楠神		ANK-0079-01-00
*	v5.00.00	2013/09/12	FJ)高橋		OM-2013-0001811
*	v8.00.00	2014/04/09	FJ)高橋		OM-2014-0001489
*
**********************************************************************/

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.TU0011ETMsg;
import eo.ejb.cbm.entity.TU0011LE;
import eo.ejb.common.db.JTUejbTU0011DBABase;

/**
 * <p>
 * 番ポ工事制約部品クラスです。
 * </p>
 * @author FJ
 */
public class JTUejbTU0011KRCK
{

	/**
	 * 登録対象外になる現行レコードの番ポ工事ステータス
	 */
	private static final 	String[] ADD_ERR_STAT = new String[]{
		JTUStrConst.KOJI_KIBO_MI
		, JTUStrConst.TAJGS_CFM_NECESSARY
		, JTUStrConst.TAJGS_REQ_STAY
		, JTUStrConst.TAJGS_REQ_ZUMI
		, JTUStrConst.NTT_SHIN_STAY
		, JTUStrConst.NTT_SHIN_ZUMI
		, JTUStrConst.KOJI_JSSI_REQ_STAY
		, JTUStrConst.KOJI_JSSI_REQ_ZUMI
		, JTUStrConst.SOD_HAKKO_ZUMI
	};
	
	/**
	 * コンストラクタです。
	 */
	private JTUejbTU0011KRCK()
	{
	}
	
	/**
	 * 番ポ工事送信実績取消対象データのチェックを行う部品。
	 * @param inMsg 
	 * @param inContext 
	 * @param bmp_koji_no 番ポ工事番号
	 * @return データの存在有無
	 */
	public static boolean isSendJskClCheck001(CAANMsg inMsg, AgentDispatchContext inContext
			, Object bmp_koji_no)
	{
		if(bmp_koji_no == null)
		{
			return false;
		}
		
		JTUejbTU0011DBABase base = new JTUejbTU0011DBABase();
		
		// 検索条件の設定
		CAANMsg searchMsg = new CAANMsg(TU0011ETMsg.class.getName());
		searchMsg.set(TU0011ETMsg.BMP_KOJI_NO, bmp_koji_no);
		
		// チェック対象データの取得
		CAANMsg outMsg = base.findByCurrent(searchMsg);

		if (outMsg == null)
		{
			return false;
		}
		
		String gene_add_dtm = outMsg.getString(TU0011ETMsg.GENE_ADD_DTM);
		
		// 検索条件の設定
		searchMsg = new CAANMsg(TU0011ETMsg.class.getName());
		searchMsg.set(TU0011ETMsg.SVC_KEI_UCWK_NO, outMsg.getString(TU0011ETMsg.SVC_KEI_UCWK_NO));
		searchMsg.set(TU0011ETMsg.HJIN_EO_YKAE_SVKEI_NO, outMsg.getString(TU0011ETMsg.HJIN_EO_YKAE_SVKEI_NO));
		searchMsg.set(TU0011ETMsg.MK_FLG, JTUStrConst.MK_FLG_YK);
		
		// 法人の場合は番ポ工事番号を条件に加える
		if(JTUStrConst.HOJIN.equals(outMsg.getString(TU0011ETMsg.HOJIN_KOJIN_CD)))
		{
			searchMsg.set(TU0011ETMsg.BMP_KOJI_NO, outMsg.getString(TU0011ETMsg.BMP_KOJI_NO));
		}

		// 同一サービスの一覧を取得
		CAANMsg[] outMsgList = null;
		try
		{
			outMsgList = new TU0011LE().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(TU0011ETMsg.GENE_ADD_DTM).compareTo(trgtMsg.getString(TU0011ETMsg.GENE_ADD_DTM)) > 0)
			{
				trgtMsg = msg;
			}
		}
		
		// 送信実績対象データがチェック対象と同一であれば True
		if(bmp_koji_no.equals(trgtMsg.getString(TU0011ETMsg.BMP_KOJI_NO)) 
				&& gene_add_dtm.equals(trgtMsg.getString(TU0011ETMsg.GENE_ADD_DTM)))
		{
			return true;
		}
		
		return false;
		
	}
	
	
	/**
	 * 番ポ工事登録対象データのチェックを行う部品。
	 * @param inMsg 
	 * @param inContext 
	 * @param svc_kei_ucwk_no サービス契約内訳番号
	 * @param hjin_eo_ykae_svkei_no 法人eo読替サービス契約番号
	 * @param ntt_kei_tel_kaisen_no NTT契約電話回線番号
	 * @return データの存在有無
	 */
	public static boolean isAddCheck001(CAANMsg inMsg, AgentDispatchContext inContext
			, Object svc_kei_ucwk_no, Object hjin_eo_ykae_svkei_no, Object ntt_kei_tel_kaisen_no)
	{
		if(svc_kei_ucwk_no == null && hjin_eo_ykae_svkei_no == null)
		{
			return false;
		}
		
		// 検索条件の設定
		CAANMsg searchMsg = new CAANMsg(TU0011ETMsg.class.getName());
		
		// 検索条件の設定
		searchMsg.set(TU0011ETMsg.SVC_KEI_UCWK_NO, svc_kei_ucwk_no);
		searchMsg.set(TU0011ETMsg.HJIN_EO_YKAE_SVKEI_NO, hjin_eo_ykae_svkei_no);
		
		if(hjin_eo_ykae_svkei_no != null)
		{
			searchMsg.set(TU0011ETMsg.NTT_KEI_TEL_KAISEN_NO, ntt_kei_tel_kaisen_no);
		}
		
		searchMsg.set(TU0011ETMsg.MK_FLG, JTUStrConst.MK_FLG_YK);

		// 同一サービスの一覧を取得
		CAANMsg[] outMsgList = null;
		try
		{
			outMsgList = new TU0011LE().findByCondition(searchMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 現行レコードが取得できなかった場合True
		if(outMsgList == null || outMsgList.length == 0)
		{
			return true;
		}
		
		// 番ポ工事番号の重複を取り除く
		ArrayList<String> bmpKojiNoList = new ArrayList<String>();
		ArrayList<CAANMsg> curMsgList = new ArrayList<CAANMsg>();
		for(CAANMsg tu0011Msg: outMsgList)
		{
			if (!bmpKojiNoList.contains(tu0011Msg.getString(TU0011ETMsg.BMP_KOJI_NO)))
			{
				bmpKojiNoList.add(tu0011Msg.getString(TU0011ETMsg.BMP_KOJI_NO));
			}
		}
		
		// 番ポ工事番号から番ポ工事レコードのカレントを取得しリストに格納する
		CAANMsg outTU0011MsgCur = null;
		for(String bmpKojiNo: bmpKojiNoList)
		{
			searchMsg = new CAANMsg(TU0011ETMsg.class.getName());
			searchMsg.set(TU0011ETMsg.BMP_KOJI_NO, bmpKojiNo);
			outTU0011MsgCur = new JTUejbTU0011DBABase().findByCurrent(searchMsg);

			if(outTU0011MsgCur != null)
			{
				curMsgList.add(outTU0011MsgCur);
			}
		}
		
		// ステータスチェック
		for(CAANMsg bmpKojiMsg : curMsgList)
		{
			if(!isRcntStatus(bmpKojiMsg))
			{
				return false;
			}
		}
		
		return true;

	}
	
	/**
	 * 最新情報のステータス判定
	 * 「000：工事希望日未入力」
	 * 「010：他事業者確認要」
	 * 「011：他事業者依頼待ち」
	 * 「012：他事業者依頼済み」
	 * 「021：ＮＴＴ申請待ち」
	 * 「022：ＮＴＴ申請済み」
	 * 「031：工事実施依頼待ち」
	 * 「032：工事実施依頼済み」
	 * 「040：ＳＯＤ発行済み」の場合False
	 * @param inCBSMsg
	 * @return boolean
	 */
	private static boolean isRcntStatus(CAANMsg inCBSMsg)
	{
		String stat = inCBSMsg.getString(TU0011ETMsg.BMP_KOJI_STAT);
		
		for(String err_stat : ADD_ERR_STAT)
		{
			if(err_stat.equals(stat))
			{
				// エラー
				return false;
			}
		}
		
		// 正常
		return true;
	}

}
