/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JCHMoveToKeiSysScreenDecideCC
 *   ソースファイル名：JCHMoveToKeiSysScreenDecideCC.java
 *   作成者          ：富士通
 *   日付            ：2012年03月09日
 *＜機能概要＞
 *   契約画面遷移制御CC部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/03/09	富士通		新規作成
 *	v5.00.00	2013/09/13	FJ)小野		【OM-2013-0002011】複数サービスが存在する場合でもサービス契約一覧へ遷移しない事象を対応。
 *	v5.01.00	2013/09/13	FJ)江森		【OM-2013-0004460】「契約へ」ボタン押下時、請求契約番号に紐付く課金先情報が取得できない場合の遷移先をお客様一覧画面にする
 *
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
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 com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;

import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B505CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B505CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0881B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0881B002CBSMsg1List;

public class JCHMoveToKeiSysScreenDecideCC extends AbstractCommonComponent {
	
	/** テンプレートID(課金先一覧照会(マンション情報)) */
	private static final String TEMPLATE_ID_EKK0321B505 = "EKK0321B505";
	
	/** テンプレートID(マンション契約一覧照会（複合検索）) */
	private static final String TEMPLATE_ID_EKK0881B002 = "EKK0881B002";
	
	/** テンプレートID(課金先一覧照会（請求契約番号／サービス契約番号）) */
	private static final String TEMPLATE_ID_EKK0321B002 = "EKK0321B002";
	
	/** テンプレートID(サービス契約一覧照会（SYSID）2) */
	private static final String TEMPLATE_ID_EKK0081B004 = "EKK0081B004";
	
	/** テンプレートページング件数 */
	private static final String TEMPLATE_MAX_SEARCH_NUM = "100000";
	private static final String TEMPLATE_DISPLAY_PAGE_NUM = "1";
	
	/** マップID */
	private static final String MAP_CC_ID = "CHSV000801CC";
	
	/** マップキー(SYSID) */
	private static final String MAP_KEY_SYS_ID = "sys_id";
	
	/** マップキー(SYSIDカウント) */
	private static final String MAP_KEY_SYS_ID_COUNT = "sys_id_count";
	
	/** マップキー(サービス契約番号) */
	private static final String MAP_KEY_SVC_KEI_NO = "svc_kei_no";
	
	/** マップキー(サービス契約カウント) */
	private static final String MAP_KEY_SVC_KEI_COUNT = "svc_kei_count";
	
	/** マップキー(料金グループコード) */
	private static final String MAP_KEY_PRC_GRP_CD = "prc_grp_cd";
	
	/** マップキー(マンションIDカウント) */
	private static final String MAP_KEY_MANSION_ID_COUNT = "mansion_id_count";
	
	/** マップキー(課金先カウント) */
	private static final String MAP_KEY_KAKINS_COUNT = "kakins_count";
	
	/** マップキー(P-ID) */
	private static final String MAP_KEY_PID = "pid";
	/** マップキー(マンションID) */
	private static final String MAP_KEY_MANS_ID = "mansion_id";
	/** マップキー(CAT-ID) */
	private static final String MAP_KEY_CATID = "catid";
	/** マップキー(請求契約番号（ネット）) */
	private static final String MAP_KEY_SEIKY_KEI_NO_NET = "seiky_kei_no_net";
	/** マップキー(請求契約番号（ＴＶ）) */
	private static final String MAP_KEY_SEIKY_KEI_NO_TV = "seiky_kei_no_tv";

	/**
	 * サービスインターフェイスを呼出し、
	 * それぞれのデータ存在状況を取得します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	public IRequestParameterReadWrite getMoveToScreen(SessionHandle handle, 
			IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		executeEKK0321B505(handle, param);          // 課金先一覧照会(マンション情報)

		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);
		Integer kakinsCount = (Integer)dataMap.get(MAP_KEY_KAKINS_COUNT);
		
		if (kakinsCount.intValue() == 0)
		{
			// 課金先取得件数が０件の場合
			return param;
		}
		
		Integer MansionIdCount = (Integer)dataMap.get(MAP_KEY_MANSION_ID_COUNT);

		if (MansionIdCount.intValue() >= 1)
		{
			// マンションオーナー契約の場合
			executeEKK0881B002(handle, param);      // マンション契約一覧照会（複合検索）
		}
		else
		{
			// コンシューマ契約の場合
			executeEKK0321B002(handle, param);      // 課金先一覧照会（請求契約番号/サービス契約番号）
			
			Integer sysIdCount = (Integer)dataMap.get(MAP_KEY_SYS_ID_COUNT);
			if (sysIdCount.intValue() == 1)
			{
				// お客様が１件の場合
				executeEKK0081B004(handle, param);  // サービス契約一覧照会（SYSID）2
			}
			else
			{
				// お客様が複数存在する場合
				dataMap.put(MAP_KEY_SVC_KEI_COUNT, -1);
			}
		}

		return param;
	}
	
	/**
	 * 課金先一覧照会(マンション情報)サービスインターフェイス実行処理<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	private void executeEKK0321B505(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		// 上りマッピング
		HashMap<String, Object> paramMap = editInMsgEKK0321B505(param);

		// ＳＣ呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		// 下りマッピング
		editOutMsgEKK0321B505(result, param);
	}
	
	/**
	 * マンション契約一覧照会（複合検索）サービスインターフェイス実行処理<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	private void executeEKK0881B002(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		// 上りマッピング
		HashMap<String, Object> paramMap = editInMsgEKK0881B002(param);

		// ＳＣ呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		// 下りマッピング
		editOutMsgEKK0881B002(result, param);
	}
	
	/**
	 * 課金先一覧照会（請求契約番号／サービス契約番号）サービスインターフェイス実行処理<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	private void executeEKK0321B002(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		// 上りマッピング
		HashMap<String, Object> paramMap = editInMsgEKK0321B002(param);

		// ＳＣ呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		// 下りマッピング
		editOutMsgEKK0321B002(result, param);
	}

	/**
	 * サービス契約一覧照会（SYSID）2サービスインターフェイス実行処理<br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	private void executeEKK0081B004(SessionHandle handle, IRequestParameterReadWrite param) throws Exception
	{
		// 上りマッピング
		HashMap<String, Object> paramMap = editInMsgEKK0081B004(param);
		
		// ＳＣ呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 下りマッピング
		editOutMsgEKK0081B004(result, param);
	}
	
	/**
	 * 課金先一覧照会(マンション情報)サービスインターフェイス用メッセージ設定処理.<br>
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgEKK0321B505(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* ◇電文ヘッダ */
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		/* ◇コントロールマップ */
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		/* ◇ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		CAANMsg template = new CAANMsg(EKK0321B505CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0321B505CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B505);

		// 機能コード（デフォルト：１）
		template.set(EKK0321B505CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// ＫＥＹ＿請求契約番号
		if (inMap == null || inMap.get("key_seiky_kei_no") == null || "".equals(inMap.get("key_seiky_kei_no")))
		{
			template.setNull(EKK0321B505CBSMsg.KEY_SEIKY_KEI_NO);
		}
		else
		{
			template.set(EKK0321B505CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("key_seiky_kei_no"));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * マンション契約一覧照会（複合検索）サービスインターフェイス用メッセージ設定処理.<br>
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgEKK0881B002(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* ◇電文ヘッダ */
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		/* ◇コントロールマップ */
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		/* ◇ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		CAANMsg template = new CAANMsg(EKK0881B002CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0881B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0881B002);

		// 機能コード（デフォルト：１）
		template.set(EKK0881B002CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// ＫＥＹ＿請求契約番号
		if (inMap == null || inMap.get("key_seiky_kei_no") == null || "".equals(inMap.get("key_seiky_kei_no")))
		{
			template.setNull(EKK0881B002CBSMsg.KEY_SEIKY_KEI_NO);
		}
		else
		{
			template.set(EKK0881B002CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("key_seiky_kei_no"));
		}

		/* ◇ページング件数 */
		// (機能は使用しないがサービスIF側仕様で設定が必要なためデータ取得に十分な件数を指定する)
		// 最大検索件数
		template.set(EKK0881B002CBSMsg.MAX_SEARCH_NUM, TEMPLATE_MAX_SEARCH_NUM);
		// 表示件数
		template.set(EKK0881B002CBSMsg.DISPLAY_NUM, TEMPLATE_MAX_SEARCH_NUM);
		// 表示ページ番号
		template.set(EKK0881B002CBSMsg.DISPLAY_PAGE_NUM, TEMPLATE_DISPLAY_PAGE_NUM);

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 課金先一覧照会（請求契約番号／サービス契約番号）サービスインターフェイス用メッセージ設定処理.<br>
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editInMsgEKK0321B002(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* ◇電文ヘッダ */
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		/* ◇コントロールマップ */
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		/* ◇ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		CAANMsg template = new CAANMsg(EKK0321B002CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0321B002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B002);

		// 機能コード（デフォルト：１）
		template.set(EKK0321B002CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		/* ◇業務データの設定 */
		// ＫＥＹ＿サービス契約番号
		template.setNull(EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO);

		// ＫＥＹ＿請求契約番号
		if (inMap == null || inMap.get("key_seiky_kei_no") == null || "".equals(inMap.get("key_seiky_kei_no")))
		{
			template.setNull(EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO);
		}
		else
		{
			template.set(EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO, (String)inMap.get("key_seiky_kei_no"));
		}

		// ＫＥＹ＿予約適用年月日
		template.set(EKK0321B002CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOnlineOpeDate(null));

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * サービス契約一覧照会（SYSID）2サービスインターフェイス用メッセージ設定処理.<br>
	 * @param param リクエストパラメータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsgEKK0081B004(IRequestParameterReadWrite param) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* ◇電文ヘッダ */
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		/* ◇コントロールマップ */
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		/* ◇ユーザデータ情報 */
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		CAANMsg template = new CAANMsg(EKK0081B004CBSMsg.class.getName());
		// テンプレートID
		template.set(EKK0081B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B004);

		// 機能コード（デフォルト：１）
		template.set(EKK0081B004CBSMsg.FUNC_CODE, "1");

		// 表示件数
		template.set(EKK0081B004CBSMsg.DISPLAY_NUM, "100");

		// 表示ページ数
		template.set(EKK0081B004CBSMsg.DISPLAY_PAGE_NUM, "1");

		// 最大取得件数
		template.set(EKK0081B004CBSMsg.MAX_SEARCH_NUM, "2000");
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		/* ◇業務データの設定 */
		// 機能コード
//		template.set(EKK0081B004CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));
		
		// ＫＥＹ＿SYSID
		if (inMap == null || inMap.get(MAP_KEY_SYS_ID) == null || "".equals(inMap.get(MAP_KEY_SYS_ID)))
		{
			template.setNull(EKK0081B004CBSMsg.KEY_SYSID);
		}
		else
		{
			template.set(EKK0081B004CBSMsg.KEY_SYSID, (String)inMap.get(MAP_KEY_SYS_ID));
		}

		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 課金先一覧照会(マンション情報)サービスインターフェイス用メッセージ取得処理.<br>
	 * 
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgEKK0321B505(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);

		ArrayList<String> manshionIdList = new ArrayList<String>();
		templateArray = parentTemplate.getCAANMsgList(EKK0321B505CBSMsg.EKK0321B505CBSMSG1LIST);
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				if (childTemplate.isNull(EKK0321B505CBSMsg1List.MANSION_ID) == false)
				{
					String mansionId = childTemplate.getString(EKK0321B505CBSMsg1List.MANSION_ID);
					if (manshionIdList.contains(mansionId) == false)
					{
						manshionIdList.add(mansionId);
					}
				}
			}
		}

		// 業務データ設定
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(MAP_CC_ID, dataMap);
		}
		dataMap.put(MAP_KEY_MANSION_ID_COUNT, manshionIdList.size());
		dataMap.put(MAP_KEY_KAKINS_COUNT, templateArray.length);

		// エラー情報の設定
		editErrorInfoEKK0321B505(param, templates, (Integer)return_code);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * マンション契約一覧照会（複合検索）サービスインターフェイス用メッセージ取得処理.<br>
	 * 
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgEKK0881B002(Map<?, ?> msgList, IRequestParameterReadWrite param) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;

		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		int listCnt = -1;

		templateArray = parentTemplate.getCAANMsgList(EKK0881B002CBSMsg.EKK0881B002CBSMSG1LIST);
		if (templateArray != null)
		{
			listCnt = templateArray.length;
		}

		// 業務データ設定
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(MAP_CC_ID, dataMap);
		}
		dataMap.put(MAP_KEY_MANSION_ID_COUNT, listCnt);
		if (listCnt == 1)
		{
			CAANMsg childTemplate = templateArray[0];
			
			dataMap.put(MAP_KEY_PID, childTemplate.getString(EKK0881B002CBSMsg1List.PID));
			dataMap.put(MAP_KEY_MANS_ID, childTemplate.getString(EKK0881B002CBSMsg1List.MANSION_ID));
			dataMap.put(MAP_KEY_CATID, childTemplate.getString(EKK0881B002CBSMsg1List.CATID));
			dataMap.put(MAP_KEY_SEIKY_KEI_NO_NET,  childTemplate.getString(EKK0881B002CBSMsg1List.SEIKY_KEI_NO_NET));
			dataMap.put(MAP_KEY_SEIKY_KEI_NO_TV, childTemplate.getString(EKK0881B002CBSMsg1List.SEIKY_KEI_NO_TV));
		}
		
		// エラー情報の設定
		editErrorInfoEKK0881B002(param, templates, (Integer)return_code);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * 課金先一覧照会（請求契約番号／サービス契約番号）サービスインターフェイス用メッセージ取得処理.<br>
	 * 
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutMsgEKK0321B002(Map<?, ?> msgList,
			IRequestParameterReadWrite param) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// 課金先一覧照会（請求契約番号/サービス契約番号）明細よりSYSIDの存在数を調べる
		ArrayList<String> sysIdList = new ArrayList<String>();
		templateArray = parentTemplate.getCAANMsgList(EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST);
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				if (childTemplate.isNull(EKK0321B002CBSMsg1List.SYSID) == false)
				{
					String sysId = childTemplate.getString(EKK0321B002CBSMsg1List.SYSID);
					if (sysIdList.contains(sysId) == false)
					{
						sysIdList.add(sysId);
					}
				}
			}
		}

		// 業務データ設定
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(MAP_CC_ID, dataMap);
		}
		dataMap.put(MAP_KEY_SYS_ID_COUNT, sysIdList.size());
		if (sysIdList.size() == 1)
		{
			dataMap.put(MAP_KEY_SYS_ID, sysIdList.get(0));
		}

		// エラー情報の設定
		editErrorInfoEKK0321B002(param, templates, (Integer)return_code);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * サービス契約一覧照会（SYSID）2サービスインターフェイス用メッセージ取得処理.<br>
	 * 
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @return IRequestParameterReadWrite
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editOutMsgEKK0081B004(Map<?, ?> msgList,
			IRequestParameterReadWrite param) throws Exception
	{

		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];
		CAANMsg[] templateArray = null;
		
		// リターンコード取得
		Object return_code = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// サービス契約一覧照会（SYSID）2明細の存在数を調べる
		ArrayList<String> svcKeiNoList = new ArrayList<String>();
		ArrayList<String> prcGrpCdList = new ArrayList<String>();
		templateArray = parentTemplate.getCAANMsgList(EKK0081B004CBSMsg.EKK0081B004CBSMSG1LIST);
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				if (childTemplate.isNull(EKK0081B004CBSMsg1List.SVC_KEI_NO) == false)
				{
					String svcKeiNo = childTemplate.getString(EKK0081B004CBSMsg1List.SVC_KEI_NO);
					String prcGrpCd = childTemplate.getString(EKK0081B004CBSMsg1List.PRC_GRP_CD);
					if (svcKeiNoList.contains(svcKeiNo) == false)
					{
						svcKeiNoList.add(svcKeiNo);
					}
					if (prcGrpCdList.contains(prcGrpCd) == false)
					{
						prcGrpCdList.add(prcGrpCd);
					}
				}
			}
		}
		
		// 業務データ設定
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);
		if (dataMap == null)
		{
			dataMap = new HashMap<String, Object>();
			param.setData(MAP_CC_ID, dataMap);
		}
		dataMap.put(MAP_KEY_SVC_KEI_COUNT, svcKeiNoList.size());
		if (svcKeiNoList.size() == 1)
		{
			dataMap.put(MAP_KEY_SVC_KEI_NO, svcKeiNoList.get(0));
			dataMap.put(MAP_KEY_PRC_GRP_CD, prcGrpCdList.get(0));
		}

		// エラー情報の設定
		editErrorInfoEKK0081B004(param, templates, (Integer)return_code);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errList == null)
		{
			errList = new ArrayList<Object>();
		}
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfoEKK0321B505(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0321B505CBSMsg.STATUS);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, Object> inMap = null;

		inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		// 課金先一覧照会(マンション情報).ＫＥＹ＿請求契約番号エラー → ＫＥＹ＿請求契約番号エラー
		if (!template.isNull(EKK0321B505CBSMsg.KEY_SEIKY_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_seiky_kei_no_err"))
			{
				inMap.put("key_seiky_kei_no_err", template.getString(EKK0321B505CBSMsg.KEY_SEIKY_KEI_NO_ERR));
			}
		}
		return param;
	}
	
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfoEKK0881B002(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0881B002CBSMsg.STATUS);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, Object> inMap = null;

		inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		// マンション契約一覧照会（複合検索）.ＫＥＹ＿請求契約番号エラー → ＫＥＹ＿請求契約番号エラー
		if (!template.isNull(EKK0881B002CBSMsg.KEY_SEIKY_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_seiky_kei_no_err"))
			{
				inMap.put("key_seiky_kei_no_err", template.getString(EKK0881B002CBSMsg.KEY_SEIKY_KEI_NO_ERR));
			}
		}
		return param;
	}
	
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfoEKK0321B002(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0321B002CBSMsg.STATUS);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, Object> inMap = null;

		inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		// 課金先一覧照会（請求契約番号／サービス契約番号）.ＫＥＹ＿サービス契約番号 → ＫＥＹ＿サービス契約番号
		if (!template.isNull(EKK0321B002CBSMsg.KEY_SVC_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_svc_kei_no_err"))
			{
				inMap.put("key_svc_kei_no_err", template.getString(EKK0321B002CBSMsg.KEY_SVC_KEI_NO_ERR));
			}
		}

		// 課金先一覧照会（請求契約番号／サービス契約番号）.ＫＥＹ＿請求契約番号エラー → ＫＥＹ＿請求契約番号エラー
		if (!template.isNull(EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO_ERR))
		{
			if (!inMap.containsKey("key_seiky_kei_no_err"))
			{
				inMap.put("key_seiky_kei_no_err", template.getString(EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO_ERR));
			}
		}

		// 課金先一覧照会（請求契約番号／サービス契約番号）.ＫＥＹ＿予約適用年月日エラー → ＫＥＹ＿予約適用年月日エラー
		if (!template.isNull(EKK0321B002CBSMsg.KEY_RSV_APLY_YMD_ERR))
		{
			if (!inMap.containsKey("key_rsv_aply_ymd_err"))
			{
				inMap.put("key_rsv_aply_ymd_err", template.getString(EKK0321B002CBSMsg.KEY_RSV_APLY_YMD_ERR));
			}
		}

		return param;
	}

	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfoEKK0081B004(IRequestParameterReadWrite param
			, CAANMsg[] templates, int returnCode) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(EKK0081B004CBSMsg.STATUS);

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, Object> inMap = null;

		inMap = (HashMap<String, Object>)param.getData(MAP_CC_ID);

		// サービス契約一覧照会（SYSID）2.ＫＥＹ＿SYSIDエラー → ＫＥＹ＿SYSIDエラー
		if (!template.isNull(EKK0081B004CBSMsg.KEY_SYSID_ERR))
		{
			if (!inMap.containsKey("key_sysid_err"))
			{
				inMap.put("key_sysid_err", template.getString(EKK0081B004CBSMsg.KEY_SYSID_ERR));
			}
		}
		return param;
	}

}
