/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbRule0076001
*	ソースファイル名：JKKejbRule0076001.java
*	作成者			：富士通
*	日付			：2011年11月10日
*＜機能概要＞
*	開始日設定(サブオプションサービス)相関ルール部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/10	FJ)			新規作成
*   v39.00.00   2018/10/01  FJ)舘山		【ANK-3484-00-00】_端末補償サービス導入対応
*
**********************************************************************/

package eo.ejb.common.rule;

import java.text.ParseException;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 開始日設定(サブオプションサービス)相関ルール部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbRule0076001 extends JKKejbRuleBase
{

	/** ルールID */
	private static final String RULE_ID = "RULE0076001";

	/** サービスコード */
	public static final String SVC_CD = "SVC_CD";

	/** サブオプションサービスコード */
	public static final String SBOP_SVC_CD = "SBOP_SVC_CD";

	/** 申込期間 */
	public static final String MSKM_PRD = "MSKM_PRD";

	/** 即時／翌月 */
	public static final String SKJ_YKJT = "SKJ_YKJT";

	/** 基準日 */
	public static final String STD_DT = "STD_DT";

	/** 基準日からの相対日 */
	public static final String RELATIVE_DATE_COUNT = "RELATIVE_DATE_COUNT";

	/** 実日／営業日 */
	public static final String COUNT_METHOD = "COUNT_METHOD";

	/** 優先基準日 */
	public static final String PRIORITY_STD_DT = "PRIORITY_STD_DT";

	/** 基準日(オプションサービス契約.サービス開始年月日) */
	public static final String STD_DT_KK0351_SVC_STA = "1";

	/** 基準日(申込.申込受付年月日) */
	public static final String STD_DT_KK0011_MSKM_UK = "2";
	
// ▽▽▽ ANK-3484-00-00 ADD START

	/** 基準日(端末補償申込年月日) */
	public static final String STD_DT_TMCP_MSKM_YMD = "3";
	
// △△△ ANK-3484-00-00 ADD END

	/** 基準日からの相対日(+0) */
	public static final String RELATIVE_DATE_COUNT_0 = "0";

// ▽▽▽ ANK-3484-00-00 ADD START
	
	/** 基準日からの相対日(翌々月月初)　*/
	public static final String RELATIVE_DATE_2_MONTHS_AGO = "1";

// △△△ ANK-3484-00-00 ADD END
	
	/** 優先基準日(サブオプションサービスのサービス開始希望日との大きい方) */
	public static final String PRIORITY_STD_DT_STA_KIBO = "1";

// ▽▽▽ ANK-3484-00-00 ADD START

	/** 優先基準日(親のサービス契約のサービス課金開始日との大きい方) */
	public static final String PRIORITY_STD_DT_OYA_SVC_KEI_CHRG_STA_YMD = "2";
	
// △△△ ANK-3484-00-00 ADD END
	
	/** 処理対象のCBSMsg */
	private CAANMsg inCBSMsg = null;

	/** サービスコード */
	private String svc_cd = null;

	/** サブオプションサービスコード */
	private String sbop_svc_cd = null;

	/** 申込期間 */
	private String mskm_period = null;

	/** 即時／翌月 */
	private String skj_ykjt = null;

	/** サービス開始年月日(オプションサービス契約) */
	private String kk0351_svc_sta_ymd = null;

	/** 申込受付年月日 */
	private String kk0011_mskm_uk_ymd = null;

	/** サービス利用開始希望年月日 */
	private String svc_use_sta_kibo_ymd = null;

// ▽▽▽ ANK-3484-00-00 ADD START

	/** 親のサービス契約課金開始日 */
	private String kk0081_svc_chrg_sta_ymd = null;
	
	/** 端末補償申込年月日 */
	private String tmcp_mskm_ymd = null;

// △△△ ANK-3484-00-00 ADD ENDT

	/**
	 * <p>
	 * JKKejbRule0076001クラスのコンストラクタです。
	 * </p>
	 * @param inMsg 処理対象のCBSMsg
	 */
	public JKKejbRule0076001(CAANMsg inMsg)
	{
		super();
		this.inCBSMsg = inMsg;
	}

	/**
	 * <p>
	 * 処理対象のCBSMsgを取得します。
	 * </p>
	 * @return 処理対象のCBSMsg
	 */
	protected CAANMsg getCBSMsg()
	{
		return this.inCBSMsg;
	}

	/**
	 * <p>
	 * ルールIDを取得します。
	 * </p>
	 * @return ルールID
	 */
	protected String getRuleId()
	{
		return RULE_ID;
	}

	/**
	 * <p>
	 * ルールエンジンを複数条件モードで実行するか設定します。
	 * </p>
	 * @return 複数条件モードで実行する場合はtrue
	 */
	protected boolean isMultiMode()
	{
		return true;
	}

	/**
	 * <p>
	 * サービスコードを取得します。
	 * </p>
	 * @return サービスコード
	 */
	private String getSvc_cd()
	{
		return this.svc_cd;
	}

	/**
	 * <p>
	 * サブオプションサービスコードを取得します。
	 * </p>
	 * @return サブオプションサービスコード
	 */
	private String getSbop_svc_cd()
	{
		return this.sbop_svc_cd;
	}

	/**
	 * <p>
	 * 申込期間を取得します。
	 * </p>
	 * @return 申込期間
	 */
	private String getMskm_period()
	{
		return this.mskm_period;
	}

	/**
	 * <p>
	 * 即時／翌月を取得します。
	 * </p>
	 * @return 即時／翌月
	 */
	private String getSkj_ykjt()
	{
		return this.skj_ykjt;
	}

	/**
	 * <p>
	 * サービス開始年月日(オプションサービス契約)を取得します。
	 * </p>
	 * @return サービス開始年月日(オプションサービス契約)
	 */
	private String getKk0351_svc_sta_ymd()
	{
		return this.kk0351_svc_sta_ymd;
	}

	/**
	 * <p>
	 * 申込受付年月日を取得します。
	 * </p>
	 * @return 申込受付年月日
	 */
	private String getKk0011_mskm_uk_ymd()
	{
		return this.kk0011_mskm_uk_ymd;
	}

	/**
	 * <p>
	 * サービス利用開始希望年月日を取得します。
	 * </p>
	 * @return サービス利用開始希望年月日
	 */
	private String getSvc_use_sta_kibo_ymd()
	{
		return this.svc_use_sta_kibo_ymd;
	}

	/**
	 * <p>
	 * サービスコードを設定します。
	 * </p>
	 * @param p_svc_cd サービスコード
	 */
	public void setSvc_cd(String p_svc_cd)
	{
		this.svc_cd = p_svc_cd;
	}

	/**
	 * <p>
	 * サブオプションサービスコードを設定します。
	 * </p>
	 * @param p_sbop_svc_cd サブオプションサービスコード
	 */
	public void setSbop_svc_cd(String p_sbop_svc_cd)
	{
		this.sbop_svc_cd = p_sbop_svc_cd;
	}

	/**
	 * <p>
	 * 申込期間を設定します。
	 * </p>
	 * @param p_mskm_period 申込期間
	 */
	public void setMskm_period(String p_mskm_period)
	{
		this.mskm_period = p_mskm_period;
	}

	/**
	 * <p>
	 * 即時／翌月を設定します。
	 * </p>
	 * @param p_skj_ykjt 即時／翌月
	 */
	public void setSkj_ykjt(String p_skj_ykjt)
	{
		this.skj_ykjt = p_skj_ykjt;
	}

	/**
	 * <p>
	 * サービス開始年月日(オプションサービス契約)を設定します。
	 * </p>
	 * @param p_kk0351_svc_sta_ymd サービス開始年月日(オプションサービス契約)
	 */
	public void setKk0351_svc_sta_ymd(String p_kk0351_svc_sta_ymd)
	{
		this.kk0351_svc_sta_ymd = p_kk0351_svc_sta_ymd;
	}

	/**
	 * <p>
	 * 申込受付年月日を設定します。
	 * </p>
	 * @param p_kk0011_mskm_uk_ymd 申込受付年月日
	 */
	public void setKk0011_mskm_uk_ymd(String p_kk0011_mskm_uk_ymd)
	{
		this.kk0011_mskm_uk_ymd = p_kk0011_mskm_uk_ymd;
	}

	/**
	 * <p>
	 * サービス利用開始希望年月日を設定します。
	 * </p>
	 * @param p_svc_use_sta_kibo_ymd サービス利用開始希望年月日
	 */
	public void setSvc_use_sta_kibo_ymd(String p_svc_use_sta_kibo_ymd)
	{
		this.svc_use_sta_kibo_ymd = p_svc_use_sta_kibo_ymd;
	}

	/**
	 * <p>
	 * 開始日設定(サブオプションサービス)の相関ルールにより開始日を算出する。
	 * </p>
	 * @return 算出した課金開始年月日を返却
	 */
	public String getStaYmd()
	{

		// ログ出力
		execLogOutput();
		
		set(SVC_CD, getSvc_cd());
		set(SBOP_SVC_CD, getSbop_svc_cd());
		set(MSKM_PRD, getMskm_period());
		set(SKJ_YKJT, getSkj_ykjt());

		// ルールエンジンの実行
		super.execRuleEngine();

		// ルールエンジン実行結果を取得
		HashMap<String, Object> retMap = getResultMap();

		String ymd = null;
		String sta_Ymd = null;
		
		// 実行結果の基準日が「オプションサービス契約のサービス開始年月日」の場合
		if (STD_DT_KK0351_SVC_STA.equals(retMap.get(STD_DT)))
		{
			// 「サービス開始年月日(オプションサービス契約)」を基準日とする
			ymd = getKk0351_svc_sta_ymd();	
		}

		// 実行結果の基準日が「申込受付日」の場合
		else if (STD_DT_KK0011_MSKM_UK.equals(retMap.get(STD_DT)))
		{
			// 「申込受付年月日」を基準日とする
			ymd = getKk0011_mskm_uk_ymd();	
		}
// ▽▽▽ ANK-3484-00-00 ADD START
		// 実行結果の基準日が「端末補償申込年月日」の場合
		else if (STD_DT_TMCP_MSKM_YMD.equals(retMap.get(STD_DT)))
		{
			// 「端末補償申込年月日」を基準日とする
			ymd = getTmcp_mskm_ymd();	
		}
		
// △△△ ANK-3484-00-00 ADD END
		
		// 基準日からの相対日が"+0"の場合
		if (RELATIVE_DATE_COUNT_0.equals(retMap.get(RELATIVE_DATE_COUNT)))
		{
			// 基準日を「開始日」とする
			sta_Ymd = ymd;	
		}
// ▽▽▽ ANK-3484-00-00 ADD START
		// 基準日からの翌々月月初の場合
		else if (RELATIVE_DATE_2_MONTHS_AGO.equals(retMap.get(RELATIVE_DATE_COUNT)))
		{
			// 基準日の翌々月を算出する
			try
			{
				sta_Ymd = JKKModelCommon.addMonth(ymd.substring(0, 6) + "01", 2);
			}
			catch (ParseException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
// △△△ ANK-3484-00-00 ADD END

		// 優先基準日が"サブオプションサービスのサービス開始希望日との大きい方"の場合
		if (PRIORITY_STD_DT_STA_KIBO.equals(retMap.get(PRIORITY_STD_DT)))
		{
			return getChrgStaYmd(sta_Ymd, getSvc_use_sta_kibo_ymd());
		}
// ▽▽▽ ANK-3484-00-00 ADD START
		// 優先基準日が"サブオプションサービスのサービス開始希望日との大きい方"の場合
		else if (PRIORITY_STD_DT_OYA_SVC_KEI_CHRG_STA_YMD.equals(retMap.get(PRIORITY_STD_DT)))
		{
			if (sta_Ymd.compareTo(getKk0081_svc_chrg_sta_ymd()) < 0)
			{
				return getKk0081_svc_chrg_sta_ymd();
			}
		}
// △△△ ANK-3484-00-00 ADD END

		// 開始年月日の返却
		return sta_Ymd;
		
	}
	
	/**
	 * <p>
	 * メンバ変数のログ出力を行う。
	 * </p>
	 */
	private void execLogOutput()
	{
		// サービスコード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.svc_cd=" + getSvc_cd());

		// サブオプションサービスコード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.sbop_svc_cd=" + getSbop_svc_cd());

		// 申込期間
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.mskm_period=" + getMskm_period());

		// 即時／翌月
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.skj_ykjt=" + getSkj_ykjt());

		// サービス開始年月日(オプションサービス契約)
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.kk0351_svc_sta_ymd=" + getKk0351_svc_sta_ymd());

		// 申込受付年月日
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.kk0011_mskm_uk_ymd=" + getKk0011_mskm_uk_ymd());

		// サービス利用開始希望年月日
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0076001.svc_use_sta_kibo_ymd=" + getSvc_use_sta_kibo_ymd());
	}
	
	/**
	 * <p>
	 * 開始日設定(サブオプションサービス)の相関ルールにより開始日を算出する。
	 * </p>
 	 * @param staYmd 開始年月日
	 * @param svcUseStaKiboYmd サービス利用開始希望年月日
	 * @return ルールエンジンの実行結果リスト
	 */
	private String getChrgStaYmd(String staYmd, String svcUseStaKiboYmd)
	{
		// メンバ変数のサービス利用開始希望年月日と比較し、日付が大きい方を「開始日」とする。
		if (null != staYmd && null != svcUseStaKiboYmd)
		{
			if (staYmd.compareTo(svcUseStaKiboYmd) >= 0)
			{
				return staYmd;
			}
			return svcUseStaKiboYmd;
		}
		
		if (null != staYmd)
		{
			return staYmd;
		}

		if (null != svcUseStaKiboYmd)
		{
			return svcUseStaKiboYmd;
		}

		return null;
		
	}
// ▽▽▽ ANK-3484-00-00 ADD START	
	/**
	 * 親のサービス課金開始日を返す
	 * <p>
	 * @return サービス契約のサービス課金開始日
	 */
	private String getKk0081_svc_chrg_sta_ymd()
	{
		return kk0081_svc_chrg_sta_ymd;
	}
	/**
	 * 親のサービス課金開始日を設定する
	 * <p>
	 * @param kk0081_svc_chrg_sta_ymd
	 */
	public void setKk0081_svc_chrg_sta_ymd(String kk0081_svc_chrg_sta_ymd)
	{
		this.kk0081_svc_chrg_sta_ymd = kk0081_svc_chrg_sta_ymd;
	}
	/**
	 * 端末補償申込年月日を返す。
	 * <p>
	 * @return 端末補償申込年月日
	 */
	private String getTmcp_mskm_ymd() 
	{
		return tmcp_mskm_ymd;
	}
	/**
	 * 端末補償年月日を設定する。
	 * <p>
	 * @param tmcp_mskm_ymd 端末補償申込年月日
	 */
	public void setTmcp_mskm_ymd(String tmcp_mskm_ymd)
	{
		this.tmcp_mskm_ymd = tmcp_mskm_ymd;
	}
// △△△ ANK-3484-00-00 ADD END
}
