/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbRule0067001
*	ソースファイル名：JKKejbRule0067001.java
*	作成者			：富士通
*	日付			：2011年11月10日
*＜機能概要＞
*	課金開始日設定(機器提供サービス)相関ルール部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/10	FJ)			新規作成
*	v8.00.00	2014/04/29	FJ）宇野	OM-2014-0001529、OM-2014-0001536
*
**********************************************************************/

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 JKKejbRule0067001 extends JKKejbRuleBase
{

	/** ルールID */
	private static final String RULE_ID = "RULE0067001";

	/** サービスコード */
	public static final String SVC_CD = "SVC_CD";

	/** 機器提供サービスコード */
	public static final String KKTK_SVC_CD = "KKTK_SVC_CD";

	/** 異動区分 */
	public static final String IDO_DIV = "IDO_DIV";

	/** 機器提供種別コード */
	public static final String KKTK_SBT_CD = "KKTK_SBT_CD";
	
	/** 元のサービス契約の料金グループ */
	public static final String PRC_GRP_CD = "PRC_GRP_CD";
	
	/** 請求年月の末日以前／以降 */
	public static final String SEIKYU_YM_ZENGO = "SEIKYU_YM_ZENGO";

	/** 基準日 */
	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 STD_DT_KK0081_SVC_STA = "1";
	
	/** 基準日(元のサービス契約のサービス課金開始年月日) */
	public static final String STD_DT_KK0081_SVC_CHG_STA = "2";

	/** 基準日からの相対日(翌月月初) */
	public static final String RELATIVE_DATE_COUNT_NEXT = "2";
	
	/** 基準日からの相対日(+0) */
	public static final String RELATIVE_DATE_NO_COUNT = "0";

	/** 月初設定用 */
	public static final String GESYO_SETTEI = "01";
	
	/** 処理対象のCBSMsg */
	private CAANMsg inCBSMsg = null;

	/** サービスコード */
	private String svc_cd = null;

	/** 機器提供サービスコード */
	private String kktk_svc_cd = null;

	/** 異動区分 */
	private String ido_div = null;

	/** 機器提供種別コード */
	private String kktk_sbt_cd = null;

	/** サービス開始年月日 */
	private String svc_sta_ymd = null;
	
	/** 元のサービス契約の料金グループ */
	private String kk0081_prc_grp_cd = null;
	
	/** 元のサービス契約のサービス課金開始年月日 */
	private String kk0081_svc_chgsta_ymd = null;
	
	/** 請求年月の末日以前／以降 */
	private String seikyu_ym_zengo = null;
	

	/**
	 * <p>
	 * JKKejbRule0067001クラスのコンストラクタです。
	 * </p>
	 * @param inMsg 処理対象のCBSMsg
	 */
	public JKKejbRule0067001(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 getKktk_svc_cd()
	{
		return this.kktk_svc_cd;
	}

	/**
	 * <p>
	 * 異動区分を取得します。
	 * </p>
	 * @return 異動区分
	 */
	private String getIdo_div()
	{
		return this.ido_div;
	}

	/**
	 * <p>
	 * 機器提供種別コードを取得します。
	 * </p>
	 * @return 機器提供種別コード
	 */
	private String getKktk_sbt_cd()
	{
		return this.kktk_sbt_cd;
	}

	/**
	 * <p>
	 * サービス開始年月日を取得します。
	 * </p>
	 * @return サービス開始年月日
	 */
	private String getSvc_sta_ymd()
	{
		return this.svc_sta_ymd;
	}
	
	/**
	 * <p>
	 * 元のサービス契約の料金グループコードを取得します。
	 * </p>
	 * @return 元のサービス契約の料金グループコード
	 */
	public String getKk0081_Prc_Grp_Cd()
	{
		return this.kk0081_prc_grp_cd;
	}
	
	/**
	 * <p>
	 * 元のサービス契約のサービス課金開始年月日を取得します。
	 * </p>
	 * @return 元のサービス契約のサービス課金開始年月日
	 */
	public String getKk0081_Svc_Chgsta_Ymd()
	{
		return this.kk0081_svc_chgsta_ymd;
	}

	/**
	 * <p>
	 * 請求年月の末日以前／以降を取得します。
	 * </p>
	 * @return 請求年月の末日以前／以降
	 */
	public String getSeikyu_Ym_Zengo()
	{
		return this.seikyu_ym_zengo;
	}

	/**
	 * <p>
	 * サービスコードを設定します。
	 * </p>
	 * @param p_svc_cd サービスコード
	 */
	public void setSvc_cd(String p_svc_cd)
	{
		this.svc_cd = p_svc_cd;
	}

	/**
	 * <p>
	 * 機器提供サービスコードを設定します。
	 * </p>
	 * @param p_kktk_svc_cd 機器提供サービスコード
	 */
	public void setKktk_svc_cd(String p_kktk_svc_cd)
	{
		this.kktk_svc_cd = p_kktk_svc_cd;
	}

	/**
	 * <p>
	 * 異動区分を設定します。
	 * </p>
	 * @param p_ido_div 異動区分
	 */
	public void setIdo_div(String p_ido_div)
	{
		this.ido_div = p_ido_div;
	}

	/**
	 * <p>
	 * 機器提供種別コードを設定します。
	 * </p>
	 * @param p_kktk_sbt_cd 機器提供種別コード
	 */
	public void setKktk_sbt_cd(String p_kktk_sbt_cd)
	{
		this.kktk_sbt_cd = p_kktk_sbt_cd;
	}

	/**
	 * <p>
	 * サービス開始年月日を設定します。
	 * </p>
	 * @param p_svc_sta_ymd サービス開始年月日
	 */
	public void setSvc_sta_ymd(String p_svc_sta_ymd)
	{
		this.svc_sta_ymd = p_svc_sta_ymd;
	}

	/**
	 * <p>
	 * 元のサービス契約の料金グループコードを設定します。
	 * </p>
	 * @param p_kk0081_prc_grp_cd 元のサービス契約の料金グループコード
	 */
	public void setKk0081_Prc_Grp_Cd(String p_kk0081_prc_grp_cd)
	{
		this.kk0081_prc_grp_cd = p_kk0081_prc_grp_cd;
	}

	/**
	 * <p>
	 * 元のサービス契約のサービス課金開始年月日を設定します。
	 * </p>
	 * @param p_kk0081_svc_chgsta_ymd 元のサービス契約のサービス課金開始年月日
	 */
	public void setKk0081_Svc_Chgsta_Ymd(String p_kk0081_svc_chgsta_ymd)
	{
		this.kk0081_svc_chgsta_ymd = p_kk0081_svc_chgsta_ymd;
	}

	/**
	 * <p>
	 * 請求年月の末日以前／以降を設定します。
	 * </p>
	 * @param p_seikyu_ym_zengo 請求年月の末日以前／以降
	 */
	public void setSeikyu_Ym_Zengo(String p_seikyu_ym_zengo)
	{
		this.seikyu_ym_zengo = p_seikyu_ym_zengo;
	}


	/**
	 * <p>
	 * 相関ルールの結果により取得した課金開始年月日を算出します。
	 * </p>
	 * @return 算出した課金開始年月日を返却
	 */
	public String getChrgStaYmd()
	{
		// ログ出力
		execLogOutput();
		
		// ルールエンジンで使用する値を設定
		set(SVC_CD, getSvc_cd());
		set(KKTK_SVC_CD, getKktk_svc_cd());
		set(IDO_DIV, getIdo_div());
		set(KKTK_SBT_CD, getKktk_sbt_cd());
		set(PRC_GRP_CD, getKk0081_Prc_Grp_Cd());
		set(SEIKYU_YM_ZENGO, getSeikyu_Ym_Zengo());
				
		// ルールエンジンの実行
		super.execRuleEngine();
		
		// 実行結果が存在しない場合、nullを返す。
		if (!hasNext())
		{
			return null;
		}
		
		String ymd = null;
				
		// ルールエンジン実行結果を取得
		HashMap<String, Object> retMap = getResultMap();
		
		// 実行結果が「1：サービス開始年月日」の場合は基準日をメンバ変数のサービス開始年月日とし、課金開始年月日を算出する
		if (STD_DT_KK0081_SVC_STA.equals(retMap.get(STD_DT)))
		{
			ymd = getYmd(retMap, getSvc_sta_ymd());
		}
		// 実行結果が「2：サービス開始年月日」の場合は基準日をメンバ変数のサービス課金開始年月日とし、課金開始年月日を算出する
		else if (STD_DT_KK0081_SVC_CHG_STA.equals(retMap.get(STD_DT)))
		{
			ymd = getYmd(retMap, getKk0081_Svc_Chgsta_Ymd());
		}
		
		return ymd;
				
	}
		
	/**
	 * <p>
	 * 課金開始年月日を算出します。
	 * </p>
	 * @param retMap ルールの結果 
	 * @param stdardDay 基準日 
	 * @return 算出した課金開始年月日
	 */
	private String getYmd(HashMap<String, Object> retMap, String stdardDay)
	{
		
		// 基準日の翌月を算出する
		String ymd = null;
		
		// 基準日からの相対日が"翌月月初"の場合
		if(RELATIVE_DATE_COUNT_NEXT.equals(retMap.get(RELATIVE_DATE_COUNT)))
		{
		
			try
			{
				ymd = JKKModelCommon.addMonth(stdardDay, 1);
			}
			catch (ParseException ce)
			{
				throw new CAANRuntimeException(ce);
			}

			// 年月を抽出し、日付を1日に設定する
			String ym = ymd.substring(0, 6);
			
			ymd = ym + GESYO_SETTEI;
		
		
		}
		// 基準日からの相対日が"+0"の場合
		else if (RELATIVE_DATE_NO_COUNT.equals(retMap.get(RELATIVE_DATE_COUNT)))
		{
			return stdardDay;
		}
		return ymd;
	}
	
	/**
	 * <p>
	 * メンバ変数のログ出力を行う。
	 * </p>
	 */
	private void execLogOutput()
	{
		// サービスコード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.svc_cd=" + getSvc_cd());

		// 機器提供サービスコード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.kktk_svc_cd=" + getKktk_svc_cd());

		// 異動区分
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.ido_div=" + getIdo_div());

		// 機器提供種別コード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.kktk_sbt_cd=" + getKktk_sbt_cd());

		// サービス開始年月日
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.svc_sta_ymd=" + getSvc_sta_ymd());
		
		// 元のサービス契約の料金グループコード
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.kk0081_prc_grp_cd=" + getKk0081_Prc_Grp_Cd());
		
		// 請求年月の末日以前／以降
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.seikyu_ym_zengo=" + getSeikyu_Ym_Zengo());
		
		// 元のサービス契約のサービス課金開始年月日
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "JKKejbRule0067001.kk0081_svc_chgsta_ymd=" + getKk0081_Svc_Chgsta_Ymd());
	}
}
