/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetNewKeiMskmInfoCC
*   ソースファイル名：JFUGetNewKeiMskmInfoCC.java
*   作成者          ：富士通
*   日付            ：2013年05月02日
*＜機能概要＞
*   サービス契約申込情報取得コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/05/02   FJ) 岡井    新規作成
*   v10.00      2014/09/25   FJ）文元    【OM-2014-0003119】電話単独時契約付加未設定対応
*
**********************************************************************/
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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B030CBSMsg;

/**
 * サービス契約申込情報取得コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUGetSvcKeiMskmInfoCC extends JFUBaseCC
{
	// ■申込明細履歴一覧照会
	/** テンプレートID 申込明細履歴一覧照会 */
	private static final String TEMP_ID_EKK0021B002 = "EKK0021B002";
	/** テンプレートID(明細) 申込明細履歴一覧照会 */
	private static final String TEMP_DTL_EKK0021B002 = EKK0021B002CBSMsg.EKK0021B002CBSMSG1LIST;
	/** IN項目リスト 申込明細履歴一覧照会 */
	private static final List<String> IN_COLUMN_LIST_EKK0021B002 = Arrays.asList(EKK0021B002CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目 申込明細履歴一覧照会 */
	private static final String ERROR_COLUMN_EKK0021B002 = EKK0021B002CBSMsg.KEY_SVC_KEI_NO_ERR;

	// ■申込一意照会
	/** テンプレートID 申込一意照会 */
	private static final String TEMP_ID_EKK0011A010 = "EKK0011A010";
	/** テンプレートID(明細) 申込一意照会 */
	private static final String TEMP_DTL_EKK0011A010 = EKK0011A010CBSMsg.EKK0011A010CBSMSG1LIST;
	/** IN項目リスト 申込一意照会 */
	private static final List<String> IN_COLUMN_LIST_EKK0011A010 = Arrays.asList(EKK0011A010CBSMsg.KEY_MSKM_NO, EKK0011A010CBSMsg.KEY_GENE_ADD_DTM);
	/** 関連チェックエラー項目 申込一意照会 */
	private static final String ERROR_COLUMN_EKK0011A010 = EKK0011A010CBSMsg.KEY_MSKM_NO_ERR;

	/* ■□ 機器提供サービス契約一覧照会（識別子指定）SC ■□ */
	/** テンプレートID(機器提供サービス契約一覧照会（識別子指定）) */
	private static final String TEMP_ID_EKK0341B030 = "EKK0341B030";
	/** テンプレートID(機器提供サービス契約一覧照会（識別子指定）明細) */
	private static final String TEMP_DTL_EKK0341B030 = EKK0341B030CBSMsg.EKK0341B030CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一覧照会（識別子指定）) */
	private static final List<String> IN_COLUMN_LIST_EKK0341B030 =
			Arrays.asList(EKK0341B030CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO);
	/** 関連チェック,エラー項目(機器提供サービス契約一覧照会（識別子指定）) */
	private static final String ERROR_COLUMN_EKK0341B030 = EKK0341B030CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO_ERR;

	// ■IN項目
	/** ＫＥＹ＿サービス契約番号リスト */
	private static final String KEY_SVC_KEI_NO_LIST = "key_svc_kei_no_list";
	/** ＫＥＹ＿サービス契約番号 */
	private static final String KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** 検索エラーなし */
	private static final String IGNORE_SEARCH_ERR = "ignore_search_err";
	/** ＫＥＹ＿サービス契約回線内訳番号 */
	private static final String KEY_SVC_KEI_KAISEN_UCWK_NO = "key_svc_kei_kaisen_ucwk_no";
	
	// ■OUT項目
	/** JFUGetNewKeiMskmInfoCCList */
	private static final String JFUGETSVCKEIMSKMINFOCCLIST = "JFUGetSvcKeiMskmInfoCCList";
	/** KaisenUcwkKikiInfoList */
	private static final String KAISENUCWKKIKIINFOLIST = "KaisenUcwkKikiInfoList";

	/**
	 * サービス契約申込情報取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果返却マップ
		HashMap resultMap = new HashMap();
		// 結果返却リスト
		ArrayList outList = null;

		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);

		// IN項目取得
		ArrayList inList = getInSvcKeiNoList(param, fixedText);

		// IN項目が正しく設定されていない場合、処理を終了する
		if (inList == null || inList.size() == 0)
		{
			return param;
		}

		// ●申込明細履歴一覧照会
		ArrayList eKK0021B002List = doEKK0021B002(handle, param, fixedText, inList);

		// ●申込一意照会
		outList = doEKK0011A010(handle, param, fixedText, eKK0021B002List);

		// ●サービス契約回線内訳番号
		String svcKeiKaisenUcwkNo = JFUStrConst.EMPTY;
		if (paramMap.containsKey(KEY_SVC_KEI_KAISEN_UCWK_NO))
		{
			svcKeiKaisenUcwkNo = (String)paramMap.get(KEY_SVC_KEI_KAISEN_UCWK_NO);
		}
		
		// ●回線に紐づく機器リスト
		ArrayList KaisenUcwkkikiList = null;
		if (!JFUBPCommon.isNull(svcKeiKaisenUcwkNo))
		{
			// ●機器提供サービス契約一覧照会（識別子指定）
			KaisenUcwkkikiList = doEKK0341B030(handle, param, fixedText, svcKeiKaisenUcwkNo);
		}
		
		// ●IN項目と結果を返却マップに設定
		resultMap.put(KEY_SVC_KEI_NO_LIST, inList);
		resultMap.put(JFUGETSVCKEIMSKMINFOCCLIST, outList);
		resultMap.put(KAISENUCWKKIKIINFOLIST, KaisenUcwkkikiList);

		// 一度リクエストパラメータを初期化
		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 固定文字列
	 * @return IN項目
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private ArrayList getInSvcKeiNoList(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		ArrayList inList = null;

		// リクエストパラメータデータ取得
		HashMap<?, ?> paramMap = (HashMap<?, ?>)param.getData(fixedText);
		// IN項目取得
		inList = (ArrayList)paramMap.get(KEY_SVC_KEI_NO_LIST);

		// 取得できない場合、NULLを返却
		if (inList == null || inList.size() == 0)
		{
			return null;
		}

		return inList;
	}

	/**
	 * 申込明細履歴一覧照会サービスIFを実行し、結果を返却します。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param inList INリスト
	 * @return 結果リスト
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private ArrayList doEKK0021B002(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, ArrayList inList) throws Exception
	{
		// 結果リスト
		ArrayList outList = new ArrayList();

		for (int i = 0; i < inList.size(); i++)
		{
			HashMap inChildMap = (HashMap)inList.get(i);

			if (inChildMap == null || inChildMap.size() == 0)
			{
				// マップが空の場合、次の処理へ
				continue;
			}

			// サービス契約番号取得
			String svcKeiNo = (String)inChildMap.get(KEY_SVC_KEI_NO);

			if (JFUBPCommon.isNull(svcKeiNo))
			{
				// キー文字列が空の場合、次の処理へ
				continue;
			}

			// ●上りマッピング
			HashMap inMap = (HashMap)param.getData(fixedText);
			// 機能コード設定
			inMap.put(EKK0021B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
			// サービス契約番号
			inMap.put(EKK0021B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
			// 検索なしエラーとしない
			inMap.put(IGNORE_SEARCH_ERR, true);

			// ●サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK0021B002, TEMP_DTL_EKK0021B002, IN_COLUMN_LIST_EKK0021B002, ERROR_COLUMN_EKK0021B002);

			// ●下りマッピング
			ArrayList resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(TEMP_DTL_EKK0021B002);

			// 結果が存在しない場合、NULLを返却する
			if (resultList == null || resultList.size() == 0)
			{
				continue;
			}

			// 正常に取得できている場合、返却リストに格納する
			outList.addAll(resultList);
		}

		return outList;
	}

	/**
	 * 申込一意照会サービスIFを実行し、結果を返却します。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param inList INリスト
	 * @return 結果リスト
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private ArrayList doEKK0011A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, ArrayList inList) throws Exception
	{
		// 返却リスト
		ArrayList outList = new ArrayList();

		for (int i = 0; i < inList.size(); i++)
		{
			HashMap inChildMap = (HashMap)inList.get(i);

			if (inChildMap == null || inChildMap.size() == 0)
			{
				// マップが空の場合、次の処理へ
				continue;
			}

			// 申込番号取得
			String mskmNo = (String)inChildMap.get(EKK0021B002CBSMsg1List.MSKM_NO);

			if (JFUBPCommon.isNull(mskmNo))
			{
				// キー文字列が空の場合、次の処理へ
				continue;
			}

			// ●上りマッピング
			HashMap inMap = (HashMap)param.getData(fixedText);
			// 機能コード設定
			inMap.put(EKK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);
			// サービス契約番号
			inMap.put(EKK0011A010CBSMsg.KEY_MSKM_NO, mskmNo);
			// 検索なしエラーとしない
			inMap.put(IGNORE_SEARCH_ERR, true);

			// ●サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK0011A010, TEMP_DTL_EKK0011A010, IN_COLUMN_LIST_EKK0011A010, ERROR_COLUMN_EKK0011A010);

			// ●下りマッピング
			ArrayList resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(TEMP_DTL_EKK0011A010);

			// 結果が存在しない場合、NULLを返却する
			if (resultList == null || resultList.size() == 0)
			{
				continue;
			}

			// 取得結果を判定
			for (int j = 0; j < resultList.size(); j++)
			{
				HashMap childMap = (HashMap)resultList.get(j);

				if (childMap == null || childMap.size() == 0)
				{
					continue;
				}

				// 正常結果の場合、返却リストに格納する
				outList.add(childMap);
			}
		}

		return outList;
	}
	
	/**
	 * 機器提供サービス契約一覧照会（識別子指定）サービスIFを実行し、結果を返却します。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText 固定文字列
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @return 結果リスト
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private ArrayList doEKK0341B030(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiKaisenUcwkNo) throws Exception
	{
		// 返却リスト
		ArrayList outList = new ArrayList();

		// ユーザデータ初期化
		initData(param, fixedText, IN_COLUMN_LIST_EKK0341B030);
		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setEKK0341B030(param, fixedText, svcKeiKaisenUcwkNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_EKK0341B030, TEMP_DTL_EKK0341B030, IN_COLUMN_LIST_EKK0341B030, ERROR_COLUMN_EKK0341B030);
		// 下りマッピング
		ArrayList resultList = (ArrayList)((HashMap)param.getData(fixedText)).get(TEMP_DTL_EKK0341B030);

		// 結果が存在しない場合、NULLを返却する
		if (resultList == null || resultList.size() == 0)
		{
			return null;
		}

		// 取得結果を判定
		for (int j = 0; j < resultList.size(); j++)
		{
			HashMap childMap = (HashMap)resultList.get(j);

			if (childMap == null || childMap.size() == 0)
			{
				continue;
			}

			// 正常結果の場合、返却リストに格納する
			outList.add(childMap);
		}

		return outList;
	}
	
	/**
	 * 上りマッピング項目設定(機器提供サービス契約一覧照会（識別子指定）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @throws RequestParameterException
	 */
	private void setEKK0341B030(IRequestParameterReadWrite param, String fixedText, String svcKeiKaisenUcwkNo) throws RequestParameterException
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ＫＥＹ＿サービス契約回線内訳番号
		inMap.put(EKK0341B030CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);
	}
}