/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK2811ETDA
*   ソースファイル名：JKKejbKK2811ETDA.java
*   作成者          ：富士通
*   日付            ：2013年11月14日
*＜機能概要＞
*   機器オプションサービス契約のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v7.00.00    2011/11/14  富士通      新規作成
*   v9.00.00    2014/04/30  FJ)小島     ANK-2054-00-00
*   v10.00.00   2014/08/27  FJ)中野     IT2-2014-0000289
*   v10.00.01   2014/09/02  FJ)中野     IT2-2014-0000289
*
**********************************************************************/

package eo.ejb.common.db;

import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
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.cbs.cbsmsg.EKK2811C150CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.rule.JKKejbRule0083001;
import eo.ejb.common.rule.JKKejbRule0091001;

/**
 * <p>
 * 機器オプションサービス契約のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK2811ETDA
{

	/** スキーマID 機器オプションサービス契約 */
	public static final String SCHEMAID_KKOPSVCKEI = "KK2811";

	/** スキーマID 異動予約 */
	public static final String SCHEMAID_IDORSV = "KK1681";

	/**
	 * <p>
	 * 新しいJKKejbKK2811ETDAを作成します。
	 * </p>
	 */
	public JKKejbKK2811ETDA()
	{
	}

	/**
	 * <p>
	 * 異動対象スキーマ判定相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg  CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param baseDate  即時／予約を判断する基準日付
	 * @return 異動対象スキーマ判定相関ルール実行結果のリスト
	 */
	public List<HashMap<String, Object>> execSokanOfIdoJdg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String baseDate)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// 相関ルールにて振舞うスキーマを判定
		JKKejbRule0083001 rule0083 = new JKKejbRule0083001(inCBSMsg);
		rule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		rule0083.setBase_date(baseDate);
		rule0083.setOpe_date(opeDate);
		
		List<HashMap<String, Object>> ruleList = rule0083.referRuleEngine();
		
		return ruleList;
	}

	/**
	 * <p>
	 * 異動対象スキーマ判定相関ルールの結果を元に振舞うスキーマを判定します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param ruleList　異動対象スキーマ判定相関ルール実行結果のリスト
	 * @return 振舞対象スキーマ
	 */
	public String judgeSchema(CAANMsg inCBSMsg, AgentDispatchContext inContext, List<HashMap<String, Object>> ruleList)
	{
		String ret = null;
		
		for (HashMap<String, Object> hm : ruleList)
		{
			if (SCHEMAID_KKOPSVCKEI.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				ret = SCHEMAID_KKOPSVCKEI;
			}
			if (SCHEMAID_IDORSV.equals(hm.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
			{
				ret = SCHEMAID_IDORSV; 
			}
		}
		
		return ret;
	}

	/**
	 * <p>
	 * サービス課金開始日(機器オプションサービス契約)相関ルールを実行しサービス課金開始日を返却します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号(必須)
	 * @param idoDiv 異動区分(解約の場合不要)
	 * @param kk2811SvcStaYmd 機器オプションサービス契約のサービス開始年月日(解約の場合不要)
	 * @param opeDate 運用日付(必須)
	 * @param svcIfId サービスIF ID(必須)
	 * 
	 * @return 相関ルールで算出したサービス課金開始年月日
	 */
	public String getChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			String kkopSvcKeiNo, String idoDiv, String kk2811SvcStaYmd, String opeDate, String svcIfId)
	{
		// 機器オプションサービス契約に振舞う場合
		// 機器オプションサービス契約のカレント取得
		JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
		CAANMsg kk2811Cur = kk2811Dba.getKK2811Current(kkopSvcKeiNo, opeDate);
		
		// 課金開始日設定(機器オプションサービス契約)相関ルール
		JKKejbRule0091001 rule0091 = new JKKejbRule0091001(inCBSMsg);
		// 開始日設定(機器オプションサービス)で算出した開始日
		rule0091.setKK2811Svc_sta_ymd(kk2811SvcStaYmd);
		// 機器オプションサービスコード
		rule0091.setKkop_svc_cd(kk2811Cur.getString(KK2811ETMsg.KKOP_SVC_CD));
		// 異動区分
		rule0091.setIdo_div(idoDiv);
		
		// 更新契機
		if ("EKK2811C070".equals(svcIfId) || "EKK2811C260".equals(svcIfId)) {
			// 開始、料金プラン変更のS-IFのため、「開始」を固定で設定
			rule0091.setUpd_opty("1");
		}
		else if ("EKK2811C150".equals(svcIfId))
		{
			// 解約のS-IFのため、「解約」を固定で設定
			rule0091.setUpd_opty("0");
		}
		
		String chrgStaymd = null;
		String chrgEndymd = null;
		// IT2-2014-0000289 ADD START
		String svcChrgEndymd = null;
		// IT2-2014-0000289 ADD END
		// 呼出元：機器オプションサービス契約解約確定
		if ("EKK2811C150".equals(svcIfId))
		{
			// サービス課金開始年月日
			chrgStaymd = kk2811Cur.getString(KK2811ETMsg.SVC_CHRG_STAYMD);
			// サービス課金終了年月日
			chrgEndymd = kk2811Cur.getString(KK2811ETMsg.SVC_CHRG_ENDYMD);
			// IT2-2014-0000289 ADD START
			// サービス課金終了年月日（入力）
			svcChrgEndymd = inCBSMsg.getString(EKK2811C150CBSMsg.SVC_CHRG_ENDYMD);
			// IT2-2014-0000289 ADD END
			
			// IT2-2014-0000289 ADD START
			// 課金開始前／開始後
			rule0091.setChrg_sta_zengo(getChrgStaZengo(chrgStaymd, svcChrgEndymd));
			// IT2-2014-0000289 ADD END
			// 解約時課金
			rule0091.setDsl_ji_chrg(inCBSMsg.getString(EKK2811C150CBSMsg.DSL_JI_CHRG));
			// IT2-2014-0000289 ADD START
			String dslJiChrg = inCBSMsg.getString(EKK2811C150CBSMsg.DSL_JI_CHRG);
			// 非課金の場合、サービス終了年月日を設定
			if (JKKModelConst.DSL_JI_NOCHRG.equals(dslJiChrg))
			{
				chrgEndymd = inCBSMsg.getString(EKK2811C150CBSMsg.SVC_ENDYMD);
			}
			// IT2-2014-0000289 ADD END
			// IT2-2014-0000289 DEL START
			// 課金開始前／開始後
			// rule0091.setChrg_sta_zengo(getChrgStaZengo(chrgStaymd, chrgEndymd));
			// IT2-2014-0000289 DEL END
		}
		// 呼出元：機器オプションサービス契約料金プラン変更確定
		else if ("EKK2811C260".equals(svcIfId))
		{
			// プラン課金開始年月日
			chrgStaymd = kk2811Cur.getString(KK2811ETMsg.PLAN_CHRG_STAYMD);
			// プラン課金終了年月日
			chrgEndymd = kk2811Cur.getString(KK2811ETMsg.PLAN_CHRG_ENDYMD);

			// 解約時課金 料金プラン変更の場合は設定不要
			// 課金開始前／開始後
			rule0091.setChrg_sta_zengo(getChrgStaZengo(chrgStaymd, chrgEndymd));
		}

		// 機器オプションサービス契約のカレントのサービス課金開始年月日（またはプラン課金開始年月日）
		rule0091.setKK2811Svc_chrg_sta_ymd(chrgStaymd);
		// 機器オプションサービス契約のカレントのサービス終了年月日（またはプラン課金終了年月日）
		rule0091.setKK2811Svc_end_ymd(chrgEndymd);
		
		// 機器提供サービス契約のカレントレコードを取得
		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);
		
		if(JKKModelConst.OYA_KEI_SKBT_CD_SVC_KEI_KAISEN_UCWK.equals(oyakeiSkbtCd)) {
		 
			// サービス契約のカレントを取得
			// ネットの機器オプションサービス契約であっても電話のサービス契約を取得する。
			// 電話のサービス契約が取得できなかった場合、設定しない。
			// （光電話・番号追加/光電話・番号解約/光電話・番号回復の場合にのみ返却する項目のため）
			JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
			CAANMsg kk0081Cur = kk0081Dba.getKK0081byKkopSvcKei(kkopSvcKeiNo, JKKModelConst.KKOP_SVC_CD_VA_ADPT, null, opeDate);
			if (kk0081Cur != null)
			{
				// 電話のサービス契約のプラン課金開始年月日を設定
				rule0091.setKK0081_svc_chrg_sta_ymd(kk0081Cur.getString(KK0081ETMsg.PLAN_CHRG_STAYMD));
			}
		}
		
		return rule0091.getChrgStaYmd();
	}
	
	/**
	 * <p>
	 * 課金開始前／開始後を返却します。
	 * サービス課金開始年月日（またはプラン課金開始年月日）とサービス課金終了年月日(またはプラン課金終了年月日) を大小比較し、
	 * 課金開始前／開始後を決定。
	 * </p>
	 * @param chrgStaymd サービス課金開始年月日（またはプラン課金開始年月日）
	 * @param chrgEndymd サービス課金終了年月日(またはプラン課金終了年月日) 
	 * @return 課金開始前／開始後
	 */
	private String getChrgStaZengo(String chrgStaymd, String chrgEndymd)
	{

		// 課金開始前／開始後
		if (chrgStaymd != null && chrgEndymd != null && JKKModelCommon.isPastDate(chrgStaymd, chrgEndymd, "1"))
		{
			// 1:サービス課金開始年月日(またはプラン課金開始年月日) ≦ サービス課金終了年月日(またはプラン課金終了年月日) の場合
			return "1";
		}
		else
		{
			// 0:サービス課金開始年月日(またはプラン課金開始年月日) ＞ サービス課金終了年月日(またはプラン課金終了年月日) の場合
			return "0";
		}
	}
}
