/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKPrcSimulationCC
*   ソースファイル名：JKKPrcSimulationCC.java
*   作成者          ：富士通
*   日付            ：2012年04月05日
*＜機能概要＞
*   料金シミュレーションCC
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v3.00.00    2012/04/05   FJ）中谷    新規作成
*   v4.00.00    2013/03/04   FJ          割引適用対応
*   v4.00.01    2013/04/11   FJ          割引除去対応
*   v4.00.02    2013/09/27   FJ          ThreadLocal対応
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCCBPCommon.getOpeDate;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_CUST;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_CUST_SEI;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_JOKEN_NON;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_KAISEN;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_SEI;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_ADD_JOKEN_CD_SEI_KAISEN;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_DCHS_SKBT_FLAG;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.WRIB_DCHS_SKBT_FLAG_WRIB;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.W_SVCCD_VS_W_SVCCD;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.W_SVCCD_VS_W_TYPECD;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.W_TYPECD_VS_W_SVCCD;
import static eo.common.util.JKKWrisvcDchskmCommonUtil.W_TYPECD_VS_W_TYPECD;

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.custom.constant.KKSV0553_KKSV0553OP_KKSV055303SC_EKK2311B002CBSMsg1List;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_KKSV055307SC_EZM0321A010CBSMsg1List;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_SVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_WRIB_SVC_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO;
import com.fujitsu.futurity.bp.custom.constant.KKSV0553_KKSV0553OP_WORK_WRISVC;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKWrisvcDchskmCommonUtil;
import eo.ejb.cbs.cbsmsg.EKK0841B003CBSMsg1List;

/**
 * 料金シミュレーションCC.
 * <br>
 * @author 富士通
 */
public class JKKPrcSimulationCC extends AbstractCommonComponent
{
	/** 共通情報(IN) */
	private static final String COMMON_INFO = "common_info";
	
	/** サービスグループリスト（作業用） */
	private static final String SVC_GRP_LIST = "svc_grp_list";
	/** グループ番号（作業用） */
	private static final String GRP_NUMBER = "grp_number";
	/** サービスリスト（作業用） */
	private static final String SVC_LIST = "svc_list";
	/** サービス番号（作業用） */
	private static final String SVC_NUMBER = "svc_number";
	
	/** 成立条件合致サービスグループリスト */
	private static final String MATCH_WRIB_SVC_GRP_LIST = "match_wrib_svc_grp_list";
	/** チェック用割引サービス対象サービスリスト */
	private static final String CHK_WRIB_SVC_TGT_SVC_LIST = "chk_wrib_svc_tgt_svc_list";
	
	/** 機能コード */
	private static final String FUNC_1 = "1";
	/** 機能コード */
	private static final String FUNC_2 = "2";
	
	
	/** 割引サービス対象サービス */
	private enum WRIB {
		SVC, SVC_UCWK, OP_SVC, SBOP_SVC, KKTK_SVC, SEI_OP_SVC,
	}
	
	private static final String[] WRIB_SOKAN_CKJK_SBT_CD = {W_SVCCD_VS_W_SVCCD, W_SVCCD_VS_W_TYPECD, W_TYPECD_VS_W_SVCCD, W_TYPECD_VS_W_TYPECD};
	
	/** 入力データ未設定例外メッセージ */
	private static final String NULL_ERR_MSG = "入力データが未設定（必須項目）：";

	/** 即割 指定 */
	private static final String SOKUWARI_ON = "1";
	
	/** 即割 */
	private static final String SOKUWARI = "31";
	
	/** ファミリーパック 指定 */
	private static final String FAMILYPACK_ON = "1";
	
	/** ファミリーパック 割引サービスコード */
	private static final String FAMILYPACK_WRIB_SVC = "W00000006";
	
/* ++++++++++ v4.00.00 add start       ++++++++++ */
	
	/** 割引サービス適用条件種別コード 申込形態 */
	private static final String WRSV_APLY_JKN_SBT_CD_MSKM = "01";
	
/* ++++++++++ v4.00.00 add end         ++++++++++ */
	
// v4.00.02 MOD START
//	/** CC-SCマッピングクラス */
//	private static ThreadLocal<JKKPrcSimulationCCMapper> ccMapper = new ThreadLocal<JKKPrcSimulationCCMapper>();
	private JKKPrcSimulationCCMapper ccMapper = null;
// v4.00.02 MOD END
	
	/**
	 * 料金シミュレーション処理を行います。
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// CC用マップが設定されていない場合は処理を行わない。
		if (inMap == null)
		{
			printlnEjbLog("料金シミュレーションCCマップが取得できません。マップキー【" + fixedText + "】");
			return param;
		}
		
		// 共通情報取得
		HashMap<String, Object> commonInfo = (HashMap<String, Object>) inMap.get(COMMON_INFO);
		
		// パラメータチェック
		if (chkParam(commonInfo))
		{
			throw new Exception("入力パラメータ不正");
		}
		
		// CC-SCマッピングクラスのインスタンス生成
// v4.00.02 MOD START
//		ccMapper.set(new JKKPrcSimulationCCMapper(handle, param, getOpeDate(null), fixedText));
		this.ccMapper = new JKKPrcSimulationCCMapper(handle, param, getOpeDate(null), fixedText);
// v4.00.02 MOD END
		
		//------------------------------------------
		// 割引サービス条件チェック実行
		//------------------------------------------
		ArrayList<HashMap<String, Object>> dojiOKList = chkMainWribSvc(commonInfo);
		
		//------------------------------------------
		// 返却用割引サービス単価リスト作成・設定
		//------------------------------------------
		commonInfo.put(KKSV0553_KKSV0553OP_WORK.WRIB_SVC_LIST, makeWribSvcTankList(dojiOKList));
		
		return param;
	}
	
	/**
	 * 入力パラメータチェック
	 * 
	 * @param commonInfo
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private boolean chkParam(HashMap<String, Object> commonInfo)
	{
		boolean errFlg = false;
		String prefix = "";
		
		// 共通情報が設定されていない
		if (commonInfo == null)
		{
			printlnEjbLog(NULL_ERR_MSG + "common_info");
			return true;
		}
		
		printlnEjbLog("入力データ（共通情報）【" + commonInfo + "】");
		
		// 異動区分が設定無し
		if (isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.IDO_DIV)))
		{
			printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.IDO_DIV);
			return true;
		}
		// 申込種別コードが設定無し
		if (isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.MSKM_SBT_CD)))
		{
			printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.MSKM_SBT_CD);
			return true;
		}
		// 申込形態コードが設定無し
		if (isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.MSKM_FORM_CD)))
		{
			printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.MSKM_FORM_CD);
			return true;
		}
		
		// サービス情報リストが設定無し
		ArrayList<HashMap<String, Object>> svc_info_list =
			(ArrayList<HashMap<String,Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST);
		if (svc_info_list == null)
		{
			printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST);
			return true;
		}
		Iterator<HashMap<String, Object>> ite = svc_info_list.iterator();
		while (ite.hasNext())
		{
			prefix = KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST + "-";
			HashMap<String, Object> svc_info = ite.next();
			
			// 請求契約番号
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEKY_KEI_NO)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEKY_KEI_NO);
				return true;
			}
			// サービス契約回線内訳番号
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KAISEN_KEI_NO)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.KAISEN_KEI_NO);
				return true;
			}
			// 即割有無
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SOKUWARI_UM)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SOKUWARI_UM);
				return true;
			}
			// ファミリーパック有無
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.FAMILY_PACK_UM)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.FAMILY_PACK_UM);
				return true;
			}
			// サービスコード
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SVC_CD)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SVC_CD);
				return true;
			}
			// 料金グループコード
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PRC_GRP_CD)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.PRC_GRP_CD);
				return true;
			}
			// 料金コースコード
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD);
				return true;
			}
			// 料金プランコード
			if (isNullBlank(svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD)))
			{
				printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD);
				return true;
			}
			// オプションサービスリスト
			ArrayList<HashMap<String, Object>> op_svc_list =
				(ArrayList<HashMap<String, Object>>)svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST);
			if (op_svc_list == null)
			{
				printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST);
				return true;
			}
			else
			{
				Iterator<HashMap<String, Object>> ite1 = op_svc_list.iterator();
				while (ite1.hasNext())
				{
					prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST + "-";
					HashMap<String, Object> op_svc_info = ite1.next();
					// オプションサービスコード
					if (isNullBlank(op_svc_info.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.OP_SVC_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.OP_SVC_CD);
						return true;
					}
					// 料金コースコード
					if (isNullBlank(op_svc_info.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PCRS_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PCRS_CD);
						return true;
					}
					// 料金プランコード
					if (isNullBlank(op_svc_info.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PPLAN_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PPLAN_CD);
						return true;
					}
				}
			}
			// サブオプションサービスリスト
			ArrayList<HashMap<String, Object>> sbop_svc_list =
				(ArrayList<HashMap<String, Object>>)svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST);
			if (sbop_svc_list == null)
			{
				printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST);
				return true;
			}
			else
			{
				Iterator<HashMap<String, Object>> ite1 = sbop_svc_list.iterator();
				while (ite1.hasNext())
				{
					prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST + "-";
					HashMap<String, Object> sbop_svc_info = ite1.next();
					// サブオプションサービスコード
					if (isNullBlank(sbop_svc_info.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.SBOP_SVC_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.SBOP_SVC_CD);
						return true;
					}
					// 料金コースコード
					if (isNullBlank(sbop_svc_info.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PCRS_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PCRS_CD);
						return true;
					}
					// 料金プランコード
					if (isNullBlank(sbop_svc_info.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PPLAN_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PPLAN_CD);
						return true;
					}
				}
			}
			// 請求オプションサービスリスト
			ArrayList<HashMap<String, Object>> seiopsvc_list =
				(ArrayList<HashMap<String, Object>>)svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST);
			if (seiopsvc_list == null)
			{
				printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST);
				return true;
			}
			else
			{
				Iterator<HashMap<String, Object>> ite1 = seiopsvc_list.iterator();
				while (ite1.hasNext())
				{
					prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST + "-";
					HashMap<String, Object> seiopsvc_info = ite1.next();
					// 請求オプションサービスコード
					if (isNullBlank(seiopsvc_info.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.SEIOPSVC_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.SEIOPSVC_CD);
						return true;
					}
					// 料金コースコード
					if (isNullBlank(seiopsvc_info.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PCRS_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PCRS_CD);
						return true;
					}
					// 料金プランコード
					if (isNullBlank(seiopsvc_info.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PPLAN_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PPLAN_CD);
						return true;
					}
				}
			}
			// 機器提供サービスリスト
			ArrayList<HashMap<String, Object>> kktk_svc_list =
				(ArrayList<HashMap<String, Object>>)svc_info.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST);
			if (kktk_svc_list == null)
			{
				printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST);
				return true;
			}
			else
			{
				Iterator<HashMap<String, Object>> ite1 = kktk_svc_list.iterator();
				while (ite1.hasNext())
				{
					prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST + "-";
					HashMap<String, Object> kktk_svc_info = ite1.next();
					// 機器提供サービスコード
					if (isNullBlank(kktk_svc_info.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SVC_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SVC_CD);
						return true;
					}
					// 料金コースコード
					if (isNullBlank(kktk_svc_info.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PCRS_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PCRS_CD);
						return true;
					}
					// 料金プランコード
					if (isNullBlank(kktk_svc_info.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PPLAN_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PPLAN_CD);
						return true;
					}
					// 機器提供種別コード
					if (isNullBlank(kktk_svc_info.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SBT_CD)))
					{
						printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SBT_CD);
						return true;
					}
				}
			}
		}
		// 割引サービスコードリスト
		ArrayList<HashMap<String, Object>> wrib_svc_cd_list =
			(ArrayList<HashMap<String, Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST);
		if (wrib_svc_cd_list == null)
		{
			printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST);
			return true;
		}
		else
		{
			Iterator<HashMap<String, Object>> ite1 = wrib_svc_cd_list.iterator();
			while (ite1.hasNext())
			{
				prefix = KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST + "-";
				HashMap<String, Object> wri_svc_cd_info = ite1.next();
				// 割引サービスコード
				if (isNullBlank(wri_svc_cd_info.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD)))
				{
					printlnEjbLog(NULL_ERR_MSG + prefix + KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD);
					return true;
				}
			}
		}

		printlnEjbLog("入力パラメータチェックＯＫ");
		return errFlg;
	}
	
	/**
	 * チェックメイン処理
	 * 
	 * @param inMap
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> chkMainWribSvc(HashMap<String, Object> commonInfo) throws Throwable 
	{
		// 割引サービス成立条件合致リスト
		ArrayList<HashMap<String, Object>> matchWribSvcList = new ArrayList<HashMap<String, Object>>();
		
		//-------------------------------------------------
		// 割引登録条件コードのパターンでグループ分け
		//-------------------------------------------------
		ArrayList<HashMap<String, Object>> allSvcGrpList = makeSvcGrpList(commonInfo);
		
		//-------------------------------------------------
		// 割引サービスリスト作成
		//-------------------------------------------------
		ArrayList<HashMap<String, Object>> wribSvcList = searchWribSvc(commonInfo);
		
		int index1 = 0;
		Iterator<HashMap<String, Object>> ite_wribSvcList = wribSvcList.iterator();
		// 適用対象の割引サービスを取得
		while (ite_wribSvcList.hasNext())
		{
			index1++;
			// 成立条件合致サービスグループリスト
			ArrayList<HashMap<String, Object>> matchWribSvcGrpList = new ArrayList<HashMap<String,Object>>();
			
			HashMap<String, Object> wribSvcMap = ite_wribSvcList.next();
			String wribSvcCd = (String)wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_CD);
			
			//-------------------------------------------------
			// 申込形態コードチェック
			//-------------------------------------------------
			if (!chkGetAplyInfo(commonInfo, wribSvcMap, getSerial(index1, wribSvcList.size())))
			{
				continue;
			}
			
			//-------------------------------------------------
			// 割引サービス対象サービス条件チェック
			//-------------------------------------------------
			// @ 現在処理対象の割引サービスの割引登録条件コードと同じグループのサービスグループリストを取得
			ArrayList<HashMap<String, Object>> svcGrpList = 
				getSvcGrpList(allSvcGrpList, (String)wribSvcMap.get(WRIB_ADD_JOKEN_CD));
			
			// A 割引サービスに紐付く割引サービス対象サービスを取得
			ArrayList<HashMap<String, Object>> wribTgSvcList = searchWrisvcTgSvc(wribSvcCd, getSerial(index1, svcGrpList.size()));
			
			Iterator<HashMap<String, Object>> ite_svcGrpList = svcGrpList.iterator();
			// @のサービスグループリストでループ
			while (ite_svcGrpList.hasNext())
			{
				// @のサービスグループリストの要素（サービスリスト）を取得
				HashMap<String, Object> svcGrpInfoMap = ite_svcGrpList.next();
				
				// Aの割引サービス対象サービスリストでループ
				Iterator<HashMap<String, Object>> ite_wribTgSvcList = wribTgSvcList.iterator();
				while (ite_wribTgSvcList.hasNext())
				{
					HashMap<String, Object> wribTgSvcMap = ite_wribTgSvcList.next();
					
					// 割引サービス対象サービス合致サービスリスト
					ArrayList<HashMap<String, Object>> wribMatchList = new ArrayList<HashMap<String,Object>>();
					
					// B サービスリストを取得
					ArrayList<HashMap<String, Object>> svcList = (ArrayList<HashMap<String, Object>>)svcGrpInfoMap.get(SVC_LIST);
					
					// Bのサービスリストでループ
					Iterator<HashMap<String, Object>> ite_svcList = svcList.iterator();
					while (ite_svcList.hasNext())
					{
						HashMap<String, Object> svcInfoMap = ite_svcList.next();
						
						//--------------------------------
						// 各種サービスコードチェック
						//--------------------------------
						chkVariSvcCd(wribTgSvcMap, svcInfoMap, wribMatchList);
					}
					
					//-------------------------------------------------
					// 割引サービス対象サービス合致サービス数チェック
					//-------------------------------------------------
					if (!JKKWrisvcDchskmCommonUtil.chkTrgtKeiSvcCnt(wribTgSvcMap, wribMatchList.size()))
					{
						wribMatchList.clear();
					}
					wribTgSvcMap.put(JKKWrisvcDchskmCommonUtil.TRGT_KEI_SVC_KEI_CNT, wribMatchList.size());
				}
				
				//-------------------------------------------------
				// 適用条件コードチェック
				//-------------------------------------------------
				if (JKKWrisvcDchskmCommonUtil.chkAplyJokenCd(wribSvcMap, wribTgSvcList))
				{
					/* 成立条件合致サービスグループリストに追加 */
					// 成立条件合致サービスグループ情報作成
					HashMap<String, Object> matchWribSvcGrpMap = new HashMap<String, Object>();
					matchWribSvcGrpMap.put(GRP_NUMBER, svcGrpInfoMap.get(GRP_NUMBER));
					matchWribSvcGrpMap.put(CHK_WRIB_SVC_TGT_SVC_LIST, wribTgSvcList);
					
					matchWribSvcGrpList.add(matchWribSvcGrpMap);
				}
			}
			
			//-------------------------------------------------
			// 併用可否チェック用にリストを作成
			//-------------------------------------------------
			if (matchWribSvcGrpList.isEmpty()) {
				
				printlnEjbLog("各種サービスコードチェックＮＧ【" + wribSvcCd + "】");
				
			} else {
				
				// 割引サービス成立条件合致情報
				HashMap<String, Object> matchWribSvcMap = new HashMap<String, Object>();
				
				// 割引サービスの設定内容をコピー
				dataCopy(matchWribSvcMap, wribSvcMap);
				
				// 成立条件合致サービスグループリスト
				matchWribSvcMap.put(MATCH_WRIB_SVC_GRP_LIST, matchWribSvcGrpList);
				
				matchWribSvcList.add(matchWribSvcMap);
			}
		}
		
		//-------------------------------------------------
		// 併用可否チェック
		//-------------------------------------------------
		ArrayList<HashMap<String, Object>> dojiOKList = jdgDojiAplyKh(matchWribSvcList);
		
		return dojiOKList;
	}
	
	/**
	 * 返却用割引サービス単価リスト作成
	 * 
	 * @param dojiOKList
	 * @return
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> makeWribSvcTankList(ArrayList<HashMap<String, Object>> dojiOKList) throws Throwable
	{
		ArrayList<HashMap<String, Object>> wrib_svc_list = new ArrayList<HashMap<String,Object>>();
		
		int index = 0;
		Iterator<HashMap<String, Object>> ite = dojiOKList.iterator();
		while (ite.hasNext())
		{
			HashMap<String, Object> matchWribSvcMap = ite.next();
			
			// 割引サービスコード
			String wribSvcCd = (String)matchWribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_CD);

			// 割引サービス単価一覧照会サービスIF呼出
			ArrayList<HashMap<String, Object>> list = 
				getMapper().callWrisvcTankaShokai(wribSvcCd, FUNC_1, getSerial(index, dojiOKList.size()));
			if (list.isEmpty())
			{
				// 単価情報が取得できない場合は出力しない
				continue;
			}
			
			/*
			 * 割引サービス情報
			 */
			HashMap<String, Object> wribSvcInfo = new HashMap<String, Object>();

			// 通番
			wribSvcInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_INFO.NO, String.valueOf(++index));
			// 割引サービスコード
			wribSvcInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_INFO.WRIB_SVC_CD, wribSvcCd);
			// 割引サービス名
			wribSvcInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_INFO.WRIB_SVC_NM,
					matchWribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_NM));
			
			/*
			 * 割引サービス単価情報
			 */
			ArrayList<HashMap<String, Object>> tankaList = new ArrayList<HashMap<String,Object>>();

			Iterator<HashMap<String, Object>> ite1 = list.iterator();
			while (ite1.hasNext())
			{
				// 割引サービス単価情報
				HashMap<String, Object> tankaInfo = ite1.next();

				HashMap<String, Object> wribSvcTankaInfo = new HashMap<String, Object>();
				// 割引サービス単価番号
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_SVC_TANKA_NO,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_SVC_TANKA_NO));
				// 割引種別コード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_SBT_CD, 
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_SBT_CD));
				// サービスコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SVC_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SVC_CD));
				// 料金グループコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PRC_GRP_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PRC_GRP_CD));
				// 料金コースコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PCRS_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PCRS_CD));
				// 料金プランコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PPLAN_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PPLAN_CD));
				// オプションサービスコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.OP_SVC_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.OP_SVC_CD));
				// サブオプションサービスコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SBOP_SVC_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SBOP_SVC_CD));
				// 機器提供オプションコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.KKTK_SVC_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.KKTK_SVC_CD));
				// 請求オプションサービスコード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SEIOPSVC_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.SEIOPSVC_CD));
				// 料金項目コード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PRC_KMK_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.PRC_KMK_CD));
				// 割引適用優先度コード
				wribSvcTankaInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_APLY_PRIORITY_CD,
						tankaInfo.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_TANKA_INFO.WRIB_APLY_PRIORITY_CD));
				
				tankaList.add(wribSvcTankaInfo);
			}
			// 割引サービス単価リスト
			wribSvcInfo.put(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_INFO.WRIB_SVC_TANKA_LIST, tankaList);
			// 割引サービスリストへ追加
			wrib_svc_list.add(wribSvcInfo);
		}
		printlnEjbLog("返却用割引サービスリスト【" + wrib_svc_list + "】");
		return wrib_svc_list;
	}
	
	/**
	 * 併用可否チェック
	 * 
	 * @param matchWribSvcList
	 * @return
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> jdgDojiAplyKh(ArrayList<HashMap<String, Object>> matchWribSvcList) throws Throwable
	{
		printlnEjbLog("併用可否チェック開始 対象割引サービスリスト【" + matchWribSvcList + "】");
		
		// 割引サービス相関チェック条件マスタ全件取得
		ArrayList<HashMap<String, Object>> rulePatternList = searchWrisvcSoukan();
		
		ArrayList<HashMap<String, Object>> dojiOKList =
			JKKWrisvcDchskmCommonUtil.jdgDojiAplyKh(matchWribSvcList, new ArrayList<HashMap<String,Object>>(), rulePatternList);
		
		printlnEjbLog("併用可否チェック終了 対象割引サービスリスト【" + dojiOKList + "】");
		
		return dojiOKList;
	}

	/**
	 * 申込形態コードチェック
	 * 
	 * @param commonInfo 作業領域
	 * @param wribSvcMap サービス情報．割引サービスコード
	 * @param serial SCマップ連番
	 * @return
	 * @throws Throwable
	 */
	private boolean chkGetAplyInfo(	HashMap<String, Object> commonInfo,
										HashMap<String, Object> wribSvcMap,
										String serial) throws Throwable
	{
		String wribSvcCd = (String)wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_CD);
		
		// 割引サービス適用条件一覧照会サービスIF呼出
		ArrayList<HashMap<String, Object>> wrisvcDchskmAplyJknList = getMapper().callWribAplyInfo(commonInfo, wribSvcCd, FUNC_1, serial);
		
/* ++++++++++ v4.00.00 mod start       ++++++++++ */
		
		// 不要な割引サービス適用条件一覧を除外
		editAplyInfo(wrisvcDchskmAplyJknList);
		
/* ++++++++++ v4.00.00 mod end         ++++++++++ */
		
		if (wrisvcDchskmAplyJknList.isEmpty())
		{
			printlnEjbLog("申込形態コードチェック結果【マスタ設定無し−OK】【" + wribSvcCd + "】");
			return true;
		}
		
		for (HashMap<String, Object> mapWrisvcDchskmAplyJkn : wrisvcDchskmAplyJknList) 
		{
			/* --------------------------------------------------------------------------------
			 * 割引サービス適用条件チェック
			 * -------------------------------------------------------------------------------- */
			String aplyCndMksmFormCd = (String) mapWrisvcDchskmAplyJkn.get(KKSV0553_KKSV0553OP_KKSV055303SC_EKK2311B002CBSMsg1List.WRSV_APLY_JKN_VALUE_1);
			if (commonInfo.get(KKSV0553_KKSV0553OP_WORK.MSKM_FORM_CD).equals(aplyCndMksmFormCd))
			{
				// 申込形態コードが一致の場合、チェックOKとしチェック処理を終了する。
				printlnEjbLog("申込形態コードチェック結果【マスタ設定有り−該当有り】【" + wribSvcCd + "】");
				return true;
			}
		}
		
		printlnEjbLog("申込形態コードチェック結果【マスタ設定有り−該当無し】【" + wribSvcCd + "】");
		return false;
	}

/* ++++++++++ v4.00.00 mod start       ++++++++++ */
	/**
	 * 
	 * <dl>
	 * <dt>処理概要:
	 * <dd>不要な割引サービス適用条件一覧を除外する.<br>
	 * 
	 * <dt>処理補足:
	 * <dd>適用条件種別が[01：申込形態]以外を除外対象とする.
	 * </dl>
	 * 
	 * @param aplyJknList 割引サービス適用条件一覧
	 */
	private void editAplyInfo(ArrayList<HashMap<String, Object>> aplyJknList) {
		
		printlnEjbLog("適用条件除外前【" + aplyJknList + "】");
		
		for (int i = 0; i < aplyJknList.size(); i++) {
			if (!WRSV_APLY_JKN_SBT_CD_MSKM.equals(
					aplyJknList.get(i).get(KKSV0553_KKSV0553OP_KKSV055303SC_EKK2311B002CBSMsg1List.WRSV_APLY_JKN_SBT_CD))) {
				
				aplyJknList.remove(i);
				i--;
			}
		}
		
		printlnEjbLog("適用条件除外後【" + aplyJknList + "】");
	}
	
/* ++++++++++ v4.00.00 mod end         ++++++++++ */
	
	/**
	 * データコピー
	 * 
	 * @param matchSvcGrpMap
	 * @param wribSvcMap
	 */
	private void dataCopy(HashMap<String, Object> matchSvcGrpMap, HashMap<String, Object> wribSvcMap)
	{
		// 割引サービスコード
		matchSvcGrpMap.put(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_CD, wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_CD));
		// 割引タイプコード
		matchSvcGrpMap.put(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_TYPE_CD, wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_TYPE_CD));
		// 割引サービス名
		matchSvcGrpMap.put(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_NM, wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_SVC_NM));
		// 割引サービス／データ抽出項目識別フラグ（割引サービス）
		matchSvcGrpMap.put(WRIB_DCHS_SKBT_FLAG, WRIB_DCHS_SKBT_FLAG_WRIB);
	}
	
	/**
	 * 割引サービス対象サービスの対象設定特定
	 * 
	 * @param wribTgSvcMap
	 * @return
	 */
	private WRIB decideWribSvcTgt(HashMap<String, Object> wribTgSvcMap)
	{
		String svcCd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SVC_CD);
		String opSvcCd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.OP_SVC_CD);
		String sbopSvcDd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SBOP_SVC_CD);
		String kktkSvcCd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.KKTK_SVC_CD);
		String seiopsvcCd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SEIOPSVC_CD);
		
		// サービスコードが設定有り
		if (!isNullSpace(svcCd))
		{
			return WRIB.SVC;
		}
		// オプションサービスコードが設定有り
		else if (!isNullSpace(opSvcCd))
		{
			return WRIB.OP_SVC;
		}
		// サブオプションサービスコードが設定有り
		else if (!isNullSpace(sbopSvcDd))
		{
			return WRIB.SBOP_SVC;
		}
		// 機器提供サービスコードが設定有り
		else if (!isNullSpace(kktkSvcCd))
		{
			return WRIB.KKTK_SVC;
		}
		// 請求オプションサービスコードが設定有り
		else if (!isNullSpace(seiopsvcCd))
		{
			return WRIB.SEI_OP_SVC;
		}
		// いずれも設定無し
		else
		{
			return WRIB.SVC_UCWK;
		}
	}
	
	/**
	 * 各種サービスコードチェック
	 * 
	 * @param wribTgSvcMap
	 * @param svcInfoMap
	 * @param wribMatchList
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void chkVariSvcCd(	HashMap<String, Object> wribTgSvcMap,
								HashMap<String, Object> svcInfoMap,
								ArrayList<HashMap<String, Object>> wribMatchList) throws Exception
	{
		String m_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SVC_CD);
		String m_prc_grp_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PRC_GRP_CD);
		String m_pcrs_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PCRS_CD);
		String m_pplan_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PPLAN_CD);
		String m_op_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.OP_SVC_CD);
		String m_sbop_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SBOP_SVC_CD);
		String m_kktk_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.KKTK_SVC_CD);
		String m_seiopsvc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SEIOPSVC_CD);
		String m_kktk_sbt_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.KKTK_SBT_CD);
		String svc_cd = null;
		String prc_grp_cd = null;
		String pcrs_cd = null;
		String pplan_cd = null;
		String op_svc_cd = null;
		String sbop_svc_cd = null;
		String kktk_svc_cd = null;
		String kktk_sbt_cd = null;
		String seiopsvc_cd = null;
		
		// 割引サービス対象サービスの対象設定を特定する
		switch (decideWribSvcTgt(wribTgSvcMap)) {
		
		//-------------------
		// サービス
		//-------------------
		case SVC:
			printlnEjbLog("割引サービス対象サービスの対象【サービス】" );
			svc_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SVC_CD);
			prc_grp_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PRC_GRP_CD);
			pcrs_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD);
			pplan_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD);
			
			// サービス・料金グループ・料金コース・料金プランが設定有り
			if (!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
			{
				// サービス・料金グループ・料金コース・料金プランが同じ
				if (m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
			}
			// サービス・料金グループ・料金コースが設定有り
			else if (!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
			{
				// サービス・料金グループ・料金コースが同じ
				if (m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd) && m_pcrs_cd.equals(pcrs_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
			}
			// サービス・料金グループが設定有り
			else if (!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
			{
				// サービス・料金グループが同じ
				if (m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
				
			}
			// サービスが設定有り
			else if (!isNullSpace(m_svc_cd) && isNullSpace(m_prc_grp_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
			{
				// サービスが同じ
				if (m_svc_cd.equals(svc_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
			}
			break;
			
		//-------------------
		// サービス内訳
		//-------------------
		case SVC_UCWK:
			printlnEjbLog("割引サービス対象サービスの対象【サービス内訳】" );
			pcrs_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD);
			pplan_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD);
			// 料金コース・料金プランが設定有り
			if (!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
			{
				// 料金コース・料金プランが同じ
				if (m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
				
			// 料金コースが設定有り
			} else if (!isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
			{
				// 料金コースが同じ
				if (m_pcrs_cd.equals(pcrs_cd))
				{
					wribMatchList.add(svcInfoMap);
				}
			}
			break;

		//---------------------------
		// オプションサービス
		//---------------------------

		case OP_SVC:
			printlnEjbLog("割引サービス対象サービスの対象【オプションサービス】" );
			ArrayList<HashMap<String, Object>> list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST);
			for (int i = 0; i < list.size(); i++)
			{
				HashMap<String, Object> opSvcMap = list.get(i);
				op_svc_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.OP_SVC_CD);
				pcrs_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PCRS_CD);
				pplan_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PPLAN_CD);
				
				// オプションサービス・料金コース・料金プランが設定有り
				if (!isNullSpace(m_op_svc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
				{
					// オプションサービス・料金コース・料金プランが同じ
					if (m_op_svc_cd.equals(op_svc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// オプションサービス・料金コースが設定有り
				else if (!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// オプションサービス・料金コースが同じ
					if (m_op_svc_cd.equals(op_svc_cd) && m_pcrs_cd.equals(pcrs_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// オプションサービスが設定有り
				else if (!isNullSpace(op_svc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// オプションサービスが同じ
					if (m_op_svc_cd.equals(op_svc_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
			}
			break;

		//---------------------------
		// サブオプションサービス
		//---------------------------
		case SBOP_SVC:
			printlnEjbLog("割引サービス対象サービスの対象【サブオプションサービス】" );
			list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST);
			for (int i = 0; i < list.size(); i++)
			{
				HashMap<String, Object> sbOpSvcMap = list.get(i);
				sbop_svc_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.SBOP_SVC_CD);
				pcrs_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PCRS_CD);
				pplan_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PPLAN_CD);
				
				// サブオプションサービス・料金コース・料金プランが設定有り
				if (!isNullSpace(m_sbop_svc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
				{
					// サブオプションサービス・料金コース・料金プランが同じ
					if (m_sbop_svc_cd.equals(sbop_svc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// サブオプションサービス・料金コースが設定有り
				else if (!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// サブオプションサービス・料金コースが同じ
					if (m_sbop_svc_cd.equals(sbop_svc_cd) && m_pcrs_cd.equals(pcrs_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// サブオプションサービスが設定有り
				else if (!isNullSpace(m_sbop_svc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// サブオプションサービスが同じ
					if (m_sbop_svc_cd.equals(sbop_svc_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
			}
			break;

		//---------------------------
		// 機器提供サービス
		//---------------------------
		case KKTK_SVC:
			printlnEjbLog("割引サービス対象サービスの対象【機器提供サービス】" );
			list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST);
			for (int i = 0; i < list.size(); i++)
			{
				HashMap<String, Object> kktkSvcMap = list.get(i);
				kktk_svc_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SVC_CD);
				kktk_sbt_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SBT_CD);
				pcrs_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PCRS_CD);
				pplan_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PPLAN_CD);
				
				// 機器提供サービス・機器提供種別・料金コース・料金プランが設定有り
				if (!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd)  && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
				{
					// 機器提供サービス・機器提供種別・料金コース・料金プランが同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 機器提供サービス・機器提供種別・料金コースが設定有り
				else if (!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd)  && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 機器提供サービス・機器提供種別・料金コースが同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd) && m_pcrs_cd.equals(pcrs_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 機器提供サービス・料金コース・料金プランが設定有り
				else if (!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd)  && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
				{
					// 機器提供サービス・料金コース・料金プランが同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd)&& m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 機器提供サービス・料金コースが設定有り
				else if (!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd)  && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 機器提供サービス・料金コースが同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd)&& m_pcrs_cd.equals(pcrs_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 機器提供サービス・機器提供種別が設定有り
				else if (!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd)  && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 機器提供サービス・機器提供種別が同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 機器提供サービスが設定有り
				else if (!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd)  && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 機器提供サービスが同じ
					if (m_kktk_svc_cd.equals(kktk_svc_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
			}
			break;

		//---------------------------
		// 請求オプションサービス
		//---------------------------
		case SEI_OP_SVC:
			printlnEjbLog("割引サービス対象サービスの対象【請求オプションサービス】" );
			list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST);
			for (int i = 0; i < list.size(); i++)
			{
				HashMap<String, Object> seiOpSvcMap = list.get(i);
				seiopsvc_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.SEIOPSVC_CD);
				pcrs_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PCRS_CD);
				pplan_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PPLAN_CD);
				
				// 請求オプションサービス・料金コース・料金プランが設定有り
				if (!isNullSpace(m_seiopsvc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd))
				{
					// 請求オプションサービス・料金コース・料金プランが同じ
					if (m_seiopsvc_cd.equals(seiopsvc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 請求オプションサービス・料金コースが設定有り
				else if (!isNullSpace(m_seiopsvc_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 請求オプションサービス・料金コースが同じ
					if (m_seiopsvc_cd.equals(seiopsvc_cd) && m_pcrs_cd.equals(pcrs_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
				// 請求オプションサービスが設定有り
				else if (!isNullSpace(m_seiopsvc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd))
				{
					// 請求オプションサービスが同じ
					if (m_seiopsvc_cd.equals(seiopsvc_cd))
					{
						wribMatchList.add(svcInfoMap);
						break;
					}
				}
			}
			break;
		}
		return;
	}
	
	/**
	 * 予め作成していた割引登録条件コードでグループ分けしたリスト群から
	 * 指定された割引登録条件コードに該当するリストを返却する
	 * 
	 * @param svcGrpList
	 * @param wribAdJokenCd
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> getSvcGrpList(ArrayList<HashMap<String, Object>> svcGrpList, String wribAdJokenCd)
	{
		Iterator<HashMap<String, Object>> ite = svcGrpList.iterator();
		while (ite.hasNext())
		{
			HashMap<String, Object> map = ite.next();
			// 割引登録条件コードに該当するリストを返却
			if (wribAdJokenCd.equals(map.get(WRIB_ADD_JOKEN_CD)))
			{
				ArrayList<HashMap<String, Object>> list = (ArrayList<HashMap<String, Object>>) map.get(SVC_GRP_LIST);
				printlnEjbLog("割引登録条件コード該当グループリスト【" + list + "】");
				return list;
			}
		}
		return null;
	}
	
	/**
	 * 適用対象となる割引サービスのリストを作成する
	 * 
	 * @param commonInfo
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> searchWribSvc(HashMap<String, Object> commonInfo) throws Throwable
	{
		//------------------------------------------------
		// 自動適用分の割引サービスコードを全件取得
		//------------------------------------------------
		// 割引サービス一覧照会（基準年月日）サービスIF呼出
		ArrayList<HashMap<String, Object>> wrisvcList = getMapper().callWribSvcIcrnShokai(commonInfo, FUNC_1);
		
		printlnEjbLog("割引サービスリスト【" + wrisvcList + "】");
		
/* v4.00.01 add start           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
		
		// 返却対象外となるCP除外
		delCpInf(wrisvcList);
		
/* v4.00.01 add end             ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
		
		//------------------------------------------------
		// 即割、もしくはファミリーパックの指定有の場合
		//------------------------------------------------
		ArrayList<HashMap<String, Object>> sokuwariFamilyList = null;
		if (isSokuwariON(commonInfo) || isFamilyPackON(commonInfo))
		{
			// 割引サービス一覧照会（基準年月日）サービスIF呼出
			sokuwariFamilyList = getMapper().callWribSvcIcrnShokai2(commonInfo, FUNC_1);
		}
		//------------------------------------------------
		// 即割の割引サービスコードを設定
		//------------------------------------------------
		if (isSokuwariON(commonInfo))
		{
			for (HashMap<String, Object> wribSvcMap : sokuwariFamilyList)
			{
				String wribTypeCd = (String)wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRISVC.WRIB_TYPE_CD);
				String wribSvcCd = (String)wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD);
				if (SOKUWARI.equals(wribTypeCd) && !isContains(wrisvcList, wribSvcCd))
				{
					wrisvcList.add(wribSvcMap);
				}
			}
		}
		
		//------------------------------------------------
		// ファミリーパックの割引サービスコードを設定
		//------------------------------------------------
		if (isFamilyPackON(commonInfo))
		{
			for (HashMap<String, Object> wribSvcMap : sokuwariFamilyList)
			{
				String wribSvcCd = (String)wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD);
				if (FAMILYPACK_WRIB_SVC.equals(wribSvcCd) && !isContains(wrisvcList, wribSvcCd))
				{
					wrisvcList.add(wribSvcMap);
					break;
				}
			}
		}
		
		//------------------------------------------------
		// I/Fに設定された割引サービスコードも対象に加える
		//------------------------------------------------
		ArrayList<HashMap<String, Object>> wribSvcCdList =
			(ArrayList<HashMap<String, Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST);
		for (HashMap<String, Object> wribSvcCdMap : wribSvcCdList)
		{
			String wribSvcCd = (String)wribSvcCdMap.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD);
			HashMap<String, Object> wribSvcMap = getMapper().callWribSvcUniqShokai(commonInfo, wribSvcCd, FUNC_2);
			if (wribSvcMap != null && !isContains(wrisvcList, wribSvcCd)) {
				wrisvcList.add(wribSvcMap);
			}
		}
		
		printlnEjbLog("自動適用対象割引サービスリスト（入力データ割引サービスコード含む）【" + wrisvcList + "】");
		
		return wrisvcList;
	}
	
	/**
	 * 割引サービスコードがリストに設定済みかどうかを判定
	 * 
	 * @param wribSvcCdList
	 * @param wribSvcCd
	 * @return
	 */
	private boolean isContains(ArrayList<HashMap<String, Object>> wribSvcCdList, String wribSvcCd)
	{
		for (HashMap<String, Object> wribSvcMap : wribSvcCdList)
		{
			// 割引サービスコードが設定されたマップがリストに存在する
			if (wribSvcCd.equals(wribSvcMap.get(KKSV0553_KKSV0553OP_WORK_WRIB_SVC_CD_INFO.WRIB_SVC_CD)))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 即割が指定されているかどうか判定する
	 * 
	 * @param commonInfo
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private boolean isSokuwariON(HashMap<String, Object> commonInfo)
	{
		ArrayList<HashMap<String, Object>> svcInfoList =
			(ArrayList<HashMap<String, Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST);
		for (HashMap<String, Object> svcInfo : svcInfoList)
		{
			if (SOKUWARI_ON.equals(svcInfo.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SOKUWARI_UM)))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * ファミリーパックが指定されているかどうか判定する
	 * 
	 * @param commonInfo
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private boolean isFamilyPackON(HashMap<String, Object> commonInfo)
	{
		ArrayList<HashMap<String, Object>> svcInfoList =
			(ArrayList<HashMap<String, Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST);
		for (HashMap<String, Object> svcInfo : svcInfoList)
		{
			if (FAMILYPACK_ON.equals(svcInfo.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.FAMILY_PACK_UM)))
			{
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 割引サービスマップ<code>inMapWrisvc</code>に紐づく、
	 * 割引サービス対象サービスを検索します。<BR>
	 * <BR>
	 * 検索条件は以下の通りです。<BR>
	 * ・オンライン運用日付時点で有効なレコードであること。<BR>
	 * ・割引サービス.割引サービスコードに紐づくレコードであること。
	 * 
	 * @param wribSvcCd 割引サービスコード
	 * @param serial SCマップ連番
	 * 
	 * @return ArrayList<HashMap<String, Object>> 割引サービス対象サービスリスト
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> searchWrisvcTgSvc(	String wribSvcCd,
																	String serial) throws Throwable
	{
		// 割引サービス対象サービス一覧照会サービスIF呼出
		ArrayList<HashMap<String, Object>> wrisvcTgSvcList = getMapper().callWrisvcTgSvcIcrnShokai(wribSvcCd, FUNC_1, serial);
		printlnEjbLog("割引サービスコード【" + wribSvcCd + "】割引サービス対象サービスリスト【" + wrisvcTgSvcList + "】");
		
		return wrisvcTgSvcList;
	}
	
	/**
	 * 割引相関チェック条件マスタを検索します。<BR>
	 * <BR>
	 * 検索条件は以下の通りです。<BR>
	 * ・オンライン運用日付時点で有効なレコードであること。<BR>
	 * 
	 * @return ArrayList<HashMap<String, Object>> 割引サービス対象サービスリスト
	 * @throws Throwable
	 */
	private ArrayList<HashMap<String, Object>> searchWrisvcSoukan() throws Throwable
	{
		//  割引相関チェックマスタリスト
		ArrayList<HashMap<String, Object>> wrisvcTgSvcList = new ArrayList<HashMap<String,Object>>();
		
		for (int i = 0; i < WRIB_SOKAN_CKJK_SBT_CD.length; i++)
		{
			// 割引相関チェック条件一覧照会サービスIF呼出
			ArrayList<HashMap<String, Object>> list = 
				getMapper().callWrisvcSoukanIcrnShokai(FUNC_1, WRIB_SOKAN_CKJK_SBT_CD[i]);
			
			for (HashMap<String, Object> map : list)
			{
				wrisvcTgSvcList.add(map);
			}
		}
		return wrisvcTgSvcList;
	}
	
	/**
	 * 割引登録条件コードによるパターン別のグループ分けを行う
	 * 
	 * @param commonInfo
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> makeSvcGrpList(HashMap<String, Object> commonInfo)
	{
		//-----------------------------
		// サービス情報リスト 取得
		//-----------------------------
		ArrayList<HashMap<String, Object>> svcInfoList =
			(ArrayList<HashMap<String, Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST);
		
		//-------------------------------------------------
		// ユニークリスト作成
		//-------------------------------------------------
		// 請求契約番号
		ArrayList<String> seikyuKeyList = makeSeikyuList(svcInfoList);
		// サービス契約回線内訳番号
		ArrayList<String> kaisenKeyList = makeUtiwakeList(svcInfoList);
		
		int grpCnt1 = 0;
		ArrayList<HashMap<String, Object>> svcList = null;
		ArrayList<HashMap<String, Object>> svcGrpList = null;
		HashMap<String,Object> svcGrpInfoMap = null;
		HashMap<String, Object> svcGrpListInfoMap = null;
		ArrayList<HashMap<String, Object>> retList = new ArrayList<HashMap<String, Object>>();
		
		//------------------------------------------
		// 同じお客様
		//------------------------------------------
		svcGrpList = new ArrayList<HashMap<String,Object>>();
		svcList = new ArrayList<HashMap<String,Object>>();
		for (int i = 0, j = 0; i < svcInfoList.size(); i++ )
		{
			HashMap<String, Object> svcInfoMap = svcInfoList.get(i);
			svcInfoMap.put(SVC_NUMBER, j++);
			svcList.add(svcInfoMap);
		}
		svcGrpInfoMap = new HashMap<String, Object>();
		svcGrpInfoMap.put(GRP_NUMBER, grpCnt1++);
		svcGrpInfoMap.put(SVC_LIST, svcList);
		svcGrpList.add(svcGrpInfoMap);
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_JOKEN_NON);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_CUST);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		//------------------------------------------
		// 同じお客様、且つ同じ請求先
		//------------------------------------------
		svcGrpList = new ArrayList<HashMap<String,Object>>();
		for (int i = 0, j = 0, grpCnt2 = 0; i < seikyuKeyList.size(); i++ )
		{
			String key = seikyuKeyList.get(i);
			
			svcList = new ArrayList<HashMap<String,Object>>();
			Iterator<HashMap<String, Object>> ite = svcInfoList.iterator();
			while (ite.hasNext())
			{
				HashMap<String, Object> svcInfoMap = ite.next();
				if (key.equals(svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEKY_KEI_NO)))
				{
					svcInfoMap.put(SVC_NUMBER, j++);
					svcList.add(svcInfoMap);
				}
			}
			svcGrpInfoMap = new HashMap<String, Object>();
			svcGrpInfoMap.put(GRP_NUMBER, grpCnt2++);
			svcGrpInfoMap.put(SVC_LIST, svcList);
			svcGrpList.add(svcGrpInfoMap);
		}
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_SEI);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_CUST_SEI);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		//------------------------------------------
		// 同じお客様、且つ同じ回線
		//------------------------------------------
		svcGrpList = new ArrayList<HashMap<String,Object>>();
		for (int i = 0, j = 0, grpCnt3 = 0; i < kaisenKeyList.size(); i++ )
		{
			String key = kaisenKeyList.get(i);
			
			svcList = new ArrayList<HashMap<String,Object>>();
			Iterator<HashMap<String, Object>> ite = svcInfoList.iterator();
			while (ite.hasNext())
			{
				HashMap<String, Object> svcInfoMap = ite.next();
				if (key.equals(svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KAISEN_KEI_NO)))
				{
					svcInfoMap.put(SVC_NUMBER, j++);
					svcList.add(svcInfoMap);
				}
			}
			svcGrpInfoMap = new HashMap<String, Object>();
			svcGrpInfoMap.put(GRP_NUMBER, grpCnt3++);
			svcGrpInfoMap.put(SVC_LIST, svcList);
			svcGrpList.add(svcGrpInfoMap);
		}
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_KAISEN);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		//------------------------------------------
		// 同じお客様、且つ同じ請求先且つ同じ回線
		//------------------------------------------
		svcGrpList = new ArrayList<HashMap<String,Object>>();
		for (int i = 0, j = 0, grpCnt4 = 0; i < seikyuKeyList.size(); i++ )
		{
			String key1 = seikyuKeyList.get(i);
			
			for (int k = 0; k < kaisenKeyList.size(); k++ )
			{
				String key2 = kaisenKeyList.get(k);
				
				svcList = new ArrayList<HashMap<String,Object>>();
				Iterator<HashMap<String, Object>> ite = svcInfoList.iterator();
				while (ite.hasNext())
				{
					HashMap<String, Object> svcInfoMap = ite.next();
					if (key1.equals(svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEKY_KEI_NO))
							&& key2.equals(svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KAISEN_KEI_NO)))
					{
						svcInfoMap.put(SVC_NUMBER, j++);
						svcList.add(svcInfoMap);
					}
				}
				svcGrpInfoMap = new HashMap<String, Object>();
				svcGrpInfoMap.put(GRP_NUMBER, grpCnt4++);
				svcGrpInfoMap.put(SVC_LIST, svcList);
				svcGrpList.add(svcGrpInfoMap);
			}
		}
		
		svcGrpListInfoMap = new HashMap<String, Object>();
		svcGrpListInfoMap.put(WRIB_ADD_JOKEN_CD, WRIB_ADD_JOKEN_CD_SEI_KAISEN);
		svcGrpListInfoMap.put(SVC_GRP_LIST, svcGrpList);
		retList.add(svcGrpListInfoMap);
		
		return retList;
	}
	
	/**
	 * サービス情報リストから請求契約番号のユニークなリストを作成
	 * 
	 * @param svc_info_list
	 * @return
	 */
	private ArrayList<String> makeSeikyuList(ArrayList<HashMap<String, Object>> svc_info_list)
	{
		ArrayList<String> keyList = new ArrayList<String>();
		
		Iterator<HashMap<String, Object>> ite = svc_info_list.iterator();
		while (ite.hasNext())
		{
			String key = (String)ite.next().get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEKY_KEI_NO);
			if (!keyList.contains(key))
			{
				keyList.add(key);
			}
		}
		return keyList;
	}
	
	/**
	 * サービス情報リストからサービス契約回線内訳番号のユニークなリストを作成
	 * 
	 * @param svc_info_list
	 * @return
	 */
	private ArrayList<String> makeUtiwakeList(ArrayList<HashMap<String, Object>> svc_info_list)
	{
		ArrayList<String> keyList = new ArrayList<String>();
		
		Iterator<HashMap<String, Object>> ite = svc_info_list.iterator();
		while (ite.hasNext())
		{
			String key = (String)ite.next().get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KAISEN_KEI_NO);
			if (!keyList.contains(key))
			{
				keyList.add(key);
			}
		}
		return keyList;
	}
	
	/**
	 * リストサイズでゼロ埋めした数値の文字列を返却
	 * 
	 * @param index
	 * @param listSize
	 * @return
	 */
	private String getSerial(int index, int listSize)
	{
		return String.format("%0" + String.valueOf(listSize).length() + "d", index);
	}
	
	/**
	 * null又は半角スペースのみの場合はtrue、そうでない場合はfalse
	 * 
	 * @param chkstr
	 * @return
	 */
	private boolean isNullSpace(String chkstr)
	{
		if (chkstr == null || chkstr.trim().equals(""))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * null又は空文字の場合はtrue、そうでない場合はfalse
	 * 
	 * @param chkstr
	 * @return
	 */
	private boolean isNullBlank(Object chkstr)
	{
		if (chkstr == null || chkstr.equals(""))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * デバッグログを出力します。<BR>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	/**
	 * スレッドローカルに保存したマッパーを返却する。
	 * 
	 * @return
	 */
	private JKKPrcSimulationCCMapper getMapper()
	{
// v4.00.02 MOD START
//		return ccMapper.get();
		return this.ccMapper;
// v4.00.02 MOD END
	}
/* v4.00.01 add start           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
	/**
	 * 
	 * 返却対象外CP除去処理
	 * 
	 * @param 
	 * @param 
	 * @return
	 * @throws Throwable 
	 */
	private void delCpInf(ArrayList<HashMap<String, Object>> tgList) throws Throwable {
		
		// 割引
		final String actParamKeyWrib   = "KK_PRCSML_RTNTG_WRIB";
		final String actParamKeyCp     = "KK_PRCSML_RTNTG_CP";
		final String comWriSvcCdWrib   = EKK0841B003CBSMsg1List.WRIB_SVC_CD;
		final List<String> delListWrib = Arrays.asList(getActParam(FUNC_1, actParamKeyWrib));
		final List<String> delListCp   = Arrays.asList(getActParam(FUNC_1, actParamKeyCp));
		
		// 料金シミュ返却対象外（独自仕様）はここで除外.
		for(int i = 0; i < tgList.size(); i++) {
			
			HashMap<String, Object> map = tgList.get(i);
			
			String tgCd = (String) map.get(comWriSvcCdWrib);
			if (!delListWrib.contains(tgCd) && !delListCp.contains(tgCd)) {
				// 業務パラメータから取得した割引サービスコードに該当しない場合に除外する
				printlnEjbLog("除外対象割引サービスコード：" + tgCd);
				tgList.remove(i); i--;
			}
		}
	}
	
	/**
	 * 
	 * 業務パラメータを取得し,返却する.
	 * 
	 * @param  ccMap
	 * @param  funcCd
	 * @param  key
	 * @return 業務パラメータ
	 * @throws Throwable 
	 * 
	 */
	private String[] getActParam(String funcCd, String key) throws Throwable {
		
		final String splitStr = ",";
		final String paraKey  = KKSV0553_KKSV0553OP_KKSV055307SC_EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE;
		
		// 業務パラメタ取得
		HashMap<String, Object> ezm0321A010 = getMapper().callEZM0321A010ToAll(funcCd, key);
		String paraNm                       = (String) ezm0321A010.get(paraKey);
		
		return paraNm.split(splitStr);
	}
/* v4.00.01 add end             ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
}
