/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK0341C180Edit
*	ソースファイル名：JKKejbEKK0341C180Edit.java
*	作成者			：富士通
*	日付			：2011年08月01日
*＜機能概要＞
*	機器提供サービス契約料金コース変更確定編集部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/11	富士通		新規作成
*	v10.00.00	2014/09/01	FJ)森本		【IT2-2014-0000298】対応
*
**********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
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.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0341LE;
import eo.ejb.cbs.cbsmsg.EKK0341C180CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.rule.JKKejbRule0067001;
import eo.ejb.common.rule.JKKejbRule0075001;
/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
import eo.ejb.cbm.entity.KK0241ETMsg;
import eo.ejb.cbm.entity.KK0241LE;
/* ++++++++++ v10.00.00 修正終了 ++++++++++ */

/**
 * <p>
 * 機器提供サービス契約の相関ルール処理を呼び出す為の編集を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0341C180Edit
{
		
	/** 無効フラグ（無効）*/
	private static final String MK_FLG_MUKO = "1";
	
	/** 無効フラグ（有効）*/
	private static final String MK_FLG_YUKO = "0";
	
	/** サービスコード（インターネットサービス） */
	private static final String SVC_CD_NET = "01";
	
	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK0341C180Edit()
	{
	}

	/**
	 * <p>
	 * 機器提供サービス契約の開始年月日設定の相関ルールを呼び出し、開始年月日を設定する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 
	 */
	public Object getStaYmd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// 相関ルールを実行して、開始年月日を取得する
		String staYmd = staYmdRuleRun(inMsg);
		
		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if(null == staYmd || "".equals(staYmd))
		{
			// 相関エラーのステータスを設定
			inMsg.set(EKK0341C180CBSMsg.KKTK_SVC_KEI_NO_ERR, "EB");
			inMsg.set(EKK0341C180CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return null;
			
		}
		
		return staYmd;
		
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約の課金開始年月日設定の相関ルールを呼び出し、開始年月日を設定する
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 
	 */
	public Object getChrgStaYmd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// 相関ルール用のパラメータを設定し、相関ルールを実行する
		String chagStaYmd = chrgStaYmdRuleRun(inMsg);
	
		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if(null == chagStaYmd || "".equals(chagStaYmd))
		{
			// 相関エラーのステータスを設定
			inMsg.set(EKK0341C180CBSMsg.KKTK_SVC_KEI_NO_ERR, "EB");
			inMsg.set(EKK0341C180CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return null;
			
		}		

		return chagStaYmd;
		
	}
		
	/**
	 * <p>
	 * 開始日設定の相関ルール呼び出し開始日を取得します
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 設定された開始日
	 */
	private String staYmdRuleRun(CAANMsg inMsg)
	{
		// 相関ルールの呼び出す為にインスタンス生成する
		JKKejbRule0075001 instance = new JKKejbRule0075001(inMsg);
		
		// 機器提供サービス契約の一意検索を行う
		CAANMsg kk0341Msg = getPrimaryKeyKK0341(inMsg);
		
		// 存在しない場合
		if (kk0341Msg == null)
		{
			return null;
		}
		
		/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
		// サービス契約番号が無い場合、回線に紐付くサービス契約番号を取得する
		String svc_kei_no = kk0341Msg.getString(KK0341ETMsg.SVC_KEI_NO);
		
		if (svc_kei_no == null || svc_kei_no.equals(""))
		{
			String svcKeiKaisenUcwkNo = kk0341Msg.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO);
			
			// 回線対象サービス契約の一意検索を行う
			CAANMsg kk0241Msg = getPrimaryKeyKK0241(inMsg, svcKeiKaisenUcwkNo);
			
			// 存在しない場合
			if (kk0241Msg == null)
			{
				return null;
			}
			
			// 回線に紐付くサービス契約番号を取得
			svc_kei_no = kk0241Msg.getString(KK0241ETMsg.SVC_KEI_NO);
		}
		/* ++++++++++ v10.00.00 修正終了 ++++++++++ */
		
		// 取得した機器提供サービス契約のサービス契約番号をキーにサービス契約をカレント検索する
		/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
		//CAANMsg kk0081Msg = getCurrentKK0081(inMsg, kk0341Msg.getString(KK0341ETMsg.SVC_KEI_NO));
		CAANMsg kk0081Msg = getCurrentKK0081(inMsg, svc_kei_no);
		/* ++++++++++ v10.00.00 修正終了 ++++++++++ */
						
		// サービスコードを設定する
		instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		
		// 機器提供サービスコードを設定する
		instance.setKktk_svc_cd(kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD));
		
		// 異動区分を設定する
		instance.setIdo_div(kk0341Msg.getString(KK0341ETMsg.IDO_DIV));
		
		// 配送方法コードを設定する
		instance.setHaiso_way_cd(kk0341Msg.getString(KK0341ETMsg.HAISO_WAY_CD));
				
		// サービス利用開始希望年月日を設定する
		instance.setKk0081_svc_sta_ymd(kk0081Msg.getString(KK0081ETMsg.SVC_USE_STA_KIBO_YMD));
		
		// 機器提供サービス契約番号を設定する
		instance.setKktk_svc_kei_no(inMsg.getString(EKK0341C180CBSMsg.KKTK_SVC_KEI_NO));
		
		// 機器変更番号を設定する
		instance.setKiki_Chg_No(kk0341Msg.getString(KK0341ETMsg.KIKI_CHG_NO));
		
		// 申込明細番号を設定する
		instance.setMskm_dtl_no(kk0341Msg.getString(KK0341ETMsg.MSKM_DTL_NO));
		
		return instance.getStaYmd();
			
	}
	
	/**
	 * <p>
	 * プラン終了年月日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return プラン終了年月日
	 */
	public Object getEndYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始年月日を取得
		String planStaYmd = (String)getStaYmd(inCBSMsg, inContext);

		if(null == planStaYmd)
		{
			return null;
		}
		
		// 開始年月日から1日前の日付を設定する		
		return  JKKModelCommon.addDay(planStaYmd, -1);

	}
	
	/**
	 * <p>
	 * プラン課金終了年月日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return プラン課金終了年月日
	 */
	public Object getChrgEndYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 課金開始年月日を取得
		String planChrgStaYmd = (String)getChrgStaYmd(inCBSMsg, inContext);
		
		if(null == planChrgStaYmd)
		{
			return null;
		}
		
		// 課金開始年月日から1日前の日付を設定する		
		return JKKModelCommon.addDay(planChrgStaYmd, -1);
	}
	
	/**
	 * <p>
	 * 課金開始日設定の相関ルールを呼び出し課金開始年月日を取得します
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 相関ルールより取得した課金開始年月日
	 */
	private String chrgStaYmdRuleRun(CAANMsg inMsg)
	{
		// 相関ルールの呼び出す為にインスタンス生成する
		JKKejbRule0067001 instance = new JKKejbRule0067001(inMsg);
		
		// 機器提供サービス契約の一意検索を行う
		CAANMsg kk0341Msg = getPrimaryKeyKK0341(inMsg);
		
		// 存在しない場合
		if (kk0341Msg == null)
		{
			return null;
		}
		
		/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
		// サービス契約番号が無い場合、回線に紐付くサービス契約番号を取得する
		String svc_kei_no = kk0341Msg.getString(KK0341ETMsg.SVC_KEI_NO);
		
		if (svc_kei_no == null || svc_kei_no.equals(""))
		{
			String svcKeiKaisenUcwkNo = kk0341Msg.getString(KK0341ETMsg.SVC_KEI_KAISEN_UCWK_NO);
			
			// 回線対象サービス契約の一意検索を行う
			CAANMsg kk0241Msg = getPrimaryKeyKK0241(inMsg, svcKeiKaisenUcwkNo);
			
			// 存在しない場合
			if (kk0241Msg == null)
			{
				return null;
			}
			
			// 回線に紐付くサービス契約番号を取得
			svc_kei_no = kk0241Msg.getString(KK0241ETMsg.SVC_KEI_NO);
		}
		/* ++++++++++ v10.00.00 修正終了 ++++++++++ */
		
		// 取得した機器提供サービス契約のサービス契約番号をキーにサービス契約をカレント検索する
		/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
		//CAANMsg kk0081Msg = getCurrentKK0081(inMsg, kk0341Msg.getString(KK0341ETMsg.SVC_KEI_NO));
		CAANMsg kk0081Msg = getCurrentKK0081(inMsg, svc_kei_no);
		/* ++++++++++ v10.00.00 修正終了 ++++++++++ */
		
		// サービスコードを設定する
		instance.setSvc_cd(kk0081Msg.getString(KK0081ETMsg.SVC_CD));
		
		// 機器提供サービスコードを設定する
		instance.setKktk_svc_cd(kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD));
		
		// 機器提供種別コードを設定する
		instance.setKktk_sbt_cd(kk0341Msg.getString(KK0341ETMsg.KKTK_SBT_CD));
		
		// 異動区分を設定する
		instance.setIdo_div(kk0341Msg.getString(KK0341ETMsg.IDO_DIV));
		
		// サービス開始年月日を設定する
		// ルールを呼び出す
		String planStaYmd = staYmdRuleRun(inMsg);
		
		// 取得できなければ、nullを返却する
		if(null == planStaYmd)
		{
			return null;
		}
		
		instance.setSvc_sta_ymd(planStaYmd);
		
		return instance.getChrgStaYmd();
			
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約の一意検索行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 取得した機器提供サービス契約
	 */
	private CAANMsg getPrimaryKeyKK0341(CAANMsg inMsg)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, inMsg.getString(EKK0341C180CBSMsg.KKTK_SVC_KEI_NO));
		inETMsg.set(KK0341ETMsg.GENE_ADD_DTM, inMsg.getString(EKK0341C180CBSMsg.GENE_ADD_DTM));
		
		// 一意照会を行い、結果を返却する
		CAANMsg otETMsg = new KK0341LE().findByPrimaryKey(inETMsg);
		
		// 存在しない場合は、nullを返却
		if(null == otETMsg)
		{
			return null;
		}
		
		// 無効フラグが無効の場合は、対象外
		if(MK_FLG_MUKO.equals(otETMsg.getString(KK0341ETMsg.MK_FLG)))
		{
			return null;
		}
		
		// 結果を返却する
		return otETMsg;
	}
	
	/* ++++++++++ v10.00.00 修正開始 ++++++++++ */
	/**
	 * <p>
	 * 回線対象サービス契約の一意検索行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inMsg サービス契約回線内訳番号
	 * @return 取得した機器提供サービス契約
	 */
	private CAANMsg getPrimaryKeyKK0241(CAANMsg inMsg, String svcKeiKaisenUcwkNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0241ETMsg.class.getName());
		inETMsg.set(KK0241ETMsg.SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);
		inETMsg.set(KK0241ETMsg.MK_FLG, MK_FLG_YUKO);
		
		CAANMsg[] otETMsg = null;
		
		try
		{
			// 一意照会を行い、結果を返却する
			otETMsg = new KK0241LE().findByCondition(inETMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 存在しない場合は、nullを返却
		if(null == otETMsg || 0 == otETMsg.length)
		{
			return null;
		}
		
		// 複数件存在する場合
		if(1 > otETMsg.length)
		{
			// サービスコードがネットのレコードを返却する
			for(int i = 0;i < otETMsg.length;i++)
			{
				// サービス契約番号を取得
				String svc_kei_no = otETMsg[i].getString(KK0081ETMsg.SVC_KEI_NO);
				
				// サービス契約のカレントを取得
				CAANMsg otETMsg2 = getCurrentKK0081(inMsg, svc_kei_no);
				
				// サービスコードを取得
				String svcCd = otETMsg2.getString(KK0081ETMsg.SVC_CD);
				
				// ネットサービスを優先で返却する
				if(SVC_CD_NET.equals(svcCd))
				{
					otETMsg[0] = otETMsg[i];
					break;
				}
			}
		}
		
		// 結果を返却する
		return otETMsg[0];
	}
	/* ++++++++++ v10.00.00 修正終了 ++++++++++ */
	
	/**
	 * <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);		
	}
}
