/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK1681C011TPMA
*	ソースファイル名：JEKK1681C011TPMA.java
*	作成者			：富士通
*	日付			：2013年05月26日
*＜機能概要＞
*	異動予約期日到来済・未反映情報取得の独自処理を呼び出す部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/05/26	FJ)竹内		新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.ZM0171ETMsg;
import eo.ejb.cbm.entity.ZM0171LE;
import eo.ejb.cbs.cbsmsg.EKK1681C011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681C011CBSMsg1List;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK1681SecProc;
import eo.ejb.common.entity.JKKejbIdoRestrictController;

/**
 * <p>
 * 異動予約期日到来済・未反映情報取得の顧客独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK1681C011TPMA implements TemplateMainHandler
{

	/** コード種別コード（異動区分） */
	private static final String CD_SBT_CD_IDO_DIV = "CD00576"; 

	/** コード種別コード（異動予約詳細コード） */
	private static final String CD_SBT_CD_IDO_RSV_DTL_CD = "CD01167"; 

	/**
	 * <p>
	 * 異動予約期日到来済・未反映情報取得の独自処理を呼び出します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK1681C011TPMA#invoke");

		if (inCBSMsg.isNull(EKK1681C011CBSMsg.KEY_SVC_KEI_NO))
		{
			return;
		}

		// 異動可否判定チェック部品の呼び出し
		JKKejbIdoRestrictController idoKh = new JKKejbIdoRestrictController(inCBSMsg);
		
		// 呼び出しパラメータの設定
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		idoKh.setBaseDate(opeDate);
		idoKh.setTg_skbt_cd(JKKejbIdoRestrictController.TG_SKBT_CD_KK0081);
		idoKh.setSvc_kei_no(inCBSMsg.getString(EKK1681C011CBSMsg.KEY_SVC_KEI_NO));

		// 異動予約取得処理
		List<CAANMsg> kk1681MsgList = idoKh.getAllIdoRsvList();

		// 契約の回復(または解約取消)時に、予約取消対象となる「異動予約」リスト
		kk1681MsgList = new JKKejbKK1681SecProc().getIdoRsvForKaihkJiRsvCl(kk1681MsgList, opeDate);

		// 取得結果(異動予約リスト)の設定
		setIdoRsv(inCBSMsg, kk1681MsgList);

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK1681C011TPMA#invoke");
	}

	
	/**
	 * <p>
	 * 取得結果の異動予約リストを出力項目に設定します。<br>
	 * また、必要に応じて各種コード区分のコード区分名称を取得します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param kk1681MsgList 異動予約リスト
	 */
	private void setIdoRsv(CAANMsg inCBSMsg, List<CAANMsg> kk1681MsgList)
	{
		ArrayList rsltMsgList = new ArrayList();
		for (CAANMsg kk1681Msg : kk1681MsgList)
		{
			CAANMsg inCBSMsg1List = new CAANMsg("eo.ejb.cbs.cbsmsg.EKK1681C011CBSMsg1List");
			// 異動予約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_RSV_NO, kk1681Msg.getString(KK1681ETMsg.IDO_RSV_NO));
			// 異動区分
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_DIV, kk1681Msg.getString(KK1681ETMsg.IDO_DIV));
			// 異動区分名称
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_DIV_NM,
					getZM0171Primary(CD_SBT_CD_IDO_DIV, kk1681Msg.getString(KK1681ETMsg.IDO_DIV)).getString(ZM0171ETMsg.CD_DIV_NM));
			// 異動予約詳細コード
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_RSV_DTL_CD, kk1681Msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD));
			// 異動予約詳細コード名称
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_RSV_DTL_CD_NM,
					getZM0171Primary(CD_SBT_CD_IDO_RSV_DTL_CD, kk1681Msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)).getString(ZM0171ETMsg.CD_DIV_NM));
			// 予約適用年月日
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.RSV_APLY_YMD, kk1681Msg.getString(KK1681ETMsg.RSV_APLY_YMD));
			// 異動予約状態コード
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.IDO_RSV_STAT_CD, kk1681Msg.getString(KK1681ETMsg.IDO_RSV_STAT_CD));
			// 申込明細番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.MSKM_DTL_NO, kk1681Msg.getString(KK1681ETMsg.MSKM_DTL_NO));
			// サービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.SVC_KEI_NO));
			// サービス契約内訳番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.SVC_KEI_UCWK_NO, kk1681Msg.getString(KK1681ETMsg.SVC_KEI_UCWK_NO));
			// オプションサービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.OP_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.OP_SVC_KEI_NO));
			// サブオプションサービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.SBOP_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.SBOP_SVC_KEI_NO));
			// 機器提供サービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.KKTK_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.KKTK_SVC_KEI_NO));
			// 割引サービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.WRIB_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.WRIB_SVC_KEI_NO));
			// オプション引継先サービス契約番号
			inCBSMsg1List.set(EKK1681C011CBSMsg1List.OP_HKTGI_SK_SVC_KEI_NO, kk1681Msg.getString(KK1681ETMsg.OP_HKTGI_SK_SVC_KEI_NO));

			rsltMsgList.add(inCBSMsg1List);
		}

		//異動予約期日到来済・未反映情報取得明細
		inCBSMsg.set(EKK1681C011CBSMsg.EKK1681C011CBSMSG1LIST, (CAANMsg[])rsltMsgList.toArray(new CAANMsg[0]));

		return;
	}

	/**
	 * <p>
	 * コード名称管理のプライマリレコードを取得を行います。
	 * </p>
	 * @param cdSbtCd コード種別コード
	 * @param cdDiv コード区分
	 * @return コード種別コード、コード区分に紐付くコード名称管理のプライマリレコード
	 */
	private CAANMsg getZM0171Primary(String cdSbtCd, String cdDiv)
	{
		CAANMsg searchKey = new CAANMsg(ZM0171ETMsg.class.getName());
		searchKey.set(ZM0171ETMsg.CD_SBT_CD, cdSbtCd);
		searchKey.set(ZM0171ETMsg.CD_DIV, cdDiv);
		
		CAANMsg outMsg1 = new ZM0171LE().findByPrimaryKey(searchKey);
		
		// 検索結果が未設定または無効フラグが"無効"の場合
		if (outMsg1 == null 
				|| JKKModelConst.MK_FLG_MK.equals(outMsg1.getString(ZM0171ETMsg.MK_FLG)))
		{
			throw new CAANRuntimeException("該当のコード名称管理が存在しません。コード種別コード:" + cdSbtCd + "コード区分:" + cdDiv);
		}
		
		return outMsg1;
	}

}
