/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKK0161C210KRCK
*	ソースファイル名：JKK0161C210KRCK.java
*	作成者			：EK911024
*	日付			：2013年05月21日
*＜機能概要＞
*	関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ4.00.00   2013/05/21  FJ)寺本     IT1-2013-0001205
*   ｖ5.00.00    2013/11/28  FJ)寺園　　 OM-2013-0004469
*
********************************************************************************/

package eo.ejb.common.entity;

import java.util.ArrayList;

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.KK0161ETMsg;
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.EKK0161C210CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0881DBABase;
import eo.ejb.common.db.JKKejbKK0891DBABase;
import eo.ejb.common.db.JKKejbKK0911DBABase;

/**
 * <p>
 * サービス契約内訳回復関連チェッククラスです。
 * ＜メソッド一覧＞
 * </p>
 * @author 富士通
 */

public class JEKK0161C210KRCK
{

	/** 異動予約コード：サービス解約 */
	static final String IDO_RSV_CD_SVC_DSL = "007";
	/** 異動予約状態コード：未反映 */
	static final String IDO_RSV_STAT_CD_MIHANEI = "00"; 
	/** 異動予約状態コード：予約手続中 */
	static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 
	/** 工事案件ステータス */
	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);
	}

	/**
	 * コンストラクタ
	 */

	public JEKK0161C210KRCK()
	{
	}

	/**
	 * サービス契約内訳回復関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */

	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKK0161C210KRCK.execKRCK");
		
		// ステータス
		int rtn = 0;
		
		rtn = execEKK0161C210_KR1(inCBSMsg, inContext, "ED");
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JKK0161C210KRCK.execKRCK");
	}
		
	
	/**
	 * EKK0161C210_制約ＮＯ２（関連）チェック
	 *
	 * @param  inCBSMsg  チェック対象のCBSMsg(KK0161CBSMsg)
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param  errFlag   ERRフラグ
	 * @return result    チェック結果
	 */
	private int execEKK0161C210_KR1(CAANMsg inCBSMsg, AgentDispatchContext inContext, String errFlag)
	{
		// ステータス
		int result = 0;

		// 入力の最新基本工事案件番号または入力のサービス契約内訳番号が未設定の場合
		if (inCBSMsg.isNull(EKK0161C210CBSMsg.RCNT_KIHON_KOJIAK_NO) 
				|| inCBSMsg.isNull(EKK0161C210CBSMsg.SVC_KEI_UCWK_NO))
		{
			// チェック正常で終了
			return result;
		}

		// サービス契約内訳メッセージ生成
		CAANMsg svcKeiUcwkMsg = new CAANMsg(KK0161ETMsg.class.getName());

		// サービス契約内訳設定
		svcKeiUcwkMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(EKK0161C210CBSMsg.SVC_KEI_UCWK_NO));
		svcKeiUcwkMsg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約内訳カレント検索を行う
		CAANMsg curSvcKeiucwkMsg = new JKKejbKK0161DBABase().findByCurrent(svcKeiUcwkMsg);

		if (svcKeiUcwkMsg == null)
		{
			return result;
		}

		// サービス解約理由コードが"02"(強制解約)の場合
		if (JKKModelConst.SVC_DLRE_CD_KSI_DSL.equals(curSvcKeiucwkMsg.getString(KK0161ETMsg.SVC_DLRE_CD)))
		{
			// チェック正常で終了
			return result;
		}

		String svcKeiNo = curSvcKeiucwkMsg.getString(KK0161ETMsg.SVC_KEI_NO);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg); // 運用日付

		// サービス契約番号に紐付くサービス契約のカレントレコードを取得します
		CAANMsg kk0081CurrentInfo = new JKKejbKK0081DBABase().getKK0081Current(svcKeiNo, opeDate);
		
		// サービスコードを取得します
		String svcCd = kk0081CurrentInfo.getString(KK0081ETMsg.SVC_CD);

		// サービスコード「01:インターネットサービス」または「02:電話サービス」以外の場合
		if (!(JKKModelConst.SVC_CD_NET.equals(svcCd) || JKKModelConst.SVC_CD_TEL.equals(svcCd)))
		{
			// チェック正常で終了する
			return result;
		}
		
		// サービス契約のカレントに提供方式契約番号が設定されている場合
		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;
			}
		}
		
		// 入力の最新基本工事案件番号で工事案件のレコードを取得する
		CAANMsg searchKey = new CAANMsg(KU0011ETMsg.class.getName());
		searchKey.set(KU0011ETMsg.UPD_TRGT_KOJIAK_NO, inCBSMsg.getString(EKK0161C210CBSMsg.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)
			{
				// 工事案件ステータスが"依頼済"〜"工事完了"以外の場合
				if (!KOJIAK_STAT.contains(ku0011info.getString(KU0011ETMsg.KOJIAK_STAT)))
				{
					continue;
				}

				// 工事案件種別コードが"撤去(解約)"以外の場合
				if (!JKKModelConst.KOJIAK_SBT_CD_DSL.equals(ku0011info.getString(KU0011ETMsg.KOJIAK_SBT_CD)))
				{
					continue;
				}
				// ここまで到達するとエラー
				inCBSMsg.set(EKK0161C210CBSMsg.SVC_KEI_UCWK_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);
		}
		// ステータスのセット
		if (result > inCBSMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		return result;
	}	
}