/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK0341C380Edit
*	ソースファイル名：JKKejbEKK0341C380Edit.java
*	作成者			：富士通
*	日付			：2014年08月11日
*＜機能概要＞
*	機器提供サービス契約料金コース変更確定編集部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/08/11	富士通		新規作成(OM-2014-0002539)
*	v9.00.01	2014/08/13	FJ)小島		OM-2014-0002539
*
**********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C380CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0341DBABase;
import eo.ejb.common.rule.JKKejbRule0067001;

/**
 * <p>
 * 機器提供サービス契約の相関ルール処理を呼び出す為の編集を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0341C380Edit
{
	
	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK0341C380Edit()
	{
	}
	
	/**
	 * <p>
	 * 解約年月日と同日の回復処理か判定を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return カレントレコードを引き継ぐ場合はfalse
	 */
	public boolean isSameDayDissolve(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 異動区分が回復以外の場合は対象外
		if(!JKKModelConst.IDO_DIV_KAIHK.equals(inMsg.getString(EKK0341C380CBSMsg.IDO_DIV)))
		{
			return false;
		}
		
		// 機器提供サービス契約のカレントレコードを取得します。
		CAANMsg kk0341Msg = getCurrentKK0341(inMsg);
		
		String svcStaYmd = kk0341Msg.getString(KK0341ETMsg.SVC_STA_YMD);
		String planStaYmd = kk0341Msg.getString(KK0341ETMsg.PLAN_STAYMD);
		
		// サービス開始年月日とサービス課金開始年月日が同日でない場合は対象外
		if(svcStaYmd == null || !svcStaYmd.equals(kk0341Msg.getString(KK0341ETMsg.SVC_CHRG_STAYMD)))
		{
			return false;
		}
		
		// プラン開始年月日とプラン課金開始年月日が同日でない場合は対象外
		if(planStaYmd == null || !planStaYmd.equals(kk0341Msg.getString(KK0341ETMsg.PLAN_CHRG_STAYMD)))
		{
			return false;
		}
		
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		
		// 解約年月日が運用日付と同日でない場合は対象外
		if(!opeDate.equals(kk0341Msg.getString(KK0341ETMsg.SVC_DSL_YMD)))
		{
			return false;
		}
		
		// プラン開始年月日が運用日以前でない場合は対象外
		if(opeDate.compareTo(planStaYmd) < 0)
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約の課金開始年月日設定の相関ルールを呼び出し、課金開始年月日を設定する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 課金開始年月日
	 */
	public Object getChrgStaYmd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機器提供サービス契約のカレントレコードを取得します。
		CAANMsg kk0341Msg = getCurrentKK0341(inMsg);
		
		// 相関ルール用のパラメータを設定し、相関ルールを実行する
		String chagStaYmd = chrgStaYmdRuleRun(inMsg, kk0341Msg);
	
		// 課金開始年月日が運用日よりも前の場合、プラン開始年月日（カレントの課金開始年月日と同じ日付）を返す。
		if(null == chagStaYmd || JKKModelCommon.getOpeDate(inMsg).compareTo(chagStaYmd) > 0)
		{
			return kk0341Msg.getString(KK0341ETMsg.PLAN_STAYMD);
		}

		return chagStaYmd;		
	}
	
	/**
	 * <p>
	 * 課金開始日設定の相関ルールを呼び出し課金開始年月日を取得します
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 相関ルールより取得した課金開始年月日
	 */
	private String chrgStaYmdRuleRun(CAANMsg inMsg, CAANMsg kk0341Msg)
	{
		// 相関ルールの呼び出す為にインスタンス生成する
		JKKejbRule0067001 instance = new JKKejbRule0067001(inMsg);
		
		// 存在しない場合
		if (kk0341Msg == null)
		{
			return null;
		}
		
		// OM-2014-0002539 ADD START
		// 「機器提供サービス契約」の親契約識別コードが"サービス契約回線内訳"の場合
		if (JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI_KAISEN_UCWK.equals(kk0341Msg.getString(KK0341ETMsg.OYA_KEI_SKBT_CD)))
		{
			CAANMsg[] kk0081List = new JKKejbKK0081DBABase().getKK0081bySvcKeiKaisenUcwk(
					kk0341Msg.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO),
					null, JKKModelCommon.getOpeDate(inMsg), "2");
			
			// サービスコードを設定する
			instance.setSvc_cd(kk0081List[0].getString(KK0081ETMsg.SVC_CD));
		}
		// 「機器提供サービス契約」の親契約識別コードが"サービス契約回線内訳"以外の場合
		else
		{
		// OM-2014-0002539 ADD END
			// 取得した機器提供サービス契約のサービス契約番号をキーにサービス契約をカレント検索する
			CAANMsg kk0081Msg = getCurrentKK0081(inMsg, kk0341Msg.getString(KK0341ETMsg.SVC_KEI_NO));
					
			// サービスコードを設定する
			instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		// OM-2014-0002539 ADD START
		}
		// OM-2014-0002539 ADD END
		
		// 機器提供サービスコードを設定する
		instance.setKktk_svc_cd(kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD));
		
		// 機器提供種別コードを設定する
		instance.setKktk_sbt_cd(kk0341Msg.getString(KK0341ETMsg.KKTK_SBT_CD));
		
		// 異動区分を設定する
		instance.setIdo_div(inMsg.getString(EKK0341C380CBSMsg.IDO_DIV));
		
		// サービス開始年月日を設定する
		instance.setSvc_sta_ymd(kk0341Msg.getString(KK0341ETMsg.PLAN_STAYMD));
		
		return instance.getChrgStaYmd();
			
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約のカレントを検索します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 取得した機器提供サービス契約
	 */
	private CAANMsg getCurrentKK0341(CAANMsg inMsg)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, inMsg.getString(EKK0341C380CBSMsg.KKTK_SVC_KEI_NO));
		inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));
		
		// 機器提供サービス契約のカレント検索を行う
		return new JKKejbKK0341DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * <p>
	 * サービス契約のカレントを検索します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo 検索対象となるサービス契約番号
	 * @return 取得したサービス契約番号
	 */
	private CAANMsg getCurrentKK0081(CAANMsg inMsg, Object svcKeiNo)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// サービス契約のカレント検索を行う
		return new JKKejbKK0081DBABase().findByCurrent(inETMsg);		
	}
}
