/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JEKK0351C240ETDA
 *	ソースファイル名：JEKK0351C240ETDA.java
 *	作成者			：富士通
 *	日付			：2011年10月19日
 *＜機能概要＞
 *	オプションサービス契約 ETMsgDBアクセス部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
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.KK0351ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0351C240CBSMsg;
import eo.ejb.cbs.mainproc.JKKejbIdoRsvUtil;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.edit.JKKejbEditYmdInit;
import eo.ejb.common.edit.JKKejbKK1681NumberParts;
import eo.ejb.common.rule.JKKejbRule0083001;

/**
 * <p>
 * オプションサービス契約解約ETMsgDBアクセス部品です。
 * </p>
 * @author 富士通
 */
public class JEKK0351C240ETDA 
{

	/**
	 * コンストラクタ
	 */
	public JEKK0351C240ETDA()
	{
	}

	/** 異動予約詳細コード：オプション解約 */
	private static final String IDO_RSV_CD_SVC_DSL = "016";
	/** 異動予約状態コード：予約手続中 */
	private static final String IDO_RSV_STAT_CD_RSV_TETUDUKI = "03"; 
	/** 異動予約スキーマID */
	private static final String IDO_RSV_SCHEMA_ID = "KK1681";
	/** 無効フラグ 有効 */
	private static final String MK_FLG_VALID = "0";
	/** 料金グループコード  ｅｏ光テレビ（Ｋ−ＣＡＴ）*/
	private static final String PRC_GRP_CD_TV_K_CAT = "11";
	/** 料金グループコード  ｅｏ光テレビ（再送信）*/
	private static final String PRC_GRP_CD_TV_RESEND = "13";

	/**
	 * 相関ルール振舞判定を行い、DBアクセス部品を呼び出す
	 * 
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		// ルールエンジン格納結果用リスト
		ArrayList<HashMap<String, Object>> rsltList = null;

		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0351C240ETDA.execDBAccess");

		// ルールエンジンインスタンスの生成
		JKKejbRule0083001 jkRule0083 = new JKKejbRule0083001(inCBSMsg);

		// ルールエンジン用入力値設定
		jkRule0083.setSvc_if_id(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		jkRule0083.setBase_date(inCBSMsg.getString(EKK0351C240CBSMsg.SVC_ENDYMD));
		jkRule0083.setOpe_date((String)JKKModelCommon.getOpeDate(inCBSMsg, inContext));

		// ルールエンジン実行
		rsltList = jkRule0083.referRuleEngine();

		if (null == rsltList)
		{
			// 相関ルールチェックの結果が0件の場合はエラーとする
			inCBSMsg.set(EKK0351C240CBSMsg.IDO_DIV_ERR, "EA");
			inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.TEMPLATE_CORRELATION_ERR);
			return;
		}

		// 相関ルールチェック結果を格納
		new JKKejbIdoRsvUtil().setOnlyIdoRsvFlg(inCBSMsg, inContext, rsltList);

		// メッセージ変換を行いDBアクセスを行う
		for(HashMap<String, Object> rs : rsltList)
		{
			execDBAccess(inCBSMsg, rs, inContext);
		}

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JEKK0351C240ETDA.execDBAccess");
	}

	/**
	 * DBAccessを行う
	 * 
	 * @param  inCBSMsg 入力パラメータのCBSMsg
	 * @param  rs       ルールエンジン実行結果格納マップ
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 */
	private void execDBAccess(CAANMsg inCBSMsg, HashMap<String, Object> rs, AgentDispatchContext inContext)
	{
		// ルールエンジンの振舞対象スキーマが異動予約の場合
		if (IDO_RSV_SCHEMA_ID.equals(rs.get(JKKejbRule0083001.TRGT_SCHEMA_ID)))
		{
			// 採番処理
			JKKejbKK1681NumberParts numberParts = new JKKejbKK1681NumberParts();
			String ido_rsv_no = numberParts.getIdoRsvNo(inCBSMsg, inContext);

			// 異動予約用Msg生成
			CAANMsg inETMsg = new CAANMsg(KK1681ETMsg.class.getName());

			// 異動予約番号	IDO_RSV_NO
			inETMsg.set(KK1681ETMsg.IDO_RSV_NO, ido_rsv_no);

			// 異動区分	IDO_DIV
			inETMsg.set(KK1681ETMsg.IDO_DIV, inCBSMsg.getString(EKK0351C240CBSMsg.IDO_DIV));

			// 異動予約詳細コード	IDO_RSV_DTL_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, IDO_RSV_CD_SVC_DSL);

			// 予約適用年月日	RSV_APLY_YMD
			String rsv_aply_ymd = JKKejbEditYmdInit.convRsvAplyYmdInit(inCBSMsg.getString(EKK0351C240CBSMsg.SVC_ENDYMD));
			inETMsg.set(KK1681ETMsg.RSV_APLY_YMD, rsv_aply_ymd);

			// 異動予約状態コード	IDO_RSV_STAT_CD
			inETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_RSV_STAT_CD_RSV_TETUDUKI);

			// 申込明細番号	MSKM_DTL_NO
			inETMsg.set(KK1681ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0351C240CBSMsg.MSKM_DTL_NO));

			// オプションサービス契約番号	OP_SVC_KEI_NO
			inETMsg.set(KK1681ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0351C240CBSMsg.OP_SVC_KEI_NO));

			// 違約金発生コード	PNLTY_HASSEI_CD
			inETMsg.set(KK1681ETMsg.PNLTY_HASSEI_CD, inCBSMsg.getString(EKK0351C240CBSMsg.PNLTY_HASSEI_CD));

			// Input．オプション引継先サービス契約番号が存在している場合
			if (!inCBSMsg.isNull(EKK0351C240CBSMsg.OP_HKTGI_SK_SVC_KEI_NO))
			{
				// Input．オプション引継先サービス契約番号を設定
				inETMsg.set(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO, inCBSMsg.getString(EKK0351C240CBSMsg.OP_HKTGI_SK_SVC_KEI_NO));				
			}

			// 料金グループが「ｅｏ光テレビ（Ｋ−ＣＡＴ）」か「ｅｏ光テレビ（再送信）」判定処理
			if(isChkPrcGrpCdTv(inCBSMsg))
			{
				// サービス課金終了年月日
				inETMsg.set(KK1681ETMsg.SVC_CHRG_ENDYMD, inCBSMsg.getString(EKK0351C240CBSMsg.SVC_CHRG_ENDYMD));
			}

			// 登録年月日時分秒	ADD_DTM
			inETMsg.set(KK1681ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

			// 登録オペレータアカウント	ADD_OPEACNT
			inETMsg.set(KK1681ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 更新年月日時分秒	UPD_DTM
			inETMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));

			// 更新オペレータアカウント	UPD_OPEACNT
			inETMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			// 無効フラグ	MK_FLG
			inETMsg.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);

			// 登録処理の実行
			JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
			dbaUtil.create(inETMsg);
			
			// 返却項目メッセージ生成
			inCBSMsg.set(EKK0351C240CBSMsg.ADD_DTM, inETMsg.getString(KK1681ETMsg.ADD_DTM));
			inCBSMsg.set(EKK0351C240CBSMsg.ADD_OPEACNT, inETMsg.getString(KK1681ETMsg.ADD_OPEACNT));
			inCBSMsg.set(EKK0351C240CBSMsg.UPD_DTM, inETMsg.getString(KK1681ETMsg.UPD_DTM));
			inCBSMsg.set(EKK0351C240CBSMsg.UPD_OPEACNT, inETMsg.getString(KK1681ETMsg.UPD_OPEACNT));
			inCBSMsg.set(EKK0351C240CBSMsg.MK_FLG, inETMsg.getString(KK1681ETMsg.MK_FLG));
		}
	}
	
	/**
	 * <p>
	 * 料金グループが「ｅｏ光テレビ（Ｋ−ＣＡＴ）」か「ｅｏ光テレビ（再送信）」判定処理
	 * </p>
	 * @param inCBSMsg 入力パラメータのCBSMsg
	 * @return 「ｅｏ光テレビ（Ｋ−ＣＡＴ）」か「ｅｏ光テレビ（再送信）」の場合true
	 */
	private boolean isChkPrcGrpCdTv(CAANMsg inCBSMsg)
	{
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		// オプションサービス契約番号
		String opSvcKeiNo = inCBSMsg.getString(EKK0351C240CBSMsg.OP_SVC_KEI_NO);

		// 内部スキーマメッセージを作成(オプションサービス契約)
		CAANMsg inMsgKK0351 = new CAANMsg(KK0351ETMsg.class.getName());

		// パラメータ設定
		inMsgKK0351.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inMsgKK0351.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレントレコードを取得する。
		CAANMsg curMsgKK0351 = new JKKejbKK0351DBABase().findByCurrent(inMsgKK0351);
		
		if(null == curMsgKK0351)
		{
			return false;
		}

		// サービス契約番号
		String svcKeiNo = curMsgKK0351.getString(KK0351ETMsg.SVC_KEI_NO);

		// サービス契約番号が取得でない場合
		if (null == svcKeiNo || "".equals(svcKeiNo))
		{
			// サービス契約内訳メッセージ生成
			CAANMsg inMsgKK0161 = new CAANMsg(KK0161ETMsg.class.getName());

			// サービス契約番号
			String svcKeiUcwkNo = curMsgKK0351.getString(KK0351ETMsg.SVC_KEI_UCWK_NO);

			// サービス契約内訳設定
			inMsgKK0161.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
			inMsgKK0161.set(KK0161ETMsg.RSV_APLY_YMD, opeDate);

			// サービス契約内訳カレント検索を行う
			CAANMsg curMsgKK0161 = new JKKejbKK0161DBABase().findByCurrent(inMsgKK0161);

			if(null == curMsgKK0161)
			{
				return false;
			}

			svcKeiNo = curMsgKK0161.getString(KK0161ETMsg.SVC_KEI_NO);

		}

		// サービス契約メッセージ生成
		CAANMsg inMsgKK0081 = new CAANMsg(KK0081ETMsg.class.getName());

		// サービス契約設定
		inMsgKK0081.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inMsgKK0081.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);

		// サービス契約カレント検索を行う
		CAANMsg curMsgKK0081 = new JKKejbKK0081DBABase().findByCurrent(inMsgKK0081);

		if(null == curMsgKK0081)
		{
			return false;
		}

		// 料金グループコード
		String prcGrpCd = curMsgKK0081.getString(KK0081ETMsg.PRC_GRP_CD);

		// 料金グループコードが「ｅｏ光テレビ（Ｋ−ＣＡＴ）」か「ｅｏ光テレビ（再送信）」の場合
		if (PRC_GRP_CD_TV_K_CAT.equals(prcGrpCd) || PRC_GRP_CD_TV_RESEND.equals(prcGrpCd))
		{
			return true;
		}

		return false;
	}
}