/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0451ETDA
*   ソースファイル名：JKKejbKK0451ETDA.java
*   作成者          ：富士通
*   日付            ：2013年10月12日
*＜機能概要＞
*   割引サービス契約のDBアクセス部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   ｖ5.00.00    2013/10/12  FJ)寺園     OM-2013-0003102
*
**********************************************************************/

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.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK0481ETMsg;
import eo.ejb.cbm.entity.KK0481LE;
import eo.ejb.cbm.entity.KK0851ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * 割引サービス契約のDBアクセス部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0451ETDA
{

	/** 割引解約キャンセル契機コード 自動設定 */
	private static final String WRIB_DSL_CNCL_OPTY_CD_AUTO = "1";

	/**
	 * <p>
	 * 新しいJKKejbKK0451ETDAを作成します。
	 * </p>
	 */
	public JKKejbKK0451ETDA()
	{
	}

	/**
	 * <p>
	 * 割引サービス契約DBアクセス処理
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// 割引サービス契約DBアクセス処理の呼出し
		dbAccessWribSvcKei(inCBSMsg, inContext, svcKeiNo);
	}

	/**
	 * <p>
	 * 割引サービス契約DBアクセス処理を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * </p>
	 */
	private void dbAccessWribSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// サービス契約のカレントレコードを取得
		CAANMsg ret0081 = getCurrentSvcKei(inCBSMsg, inContext, svcKeiNo);
		String pnltyHasseiCd = ret0081.getString(KK0081ETMsg.PNLTY_HASSEI_CD); // 違約金発生コードを設定

		// サービス契約の違約金発生コードが未設定の場合は処理しない
		if (pnltyHasseiCd == null)
		{
			return;
		}

		// サービス契約番号に紐付く割引対象サービス契約のカレントレコードを取得
		CAANMsg[] conRetMsg = getWrisvcTgKei(inCBSMsg, inContext, svcKeiNo);

		// サービス契約番号に紐付く割引対象サービス契約が存在しない場合
		if (null == conRetMsg)
		{
			return;
		}

		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		for (CAANMsg retMsg : conRetMsg)
		{
			// プライマリキーを取得
			primaryKey = retMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索
				CAANMsg curInMsg = new CAANMsg(KK0451ETMsg.class.getName());
				curInMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, primaryKey);
				curInMsg.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetMsg = new JKKejbKK0451DBABase().findByCurrent(curInMsg);

				// カレントが存在しない場合
				if (null == curRetMsg)
				{
					continue;
				}

				// 割引サービス対象サービスのカレント検索
				CAANMsg curKK0851ETMsg = new CAANMsg(KK0851ETMsg.class.getName());
				curKK0851ETMsg.set(KK0851ETMsg.WRIB_SVC_TRGT_SVC_CD, retMsg.getString(KK0481ETMsg.WRIB_SVC_TRGT_SVC_CD));
				curKK0851ETMsg.set(KK0851ETMsg.RSV_APLY_YMD, opeDate);
				CAANMsg curRetKK0851ETMsg = new JKKejbKK0851DBABase().findByCurrent(curKK0851ETMsg);

				// カレントが存在しない場合
				if (null == curRetKK0851ETMsg)
				{
					continue;
				}

				// 成立条件が該当しない場合は処理しない
				if (!("1".equals(curRetKK0851ETMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_SBT_CD)) || 
						("2".equals(curRetKK0851ETMsg.getString(KK0851ETMsg.WRIB_SVC_TRGT_SVC_SBT_CD)))))
				{
					continue;
				}
				
				String stat = curRetMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_STAT);
				String wribDslCnclOptyCd = curRetMsg.getString(KK0451ETMsg.WRIB_DSL_CNCL_OPTY_CD);

				// カレントの状態が"解約済"以外の場合は処理しない
				if (!(JKKModelConst.WRIB_SVC_KEI_STAT_DSL_ZM.equals(stat)))
				{
					continue;
				}

				// 割引解約キャンセル契機コードが"自動設定"以外の場合は処理しない
				if (!(WRIB_DSL_CNCL_OPTY_CD_AUTO.equals(wribDslCnclOptyCd)))
				{
					continue;
				}

				// 違約金発生コードがサービス契約と異なる場合
				if (!curRetMsg.isNull(KK0451ETMsg.PNLTY_HASSEI_CD) && !pnltyHasseiCd.equals(curRetMsg.getString(KK0451ETMsg.PNLTY_HASSEI_CD)))
				{
					// メッセージの設定
					curRetMsg.set(KK0451ETMsg.PNLTY_HASSEI_CD, pnltyHasseiCd);
					curRetMsg = setWribSvcKeiColumn(inCBSMsg, inContext, curRetMsg);

					// DB登録
					create(inCBSMsg, curRetMsg);
				}
			}
		}
	}

	/**
	 * <p>
	 * サービス契約番号に紐付く割引サービス対象契約を返却します。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 有効な割引サービス対象契約(カレント)
	 * </p>
	 */
	private CAANMsg[] getWrisvcTgKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// サービス契約番号に紐付く割引サービス対象契約を取得
		CAANMsg conInMsg = new CAANMsg(KK0481ETMsg.class.getName());
		conInMsg.set(KK0481ETMsg.SVC_KEI_NO, svcKeiNo);
		conInMsg.set(KK0481ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);
		CAANMsg[] conRetMsg = null;
		try
		{
			conRetMsg = new KK0481LE().findByCondition(conInMsg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String primaryKey = null;
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		ArrayList<CAANMsg> wribSvcTargetKeiList = new ArrayList<CAANMsg>();

		for (CAANMsg retMsg : conRetMsg)
		{
			// プライマリキーを取得(割引サービス契約を検索するための処理なので、割引サービス契約番号を取得できればいい)
			primaryKey = retMsg.getString(KK0481ETMsg.WRIB_SVC_KEI_NO);

			if (!escapeMap.containsKey(primaryKey))
			{
				// 初検索の場合
				escapeMap.put(primaryKey, null);

				// カレント検索
				CAANMsg curInMsg = new CAANMsg(KK0481ETMsg.class.getName());
				curInMsg.set(KK0481ETMsg.WRIB_SVC_KEI_NO, primaryKey);
				curInMsg.set(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO, retMsg.getString(KK0481ETMsg.WRIB_SVC_TRGT_KEI_NO));
				CAANMsg curRetMsg = new JKKejbKK0481DBABase().findByCurrent(curInMsg);

				// 抽出条件と同じ条件のカレントのみ対象
				if (svcKeiNo.equals(curRetMsg.getString(KK0481ETMsg.SVC_KEI_NO))
						&& JKKModelConst.MK_FLG_YK.equals(curRetMsg.getString(KK0481ETMsg.MK_FLG)))
				{
					wribSvcTargetKeiList.add(retMsg);
				}
			}
		}

		if (0 < wribSvcTargetKeiList.size())
		{
			return wribSvcTargetKeiList.toArray(new CAANMsg[0]);
		}

		// 有効レコードが存在しない場合
		return null;
	}

	/**
	 * <p>
	 * 割引サービス契約の項目の設定を行います。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 割引サービス契約のメッセージ
	 * @return inMsg 編集後の割引サービス契約のメッセージ
	 * </p>
	 */
	private CAANMsg setWribSvcKeiColumn(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// 世代登録年月日時分秒
		inMsg.set(KK0451ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));

		inMsg.set(KK0451ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0451ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		inMsg.set(KK0451ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inMsg.set(KK0451ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		return inMsg;
	}

	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約のカレントレコード
	*/
	private CAANMsg getCurrentSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// カレント検索
		CAANMsg curInMsg = new CAANMsg(KK0081ETMsg.class.getName());
		curInMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		curInMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		CAANMsg curRetMsg = new JKKejbKK0081DBABase().findByCurrent(curInMsg);

		return curRetMsg;
	}

	/**
	 * <p>
	 * データベースへの登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg 登録対象DBのメッセージキャリア(ETメッセージ)
	 */
	private void create(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		
		// レコード登録
		dba.create(inETMsg);
	}
}
