/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0081C200KRCK
*	ソースファイル名：JEKK0081C200KRCK.java
*	作成者			：EK911024
*	日付			：2013年05月21日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ4.00.00   2013/05/21  FJ)寺本     IT1-2013-0001205
*   ｖ5.00.00    2013/11/26  FJ)寺園　　 OM-2013-0004469
*   ｖ10.00.00   2014/08/01  FJ)齋藤　　ANK-1918-00-00 ＵＳ管理Ｓ向けｅｏ顧客ＳのＩ／Ｆ改修
*   ｖ10.01.00   2014/08/25  FJ)齋藤　　IT1-2014-0000294 マンション撤去工事案件が仕掛中なのに回復できてしまった。
*
********************************************************************************/

package eo.ejb.common.entity;

import java.util.ArrayList;
import java.util.HashMap;

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.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0881ETMsg;
import eo.ejb.cbm.entity.KK0891ETMsg;
import eo.ejb.cbm.entity.KK0911ETMsg;
import eo.ejb.cbm.entity.KU0011ETMsg;
import eo.ejb.cbm.entity.KU0011LE;
import eo.ejb.cbs.cbsmsg.EKK0081C200CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0881DBABase;
import eo.ejb.common.db.JKKejbKK0891DBABase;
import eo.ejb.common.db.JKKejbKK0911DBABase;
import eo.ejb.common.db.JKKejbKU0011DBABase;

/**
 * <p>
 * サービス契約回復の関連チェッククラスです。
 * </p>
 * @author 富士通
 */

public class JEKK0081C200KRCK
{
	/** 工事案件ステータス */
	private static final ArrayList<String> KOJIAK_STAT = new ArrayList<String>();
	static
	{
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_REQ_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_TAKCHO_FIN_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_KOCOMP_KETEI_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_TKKIKI_RSV_ADD_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_KR_KEY_HAK_REQ_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_GEMBA_WORK_FIN_ZM);
		KOJIAK_STAT.add(JKKModelConst.KOJIAK_STAT_KOJI_FIN_ZM);
	}
	//ANK-1918-00-00 ADD START
	/** マンション工事案件状態コード */
	private static final ArrayList<String> MANS_KOJIAK_CD = new ArrayList<String>();
	static
	{
		MANS_KOJIAK_CD.add(JKKModelConst.KOJIAK_STAT_REQ_ZM);
		MANS_KOJIAK_CD.add(JKKModelConst.KOJIAK_STAT_KOCOMP_KETEI_ZM);
		MANS_KOJIAK_CD.add(JKKModelConst.KOJIAK_STAT_KOJI_FIN_ZM);
	}
	//ANK-1918-00-00 ADD END

	/**
	 * コンストラクタ
	 */
	public JEKK0081C200KRCK()
	{
	}

	/**
	 * サービス契約回復の関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0081C200KRCK.execKRCK");

		// ステータス
		int rtn = 0;
		
		rtn = execEKK0081C200_KR1(inCBSMsg, inContext, "EE");
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0081C200KRCK.execKRCK");
	}
		
	/**
	 * EKK0081C200_制約ＮＯ1（関連）チェック
	 * 回復時工事案件ステータスチェックを行う
	 *
	 * @param  inCBSMsg チェック対象のCBSMsg(EKK0081C190CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag ERRフラグ
	 * @return result チェック結果
	 */
	private int execEKK0081C200_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// リターン初期値変数
		int result = 0;
//IT1-2014-0000294 MOD START
		//ANK-1918-00-00 DEL START
		// 入力の最新基本工事案件番号または入力のサービス契約番号が未設定の場合
		if (inCBSMsg.isNull(EKK0081C200CBSMsg.RCNT_KIHON_KOJIAK_NO) 
				|| inCBSMsg.isNull(EKK0081C200CBSMsg.SVC_KEI_NO))
		{
			// チェック正常で終了
			return result;
		}
//IT1-2014-0000294 MOD END
//
//		String svcKeiNo = inCBSMsg.getString(EKK0081C200CBSMsg.SVC_KEI_NO); // サービス契約番号
//		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg); // 運用日付
//
//		// サービス契約番号に紐付くサービス契約のカレントレコードを取得します
//		CAANMsg kk0081CurrentInfo = new JKKejbKK0081DBABase().getKK0081Current(svcKeiNo, opeDate);
//		//ANK-1918-00-00 DEL END
		//ANK-1918-00-00 ADD START
		String svcKeiNo = inCBSMsg.getString(EKK0081C200CBSMsg.SVC_KEI_NO); // サービス契約番号
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg); // 運用日付
//IT1-2014-0000294 DEL START
//		//入力のサービス契約番号が未設定の場合
//		if(inCBSMsg.isNull(EKK0081C200CBSMsg.SVC_KEI_NO))
//		{
//			// チェック正常で終了
//			return result;
//		}
//IT1-2014-0000294 DEL END
		
		// サービス契約番号に紐付くサービス契約のカレントレコードを取得します
		CAANMsg kk0081CurrentInfo = new JKKejbKK0081DBABase().getKK0081Current(svcKeiNo, opeDate);
		//マンショングローバル・プライベートフラグ
		boolean mansGloPriFlg = false;	
		
		if (!kk0081CurrentInfo.isNull(KK0081ETMsg.TK_HOSHIKI_KEI_NO))
		{
			// サービス契約.提供方式契約番号に紐付く提供方式契約を検索し、提供方式契約.回線使用契約番号に紐付く回線使用契約を検索し
			// 回線使用契約.マンションコースコードに紐付くマンションコースを検索する
			CAANMsg kk0891info = new JKKejbKK0891DBABase().getKK0891PrimaryInfo(kk0081CurrentInfo.getString(KK0081ETMsg.TK_HOSHIKI_KEI_NO));
			CAANMsg kk0881info = new JKKejbKK0881DBABase().getKK0881PrimaryInfo(kk0891info.getString(KK0891ETMsg.KAISEN_USE_KEI_NO));
			CAANMsg kk0911info = new JKKejbKK0911DBABase().getKK0911Current(kk0881info.getString(KK0881ETMsg.MANSION_COURSE_CD), opeDate);

			// マンションコース.IP払出コードを取得する
			String ipHradsiCd = kk0911info.getString(KK0911ETMsg.IP_HRADSI_CD);
			
			// IP払出コードが"プライベート"または"グローバル"の場合
			if (JKKModelConst.IP_HRADSI_CD_PRIVATE.equals(ipHradsiCd) || JKKModelConst.IP_HRADSI_CD_GLOBAL.equals(ipHradsiCd))
			{
				//マンショングローバル・プライベートフラグをオン
				mansGloPriFlg = true;
			}
		}
//IT1-2014-0000294 DEL START
//		//マンショングローバル・プライベート以外の場合
//		if(!mansGloPriFlg)
//		{
//
//			// 入力の最新基本工事案件番号または入力のサービス契約番号が未設定の場合
//			if (inCBSMsg.isNull(EKK0081C200CBSMsg.RCNT_KIHON_KOJIAK_NO) 
//					|| inCBSMsg.isNull(EKK0081C200CBSMsg.SVC_KEI_NO))
//			{
//				// チェック正常で終了
//				return result;
//			}
//		}
//IT1-2014-0000294 DEL END
		//ANK-1918-00-00 ADD END
		// サービス解約理由コードが"02"(強制解約)の場合
		if (JKKModelConst.SVC_DLRE_CD_KSI_DSL.equals(kk0081CurrentInfo.getString(KK0081ETMsg.SVC_DLRE_CD)))
		{
			// チェック正常で終了
			return result;
		}
		
		// サービスコードを取得します
		String svcCd = kk0081CurrentInfo.getString(KK0081ETMsg.SVC_CD);

		// サービスコード「01:インターネットサービス」または「02:電話サービス」以外の場合
		if (!(JKKModelConst.SVC_CD_NET.equals(svcCd) || JKKModelConst.SVC_CD_TEL.equals(svcCd)))
		{
			// チェック正常で終了する
			return result;
		}
//ANK-1918-00-00 DEL START
//		// サービス契約のカレントに提供方式契約番号が設定されている場合
//		if (!kk0081CurrentInfo.isNull(KK0081ETMsg.TK_HOSHIKI_KEI_NO))
//		{
//			// サービス契約.提供方式契約番号に紐付く提供方式契約を検索し、提供方式契約.回線使用契約番号に紐付く回線使用契約を検索し
//			// 回線使用契約.マンションコースコードに紐付くマンションコースを検索する
//			CAANMsg kk0891info = new JKKejbKK0891DBABase().getKK0891PrimaryInfo(kk0081CurrentInfo.getString(KK0081ETMsg.TK_HOSHIKI_KEI_NO));
//			CAANMsg kk0881info = new JKKejbKK0881DBABase().getKK0881PrimaryInfo(kk0891info.getString(KK0891ETMsg.KAISEN_USE_KEI_NO));
//			CAANMsg kk0911info = new JKKejbKK0911DBABase().getKK0911Current(kk0881info.getString(KK0881ETMsg.MANSION_COURSE_CD), opeDate);
//
//			// マンションコース.IP払出コードを取得する
//			String ipHradsiCd = kk0911info.getString(KK0911ETMsg.IP_HRADSI_CD);
//			
//			// IP払出コードが"プライベート"または"グローバル"の場合
//			if (JKKModelConst.IP_HRADSI_CD_PRIVATE.equals(ipHradsiCd) || JKKModelConst.IP_HRADSI_CD_GLOBAL.equals(ipHradsiCd))
//			{
//				// チェック正常で終了する
//				return result;
//			}
//		}
//ANK-1918-00-00 DEL END
//ANK-1918-00-00 ADD START
//IT1-2014-0000294 DEL START
//		if(!mansGloPriFlg)
//			{
//IT1-2014-0000294 DEL END
		//ANK-1918-00-00 ADD END
			// 入力の最新基本工事案件番号で工事案件のレコードを取得する
			CAANMsg searchKey = new CAANMsg(KU0011ETMsg.class.getName());
			searchKey.set(KU0011ETMsg.UPD_TRGT_KOJIAK_NO, inCBSMsg.getString(EKK0081C200CBSMsg.RCNT_KIHON_KOJIAK_NO));
			searchKey.set(KU0011ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

			try
			{
				// 工事案件を全件検索する
				CAANMsg[] ku0011infoList = new KU0011LE().findByCondition(searchKey);
				
				// 検索結果が0件の場合
				if (ku0011infoList.length == 0)
				{
					// チェック正常で終了する
					return result;
				}
				
				// 工事案件が取得できた数分繰り返し
				for (CAANMsg ku0011info : ku0011infoList)
				{
					// 工事案件ステータスが"依頼済"〜"工事完了"以外の場合
					//IT1-2014-0000294 ADD START
					if(!mansGloPriFlg)
					{
					//IT1-2014-0000294 ADD END
						if (!KOJIAK_STAT.contains(ku0011info.getString(KU0011ETMsg.KOJIAK_STAT)))
						{
							continue;
						}
					//IT1-2014-0000294 ADD START
					}
					else
					{
						// マンション工事案件状態コードが"依頼済"〜"工事会社決定済"以外の場合
						if (!MANS_KOJIAK_CD.contains(ku0011info.getString(KU0011ETMsg.MANS_KOJIAK_STAT_CD)))
						{
							continue;
						}
					}
					//IT1-2014-0000294 ADD END
		
					// 工事案件種別コードが"撤去(解約)"以外の場合
					if (!JKKModelConst.KOJIAK_SBT_CD_DSL.equals(ku0011info.getString(KU0011ETMsg.KOJIAK_SBT_CD)))
					{
						continue;
					}
						
					// ここまで到達するとエラー
					inCBSMsg.set(EKK0081C200CBSMsg.SVC_KEI_NO_ERR, errFlag);
					if("W".equals(errFlag.substring(0, 1)))
						{
							result = StatusCodes.WARNING;
						}
						else 
						{
							result = StatusCodes.RELATION_ERR;
						}
					}
			}
			catch (CAANException ce)
			{
				throw new CAANRuntimeException(ce);
			}
				
		//ANK-1918-00-00 ADD START
//IT1-2014-0000294 DEL START
//		}
//		else
//		//マンショングローバル・プライベートの場合別のチェック条件を適用する
//		{
//			//IT1-2014-0000294 ADD START
//			// 入力の最新基本工事案件番号で工事案件のレコードを取得する
//			CAANMsg searchKey = new CAANMsg(KU0011ETMsg.class.getName());
//			searchKey.set(KU0011ETMsg.UPD_TRGT_KOJIAK_NO, inCBSMsg.getString(EKK0081C200CBSMsg.RCNT_KIHON_KOJIAK_NO));
//			searchKey.set(KU0011ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);
//			//IT1-2014-0000294 ADD END
//			//IT1-2014-0000294 DEL START
//			// 個別検索条件マップ
//			HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
//			
//			// 追加検索条件：工事案件.工事案件種別コード = "撤去(解約)"
//			String[] kojiakSbtCdLsit = {JKKModelConst.KOJIAK_SBT_CD_DSL
//			
//			};
//			searchJknMap.put(KU0011ETMsg.KOJIAK_SBT_CD, kojiakSbtCdLsit);
//			
//			// 追加検索条件：工事案件.工事案件ステータス = "登録済"
//			String[] kojiakStatList = {
//						JKKModelConst.KOJIAK_STAT_ADD_ZM,
//			};
//			searchJknMap.put(KU0011ETMsg.KOJIAK_STAT, kojiakStatList);
//			// 該当の「サービス契約」に紐づく「工事案件」(撤去(解約))を取得する。
//			JKKejbKU0011DBABase ku0011Dba = new JKKejbKU0011DBABase();
//			CAANMsg[] ku0011infoList = ku0011Dba.getKU0011bySvcKei(svcKeiNo, searchJknMap, opeDate, "1");
//			
//			// 該当の「工事案件」(撤去(解約)が存在しない場合チェックＯＫ
//			if (ku0011infoList.length == 0)
//			{
//				return result;
//			}
//			for (CAANMsg ku0011info : ku0011infoList)
//			{
//				// マンション工事案件状態コードが"依頼済"〜"工事会社決定済"以外の場合
//				if (!MANS_KOJIAK_CD.contains(ku0011info.getString(KU0011ETMsg.MANS_KOJIAK_STAT_CD)))
//				{
//					continue;
//				}
//
//				// 工事案件種別コードが"撤去(解約)"以外の場合
//				if (!JKKModelConst.KOJIAK_SBT_CD_DSL.equals(ku0011info.getString(KU0011ETMsg.KOJIAK_SBT_CD)))
//				{
//					continue;
//				}
//				
//				// ここまで到達するとエラー
//				inCBSMsg.set(EKK0081C200CBSMsg.SVC_KEI_NO_ERR, errFlag);
//				if("W".equals(errFlag.substring(0, 1)))
//				{
//					result = StatusCodes.WARNING;
//				}
//				else 
//				{
//					result = StatusCodes.RELATION_ERR;
//				}
//			}
//		}
//		//ANK-1918-00-00 ADD END
//IT1-2014-0000294 DEL END
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		// 正常終了
		return result;
	}
}
