/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUGetTokusokuInfoCC
*   ソースファイル名：JFUGetTokusokuInfoCC.java
*   作成者          ：富士通
*   日付            ：2013年09月27日
*＜機能概要＞
*   eoモバイル コース変更関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00       2013/09/27   FJ)岡井     【OM-2013-0002608】新規作成
**********************************************************************/
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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECH0231B501CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0231B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491B507CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B507CBSMsg1List;

/**
 * 督促情報取得コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUGetTokusokuInfoCC extends JFUBaseCC
{
	// ■サービス契約一覧照会（SYSID）3
	/** テンプレートID */
	private static final String TEMP_EKK0081B519 = "EKK0081B519";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0081B519 = EKK0081B519CBSMsg.EKK0081B519CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0081B519 = Arrays.asList(EKK0081B519CBSMsg.KEY_SYSID);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0081B519 = EKK0081B519CBSMsg.KEY_SYSID_ERR;

	// ■請求契約一覧照会（サービス契約番号）
	/** テンプレートID */
	private static final String TEMP_EKK0491B507 = "EKK0491B507";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0491B507 = EKK0491B507CBSMsg.EKK0491B507CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0491B507 = Arrays.asList(EKK0491B507CBSMsg.KEY_SVC_KEI_NO);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0491B507 = EKK0491B507CBSMsg.KEY_SVC_KEI_NO_ERR;

	// ■IN項目ID
	/** IN項目ID：SYSID */
	private static final String SYSID = "sysid";
	/** IN項目ID：請求契約番号 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";

	// ■IN項目区別用ID
	/** IN項目ID：SYSID */
	private static final String IN_SYSID = "in_sysid";
	/** IN項目ID：請求契約番号 */
	private static final String IN_SEIKY_KEI_NO = "in_seiky_kei_no";

	// ■OUT項目ID
	/** OUT項目ID：JFUGetTokusokuInfoCCList */
	private static final String JFUGETTOKUSOKUINFOCCLIST = "JFUGetTokusokuInfoCCList";

	/**
	 * 督促情報取得処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// 結果マップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		// 結果リスト
		ArrayList resultList = new ArrayList();

		// ユーザデータ
		HashMap<?, ?> inMap = (HashMap<?, ?>)param.getData(fixedText);

		// ●IN項目退避
		resultMap = setInParams(inMap, resultMap);

		// SYSIDチェック
		String sysid = (String)resultMap.get(IN_SYSID);
		if(JFUBPCommon.isNull(sysid))
		{
			// SYSIDが設定されていない場合処理しない
			return param;
		}

		// ●督促情報取得
		resultList = getTokusokuInfo(handle, param, fixedText, resultMap);

		// 返却マップに設定
		resultMap.put(JFUGETTOKUSOKUINFOCCLIST, resultList);

		// 一度ユーザデータを削除し、再度設定する
		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 inParamMap ユーザデータ
	 * @param resultMap 結果マップ
	 * @return 結果マップ
	 */
	private HashMap<String, Object> setInParams(HashMap<?, ?> inMap, HashMap<String, Object> resultMap)
	{
		// IN項目格納
		resultMap.put(IN_SYSID, (String)inMap.get(SYSID));
		resultMap.put(IN_SEIKY_KEI_NO, (String)inMap.get(SEIKY_KEI_NO));

		return resultMap;
	}

	/**
	 * 督促情報取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @return 督促情報
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private ArrayList getTokusokuInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> resultMap)
			throws Exception
	{
		ArrayList resultList = new ArrayList();

		// 請求契約番号
		String inSeikyKeiNo = (String)resultMap.get(IN_SEIKY_KEI_NO);

		// ●サービス契約一覧照会（SYSID）3
		// 上りマッピング
		setEKK0081B519(param, fixedText, resultMap);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_EKK0081B519, TEMP_DTL_EKK0081B519, IN_COL_LIST_EKK0081B519, ERR_COL_EKK0081B519);
		// 明細取得
		ArrayList eKK0081B519List = (ArrayList)((HashMap<?, ?>)param.getData(fixedText)).get(TEMP_DTL_EKK0081B519);

		if(eKK0081B519List == null || eKK0081B519List.size() == 0)
		{
			return resultList;
		}

		// 督促情報取得処理
		for (int i = 0; i < eKK0081B519List.size(); i++)
		{
			HashMap eKK0081B519Map = (HashMap)eKK0081B519List.get(i);
			if(eKK0081B519Map == null || eKK0081B519Map.size() == 0)
			{
				continue;
			}

			String svcKeiNo = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.SVC_KEI_NO);
			String svcKeiStat = (String)eKK0081B519Map.get(EKK0081B519CBSMsg1List.SVC_KEI_STAT);

			if(JFUBPCommon.isNull(svcKeiNo) || (JFUStrConst.CD00037_910.equals(svcKeiStat) || JFUStrConst.CD00037_920.equals(svcKeiStat)))
			{
				continue;
			}

			//●請求契約一覧照会（サービス契約番号）
			// 上りマッピング
			setEKK0491B507(param, fixedText, svcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_EKK0491B507, TEMP_DTL_EKK0491B507, IN_COL_LIST_EKK0491B507, ERR_COL_EKK0491B507);
			// 明細取得
			ArrayList eKK0491B507List = (ArrayList)((HashMap<?, ?>)param.getData(fixedText)).get(TEMP_DTL_EKK0491B507);

			if(eKK0491B507List == null || eKK0491B507List.size() == 0)
			{
				continue;
			}

			// 最新レコードを取得し格納
			HashMap eKK0491B507Map = (HashMap)eKK0491B507List.get(eKK0491B507List.size() - 1);

			// 取得した請求契約番号取得
			String resSeikyKeiNo = JFUStrConst.EMPTY;
			if(eKK0491B507Map.containsKey(EKK0491B507CBSMsg1List.SEIKY_KEI_NO)
					&& !JFUBPCommon.isNull(eKK0491B507Map.get(EKK0491B507CBSMsg1List.SEIKY_KEI_NO)))
			{
				resSeikyKeiNo = (String)eKK0491B507Map.get(EKK0491B507CBSMsg1List.SEIKY_KEI_NO);
			}

			if(!JFUBPCommon.isNull(inSeikyKeiNo) && inSeikyKeiNo.equals(resSeikyKeiNo))
			{
				// 指定の請求契約番号と取得結果の請求契約番号が一致した場合
				resultList.clear();
				resultList.add(eKK0491B507Map);
				break;
			}
			else
			{
				// 上記以外
				resultList.add(eKK0491B507Map);
			}
		}

		return resultList;
	}

	/**
	 * サービス契約一覧照会（SYSID）3の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 */
	private void setEKK0081B519(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> resultMap) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(EKK0081B519CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		parentMap.put(IGNORE_SEARCH_ERR, true);
		// KEY_SYSID
		parentMap.put(EKK0081B519CBSMsg.KEY_SYSID, resultMap.get(IN_SYSID));

		param.setData(fixedText, parentMap);
	}

	/**
	 * 督促一覧照会（サービス契約番号）の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ文字列
	 * @param svcKeiNo サービス契約番号
	 * @throws Exception 例外
	 */
	private void setEKK0491B507(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 機能コード
		parentMap.put(ECH0231B501CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		parentMap.put(IGNORE_SEARCH_ERR, true);
		// サービス契約番号
		parentMap.put(ECH0231B501CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);

		param.setData(fixedText, parentMap);
	}
}