/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUOptPackAplyChkCC
*   ソースファイル名：JFUOptPackAplyChkCC.java
*   作成者          ：富士通
*   日付            ：2020年06月05日
*＜機能概要＞
*   オプションパック適用判定コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00       2014/04/21   FJ）畑中    新規作成
*   v50.00.00   2020/06/05   FJ)西川     ANK-3754-00-00_トビラフォン対応
* 
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EFU0331B010BSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0331B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EFU0341B010BSMsg1List;
import eo.ejb.cbs.cbsmsg.EFU0341B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2871B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2871B501CBSMsg1List;

/**
 * オプションパック適用判定コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUOptPackAplyChkCC extends JFUBaseCC
{
	// ■ オプションパック算出基準一覧照会
	/** テンプレートID(オプションパック算出基準一覧照会) */
	private static final String TEMP_ID_EFU0331B010 = "EFU0331B010";
	/** テンプレートID(オプションパック算出基準一覧照会) */
	private static final String TEMP_ID_DTL_EFU0331B010 = EFU0331B010CBSMsg.EFU0331B010BSMSG1LIST;
	/** IN項目リスト(オプションパック算出基準一覧照会) */
	private static final List<String> IN_COL_LIST_EFU0331B010 = Arrays.asList(EFU0331B010CBSMsg.KEY_STDARDYMD);
	/** 関連チェックエラー項目(オプションパック算出基準一覧照会) */
	private static final String ERR_COL_EFU0331B010 = null;

	// ■ 適合パック判定一覧照会
	/** テンプレートID(適合パック判定一覧照会) */
	private static final String TEMP_ID_EFU0341B010 = "EFU0341B010";
	/** テンプレートID(適合パック判定一覧照会) */
	private static final String TEMP_ID_DTL_EFU0341B010 = EFU0341B010CBSMsg.EFU0341B010BSMSG1LIST;
	/** IN項目リスト(適合パック判定一覧照会) */
	private static final List<String> IN_COL_LIST_EFU0341B010 =
			Arrays.asList(EFU0341B010CBSMsg.KEY_STDARDYMD, EFU0341B010CBSMsg.KEY_RTWAJG_JKN_VALUE);
	/** 関連チェックエラー項目(適合パック判定一覧照会) */
	private static final String ERR_COL_EFU0341B010 = null;

	// ■ 申込判定用割引サービス構成明細一覧照会
	/** テンプレートID(申込判定用割引サービス構成明細一覧照会) */
	private static final String TEMP_ID_EKK2871B501 = "EKK2871B501";
	/** テンプレートID(申込判定用割引サービス構成明細一覧照会) */
	private static final String TEMP_ID_DTL_EKK2871B501 = EKK2871B501CBSMsg.EKK2871B501CBSMSG1LIST;
	/** IN項目リスト(申込判定用割引サービス構成明細一覧照会) */
	private static final List<String> IN_COL_LIST_EKK2871B501 =
			Arrays.asList(EKK2871B501CBSMsg.KEY_WRIB_SVC_CD, EKK2871B501CBSMsg.KEY_WRIB_KOSE_SVC_SKCD);
	/** 関連チェックエラー項目(申込判定用割引サービス構成明細一覧照会) */
	private static final String ERR_COL_EKK2871B501 = null;

	// ■IN項目ID
	/** IN項目ID：基準年月日 */
	private static final String IN_BASE_DATE = "base_date";
	/** IN項目ID：料金コースコード */
	private static final String IN_PCRS_CD = "pcrs_cd";
	/** IN項目ID：料金プランコード */
	private static final String IN_PPLAN_CD = "pplan_cd";
	/** IN項目ID：判定用料金コースコードリスト */
	private static final String IN_JUDGE_PCRS_CD_LIST = "judge_pcrs_cd_list";
	/** IN項目ID：判定用オプションサービスリスト */
	private static final String IN_JUDGE_OP_SVC_CD_LIST = "judge_op_svc_cd_list";
	/** IN項目ID：判定用オプション／サブオプションサービスコード */
	private static final String IN_JUDGE_OP_SBOP_SVC_CD = "op_sbop_svc_cd";

	// ■OUT項目ID
	/** OUT項目ID：戻りコード */
	private static final String OUT_RETURN_CD = "return_cd";
	/** OUT項目ID：判定後割引サービスコード */
	private static final String OUT_WRIB_SVC_CD  = "wrib_svc_cd";
	/** OUT項目ID：置換型割引適用判定パターン区分 */
	private static final String OUT_RTWAJG_PTN_DIV  = "rtwajg_ptn_div";
	/** OUT項目ID：コンシューマ用表示文言 */
	private static final String OUT_CSM_YO_DSP_MNGN  = "csm_yo_dsp_mngn";
	/** OUT項目ID：オペレータ用表示文言 */
	private static final String OUT_OPRT_YO_DSP_MNGN  = "oprt_yo_dsp_mngn";
	/** OUT項目ID：単品オプションサービスリスト */
	private static final String OUT_SINGLE_OPTION_SERVICE_LIST = "single_option_service_list";
	/** OUT項目ID：オプション／サブオプションサービスコード */
	private static final String OUT_OP_SBOP_SVC_CD = "op_sbop_svc_cd";

	// ■リターンコード
	/** 戻りコード：正常終了 */
	private static final String RETURN_CD_000 = "000";
	/** 戻りコード：オプション組み合わせ不正(判定条件値組合せ無効の場合) */
	private static final String RETURN_CD_100 = "100";
	/** 戻りコード：その他異常終了(オプション組合せデータなし or 2件以上) */
	private static final String RETURN_CD_999 = "999";

	// ■その他
	/** 未定義用コード */
	private static final String NOTHING = "0000000000000000";
	/** フォーマット：先頭0埋め(16桁) */
	private static final String FILL_ZERO_16KETA = "%016d";

	/**
	 * オプションパック適用判定処理（画面用）です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite judgeOptPack(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		HashMap resultMap = judgeCommonOptPack(handle, param, fixedText);

		// ●リクエストパラメータに結果を格納
		param.removeData(fixedText);
		param.setData(fixedText, resultMap);

		return param;
	}

	/**
	 * オプションパック適用判定処理（API用）です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	protected HashMap judgeOptPackIf(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		return judgeCommonOptPack(handle, param, fixedText);
	}

	/**
	 * オプションパック適用判定共通処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	private HashMap judgeCommonOptPack(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 結果格納マップ
		HashMap resultMap = new HashMap();

		// ●IN項目値チェック処理
		if (!chkInItemsVal(param, fixedText, resultMap))
		{
			// チェック結果が「false」の場合
			outDebugLog("■■■IN項目値不正■■■");
			// 戻りコードに「999：その他異常終了」を設定
			dataMap.put(OUT_RETURN_CD, RETURN_CD_999);
			// 処理終了
			return resultMap;
		}

		// ●パック構成組合せ判定用基準値取得
		// ユーザデータ初期化
		initData(param, fixedText, IN_COL_LIST_EFU0331B010);
		// 検索エラーなし
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setEFU0331B010(param, fixedText);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_EFU0331B010, TEMP_ID_DTL_EFU0331B010, IN_COL_LIST_EFU0331B010, ERR_COL_EFU0331B010);

		// オプションサブオプションサービスリスト
		ArrayList<String> opSbopSvcCdList = new ArrayList<String>();

		// 結果取得
		String packJudgeBaseVal = getPackJudgeBaseVal(param, fixedText, opSbopSvcCdList);

		// パック構成組合せ判定用基準値チェック
		if (JFUBPCommon.isNull(packJudgeBaseVal))
		{
			// 組合せ判定基準値が未定義の場合、「0000000000000000」とする
			packJudgeBaseVal = NOTHING;
		}

		// ●お得パック取得
		// ユーザデータ初期化
		initData(param, fixedText, IN_COL_LIST_EFU0341B010);
		// 検索エラーなし
		ignoreSearchError(param, fixedText);
		// 上りマッピング
		setEFU0341B010(param, fixedText, packJudgeBaseVal);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_ID_EFU0341B010, TEMP_ID_DTL_EFU0341B010, IN_COL_LIST_EFU0341B010, ERR_COL_EFU0341B010);

		// 結果取得
		String wribSvcCd = getOtokuPackWribSvcCd(param, fixedText, resultMap);

		if (!JFUBPCommon.isNull(wribSvcCd))
		{
			// ●単品オプションサービスリスト
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK2871B501);
			// 検索エラーなし
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setEKK2871B501(param, fixedText, wribSvcCd);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_ID_EKK2871B501, TEMP_ID_DTL_EKK2871B501, IN_COL_LIST_EKK2871B501, ERR_COL_EKK2871B501);
		}

		// 置換型割引適用判定パターン区分
		String rtwajgPtnDiv = (String)resultMap.get(OUT_RTWAJG_PTN_DIV);
		if (rtwajgPtnDiv != null && !JFUStrConst.EMPTY.equals(rtwajgPtnDiv) && !JFUStrConst.CD01751_99.equals(rtwajgPtnDiv))
		{
			getSingleOpSbopSvcCdList(param, fixedText, resultMap, opSbopSvcCdList);
		}

		return resultMap;
	}

	/**
	 * チェック処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// チェック処理無し(メインメソッドで独自チェックを行う)
		return null;
	}

	/**
	 * デバッグモードでのbusログ出力処理です。
	 * 
	 * <br>
	 * @param obj 出力内容
	 */
	private void outDebugLog(Object obj)
	{
		// デバッグモードでのbusログ出力
		JSYejbLog.println(JSYLogBase.DEBUG, this.getClass(), obj, null, null, null);
	}

	/**
	 * IN項目値チェック処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @return チェック結果
	 * @throws Exception 例外
	 */
	private boolean chkInItemsVal(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// チェック結果格納用変数
		boolean result = true;

		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);
		if (dataMap == null || dataMap.size() == 0)
		{
			// パラメータが取得できない場合、無条件にチェック結果を「false」とする
			return false;
		}

		// 基準年月日
		String baseDate = (String)dataMap.get(IN_BASE_DATE);

		// ●必須チェック
		if (JFUBPCommon.isNull(baseDate))
		{
			// 基準年月日
			result = false;
		}

		if (result)
		{
			// チェック結果が正常の場合、結果マップに格納する
			resultMap.put(IN_BASE_DATE, baseDate);
			// 判定用料金コースコードリスト
			resultMap.put(IN_JUDGE_PCRS_CD_LIST, dataMap.get(IN_JUDGE_PCRS_CD_LIST));
			// 判定用オプションサービスコードリスト
			resultMap.put(IN_JUDGE_OP_SVC_CD_LIST, dataMap.get(IN_JUDGE_OP_SVC_CD_LIST));
		}

		return result;
	}

	/**
	 * オプションパック算出基準一覧照会(EFU0331B010)の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 例外
	 */
	private void setEFU0331B010(IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿基準年月日
		dataMap.put(EFU0331B010CBSMsg.KEY_STDARDYMD, dataMap.get(IN_BASE_DATE));
	}

	/**
	 * 適合パック判定一覧照会(EFU0341B010)の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param packJudgeBaseVal 組合せ判定用基準値
	 * @throws Exception 例外
	 */
	private void setEFU0341B010(IRequestParameterReadWrite param, String fixedText, String packJudgeBaseVal) throws Exception
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿組合せ判定用基準値
		dataMap.put(EFU0341B010CBSMsg.KEY_RTWAJG_JKN_VALUE, packJudgeBaseVal);
		// ＫＥＹ＿基準年月日
		dataMap.put(EFU0341B010CBSMsg.KEY_STDARDYMD, dataMap.get(IN_BASE_DATE));
	}

	/**
	 * 適申込判定用割引サービス構成明細一覧照会(EKK2871B501)の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcCd 割引サービスコード
	 * @throws Exception 例外
	 */
	private void setEKK2871B501(IRequestParameterReadWrite param, String fixedText, String wribSvcCd) throws Exception
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 機能コード
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);
		// ＫＥＹ＿割引サービスコード
		dataMap.put(EKK2871B501CBSMsg.KEY_WRIB_SVC_CD, wribSvcCd);
		// ＫＥＹ＿割引構成サービス識別コード
		dataMap.put(EKK2871B501CBSMsg.KEY_WRIB_KOSE_SVC_SKCD, "TP01");
	}

	/**
	 * パック構成組合せ判定基準値取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param opSbopSvcCdList 対象オプション／サブオプションサービスリスト
	 * @return パック構成組合せ判定基準値
	 * @throws Exception 例外
	 */
	private String getPackJudgeBaseVal(IRequestParameterReadWrite param, String fixedText, ArrayList opSbopSvcCdList) throws Exception
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 結果格納用変数
		String result = JFUStrConst.EMPTY;

		// パック構成組合せ判定基準設定一覧照会
		ArrayList eFU0331B010List = (ArrayList)dataMap.get(TEMP_ID_DTL_EFU0331B010);
		outDebugLog("■■■パック構成組合せ判定基準設定一覧照会結果【" + eFU0331B010List + "】■■■");

		// 結果チェック
		if (eFU0331B010List == null || eFU0331B010List.size() == 0)
		{
			// 結果が存在しない場合、処理を終了する
			return result;
		}

		// 計算結果格納用変数(初期値は0)
		long judgeValSum = 0;

		// パック構成組合せ判定基準値を計算
		ArrayList judgePcrsCdList = (ArrayList)dataMap.get(IN_JUDGE_PCRS_CD_LIST);

		if (judgePcrsCdList != null && judgePcrsCdList.size() > 0)
		{
			for (int i = 0; i < judgePcrsCdList.size(); i++)
			{
				// IN項目マップ
				HashMap judgePcrsCdMap = (HashMap)judgePcrsCdList.get(i);
				// 料金コースコード
				String inPrcsCd = (String)judgePcrsCdMap.get(IN_PCRS_CD);
				// 料金プランコード
				String inPplanCd = (String)judgePcrsCdMap.get(IN_PPLAN_CD);

				for (int j = 0; j < eFU0331B010List.size(); j++)
				{
					// 結果マップ
					HashMap childMap = (HashMap)eFU0331B010List.get(j);
					if (childMap == null || childMap.size() == 0)
					{
						continue;
					}

					// オプションサービスコード
					String opSvcCd = (String)childMap.get(EFU0331B010BSMsg1List.OP_SVC_CD);
					// サブオプションサービスコード
					String sbopSvcCd = (String)childMap.get(EFU0331B010BSMsg1List.SBOP_SVC_CD);

					// 料金コースコード
					String pcrsCd = (String)childMap.get(EFU0331B010BSMsg1List.PCRS_CD);
					// 料金プランコード
					String pplanCd = (String)childMap.get(EFU0331B010BSMsg1List.PPLAN_CD);

					// 組合せ判定基準値
					String judgeVal = (String)childMap.get(EFU0331B010BSMsg1List.RTWAJG_KSS_STV);

					if (JFUBPCommon.isNull(judgeVal))
					{
						// 組合せ判定基準値が未定義の場合、「0000000000000000」とする
						judgeVal = NOTHING;
					}
					if (inPrcsCd.equals(pcrsCd) && inPplanCd.equals(pplanCd))
					{
						// 組合せ判定基準値が設定されている、かつ、料金コースコードと料金プランコードが一致した基準値を加算する
						judgeValSum = judgeValSum + Long.parseLong(judgeVal);

						if (!JFUBPCommon.isNull(opSvcCd))
						{
							opSbopSvcCdList.add(opSvcCd);
						}
						else if (!JFUBPCommon.isNull(sbopSvcCd))
						{
							opSbopSvcCdList.add(sbopSvcCd);
						}
					}
				}
			}
		}
		else
		{
			// パック構成組合せ判定基準値を計算
			ArrayList judgeOpSvcCdList = (ArrayList)dataMap.get(IN_JUDGE_OP_SVC_CD_LIST);

			if (judgeOpSvcCdList != null && judgeOpSvcCdList.size() > 0)
			{

				for (int i = 0; i < judgeOpSvcCdList.size(); i++)
				{
					// IN項目マップ
					HashMap judgeOpSvcCdMap = (HashMap)judgeOpSvcCdList.get(i);

					// オプション／サブオプションサービスコード
					String inOpSbopSvcCd = (String)judgeOpSvcCdMap.get(IN_JUDGE_OP_SBOP_SVC_CD);

					for (int j = 0; j < eFU0331B010List.size(); j++)
					{
						// 結果マップ
						HashMap childMap = (HashMap)eFU0331B010List.get(j);
						if (childMap == null || childMap.size() == 0)
						{
							continue;
						}

						// オプションサービスコード
						String opSvcCd = (String)childMap.get(EFU0331B010BSMsg1List.OP_SVC_CD);
						// サブオプションサービスコード
						String sbopSvcCd = (String)childMap.get(EFU0331B010BSMsg1List.SBOP_SVC_CD);
						// 組合せ判定基準値
						String judgeVal = (String)childMap.get(EFU0331B010BSMsg1List.RTWAJG_KSS_STV);

						if (JFUBPCommon.isNull(judgeVal))
						{
							// 組合せ判定基準値が未定義の場合、「0000000000000000」とする
							judgeVal = NOTHING;
						}
						if (inOpSbopSvcCd.equals(opSvcCd) || inOpSbopSvcCd.equals(sbopSvcCd))
						{
							// 組合せ判定基準値が設定されている、かつ、オプションサービスコード又は、サブオプションサービスコードが一致した基準値を加算する
							judgeValSum = judgeValSum + Long.parseLong(judgeVal);

							if (!JFUBPCommon.isNull(opSvcCd))
							{
								opSbopSvcCdList.add(opSvcCd);
							}
							else if (!JFUBPCommon.isNull(sbopSvcCd))
							{
								opSbopSvcCdList.add(sbopSvcCd);
							}
						}
					}
				}
			}
		}

		// 16桁になるように先頭を0埋めする
		result = String.format(FILL_ZERO_16KETA, judgeValSum);
		outDebugLog("■■■パック構成組合せ判定基準値結果【" + result + "】■■■");

		return result;
	}

	/**
	 * お得パック取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 * @return 割引サービスコード
	 */
	private String getOtokuPackWribSvcCd(IRequestParameterReadWrite param, String fixedText, HashMap resultMap) throws Exception
	{
		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		// 結果取得
		ArrayList eFU0341B010List = (ArrayList)dataMap.get(TEMP_ID_DTL_EFU0341B010);
		outDebugLog("■■■適合パック判定一覧照会結果【" + eFU0341B010List + "】■■■");

		// 結果判定
		String packWribSvcCd = JFUStrConst.EMPTY;
		String packPairMkFlg = JFUStrConst.EMPTY;
		String rtwajgPtnDiv = JFUStrConst.EMPTY;
		String csmYoDspMngn = JFUStrConst.EMPTY;
		String oprtYoDspMngn = JFUStrConst.EMPTY;
		if (eFU0341B010List == null || eFU0341B010List.size() == 0 || eFU0341B010List.size() > 1)
		{
			// 結果が0件または2件以上の場合
			outDebugLog("■■■対象となるお得パックが0件または2件以上存在■■■");
			// 判定後割引サービスコード
			resultMap.put(OUT_WRIB_SVC_CD, null);
			// 戻りコードに「999：その他異常終了」を設定
			resultMap.put(OUT_RETURN_CD, RETURN_CD_999);
		}
		else
		{
			// 結果が1件の場合
			for (int i = 0; i < eFU0341B010List.size(); i++)
			{
				// 結果マップ
				HashMap childMap = (HashMap)eFU0341B010List.get(i);

				// 割引サービスコード
				if (!JFUBPCommon.isNull(childMap.get(EFU0341B010BSMsg1List.WRIB_SVC_CD)))
				{
					packWribSvcCd = (String)childMap.get(EFU0341B010BSMsg1List.WRIB_SVC_CD);
				}

				// 判定条件値組合せ無効フラグ
				if (!JFUBPCommon.isNull(childMap.get(EFU0341B010BSMsg1List.JDG_JKN_VALUE_PAIR_MK_FLG)))
				{
					packPairMkFlg = (String)childMap.get(EFU0341B010BSMsg1List.JDG_JKN_VALUE_PAIR_MK_FLG);
				}

				// 置換型割引適用判定パターン区分
				if (!JFUBPCommon.isNull(childMap.get(EFU0341B010BSMsg1List.RTWAJG_PTN_DIV)))
				{
					rtwajgPtnDiv = (String)childMap.get(EFU0341B010BSMsg1List.RTWAJG_PTN_DIV);
				}

				// コンシューマ用表示文言
				if (!JFUBPCommon.isNull(childMap.get(EFU0341B010BSMsg1List.CSM_YO_DSP_MNGN)))
				{
					csmYoDspMngn = delReturnCdCr(childMap.get(EFU0341B010BSMsg1List.CSM_YO_DSP_MNGN));
				}

				// オペレータ用表示文言
				if (!JFUBPCommon.isNull(childMap.get(EFU0341B010BSMsg1List.OPRT_YO_DSP_MNGN)))
				{
					oprtYoDspMngn = delReturnCdCr(childMap.get(EFU0341B010BSMsg1List.OPRT_YO_DSP_MNGN));
				}
			}

			// 判定条件値組合せ有効の場合
			if (packPairMkFlg.equals(JFUStrConst.S_ZERO))
			{
				// 判定後割引サービスコード
				resultMap.put(OUT_WRIB_SVC_CD, packWribSvcCd);
				// 戻りコードに「000：正常終了」を設定
				resultMap.put(OUT_RETURN_CD, RETURN_CD_000);
				// 置換型割引適用判定パターン区分
				resultMap.put(OUT_RTWAJG_PTN_DIV, rtwajgPtnDiv);
				// コンシューマ用表示文言
				resultMap.put(OUT_CSM_YO_DSP_MNGN, csmYoDspMngn);
				// オペレータ用表示文言
				resultMap.put(OUT_OPRT_YO_DSP_MNGN, oprtYoDspMngn);
			}
			else
			{
				// 判定後割引サービスコード
				resultMap.put(OUT_WRIB_SVC_CD, packWribSvcCd);
				// 戻りコードに「100：オプション組み合わせ不正」を設定
				resultMap.put(OUT_RETURN_CD, RETURN_CD_100);
				// 置換型割引適用判定パターン区分
				resultMap.put(OUT_RTWAJG_PTN_DIV, rtwajgPtnDiv);
				// コンシューマ用表示文言
				resultMap.put(OUT_CSM_YO_DSP_MNGN, csmYoDspMngn);
				// オペレータ用表示文言
				resultMap.put(OUT_OPRT_YO_DSP_MNGN, oprtYoDspMngn);
			}
		}
		return packWribSvcCd;
	}


	/**
	 * 単品オプションサービスリスト取得処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @param inOpSbopSvcCdList オプションサブオプションサービスリスト
	 * @throws Exception 例外
	 * @return 割引サービスコード
	 */
	private void getSingleOpSbopSvcCdList(IRequestParameterReadWrite param, String fixedText, HashMap resultMap, ArrayList inOpSbopSvcCdList) throws Exception
	{

		String rtwajgPtnDiv = (String)resultMap.get(OUT_RTWAJG_PTN_DIV);

		// パラメータ取得
		HashMap dataMap = (HashMap)param.getData(fixedText);

		ArrayList eKK2871B501List = (ArrayList)dataMap.get(TEMP_ID_DTL_EKK2871B501);

		if (eKK2871B501List != null && eKK2871B501List.size() > 0)
		{
			// 単品オプションを判定する為、パックに含むオプションサブオプションコードリストを除外する。

			for (int j = 0; j < eKK2871B501List.size(); j++)
			{
				// 結果マップ
				HashMap childMap = (HashMap)eKK2871B501List.get(j);
				if (childMap == null || childMap.size() == 0)
				{
					continue;
				}
				// オプションサービスコード
				String opSvcCd = (String)childMap.get(EKK2871B501CBSMsg1List.OP_SVC_CD);
				// サブオプションサービスコード
				String sbopSvcCd = (String)childMap.get(EKK2871B501CBSMsg1List.SBOP_SVC_CD);

				if (!JFUBPCommon.isNull(opSvcCd) && inOpSbopSvcCdList.contains(opSvcCd))
				{
					inOpSbopSvcCdList.remove(opSvcCd);
				}
				else if (!JFUBPCommon.isNull(sbopSvcCd) && inOpSbopSvcCdList.contains(sbopSvcCd))
				{
					inOpSbopSvcCdList.remove(sbopSvcCd);
				}
			}
		}

		if (inOpSbopSvcCdList == null || inOpSbopSvcCdList.size() == 0)
		{
			resultMap.put(OUT_SINGLE_OPTION_SERVICE_LIST, null);
		}
		else
		{
			ArrayList<HashMap<String, String>> singleOpSbopSvcCdList = new ArrayList<HashMap<String, String>>();
			for (Iterator iterator = inOpSbopSvcCdList.iterator(); iterator.hasNext();)
			{
				String opSbopSvcCdList = (String)iterator.next();
				HashMap opSbopSvcCdMap = new HashMap();

				opSbopSvcCdMap.put(OUT_OP_SBOP_SVC_CD, opSbopSvcCdList);
				singleOpSbopSvcCdList.add(opSbopSvcCdMap);
			}
			resultMap.put(OUT_SINGLE_OPTION_SERVICE_LIST, singleOpSbopSvcCdList);
		}
	}

	/**
	 * 改行コード削除
	 * @param val 値
	 * @return 改行コードを半角スペースに変換した値
	 */
	private static String delReturnCdCr(Object val)
	{
		if (val == null)
		{

			return JFUStrConst.EMPTY;
		}
		return String.valueOf(val).replaceAll(JFUStrConst.S_LINE_SEPARAOR_CR, JFUStrConst.EMPTY);
	}
}
