/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbSmtValMskmChecker
*	ソースファイル名：JKKejbSmtValMskmChecker.java
*	作成者			：富士通
*	日付			：2012年8月14日
*＜機能概要＞
*	スマートバリュー申込判定処理部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/08/14	FJ)			新規作成
*	v12.00.00	2015/02/12	FJ)江藤		OM-2014-0003335
*	v29.00.00	2017/02/17	FJ)江藤		OM-2015-0003095
*	v73.00.00	2024/12/04	FJ)柴田	  【ANK-4493-00-00】光配線マンションのコースアップ対応
*
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.model.base.CAANMsg;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0591ETMsg;
import eo.ejb.cbm.entity.KK0591LE;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * スマートバリュー申込判定処理部品クラスです
 * </p>
 * @author 富士通
 */
public class JKKejbSmtValMskmChecker 
{

	/** サービス契約ステータス: 休止・中断中 */
	private static final String SVC_KEI_STAT_STOP ="210";
	/** サービス契約ステータス: 解約 */
	private static final String SVC_KEI_STAT_TERM ="910";
	/** サービス契約ステータス: キャンセル済 */
	private static final String SVC_KEI_STAT_CNCL ="920";

	/** 休止中断コード: 中断中 */
	private static final String PAUSE_STP_CD_STOP ="02";
	
	/** eo光ネット料金プラン体系識別コード: 定額制 */
	private static final String EOHNT_PPLAN_TIKI_SKCD_TEIGAKU = "0";
	
	/** 料金グループコード: ｅｏ光ネットホームタイプ */
	private static final String PRC_GRP_CD_HOME = "02";
	/** 料金グループコード: ｅｏ光ネットメゾンタイプ */
	private static final String PRC_GRP_CD_MSN = "03";
	/** 料金グループコード: ｅｏ光ネットマンションタイプ */
	private static final String PRC_GRP_CD_MAN = "04";
	/** 料金グループコード: ｅｏ光電話 */
	private static final String PRC_GRP_CD_TEL = "10";
	
	/** 料金コースコード: マンションタイプ グローバル 100M VDSL2 */
	private static final String PCRS_CD_G100M_V2 = "A50";
	/** 料金コースコード: マンションタイプ グローバル 100M VDSL3 */
	private static final String PCRS_CD_G100M_V3 = "A51";
	/** 料金コースコード: マンションタイプ グローバル 100M VDSL4 */
	private static final String PCRS_CD_G100M_V4 = "A52";
	/** 料金コースコード: マンションタイプ グローバル 100M VDSL5 */
	private static final String PCRS_CD_G100M_V5 = "A53";
	/** 料金コースコード: マンションタイプ グローバル 100M イーサネット */
	private static final String PCRS_CD_G100M = "A54";
	/** 料金コースコード: マンションタイプ グローバル 1ギガ イーサネット */
	private static final String PCRS_CD_G1G = "A55";
	/** 料金コースコード: マンションタイプ 光配線 100M */
	private static final String PCRS_CD_L100M = "A56";
	/** 料金コースコード: マンションタイプ 光配線 1ギガ */
	private static final String PCRS_CD_L1G = "A57";
	// ANK-4493-00-00 ADD START
	/** 料金コースコード: マンションタイプ 光配線 10ギガ */
	private static final String PCRS_CD_L10G = "A74";
	// ANK-4493-00-00 ADD END
	/** 料金コースコード:マンションタイプ　グローバル　１００Ｍプレミアム　ＶＤＳＬ */
	private static final String PCRS_CD_100MVDSL = "A69";
	/** 料金コースコード: マンションタイプ　グローバル　１００Ｍプレミアム　イーサネット */
	private static final String PCRS_CD_100METHE = "A70";
	/** 料金コースコード: マンションタイプ　光配線　１００Ｍプレミアム */
	private static final String PCRS_CD_100MPRE = "A71";
	/** 料金コースコード: マンションタイプ　グローバル　１００Ｍ　ＤＯＣＳＩＳ */
	private static final String PCRS_CD_100MDOC = "A79";
	/** 料金コースコード: マンションタイプ　グローバル　１００Ｍプレミアム　ＤＯＣＳＩＳ */
	private static final String PCRS_CD_100MPREDOC = "A80";

	
	/** 料金グループコード: ｅｏ光ネット一覧 */
	private static final String[] PRC_GRP_EO_L_LIST = {PRC_GRP_CD_HOME, PRC_GRP_CD_MSN, PRC_GRP_CD_MAN};

	/** 料金コースコード: マンションタイプ一覧 */
	// ANK-4493-00-00 MOD START
//	private static final String[] PCRS_CD_LIST = {PCRS_CD_G100M_V2, PCRS_CD_G100M_V3, PCRS_CD_G100M_V4, PCRS_CD_G100M_V5, PCRS_CD_G100M, PCRS_CD_G1G,
//			PCRS_CD_L100M, PCRS_CD_L1G, PCRS_CD_100MVDSL, PCRS_CD_100METHE, PCRS_CD_100MPRE, PCRS_CD_100MDOC, PCRS_CD_100MPREDOC};
	private static final String[] PCRS_CD_LIST = {PCRS_CD_G100M_V2, PCRS_CD_G100M_V3, PCRS_CD_G100M_V4, PCRS_CD_G100M_V5, PCRS_CD_G100M, PCRS_CD_G1G,
		PCRS_CD_L100M, PCRS_CD_L1G, PCRS_CD_L10G, PCRS_CD_100MVDSL, PCRS_CD_100METHE, PCRS_CD_100MPRE, PCRS_CD_100MDOC, PCRS_CD_100MPREDOC};
	// ANK-4493-00-00 MOD END
	
	/**
	 * <p>
	 * 新しいJKKejbSmtValMskmCheckerのコンストラクタを作成します。
	 * </p>
	 */
	public JKKejbSmtValMskmChecker()
	{
	}

	/**
	 * <p>
	 * スマートバリュー申込可否判定処理
	 * </p>
	 * @param svcKeiNo 対象となるサービス契約番号
	 * @param baseYmd 対象となる基準年月日
	 * @param eventID イベントID
	 * @return スマートバリュー申込可否結果 true:申込対象 false:申込対象外
	 */
	// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD START
//	public boolean isSmtvlMskmKahi(String svcKeiNo, String baseYmd)
	public boolean isSmtvlMskmKahi(String svcKeiNo, String baseYmd, String eventID)
	// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD END
	{

		// 返却値
		boolean retSts = false;

		// eo光ネット料金プラン体系識別コードの一時保存
		String retPplnTikiskCd = null;

		// サービス契約スキーマ制約部品
		JKKejbKK0081DBABase kk81le = new JKKejbKK0081DBABase();

		// ETメッセージ（サービス契約）
		CAANMsg inMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inMsg.set(KK0081ETMsg.RSV_APLY_YMD, baseYmd);

		// サービス契約のカレントレコードの情報を確認する
		CAANMsg rsltMsg = kk81le.findByCurrent(inMsg);

		//存在しない場合
		if (rsltMsg == null)
		{
			return true;
		}

		// 存在する場合
		for (int i = 0; i < PRC_GRP_EO_L_LIST.length; i++)
		{

			if (PRC_GRP_EO_L_LIST[i].equals(rsltMsg.getString(KK0081ETMsg.PRC_GRP_CD)))
			{
				// 料金グループコードがeo光ネット系の場合、 eo光ネット料金プラン体系識別コードを取得する
				retPplnTikiskCd = getEohntPplanTikiSkcd(rsltMsg.getString(KK0081ETMsg.PCRS_CD), rsltMsg.getString(KK0081ETMsg.PPLAN_CD));
				break;
			}
		}

		// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD START
//		if (isTrgtKeiNaiyo(rsltMsg.getString(KK0081ETMsg.PRC_GRP_CD), rsltMsg.getString(KK0081ETMsg.PCRS_CD), retPplnTikiskCd))
		if (isTrgtKeiNaiyo(rsltMsg.getString(KK0081ETMsg.PRC_GRP_CD), rsltMsg.getString(KK0081ETMsg.PCRS_CD), retPplnTikiskCd, eventID))
		// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD END
		{
			// スマートバリュー申込可能な契約内容であった場合、スマートバリュー申込可能な契約状態であるかを確認する

			retSts = isTrgtKeiSts(rsltMsg.getString(KK0081ETMsg.SVC_KEI_STAT), rsltMsg.getString(KK0081ETMsg.PAUSE_STP_CD));
		}

		// スマートバリュー申込可否結果を返却する
		return retSts;
	}

	/**
	 * <p>
	 * スマートバリュー申込可能な契約内容であるか判断する
	 * </p>
	 * @param prcGrpCd 対象となる料金グループコード
	 * @param pcrsCd   対象となる料金コースコード
	 * @param retPplnTikiskCd 対象となるeo光ネット料金プラン体系識別コード
	 * @param eventID イベントID
	 * @return 契約内容判断結果 true:申込対象 false:申込対象外
	 */
	// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD START
//	private boolean isTrgtKeiNaiyo(String prcGrpCd, String pcrsCd, String retPplnTikiskCd)
	private boolean isTrgtKeiNaiyo(String prcGrpCd, String pcrsCd, String retPplnTikiskCd, String eventID)
	// v12.00.00 OM-2014-0003335対応 引数にイベントIDを追加 20150212 MOD END
	{

		// OM-2015-0003095 2017/02/17 MOD START
//		// v12.00.00 OM-2014-0003335対応 ADD START
//		// イベントIDが他事業者割引契約対象契約登録振舞内部の場合、
//		// eo光ネット料金プラン体系識別コードが従量制をエラーとしないようにするため、無条件で定額制に差し替える
//		if (EventIDList.IKK2451D003.equals(eventID))
//		{
//			retPplnTikiskCd = EOHNT_PPLAN_TIKI_SKCD_TEIGAKU;
//		}
//		// v12.00.00 OM-2014-0003335対応 ADD END
		// 従量制プランを申込対象とするために、引数のeo光ネット料金プラン体系識別コードを無条件で定額制プランに上書きする。
		retPplnTikiskCd = EOHNT_PPLAN_TIKI_SKCD_TEIGAKU;
		// OM-2015-0003095 2017/02/17 MOD END
		
		if (PRC_GRP_CD_HOME.equals(prcGrpCd) || PRC_GRP_CD_MSN.equals(prcGrpCd))
		{
			// 料金グループコードが「ｅｏ光ネットホームタイプ 」または「ｅｏ光ネットメゾンタイプ 」の場合

			if (EOHNT_PPLAN_TIKI_SKCD_TEIGAKU.equals(retPplnTikiskCd))
			{
				// eo光ネット料金プラン体系識別コードが"0"(定額制)の場合、申込対象
				return true;
			}
		}

		if (PRC_GRP_CD_MAN.equals(prcGrpCd))
		{
			// 料金グループコードが「ｅｏ光ネットマンションタイプ 」の場合
			for (int i = 0; i < PCRS_CD_LIST.length; i++)
			{

				// 料金コースコードがプライベートを除くマンションタイプの料金コードの場合 かつ
				// eo光ネット料金プラン体系識別コードが"0"(定額制)の場合、申込対象
				if (PCRS_CD_LIST[i].equals(pcrsCd) && EOHNT_PPLAN_TIKI_SKCD_TEIGAKU.equals(retPplnTikiskCd))
				{
					return true;
				}
			}
		}

		if (PRC_GRP_CD_TEL.equals(prcGrpCd))
		{
			//  料金グループコードが「eo光電話の場合」の場合、申込対象
			return true;
		}

		// 上記以外の場合、申込対象外
		return false;
	}

	/**
	 * <p>
	 * スマートバリュー申込可能な契約状態であるかを判断する
	 * </p>
	 * @param svcKeiStat 対象となるサービス契約ステータス
	 * @param pauseStpCd 対象となる休止中断コード
	 * @return 契約内容判断結果 true:申込対象 false:申込対象外
	 */
	private boolean isTrgtKeiSts(String svcKeiStat, String pauseStpCd)
	{

		// 料金グループコードがeo光ネット・eo光電話のときのみ判断を行う

		if (SVC_KEI_STAT_TERM.equals(svcKeiStat) || SVC_KEI_STAT_CNCL.equals(svcKeiStat))
		{
			// サービス契約ステータスが「解約済」または「キャンセル済」の場合、申込対象外
			return false;
		}

		if (SVC_KEI_STAT_STOP.equals(svcKeiStat) && !(PAUSE_STP_CD_STOP.equals(pauseStpCd)))
		{
			// サービス契約ステータスが「休止・中断中」かつ休止中断コードが「中断中」でない場合、申込対象外
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * eo光ネット料金プラン体系識別コード取得処理
	 * </p>
	 * @param pcrsCd 対象となる料金コースコード
	 * @param pplanCd 対象となる料金プランコード
	 * @return 取得されたeo光ネット料金プラン体系識別コード
	 */
	private String getEohntPplanTikiSkcd(String pcrsCd, String pplanCd)
	{
		// 返却値
		String retStr = null;

		// 検索結果保存変数
		CAANMsg rsltMsg = null;

		// 料金プランスキーマのロジカルエンティティ
		KK0591LE le = new KK0591LE();

		// ETメッセージ（料金プラン）
		CAANMsg inMsg = new CAANMsg(KK0591ETMsg.class.getName());
		inMsg.set(KK0591ETMsg.PCRS_CD, pcrsCd);
		inMsg.set(KK0591ETMsg.PPLAN_CD, pplanCd);

		// ロジカルエンティティのプライマリキー検索を実行する（findByPrimaryKey)
		rsltMsg = le.findByPrimaryKey(inMsg);

		if (rsltMsg != null)
		{
			// 検索結果がある場合、eo光ネット料金プラン体系識別コードを返却値に設定
			retStr = rsltMsg.getString(KK0591ETMsg.EOHNT_PPLAN_TIKI_SKCD);
		}

		return retStr;
	}
}
