/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK2811SvcStaYmdStti
*	ソースファイル名：JKKejbKK2811SvcStaYmdStti.java
*	作成者			：富士通
*	日付			：2013年11月19日
*＜機能概要＞
*	機器オプションサービス契約サービス開始日設定部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v7.00.00	2013/11/19	富士通		新規作成
*   v7.00.01    2013/12/08  FJ）大山    ANK-1578-00-00
*   v7.00.02    2013/12/29  FJ）大山    IT1-2013-0001740
*   v7.00.03    2013/12/30  FJ）大山    IT1-2013-0001740
*   v9.00.00    2014/04/29  FJ）大山    ANK-2054-00-00
*   v8.00.00    2014/05/15  FJ）澁谷    OM-2014-0001717
*   v9.00.01    2014/06/23  FJ）中野    OM-2014-0001904
*
**********************************************************************/

package eo.ejb.common.edit;

import java.util.HashMap;
import java.util.Map;

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.cbm.entity.KK2811ETMsg;
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.db.JKKejbKK2811DBABase;


/**
 * <p>
 * 機器オプションサービス契約サービス開始日設定部品クラスです。<br>
 * ルール化されていないため、部品での実装とする。
 * 判定結果はルールと同様にMapで返却する。
 * </p>
 * @author 富士通
 */
public class JKKejbKK2811SvcStaYmdStti
{
	/** サービス開始日（機器オプションサービス）の導出結果 */
	HashMap<String, String> retMap;


	// ====================================================
	// 導出結果のKEYを定義
	// ====================================================
	/** 基準日 */
	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 JUDGE_RESULT_STTI_SK = "JUDGE_RESULT_STTI_SK";
	

	// ====================================================
	// 設定値
	// ====================================================
	/** 実日/営業日(実日) */
	public static final String COUNT_METHOD_REALDAY = "0";

	/** 実日/営業日(営業日) */
	public static final String COUNT_METHOD_BUSIDAY = "1";
	
	/** 判定結果の設定先(機器オプションサービス契約の「サービス開始年月日」「プラン開始年月日」) */
	public static final String JUDGE_RESULT_STTI_SK_SVC_PLAN_STA = "0";

	/** 判定結果の設定先(機器オプションサービス契約の「プラン開始年月日」) */
	public static final String JUDGE_RESULT_STTI_SK_PLAN_STA = "1";
	
	
	/**
	 * コンストラクタです。
	 */
	public JKKejbKK2811SvcStaYmdStti()
	{
	}

	/**
	 * <p>
	 * サービス開始年月日、プラン開始年月日をサービス開始日の導出論理に従って判定し、判定結果を返却します。<br>
	 * 
	 * サービス契約に友連れで機器オプションが開始されるケースでこの論理部品を呼び出すことは考慮しない。<br>
	 * そのようなケースで呼び出された場合、正しくないサービス開始日が判定結果として返却されうる。<br>
	 * 前述の理由により、各カレントは1世代前のものを考慮せず、カレントレコードのみで判定を行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @param idoDiv 異動区分
	 * 
	 * @return 判定結果
	 */
	public Map<String, String> getKkopSvKeiStDate(CAANMsg inCBSMsg, AgentDispatchContext inContext, String kkopSvcKeiNo, String idoDiv)
	{
		return getKkopSvKeiStDate(inCBSMsg, inContext, kkopSvcKeiNo, idoDiv , "");
	}
	
	/**
	 * <p>
	 * サービス開始年月日、プラン開始年月日をサービス開始日の導出論理に従って判定し、判定結果を返却します。<br>
	 * 
	 * サービス契約に友連れで機器オプションが開始されるケースでこの論理部品を呼び出すことは考慮しない。<br>
	 * そのようなケースで呼び出された場合、正しくないサービス開始日が判定結果として返却されうる。<br>
	 * 前述の理由により、各カレントは1世代前のものを考慮せず、カレントレコードのみで判定を行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号
	 * @param idoDiv 異動区分
	 * @param dojiStaUmu 同時申込有無
	 * 
	 * @return 判定結果
	 */
	public Map<String, String> getKkopSvKeiStDate(CAANMsg inCBSMsg, AgentDispatchContext inContext, String kkopSvcKeiNo, String idoDiv , String dojiStaUmu)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// 機器オプションサービス契約のカレントレコード取得
		JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
		CAANMsg kk2811Cur = kk2811Dba.getKK2811Current(kkopSvcKeiNo, opeDate);
		
		// 機器提供サービス契約のカレントレコードを取得
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		String kktkSvcKeiNo = kk2811Cur.getString(KK2811ETMsg.KKTK_SVC_KEI_NO);
		CAANMsg kk0341Cur = kk0341Dba.getKK0341Current(kktkSvcKeiNo, opeDate);
		
		String oyakeiSkbtCd = kk0341Cur.getString(KK0341ETMsg.OYA_KEI_SKBT_CD);

		
		// 機器オプションサービス契約、機器オプションサービスコードに紐付くサービス契約のカレントレコード取得
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		CAANMsg kk0081Cur = null;

		if(JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI.equals(oyakeiSkbtCd) || JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI_UCWK.equals(oyakeiSkbtCd)) {
			String svcKeiNo = kk0341Cur.getString(KK0341ETMsg.SVC_KEI_NO);
			kk0081Cur = kk0081Dba.getKK0081Current(svcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));
		} else {
			
			String kkopSvcCd = kk2811Cur.getString(KK2811ETMsg.KKOP_SVC_CD);
			kk0081Cur = kk0081Dba.getKK0081byKkopSvcKei(kkopSvcKeiNo, kkopSvcCd, null, opeDate);
			
			if (kk0081Cur == null)
			{
				return null;
			}
		}
		// サービス開始日の導出論理処理
		return getKkopSvcDateResult(kk0081Cur, kk0341Cur, kk2811Cur, idoDiv, dojiStaUmu);
	}
	
	
	/**
	 * <p>
	 * サービス開始年月日、プラン開始年月日の判定
	 * </p>
	 * @param kk0081Msg サービス契約のカレント
	 * @param kk0341Msg 機器提供サービス契約のカレント
	 * @param kk2811Msg 機器オプションサービス契約のカレント
	 * 
	 * @return 判定結果
	 */
	private Map<String, String> getKkopSvcDateResult(CAANMsg kk0081Msg, CAANMsg kk0341Msg, CAANMsg kk2811Msg, String idoDiv ,String dojiStaUmu)
	{
		
		// サービス開始日設定の判定に必要な項目を取得
		String svcKeiStat = kk0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT);
		String kktkSvcKeiStat = kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT);
		String kkopSvcCd = kk2811Msg.getString(KK2811ETMsg.KKOP_SVC_CD);
		
		// サービス開始日設定の返却結果に必要な項目を取得
		// サービス契約．サービス開始年月日
		String kk0081_svc_sta_ymd = kk0081Msg.getString(KK0081ETMsg.SVC_STA_YMD);
		// 機器提供サービス契約．サービス開始年月日
		String kk0341_svc_sta_ymd = kk0341Msg.getString(KK0341ETMsg.SVC_STA_YMD);
		// サービス契約．プラン開始年月日
		String kk0081_plan_sta_ymd = kk0081Msg.getString(KK0081ETMsg.PLAN_STAYMD);
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(kk2811Msg);
		
		// =====================================================================
		// 判定内容に因らない項目を一律設定
		// =====================================================================
		retMap = new HashMap<String, String>();
		retMap.put(RELATIVE_DATE_COUNT, "0");
		retMap.put(COUNT_METHOD, COUNT_METHOD_REALDAY);
		retMap.put(PRIORITY_STD_DT, null);
		
		
		// サービス開始日の導出論理処理
		//「サービス契約ステータス」が「サービス提供中」以前
		if (svcKeiStat.compareTo(JKKModelConst.SVC_KEI_STAT_SVCTK_CHU) < 0)
		{
			// 「機器オプションサービスコード」が「電話アダプター」の場合
			if (JKKModelConst.KKOP_SVC_CD_VA_ADPT.equals(kkopSvcCd))
			{
				retMap.put(STD_DT, kk0081_svc_sta_ymd);
				retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
			}
			// 「機器オプションサービスコード」が「電話アダプター」以外の場合
			else
			{
				// 「機器提供サービス契約ステータス」が「サービス提供中」以前の場合
				if (kktkSvcKeiStat.compareTo(JKKModelConst.KKTK_SVC_KEI_STAT_SVCTK_CHU) < 0)
				{
					retMap.put(STD_DT, kk0341_svc_sta_ymd);
					retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
				}
				// 「機器提供サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
				else if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(kktkSvcKeiStat)
						&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(kktkSvcKeiStat))
				{
					retMap.put(STD_DT, kk0081_svc_sta_ymd);
					retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
				}
			}
		}
		//「サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
		else if (!JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(svcKeiStat)
				&& !JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(svcKeiStat))
		{
			// 「機器オプションサービスコード」が「電話アダプター」の場合
			if (JKKModelConst.KKOP_SVC_CD_VA_ADPT.equals(kkopSvcCd))
			{
				// 「異動区分」が「光電話・番号追加」の場合
				if (JKKModelConst.IDO_DIV_HIKARI_TELNO_ADD.equals(idoDiv))
				{
					// 「機器提供サービス契約ステータス」が「サービス提供中」以前の場合
					if (JKKModelConst.UM_U.equals(dojiStaUmu) ||  
							kktkSvcKeiStat.compareTo(JKKModelConst.KKTK_SVC_KEI_STAT_SVCTK_CHU) < 0)
					{
						retMap.put(STD_DT, kk0341_svc_sta_ymd);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
					// 「機器提供サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
					else if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(kktkSvcKeiStat)
							&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(kktkSvcKeiStat))
					{
						retMap.put(STD_DT, kk0081_plan_sta_ymd);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
				}
				// 「異動区分」が「光電話・番号解約/光電話・番号回復」の場合
				else if (JKKModelConst.IDO_DIV_HIKARI_TELNO_DSL.equals(idoDiv)
						||JKKModelConst.IDO_DIV_HIKARI_TELNO_KAIHK.equals(idoDiv))
				{
					// 「機器提供サービス契約ステータス」が「サービス提供中」以前の場合
					if (JKKModelConst.UM_U.equals(dojiStaUmu) ||  
							kktkSvcKeiStat.compareTo(JKKModelConst.KKTK_SVC_KEI_STAT_SVCTK_CHU) < 0)
					{
						retMap.put(STD_DT, kk0341_svc_sta_ymd);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
					// 「機器提供サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
					else if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(kktkSvcKeiStat)
							&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(kktkSvcKeiStat))
					{
						retMap.put(STD_DT, opeDate);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
				}
				else
				{
					// 「機器提供サービス契約ステータス」が「サービス提供中」以前の場合
					if (JKKModelConst.UM_U.equals(dojiStaUmu) ||  
							kktkSvcKeiStat.compareTo(JKKModelConst.KKTK_SVC_KEI_STAT_SVCTK_CHU) < 0)
					{
						retMap.put(STD_DT, kk0341_svc_sta_ymd);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
					// 「機器提供サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
					else if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(kktkSvcKeiStat)
							&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(kktkSvcKeiStat))
					{
						retMap.put(STD_DT, opeDate);
						retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
					}
				}
			}
			// 「機器オプションサービスコード」が「電話アダプター」以外の場合
			else
			{
				// 「機器提供サービス契約ステータス」が「サービス提供中」以前の場合
				if (JKKModelConst.UM_U.equals(dojiStaUmu) ||  
						kktkSvcKeiStat.compareTo(JKKModelConst.KKTK_SVC_KEI_STAT_SVCTK_CHU) < 0)
				{
					retMap.put(STD_DT, kk0341_svc_sta_ymd);
					retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
				}
				// 「機器提供サービス契約ステータス」が「サービス提供中」以降(キャンセル・解約は除く)の場合
				else if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(kktkSvcKeiStat)
						&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(kktkSvcKeiStat))
				{
					retMap.put(STD_DT, opeDate);
					retMap.put(JUDGE_RESULT_STTI_SK, JUDGE_RESULT_STTI_SK_SVC_PLAN_STA);
				}
			}
		}
		
		// 基準日が算出されなかった場合、nullを返却する。呼出元はnullチェック必須
		if (retMap.get(STD_DT) == null) {
			return null;
		}
		
		return retMap;
	}
}
