/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKHoseiTaMskmCC
*   ソースファイル名：JKKHoseiTaMskmCC.java
*   作成者          ：富士通
*   日付            ：2013年01月18日
*＜機能概要＞
*   他申込補正コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/01/18   FJ)松田     【KAD-2012-0001108】書面での受付番号の申込イメージの紐付けについて
*
**********************************************************************/
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.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK2201A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2201A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2201C010CBSMsg;

/**
 * 他申込補正CC
 * <br>
 * @author 富士通
 */
public class JKKHoseiTaMskmCC extends AbstractCommonComponent
{
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー用 */
	private static final String SC_ERROR_STRING = "サービスコンポーネントエラー";
	///** 作業マップ名 */
	//private static final String CC_WORK_AREA_NAME = "JKKHoseiTaMskmCCWork";
	/** 作業マップ名(利用場所CC) */
	private static final String USE_PLACE_WORK_AREA_NAME = "JKKUpdUsePlaceInfoCCWork";

	/** サービスインターフェイスのエラー項目名を判定する正規表現 */
	private static final String ERR_COLUMN_PATTERN = ".+_err$";

	/**
	 * 補正処理を行います。
	 * <br>
	 * @param handle
	 * @param param リクエストパラメータ
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite hosei(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);
		
		if (inMap == null)
		{
			return param;
		}
		
		//****************************************************************
		//** 実行判定
		//****************************************************************
		ArrayList<HashMap<String, Object>> taMskmList = getTaMskm(param, fixedText);
		if (taMskmList == null || taMskmList.size() < 1)
		{
			return param;
		}
		
		for (HashMap<String, Object> taMskmMap : taMskmList)
		{
			//****************************************************************
			//** 申込画面入力支援ワーク一意照会
			//****************************************************************
			template = editInEKK2201A010(param, fixedText, taMskmMap); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			HashMap<String, Object> taMskmInsprtWkMap = editRetEKK2201A010(result, param, fixedText); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{
				// ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
			
			//****************************************************************
			//** 実行判定
			//****************************************************************
			if (taMskmInsprtWkMap == null || !JKKStrConst.PROCESSED.equals(taMskmInsprtWkMap.get("area_chk_ctl_cd")))
			{
				continue;
			}
			
			//****************************************************************
			//** 申込画面入力支援ワーク更新
			//****************************************************************
			template = editInEKK2201C010(param, fixedText, taMskmInsprtWkMap); // 上りマッピング
			result = scCall.run(putParamMap(paramMap, template), handle); // SC呼び出し
			editRetEKK2201C010(result, param, fixedText); // 下りマッピング
			if (getReturnCode(param) >= JPCModelConstant.SINGLEDATA_ERR)
			{
				// ステータスが単項目エラー以上であれば例外をスロー
				throw new CCException(SC_ERROR_STRING, new Exception());
			}
		}
		
		return param;
	}
	
	/**
	 * 同一回線の他申込情報を取得します。
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 他申込情報のリスト
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getTaMskm(IRequestParameterReadWrite param, String fixedText)
		throws Exception
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		if (inMap == null)
		{
			return null;
		}
		
		Map<Object, Object> workArea = param.getMappingWorkArea();
		if (workArea == null)
		{
			return null;
		}
		
		HashMap<String, Object> workMap = (HashMap<String, Object>)workArea.get(USE_PLACE_WORK_AREA_NAME);
		if (workMap == null)
		{
			return null;
		}
		
		ArrayList<HashMap<String, Object>> svcKeiList = (ArrayList<HashMap<String, Object>>)workMap.get("svc_kei_list");
		if (svcKeiList == null)
		{
			return null;
		}
		
		String jimskmNo = (String)inMap.get("jimskm_no");
		if (JKKCommonUtil.isNull(jimskmNo))
		{
			// 画面から申込番号が渡されていない場合は、CCで登録した申込番号を取得する。
			jimskmNo = JKKBpCommon.getWkMskmNo(param);
		}
		
		ArrayList<HashMap<String, Object>> taMskmList = new ArrayList<HashMap<String, Object>>();
		for (HashMap<String, Object> svcKeiMap : svcKeiList)
		{
			String mskmNo = (String)svcKeiMap.get("mskm_no");
			
			if (jimskmNo.equals(mskmNo))
			{
				continue;
			}
			
			String svcKeiStat = (String)svcKeiMap.get("svc_kei_stat");
			String prcGrpCd = (String)svcKeiMap.get("prc_grp_cd");
			boolean isTarget = JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat)
								&& (JKKCtrlyUtil.getNetSvcJdg(prcGrpCd)
								|| JKKCtrlyUtil.getTelSvcJdg(prcGrpCd)
								|| JKKCtrlyUtil.getTvSvcJdg(prcGrpCd));
			if (isTarget)
			{
				taMskmList.add(svcKeiMap);
			}
		}
		
		return taMskmList;
	}

	/**
	 * 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
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
		throws RequestParameterException
	{
		// このCCは先行CCの作業領域からINPUT項目を取得し実行するものだが、
		// getInvokeCBSでは実際のデータ取得までは行わないため、DBの値が
		// 作業領域に格納されることはない。
		// よって、作業領域からINPUT項目を取得できず、CCが実行されることはない。
		// (実行する必要がないのでマッピング処理を行わない)
		
		HashMap<String, Object> param4BpChek = new HashMap<String, Object>();
		param4BpChek.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{});
		return param4BpChek;
	}

	/**
	 * エラー情報のマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param templates CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
			throws RequestParameterException
	{
		// getInvokeCBSでのエラーチェックが不要であるため
		// 対応するエラー情報のマッピング処理も不要。
		return param;
	}

	/**
	 * 単一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 = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}

	/**
	 * 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 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;
	}

	/**
	 * CAANMsgに値を設定します。<br>
	 *  @inMap内にデータが存在する場合、inMap内のデータを設定します。<br>
	 *  A上記以外の場合、setNullを呼び出します。<br>
	 * @param template 値を設定するメッセージキャリア
	 * @param setKey 設定先メッセージキャリアのキー名
	 * @param inMap ユーザデータ情報
	 * @param prefix ユーザデータ情報より取得する場合に付加するプレフィックス
	 * @param getKey ユーザデータ情報より取得するキー名
	 */
	private void setTemplate(CAANMsg template, String setKey, HashMap<String, Object> inMap, String prefix, String getKey)
	{
		
		if (null == inMap || null == inMap.get(prefix + getKey) || 0 == ((String)inMap.get(prefix + getKey)).length())
		{
			template.setNull(setKey);
		}
		else
		{
			template.set(setKey, (String)inMap.get(prefix + getKey));
		}
	}
	
	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　※CAANMsg内のデータがNullの場合、空文字を設定します。<br>
	 * @param dataMap ユーザデータ情報
	 * @param prefix ユーザデータ情報より取得する場合に付加するプレフィックス
	 * @param getSetKey ユーザデータ情報に設定するキー名
	 * @param template メッセージキャリア
	 */
	private void setDataMap(HashMap<String, Object> dataMap, String prefix, String getSetKey, CAANMsg template)
	{
		setDataMap(dataMap, prefix, getSetKey, template, getSetKey);
	}
	
	/**
	 * ユーザデータ情報に値を設定します。<br>
	 * 　@CAANMsgにデータが存在する場合、CAANMsgのデータを設定します。<br>
	 * 　A上記以外の場合、空文字を設定します。<br>
	 * @param dataMap 値を設定するユーザデータ情報
	 * @param prefix ユーザデータ情報に設定する際に付加するプレフィックス
	 * @param setKey ユーザデータ情報のキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアのキー名
	 */
	private void setDataMap(HashMap<String, Object> dataMap, String prefix, String setKey, CAANMsg template, String getKey)
	{
		if (template.isNull(getKey))
		{
			dataMap.put(prefix + setKey, "");
		}
		else
		{
			dataMap.put(prefix + setKey, template.getString(getKey));
		}
	}
	
	/**
	 * エラー情報を設定します。<br>
	 * @param inMap ユーザデータ情報
	 * @param prefix ユーザデータ情報に設定する際に付加するプレフィックス
	 * @param setKey ユーザデータ情報のキー名
	 * @param template メッセージキャリア
	 * @param getKey メッセージキャリアのキー名
	 */
	private void setErrInfo(HashMap<String, Object> inMap, String prefix, String setKey, CAANMsg template, String getKey)
	{
		if (!template.isNull(getKey))
		{
			if (!inMap.containsKey(prefix + setKey))
			{
				inMap.put(prefix + setKey, template.getString(getKey));
			}
		}
	}

	/**
	 * 申込画面入力支援ワーク一意照会の上りマッピング処理を行います。
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param taMskmMap 他申込情報マップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInEKK2201A010(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> taMskmMap)
		throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK2201A010CBSMsg.class.getName());
		
		// テンプレートID
		template.set(EKK2201A010CBSMsg.TEMPLATEID, "EKK2201A010");
		
		// 機能コード（固定：１）
		template.set(EKK2201A010CBSMsg.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);
		
		// 申込番号
		setTemplate(template, EKK2201A010CBSMsg.KEY_MSKM_NO, taMskmMap, "", "mskm_no");
		
		return template;
	}

	/**
	 * 申込画面入力支援ワーク一意照会の下りマッピング処理を行います。
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 照会結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> editRetEKK2201A010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText)
		throws Exception
	{
		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> taMskmInsprtWkMap = new HashMap<String, Object>();
		
		//
		// 一意照会の出力項目をすべて taMskmInsprtWkMap にマッピングする。
		//
		CAANMsg[] templateArray = template.getCAANMsgList(EKK2201A010CBSMsg.EKK2201A010CBSMSG1LIST);
		if (templateArray != null &&  templateArray.length > 0)
		{
			CAANMsg childTemplate = templateArray[0];
			EKK2201A010CBSMsg1List msgLst = new EKK2201A010CBSMsg1List();
			for (int i = 0; i < msgLst.getContents().length; i++)
			{
				String columnName = (String)msgLst.getContents()[i][0];
				setDataMap(taMskmInsprtWkMap, "", columnName, childTemplate);
			}
		}
		
		// エラー情報の設定
		editErrInfoEKK2201A010(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 taMskmInsprtWkMap;
	}
	
	/**
	 * 申込画面入力支援ワーク一意照会のエラー情報マッピング処理を行います。
	 * @param iparam リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void editErrInfoEKK2201A010(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
		throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK2201A010CBSMsg.STATUS), returnCode);
		
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 末尾が "_err" の項目にエラーが発生している場合はリクエストパラメータにマッピングする。
		EKK2201A010CBSMsg cbsMsg = new EKK2201A010CBSMsg();
		for (int i = 0; i < cbsMsg.getContents().length; i++)
		{
			String columnName = (String)cbsMsg.getContents()[i][0];
			if (!columnName.matches(ERR_COLUMN_PATTERN))
			{
				continue;
			}
			
			setErrInfo(inMap, "", columnName, template, columnName);
		}
	}

	/**
	 * 申込画面入力支援ワーク更新の上りマッピング処理を行います。
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param taMskmInsprtWkMap 他申込の入力支援ワークの照会マップ
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg editInEKK2201C010(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> taMskmInsprtWkMap)
		throws RequestParameterException
	{
			CAANMsg template = new CAANMsg(EKK2201C010CBSMsg.class.getName());

			// テンプレートID
			template.set(EKK2201C010CBSMsg.TEMPLATEID, "EKK2201C010");

			// 機能コード（デフォルト：１）
			template.set(EKK2201C010CBSMsg.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);

			// 機能コード
			if (inMap != null)
			{
				template.set(EKK2201C010CBSMsg.FUNC_CODE, inMap.get(JCMConstants.FUNC_CODE_KEY));
			}
			
			// 申込番号
			setTemplate(template, EKK2201C010CBSMsg.MSKM_NO, taMskmInsprtWkMap, "", "mskm_no");
			// 追加元サービス契約番号
			setTemplate(template, EKK2201C010CBSMsg.ADD_MOTO_SVC_KEI_NO, taMskmInsprtWkMap, "", "add_moto_svc_kei_no");
			// eo光ネットエリアチェック結果有無
			setTemplate(template, EKK2201C010CBSMsg.EOHNT_AREA_CKRLT_UM, taMskmInsprtWkMap, "", "eohnt_area_ckrlt_um");
			// eo光電話エリアチェック結果有無
			setTemplate(template, EKK2201C010CBSMsg.EOHTL_AREA_CKRLT_UM, taMskmInsprtWkMap, "", "eohtl_area_ckrlt_um");
			// eo光テレビエリアチェック結果有無
			setTemplate(template, EKK2201C010CBSMsg.EOHTV_AREA_CKRLT_UM, taMskmInsprtWkMap, "", "eohtv_area_ckrlt_um");
			// eo光ネットエリアチェック結果詳細コード
			setTemplate(template, EKK2201C010CBSMsg.EOHNT_AREA_CKRLT_DTAIL_CD, taMskmInsprtWkMap, "", "eohnt_area_ckrlt_dtail_cd");
			// eo光テレビエリアチェック結果詳細コード
			setTemplate(template, EKK2201C010CBSMsg.EOHTV_AREA_CKRLT_DTAIL_CD, taMskmInsprtWkMap, "", "eohtv_area_ckrlt_dtail_cd");
			// 回線場所_契約者住所差異フラグ
			setTemplate(template, EKK2201C010CBSMsg.KAISEN_PLC_KSH_AD_SAI_FLG, taMskmInsprtWkMap, "", "kaisen_plc_ksh_ad_sai_flg");
			// 申込優先連絡先識別コード
			setTemplate(template, EKK2201C010CBSMsg.MKM_YUSEN_RRKS_SKBT_CD, taMskmInsprtWkMap, "", "mkm_yusen_rrks_skbt_cd");
			// 機器送付先住所識別コード
			setTemplate(template, EKK2201C010CBSMsg.KIKI_SHS_AD_SKBT_CD, taMskmInsprtWkMap, "", "kiki_shs_ad_skbt_cd");
			// 請求書送付先名_お客様名差異フラグ
			setTemplate(template, EKK2201C010CBSMsg.SKS_SHS_NM_CUST_NM_SAI_FLG, taMskmInsprtWkMap, "", "sks_shs_nm_cust_nm_sai_flg");
			// 請求書送付先住所識別コード
			setTemplate(template, EKK2201C010CBSMsg.SKS_SHS_AD_SKBT_CD, taMskmInsprtWkMap, "", "sks_shs_ad_skbt_cd");
			// NTT契約者住所識別コード1
			setTemplate(template, EKK2201C010CBSMsg.NTT_KSHAD_SKBT_CD_1, taMskmInsprtWkMap, "", "ntt_kshad_skbt_cd_1");
			// NTT契約者名_契約者名差異フラグ1
			setTemplate(template, EKK2201C010CBSMsg.NKYS_NM_KSH_NM_SAI_FLG_1, taMskmInsprtWkMap, "", "nkys_nm_ksh_nm_sai_flg_1");
			// 緊急通報用契約者名_契約者名差異フラグ1
			setTemplate(template, EKK2201C010CBSMsg.EMGKSH_NM_KSH_NM_SAI_FLG_1, taMskmInsprtWkMap, "", "emgksh_nm_ksh_nm_sai_flg_1");
			// NTT契約者住所識別コード2
			setTemplate(template, EKK2201C010CBSMsg.NTT_KSHAD_SKBT_CD_2, taMskmInsprtWkMap, "", "ntt_kshad_skbt_cd_2");
			// NTT契約者名_契約者名差異フラグ2
			setTemplate(template, EKK2201C010CBSMsg.NKYS_NM_KSH_NM_SAI_FLG_2, taMskmInsprtWkMap, "", "nkys_nm_ksh_nm_sai_flg_2");
			// 緊急通報用契約者名_契約者名差異フラグ2
			setTemplate(template, EKK2201C010CBSMsg.EMGKSH_NM_KSH_NM_SAI_FLG_2, taMskmInsprtWkMap, "", "emgksh_nm_ksh_nm_sai_flg_2");
			// モバイル機器送付先住所識別コード
			setTemplate(template, EKK2201C010CBSMsg.MBL_KIKI_SHS_AD_SKBT_CD, taMskmInsprtWkMap, "", "mbl_kiki_shs_ad_skbt_cd");
			// 契約者情報タブ制御コード
			setTemplate(template, EKK2201C010CBSMsg.KSH_IF_TAB_CTL_CD, taMskmInsprtWkMap, "", "ksh_if_tab_ctl_cd");
			// 支払方法タブ制御コード
			setTemplate(template, EKK2201C010CBSMsg.PAY_WAY_TAB_CTL_CD, taMskmInsprtWkMap, "", "pay_way_tab_ctl_cd");
			// ネットタブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.NET_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "net_tab_op_if_ctl_cd");
			// ネットタブ機器情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.NET_TAB_KIKI_IF_CTL_CD, taMskmInsprtWkMap, "", "net_tab_kiki_if_ctl_cd");
			// 電話1タブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TEL_1_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "tel_1_tab_op_if_ctl_cd");
			// 電話2タブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TEL_2_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "tel_2_tab_op_if_ctl_cd");
			// 電話1タブTDIS情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TEL_1_TAB_TDIS_IF_CTL_CD, taMskmInsprtWkMap, "", "tel_1_tab_tdis_if_ctl_cd");
			// 電話2タブTDIS情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TEL_2_TAB_TDIS_IF_CTL_CD, taMskmInsprtWkMap, "", "tel_2_tab_tdis_if_ctl_cd");
			// 電話タブ機器情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TEL_TAB_KIKI_IF_CTL_CD, taMskmInsprtWkMap, "", "tel_tab_kiki_if_ctl_cd");
			// モバイルタブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.MBL_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "mbl_tab_op_if_ctl_cd");
			// モバイルタブ機器情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.MBL_TAB_KIKI_IF_CTL_CD, taMskmInsprtWkMap, "", "mbl_tab_kiki_if_ctl_cd");
			// ADSLタブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.ADSL_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "adsl_tab_op_if_ctl_cd");
			// TVタブオプション情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TV_TAB_OP_IF_CTL_CD, taMskmInsprtWkMap, "", "tv_tab_op_if_ctl_cd");
			// TVタブ機器情報制御コード
			setTemplate(template, EKK2201C010CBSMsg.TV_TAB_KIKI_IF_CTL_CD, taMskmInsprtWkMap, "", "tv_tab_kiki_if_ctl_cd");
			
			
			// エリアチェック制御コード
			template.set(EKK2201C010CBSMsg.AREA_CHK_CTL_CD, JKKStrConst.UNPROCESSED);
			
			
			// 不良顧客チェック制御コード
			setTemplate(template, EKK2201C010CBSMsg.HURYO_CUST_CHK_CTL_CD, taMskmInsprtWkMap, "", "huryo_cust_chk_ctl_cd");
			// 更新前最終更新年月日時分秒
			setTemplate(template, EKK2201C010CBSMsg.LAST_UPD_DTM_BF, taMskmInsprtWkMap, "", "upd_dtm");
			// 請求契約カナ名_お客様カナ名差異フラグ
			setTemplate(template, EKK2201C010CBSMsg.SIKYKEIKN_CUSTKN_SAI_FLG, taMskmInsprtWkMap, "", "sikykeikn_custkn_sai_flg");
			
			return template;
	}

	/**
	 * 申込画面入力支援ワーク更新の下りマッピング処理を行います。
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void editRetEKK2201C010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText)
		throws Exception
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		
		Object returnCode = msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// SIFの出力項目はマッピング不要。エラー情報のみマッピングする。
		
		// エラー情報の設定
		editErrInfoEKK2201C010(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));
	}

	/**
	 * 申込画面入力支援ワーク更新のエラー情報マッピング処理を行います。
	 * @param iparam リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private void editErrInfoEKK2201C010(IRequestParameterReadWrite iparam, CAANMsg template, int returnCode, String fixedText)
		throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, template.getInt(EKK2201C010CBSMsg.STATUS), returnCode);
		
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 末尾が "_err" の項目にエラーが発生している場合はリクエストパラメータにマッピングする。
		EKK2201C010CBSMsg cbsMsg = new EKK2201C010CBSMsg();
		for (int i = 0; i < cbsMsg.getContents().length; i++)
		{
			String columnName = (String)cbsMsg.getContents()[i][0];
			if (!columnName.matches(ERR_COLUMN_PATTERN))
			{
				continue;
			}
			setErrInfo(inMap, "", columnName, template, columnName);
		}
	}
}
