/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetKapKeiTnmtInfoCC
*   ソースファイル名：JFUGetKapKeiTnmtInfoCC.java
*   作成者          ：富士通
*   日付            ：2014年05月09日
*＜機能概要＞
*   割賦契約端末情報取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00       2014/05/09   FJ)岡井     【ANK-2054-00-00】スマートリンク端末補償
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0011B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B008CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2541B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2541B501CBSMsg1List;

/**
 * 割賦契約端末情報取得コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUGetKapKeiTnmtInfoCC extends JFUBaseCC
{

	// ■割賦契約一覧照会（eoスマートリンク）
	/** テンプレートID(割賦契約一覧照会（eoスマートリンク）) */
	private static final String TMP_ID_EKK2541B501 = "EKK2541B501";
	/** テンプレートID(割賦契約一覧照会（eoスマートリンク）明細) */
	private static final String TMP_DTL_EKK2541B501 = EKK2541B501CBSMsg.EKK2541B501CBSMSG1LIST;
	/** IN項目リスト(割賦契約一覧照会（eoスマートリンク）) */
	private static final List<String> IN_COL_LIST_EKK2541B501 = Arrays.asList(EKK2541B501CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目(割賦契約一覧照会（eoスマートリンク）) */
	private static final String ERR_COL_EKK2541B501 = EKK2541B501CBSMsg.KEY_SVC_KEI_NO_ERR;

	// ■機器提供サービス契約一覧照会
	/** テンプレートID(機器提供サービス契約一覧照会) */
	private static final String TMP_ID_EKK0341B008 = "EKK0341B008";
	/** テンプレートID(機器提供サービス契約一覧照会明細) */
	private static final String TMP_DTL_EKK0341B008 = EKK0341B008CBSMsg.EKK0341B008CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一覧照会) */
	private static final List<String> IN_COL_LIST_EKK0341B008 = Arrays.asList(EKK0341B008CBSMsg.KEY_KKTK_SVC_KEI_NO);
	/** 関連チェックエラー項目(機器提供サービス契約一覧照会) */
	private static final String ERR_COL_EKK0341B008 = EKK0341B008CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR;

	// ■申込履歴一覧照会
	/** テンプレートID(申込履歴一覧照会) */
	private static final String TMP_ID_EKK0011B002 = "EKK0011B002";
	/** テンプレートID(申込履歴一覧照会明細) */
	private static final String TMP_DTL_EKK0011B002 = EKK0011B002CBSMsg.EKK0011B002CBSMSG1LIST;
	/** IN項目リスト(申込履歴一覧照会) */
	private static final List<String> IN_COL_LIST_EKK0011B002 = Arrays.asList(EKK0011B002CBSMsg.KEY_MSKM_DTL_NO);
	/** 関連チェックエラー項目(申込履歴一覧照会) */
	private static final String ERR_COL_EKK0011B002 = EKK0011B002CBSMsg.KEY_MSKM_DTL_NO_ERR;

	// ■IN項目
	/** サービス契約番号 */
	private static final String IN_SVC_KEI_NO = "svc_kei_no";

	// ■OUT項目
	/** 割賦契約情報リスト */
	private static final String OUT_KAP_KEI_TNMT_INFO_LIST = "kap_kei_tnmt_info_list";
	/** 申込年月日 */
	private static final String OUT_MSKM_YMD = "mskm_ymd";

	/**
	 * 割賦契約端末情報取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果格納マップ
		HashMap resultMap = new HashMap();
		// 結果格納リスト
		ArrayList kapKeiList = new ArrayList();

		// ●IN項目のチェック＆値取得処理
		if(!chkAndGetInItemsVal(param, fixedText, resultMap))
		{
			outDebugLog("■■■IN項目値不正■■■");

			// 結果格納
			resultMap.put(OUT_KAP_KEI_TNMT_INFO_LIST, kapKeiList);

			// リクエストパラメータを初期化
			param.removeData(fixedText);
			// リクエストパラメータに結果情報を設定
			param.setData(fixedText, resultMap);

			return param;
		}

		// ●割賦契約情報取得処理
		kapKeiList = getKapKeiInfo(handle, param, fixedText);
		if(isNullForAnyType(kapKeiList))
		{
			outDebugLog("■■■割賦契約情報未存在■■■");

			// 結果格納
			resultMap.put(OUT_KAP_KEI_TNMT_INFO_LIST, kapKeiList);

			// リクエストパラメータを初期化
			param.removeData(fixedText);
			// リクエストパラメータに結果情報を設定
			param.setData(fixedText, resultMap);

			return param;
		}

		// ●機器の申込年月日取得処理
		getKikiMskmYmd(handle, param, fixedText, kapKeiList);

		// ●結果格納
		resultMap.put(OUT_KAP_KEI_TNMT_INFO_LIST, kapKeiList);

		// リクエストパラメータを初期化
		param.removeData(fixedText);
		// リクエストパラメータに結果情報を設定
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * チェック処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * IN項目のチェックと値取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 * @return チェック結果
	 */
	private boolean chkAndGetInItemsVal(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// チェック結果
		boolean result = true;

		// サービス契約番号
		if(JFUBPCommon.isNull(dataMap.get(IN_SVC_KEI_NO)))
		{
			result = false;
		}
		else
		{
			resultMap.put(IN_SVC_KEI_NO, (String)dataMap.get(IN_SVC_KEI_NO));
		}

		return result;
	}

	/**
	 * 割賦契約情報取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 例外
	 * @return 割賦契約情報リスト
	 */
	private ArrayList getKapKeiInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 結果格納リスト
		ArrayList kapKeiList = new ArrayList();

		// ●割賦契約一覧照会（eoスマートリンク）(EKK2541B501)
		// ユーザデータ初期化
		initData(param, fixedText, IN_COL_LIST_EKK2541B501);
		// 検索エラーなし
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setEKK2541B501(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TMP_ID_EKK2541B501, TMP_DTL_EKK2541B501, IN_COL_LIST_EKK2541B501, ERR_COL_EKK2541B501);
		// 明細取得
		ArrayList eKK2541B501List = (ArrayList)dataMap.get(TMP_DTL_EKK2541B501);

		outDebugLog("■■■割賦契約一覧照会（eoスマートリンク）明細【" + eKK2541B501List + "】■■■");

		if(isNullForAnyType(eKK2541B501List))
		{
			// 明細が空の場合、処理を終了
			return kapKeiList;
		}

		for (int i = 0; i < eKK2541B501List.size(); i++)
		{
			HashMap childMap = (HashMap)eKK2541B501List.get(i);

			// 機器提供サービス契約ステータス
			String kktkSvcKeiStat = (String)childMap.get(EKK2541B501CBSMsg1List.KKTK_SVC_KEI_STAT);

			if(JFUStrConst.CD00056_910.equals(kktkSvcKeiStat) || JFUStrConst.CD00056_920.equals(kktkSvcKeiStat))
			{
				// 機器提供サービス契約ステータスがキャンセル済と解約済は除く
				continue;
			}

			// 有効な割賦契約情報を格納
			kapKeiList.add(childMap);
		}

		return kapKeiList;
	}

	/**
	 * 機器申込年月日取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kapKeiList 割賦契約情報リスト
	 * @throws Exception 例外
	 */
	private void getKikiMskmYmd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, ArrayList kapKeiList) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		for (int i = 0; i < kapKeiList.size(); i++)
		{
			HashMap kapKeiMap = (HashMap)kapKeiList.get(i);

			// 機器提供サービス契約番号
			String kktkSvcKeiNo = (String)kapKeiMap.get(EKK2541B501CBSMsg1List.KKTK_SVC_KEI_NO);

			// ●機器提供サービス契約一覧照会(EKK0341B008)
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0341B008);
			// 検索エラーなし
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setEKK0341B008(param, fixedText, kktkSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TMP_ID_EKK0341B008, TMP_DTL_EKK0341B008, IN_COL_LIST_EKK0341B008, ERR_COL_EKK0341B008);
			// 明細取得
			ArrayList eKK0341B008List = (ArrayList)dataMap.get(TMP_DTL_EKK0341B008);

			if(isNullForAnyType(eKK0341B008List))
			{
				// 空の場合、次へ
				continue;
			}

			// 最古レコードを取得
			HashMap eKK0341B008Map = (HashMap)eKK0341B008List.get(eKK0341B008List.size() - 1);
			if(isNullForAnyType(eKK0341B008Map))
			{
				// 空の場合、次へ
				continue;
			}

			// 申込明細番号
			String mskmDtlNo = (String)eKK0341B008Map.get(EKK0341B008CBSMsg1List.MSKM_DTL_NO);
			if(JFUBPCommon.isNull(mskmDtlNo))
			{
				// 空の場合、次へ
				continue;
			}

			// ●申込履歴一覧照会(EKK0011B002)
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0011B002);
			// 検索エラーなし
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setEKK0011B002(param, fixedText, mskmDtlNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TMP_ID_EKK0011B002, TMP_DTL_EKK0011B002, IN_COL_LIST_EKK0011B002, ERR_COL_EKK0011B002);
			// 明細取得
			ArrayList eKK0011B002List = (ArrayList)dataMap.get(TMP_DTL_EKK0011B002);

			if(isNullForAnyType(eKK0011B002List))
			{
				// 空の場合、次へ
				continue;
			}

			// 最古レコードを取得
			HashMap eKK0011B002Map = (HashMap)eKK0011B002List.get(eKK0011B002List.size() - 1);
			if(isNullForAnyType(eKK0011B002Map))
			{
				// 空の場合、次へ
				continue;
			}

			// 申込年月日
			String mskmYmd = (String)eKK0011B002Map.get(EKK0011B002CBSMsg1List.MSKM_YMD);
			if(JFUBPCommon.isNull(mskmYmd))
			{
				// 空の場合、次へ
				continue;
			}

			// 申込年月日を格納
			kapKeiMap.put(OUT_MSKM_YMD, mskmYmd);
		}
	}

	/**
	 * 割賦契約一覧照会（eoスマートリンク）の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 例外
	 */
	private void setEKK2541B501(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿サービス契約番号
		dataMap.put(EKK2541B501CBSMsg.KEY_SVC_KEI_NO, (String)dataMap.get(IN_SVC_KEI_NO));
	}

	/**
	 * 機器提供サービス契約一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @throws Exception 例外
	 */
	private void setEKK0341B008(IRequestParameterReadWrite param, String fixedText, String kktkSvcKeiNo) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿機器提供サービス契約番号
		dataMap.put(EKK0341B008CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
	}

	/**
	 * 申込履歴一覧照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @throws Exception 例外
	 */
	private void setEKK0011B002(IRequestParameterReadWrite param, String fixedText, String mskmDtlNo) throws Exception
	{
		// リクエストデータ
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿申込明細番号
		dataMap.put(EKK0011B002CBSMsg.KEY_MSKM_DTL_NO, mskmDtlNo);
	}

	/**
	 * 様々な型のNULLチェックを行います。
	 * 
	 * <br>
	 * @param obj チェック対象
	 * @return チェック結果
	 */
	private boolean isNullForAnyType(Object obj)
	{
		boolean result = false;

		if(obj == null)
		{
			// 引数がNULL
			result = true;
		}
		else if(obj instanceof ArrayList)
		{
			// ArrayList型
			result = obj == null || ((ArrayList)obj).size() == 0;
		}
		else if(obj instanceof HashMap)
		{
			// HashMap型
			result = obj == null || ((HashMap)obj).size() == 0;
		}

		return result;
	}

	/**
	 * デバッグログを出力します。
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void outDebugLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
}
