/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUeoTelOpTransferCC
*   ソースファイル名：JFUeoTelOpTransferCC.java
*   作成者          ：富士通
*   日付            ：2011年12月05日
*＜機能概要＞
*   サービスIFの結果データを移送するコモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/05   FJ）北島    新規作成
*   v4.00.00    2012/06/26   FJ）中谷   【ANK-1163-00-00】変更系申込が可能となるタイミングについて
*   v4.00.00    2012/06/26   FJ）美濃原 【ANK-1163-00-00】変更系申込が可能となるタイミングについて
*   v4.00.00    2012/09/29   FJ）美濃原 【ANK-1163-00-00】変更系申込が可能となるタイミングについて(回復処理)
*   v3.00.00    2012/11/08   FJ）山名   【ST2-2012-0001864】SOD設定パラメータ修正
*  v12.00.00    2015/02/18   FJ) 西川   【OM-2015-0000342】機器の件数分オーダ発行CCに連携している不具合
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;

/**
 * サービスIF結果データ移送コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUeoTelOpTransferCC extends JFUBaseCC
{

	/** マップキー hakkoSODMap */
	private static final String MAPKEY_HAKKO_SOD_MAP = "hakkoSODMap";

	/** マップキー FUSV0032WORK01 */
	private static final String MAPKEY_FUSV0032WORK01 = "FUSV0032WORK01";

	/** マップキー FUSV0033WORK01 */
	private static final String MAPKEY_FUSV0033WORK01 = "FUSV0033WORK01";

	/** マップキー FUSV0034WORK01 */
	private static final String MAPKEY_FUSV0034WORK01 = "FUSV0034WORK01";

	/** マップキー FUSV003204SC */
	private static final String MAPKEY_FUSV003204SC = "FUSV003204SC";

	/** マップキー FUSV003205SC */
	private static final String MAPKEY_FUSV003205SC = "FUSV003205SC";

	/** マップキー FUSV003206SC */
	private static final String MAPKEY_FUSV003206SC = "FUSV003206SC";

	/** マップキー FUSV003207SC */
	private static final String MAPKEY_FUSV003207SC = "FUSV003207SC";

	/** マップキー FUSV003208SC */
	private static final String MAPKEY_FUSV003208SC = "FUSV003208SC";

	/** マップキー FUSV003209SC */
	private static final String MAPKEY_FUSV003209SC = "FUSV003209SC";

	/** マップキー FUSV003303SC */
	private static final String MAPKEY_FUSV003303SC = "FUSV003303SC";

	/** マップキー FUSV003305SC */
	private static final String MAPKEY_FUSV003305SC = "FUSV003305SC";

	/** マップキー FUSV003309SC */
	private static final String MAPKEY_FUSV003309SC = "FUSV003309SC";

	/** マップキー FUSV003310SC */
	private static final String MAPKEY_FUSV003310SC = "FUSV003310SC";

	/** マップキー kaihkOpsvckeiMap */
	private static final String MAP_KEY_KAIHK_OPSVCKEI = "kaihkOpsvckeiMap";

	/** マップキー FUSV003212SC */
	private static final String MAPKEY_FUSV003212SC = "FUSV003212SC";

	/** マップキー FUSV003213SC */
	private static final String MAPKEY_FUSV003213SC = "FUSV003213SC";

	/** マップキー 対象データリスト */
	private static final String MAPKEY_TRGT_DATA_LIST = "trgt_data_list";

	/** マップキー オプションサービス契約情報 */
	private static final String MAPKEY_OPSVKEI_INFO = "opsvkei_info";

	/** マップキー オプションサービス契約番号 */
	private static final String MAPKEY_OP_SVC_KEI_NO = "op_svc_kei_no";

	/** マップキー サービス契約内訳情報 */
	private static final String MAPKEY_SVC_KEI_UCWK_INFO = "svc_kei_ucwk_info";

	/** マップキー 機器提供サービス契約情報 */
	private static final String MAPKEY_KKTSVKEI_INFO = "kktsvkei_info";

	/** マップキー 変更前オプションサービス契約番号 */
	private static final String MAPKEY_CHBF_OPSVKEI_NO = "chbf_opsvkei_no";

	/** マップキー 変更後オプションサービス契約番号 */
	private static final String MAPKEY_CHAF_OPSVKEI_NO = "chaf_opsvkei_no";

	/** マップキー オプション処理フラグ */
	private static final String MAPKEY_OP_TRAN_FLG = "op_tran_flg";
	
	/** マップキー サブオプションサービス契約番号 */
	private static final String MAPKEY_SBOP_SVC_KEI_NO = "sbop_svc_kei_no";

	/** マップキー サブオプション処理フラグ */
	private static final String MAPKEY_SBOP_TRAN_FLG = "sbop_tran_flg";

	/** マップキー 変更前サブオプションサービス契約番号 */
	private static final String MAPKEY_CHBF_SBOPSVKEI_NO = "chbf_sbopsvkei_no";

	/** マップキー 変更後サブオプションサービス契約番号 */
	private static final String MAPKEY_CHAF_SBOPSVKEI_NO = "chaf_sbopsvkei_no";

	/** マップキー 世代登録年月日時分秒 */
	private static final String MAPKEY_GENE_ADD_DTM = "gene_add_dtm";

	/** マップキー 世代登録年月日時分秒（オプションサービス契約） */
	private static final String MAPKEY_KK0351_GENE_ADD_DTM = "kk0351_gene_add_dtm";

	/** マップキー 世代登録年月日時分秒（サブオプションサービス契約） */
	private static final String MAPKEY_KK0401_GENE_ADD_DTM = "kk0401_gene_add_dtm";

	/** マップキー 変更前世代登録年月日時分秒（オプションサービス契約） */
	private static final String MAPKEY_CHBF_OSK_GENE_ADD_DTM = "chbf_opsvkei_gene_add_dtm";

	/** マップキー 変更後世代登録年月日時分秒（オプションサービス契約） */
	private static final String MAPKEY_CHAF_OSK_GENE_ADD_DTM = "chaf_opsvkei_gene_add_dtm";

	/** マップキー 変更後世代登録年月日時分秒（サブオプションサービス契約） */
	private static final String MAPKEY_CHAF_SOSK_GENE_ADD_DTM = "chaf_sbopsvkei_gene_add_dtm";

	/** マップキー 回復CC 変更後世代登録年月日時分秒（オプションサービス契約） */
	private static final String KHK_CHGAF_GENE_ADD_DTM = "chgaf_gene_add_dtm";

	/** マップキー 回復CC 変更後世代登録年月日時分秒 (サブオプションサービス契約)*/
	private static final String KHK_CHGAF_SBOP_GENE_ADD_DTM = "chgaf_sbop_gene_add_dtm";

	/** マップキー 回復CC サブオプションサービス契約番号情報リスト */
	private static final String SBOP_SVC_KEI_INFO_LIST = "sbop_svc_kei_info_list";

	/** サービス契約内訳番号 */
	private static final String SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";

	/** 変更後機器提供サービス契約番号 */
	private static final String CHAF_KKTSVKEI_NO = "chaf_kktsvkei_no";

	/** 処理区分 申込 */
	private static final String TRAN_KBN_MSKM = "0";

	/** 処理区分 解約 */
	private static final String TRAN_KBN_DSL = "1";

	/** 処理区分 回復 */
	private static final String TRAN_KBN_KAIHK = "2";

	/* ■□ EKK0191A010_サービス契約内訳<eo光電話>一意照会SC ■□ */
	/** テンプレートID(サービス契約内訳<eo光電話>一意照会) */
	private static final String TEMP_ID_EKK0191A010 = "EKK0191A010";
	/** テンプレートID(サービス契約内訳<eo光電話>一意照会明細) */
	private static final String TEMP_ID_DTL_EKK0191A010 = EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST;
	/** IN項目リスト(サービス契約内訳<eo光電話>一意照会) */
	private static final List<String> IN_COL_LIST_EKK0191A010 = Arrays.asList(EKK0191A010CBSMsg.KEY_SVC_KEI_UCWK_NO);
	/** 関連チェック,エラー項目(サービス契約内訳<eo光電話>一意照会) */
	private static final String ERR_COL_EKK0191A010 = EKK0191A010CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR;
	/** SC実行結果取得キー(サービス契約内訳<eo光電話>一意照会) */
	private static final String TEMP_TEMP_KEY_EKK0191A010 = TEMP_TEMPLATE_PRIFIX + TEMP_ID_EKK0191A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 機器提供サービス契約一意照会SC ■□ */
	/** テンプレートID(機器提供サービス契約一意照会) */
	private static final String TEMPLATE_ID_EKK0341A010 = "EKK0341A010";
	/** テンプレートID(機器提供サービス契約一意照会明細) */
	private static final String TEMPLATE_ID_EKK0341A010_DETAIL = EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST;
	/** IN項目リスト(機器提供サービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0341A010 =
			Arrays.asList(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, EKK0341A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(機器提供サービス契約一意照会) */
	private static final String ERROR_COLUMN_EKK0341A010 = EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(機器提供サービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0341A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0341A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/**
	 * チェック処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 電話オプション申込のデータ移送処理をします。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return param 返却データ
	 * @throws Exception
	 */
	public IRequestParameterReadWrite transferBpValueMskm(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// データ移送処理を申込で行う
		transferBpValue(handle, param, TRAN_KBN_MSKM, fixedText);

		return param;
	}

	/**
	 * 電話オプション解約のデータ移送処理をします。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return param 返却データ
	 * @throws Exception
	 */
	public IRequestParameterReadWrite transferBpValueDsl(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// データ移送処理を解約で行う
		transferBpValue(handle, param, TRAN_KBN_DSL, fixedText);

		return param;
	}

	/**
	 * 電話オプション回復のデータ移送処理をします。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return param 返却データ
	 * @throws Exception
	 */
	public IRequestParameterReadWrite transferBpValueKaihk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// データ移送処理を回復で行う
		transferBpValue(handle,param, TRAN_KBN_KAIHK, fixedText);

		return param;
	}

	/**
	 * 電話オプションのデータ移送処理をします。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param tranFlg 処理区分(0:申込 1:解約 2:回復)
	 * @param fixedText サービスメッセージ
	 * @return param 返却データ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite transferBpValue(SessionHandle handle,IRequestParameterReadWrite param, String tranFlg, String fixedText) throws Exception
	{
		// 結果格納マップ
		HashMap resMap = new HashMap();

		// ユーザデータ取得
		HashMap setDataMap = (HashMap)param.getData(MAPKEY_HAKKO_SOD_MAP);
		ArrayList setList = (ArrayList)setDataMap.get(MAPKEY_TRGT_DATA_LIST);
		HashMap inMap = (HashMap)param.getData(fixedText);
		if(inMap == null){
			inMap = new HashMap();
			param.setData(fixedText, inMap);
		}
		ArrayList<HashMap> targetList = new ArrayList<HashMap>();

		// 対象データリスト判定
		if (setList != null)
		{
			// サービス契約内訳のVA機器変更番号と機器提供サービス契約の機器変更番号が同じ場合に
			// オーダ対象として、一致しない場合は、対象外とする。

			Set<String> vaKikiChgNoSet = new HashSet<String>();

			// 対象データリストがある場合のデータ移送処理
			for (int k = 0; k < setList.size(); k++)
			{
				// SODマップを取得する
				HashMap sodMap = (HashMap)setList.get(k);

				// SODマップがある場合のデータ移送処理
				if (sodMap != null)
				{
					// サービス契約内訳情報を取得する。
					HashMap svckeiUcwkInfo = (HashMap)sodMap.get(MAPKEY_SVC_KEI_UCWK_INFO);
					// 機器提供サービス契約情報を取得する。
					HashMap kktSvcKeiInfo = (HashMap)sodMap.get(MAPKEY_KKTSVKEI_INFO);

					// VA機器変更番号
					String vaKikiChgNo = null;
					if (svckeiUcwkInfo != null)
					{
						String svcKeiUcwkNo = (String)svckeiUcwkInfo.get(SVC_KEI_UCWK_NO);

						// ●EKK0191A010_サービス契約内訳<eo光電話>一意照会
						// ユーザデータ初期化
						JFUBPCommon.initData(param, fixedText, IN_COL_LIST_EKK0191A010);
						// 上りマッピング
						setInMapEKK0191A010(param, fixedText, svcKeiUcwkNo);

						// サービスIF実行
						JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK0191A010, TEMP_ID_DTL_EKK0191A010, IN_COL_LIST_EKK0191A010,
								ERR_COL_EKK0191A010);

						// サービス契約内訳情報
						HashMap svcKeiUcwkInfoTelMap =
								JFUBPCommon.getTemplateListMap(inMap, JFUBPCommon.getMaxTempTempleteKey(inMap, TEMP_TEMP_KEY_EKK0191A010),
										TEMP_ID_DTL_EKK0191A010, 0);
						// VA機器変更番号
						vaKikiChgNo = (String)svcKeiUcwkInfoTelMap.get(EKK0191A010CBSMsg1List.VA_KIKI_CHG_NO);

						if (!JFUBPCommon.isNull(vaKikiChgNo))
						{

							if (kktSvcKeiInfo != null)
							{
								// 機器提供サービス契約番号
								String kktkSvcKeiNo = (String)kktSvcKeiInfo.get(CHAF_KKTSVKEI_NO);

								// ●機器提供サービス契約一意照会
								// ユーザデータ初期化
								initData(param, fixedText, IN_COLUMN_LIST_EKK0341A010);
								// 検索エラーなし設定
								ignoreSearchError(param, fixedText);
								// 上りマッピング
								setInMapKktkSvcKeiUqSearch(param, fixedText, kktkSvcKeiNo);
								// サービスIF実行
								executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0341A010, TEMPLATE_ID_EKK0341A010_DETAIL,
										IN_COLUMN_LIST_EKK0341A010, ERROR_COLUMN_EKK0341A010);

								// 機器提供サービス契約情報
								HashMap kktkInfoMap =
										getTemplateListMap(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0341A010),
												TEMPLATE_ID_EKK0341A010_DETAIL, 0);

								// 機器変更番号
								String kikiChgNo = (String)kktkInfoMap.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO);
								if (!vaKikiChgNo.equals(kikiChgNo) || vaKikiChgNoSet.contains(kikiChgNo))
								{
									// サービス契約内訳＜eo光電話＞のVA機器変更番号と機器提供サービス契約と異なる場合はスキップする。
									continue;
								}
								else
								{
									vaKikiChgNoSet.add(kikiChgNo);
								}
								targetList.add(sodMap);
							}
						}
					}
				}
			}

			// 対象データリストがある場合のデータ移送処理
			for (int j = 0; j < targetList.size(); j++)
			{
				// SODマップを取得する
				HashMap sodMap = (HashMap)targetList.get(j);

				// SODマップがある場合のデータ移送処理
				if (sodMap != null)
				{

					// オプションサービス契約情報を取得する
					HashMap opsvkeiInfo = (HashMap)sodMap.get(MAPKEY_OPSVKEI_INFO);
					if (opsvkeiInfo != null)
					{
						// オプションサービス契約情報に処理区分毎の値設定を行う
						sodMap.put(MAPKEY_OPSVKEI_INFO, setData(param, sodMap, tranFlg));
						// 対象データリストにSODマップを設定する
						targetList.set(j, sodMap);
					}

				}
			}
			// ユーザデータに対象データリストを設定する
			setDataMap.put(MAPKEY_TRGT_DATA_LIST, targetList);
		}

		// 移送用のマップに入れる
		resMap.putAll(setDataMap);

		// ユーザデータに設定
		if (resMap.size() != 0)
		{
			// 設定データがある場合のみ設定する
			param.setData(MAPKEY_HAKKO_SOD_MAP, resMap);
		}

		return param;
	}

	/**
	 * オプションサービス契約情報に処理区分毎の値設定を行います。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param sodMap SODマップ
	 * @param tranFlg 処理区分
	 * @return オプションサービス契約情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private HashMap setData(IRequestParameterReadWrite param, HashMap sodMap, String tranFlg) throws Exception
	{
		
		// オプションサービス契約情報を取得する
		HashMap opsvkeiInfo = (HashMap)sodMap.get(MAPKEY_OPSVKEI_INFO);

		// 申込の場合
		if (TRAN_KBN_MSKM.equals(tranFlg))
		{
			if (JFUStrConst.CD00001_1.equals(getData(param, MAPKEY_FUSV0032WORK01, MAPKEY_SBOP_TRAN_FLG)))
			{
				// [サブオプション]
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_OPSVKEI_NO));
				opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, opsvkeiInfo.get(MAPKEY_CHBF_OSK_GENE_ADD_DTM));
				
				//   親のステータスを取得する（オプションサービス契約ステータス）
				String opSvcKeiStat = (String)param.getData(JFUStrConst.KEY_BP_REQ_CHK_SVC_KEI_STAT_RSV1);
				//   登録(サブオプション)
				opsvkeiInfo.put(MAPKEY_CHAF_SBOPSVKEI_NO, getData(param, MAPKEY_FUSV003207SC, MAPKEY_SBOP_SVC_KEI_NO));
				
				//   ステータス＝照査済
				if(JFUStrConst.CD00037_020.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003213SC, MAPKEY_KK0401_GENE_ADD_DTM));	//サブオプション
				}
				//   ステータス＝締結済
				else if(JFUStrConst.CD00037_030.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003208SC, MAPKEY_KK0401_GENE_ADD_DTM));	//サブオプション
				} 
				//   ステータス＝開始
				else if(JFUStrConst.CD00037_100.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003209SC, MAPKEY_KK0401_GENE_ADD_DTM));	//サブオプション
				}
			}
			else
			{
				// [オプション]
				//   親のステータスを取得する（サービス契約内訳ステータス）
				String opSvcKeiStat = (String)param.getData(JFUStrConst.KEY_BP_REQ_CHK_SVC_KEI_STAT);
				//   登録(オプション)
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, getData(param, MAPKEY_FUSV003204SC, MAPKEY_OP_SVC_KEI_NO));
				//   ステータス＝照査済
				if(JFUStrConst.CD00037_020.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003212SC, MAPKEY_KK0351_GENE_ADD_DTM));		//オプション
				}
				//   ステータス＝締結済
				else if(JFUStrConst.CD00037_030.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003205SC, MAPKEY_KK0351_GENE_ADD_DTM));		//オプション
				} 
				//   ステータス＝開始
				else if(JFUStrConst.CD00037_100.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003206SC, MAPKEY_KK0351_GENE_ADD_DTM));		//オプション
				}
			}
		// 解約の場合
		}
		else if (TRAN_KBN_DSL.equals(tranFlg))
		{
			if (JFUStrConst.CD00001_1.equals(getData(param, MAPKEY_FUSV0033WORK01, MAPKEY_SBOP_TRAN_FLG)))
			{
				// [サブオプション]
				//   自分のステータスを取得する（サブオプションサービス契約ステータス）
				String opSvcKeiStat = (String)param.getData(JFUStrConst.KEY_BP_REQ_CHK_SVC_KEI_STAT_RSV1);
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_OPSVKEI_NO));
				opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getOpSvcData(param, opsvkeiInfo));
				opsvkeiInfo.put(MAPKEY_CHAF_SBOPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_SBOPSVKEI_NO));
				
				//   ステータス＝照査済
				if(JFUStrConst.CD00037_020.equals(opSvcKeiStat))
				{
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003309SC, MAPKEY_GENE_ADD_DTM));
				}
				else
				{
				//   ステータス＝締結済、開始
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, getData(param, MAPKEY_FUSV003303SC, MAPKEY_KK0401_GENE_ADD_DTM));
				}
			}
			else
			{
				
				// [オプション]
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_OPSVKEI_NO));
				opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getOpSvcData(param, opsvkeiInfo));

			}
			
		// 回復の場合
		}
		else if (TRAN_KBN_KAIHK.equals(tranFlg))
		{
			if (JFUStrConst.CD00001_1.equals(getData(param, MAPKEY_FUSV0034WORK01, MAPKEY_SBOP_TRAN_FLG)))
			{
				// [サブオプション]
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_OPSVKEI_NO));
				opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, opsvkeiInfo.get(MAPKEY_CHBF_OSK_GENE_ADD_DTM));
				opsvkeiInfo.put(MAPKEY_CHAF_SBOPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_SBOPSVKEI_NO));

				ArrayList<HashMap<String, Object>> sbop_svc_kei_info_list = getList(param, MAP_KEY_KAIHK_OPSVCKEI, SBOP_SVC_KEI_INFO_LIST);

				if (sbop_svc_kei_info_list != null && sbop_svc_kei_info_list.size() > 0)
				{
					HashMap<String, Object> sbop_svc_kei_info = sbop_svc_kei_info_list.get(0);
					opsvkeiInfo.put(MAPKEY_CHAF_SOSK_GENE_ADD_DTM, (String)sbop_svc_kei_info.get(KHK_CHGAF_SBOP_GENE_ADD_DTM));
				}
			}
			else
			{
				// [オプション]
				opsvkeiInfo.put(MAPKEY_CHAF_OPSVKEI_NO, opsvkeiInfo.get(MAPKEY_CHBF_OPSVKEI_NO));
				opsvkeiInfo.put(MAPKEY_CHAF_OSK_GENE_ADD_DTM, getData(param, MAP_KEY_KAIHK_OPSVCKEI, KHK_CHGAF_GENE_ADD_DTM));
			}
		}

		// オプションサービス契約情報を返却する
		return opsvkeiInfo;
	}

	/**
	 * サービスIFの結果からデータを取得します。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param title タイトル
	 * @param key 取得キー
	 * @return 返却データ
	 * @throws RequestParameterException 例外
	 */
	@SuppressWarnings("unchecked")
	private String getData(IRequestParameterReadWrite param, String title, String key) throws RequestParameterException
	{
		// ユーザデータの取得
		HashMap getDataMap = (HashMap)param.getData(title);
		// 返却データ取得
		return (String)getDataMap.get(key);
	}

	/**
	 * サービスIFの結果からデータを取得します。
	 * 
	 * <br>
	 * @param param
	 * @param title
	 * @param key
	 * @return ArrayList<HashMap<String, Object>>
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getList(IRequestParameterReadWrite param, String title, String key) throws RequestParameterException
	{
		// ユーザデータの取得
		HashMap<String, Object> getDataMap = (HashMap<String, Object>)param.getData(title);
		// 返却データ取得
		return (ArrayList<HashMap<String, Object>>)getDataMap.get(key);
	}
	
	/**
	 * 解約時の変更後世代登録年月日時分秒（オプションサービス契約）設定値を取得します。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param opsvkeiInfo 変更前世代登録年月日時分秒（オプションサービス契約） 
	 * @return 返却データ
	 * @throws RequestParameterException 例外
	 */
	private String getOpSvcData(IRequestParameterReadWrite param, HashMap<String, String> opsvkeiInfo) throws RequestParameterException
	{
		// [オプション]
		// 自分のステータスを取得する（オプションサービス契約ステータス）
		String opSvcKeiStat = (String)param.getData(JFUStrConst.KEY_BP_REQ_CHK_SVC_KEI_STAT);
		String chafOpsvkeiGeneAddDtm = null;
		
		if (JFUStrConst.CD00001_0.equals(getData(param, MAPKEY_FUSV0033WORK01, MAPKEY_OP_TRAN_FLG)))
		{
			chafOpsvkeiGeneAddDtm = opsvkeiInfo.get(MAPKEY_CHBF_OSK_GENE_ADD_DTM);
		}
		else
		{
			//   ステータス＝照査済
			if(JFUStrConst.CD00037_020.equals(opSvcKeiStat))
			{
				chafOpsvkeiGeneAddDtm = getData(param, MAPKEY_FUSV003310SC, MAPKEY_GENE_ADD_DTM);
			}
			else
			{
			//   ステータス＝締結済、開始
				chafOpsvkeiGeneAddDtm = getData(param, MAPKEY_FUSV003305SC, MAPKEY_GENE_ADD_DTM);
			}
		}
		
		return chafOpsvkeiGeneAddDtm;
	}

	/**
	 * 上りマッピング項目設定(サービス契約内訳<eo光電話>一意照会)
	 * 
	 * <br>
	 * 
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param dataMap
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0191A010(IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo) throws RequestParameterException
	{

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 機能コード設定(4:カレント)
		JFUBPCommon.setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_4);

		// ＫＥＹ＿オプションサービス契約番号
		inMap.put(EKK0191A010CBSMsg.KEY_SVC_KEI_UCWK_NO, (String)svcKeiUcwkNo);

	}

	/**
	 * 上りマッピング項目設定(機器提供サービス契約一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapKktkSvcKeiUqSearch(IRequestParameterReadWrite param, String fixedText, String kktkSvcKeiNo)
			throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿機器提供サービス契約番号
		inMap.put(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		// 予約適用年月日
		inMap.put(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

}