/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK0181C040Edit
 *	ソースファイル名：JKKejbEKK0181C040Edit.java
 *	作成者			：富士通
 *	日付			：2013年03月27日
 *＜機能概要＞
 *	サービス契約内訳＜eo光TV＞使用開始編集部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
*   v4.00.00    2013/03/27  FJ）寺園    IT1-2013-0000534
*   v8.00.00    2014/06/04  FJ) 団      OM-2014-0001332
 *
 **********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
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.KK0781ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0181C040CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0781DBABase;
import eo.ejb.common.rule.JKKejbRule0065001;
import eo.ejb.common.rule.JKKejbRule0073001;

/**
 * <p>
 * サービス契約内訳＜eo光TV＞使用開始の相関ルール処理を呼び出す為の編集を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0181C040Edit
{
	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK0181C040Edit()
	{
	}

	/**
	 * <p>
	 * サービス契約の開始年月日設定の相関ルールを呼び出し、開始年月日を設定する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return staYmd 開始年月日
	 */
	public Object getStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0181C040Edit#getStaYmd");

		// サービス契約内訳のカレントレコードを取得
		CAANMsg kk0161Msg = getCurrentKK0161(inCBSMsg);

		// 親サービス契約のカレントレコードを取得
		CAANMsg kk0081Msg = getCurrentKK0081(inCBSMsg, kk0161Msg);

		// 親契約のサービス契約カレントレコードに設定されている料金グループを取得
		CAANMsg kk0781Msg = getCurrentKK0781(inCBSMsg, kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD));

		// 相関ルールの呼び出す為にインスタンス生成
		JKKejbRule0073001 instance = new JKKejbRule0073001(inCBSMsg);

		// ルールエンジンに値を設定
		instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		instance.setKaisen_tk_comp_cd(kk0781Msg.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
		instance.setPrc_grp_cd(kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD));
		instance.setKoji_um(inCBSMsg.getString(EKK0181C040CBSMsg.KOJI_UM));
		instance.setIdo_div(inCBSMsg.getString(EKK0181C040CBSMsg.IDO_DIV));
		instance.setKkshka_um(inCBSMsg.getString(EKK0181C040CBSMsg.KKSHKA_UM));
		instance.setSvc_kei_no(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO));
		instance.setSvc_kei_ucwk_no(inCBSMsg.getString(EKK0181C040CBSMsg.SVC_KEI_UCWK_NO));
		instance.setMskm_dtl_no(kk0161Msg.getString(KK0161ETMsg.MSKM_DTL_NO));
		instance.setSvc_use_sta_kibo_ymd(kk0161Msg.getString(KK0161ETMsg.SVC_USE_STA_KIBO_YMD));
		instance.setShosa_ymd(kk0161Msg.getString(KK0161ETMsg.SHOSA_YMD));

		// 相関ルールを呼び出す
		String staYmd = instance.getStaYmd();

		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if (null == staYmd || "".equals(staYmd))
		{
			setErr(inCBSMsg);
			return null;
		}

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0181C040Edit#getStaYmd");

		return staYmd;
	}

	/**
	 * <p>
	 * サービス契約の課金開始年月日設定の相関ルールを呼び出し、課金開始年月日を設定する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return chrgStaYmd 課金開始年月日
	 */
	public Object getChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0181C040Edit#getChrgStaYmd");

		// サービス契約内訳のカレントレコードを取得
		CAANMsg kk0161Msg = getCurrentKK0161(inCBSMsg);

		// 親サービス契約のカレントレコードを取得
		CAANMsg kk0081Msg = getCurrentKK0081(inCBSMsg, kk0161Msg);

		// 料金グループのカレントレコードを取得
		CAANMsg ret0781 = getCurrentKK0781(inCBSMsg, kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD));

		// 相関ルールの呼び出す為にインスタンス生成
		JKKejbRule0065001 instance = new JKKejbRule0065001(inCBSMsg);

		instance.setIdo_div(kk0161Msg.getString(KK0161ETMsg.IDO_DIV));
		instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		instance.setPrc_grp_cd(kk0081Msg.getString(KK0081ETMsg.PRC_GRP_CD));
		instance.setKoji_um(inCBSMsg.getString(EKK0181C040CBSMsg.KOJI_UM));
		instance.setChrg_sta_ymd_hosei_um(kk0081Msg.getString(KK0081ETMsg.CHRG_STA_YMD_HOSEI_UM));
		instance.setMskm_dtl_no(kk0161Msg.getString(KK0161ETMsg.MSKM_DTL_NO));
		instance.setKaisen_tk_comp_cd(ret0781.getString(KK0781ETMsg.KAISEN_TK_COMP_CD));
		instance.setSvc_kei_ucwk_no(inCBSMsg.getString(EKK0181C040CBSMsg.SVC_KEI_UCWK_NO));
		instance.setKkshka_um(inCBSMsg.getString(EKK0181C040CBSMsg.KKSHKA_UM));

		Object staYmd = getStaYmd(inCBSMsg, inContext);

		if (null == staYmd)
		{
			setErr(inCBSMsg);
			return null;
		}

		instance.setSvc_sta_ymd(staYmd.toString());

		String chrgStaYmd = instance.getChrgStaYmd();

		// 課金開始年月日が取得できなかった場合、エラー処理を行う。
		if (null == chrgStaYmd || "".equals(chrgStaYmd))
		{
			setErr(inCBSMsg);
			return null;
		}
		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0181C040Edit#getChrgStaYmd");

		return chrgStaYmd;
	}

	/**
	 * <p>
	 * 親サービス契約のカレントを検索します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg  サービス契約内訳のカレントレコードメッセージキャリア 
	 * @return 取得した親サービス契約メッセージキャリア
	 */
	private CAANMsg getCurrentKK0081(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		// 親サービス契約カレント検索用のメッセージを作成
		CAANMsg inSvcKeiETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inSvcKeiETMsg.set(KK0081ETMsg.SVC_KEI_NO, inETMsg.getString(KK0161ETMsg.SVC_KEI_NO));
		inSvcKeiETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約のカレント検索を行う
		CAANMsg kk0081ETMsg = new JKKejbKK0081DBABase().findByCurrent(inSvcKeiETMsg);

		return kk0081ETMsg;
	}

	/**
	 * <p>
	 * サービス契約内訳のカレントを検索します。
	 * </p>
	 * @param inCBSMsg 　処理対象のメッセージキャリア
	 * @return 取得した親サービス契約メッセージキャリア
	 */
	private CAANMsg getCurrentKK0161(CAANMsg inCBSMsg)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inSvcKeiUcwkETMsg = new CAANMsg(KK0161ETMsg.class.getName());
		inSvcKeiUcwkETMsg.set(KK0161ETMsg.SVC_KEI_UCWK_NO, inCBSMsg.getString(EKK0181C040CBSMsg.SVC_KEI_UCWK_NO));
		inSvcKeiUcwkETMsg.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約内訳のカレント検索を行う
		CAANMsg kk0161ETMsg = new JKKejbKK0161DBABase().findByCurrent(inSvcKeiUcwkETMsg);

		return kk0161ETMsg;
	}

	/**
	 * <p>
	 * エラー返却項目とエラーフラグを設定します
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 */
	private void setErr(CAANMsg inCBSMsg)
	{
		// エラーフラグ・エラー返却項目を設定
		inCBSMsg.set(EKK0181C040CBSMsg.SVC_KEI_UCWK_NO_ERR, "ED");
		// エラーステータスを設定
		inCBSMsg.set(EKK0181C040CBSMsg.STATUS, StatusCodes.RELATION_ERR);
	}

	/**
	 * <p>
	 * 料金グループのカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param prcGrpCd 料金グループコード
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0781(CAANMsg inCBSMsg, String prcGrpCd)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0781ETMsg.class.getName());
		inETMsg.set(KK0781ETMsg.PRC_GRP_CD, prcGrpCd);
		inETMsg.set(KK0781ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// 料金グループのカレント検索を行う
		return new JKKejbKK0781DBABase().findByCurrent(inETMsg);
	}

}
