/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUHiChrgJdgCC
*   ソースファイル名：JFUHiChrgJdgCC.java
*   作成者          ：富士通
*   日付            ：2012年10月27日
*＜機能概要＞
*	非課金判定コンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/10/27   FJ）大島    新規作成【ANK-1255-00-00】オプション解約に伴う課金制御
*   v5.00       2013/09/04   FJ）谷本    障害対応【OM-2013-0001574】締結済み時のサービス課金年月日設定もれ対応
*  v29.00       2017/01/23   FJ) 張本   【ANK-2953-00-00】 電話番号のポート割当方法改善
*  v32.00.00    2017/08/01   FJ)舘山     【OM-2017-0000593】住所変更の番号変更による非課金判定
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
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.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JFUCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0401A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0401A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0401C180CBSMsg;

/**
 * 非課金判定コンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUHiChrgJdgCC extends JFUBaseNetChgCommonCC
{
	/** IN項目:サービス契約番号 */
	private static final String IN_PARAM_SVC_KEI_NO = "hikakin_svc_kei_no";
	/** IN項目:サービス契約内訳番号 */
	private static final String IN_PARAM_SVC_KEI_UCWK_NO = "hikakin_svc_kei_ucwk_no";
	/** IN項目:オプションサービスコード */
	private static final String IN_PARAM_OP_SVC_CD = "hikakin_opSvcCd";
	/** IN項目:オプションサービス契約番号 */
	private static final String IN_PARAM_OP_SVC_KEI_NO = "op_svc_kei_no";
	/** IN項目:サブオプションサービス契約番号 */
	private static final String IN_PARAM_SBOP_SVC_KEI_NO = "sbop_svc_kei_no";

	/** OUT項目(非課金判定部品):サービス課金終了日 */
	private static final String OUT_PARAM_SVC_CHRG_ENDYMD = "svcChrgEndYmd";
	/** OUT項目(非課金判定部品):課金フラグ */
	private static final String OUT_PARAM_CHRGFLG = "chrgFlg";

	/** オペレーションID(２番号サービスお申し込み) */
	private static final String OP_FUSV0042 = "FUSV0042OP";
	/** オペレーションID(eo光電話オプションサービス申込解約(解約)) */
	private static final String OP_FUSV0033 = "FUSV0033OP";
	/** オペレーションID(FUSV0065_メールアドレス変更申込(申込)) */
	private static final String OP_FUSV0065 = "FUSV0065OP";
	/** オペレーションID(メールアドレス自動設定ツール連携(指示実行)) */
	private static final String OP_FUSV0122 = "FUSV0122OP";

	/** サービス契約サービス課金開始日 */
	private static final String SVCKEI_CHRG_STAYMD = "svcKeiChrgStaYmd";
	/** サービス契約サービス課金終了日 */
	private static final String SVCKEI_CHRG_ENDYMD = "svcKeiChrgEndYmd";
	/** 解約種別フラグ */
	private static final String DSLSBT_FLG = "dslSbtFlg";
	/** 解約種別フラグ(オプション) */
	private static final String DSLSBT_FLG_OP = "2";
	/** 解約種別フラグ(サブオプション) */
	private static final String DSLSBT_FLG_SBOP = "3";
	/** オプションサービスコード */
	private static final String OP_SVC_CD = "opSvcCd";
	/** オプションサービス契約サービス利用開始日 */
	private static final String OPSVC_USE_STAYMD = "opSvcUseStaYmd";
	/** オプションサービス契約サービス利用終了日 */
	private static final String OPSVC_USE_ENDYMD = "opSvcUseEndYmd";
	/** サブオプションサービス契約サービス利用開始日 */
	private static final String SUBOP_SVCUSE_STAYMD = "subOpSvcUseStaYmd";
	/** サブオプションサービス契約サービス利用終了日 */
	private static final String SUBOP_SVCUSE_ENDYMD = "subOpSvcUseEndYmd";
	/** SC名(サブオプションサービス契約解約確定) */
	private static final String SC_NAME_FUSV003303SC = "FUSV003303SC";
	/** SC名(オプションサービス契約解約確定(電話オプション)) */
	private static final String SC_NAME_FUSV003305SC = "FUSV003305SC";
	/** SC名(サブオプションサービス契約解約確定(メアド変更)) */
	private static final String SC_NAME_FUSV006511SC = "FUSV006511SC";
	/** SC名(サブオプションサービス契約解約確定(メアド自動設定ツール)) */
	private static final String SC_NAME_FUSV012204SC = "FUSV012204SC";
	/** SC名(オプションサービス契約解約確定(電話オプション)) */
	private static final String SC_NAME_FUSV004222SC = "FUSV004222SC";

	/** CC名(サービスIF結果移送コモンコンポーネント部品(メアド自動設定ツール)) */
	private static final String CC_TITLE_FUSV012206 = "FUSV012206CC";
	/** 変更後サブオプションサービス契約世代登録年月日時分秒 */
	private static final String TRANS_KEY_3_VALUE = "FUSV012213SC::gene_add_dtm,trgt_data_list:opsvkei_info:chaf_sbopsvkei_gene_add_dtm";
	/** キー３ */
	private static final String TRANS_KEY_3 = "key_3";
	
	/* ■□ サービス契約内訳一意照会SC ■□ */
	/** テンプレートID(サービス契約内訳一意照会) */
	private static final String TEMPLATE_ID_1 = "EKK0161A010";
	/** テンプレートID(サービス契約内訳一意照会明細) */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST;
	/** IN項目リスト(サービス契約内訳一意照会) */
	private static final List<String> IN_COLUMN_LIST_1 =
			Arrays.asList(EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, EKK0161A010CBSMsg.KEY_GENE_ADD_DTM, EKK0161A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(サービス契約内訳一意照会) */
	private static final String ERROR_COLUMN_1 = EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO_ERR;
	/** SC実行結果取得キー(サービス契約内訳一意照会) */
	private static final String TEMP_TEMPLATE_KEY_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_1 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ オプションサービス契約一意照会SC ■□ */
	/** テンプレートID(オプションサービス契約一意照会) */
	private static final String TEMPLATE_ID_2 = "EKK0351A010";
	/** テンプレートID(オプションサービス契約一意照会明細) */
	private static final String TEMPLATE_ID_2_DETAIL = EKK0351A010CBSMsg.EKK0351A010CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_2 =
			Arrays.asList(EKK0351A010CBSMsg.KEY_OP_SVC_KEI_NO, EKK0351A010CBSMsg.KEY_GENE_ADD_DTM, EKK0351A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(オプションサービス契約一意照会) */
	private static final String ERROR_COLUMN_2 = EKK0351A010CBSMsg.KEY_OP_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(オプションサービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_2 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_2 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ サブオプションサービス契約一意照会SC ■□ */
	/** テンプレートID(サブオプションサービス契約一意照会) */
	private static final String TEMPLATE_ID_3 = "EKK0401A010";
	/** テンプレートID(サブオプションサービス契約一意照会明細) */
	private static final String TEMPLATE_ID_3_DETAIL = EKK0401A010CBSMsg.EKK0401A010CBSMSG1LIST;
	/** IN項目リスト(サブオプションサービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_3 =
			Arrays.asList(EKK0401A010CBSMsg.KEY_OP_SVC_KEI_NO, EKK0401A010CBSMsg.KEY_SBOP_SVC_KEI_NO, EKK0401A010CBSMsg.KEY_GENE_ADD_DTM,
					EKK0401A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(サブオプションサービス契約一意照会) */
	private static final String ERROR_COLUMN_3 = EKK0401A010CBSMsg.KEY_SBOP_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(サブオプションサービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_3 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_3 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ サービス契約一意照会SC ■□ */
	/** テンプレートID(サービス契約一意照会) */
	private static final String TEMPLATE_ID_4 = "EKK0081A010";
	/** テンプレートID(サービス契約一意照会明細) */
	private static final String TEMPLATE_ID_4_DETAIL = EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST;
	/** IN項目リスト(サービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_4 =
			Arrays.asList(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, EKK0081A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(サービス契約一意照会) */
	private static final String ERROR_COLUMN_4 = EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(サービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_4 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_4 + TEMP_TEMPLATE_PRIFIX_SEP;

// ▼▼▼ OM-2017-0000593 ADD START
	/* ■□ オプションサービス契約履歴一覧照会SC ■□ */
	/** テンプレートID(オプションサービス契約履歴一覧照会) */
	private static final String TEMPLATE_ID_EKK0351B003 = "EKK0351B003";
	/** テンプレートID(オプションサービス契約履歴一覧照会明細) */
	private static final String TEMPLATE_ID_EKK0351B003_DETAIL = EKK0351B003CBSMsg.EKK0351B003CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約履歴一覧照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0351B003 =
			Arrays.asList(EKK0351B003CBSMsg.KEY_OP_SVC_KEI_NO);
	/** 関連チェックエラー項目(オプションサービス契約履歴一覧照会) */
	private static final String ERROR_COLUMN_EKK0351B003 = EKK0351B003CBSMsg.KEY_OP_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(オプションサービス契約履歴一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0351B003 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0351B003 + TEMP_TEMPLATE_PRIFIX_SEP;
// ▲▲▲ OM-2017-0000593 ADD END

	/**
	 * 非課金判定処理
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite jdgHiChrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		try
		{
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			// オペレーションID
			String operationId = param.getOperationID();

			// IN項目:サービス契約番号
			String inMapSvcKeiNo = (String)inMap.get(IN_PARAM_SVC_KEI_NO);
			// IN項目:サービス内訳契約番号
			String inMapSvcKeiUcwkNo = (String)inMap.get(IN_PARAM_SVC_KEI_UCWK_NO);
			// IN項目:オプションサービスコード
			String inMapOpSvcCd = (String)inMap.get(IN_PARAM_OP_SVC_CD);
			// IN項目:オプションサービス契約番号 
			String inMapOpSvcKeiNo = (String)inMap.get(IN_PARAM_OP_SVC_KEI_NO);
			// IN項目:サブオプションサービス契約番号 
			String inMapSbopSvcKeiNo = (String)inMap.get(IN_PARAM_SBOP_SVC_KEI_NO);

			// 運用日付
			String opeDate = JFUBPCommon.getOpeDate(null);
			// サービス課金開始年月日
			String svcChrgStaYmd = null;

			if (OP_FUSV0033.equals(operationId) || OP_FUSV0042.equals(operationId))
			{
// ▼▼▼ OM-2017-0000593 Modify START
//				// ●サービス契約内訳一意照会
//				// ユーザデータ初期化
//				initData(param, fixedText, IN_COLUMN_LIST_1);
//				// 上りマッピング
//				setInMapSvcKeiUcwkSearch(param, fixedText, inMapSvcKeiUcwkNo);
//				// サービスIF実行
//				executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);
//				// サービス課金開始年月日
//				svcChrgStaYmd =
//						getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_1), TEMPLATE_ID_1_DETAIL,
//								EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD, 0);
				// サービス課金開始年月日をオプションサービス契約履歴照会から取得する。
				svcChrgStaYmd = getSvcChrgStartYMD(handle, param, fixedText, inMapOpSvcKeiNo, inMapSvcKeiUcwkNo);
// ▲▲▲ OM-2017-0000593 Modify END
				// ●サービス課金終了日設定(オプションサービス契約解約確定)
				HashMap opSvcMap = null;
				if (OP_FUSV0033.equals(operationId))
				{
					opSvcMap = (HashMap)param.getData(SC_NAME_FUSV003305SC);
				}
				else if (OP_FUSV0042.equals(operationId))
				{
					opSvcMap = (HashMap)param.getData(SC_NAME_FUSV004222SC);
				}
				if (null != opSvcMap)
				{
					// ユーザデータ初期化
					initData(param, fixedText, IN_COLUMN_LIST_2);
					// 上りマッピング
					setInMapOpSvcKeiSearch(param, fixedText, inMapOpSvcKeiNo);
					// サービスIF実行
					executeSC(handle, param, fixedText, TEMPLATE_ID_2, TEMPLATE_ID_2_DETAIL, IN_COLUMN_LIST_2, ERROR_COLUMN_2);

					// オプションサービス契約ステータス
					String opSvcKeiStat =
							getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_2), TEMPLATE_ID_2_DETAIL,
									EKK0351A010CBSMsg1List.OP_SVC_KEI_STAT, 0);
					// サービス開始年月日
					String svcStaYmd =
							getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_2), TEMPLATE_ID_2_DETAIL,
									EKK0351A010CBSMsg1List.SVC_STAYMD, 0);

					HashMap trgtDataOp = new HashMap();

					// サービス提供中の場合
					if (JFUStrConst.CD00037_100.equals(opSvcKeiStat))
					{
						// サービス契約サービス課金開始日
						trgtDataOp.put(SVCKEI_CHRG_STAYMD, svcChrgStaYmd);
						// オプション解約種別フラグ("2")
						trgtDataOp.put(DSLSBT_FLG, DSLSBT_FLG_OP);
						// オプションサービスコード
						trgtDataOp.put(OP_SVC_CD, inMapOpSvcCd);
						// オプションサービス契約サービス利用開始日
						trgtDataOp.put(OPSVC_USE_STAYMD, svcStaYmd);
						// オプションサービス契約サービス利用終了日
						trgtDataOp.put(OPSVC_USE_ENDYMD, opeDate);

						// 非課金判定処理
						HashMap<String, Object> resMap = JKKBpCommon.jdgHiChrg(trgtDataOp);

						// ●上りマッピング
						// サービス課金終了年月日
						opSvcMap.put(EKK0401C180CBSMsg.SVC_CHRG_ENDYMD, resMap.get(OUT_PARAM_SVC_CHRG_ENDYMD));
						// 解約時課金フラグ
						opSvcMap.put(EKK0401C180CBSMsg.DSLJI_CHRG_FLG, resMap.get(OUT_PARAM_CHRGFLG));
					}
					else
					{
						// ●上りマッピング
						// サービス課金終了年月日
						opSvcMap.put(EKK0401C180CBSMsg.SVC_CHRG_ENDYMD, JFUCommonUtil.addDay(opeDate, -1));
						// 解約時課金フラグ
						opSvcMap.put(EKK0401C180CBSMsg.DSLJI_CHRG_FLG, JFUStrConst.CD00002_0);
					}
				}
			}
			else
			{
				// ●サービス契約一意照会
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_4);
				// 上りマッピング
				setInMapSvcKeiSearch(param, fixedText, inMapSvcKeiNo);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_4, TEMPLATE_ID_4_DETAIL, IN_COLUMN_LIST_4, ERROR_COLUMN_4);
				// サービス課金開始年月日
				svcChrgStaYmd =
						getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_4), TEMPLATE_ID_4_DETAIL,
								EKK0081A010CBSMsg1List.SVC_CHRG_STAYMD, 0);
			}

			String sbopDslScName = null;

			// SC名設定
			if (OP_FUSV0033.equals(operationId))
			{
				sbopDslScName = SC_NAME_FUSV003303SC;
			}
			else if (OP_FUSV0065.equals(operationId))
			{
				sbopDslScName = SC_NAME_FUSV006511SC;
			}
			else if (OP_FUSV0122.equals(operationId))
			{
				sbopDslScName = SC_NAME_FUSV012204SC;
			}
			else if (OP_FUSV0042.equals(operationId))
			{
				sbopDslScName = JFUStrConst.EMPTY;
			}

			// ●サービス課金終了日設定(サブオプションサービス契約解約確定)
			HashMap sbopSvcMap = (HashMap)param.getData(sbopDslScName);

			if (null != sbopSvcMap && !JFUBPCommon.isNull(inMapSbopSvcKeiNo))
			{
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_3);
				// 上りマッピング
				setInMapSbopSvcKeiSearch(param, fixedText, inMapOpSvcKeiNo, inMapSbopSvcKeiNo);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_3, TEMPLATE_ID_3_DETAIL, IN_COLUMN_LIST_3, ERROR_COLUMN_3);

				// サブオプションサービス契約ステータス
				String sbopSvcKeiStat =
						getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_3), TEMPLATE_ID_3_DETAIL,
								EKK0401A010CBSMsg1List.SBOP_SVC_KEI_STAT, 0);
				// サービス開始年月日
				String svcStaYmd =
						getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_3), TEMPLATE_ID_3_DETAIL,
								EKK0401A010CBSMsg1List.SVC_STAYMD, 0);

				// サービス提供中の場合
				if (JFUStrConst.CD00037_100.equals(sbopSvcKeiStat))
				{
					HashMap trgtDataSbop = new HashMap();

					// 解約種別フラグ("3")
					trgtDataSbop.put(DSLSBT_FLG, DSLSBT_FLG_SBOP);
					// サービス契約サービス課金開始日
					trgtDataSbop.put(SVCKEI_CHRG_STAYMD, svcChrgStaYmd);
					// サブオプションサービス契約サービス利用開始日
					trgtDataSbop.put(SUBOP_SVCUSE_STAYMD, svcStaYmd);
					// サブオプションサービス契約サービス利用終了日
					trgtDataSbop.put(SUBOP_SVCUSE_ENDYMD, opeDate);

					// 非課金判定処理
					HashMap<String, Object> resMap = JKKBpCommon.jdgHiChrg(trgtDataSbop);

					// ●上りマッピング
					// サービス課金終了年月日
					sbopSvcMap.put(EKK0401C180CBSMsg.SVC_CHRG_ENDYMD, resMap.get(OUT_PARAM_SVC_CHRG_ENDYMD));
					// 解約時課金フラグ
					sbopSvcMap.put(EKK0401C180CBSMsg.DSLJI_CHRG_FLG, resMap.get(OUT_PARAM_CHRGFLG));
				}
				else
				{
					// ●上りマッピング
					// サービス課金終了年月日
					sbopSvcMap.put(EKK0401C180CBSMsg.SVC_CHRG_ENDYMD, JFUCommonUtil.addDay(opeDate, -1));
					// 解約時課金フラグ
					sbopSvcMap.put(EKK0401C180CBSMsg.DSLJI_CHRG_FLG, JFUStrConst.CD00002_0);
					
					// メアド自動設定、且つ、キャンセルの場合
					if (OP_FUSV0122.equals(operationId) && JFUStrConst.CD00037_020.equals(sbopSvcKeiStat)){
						// データ移送マップ
						HashMap dataTransMap = (HashMap)param.getData(CC_TITLE_FUSV012206);
						// キーをキャンセル用に変更
						dataTransMap.put(TRANS_KEY_3, TRANS_KEY_3_VALUE);
					}
				}
			}
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * 上りマッピング項目設定(サービス契約一意照会）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svckeiNo SVC_KEI_NO
	 * @throws RequestParameterException
	 */
	private void setInMapSvcKeiSearch(IRequestParameterReadWrite param, String fixedText, String svckeiNo) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// サービス契約番号
		inMap.put(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svckeiNo);
		// 予約適用年月日
		inMap.put(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピング項目設定(サービス契約内訳一意照会）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svckeiUcwkNo サービス契約内訳番号
	 * @throws RequestParameterException
	 */
	private void setInMapSvcKeiUcwkSearch(IRequestParameterReadWrite param, String fixedText, String svckeiUcwkNo) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿サービス契約内訳番号
		inMap.put(EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0161A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピング項目設定(オプションサービス契約一意照会SC）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapOpSvcKeiSearch(IRequestParameterReadWrite param, String fixedText, String opSvcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービス契約番号
		inMap.put(EKK0351A010CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0351A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピング項目設定(サブオプションサービス契約一意照会SC）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapSbopSvcKeiSearch(IRequestParameterReadWrite param, String fixedText, String opSvcKeiNo, String sbopSvcKeiNo)
			throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービス契約番号
		inMap.put(EKK0401A010CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo);
		// ＫＥＹ＿サブオプションサービス契約番号
		inMap.put(EKK0401A010CBSMsg.KEY_SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0401A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}
// ▼▼▼ OM-2017-0000593 ADD START
	/**
	 * 電話オプションサービスのサービス課金開始日を取得する。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param opSvcKeiNo
	 * @param inMapSvcKeiUcwkNo
	 */
	private String getSvcChrgStartYMD(
			SessionHandle handle,
			IRequestParameterReadWrite param, 
			String fixedText,
			String opSvcKeiNo,
			String inMapSvcKeiUcwkNo) throws Throwable
	{
		// オプションサービス契約番号から履歴一覧を取得する
		initData(param, fixedText, IN_COLUMN_LIST_EKK0351B003);
		
		// 上りマッピング
		setInMapEKK0351B003(param, fixedText, opSvcKeiNo);

		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0351B003, 
				                            TEMPLATE_ID_EKK0351B003_DETAIL, 
				                            IN_COLUMN_LIST_EKK0351B003, 
				                            ERROR_COLUMN_EKK0351B003);
		
		HashMap inMap = (HashMap)param.getData(fixedText);
		

		// 取得したデータから内訳番号を取得
		String svc_kei_ucwk_no = null;

		for (HashMap outMapEKK0351B003 : getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_EKK0351B003), TEMPLATE_ID_EKK0351B003_DETAIL)) 
		{
			String wrk_ucwk_no = (String)outMapEKK0351B003.get(EKK0351B003CBSMsg1List.SVC_KEI_UCWK_NO);
			if (svc_kei_ucwk_no == null)
			{
				svc_kei_ucwk_no = wrk_ucwk_no;
			}
			else if (!svc_kei_ucwk_no.equals(wrk_ucwk_no))
			{
				svc_kei_ucwk_no = wrk_ucwk_no;
				break;
			}
		}
			
		// 内訳番号が異なる場合、新たな内訳番号でサービス課金開始日を取得する
		if (svc_kei_ucwk_no != null && !svc_kei_ucwk_no.equals(inMapSvcKeiUcwkNo))
		{
			initData(param, fixedText, IN_COLUMN_LIST_1);

			// 上りマッピング
			setInMapSvcKeiUcwkSearch(param, fixedText, svc_kei_ucwk_no);

			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);
			
			String chrgStaYmd = getTemplateListValue(inMap, 
								                     getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_1), 
								                     TEMPLATE_ID_1_DETAIL,
								                     EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD, 0);
			if (chrgStaYmd != null && chrgStaYmd.length() > 0)
			{
				return chrgStaYmd;
			}
		}
		
		// デフォルトの課金開始日を返却する。
		initData(param, fixedText, IN_COLUMN_LIST_1);
		// 上りマッピング
		setInMapSvcKeiUcwkSearch(param, fixedText, inMapSvcKeiUcwkNo);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);
		
		return getTemplateListValue(inMap, 
				                     getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_1), 
				                     TEMPLATE_ID_1_DETAIL,
				                     EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD, 0);
	}
	/**
	 * オプションサービス契約履歴一覧照会のinMapを設定
	 * <br>
	 * @param param 
	 * @param fixedText
	 * @param opSvcKeiNo
	 */
	private void setInMapEKK0351B003(IRequestParameterReadWrite param, String fixedText, String opSvcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿オプションサービス契約番号
		inMap.put(EKK0351B003CBSMsg.KEY_OP_SVC_KEI_NO, opSvcKeiNo);
	}
// ▲▲▲ OM-2017-0000593 ADD START
}
