/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUeoTelSvcKeiUwShokaiCC
*   ソースファイル名：JFUeoTelSvcKeiUwShokaiCC.java
*   作成者          ：富士通
*   日付            ：2012年07月04日
*＜機能概要＞
*   eo光電話サービス契約内訳一覧照会(整理番号)コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/07/04   FJ）岡井    新規作成
*   v7.00       2014/03/06   FJ）文元    【OM-2014-0000994】電話のサービス契約取得結果、解約・キャンセルを除くよう修正
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081B025CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B025CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B505CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B505CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0371B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0371B001CBSMsg1List;

/**
 * eo光電話サービス契約内訳一覧照会(整理番号)コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */
public class JFUeoTelSvcKeiUwShokaiCC extends JFUBaseCC
{

	// ■サービス契約一覧照会（整理番号）
	/** テンプレートID */
	private static final String TEMPLATE_ID_EKK0081B025 = "EKK0081B025";
	/** テンプレートID(明細) */
	private static final String TEMPLATE_ID_DTL_EKK0081B025 = EKK0081B025CBSMsg.EKK0081B025CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK0081B025 = 
		Arrays.asList(EKK0081B025CBSMsg.FUNC_CODE, EKK0081B025CBSMsg.KEY_SEIRI_NO);
	/** 関連チェックエラー項目 */
	private static final String ERROR_COLUMN_EKK0081B025 = EKK0081B025CBSMsg.KEY_SEIRI_NO_ERR;

	// ■現サービス契約内訳情報一覧照会(電話)
	/** テンプレートID */
	private static final String TEMPLATE_ID_EKK0161B505 = "EKK0161B505";
	/** テンプレートID(明細) */
	private static final String TEMPLATE_ID_DTL_EKK0161B505 = EKK0161B505CBSMsg.EKK0161B505CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK0161B505 = 
		Arrays.asList(EKK0161B505CBSMsg.FUNC_CODE, EKK0161B505CBSMsg.KEY_SVC_KEI_NO, EKK0161B505CBSMsg.KEY_TELNO);
	/** 関連チェックエラー項目 */
	private static final String ERROR_COLUMN_EKK0161B505 = EKK0161B505CBSMsg.KEY_SVC_KEI_NO_ERR;

	// ■オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）
	/** テンプレートID */
	private static final String TEMPLATE_ID_EKK0371B001 = "EKK0371B001";
	/** テンプレートID(明細) */
	private static final String TEMPLATE_ID_DTL_EKK0371B001 = EKK0371B001CBSMsg.EKK0371B001CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK0371B001 = 
		Arrays.asList(EKK0371B001CBSMsg.FUNC_CODE, EKK0371B001CBSMsg.KEY_SVC_KEI_UCWK_NO);
	/** 関連チェックエラー項目 */
	private static final String ERROR_COLUMN_EKK0371B001 = EKK0371B001CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR;

	// ■IN項目ID
	/** 整理番号 */
	private static final String SEIRI_NO = "seiri_no";

	// ■OUT項目ID
	/** eo光電話サービス契約内訳一覧照会(整理番号)明細 */
	private static final String JFUEOTELSVCKEIUWSHOKAILIST = "JFUeoTelSvcKeiUwShokaiList";

	// ■OUT項目ID
	/** オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）明細 */
	private static final String OPSVCKEITELICRNLIST = "OPSVCKEITELICRNLIST";

	/**
	 * eo光電話サービス契約内訳一覧取得処理です。<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite getResultData(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		// ユーザデータ取得
		HashMap<?, ?> childMap = (HashMap<?, ?>)param.getData(fixedText);

		// IN項目退避
		resultMap = getInParams(childMap, resultMap);

		// サービス契約一覧取得
		ArrayList<HashMap<String, Object>> svcKeiList = getSvcKeiList(handle, param, fixedText, resultMap);

		// 電話のサービス契約を取得
		HashMap<String, Object> svcTelMap = getSvcKeiTel(svcKeiList);

		// 現サービス契約内訳情報一覧(電話)取得
		ArrayList<HashMap<String, Object>> svcKeiUwTelList = getSvcKeiUwTelList(handle, param, fixedText, svcTelMap);

		// オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）取得
		ArrayList<HashMap<String, Object>> opSvcKeiTelIcrnList = getSvcKeiTelIcrnList(handle, param, fixedText, svcKeiUwTelList);
		// 解約済み、キャンセル済みのデータを除外
		for (Iterator it = opSvcKeiTelIcrnList.iterator(); it.hasNext();)
		{
			// サービス契約内訳ステータス
			ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
			list =  (ArrayList)((HashMap)it.next()).get("opSvcKeiTelIcrnList");
			if(list != null && list.size() > 0)
			{
				for (int i = 0; i < list.size(); i++)
				{
					// サービス契約内訳ステータス
					HashMap opSvcKeiTelMap = list.get(i);
					String opSvcKeiStat = (String)opSvcKeiTelMap.get(EKK0351B001CBSMsg1List.OP_SVC_KEI_STAT);
		
					if (JFUStrConst.CD01616_910.equals(opSvcKeiStat) || JFUStrConst.CD01616_920.equals(opSvcKeiStat))
					{
						list.remove(i); i--;
					}
				}
			}
		}
		// 結果マップに設定
		resultMap.put(OPSVCKEITELICRNLIST, opSvcKeiTelIcrnList);

		// 解約済み、キャンセル済みのデータを除外
		for (Iterator it = svcKeiUwTelList.iterator(); it.hasNext();)
		{
			HashMap svcKeiUwTelMap = (HashMap)it.next();
			// サービス契約内訳ステータス
			String svcKeiUcwkStat = (String)svcKeiUwTelMap.get(EKK0161B505CBSMsg1List.SVC_KEI_UCWK_STAT);

			if (svcKeiUcwkStat.equals(JFUStrConst.CD00056_910) || svcKeiUcwkStat.equals(JFUStrConst.CD00056_920))
			{
				it.remove();
			}
		}

		// 結果マップに設定
		resultMap.put(JFUEOTELSVCKEIUWSHOKAILIST, svcKeiUwTelList);

		// 一度ユーザデータを削除し、再度設定する
		param.removeData(fixedText);
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * eo光電話サービス契約内訳一覧取得チェック処理です。
	 * 
	 * <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 childMap INマップ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> getInParams(HashMap childMap, HashMap resultMap)
	{
		// 整理番号
		resultMap.put(SEIRI_NO, (String)childMap.get(SEIRI_NO));

		return resultMap;
	}

	/**
	 * サービス契約一覧取得処理です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param resultMap 結果マップ
	 * @return 結果リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getSvcKeiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap resultMap) throws Exception
	{
		// 結果格納リスト
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();

		// ●サービス契約一覧照会（整理番号）SC
		// 上りマッピング
		setEKK0081B025SC(param, fixedText, resultMap);
		// 実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0081B025, TEMPLATE_ID_DTL_EKK0081B025, IN_COLUMN_LIST_EKK0081B025,
				ERROR_COLUMN_EKK0081B025);
		// 明細取得
		resultList = getDtlList((HashMap<?, ?>)param.getData(fixedText), TEMPLATE_ID_DTL_EKK0081B025);

		return resultList;
	}

	/**
	 * eo光電話のサービス契約を取得します。
	 * 
	 * <br>
	 * @param svcKeiList サービス契約リスト
	 * @return 結果マップ
	 */
	private HashMap<String, Object> getSvcKeiTel(ArrayList<HashMap<String, Object>> svcKeiList)
	{
		// 結果格納マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();

		for (int i = 0; i < svcKeiList.size(); i++)
		{
			HashMap<String, Object> childMap = svcKeiList.get(i);

			// 料金グループコード取得
			String prcGrpCd = (String)childMap.get(EKK0081B025CBSMsg1List.PRC_GRP_CD);
			// サービス契約ステータスの取得
			String svcKeiStat = (String)childMap.get(EKK0081B025CBSMsg1List.SVC_KEI_STAT);
			
			if(JFUStrConst.CD00133_10.equals(prcGrpCd))
			{
				if (svcKeiStat.equals(JFUStrConst.CD00056_910) || svcKeiStat.equals(JFUStrConst.CD00056_920))
				{
					// 次レコード検索
					continue;
				}
				else
				{
					resultMap = childMap;
					break;
				}
			}
		}

		return resultMap;
	}

	/**
	 * 現サービス契約内訳情報一覧(電話)取得処理です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param svcTelMap サービス契約(電話)マップ
	 * @return 結果リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getSvcKeiUwTelList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap svcTelMap) throws Exception
	{
		// 結果格納リスト
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();

		if(svcTelMap != null && svcTelMap.size() > 0)
		{
			// ●現サービス契約内訳情報一覧照会(電話)SC
			// 上りマッピング
			setEKK0161B505SC(param, fixedText, svcTelMap);
			// 実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0161B505, TEMPLATE_ID_DTL_EKK0161B505, IN_COLUMN_LIST_EKK0161B505,
					ERROR_COLUMN_EKK0161B505);
			// 明細取得
			resultList = getDtlList((HashMap<?, ?>)param.getData(fixedText), TEMPLATE_ID_DTL_EKK0161B505);
		}

		return resultList;
	}

	/**
	 * オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）取得処理です。
	 * 
	 * <br>
	 * @param handle ハンドル
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param svcTelMap 現サービス契約内訳情報一覧(電話)マップ
	 * @return 結果リスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getSvcKeiTelIcrnList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList<HashMap<String, Object>> svcKeiUwTelList) throws Exception
	{
		// 結果格納リスト
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();

		for (int i = 0; i < svcKeiUwTelList.size(); i++)
		{
			HashMap<String, Object> childMap = svcKeiUwTelList.get(i);
			
			// ●オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）SC
			// 上りマッピング
			setEKK0371B001SC(param, fixedText, childMap);
			// 実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0371B001, TEMPLATE_ID_DTL_EKK0371B001, IN_COLUMN_LIST_EKK0371B001,
					ERROR_COLUMN_EKK0371B001);
			// 明細取得
			resultList = getDtlListAdd((HashMap<?, ?>)param.getData(fixedText), TEMPLATE_ID_DTL_EKK0371B001, resultList);
		}
		return resultList;
	}

	/**
	 * サービス契約一覧照会（整理番号）SCの上りマッピング処理です。
	 * 
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param svcTelMap サービス契約(電話)マップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0161B505SC(IRequestParameterReadWrite param, String fixedText, HashMap svcTelMap) throws Exception
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード
		inMap.put(EKK0161B505CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// サービス契約番号
		inMap.put(EKK0161B505CBSMsg.KEY_SVC_KEI_NO, (String)svcTelMap.get(EKK0081B025CBSMsg1List.SVC_KEI_NO));
		// 最大検索数
		inMap.put(EKK0161B505CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);

		param.setData(fixedText, inMap);
	}

	/**
	 * サービス契約一覧照会（整理番号）SCの上りマッピング処理です。
	 * 
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param resultMap 結果マップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0081B025SC(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード
		inMap.put(EKK0081B025CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 整理番号
		inMap.put(EKK0081B025CBSMsg.KEY_SEIRI_NO, (String)resultMap.get(SEIRI_NO));
		// 最大検索数
		inMap.put(EKK0081B025CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);

		param.setData(fixedText, inMap);
	}

	/**
	 * オプションサービス契約＜電話＞一覧照会（サービス契約内訳番号）SCの上りマッピング処理です。
	 * 
	 * @param param ユーザデータ
	 * @param fixedText 固定文字列
	 * @param resultMap 結果マップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0371B001SC(IRequestParameterReadWrite param, String fixedText, HashMap childMap) throws Exception
	{
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード
		inMap.put(EKK0371B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// サービス契約内訳番号
		inMap.put(EKK0371B001CBSMsg.KEY_SVC_KEI_UCWK_NO, (String)childMap.get(EKK0371B001CBSMsg1List.SVC_KEI_UCWK_NO));
		// 最大検索数
		inMap.put(EKK0371B001CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);

		param.setData(fixedText, inMap);
	}

	/**
	 * 明細リストを返却します。
	 * <br>
	 * @param dataMap INマップ
	 * @param listNm リスト名
	 * @return 検索結果リスト
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getDtlList(HashMap dataMap, String listNm)
	{
		// 結果格納用リスト
		ArrayList<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>();
		// リスト内検索
		ArrayList childList = (ArrayList)dataMap.get(listNm);

		if (childList != null && childList.size() > 0)
		{
			for (int j = 0; j < childList.size(); j++)
			{
				HashMap childMap = (HashMap)childList.get(j);
				resultList.add(childMap);
			}
		}

		return resultList;
	}
	
	/**
	 * 明細リストを初期化せずに返却します。
	 * <br>
	 * @param dataMap INマップ
	 * @param listNm リスト名
	 * @param resultList 明細リスト
	 * @return 検索結果リスト
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getDtlListAdd(HashMap dataMap, String listNm, ArrayList<HashMap<String, Object>> resultList)
	{
		// リスト内検索
		ArrayList childList = (ArrayList)dataMap.get(listNm);

		HashMap<String, Object> childMap = new HashMap<String,Object>();
		childMap.put("opSvcKeiTelIcrnList", childList);
		
		if (childList != null && childList.size() > 0)
		{
			resultList.add(childMap);
		}

		return resultList;
	}
}
