/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAplySeiopsvcKeiCC
*   ソースファイル名：JKKAplySeiopsvcKeiCC.java
*   作成者          ：富士通
*   日付            ：2012年05月28日
*＜機能概要＞
*   請求オプションサービス契約適用コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/10/01   FJ）北村    新規作成
*	v4.00.00	2012/10/03	 FJ）多田    【ANK-0373-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.EKK2441C020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441D010CBSMsg1List;

/**
 * 他事業者割引契約申込適用コモンコンポーネント部品.
 * <br>
 * @author 富士通
 */
public class JKKAplyTajgsWribKeiMskmCC 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_APLY_TAJGS_WRIB_KEI     = "JKKAplyTajgsWribKeiMskmCC";

	/** エラー用 */
	private static final String SC_ERROR_STRING                    = "サービスコンポーネントエラー";

	/**
	 * 他事業者割引契約申込適用処理を行います。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite aplyTajgsWribKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		Map<?, ?> result = null;
		CAANMsg template = null;

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// CCに値が設定されていない場合は処理を行わない。
		if (inMap == null)
		{
			return param;
		}
		
		// 他事業者割引契約番号(削除用)が存在する場合
		if((String)inMap.get("del_tajgs_wrib_kei_no") != null && !"".equals((String)inMap.get("del_tajgs_wrib_kei_no")))
		{
			// 他事業者割引契約申込キャンセル
			template = editInEKK2441C030(param, fixedText); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetEKK2441C030(result, param, fixedText); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
		// 他事業者割引契約番号(更新用)が存在する場合
		if((String)inMap.get("upd_tajgs_wrib_kei_no") != null && !"".equals((String)inMap.get("upd_tajgs_wrib_kei_no")))
		{
			// 他事業者割引契約申込変更
			template = editInEKK2441C020(param, fixedText); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetEKK2441C020(result, param, fixedText); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
		// 特記画面のバリューコードが入力されている場合
		else if((String)inMap.get("kddi_val_cd_dsp") != null && !"".equals((String)inMap.get("kddi_val_cd_dsp")))
		{
			
			ArrayList ekk2441D010CBSMsg1List = new ArrayList();
			HashMap childMap = new HashMap();
			
			// ネットサービス有無が有の場合
			if(JKKBpCommon.getWkNetUmFlg(param))
			{
				// 申込明細番号が存在しない場合、申込明細番号(eo光ネット)を設定する
				if((String)inMap.get("mskm_dtl_no") == null || "".equals((String)inMap.get("mskm_dtl_no")))
				{
					inMap.put("mskm_dtl_no", JKKBpCommon.getWkMskmDtlNoNet(param));
				}
				
				// サービス契約番号にサービス契約番号(eo光ネット)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoNet(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMap.get("ki_svc_kei_no_net"));
			}
			ekk2441D010CBSMsg1List.add(childMap);

			childMap = new HashMap();
			
			// 電話サービス有無が有の場合
			if(JKKBpCommon.getWkTelUmFlg(param))
			{
				// サービス契約番号にサービス契約番号(eo光電話)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoTel(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMap.get("ki_svc_kei_no_tel"));
			}
			
			ekk2441D010CBSMsg1List.add(childMap);
			inMap.put("EKK2441D010CBSMsg1List", ekk2441D010CBSMsg1List);
			
			// 他事業者割引契約申込登録
			template = editInEKK2441D010(param, fixedText); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetEKK2441D010(result, param, fixedText); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{ // ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
		
		return param;
	}

	/**
	 * 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>();
		
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		if (inMap == null)
		{
			return null;
		}
		
		// 他事業者割引契約番号（削除用）に値が存在する場合
		if((String)inMap.get("del_tajgs_wrib_kei_no") != null && !"".equals((String)inMap.get("del_tajgs_wrib_kei_no")))
		{
			//他事業者割引契約申込キャンセル
			msgList.add(editInEKK2441C030(param, fixedText));
		}
		
		// 他事業者割引契約番号（更新用）に値が存在する場合
		if((String)inMap.get("upd_tajgs_wrib_kei_no") != null && !"".equals((String)inMap.get("upd_tajgs_wrib_kei_no")))
		{
			// 他事業者割引契約申込変更
			msgList.add(editInEKK2441C020(param, fixedText));
		}
		// 特記画面のバリューコードが入力されている場合
		else if((String)inMap.get("kddi_val_cd_dsp") != null && !"".equals((String)inMap.get("kddi_val_cd_dsp")))
		{
			
			ArrayList ekk2441D010CBSMsg1List = new ArrayList();
			HashMap childMap = new HashMap();
			
			// ネットサービス有無が有の場合
			if(JKKBpCommon.getWkNetUmFlg(param))
			{
				// 申込明細番号が存在しない場合、申込明細番号(eo光ネット)を設定する
				if((String)inMap.get("mskm_dtl_no") == null || "".equals((String)inMap.get("mskm_dtl_no")))
				{
					inMap.put("mskm_dtl_no", JKKBpCommon.getWkMskmDtlNoNet(param));
				}
				
				// サービス契約番号にサービス契約番号(eo光ネット)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoNet(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMap.get("ki_svc_kei_no_net"));
			}
			ekk2441D010CBSMsg1List.add(childMap);

			childMap = new HashMap();
			
			// 電話サービス有無が有の場合
			if(JKKBpCommon.getWkTelUmFlg(param))
			{
				// サービス契約番号にサービス契約番号(eo光電話)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoTel(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMap.get("ki_svc_kei_no_tel"));
			}
			
			ekk2441D010CBSMsg1List.add(childMap);
			inMap.put("EKK2441D010CBSMsg1List", ekk2441D010CBSMsg1List);
			
			// 他事業者割引契約申込登録
			msgList.add(editInEKK2441D010(param, fixedText));
		}
		
		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;
	}

	/**
	 * エラー情報のマッピング処理を行います。
	 * <br>
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		// ユーザデータ情報
		HashMap inMapChk = (HashMap)(param.getData(fixedText));
		
		if (inMapChk == null)
		{
			return param;
		}

		int index = 0;

		// 他事業者割引契約番号（削除用）に値がある場合
		if((String)inMapChk.get("del_tajgs_wrib_kei_no") != null && !"".equals((String)inMapChk.get("del_tajgs_wrib_kei_no")))
		{
			//他事業者割引契約申込キャンセル
			editErrInfoEKK2441C030(param, templates[index], (Integer)returnCode, fixedText);
			index += 1;
		}
		// 他事業者割引契約番号（更新用）に値がある場合
		if((String)inMapChk.get("upd_tajgs_wrib_kei_no") != null && !"".equals((String)inMapChk.get("upd_tajgs_wrib_kei_no")))
		{
			// 他事業者割引契約申込変更
			editErrInfoEKK2441C020(param, templates[index], (Integer)returnCode, fixedText);
			index += 1;
		}
		// バリューコードに値がある場合
		else if((String)inMapChk.get("kddi_val_cd_dsp") != null && !"".equals((String)inMapChk.get("kddi_val_cd_dsp")))
		{
			
			ArrayList ekk2441D010CBSMsg1List = new ArrayList();
			HashMap childMap = new HashMap();
			
			// ネットサービス有無が有の場合
			if(JKKBpCommon.getWkNetUmFlg(param))
			{
				// 申込明細番号が存在しない場合、申込明細番号(eo光ネット)を設定する
				if((String)inMapChk.get("mskm_dtl_no") == null || "".equals((String)inMapChk.get("mskm_dtl_no")))
				{
					inMapChk.put("mskm_dtl_no", JKKBpCommon.getWkMskmDtlNoNet(param));
				}
				
				// サービス契約番号にサービス契約番号(eo光ネット)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoNet(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMapChk.get("ki_svc_kei_no_net"));
			}
			ekk2441D010CBSMsg1List.add(childMap);

			childMap = new HashMap();
			
			// 電話サービス有無が有の場合
			if(JKKBpCommon.getWkTelUmFlg(param))
			{
				// サービス契約番号にサービス契約番号(eo光電話)を設定する
				childMap.put("svc_kei_no", JKKBpCommon.getWkSvcKeiNoTel(param));
			}
			else
			{
				childMap.put("svc_kei_no", (String)inMapChk.get("ki_svc_kei_no_tel"));
			}
			// 他事業者割引契約申込登録
			editErrInfoEKK2441D010(param, templates[index], (Integer)returnCode, fixedText);
			index += 1;
		}		

		return param;
	}

	/**
	 * 他事業者割引契約申込登録の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param      リクエストパラメータ
	 * @param fixedText  サービスメッセージ
	 * @param prefix     プレフィックス
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK2441D010(
			IRequestParameterReadWrite param,
			String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK2441D010CBSMsg.class.getName());
		ArrayList inList = null;
		CAANMsg[] templateArray = null;

		// テンプレートID
		template.set(EKK2441D010CBSMsg.TEMPLATEID, "EKK2441D010");

		// 機能コード（デフォルト：１）
		template.set(EKK2441D010CBSMsg.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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機能コード
		template.set(EKK2441D010CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// ＫＤＤＩバリューコード
		setTemplate(param, template, EKK2441D010CBSMsg.KDDI_VAL_CD, inMap, "kddi_val_cd_dsp");
		
		// 申込明細番号
		setTemplate(param, template, EKK2441D010CBSMsg.MSKM_DTL_NO, inMap, "mskm_dtl_no");
		
		// 他事業者通知抑止有無
		template.set(EKK2441D010CBSMsg.TAJGS_TCH_YOKSI_UM, "0");
		
		inList = (ArrayList)inMap.get("EKK2441D010CBSMsg1List");
		templateArray = template.getCAANMsgList(EKK2441D010CBSMsg.EKK2441D010CBSMSG1LIST);
		
		if (templateArray == null)
		{
			templateArray = new CAANMsg[inList.size()];
		}

		if (inList != null)
		{
			for (int i = 0; i < inList.size(); i++)
			{
				HashMap childMap = (HashMap)inList.get(i);
				
				CAANMsg childTemplate = templateArray[i];
				if (childTemplate == null)
				{
					childTemplate = new CAANMsg(EKK2441D010CBSMsg1List.class.getName());
				}
				
				// サービス契約番号
				if (childMap.get("svc_kei_no") == null || "".equals(childMap.get("svc_kei_no")))
				{
					childTemplate.setNull(EKK2441D010CBSMsg1List.SVC_KEI_NO_KK2451);
				}
				else
				{
					childTemplate.set(EKK2441D010CBSMsg1List.SVC_KEI_NO_KK2451, (String)childMap.get("svc_kei_no"));
				}
				
				templateArray[i] = childTemplate;
			}
		}
		
		template.set(EKK2441D010CBSMsg.EKK2441D010CBSMSG1LIST, templateArray);
			
		return template;
	}

	/**
	 * 他事業者割引契約申込登録の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK2441D010(
			Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			String fixedText) 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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// 他事業者割引契約番号
		setOutData(inMap, EKK2441D010CBSMsg.TAJGS_WRIB_KEI_NO, template, "tajgs_wrib_kei_no");
		
		// 事業者契約管理番号
		setOutData(inMap, EKK2441D010CBSMsg.KDDI_JGS_KEI_KANRI_NO, template, "kddi_jgs_kei_kanri_no");
		// 契約新規申込ワークエリアへ登録
		JKKBpCommon.setWkJigyoshaKeiKnriNo(param, template.getString(EKK2441D010CBSMsg.KDDI_JGS_KEI_KANRI_NO));

		// エラー情報の設定
		editErrInfoEKK2441D010(param, template, (Integer)returnCode, fixedText);

		// エラー情報のマップを取得
		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 iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK2441D010(
			IRequestParameterReadWrite iparam,
			CAANMsg template,
			int returnCode,
			String fixedText) throws RequestParameterException
	{
		CAANMsg[] templateArray = null;
		ArrayList inList = null;

		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK2441D010CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap<String, Object>)param.getData(fixedText);

		// バリューコード
		setErrInfo(inMap, "kddi_val_cd_err", template, EKK2441D010CBSMsg.KDDI_VAL_CD_ERR);
		
		// 申込明細番号
		setErrInfo(inMap, "mskm_dtl_no_err", template, EKK2441D010CBSMsg.MSKM_DTL_NO_ERR);

		inList = (ArrayList)inMap.get("EKK2441D010CBSMsg1List");
		templateArray = template.getCAANMsgList(EKK2441D010CBSMsg.EKK2441D010CBSMSG1LIST);
		
		if (templateArray != null)
		{
			for (int i = 0; i < templateArray.length; i++)
			{
				HashMap childMap = (HashMap)inList.get(i);
				CAANMsg childTemplate = templateArray[i];

				// 他事業者割引契約申込登録マップ.他事業者割引契約申込登録明細.サービス契約番号（ＫＫ２４５１） 
				//		→ 他事業者割引契約申込登録明細.サービス契約番号（ＫＫ２４５１） のエラー情報返却
				if (!childTemplate.isNull(EKK2441D010CBSMsg1List.SVC_KEI_NO_KK2451_ERR))
				{
					if (!childMap.containsKey("svc_kei_no_kk2451_err"))
					{
						childMap.put("svc_kei_no_kk2451_err", childTemplate.getString(EKK2441D010CBSMsg1List.SVC_KEI_NO_KK2451_ERR));
					}
				}
			}
		}
		
		if (!template.isNull(EKK2441D010CBSMsg.EKK2441D010CBSMSG1LIST_ERR))
		{
			if (!inMap.containsKey("EKK2441D010CBSMsg1List_err"))
			{
				inMap.put("EKK2441D010CBSMsg1List_err", template.getString(EKK2441D010CBSMsg.EKK2441D010CBSMSG1LIST_ERR));
			}
		}

		return param;
	}

	/**
	 * 他事業者割引契約申込変更の上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param      リクエストパラメータ
	 * @param fixedText  サービスメッセージ
	 * @param prefix     プレフィックス
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK2441C020(
			IRequestParameterReadWrite param,
			String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK2441C020CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK2441C020CBSMsg.TEMPLATEID, "EKK2441C020");

		// 機能コード（デフォルト：１）
		template.set(EKK2441C020CBSMsg.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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機能コード
		template.set(EKK2441C020CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// ＫＤＤＩバリューコード
		setTemplate(param, template, EKK2441C020CBSMsg.KDDI_VAL_CD, inMap, "kddi_val_cd_dsp");
		
		// 他事業者割引契約番号
		setTemplate(param, template, EKK2441C020CBSMsg.TAJGS_WRIB_KEI_NO, inMap, "upd_tajgs_wrib_kei_no");

		// 更新年月日時分秒（更新前）
		setTemplate(param, template, EKK2441C020CBSMsg.UPD_DTM_BF, inMap, "upd_dtm_bf");
		
		// 他事業者通知抑止有無
		template.set(EKK2441C020CBSMsg.TAJGS_TCH_YOKSI_UM, "0");

		return template;
	}

	/**
	 * 他事業者割引契約申込変更の下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK2441C020(
			Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			String fixedText) 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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// 他事業者割引契約番号
		inMap.put(EKK2441C020CBSMsg.TAJGS_WRIB_KEI_NO, template.getString("tajgs_wrib_kei_no"));

		// エラー情報の設定
		editErrInfoEKK2441C020(param, template, (Integer)returnCode, fixedText);

		// エラー情報のマップを取得
		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 iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK2441C020(IRequestParameterReadWrite iparam, CAANMsg template,
			int returnCode, String fixedText) throws RequestParameterException
	{
		
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK2441C020CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap<String, Object>)param.getData(fixedText);

		// バリューコード
		 setErrInfo(inMap, "kddi_val_cd_err", template, EKK2441C020CBSMsg.KDDI_VAL_CD_ERR);

		// 他事業者割引契約番号
		 setErrInfo(inMap, "tajgs_wrib_kei_no_err", template, EKK2441C020CBSMsg.TAJGS_WRIB_KEI_NO_ERR);
		
		// 更新年月日時分秒（更新前）
		 setErrInfo(inMap, "upd_dtm_bf_err", template, EKK2441C020CBSMsg.UPD_DTM_BF_ERR);
		
		return param;
	}
	
	/**
	 * 他事業者割引契約申込キャンセルの上りマッピング処理を行います。
	 * 
	 * <br>
	 * @param param      リクエストパラメータ
	 * @param fixedText  サービスメッセージ
	 * @param prefix     プレフィックス
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK2441C030(
			IRequestParameterReadWrite param,
			String fixedText) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK2441C030CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK2441C030CBSMsg.TEMPLATEID, "EKK2441C030");

		// 機能コード（デフォルト：１）
		template.set(EKK2441C030CBSMsg.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);

		// マッピング情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 機能コード
		template.set(EKK2441C030CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));

		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// 他事業者割引契約番号
		setTemplate(param, template, EKK2441C030CBSMsg.TAJGS_WRIB_KEI_NO, inMap, "del_tajgs_wrib_kei_no");
		
		// 更新年月日時分秒（更新前）
		setTemplate(param, template, EKK2441C030CBSMsg.UPD_DTM_BF, inMap, "upd_dtm_bf");
		
		return template;
	}

	/**
	 * 他事業者割引契約申込キャンセルの下りマッピング処理
	 * <br>
	 * @param msgList
	 * @param param
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editRetEKK2441C030(
			Map<?, ?> msgList,
			IRequestParameterReadWrite param,
			String fixedText) 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 (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		/* 作業項目情報 */
		HashMap tajgsWribKeiWorkMap = (HashMap)workMap.get(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI);
		if (tajgsWribKeiWorkMap == null)
		{
			tajgsWribKeiWorkMap = new HashMap();
			workMap.put(CC_WORK_AREA_APLY_TAJGS_WRIB_KEI, tajgsWribKeiWorkMap);
		}
		
		// エラー情報の設定
		editErrInfoEKK2441C030(param, template, (Integer)returnCode, fixedText);

		// エラー情報のマップを取得
		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 iparam
	 * @param template
	 * @param returnCode
	 * @param fixedText
	 * @param prefix
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrInfoEKK2441C030(
			IRequestParameterReadWrite iparam,
			CAANMsg template,
			int returnCode,
			String fixedText) throws RequestParameterException
	{
		
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK2441C030CBSMsg.STATUS), returnCode);

		HashMap inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 他事業者割引契約番号
		 setErrInfo(inMap, "tajgs_wrib_kei_no_err", template, EKK2441C030CBSMsg.TAJGS_WRIB_KEI_NO_ERR);

		// 更新年月日時分秒（更新前）
		 setErrInfo(inMap, "upd_dtm_bf_err", template, EKK2441C030CBSMsg.UPD_DTM_BF_ERR);
		
		return param;
	}
	
	/**
	 * CAANMsgに値を設定します。<br>
	 *  @inMap内にデータが存在する場合、inMap内のデータを設定します。<br>
	 *  A上記以外の場合、setNullを呼び出します。<br>
	 * @param param IRequestParameterReadWrite
	 * @param template 値を設定するメッセージキャリア
	 * @param setKey 設定先メッセージキャリアのキー名
	 * @param inMap ユーザデータ情報
	 * @param prefix ユーザデータ情報より取得する場合に付加するプレフィックス
	 * @param getKey ユーザデータ情報より取得するキー名
	 */
	private void setTemplate(
			IRequestParameterReadWrite param,
			CAANMsg template,
			String setKey,
			HashMap<String, Object> inMap,
			String getKey)
	{
		
		if (null == inMap || null == inMap.get(getKey) || 0 == ((String)inMap.get(getKey)).length())
		{
			template.setNull(setKey);
		}
		else
		{
			template.set(setKey, (String)inMap.get(getKey));
		}
	}

	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　※CAANMsg内のデータがNullの場合、空文字を設定します。<br>
	 * @param dataMap ユーザデータ情報
	 * @param setKey ユーザデータ情報に設定するキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアより取得するキー名
	 */
	private void setOutData(HashMap<String, Object> dataMap, String setKey, CAANMsg template, String getKey)
	{
		if (template.isNull(getKey))
		{
			dataMap.put(setKey, "");
		}
		else
		{
			dataMap.put(setKey, template.getString(getKey));
		}
	}

	/**
	 * 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;
	}

	/**
	 * 単一CAANMsgのマッピング処理を行います。
	 * <br>
	 * @param paramMap
	 * @param template
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> putParamMap(HashMap<String, Object> paramMap, CAANMsg template) throws RequestParameterException
	{
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * コントロールマップエラー情報格納処理を行います。
	 * <br>
	 * @param param
	 * @param itemplateStatus
	 * @param returnCode
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite setControlMapErrInfo(IRequestParameterReadWrite param, int itemplateStatus, int returnCode)
			throws RequestParameterException
	{
		int templateStatus = itemplateStatus;

		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, 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)
		{
			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);
		}
		return param;
	}

	/**
	 * ユーザデータ情報にエラー情報を設定します。<br>
	 * 　※ユーザデータ情報内にすでにキーが存在する場合、値は設定されません。<br>
	 * @param inMap	 ユーザデータ情報
	 * @param setKey ユーザデータ情報に設定するキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアより取得するキー名
	 */
	private void setErrInfo(HashMap<String, Object> inMap, String setKey, CAANMsg template, String getKey)
	{
		if (!template.isNull(getKey))
		{
			if (!inMap.containsKey(setKey))
			{
				inMap.put(setKey, template.getString(getKey));
			}
		}
	}

	
	/**
	 * SCの実行ステータスの取得処理を行います。
	 * <br>
	 * @param param
	 * @return SCの実行ステータス
	 * @throws Exception
	 */
	private int getReturnCode(IRequestParameterReadWrite param) throws Exception
	{
		return Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
	}
}
