/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAddPrgCC
*   ソースファイル名：JKKAddPrgCC.java
*   作成者          ：富士通
*   日付            ：2011年12月03日
*＜機能概要＞
*   進捗登録コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/03   FJ）仁多見  新規作成
*   v4.00.00	2012/12/18   FJ) 多田	【ST4-2012-0000132】申込情報検索レスポンス対応
*   v4.01.00	2012/12/27   FJ) 中山   【OT-2012-0000057】進捗の異動年月日時分秒の修正
*   v5.00.00	2013/06/10   FJ) 中山   【LT-2013-0000024】異動年月日時分秒をシステム年月日時分秒に修正
*   v9.00.00	2014/04/28   FJ) 中山   【ANK-2056-00-00】光電話セレクトオプションパック
**********************************************************************/
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.bp.x21.cc.exception.CCException;
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.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0821A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0831A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0831A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0841A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;


/**
 * 進捗登録コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */
public class JKKAddPrgCC extends AbstractCommonComponent
{
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";

	/** 作業マップ名_進捗登録 */
	private static final String CC_WORK_AREA_NAME = "JKKAddPrgCCWork";
	/** 作業マップ名_オプションサービス一意照会 */
	private static final String CC_WORK_AREA_OP_NAME = "JKKOpSvcShokaiWork";
	
	/** 進捗リスト名_ネット */
	private static final String PRG_LIST_NAME_NET = "eohnt_prg_list";

	/** 進捗リスト名_電話 */
	private static final String PRG_LIST_NAME_TEL = "eohtl_prg_list";
	/** 進捗リスト名_テレビ */
	private static final String PRG_LIST_NAME_TV = "eohtv_prg_list";
	/** 進捗リスト名_モバイル */
	private static final String PRG_LIST_NAME_MOBILE = "eomoba_prg_list";
	/** 進捗リスト名_ADSL */
	private static final String PRG_LIST_NAME_ADSL = "adsl_prg_list";
	
	/** 進捗リスト名_電話割引 */
	private static final String PRG_LIST_NAME_TEL_WRIB = "eohtl_wrib_prg_list";
	
	/** 進捗リスト名_ネットオプション */
	private static final String PRG_LIST_NAME_NET_OP = "eohnt_op_prg_list";
	/** 進捗リスト名_電話オプション */
	private static final String PRG_LIST_NAME_TEL_OP = "eohtl_op_prg_list";
	/** 進捗リスト名_テレビオプション */
	private static final String PRG_LIST_NAME_TV_OP = "eohtv_op_prg_list";
	/** 進捗リスト名_モバイルオプション */
	private static final String PRG_LIST_NAME_MOBILE_OP = "eomoba_op_prg_list";
	/** 進捗リスト名_ADSLオプション */
	private static final String PRG_LIST_NAME_ADSL_OP = "adsl_op_prg_list";
	
	/** 進捗リスト名_電話サブオプション */
	private static final String PRG_LIST_NAME_TEL_SBOP = "eohtl_sbop_prg_list";
	
	/** 進捗リスト名_一括登録 */
	private static final String PRG_LIST_NAME_ADD = "add_prg_list";
	
	/** 進捗ステータス_レンタル登録完了 */
	private static final String PRG_STAT_RENT = "3100";
	/** 進捗ステータス_接続機器新設完了 */
	private static final String PRG_STAT_CONNECT = "3301";
	
	/** エラー用 */
	private static final String SC_ERROR_STRING = "サービスコンポーネントエラー";

	/*
	 *  各サービスIFのマップ用プレフィックス
	 */
	/** 進捗登録用プレフィックス */
	private static final String PREFIX_SHINCHOKU_ADD = "kk109101_";
	
	/** 異動年月日時分秒 */
	private String idoDtm = null;

	/**
	 * 進捗登録処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite addPrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		String mskm_dtl_no = "";
		String svc_kei_no = "";

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)(param.getData(fixedText));
		if (null == inMap)
		{
			return param;
		}

		// 予約適用年月日に運用日を設定
		inMap.put(PREFIX_SHINCHOKU_ADD + "key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
		
		//****************************************************
		// 各サービスの進捗登録処理
		//****************************************************
		// ■ネット
		if (JKKBpCommon.getWkNetUmFlg(param))
		{
			// 申込明細番号(ネット)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoNet(param);
			// サービス契約番号(ネット)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoNet(param);
			
			// 異動年月日時分秒を取得してリクエストパラメータに設定
			setIdoDtm(handle, param, fixedText, paramMap, svc_kei_no);
			
			// ネット進捗用リスト
			ArrayList<HashMap> netPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_NET);
			
			if (0 < netPrgList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, netPrgList, mskm_dtl_no, svc_kei_no);
			}
			
			// ネット進捗機器用リスト
			ArrayList<HashMap> netPrgKikiList = new ArrayList<HashMap>();
			
			// レンタル機器登録
			if (inMap.get("net_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadNetRentKikiAddFlg(param))
			{
				// レンタル機器情報をネット進捗用リストに追加
				netPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("net_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadNetConKikiAddFlg(param))
			{
				// 接続機器情報をネット進捗用リストに追加
				netPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}
			
			if (0 < netPrgKikiList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, netPrgKikiList, mskm_dtl_no, svc_kei_no);
			}

			// ネットオプション用進捗リスト
			ArrayList<HashMap> netOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_NET_OP);
			
			if (0 < netOpPrgList.size())
			{
				// オプションサービス一意照会
				getSvcOpCmn(handle, param, fixedText, paramMap, netOpPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, netOpPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		// ■電話
		if (JKKBpCommon.getWkTelUmFlg(param))
		{
			// 申込明細番号(電話)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoTel(param);
			// サービス契約番号(電話)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoTel(param);
			
			// 異動年月日時分秒を取得してリクエストパラメータに設定
			setIdoDtm(handle, param, fixedText, paramMap, svc_kei_no);

			// 電話進捗用リスト
			ArrayList<HashMap> telPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL);

			if (0 < telPrgList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, telPrgList, mskm_dtl_no, svc_kei_no);
			}

			// 電話進捗機器用リスト
			ArrayList<HashMap> telPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("tel_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTelRentKikiAddFlg(param))
			{
				// レンタル機器情報を電話進捗用リストに追加
				telPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("tel_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTelConKikiAddFlg(param))
			{
				// 接続機器情報を電話進捗用リストに追加
				telPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < telPrgKikiList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, telPrgKikiList, mskm_dtl_no, svc_kei_no);
			}
			
			// 電話 割引進捗用リスト
			ArrayList<HashMap> telWribPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_WRIB);
			
			if (0 < telWribPrgList.size())
			{
				// 割引サービス一意照会
				getSvcWribCmn(handle, param, fixedText, paramMap, telWribPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, telWribPrgList, mskm_dtl_no, svc_kei_no);
			}
			
			// 電話オプション用進捗リスト
			ArrayList<HashMap> telOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_OP);
			
			if (0 < telOpPrgList.size())
			{
				// オプションサービス一意照会
				getSvcOpCmn(handle, param, fixedText, paramMap, telOpPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, telOpPrgList, mskm_dtl_no, svc_kei_no);
			}
			
			// 電話サブオプション用進捗リスト
			ArrayList<HashMap> telSbopPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_SBOP);
			
			if (0 < telSbopPrgList.size())
			{
				// サブオプションサービス一意照会
				getSvcSbopCmn(handle, param, fixedText, paramMap, telSbopPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, telSbopPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		// ■テレビ
		if (JKKBpCommon.getWkTvUmFlg(param))
		{
			// 申込明細番号(テレビ)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoTv(param);
			// サービス契約番号(テレビ)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoTv(param);
			
			// 異動年月日時分秒を取得してリクエストパラメータに設定
			setIdoDtm(handle, param, fixedText, paramMap, svc_kei_no);

			// テレビ進捗用リスト
			ArrayList<HashMap> tvPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TV);

			if (0 < tvPrgList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, tvPrgList, mskm_dtl_no, svc_kei_no);
			}

			// テレビ進捗機器用リスト
			ArrayList<HashMap> tvPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("tv_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTvRentKikiAddFlg(param))
			{
				// レンタル機器情報をテレビ進捗用リストに追加
				tvPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("tv_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTvConKikiAddFlg(param))
			{
				// 接続機器情報をテレビ進捗用リストに追加
				tvPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < tvPrgKikiList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, tvPrgKikiList, mskm_dtl_no, svc_kei_no);
			}
			
			// テレビオプション用進捗リスト
			ArrayList<HashMap> tvOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TV_OP);
			
			if (0 < tvOpPrgList.size())
			{
				// オプションサービス一意照会
				getSvcOpCmn(handle, param, fixedText, paramMap, tvOpPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, tvOpPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		// ■モバイル
		if (JKKBpCommon.getWkMblUmFlg(param))
		{
			// 申込明細番号(モバイル)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoMbl(param);
			// サービス契約番号(モバイル)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoMbl(param);
			
			// 異動年月日時分秒を取得してリクエストパラメータに設定
			setIdoDtm(handle, param, fixedText, paramMap, svc_kei_no);

			// モバイル進捗用リスト
			ArrayList<HashMap> mobaPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_MOBILE);

			if (0 < mobaPrgList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, mobaPrgList, mskm_dtl_no, svc_kei_no);
			}
			
			// モバイル進捗機器用リスト
			ArrayList<HashMap> mobaPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("mbl_rent_kiki_prg_add_flg").equals(true))
			{
				// レンタル機器情報をモバイル進捗用リストに追加
				mobaPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("mbl_connect_kiki_prg_add_flg").equals(true))
			{
				// 接続機器情報をモバイル進捗用リストに追加
				mobaPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < mobaPrgKikiList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, mobaPrgKikiList, mskm_dtl_no, svc_kei_no);
			}

			// モバイルオプション用進捗リスト
			ArrayList<HashMap> mobaOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_MOBILE_OP);
			
			if (0 < mobaOpPrgList.size())
			{
				// オプションサービス一意照会
				getSvcOpCmn(handle, param, fixedText, paramMap, mobaOpPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, mobaOpPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		// ■ADSL
		if (JKKBpCommon.getWkAdslUmFlg(param))
		{
			// 申込明細番号(ADSL)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoAdsl(param);
			// サービス契約番号(ADSL)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoAdsl(param);
			
			// 異動年月日時分秒を取得してリクエストパラメータに設定
			setIdoDtm(handle, param, fixedText, paramMap, svc_kei_no);
			
			// ADSL進捗用リスト
			ArrayList<HashMap> adslPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADSL);

			if (0 < adslPrgList.size())
			{
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, adslPrgList, mskm_dtl_no, svc_kei_no);
			}

			// ADSLオプション用進捗リスト
			ArrayList<HashMap> adslOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADSL_OP);
			
			if (0 < adslOpPrgList.size())
			{
				// オプションサービス一意照会
				getSvcOpCmn(handle, param, fixedText, paramMap, adslOpPrgList);
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, adslOpPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		//****************************************************
		// サービス一括処理
		//****************************************************
		if (inMap.containsKey(PRG_LIST_NAME_ADD))
		{
			// 進捗用リスト
			ArrayList<HashMap> addPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADD);
			
			if (0 < addPrgList.size())
			{
				// パラメータの申込明細番号を利用するためブランクを設定
				mskm_dtl_no = "";
				// パラメータのサービス契約番号を利用するためブランクを設定
				svc_kei_no = "";
				
				// 進捗登録
				addPrgCmn(handle, param, fixedText, paramMap, addPrgList, mskm_dtl_no, svc_kei_no);
			}
		}
		
		return param;
	}

	/**
	 * 進捗登録共通処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param paramMap パラメータマップ
	 * @param prgList 進捗リスト
	 * @param mskm_dtl_no 申込明細番号
	 * @param svc_kei_no サービス契約番号
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void addPrgCmn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> paramMap, ArrayList<HashMap> prgList, String mskm_dtl_no, String svc_kei_no) throws Throwable
	{
		Map<?, ?> result = null;
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		CAANMsg template = null;

		for(HashMap<String, String> mp : prgList)
		{
			if (!"".equals(mskm_dtl_no))
			{
				mp.put(PREFIX_SHINCHOKU_ADD + "mskm_dtl_no", mskm_dtl_no);
			}
			if (!"".equals(svc_kei_no))
			{
				mp.put(PREFIX_SHINCHOKU_ADD + "svc_kei_no", svc_kei_no);
			}
			else
			{
				// サービス一括処理の場合、異動年月日時分秒を取得してリクエストパラメータに設定
				setIdoDtm(handle, param, fixedText, paramMap, (String)mp.get(PREFIX_SHINCHOKU_ADD + "svc_kei_no"));
			}

			// 進捗登録
			template = editInEKK1091D010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング		
			result  = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editOutEKK1091D010(result, param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
	}
	
	/**
	 * サービスオプション一意照会共通処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param paramMap パラメータマップ
	 * @param prgList 進捗リスト
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void getSvcOpCmn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> paramMap, ArrayList<HashMap> prgList) throws Throwable
	{
		Map<?, ?> result = null;
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// オプションサービス一意照会
				template = editInEKK0821A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
				result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
				editOutEKK0821A010(result, param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 下りマッピング
				if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
				{ // ステータスが単項目エラー以上であれば例外をスロー
					throw new CCException(SC_ERROR_STRING, new Exception());
				}
			}
		}
	}
	
	/**
	 * 進捗用リストに機器情報追加を行います。
	 * <br>
	 * @param prefix プレフィックス
	 * @param prgStat 進捗ステータス
	 * @return パラメータマップ
	 */
	private HashMap<String, String> addPrgListKiki(String prefix, String prgStat)
	{
		HashMap<String, String> mp = new HashMap<String, String>();

		// 請求契約番号
		mp.put(prefix + "seiky_kei_no", "");
		// 請求方法番号(口座)
		mp.put(prefix + "seiky_way_no_koza", "");
		// 請求方法番号(クレジットカード)
		mp.put(prefix + "seiky_way_no_crecard", "");
		// サービス契約内訳番号
		mp.put(prefix + "svc_kei_ucwk_no", "");
		// サービス契約回線内訳番号
		mp.put(prefix + "svc_kei_kaisen_ucwk_no", "");
		// 機器提供サービス契約番号
		mp.put(prefix + "kktk_svc_kei_no", "");
		// オプションサービス契約番号
		mp.put(prefix + "op_svc_kei_no", "");
		// 請求オプションサービス契約番号
		mp.put(prefix + "seiopsvc_kei_no", "");
		// サブオプションサービス契約番号
		mp.put(prefix + "sbop_svc_kei_no", "");
		// 割引サービス契約番号
		mp.put(prefix + "wrib_svc_kei_no", "");

		// 進捗ステータス
		mp.put(prefix + "prg_stat", prgStat);

		// 進捗メモ
		mp.put(prefix + "prg_memo", "");
		// 進捗特記事項1
		mp.put(prefix + "prg_tkjk_1", "");
		// 進捗特記事項2
		mp.put(prefix + "prg_tkjk_2", "");
		
		return mp;
	}
	
	/**
	 * 単一CAANMsgのマッピング処理を行います。
	 * <br>
	 * @param paramMap パラメータマップ
	 * @param template CAANMsg
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> putParamMap(HashMap<String, Object> paramMap, CAANMsg template) throws RequestParameterException
	{
		CAANMsg[] templates = { template };
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * SCの実行ステータスの取得処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @return SCの実行ステータス
	 * @throws Exception
	 */
	private int getReturnCode(IRequestParameterReadWrite param) throws Exception
	{
		return Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
	}

	/**
	 * CAANMsgに必要なデータのマッピング処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws RequestParameterException
	{
		ArrayList<CAANMsg> msgList = new ArrayList<CAANMsg>();
		String mskm_dtl_no = "";
		String svc_kei_no = "";

		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)(param.getData(fixedText));
		if (null == inMap)
		{
			return null;
		}

		// 予約適用年月日に運用日を設定
		inMap.put(PREFIX_SHINCHOKU_ADD + "key_rsv_aply_ymd", JCCBPCommon.getOpeDate(null));
		
		// チェックではここで取得したシステム日付時分秒を使用する
		idoDtm = JCCBPCommon.getSysDateTimeStamp();
		
		//****************************************************
		// 各サービスの進捗登録処理
		//****************************************************
		// ■ネット
		if (JKKBpCommon.getWkNetUmFlg(param))
		{
			// 申込明細番号(ネット)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoNet(param);
			// サービス契約番号(ネット)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoNet(param);
			
			// ネット進捗用リスト
			ArrayList<HashMap> netPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_NET);
			
			if (0 < netPrgList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, netPrgList, mskm_dtl_no, svc_kei_no));
			}
			
			// ネット進捗機器用リスト
			ArrayList<HashMap> netPrgKikiList = new ArrayList<HashMap>();
			
			// レンタル機器登録
			if (inMap.get("net_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadNetRentKikiAddFlg(param))
			{
				// レンタル機器情報をネット進捗用リストに追加
				netPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("net_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadNetConKikiAddFlg(param))
			{
				// 接続機器情報をネット進捗用リストに追加
				netPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}
			
			if (0 < netPrgKikiList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, netPrgKikiList, mskm_dtl_no, svc_kei_no));
			}

			// ネットオプション用進捗リスト
			ArrayList<HashMap> netOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_NET_OP);
			
			if (0 < netOpPrgList.size())
			{
				// オプションサービス一意照会
				msgList.add(getSvcOpCmnCAANMsg(handle, param, fixedText, netOpPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, netOpPrgList, mskm_dtl_no, svc_kei_no));
			}
		}
		
		// ■電話
		if (JKKBpCommon.getWkTelUmFlg(param))
		{
			// 申込明細番号(電話)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoTel(param);
			// サービス契約番号(電話)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoTel(param);

			// 電話進捗用リスト
			ArrayList<HashMap> telPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL);

			if (0 < telPrgList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, telPrgList, mskm_dtl_no, svc_kei_no));
			}

			// 電話進捗機器用リスト
			ArrayList<HashMap> telPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("tel_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTelRentKikiAddFlg(param))
			{
				// レンタル機器情報を電話進捗用リストに追加
				telPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("tel_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTelConKikiAddFlg(param))
			{
				// 接続機器情報を電話進捗用リストに追加
				telPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < telPrgKikiList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, telPrgKikiList, mskm_dtl_no, svc_kei_no));
			}
			
			// 電話 割引進捗用リスト
			ArrayList<HashMap> telWribPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_WRIB);
			
			if (0 < telWribPrgList.size())
			{
				// 割引サービス一意照会
				msgList.add(getSvcWribCmnCAANMsg(handle, param, fixedText, telWribPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, telWribPrgList, mskm_dtl_no, svc_kei_no));
			}
			
			// 電話オプション用進捗リスト
			ArrayList<HashMap> telOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_OP);
			
			if (0 < telOpPrgList.size())
			{
				// オプションサービス一意照会
				msgList.add(getSvcOpCmnCAANMsg(handle, param, fixedText, telOpPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, telOpPrgList, mskm_dtl_no, svc_kei_no));
			}
			
			// 電話サブオプション用進捗リスト
			ArrayList<HashMap> telSbopPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TEL_SBOP);
			
			if (0 < telSbopPrgList.size())
			{
				// サブオプションサービス一意照会
				msgList.add(getSvcSbopCmnCAANMsg(handle, param, fixedText, telSbopPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, telSbopPrgList, mskm_dtl_no, svc_kei_no));
			}
		}
		
		// ■テレビ
		if (JKKBpCommon.getWkTvUmFlg(param))
		{
			// 申込明細番号(テレビ)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoTv(param);
			// サービス契約番号(テレビ)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoTv(param);

			// テレビ進捗用リスト
			ArrayList<HashMap> tvPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TV);

			if (0 < tvPrgList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, tvPrgList, mskm_dtl_no, svc_kei_no));
			}

			// テレビ進捗機器用リスト
			ArrayList<HashMap> tvPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("tv_rent_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTvRentKikiAddFlg(param))
			{
				// レンタル機器情報をテレビ進捗用リストに追加
				tvPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("tv_connect_kiki_prg_add_flg").equals(true) || JKKBpCommon.getWkUepcadTvConKikiAddFlg(param))
			{
				// 接続機器情報をテレビ進捗用リストに追加
				tvPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < tvPrgKikiList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, tvPrgKikiList, mskm_dtl_no, svc_kei_no));
			}
			
			// テレビオプション用進捗リスト
			ArrayList<HashMap> tvOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_TV_OP);
			
			if (0 < tvOpPrgList.size())
			{
				// オプションサービス一意照会
				msgList.add(getSvcOpCmnCAANMsg(handle, param, fixedText, tvOpPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, tvOpPrgList, mskm_dtl_no, svc_kei_no));
			}
		}
		
		// ■モバイル
		if (JKKBpCommon.getWkMblUmFlg(param))
		{
			// 申込明細番号(モバイル)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoMbl(param);
			// サービス契約番号(モバイル)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoMbl(param);

			// モバイル進捗用リスト
			ArrayList<HashMap> mobaPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_MOBILE);

			if (0 < mobaPrgList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, mobaPrgList, mskm_dtl_no, svc_kei_no));
			}
			
			// モバイル進捗機器用リスト
			ArrayList<HashMap> mobaPrgKikiList = new ArrayList<HashMap>();

			// レンタル機器登録
			if (inMap.get("mbl_rent_kiki_prg_add_flg").equals(true))
			{
				// レンタル機器情報をモバイル進捗用リストに追加
				mobaPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_RENT));
			}
			// 接続機器登録
			if (inMap.get("mbl_connect_kiki_prg_add_flg").equals(true))
			{
				// 接続機器情報をモバイル進捗用リストに追加
				mobaPrgKikiList.add(addPrgListKiki(PREFIX_SHINCHOKU_ADD, PRG_STAT_CONNECT));
			}

			if (0 < mobaPrgKikiList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, mobaPrgKikiList, mskm_dtl_no, svc_kei_no));
			}

			// モバイルオプション用進捗リスト
			ArrayList<HashMap> mobaOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_MOBILE_OP);
			
			if (0 < mobaOpPrgList.size())
			{
				// オプションサービス一意照会
				msgList.add(getSvcOpCmnCAANMsg(handle, param, fixedText, mobaOpPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, mobaOpPrgList, mskm_dtl_no, svc_kei_no));
			}
		}
		
		// ■ADSL
		if (JKKBpCommon.getWkAdslUmFlg(param))
		{
			// 申込明細番号(ADSL)の取得
			mskm_dtl_no = JKKBpCommon.getWkMskmDtlNoAdsl(param);
			// サービス契約番号(ADSL)の取得
			svc_kei_no = JKKBpCommon.getWkSvcKeiNoAdsl(param);
			
			// ADSL進捗用リスト
			ArrayList<HashMap> adslPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADSL);

			if (0 < adslPrgList.size())
			{
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, adslPrgList, mskm_dtl_no, svc_kei_no));
			}

			// ADSLオプション用進捗リスト
			ArrayList<HashMap> adslOpPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADSL_OP);
			
			if (0 < adslOpPrgList.size())
			{
				// オプションサービス一意照会
				msgList.add(getSvcOpCmnCAANMsg(handle, param, fixedText, adslOpPrgList));
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, adslOpPrgList, mskm_dtl_no, svc_kei_no));
			}
		}

		//****************************************************
		// サービス一括処理
		//****************************************************
		// 進捗用リスト
		if (inMap.containsKey(PRG_LIST_NAME_ADD))
		{
			ArrayList<HashMap> addPrgList = (ArrayList<HashMap>)inMap.get(PRG_LIST_NAME_ADD);
			
			if (0 < addPrgList.size())
			{
				// パラメータの申込明細番号を利用するためブランクを設定
				mskm_dtl_no = "";
				// パラメータのサービス契約番号を利用するためブランクを設定
				svc_kei_no = "";
				
				// 進捗登録
				msgList.add(addPrgCmnCAANMsg(handle, param, fixedText, addPrgList, mskm_dtl_no, svc_kei_no));
			}
		}
		int msgCnt = msgList.size();
		CAANMsg[] templates = new CAANMsg[msgCnt];
		for (int i = 0; i < msgCnt; i++)
		{
			templates[i] = msgList.get(i);
		}

		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 進捗登録共通処理(CAANMsg用)を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prgList 進捗リスト
	 * @param mskm_dtl_no 申込明細番号
	 * @param svc_kei_no サービス契約番号
	 * @return CAANMsg
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg addPrgCmnCAANMsg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList<HashMap> prgList, String mskm_dtl_no, String svc_kei_no) throws RequestParameterException
	{
		CAANMsg template = null;
		
		String prefix = PREFIX_SHINCHOKU_ADD;

		for(HashMap<String, String> mp : prgList)
		{
			if (!"".equals(mskm_dtl_no))
			{
				mp.put(prefix + "mskm_dtl_no", mskm_dtl_no);
			}
			if (!"".equals(svc_kei_no))
			{
				mp.put(prefix + "svc_kei_no", svc_kei_no);
			}

			// 進捗登録
			template = editInEKK1091D010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
		}

		return template;
	}
	
	/**
	 * サービスオプション一意照会共通処理(CAANMsg用)を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prgList 進捗リスト
	 * @return CAANMsg
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg getSvcOpCmnCAANMsg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList<HashMap> prgList) throws RequestParameterException
	{
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// オプションサービス一意照会
				template = editInEKK0821A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
			}
		}

		return template;
	}

	/**
	 * SCインプット共通データ設定処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param paramMap パラメータマップ
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> setSCInputCommonData(IRequestParameterReadWrite param, HashMap<String, Object> paramMap)
			throws RequestParameterException
	{
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		return paramMap;
	}

	/**
	 * 進捗登録の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK1091D010(IRequestParameterReadWrite param, String fixedText
			, String prefix, HashMap mp) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK1091D010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK1091D010CBSMsg.TEMPLATEID, "EKK1091D010");

		// 機能コード（デフォルト：１）
		template.set(EKK1091D010CBSMsg.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);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (null != workMap)
		{
			inMap = (HashMap)workMap.get(CC_WORK_AREA_NAME);
		}
		else
		{
			inMap = null;
		}

		/* ユーザデータ情報 */
		inMap = (HashMap)(param.getData(fixedText));

		// 機能コード
		template.set(EKK1091D010CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// 異動区分
		if (null == mp || null == mp.get(prefix + "ido_div") || "".equals(mp.get(prefix + "ido_div")))
		{
			if (null == inMap || null == inMap.get(prefix + "ido_div") || "".equals(inMap.get(prefix + "ido_div")))
			{
				template.setNull(EKK1091D010CBSMsg.IDO_DIV);
			}
			else
			{
				template.set(EKK1091D010CBSMsg.IDO_DIV, (String)inMap.get(prefix + "ido_div"));
			}
		}
		else
		{
			template.set(EKK1091D010CBSMsg.IDO_DIV, (String)mp.get(prefix + "ido_div"));
		}

		// 異動年月日時分秒
		if (null == idoDtm || "".equals(idoDtm))
		{
			template.setNull(EKK1091D010CBSMsg.IDO_DTM);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.IDO_DTM, idoDtm);
		}
		
		// 異動理由明細
		ArrayList<HashMap<String, Object>> msg1List = (ArrayList<HashMap<String, Object>>)inMap.get(prefix + "EKK1091D010CBSMsg1List");
		if(null == msg1List)
		{
			msg1List = new ArrayList<HashMap<String, Object>>();
		}
		CAANMsg[] templateArray = new CAANMsg[msg1List.size()];

		int i = 0;
		CAANMsg childTemplate = null;
		for(HashMap<String, Object> childMap : msg1List)
		{
			childTemplate = templateArray[i];
			
			if (null == childTemplate)
			{
				childTemplate = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
				templateArray[i] = childTemplate;
			}
			
			i++;
			
			// 異動理由明細.異動理由コード → 異動理由明細.異動理由コード
			if (null == childMap || null == childMap.get(prefix + "ido_rsn_cd") || "".equals(childMap.get(prefix + "ido_rsn_cd")))
			{
				childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_CD);
			}
			else
			{
				childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, (String)childMap.get(prefix + "ido_rsn_cd"));
			}

			// 異動理由明細.異動理由メモ → 異動理由明細.異動理由メモ
			if (null == childMap || null == childMap.get(prefix + "ido_rsn_memo") || "".equals(childMap.get(prefix + "ido_rsn_memo")))
			{
				childTemplate.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
			}
			else
			{
				childTemplate.set(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, (String)childMap.get(prefix + "ido_rsn_memo"));
			}
		}
		
		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, templateArray);

		// 申込明細番号
		if (null == mp || null == mp.get(prefix + "mskm_dtl_no") || "".equals(mp.get(prefix + "mskm_dtl_no")))
		{
			template.setNull(EKK1091D010CBSMsg.MSKM_DTL_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.MSKM_DTL_NO, mp.get(prefix + "mskm_dtl_no"));
		}

		// 請求契約番号
		if (null == mp || null == mp.get(prefix + "seiky_kei_no") || "".equals(mp.get(prefix + "seiky_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SEIKY_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SEIKY_KEI_NO, (String)mp.get(prefix + "seiky_kei_no"));
		}

		// 請求方法番号(口座)
		if (null == mp || null == mp.get(prefix + "seiky_way_no_koza") || "".equals(mp.get(prefix + "seiky_way_no_koza")))
		{
			template.setNull(EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA, (String)mp.get(prefix + "seiky_way_no_koza"));
		}

		// 請求方法番号(クレジットカード)
		if (null == mp || null == mp.get(prefix + "seiky_way_no_crecard") || "".equals(mp.get(prefix + "seiky_way_no_crecard")))
		{
			template.setNull(EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD, (String)mp.get(prefix + "seiky_way_no_crecard"));
		}

		// サービス契約番号
		if (null == mp || null == mp.get(prefix + "svc_kei_no") || "".equals(mp.get(prefix + "svc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SVC_KEI_NO, mp.get(prefix + "svc_kei_no"));
		}

		// サービス契約内訳番号
		if (null == mp || null == mp.get(prefix + "svc_kei_ucwk_no") || "".equals(mp.get(prefix + "svc_kei_ucwk_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SVC_KEI_UCWK_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SVC_KEI_UCWK_NO, (String)mp.get(prefix + "svc_kei_ucwk_no"));
		}

		// サービス契約回線内訳番号
		if (null == mp || null == mp.get(prefix + "svc_kei_kaisen_ucwk_no") || "".equals(mp.get(prefix + "svc_kei_kaisen_ucwk_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, (String)mp.get(prefix + "svc_kei_kaisen_ucwk_no"));
		}

		// 機器提供サービス契約番号
		if (null == mp || null == mp.get(prefix + "kktk_svc_kei_no") || "".equals(mp.get(prefix + "kktk_svc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.KKTK_SVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.KKTK_SVC_KEI_NO, (String)mp.get(prefix + "kktk_svc_kei_no"));
		}

		// オプションサービス契約番号
		if (null == mp || null == mp.get(prefix + "op_svc_kei_no") || "".equals(mp.get(prefix + "op_svc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.OP_SVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.OP_SVC_KEI_NO, (String)mp.get(prefix + "op_svc_kei_no"));
		}

		// 請求オプションサービス契約番号
		if (null == mp || null == mp.get(prefix + "seiopsvc_kei_no") || "".equals(mp.get(prefix + "seiopsvc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SEIOPSVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SEIOPSVC_KEI_NO, (String)mp.get(prefix + "seiopsvc_kei_no"));
		}

		// サブオプションサービス契約番号
		if (null == mp || null == mp.get(prefix + "sbop_svc_kei_no") || "".equals(mp.get(prefix + "sbop_svc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, (String)mp.get(prefix + "sbop_svc_kei_no"));
		}

		// 割引サービス契約番号
		if (null == mp || null == mp.get(prefix + "wrib_svc_kei_no") || "".equals(mp.get(prefix + "wrib_svc_kei_no")))
		{
			template.setNull(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO, (String)mp.get(prefix + "wrib_svc_kei_no"));
		}

		// 進捗ステータス
		if (null == mp || null == mp.get(prefix + "prg_stat") || "".equals(mp.get(prefix + "prg_stat")))
		{
			template.setNull(EKK1091D010CBSMsg.PRG_STAT);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.PRG_STAT, (String)mp.get(prefix + "prg_stat"));
		}

		// 進捗メモ
		if (null == mp || null == mp.get(prefix + "prg_memo") || "".equals(mp.get(prefix + "prg_memo")))
		{
			template.setNull(EKK1091D010CBSMsg.PRG_MEMO);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.PRG_MEMO, (String)mp.get(prefix + "prg_memo"));
		}

		// 進捗特記事項1
		if (null == mp || null == mp.get(prefix + "prg_tkjk_1") || "".equals(mp.get(prefix + "prg_tkjk_1")))
		{
			template.setNull(EKK1091D010CBSMsg.PRG_TKJK_1);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.PRG_TKJK_1, (String)mp.get(prefix + "prg_tkjk_1"));
		}

		// 進捗特記事項2
		if (null == mp || null == mp.get(prefix + "prg_tkjk_2") || "".equals(mp.get(prefix + "prg_tkjk_2")))
		{
			template.setNull(EKK1091D010CBSMsg.PRG_TKJK_2);
		}
		else
		{
			template.set(EKK1091D010CBSMsg.PRG_TKJK_2, (String)mp.get(prefix + "prg_tkjk_2"));
		}

		return template;
	}

	/**
	 *  進捗登録の下りマッピング処理
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return IRequestParameterReadWrite
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutEKK1091D010(Map<?, ?> msgList, IRequestParameterReadWrite param,
		String fixedText, String prefix, HashMap mp) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		if (null == workMap)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 業務データ設定 */
		HashMap dataMap = (HashMap)param.getData(fixedText);
		if (null == dataMap)
		{
			dataMap = new HashMap();
			param.setData(fixedText, dataMap);
		}

		/* 作業項目情報 */
		HashMap addSvcKeiNetWorkMap = (HashMap)workMap.get(CC_WORK_AREA_NAME);
		if (null == addSvcKeiNetWorkMap)
		{
			addSvcKeiNetWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_NAME, addSvcKeiNetWorkMap);
		}

		// 進捗番号
		if (template.isNull(EKK1091D010CBSMsg.PRG_NO))
		{
			mp.put(prefix + "prg_no", "");
		}
		else
		{
			mp.put(prefix + "prg_no", template.getString(EKK1091D010CBSMsg.PRG_NO));
		}

		// 進捗年月日時分秒
		if (template.isNull(EKK1091D010CBSMsg.PRG_DTM))
		{
			mp.put(prefix + "prg_dtm", "");
		}
		else
		{
			mp.put(prefix + "prg_dtm", template.getString(EKK1091D010CBSMsg.PRG_DTM));
		}

		// 登録年月日時分秒
		if (template.isNull(EKK1091D010CBSMsg.ADD_DTM))
		{
			mp.put(prefix + "add_dtm", "");
		}
		else
		{
			mp.put(prefix + "add_dtm", template.getString(EKK1091D010CBSMsg.ADD_DTM));
		}

		// 登録オペレータアカウント
		if (template.isNull(EKK1091D010CBSMsg.ADD_OPEACNT))
		{
			mp.put(prefix + "add_opeacnt", "");
		}
		else
		{
			mp.put(prefix + "add_opeacnt", template.getString(EKK1091D010CBSMsg.ADD_OPEACNT));
		}

		// 更新年月日時分秒
		if (template.isNull(EKK1091D010CBSMsg.UPD_DTM))
		{
			mp.put(prefix + "upd_dtm", "");
		}
		else
		{
			mp.put(prefix + "upd_dtm", template.getString(EKK1091D010CBSMsg.UPD_DTM));
		}

		// 更新オペレータアカウント
		if (template.isNull(EKK1091D010CBSMsg.UPD_OPEACNT))
		{
			mp.put(prefix + "upd_opeacnt", "");
		}
		else
		{
			mp.put(prefix + "upd_opeacnt", template.getString(EKK1091D010CBSMsg.UPD_OPEACNT));
		}

		// 無効フラグ
		if (template.isNull(EKK1091D010CBSMsg.MK_FLG))
		{
			mp.put(prefix + "mk_flg", "");
		}
		else
		{
			mp.put(prefix + "mk_flg", template.getString(EKK1091D010CBSMsg.MK_FLG));
		}

		ArrayList<HashMap<String, Object>> msg1List = (ArrayList<HashMap<String, Object>>)dataMap.get(prefix + "EKK1091D010CBSMsg1List");
		if(null == msg1List)
		{
			msg1List = new ArrayList<HashMap<String, Object>>();
		}
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
		if (null == templateArray)
		{
			templateArray = new CAANMsg[1];
		}

		int i = 0;
		HashMap childMap = null;
		for(CAANMsg childTemplate : templateArray)
		{
			if (null == childTemplate)
			{
				childTemplate = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
			}
			
			if(msg1List.size() <= i)
			{
				childMap = new HashMap();
				msg1List.add(childMap);
			}
			else
			{
				childMap = msg1List.get(i++);
			}

			// 異動理由番号
			if (childTemplate.isNull(EKK1091D010CBSMsg1List.IDO_RSN_NO))
			{
				childMap.put(prefix + "ido_rsn_no", "");
			}
			else
			{
				childMap.put(prefix + "ido_rsn_no", childTemplate.getString(EKK1091D010CBSMsg1List.IDO_RSN_NO));
			}
		}

		dataMap.put(prefix + "EKK1091D010CBSMsg1List", msg1List);

		// エラー情報の設定
		editErrInfoEKK1091D010(param, template, (Integer)returnCode, fixedText, prefix, mp);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * オプションサービス一意照会の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0821A010(IRequestParameterReadWrite param, String fixedText
			, String prefix, HashMap mp) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0821A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0821A010CBSMsg.TEMPLATEID, "EKK0821A010");

		// 機能コード
		template.set(EKK0821A010CBSMsg.FUNC_CODE, "2");

		// オペレータ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);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		
		HashMap inMap = null;
		HashMap inMapOp = null;
		
		/* 作業項目情報 */
		if (null != workMap)
		{
			inMap = (HashMap)workMap.get(CC_WORK_AREA_NAME);
		}
		else
		{
			inMap = null;
		}

		/* ユーザデータ情報 */
		inMap = (HashMap)(param.getData(fixedText));
		
		inMapOp = new HashMap();
		
		String prefixOp = "kk082101_";
		
		if (null == mp || null == mp.get(prefix + "op_svc_cd") || "".equals(mp.get(prefix + "op_svc_cd")))
		{
			inMapOp.put(prefixOp + "key_op_svc_cd", null);
		}
		else
		{
			inMapOp.put(prefixOp + "key_op_svc_cd", (String)mp.get(prefix + "op_svc_cd"));
		}
		if (null == inMap || null == inMap.get(prefix + "key_rsv_aply_ymd") || "".equals(inMap.get(prefix + "key_rsv_aply_ymd")))
		{
			inMapOp.put(prefixOp + "key_rsv_aply_ymd", null);
		}
		else
		{
			inMapOp.put(prefixOp + "key_rsv_aply_ymd", (String)inMap.get(prefix + "key_rsv_aply_ymd"));
		}
		
		
		// ＫＥＹ＿オプションサービスコード
		template.set(EKK0821A010CBSMsg.KEY_OP_SVC_CD, inMapOp.get(prefixOp + "key_op_svc_cd"));
		// ＫＥＹ＿予約適用年月日
		template.set(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD, inMapOp.get(prefixOp + "key_rsv_aply_ymd"));

		return template;
	}
	
	/**
	 *  オプションサービス一意照会の下りマッピング処理
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutEKK0821A010(Map<?, ?> msgList, IRequestParameterReadWrite param,
		String fixedText, String prefix, HashMap mp) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		if (null == workMap)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 業務データ設定 */
		HashMap dataMap = (HashMap)param.getData(fixedText);
		if (null == dataMap)
		{
			dataMap = new HashMap();
			param.setData(fixedText, dataMap);
		}

		/* 作業項目情報 */
		HashMap addSvcKeiNetWorkMap = (HashMap)workMap.get(CC_WORK_AREA_OP_NAME);
		if (null == addSvcKeiNetWorkMap)
		{
			addSvcKeiNetWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_NAME, addSvcKeiNetWorkMap);
		}
		
		String prefixOp = "kk082101_";

		ArrayList<HashMap<String, Object>> msg1List = (ArrayList<HashMap<String, Object>>)dataMap.get(prefixOp + "EKK0821A010CBSMsg1List");
		if(null == msg1List)
		{
			msg1List = new ArrayList<HashMap<String, Object>>();
		}
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0821A010CBSMsg.EKK0821A010CBSMSG1LIST);
		if (null == templateArray)
		{
			templateArray = new CAANMsg[1];
		}

		int i = 0;
		HashMap childMap = null;
		for(CAANMsg childTemplate : templateArray)
		{
			if (null == childTemplate)
			{
				childTemplate = new CAANMsg(EKK0821A010CBSMsg1List.class.getName());
			}
			
			if(msg1List.size() <= i)
			{
				childMap = new HashMap();
				msg1List.add(childMap);
			}
			else
			{
				childMap = msg1List.get(i++);
			}

			// オプションサービス名
			if (!childTemplate.isNull(EKK0821A010CBSMsg1List.OP_SVC_NM))
			{
				childMap.put(prefixOp + "op_svc_nm", childTemplate.getString(EKK0821A010CBSMsg1List.OP_SVC_NM));
			}
		}

		mp.put(prefix + "prg_tkjk_1", (String)mp.get(prefix + "prg_tkjk_1") + (String)childMap.get(prefixOp + "op_svc_nm"));
		
		// エラー情報の設定
		editErrInfoEKK0821A010(param, template, (Integer)returnCode, fixedText, prefix, childMap);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 * <br>
	 * @param param リクエストパラメータ
	 * @param templates テンプレート
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws Throwable
	{
		return JKKBpCommon.editErrorInfo(param, templates, returnCode);
	}

	/**
	 * 進捗登録のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK1091D010(IRequestParameterReadWrite param, CAANMsg template, int returnCode,
			String fixedText, String prefix, HashMap mp) throws RequestParameterException
	{
		int templateStatus = template.getInt(EKK1091D010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap inMap = (HashMap)(param.getData(fixedText));

		// 申込明細番号
		if (!template.isNull(EKK1091D010CBSMsg.MSKM_DTL_NO_ERR))
		{
			if (!mp.containsKey(prefix + "mskm_dtl_no_err"))
			{
				mp.put(prefix + "mskm_dtl_no_err", template.getString(EKK1091D010CBSMsg.MSKM_DTL_NO_ERR));
			}
		}

		// 請求契約番号
		if (!template.isNull(EKK1091D010CBSMsg.SEIKY_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "seiky_kei_no_err"))
			{
				mp.put(prefix + "seiky_kei_no_err", template.getString(EKK1091D010CBSMsg.SEIKY_KEI_NO_ERR));
			}
		}

		// 請求方法番号(口座)
		if (!template.isNull(EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA_ERR))
		{
			if (!mp.containsKey(prefix + "seiky_way_no_koza_err"))
			{
				mp.put(prefix + "seiky_way_no_koza_err", template.getString(EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA_ERR));
			}
		}

		// 請求方法番号(クレジットカード)
		if (!template.isNull(EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD_ERR))
		{
			if (!mp.containsKey(prefix + "seiky_way_no_crecard_err"))
			{
				mp.put(prefix + "seiky_way_no_crecard_err", template.getString(EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD_ERR));
			}
		}

		// サービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "svc_kei_no_err"))
			{
				mp.put(prefix + "svc_kei_no_err", template.getString(EKK1091D010CBSMsg.SVC_KEI_NO_ERR));
			}
		}

		// サービス契約内訳番号
		if (!template.isNull(EKK1091D010CBSMsg.SVC_KEI_UCWK_NO_ERR))
		{
			if (!mp.containsKey(prefix + "svc_kei_ucwk_no_err"))
			{
				mp.put(prefix + "svc_kei_ucwk_no_err", template.getString(EKK1091D010CBSMsg.SVC_KEI_UCWK_NO_ERR));
			}
		}

		// サービス契約回線内訳番号
		if (!template.isNull(EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO_ERR))
		{
			if (!mp.containsKey(prefix + "svc_kei_kaisen_ucwk_no_err"))
			{
				mp.put(prefix + "svc_kei_kaisen_ucwk_no_err", template.getString(EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO_ERR));
			}
		}

		// 機器提供サービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.KKTK_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "kktk_svc_kei_no_err"))
			{
				mp.put(prefix + "kktk_svc_kei_no_err", template.getString(EKK1091D010CBSMsg.KKTK_SVC_KEI_NO_ERR));
			}
		}

		// オプションサービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.OP_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "op_svc_kei_no_err"))
			{
				mp.put(prefix + "op_svc_kei_no_err", template.getString(EKK1091D010CBSMsg.OP_SVC_KEI_NO_ERR));
			}
		}

		// 請求オプションサービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.SEIOPSVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "seiopsvc_kei_no_err"))
			{
				mp.put(prefix + "seiopsvc_kei_no_err", template.getString(EKK1091D010CBSMsg.SEIOPSVC_KEI_NO_ERR));
			}
		}

		// サブオプションサービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "sbop_svc_kei_no_err"))
			{
				mp.put(prefix + "sbop_svc_kei_no_err", template.getString(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO_ERR));
			}
		}

		// 割引サービス契約番号
		if (!template.isNull(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "wrib_svc_kei_no_err"))
			{
				mp.put(prefix + "wrib_svc_kei_no_err", template.getString(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO_ERR));
			}
		}

		// 異動区分
		if (!template.isNull(EKK1091D010CBSMsg.IDO_DIV_ERR))
		{
			if (!inMap.containsKey(prefix + "ido_div_err"))
			{
				inMap.put(prefix + "ido_div_err", template.getString(EKK1091D010CBSMsg.IDO_DIV_ERR));
			}
		}

		// 異動年月日時分秒
		if (!template.isNull(EKK1091D010CBSMsg.IDO_DTM_ERR))
		{
			if (!inMap.containsKey(prefix + "ido_dtm_err"))
			{
				inMap.put(prefix + "ido_dtm_err", template.getString(EKK1091D010CBSMsg.IDO_DTM_ERR));
			}
		}

		// 進捗ステータス
		if (!template.isNull(EKK1091D010CBSMsg.PRG_STAT_ERR))
		{
			if (!mp.containsKey(prefix + "prg_stat_err"))
			{
				mp.put(prefix + "prg_stat_err", template.getString(EKK1091D010CBSMsg.PRG_STAT_ERR));
			}
		}

		// 進捗メモ
		if (!template.isNull(EKK1091D010CBSMsg.PRG_MEMO_ERR))
		{
			if (!mp.containsKey(prefix + "prg_memo_err"))
			{
				mp.put(prefix + "prg_memo_err", template.getString(EKK1091D010CBSMsg.PRG_MEMO_ERR));
			}
		}

		// 進捗特記事項1
		if (!template.isNull(EKK1091D010CBSMsg.PRG_TKJK_1_ERR))
		{
			if (!mp.containsKey(prefix + "prg_tkjk_1_err"))
			{
				mp.put(prefix + "prg_tkjk_1_err", template.getString(EKK1091D010CBSMsg.PRG_TKJK_1_ERR));
			}
		}

		// 進捗特記事項2
		if (!template.isNull(EKK1091D010CBSMsg.PRG_TKJK_2_ERR))
		{
			if (!mp.containsKey(prefix + "prg_tkjk_2_err"))
			{
				mp.put(prefix + "prg_tkjk_2_err", template.getString(EKK1091D010CBSMsg.PRG_TKJK_2_ERR));
			}
		}

		CAANMsg[] templateArray = template.getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);

		if (null == templateArray)
		{
			templateArray = new CAANMsg[1];
		}
		
		int i = 0;
		ArrayList<HashMap<String, Object>> ary = (ArrayList<HashMap<String, Object>>)inMap.get(prefix + "EKK1091D010CBSMsg1List");
		HashMap<String, Object> childMap = null;
		for(CAANMsg childTemplate : templateArray)
		{
			childMap = ary.get(i++);
			
			// 異動理由コード
			if (!childTemplate.isNull(EKK1091D010CBSMsg1List.IDO_RSN_CD_ERR))
			{
				if (!childMap.containsKey(prefix + "ido_rsn_cd_err"))
				{
					childMap.put(prefix + "ido_rsn_cd_err", childTemplate.getString(EKK1091D010CBSMsg1List.IDO_RSN_CD_ERR));
				}
			}

			// 異動理由メモ
			if (!childTemplate.isNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO_ERR))
			{
				if (!childMap.containsKey(prefix + "ido_rsn_memo_err"))
				{
					childMap.put(prefix + "ido_rsn_memo_err", childTemplate.getString(EKK1091D010CBSMsg1List.IDO_RSN_MEMO_ERR));
				}
			}
		}

		return param;
	}

	/**
	 * オプションサービス一意照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0821A010(IRequestParameterReadWrite param, CAANMsg template, int returnCode,
			String fixedText, String prefix, HashMap mp) throws RequestParameterException
	{
		int templateStatus = template.getInt(EKK0821A010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ＫＥＹ＿オプションサービスコード
		if (!template.isNull(EKK0821A010CBSMsg.KEY_OP_SVC_CD_ERR))
		{
			if (!mp.containsKey(prefix + "key_op_svc_cd_err"))
			{
				mp.put(prefix + "key_op_svc_cd_err", template.getString(EKK0821A010CBSMsg.KEY_OP_SVC_CD_ERR));
			}
		}
		
		// ＫＥＹ＿予約適用年月日
		if (!template.isNull(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD))
		{
			if (!mp.containsKey(prefix + "key_rsv_aply_ymd_err"))
			{
				mp.put(prefix + "key_rsv_aply_ymd_err", template.getString(EKK0821A010CBSMsg.KEY_RSV_APLY_YMD));
			}
		}

		return param;
	}

	/**
	 * 進捗一覧照会（異動区分）の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param svcKeiNo サービス契約番号
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK1091B002(IRequestParameterReadWrite param, String fixedText
			, String prefix, String svcKeiNo) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK1091B002CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK1091B002CBSMsg.TEMPLATEID, "EKK1091B002");

		// 機能コード（デフォルト：１）
		template.set(EKK1091B002CBSMsg.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);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (null != workMap)
		{
			inMap = (HashMap)workMap.get(CC_WORK_AREA_NAME);
		}
		else
		{
			inMap = null;
		}

		/* ユーザデータ情報 */
		inMap = (HashMap)(param.getData(fixedText));

		// 機能コード
		template.set(EKK1091B002CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// ＫＥＹ＿申込明細番号
		template.setNull(EKK1091B002CBSMsg.KEY_MSKM_DTL_NO);
		
		// ＫＥＹ＿請求契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_SEIKY_KEI_NO);
		
		// ＫＥＹ＿サービス契約番号
		template.set(EKK1091B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
		
		// ＫＥＹ＿サービス契約内訳番号
		template.setNull(EKK1091B002CBSMsg.KEY_SVC_KEI_UCWK_NO);
		
		// ＫＥＹ＿サービス契約回線内訳番号
		template.setNull(EKK1091B002CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO);
		
		// ＫＥＹ＿機器提供サービス契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_KKTK_SVC_KEI_NO);
		
		// ＫＥＹ＿オプションサービス契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_OP_SVC_KEI_NO);
		
		// ＫＥＹ＿請求オプションサービス契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_SEIOPSVC_KEI_NO);
		
		// ＫＥＹ＿サブオプションサービス契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_SBOP_SVC_KEI_NO);
		
		// ＫＥＹ＿割引サービス契約番号
		template.setNull(EKK1091B002CBSMsg.KEY_WRIB_SVC_KEI_NO);
		
		// ＫＥＹ＿異動区分
		if (null == inMap || null == inMap.get(prefix + "ido_div") || "".equals(inMap.get(prefix + "ido_div")))
		{
			template.setNull(EKK1091B002CBSMsg.KEY_IDO_DIV);
		}
		else
		{
			template.set(EKK1091B002CBSMsg.KEY_IDO_DIV, (String)inMap.get(prefix + "ido_div"));
		}
		
		// ＫＥＹ＿ソート項目
		template.set(EKK1091B002CBSMsg.KEY_SORT_ITEM_NO, "1");	// 登録年月日時分秒でソート
		
		// ＫＥＹ＿ソート順
		template.set(EKK1091B002CBSMsg.KEY_SORT_KBN, "0");	// 降順でソート
		
		return template;
	}
	
	/**
	 * 進捗一覧照会（異動区分）の下りマッピング処理
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @return IRequestParameterReadWrite
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutEKK1091B002(Map<?, ?> msgList, IRequestParameterReadWrite param,
		String fixedText, String prefix) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);

		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		if (null == workMap)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 業務データ設定 */
		HashMap dataMap = (HashMap)param.getData(fixedText);
		if (null == dataMap)
		{
			dataMap = new HashMap();
			param.setData(fixedText, dataMap);
		}

		/* 作業項目情報 */
		HashMap addSvcKeiNetWorkMap = (HashMap)workMap.get(CC_WORK_AREA_OP_NAME);
		if (null == addSvcKeiNetWorkMap)
		{
			addSvcKeiNetWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_NAME, addSvcKeiNetWorkMap);
		}

		ArrayList<HashMap<String, Object>> msg1List = (ArrayList<HashMap<String, Object>>)dataMap.get(prefix + "EKK1091B002CBSMsg1List");
		if(null == msg1List)
		{
			msg1List = new ArrayList<HashMap<String, Object>>();
		}
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK1091B002CBSMsg.EKK1091B002CBSMSG1LIST);
		if (null == templateArray)
		{
			templateArray = new CAANMsg[1];
		}

		if (null != templateArray && templateArray.length > 0)
		{
			// 異動年月日時分秒
			if (!templateArray[0].isNull(EKK1091B002CBSMsg1List.IDO_DTM))
			{
				idoDtm = templateArray[0].getString(EKK1091B002CBSMsg1List.IDO_DTM);
			}
		}
		
		// エラー情報の設定
		editErrInfoEKK1091B002(param, template, (Integer)returnCode, fixedText, prefix, dataMap);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}
	
	/**
	 * 進捗一覧照会（異動区分）のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK1091B002(IRequestParameterReadWrite param, CAANMsg template, int returnCode,
			String fixedText, String prefix, HashMap mp) throws RequestParameterException
	{
		int templateStatus = template.getInt(EKK1091B002CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ＫＥＹ＿サービス契約内訳番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_svc_kei_ucwk_no_err"))
			{
				mp.put(prefix + "key_svc_kei_ucwk_no_err", template.getString(EKK1091B002CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR));
			}
		}
		
		// ＫＥＹ＿サービス契約回線内訳番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_svc_kei_kaisen_ucwk_no_err"))
			{
				mp.put(prefix + "key_svc_kei_kaisen_ucwk_no_err", template.getString(EKK1091B002CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO_ERR));
			}
		}
		
		// ＫＥＹ＿機器提供サービス契約番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_kktk_svc_kei_no_err"))
			{
				mp.put(prefix + "key_kktk_svc_kei_no_err", template.getString(EKK1091B002CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR));
			}
		}
		
		// ＫＥＹ＿オプションサービス契約番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_OP_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_op_svc_kei_no_err"))
			{
				mp.put(prefix + "key_op_svc_kei_no_err", template.getString(EKK1091B002CBSMsg.KEY_OP_SVC_KEI_NO_ERR));
			}
		}
		
		// ＫＥＹ＿請求オプションサービス契約番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SEIOPSVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_seiopsvc_kei_no_err"))
			{
				mp.put(prefix + "key_seiopsvc_kei_no_err", template.getString(EKK1091B002CBSMsg.KEY_SEIOPSVC_KEI_NO_ERR));
			}
		}
		
		// ＫＥＹ＿サブオプションサービス契約番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SBOP_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_sbop_svc_kei_no_err"))
			{
				mp.put(prefix + "key_sbop_svc_kei_no_err", template.getString(EKK1091B002CBSMsg.KEY_SBOP_SVC_KEI_NO_ERR));
			}
		}
		
		// ＫＥＹ＿割引サービス契約番号
		if (!template.isNull(EKK1091B002CBSMsg.KEY_WRIB_SVC_KEI_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_wrib_svc_kei_no_err"))
			{
				mp.put(prefix + "key_wrib_svc_kei_no_err", template.getString(EKK1091B002CBSMsg.KEY_WRIB_SVC_KEI_NO_ERR));
			}
		}
		
		// ＫＥＹ＿異動区分
		if (!template.isNull(EKK1091B002CBSMsg.KEY_IDO_DIV_ERR))
		{
			if (!mp.containsKey(prefix + "key_ido_div_err"))
			{
				mp.put(prefix + "key_ido_div_err", template.getString(EKK1091B002CBSMsg.KEY_IDO_DIV_ERR));
			}
		}
		
		// ＫＥＹ＿ソート項目
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SORT_ITEM_NO_ERR))
		{
			if (!mp.containsKey(prefix + "key_sort_item_no_err"))
			{
				mp.put(prefix + "key_sort_item_no_err", template.getString(EKK1091B002CBSMsg.KEY_SORT_ITEM_NO_ERR));
			}
		}
		
		// ＫＥＹ＿ソート順
		if (!template.isNull(EKK1091B002CBSMsg.KEY_SORT_KBN_ERR))
		{
			if (!mp.containsKey(prefix + "key_sort_kbn_err"))
			{
				mp.put(prefix + "key_sort_kbn_err", template.getString(EKK1091B002CBSMsg.KEY_SORT_KBN_ERR));
			}
		}

		return param;
	}
	
	/**
	 * 登録済みの進捗レコードの異動年月日時分秒をリクエストパラメータに設定します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param paramMap パラメータマップ
	 * @param svcKeiNo サービス契約番号
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	private IRequestParameterReadWrite setIdoDtm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> paramMap, String svcKeiNo) throws Throwable
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 初期値はシステム年月日時分秒
		idoDtm = JCCBPCommon.getSysDateTimeStamp();
		
		// 進捗一覧照会（異動区分）
		CAANMsg template = editInEKK1091B002(param, fixedText, PREFIX_SHINCHOKU_ADD, svcKeiNo);
		Map<?, ?> result  = scCall.run(putParamMap(paramMap, template), handle);
		editOutEKK1091B002(result, param, fixedText, PREFIX_SHINCHOKU_ADD);
		if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
		{ // ステータスが単項目エラー以上であれば例外をスロー
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		return param;
	}

	/**
	 * サブオプションサービス一意照会の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0831A010(IRequestParameterReadWrite param, String fixedText,
			String prefix, HashMap mp) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0831A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0831A010CBSMsg.TEMPLATEID, "EKK0831A010");

		// 機能コード
		template.set(EKK0831A010CBSMsg.FUNC_CODE, "2");

		// オペレータ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 (null == mp || null == mp.get(prefix + "sbop_svc_cd") || "".equals(mp.get(prefix + "sbop_svc_cd")))
		{
			template.setNull(EKK0831A010CBSMsg.KEY_SBOP_SVC_CD);
		}
		else
		{
			template.set(EKK0831A010CBSMsg.KEY_SBOP_SVC_CD, (String)mp.get(prefix + "sbop_svc_cd"));
		}
		
		return template;
	}
	
	/**
	 *  サブオプションサービス一意照会の下りマッピング処理
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutEKK0831A010(Map<?, ?> msgList, IRequestParameterReadWrite param,
		String fixedText, String prefix, HashMap mp) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0831A010CBSMsg.EKK0831A010CBSMSG1LIST);
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				// サブオプションサービス名
				if (!childTemplate.isNull(EKK0831A010CBSMsg1List.SBOP_SVC_NM))
				{
					mp.put(prefix + "prg_tkjk_1", (String)mp.get(prefix + "prg_tkjk_1") + childTemplate.getString(EKK0831A010CBSMsg1List.SBOP_SVC_NM));
				}
			}
		}
		
		// エラー情報の設定
		editErrInfoEKK0831A010(param, template, (Integer)returnCode, fixedText, prefix, mp);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * サブオプションサービス一意照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0831A010(IRequestParameterReadWrite param, CAANMsg template, int returnCode,
			String fixedText, String prefix, HashMap mp) throws RequestParameterException
	{
		int templateStatus = template.getInt(EKK0831A010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ＫＥＹ＿サブオプションサービスコード
		if (!template.isNull(EKK0831A010CBSMsg.KEY_SBOP_SVC_CD_ERR))
		{
			if (!mp.containsKey(prefix + "key_sbop_svc_cd_err"))
			{
				mp.put(prefix + "key_sbop_svc_cd_err", template.getString(EKK0831A010CBSMsg.KEY_SBOP_SVC_CD_ERR));
			}
		}

		return param;
	}

	/**
	 * 割引サービス一意照会の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK0841A010(IRequestParameterReadWrite param, String fixedText,
			String prefix, HashMap mp) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0841A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0841A010CBSMsg.TEMPLATEID, "EKK0841A010");

		// 機能コード
		template.set(EKK0841A010CBSMsg.FUNC_CODE, "2");

		// オペレータ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);
		
		/* ユーザデータ情報 */
		HashMap inMap = (HashMap)(param.getData(fixedText));
		
		// ＫＥＹ＿割引サービスコード
		if (null == mp || null == mp.get(prefix + "wrib_svc_cd") || "".equals(mp.get(prefix + "wrib_svc_cd")))
		{
			template.setNull(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD);
		}
		else
		{
			template.set(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD, (String)mp.get(prefix + "wrib_svc_cd"));
		}
		
		// ＫＥＹ＿予約適用年月日
		if (null == inMap || null == inMap.get(prefix + "key_rsv_aply_ymd") || "".equals(inMap.get(prefix + "key_rsv_aply_ymd")))
		{
			template.setNull(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD);
		}
		else
		{
			template.set(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD, (String)inMap.get(prefix + "key_rsv_aply_ymd"));
		}
		
		return template;
	}
	
	/**
	 *  割引サービス一意照会の下りマッピング処理
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editOutEKK0841A010(Map<?, ?> msgList, IRequestParameterReadWrite param,
		String fixedText, String prefix, HashMap mp) throws Exception
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		CAANMsg[] templateArray = template.getCAANMsgList(EKK0841A010CBSMsg.EKK0841A010CBSMSG1LIST);
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				CAANMsg childTemplate = templateArray[i];
				
				// 割引サービス名
				if (!childTemplate.isNull(EKK0841A010CBSMsg1List.WRIB_SVC_NM))
				{
					mp.put(prefix + "prg_tkjk_1", (String)mp.get(prefix + "prg_tkjk_1") + childTemplate.getString(EKK0841A010CBSMsg1List.WRIB_SVC_NM));
				}
			}
		}
		
		// エラー情報の設定
		editErrInfoEKK0841A010(param, template, (Integer)returnCode, fixedText, prefix, mp);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * 割引サービス一意照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ指定文字列
	 * @param prefix プレフィックス
	 * @param mp 各サービスの進捗登録用リストが要素単位で格納されているマップ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK0841A010(IRequestParameterReadWrite param, CAANMsg template, int returnCode,
			String fixedText, String prefix, HashMap mp) throws RequestParameterException
	{
		int templateStatus = template.getInt(EKK0841A010CBSMsg.STATUS);
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}
		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		// ＫＥＹ＿オプションサービスコード
		if (!template.isNull(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD_ERR))
		{
			if (!mp.containsKey(prefix + "key_wrib_svc_cd_err"))
			{
				mp.put(prefix + "key_wrib_svc_cd_err", template.getString(EKK0841A010CBSMsg.KEY_WRIB_SVC_CD_ERR));
			}
		}

		// ＫＥＹ＿予約適用年月日
		if (!template.isNull(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD_ERR))
		{
			if (!mp.containsKey(prefix + "key_rsv_aply_ymd_err"))
			{
				mp.put(prefix + "key_rsv_aply_ymd_err", template.getString(EKK0841A010CBSMsg.KEY_RSV_APLY_YMD_ERR));
			}
		}

		return param;
	}
	
	/**
	 * サブオプションサービス一意照会共通処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param paramMap パラメータマップ
	 * @param prgList 進捗リスト
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void getSvcSbopCmn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> paramMap, ArrayList<HashMap> prgList) throws Throwable
	{
		Map<?, ?> result = null;
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// サブオプションサービス一意照会
				template = editInEKK0831A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
				result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
				editOutEKK0831A010(result, param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 下りマッピング
				if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
				{ // ステータスが単項目エラー以上であれば例外をスロー
					throw new CCException(SC_ERROR_STRING, new Exception());
				}
			}
		}
	}
	
	/**
	 * サブオプションサービス一意照会共通処理(CAANMsg用)を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prgList 進捗リスト
	 * @return CAANMsg
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg getSvcSbopCmnCAANMsg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList<HashMap> prgList) throws RequestParameterException
	{
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// サブオプションサービス一意照会
				template = editInEKK0831A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
			}
		}

		return template;
	}
	
	/**
	 * 割引サービス一意照会共通処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param paramMap パラメータマップ
	 * @param prgList 進捗リスト
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void getSvcWribCmn(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, Object> paramMap, ArrayList<HashMap> prgList) throws Throwable
	{
		Map<?, ?> result = null;
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// 割引サービス一意照会
				template = editInEKK0841A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
				result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
				editOutEKK0841A010(result, param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 下りマッピング
				if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
				{ // ステータスが単項目エラー以上であれば例外をスロー
					throw new CCException(SC_ERROR_STRING, new Exception());
				}
			}
		}
	}
	
	/**
	 * 割引サービス一意照会共通処理(CAANMsg用)を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ指定文字列
	 * @param prgList 進捗リスト
	 * @return CAANMsg
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg getSvcWribCmnCAANMsg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			ArrayList<HashMap> prgList) throws RequestParameterException
	{
		CAANMsg template = null;

		if (0 < prgList.size())
		{		
			for(HashMap<String, String> mp : prgList)
			{
				// 割引サービス一意照会
				template = editInEKK0841A010(param, fixedText, PREFIX_SHINCHOKU_ADD, mp); // 上りマッピング
			}
		}

		return template;
	}

}
