/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C100KRCK
*   ソースファイル名：JEKK0081C100KRCK.java
*   作成者          ：富士通
*   日付            ：2011年10月07日
*＜機能概要＞
*   サービス契約手続中料金プラン変更の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/07  富士通      新規作成
*   v11.00.00   2015/01/10  富士通      OM-2014-0004026
*   v33.00.00   2017/07/26  FJ)中原    【ANK-3118-00-00】開通前かつ出荷完了後もコース変更可能とする。
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
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.KK0891ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C100CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * サービス契約手続中料金プラン変更の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C100KRCK
{

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 存在チェック) */
	private static final String[] KRCK_SVCKEI_EXISTS_ERR = {"EA", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(料金グループ 存在チェック) */
	private static final String[] KRCK_PRCGRP_EXISTS_ERR = {"EA", EKK0081C100CBSMsg.PRC_GRP_CD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(料金コース 存在チェック) */
	private static final String[] KRCK_PCRS_EXISTS_ERR = {"EA", EKK0081C100CBSMsg.PCRS_CD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(料金コース 存在チェック) */
	private static final String[] KRCK_PCRS_SBT_EXISTS_ERR = {"EC", EKK0081C100CBSMsg.PCRS_CD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(料金プラン 存在チェック) */
	private static final String[] KRCK_PPLAN_EXISTS_ERR = {"EB", EKK0081C100CBSMsg.PCRS_CD_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(提供方式契約 存在チェック) */
	private static final String[] KRCK_TKHOSHIKIKEI_EXISTS_ERR = {"EA", EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(申込明細 存在チェック) */
	private static final String[] KRCK_MSKMDTL_EXISTS_ERR = {"EA", EKK0081C100CBSMsg.MSKM_DTL_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(コース変更妥当性チェック（住変）) */
	private static final String[] KRCK_COURSE_CNG_VALID_JH_ERR = {"EB", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(コース変更妥当性チェック（新設）) */
	private static final String[] KRCK_COURSE_CNG_VALID_NEW_ERR = {"EC", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};
	
	/** 関連チェックエラーフラグ&エラー返却項目(PON種別妥当性チェック) */
	private static final String[] KRCK_PON_SBT_VALID_ERR = {"ED", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(マンション従量制可否チェック) */
	private static final String[] KRCK_MANS_JURYOSEI_KAHI_ERR = {"EB", EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO_ERR};

	// 2017/07/26 ANK-3118-00-00 ADD START
	/** 関連チェックエラーフラグ&エラー返却項目(ルーターの自動交換チェック) */
	private static final String[] KRCK_ROUTER_JIDO_CHG_ERR = {"EE", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};
	// 2017/07/26 ANK-3118-00-00 ADD END

	/** 状態遷移チェックエラーフラグ&エラー返却項目(サービス契約 状態チェック) */
	private static final String[] JSCK_STATUS_ERR = {"EA", EKK0081C100CBSMsg.SVC_KEI_NO_ERR};
	
	/** サービスコード インターネットサービス */
	private static final String SVCCD_NETSVC = "01";
	
	/** 料金グループコード eo光ネットホームタイプ */
	private static final String PRCGRPCD_NETHOME = "02";
	
	/** 料金グループコード eo光ネットメゾンタイプ */
	private static final String PRCGRPCD_NETMAISON = "03";
	
	/** 料金グループコード eo光ネットマンションタイプ */
	private static final String PRCGRPCD_NETMANS = "04";
	
	/** 異動区分 コース変更 */
	private static final String COURSE_CHANGE = "00009";
	
// OM-2014-0004026 2015/01/11 ADD START
	/** 異動区分 新規契約 */
	private static final String COURSE_NEWMSKM = "00001";
	
	/** 異動区分 住所変更 */
	private static final String COURSE_ADCHG = "00019";
	
	/** サービス契約ステータス 受付済*/
	private static final String SVC_KEI_STAT_UTZ = "010";
// OM-2014-0004026 2015/01/11 ADD END
	
	/**
	 * <p>
	 * 新しいJEKK0081C100KRCKを作成します。
	 * </p>
	 */
	public JEKK0081C100KRCK()
	{
	}

	/**
	 * <p>
	 * サービス契約手続中料金プラン変更の関連制約を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約関連チェック部品
		JKKejbKK0081KRCK kk0081KRCK = new JKKejbKK0081KRCK();

		// サービス契約番号
		String svcKeiNo = inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO);
		
		// サービス契約 存在チェック
		if (!kk0081KRCK.isExistsCurrent(inCBSMsg, svcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_EXISTS_ERR);
			return;
		}
		
		// 料金グループ関連チェック部品
		JKKejbKK0781KRCK kk0781KRCK = new JKKejbKK0781KRCK();
		
		String prcGrpCd = inCBSMsg.getString(EKK0081C100CBSMsg.PRC_GRP_CD);
		
		// 料金グループ 存在チェック
		if (!kk0781KRCK.isExistsNonGene(prcGrpCd))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_PRCGRP_EXISTS_ERR);
			return;
		}
		
		// 料金コース関連チェック部品
		JKKejbKK0791KRCK kk0791KRCK = new JKKejbKK0791KRCK();

		String pcrsCd = inCBSMsg.getString(EKK0081C100CBSMsg.PCRS_CD);

		// 料金コース 存在チェック
		if (!kk0791KRCK.isExistsNonGene(pcrsCd))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_PCRS_EXISTS_ERR);
			return;
		}
		
		// 料金コース 存在チェック
		if (!kk0791KRCK.isUsablePcrsSvcKei(pcrsCd))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_PCRS_SBT_EXISTS_ERR);
			return;
		}
		
		// 料金プラン関連チェック部品
		JKKejbKK0591KRCK kk0591KRCK = new JKKejbKK0591KRCK();

		String prcsCd = inCBSMsg.getString(EKK0081C100CBSMsg.PCRS_CD);
		String pplanCd = inCBSMsg.getString(EKK0081C100CBSMsg.PPLAN_CD);

		// 料金プラン 存在チェック
		if (!kk0591KRCK.isExistsYuko(prcsCd, pplanCd))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_PPLAN_EXISTS_ERR);
			return;
		}
		
		// 提供方式契約関連チェック部品
		JKKejbKK0891KRCK kk0891KRCK = new JKKejbKK0891KRCK();

		String tkHoshikiKeiNo = inCBSMsg.getString(EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO);

		// 提供方式契約 存在チェック
		if (!kk0891KRCK.isExistsYuko(tkHoshikiKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_TKHOSHIKIKEI_EXISTS_ERR);
			return;
		}
				
		// 申込明細関連チェック部品
		JKKejbKK0021KRCK kk0021KRCK = new JKKejbKK0021KRCK();

		String mskmDtlNo = inCBSMsg.getString(EKK0081C100CBSMsg.MSKM_DTL_NO);

		// 申込明細 存在チェック
		if (!kk0021KRCK.isExistsNonGene(mskmDtlNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MSKMDTL_EXISTS_ERR);
			return;
		}
		
		// 関連チェック用ETメッセージ
		CAANMsg kk0081 = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO));
		kk0081.set(KK0081ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0081C100CBSMsg.MSKM_DTL_NO));
		// 2017/07/26 ANK-3118-00-00 ADD START
		kk0081.set(KK0081ETMsg.PCRS_CD, inCBSMsg.getString(EKK0081C100CBSMsg.PCRS_CD));
		// 2017/07/26 ANK-3118-00-00 ADD END

		// サービス契約のカレントレコード取得
		CAANMsg curSvcKei = getCurSvcKei(inCBSMsg);
		String curSvcCd = null;
		String curIdoDiv = null;
// OM-2014-0004026 2015/01/11 ADD START
		String curSvcKeiStat = null;
// OM-2014-0004026 2015/01/11 ADD END

		if (null != curSvcKei)
		{
			curSvcCd = curSvcKei.getString(KK0081ETMsg.SVC_CD);
			curIdoDiv = curSvcKei.getString(KK0081ETMsg.IDO_DIV);
// OM-2014-0004026 2015/01/11 ADD START
			curSvcKeiStat =  curSvcKei.getString(KK0081ETMsg.SVC_KEI_STAT);
// OM-2014-0004026 2015/01/11 ADD END
		}

		if (isCheckCond(curSvcCd, prcGrpCd, svcKeiNo, curIdoDiv))
		{
// OM-2014-0004026 2015/01/11 MOD START
			if (curSvcKeiStat != null && !"".equals(curSvcKeiStat) && !SVC_KEI_STAT_UTZ.equals(curSvcKeiStat)) {
				// チェック条件を満たす場合
				// コース変更妥当性チェック（住変）
				if (!kk0081KRCK.isCrsCngValidJH(kk0081, inContext))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_COURSE_CNG_VALID_JH_ERR);
					return;
				}
	
				// コース変更妥当性チェック（新設）
				if (!kk0081KRCK.isCrsCngValidNew(kk0081, inContext))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_COURSE_CNG_VALID_NEW_ERR);
					return;
				}
	
				// 2017/07/26 ANK-3118-00-00 ADD START
				// ルーターの自動交換チェック
				if (!kk0081KRCK.isChkRouterJidoChg(kk0081, inContext))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_ROUTER_JIDO_CHG_ERR);
					return;
				}
				// 2017/07/26 ANK-3118-00-00 ADD END
	
				// PON種別妥当性チェック
				if (!kk0081KRCK.isPonSbtValid(curSvcKei, inContext))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_PON_SBT_VALID_ERR);
					return;
				}
			}
			else
			{
				// 受付済の場合は上記
			}
// OM-2014-0004026 2015/01/11 MOD END
		}

		// 関連チェック用ETメッセージ
		CAANMsg kk0891 = new CAANMsg(KK0891ETMsg.class.getName());
		kk0891.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO));

		// "提供方式契約番号"、"料金コースコード"、"料金プランコード"が設定されている且"料金グループコード"が「ｅｏ光ネットマンションタイプ」である場合
		if (!inCBSMsg.isNull(EKK0081C100CBSMsg.TK_HOSHIKI_KEI_NO) && null != pplanCd && PRCGRPCD_NETMANS.equals(prcGrpCd))
		{
			// 提供方式契約番号に紐付く提供方式契約の「eo光ネット従量プラン申込可否」が"0"(否)である且
			// 料金コースコード・料金グループコードに紐付く料金プランの「eo光ネット料金プラン体系識別コード」が"1"(従量制)の場合、エラー
			if (!JKKModelCommon.isMansJuryoseiKahiChkKK0891(kk0891, inContext, pcrsCd, pplanCd))
			{
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MANS_JURYOSEI_KAHI_ERR);
				return;
			}
		}
		
		// サービス契約状態遷移チェック用ETメッセージ
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(JCMConstants.TEMPLATE_ID_KEY, inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO));
		
		// サービス契約 状態チェック
		if (!JKKModelCommon.checkStateTransitionKK0081(inETMsg, inContext))
		{
			setErrInfo(inCBSMsg, StatusCodes.STATUSTRANS_ERR, JSCK_STATUS_ERR);
			return;			
		}
	}
	
	/**
	 * <p>
	 * 以下のチェックのチェック条件を判定します。
	 * <br>・コース変更妥当性チェック（住変）
	 * <br>・コース変更妥当性チェック（新設）
	 * <br>・PON種別妥当性チェック
	 * </p>
	 * @param svcCd サービスコード
	 * @param prcGrpCd 料金グループコード
	 * @param svcKeiNo サービス契約番号
	 * @param idoDiv   異動区分
	 * @return サービス契約番号  ：設定されている
	 *          サービスコード    ：「インターネットサービス」
	 *          料金グループコード：「eo光ネットホームタイプ」または、「eo光ネットメゾンタイプ」
	 *          異動区分          ：コース変更
	 *          上記条件を満たす場合、trueを返却
	 *          それ以外の場合、falseを返却
	 */
	private boolean isCheckCond(String svcCd, String prcGrpCd, String svcKeiNo, String idoDiv)
	{
		// サービス契約番号が設定されていない場合、falseを返却
		if (null == svcKeiNo)
		{
			return false;
		}

		// サービスコードが「インターネットサービス」以外の場合、falseを返却
		if (!SVCCD_NETSVC.equals(svcCd))
		{
			return false;
		}

		// 料金グループコードが「eo光ネットホームタイプ」、「eo光ネットメゾンタイプ」以外の場合、falseを返却
		if (!PRCGRPCD_NETHOME.equals(prcGrpCd) && !PRCGRPCD_NETMAISON.equals(prcGrpCd))
		{
			return false;
		}
		
		// 異動区分が「コース変更」以外の場合、falseを返却
// OM-2014-0004026 2015/01/11 DEL START
//		if (!COURSE_CHANGE.equals(idoDiv))
//		{
//			return false;
//		}
// OM-2014-0004026 2015/01/11 DEL END

		// 指定された条件に一致する場合、trueを返却
		return true;
	}

	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return サービス契約番号が一致するサービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKei(CAANMsg inCBSMsg)
	{
		// サービス契約のカレントレコード取得
		CAANMsg conditionETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		conditionETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C100CBSMsg.SVC_KEI_NO));
		conditionETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		return new JKKejbKK0081DBABase().findByCurrent(conditionETMsg);
	}

	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;
		
	}

}

