/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUFamipaYudoHanteiCC
*   ソースファイル名：JFUFamipaYudoHanteiCC.java
*   作成者          ：富士通
*   日付            ：2011年10月24日
*＜機能概要＞
*   ファミリーパック誘導要否判定CC コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v26.00.00    2016/08/22   FJ) 美濃原    新規作成【ANK-2878-00-00】（客A)オプション申込時のファミリーパック促し
*   v26.00.00    2016/09/29   FJ) 美濃原    障害対応【OM-2016-0002164】
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

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.ErrorLevel;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.bpm.parameter.StatusArea;
import com.fujitsu.futurity.bp.x21.bpm.parameter.StatusInfo;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.values.OUTBREAK_AREA;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JFUCommonUtil;
import eo.ejb.cbs.cbsmsg.EAC0281B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EAC0281B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0021B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021B001CBSMsgList;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B502CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B502CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B503CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B503CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0401B501CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0401B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B506CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0601B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0601B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0811A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1881B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1881B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2811B503CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2811B503CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg1List;

/**
 * ファミリーパック誘導要否判定CC コモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
public class JFUFamipaYudoHanteiCC extends AbstractCommonComponent
{
	// 金額集計用マップ項目名
	/** [契約件数]メールアドレス */
	private static final String MAIL_ADD_CNT = "mailAddCnt";
	/** [契約件数]メールウィルスチェック */
	private static final String MAIL_VC_CNT = "mailVcCnt";
	/** [契約件数]ルーター契約件数 */
	private static final String ROOTER_CNT = "rooterCnt";
	/** [契約件数]ウィルスバスター契約件数 */
	private static final String VB_CNT = "VbCnt";
	/** [契約件数]ファミリーパック契約件数（トリガー以外） */
	private static final String FAMIPA_CNT = "FamipaCnt";

	/** [無料数]メールアドレス */
	private static final String MURYO_MAIL_ADD_CNT = "muryo_mail_add_cnt";
	/** [無料数]メールウィルスチェック */
	private static final String MURYO_MAIL_VC_CNT = "muryo_mail_vc_cnt";

	/** [単価]メールアドレス */
	private static final String TANKA_MAIL_ADD = "tankaMailAdd";
	/** [単価]メールウィルスチェック */
	private static final String TANKA_MAIL_VC = "tankaMailVc";
	/** [単価]ルーター */
	private static final String TANKA_ROOTER = "tankaRooter";
	/** [単価]ファミリーパック */
	private static final String TANKA_FAMIPA = "tankaFamipa";
	/** [単価]ウィルスバスター */
	private static final String TANKA_VB = "tankaVb";

	/** [金額集計]メールアドレス */
	private static final String SUM_MAIL_ADD = "sumMailAdd";
	/** [金額集計]ウィルスバスター  */
	private static final String SUM_VB = "sumVb";
	/** [金額集計]ルーター */
	private static final String SUM_ROOTER = "sumRooter";
	/** [金額集計]メールウィルスチェック */
	private static final String SUM_MAIL_VC = "sumMailVc";
	/** [金額集計]合計額 */
	private static final String SUM_ALL = "sumAll";

	/** eo光ネットの料金コースコード */
	private static final String RYK_NET_PCRS_CD = "NET_PCRS_CD";

	/** ウィルスバスター加算件数(API呼出時に加算設定される) */
	private static final String VB_ADD = "vbAdd";

	/** 判定ロジック呼出メソッド */
	private static final String CALL_STEP = "callStep";

	/** 検索処理パターン(一括) */
	private static final String SEARCH_TYPE_IKT = "1";

	/** API呼出用のサービスID */
	private static final String CALL_API = "FUSV029701CC";
	//-------------------------------------------------------------------------------------------------//
	// IN項目
	/** IN項目:SYSID */
	private static final String IN_PARAM_KEY_SYSID = "key_sysid";
	/** IN項目:サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";

	// OUT項目
	/** リターンコード */
	private static final String OUT_RETURN_CODE = "returnCode";
	/** リターンメッセージ */
	public static final String OUT_RETURN_MESSAGE = "returnMessage";
	/** 結果コード（0：否、1：要） */
	private static final String OUT_RESULT_CD = "result_cd";

	/** 個別エラー設定名 */
	private static final String CC_MAKE_ERR = "戻り値不正";
	/** 個別エラー設定名 */
	private static final String CC_CNV_ERR = "変換エラー";
	/** エラーコード */
	private static final String FORMAT_NUM = "%1$04d";
	/** エラー文字列 */
	private static final String STR_ERR = "_err";

	//-------------------------------------------------------------------------------------------------//
	// 単項目、関連チェックの情報
	/** ヘッダ リターンコード 正常 "0000" */
	private static final String RETURN_CODE_NORMAL = "0000";
	/** ヘッダ リターンコード 単項目チェックエラー "1000" */
	private static final String RETURN_CODE_TMCK_ERR = "1000";
	/** ヘッダ リターンコード 関連チェックエラー "1100" */
	private static final String RETURN_CODE_KRCK_ERR = "1100";

	/** エラーレベル 正常 "000" */
	private static final String ERR_LEVEL_000 = "000";
	/** エラーレベル エラー "888" */
	private static final String ERR_LEVEL_888 = "888";

	/** エラー設定値 "E1" */
	private static final String ERR_E1 = "E1";
	/** エラー設定値 "E2" */
	private static final String ERR_E2 = "E2";
	/** エラー設定値 "E3" */
	private static final String ERR_E3 = "E3";
	/** エラー設定値 "EA" */
	private static final String ERR_EA = "EA";
	/** エラー設定値 "EB" */
	private static final String ERR_EB = "EB";
	/** SYSID 桁数10桁 */
	private static final int SYSID_LEN = 10;
	/** サービス契約番号 桁数10桁 */
	private static final int SVC_KEI_NO_LEN = 10;

	/** ファミリーパック誘導判定結果「要：1」 */
	private static final String RESULT_CD_YOU = "1";
	/** ファミリーパック誘導判定結果「否：0」 */
	private static final String RESULT_CD_HI = "0";

	/** "'" */
	private static final String STRING_SINGLE = "'";

	//-------------------------------------------------------------------------------------------------//
	/** SC呼出制御キー(検索エラーなし) */
	private static final String IGNORE_SEARCH_ERR = "ignore_search_err";

	//-------------------------------------------------------------------------------------------------//
	/* 【トラン】■□ サービス契約一意照会SC ■□ */
	/** テンプレートID(サービス契約一意照会) */
	private static final String TEMP_ID_EKK0081A010 = "EKK0081A010";

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EKK0601B001_料金プラン固定単価（オプション申込料金）一覧照会SC ■□ */
	/** テンプレートID(料金プラン固定単価（オプション申込料金）一覧照会) */
	private static final String TEMP_ID_EKK0601B001 = "EKK0601B001";

	//-------------------------------------------------------------------------------------------------//
	/* 【トラン】■□ 割引サービス契約(予約とカレント件数)一覧照会SC ■□ */
	/** テンプレートID(割引サービス契約(予約とカレント件数)一覧照会) */
	private static final String TEMP_ID_EKK0451B506 = "EKK0451B506";

	//-------------------------------------------------------------------------------------------------//
	/* 【トラン】■□ EKK0351B503_現オプションサービス契約情報一覧照会(ネット) ■□ */
	/** テンプレートID(現オプションサービス契約情報一覧照会(ネット)）) */
	private static final String TEMP_ID_EKK0351B503 = "EKK0351B503";

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EKK0811A010_料金コース_オプションサービス一意照会SC ■□ */
	/** テンプレートID(料金コース_オプションサービス一意照会) */
	private static final String TEMP_ID_EKK0811A010 = "EKK0811A010";

	//-------------------------------------------------------------------------------------------------//
	// 【トラン】サブオプションサービス契約：メールウィルスチェック
	/** 現サブオプションサービス契約情報一覧照会（ネット）明細 */
	private static final String TEMP_ID_EKK0401B501 = "EKK0401B501";

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EKK1881B001_料金コース_サブオプションサービス一覧照会SC ■□ */
	/** テンプレートID(料金コース_サブオプションサービス一覧照会) */
	private static final String TEMP_ID_EKK1881B001 = "EKK1881B001";

	//-------------------------------------------------------------------------------------------------//
	/* 【トラン】■□ 機器オプションサービス契約一覧照会（フロント）SC ■□ */
	/** テンプレートID(機器オプションサービス契約一覧照会（フロント）) */
	private static final String TEMP_ID_EKK2811B503 = "EKK2811B503";

	//-------------------------------------------------------------------------------------------------//
	/* 【トラン】■□ 現機器提供サービス契約一覧照会SC ■□ */
	/** テンプレートID(現機器提供サービス契約一覧照会) */
	private static final String TEMP_ID_EKK0341B502 = "EKK0341B502";

	//-------------------------------------------------------------------------------------------------//
	/* 【マスタ】■□ EZM0411A010_宅内機器型式一意照会SC ■□ ZM_M_TAKNKIKI_MODEL */
	/** テンプレートID(宅内機器型式一意照会) */
	private static final String TEMP_ID_EZM0411A010 = "EZM0411A010";

	//-------------------------------------------------------------------------------------------------//
	// 【トラン】■課金先一覧照会（請求契約番号／サービス契約番号）
	/** テンプレートID(課金先一覧照会（請求契約番号／サービス契約番号) */
	private static final String TEMP_ID_EKK0321B002 = "EKK0321B002";

	//-------------------------------------------------------------------------------------------------//
	// 【トラン】■ECN0021B001_コンテンツ契約一覧照会 CN_T_CONT_KEI
	/** テンプレートID(コンテンツ契約一覧照会) */
	private static final String TEMP_ID_ECN0021B001 = "ECN0021B001";
	//-------------------------------------------------------------------------------------------------//
	// 【マスタ】■EAC0281B010_定額料金＜料金シミュレーション＞一覧照会
	/** テンプレートID(定額料金＜料金シミュレーション＞) */
	private static final String TEMP_ID_EAC0281B010 = "EAC0281B010";
	/** システムコード */
	private static final String AC_KEY_SYS_CD = "AC";
	/** 料金コースコード */
	private static final String AC_KEY_PCRS_CD = "   ";
	/** 料金サービスコード */
	private static final String AC_KEY_PRC_SVC_CD = "            ";
	//-------------------------------------------------------------------------------------------------//
	/** 料金グループコード eo光ネットホームタイプ、eo光ネットメゾンタイプ、eo光ネットマンションタイプ */
	private static final List<String> NET_PRC_GRP_CD = Arrays.asList(JFUStrConst.CD00133_02, JFUStrConst.CD00133_03, JFUStrConst.CD00133_04);

	/** 無効な「サービス契約ステータス」(210:休止・中断中、220：停止中、910：解約済、920：キャンセル済) */
	private static final List<String> SVC_KEI_STA_MUKO =
			Arrays.asList(JFUStrConst.CD00037_210, JFUStrConst.CD00037_220, JFUStrConst.CD00037_910, JFUStrConst.CD00037_920);

	/** 無効な「機器提供サービス契約ステータス」(210:休止・中断中、220：停止中、910：解約済、920：キャンセル済) */
	private static final List<String> KKTK_SVC_KEI_STAT_MUKO =
			Arrays.asList(JFUStrConst.CD00056_210, JFUStrConst.CD00056_220, JFUStrConst.CD00056_910, JFUStrConst.CD00056_920);

	/** 無効な「機器オプションサービス契約ステータス」(210:休止・中断中、220：停止中、910：解約済、920：キャンセル済) */
	private static final List<String> KKOP_SVC_KEI_STAT_MUKO = Arrays.asList(JFUStrConst.CD01616_910, JFUStrConst.CD01616_920);

	/** トリガー以外のデータで有効な「サービス契約ステータス」(100:サービス提供中) */
	private static final List<String> SVC_KEI_STA_ELS_YUKO = Arrays.asList(JFUStrConst.CD00037_100);

	//-------------------------------------------------------------------------------------------------//
	/** 無線ルーター（多機能以外）旧無線、新無線、新無線ギガ */
	private static final List<String> MUSEN_ROOTER = Arrays.asList(JFUStrConst.CD01313_03, JFUStrConst.CD01313_04, JFUStrConst.CD01313_05);

	/** 料金コース１０Ｇ A83,A84 */
	private static final List<String> PCRS_CD_10G = Arrays.asList(JFUStrConst.CD00134_A83, JFUStrConst.CD00134_A84);

	//-------------------------------------------------------------------------------------------------//

	/** フロント用初期費用取得パラメータ定義ファイルパス取得キー */
	private static final String KEY_FUSERVICE_FILE_PATH = "FUSERVICE_INITIAL_COST_FILE_PATH";
	/** フロント用初期費用取得パラメータ定義ファイル */
	private static final String FUSERVICE_FILE_PATH = JCCBPCommon.getApplicationConst(KEY_FUSERVICE_FILE_PATH);

	/** ウィルスバスター料金項目リスト */
	private static final List<String> VB_ROOT_ITEMS = Arrays.asList("FEE_PARAM_SETTING", "SERVICE", "VB_TANKA");
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** 対象の定義取得サービス名 */
	private static final String VB_ATTR_FUSV0297 = "FUSV0297";
	/** ウィルスバスター定義属性リスト */
	private static final List<String> VB_ATTRS = Arrays.asList("TSTAYMD", "TENDYMD");
	/** ウィルスバスター定義結果項目リスト */
	private static final List<String> VB_RSLT_ITEMS = Arrays.asList("PRC_KMK_CD");

	/**
	 * ファミリーパック誘導要否判定
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite yudoHantei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		String inParamFuncCd = (String)inMap.get(JCMConstants.FUNC_CODE_KEY);
		if (JPCModelConstant.FUNC_CD_2.equals(inParamFuncCd))
		{
			// チェックのみの場合
			// マップ設定
			param.setData(fixedText, new HashMap<String, Object>());
			// ユーザデータに機能コードを設定
			JFUBPCommon.setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

			return param;
		}

		return yudoHanteiExcecute(handle, param, fixedText, 0);

	}

	/**
	 * ファミリーパック関連チェック実行処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite yudoHanteiApi(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		return yudoHanteiExcecute(handle, param, fixedText, 1);
	}

	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 例外
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * ファミリーパック誘導要否判定
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param vbAdd ＶＢ加算数
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	private IRequestParameterReadWrite yudoHanteiExcecute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, int vbAdd)
			throws Throwable
	{

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// IN項目:SYSID 
		String inSysId = (String)inMap.get(IN_PARAM_KEY_SYSID);
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		// 判定用情報
		HashMap<String, String> ryokinMap = new HashMap<String, String>();
		// SYSID
		ryokinMap.put(IN_PARAM_KEY_SYSID, inSysId);
		// サービス契約番号
		ryokinMap.put(IN_PARAM_KEY_SVC_KEI_NO, inParamSvcKeiNo);
		// ウィルスバスターの加算件数
		ryokinMap.put(VB_ADD, String.valueOf(vbAdd));
		// ウィルスバスターの単価（VBについては単価はトランから取得するため初期化）
		ryokinMap.put(TANKA_VB, JFUStrConst.S_ZERO);

		// パラメータチェック（単項目、関連チェック）
		if (isParamChkErr(handle, param, fixedText, ryokinMap))
		{
			return param;
		}
		else
		{
			outDebugLog("----- JFUFamipaYudoHanteiCC 10Gチェック  -----");
			String pcrsCd = ryokinMap.get(RYK_NET_PCRS_CD);
			if (PCRS_CD_10G.contains(pcrsCd))
			{
				// 10Gでファミリーパック適用はない
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_HI, ryokinMap);
				return param;
			}
			// ファミリーパックが契約されているか情報を取得
			outDebugLog("----- JFUFamipaYudoHanteiCC ファミパ契約チェック chkTrgFamipa -----");
			boolean trgFamipaExists = chkTrgFamipa(handle, param, fixedText, ryokinMap);
			if (trgFamipaExists)
			{
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_HI, ryokinMap);
				return param;
			}

			outDebugLog("----- JFUFamipaYudoHanteiCC メールアドレスチェック chkMailAddress -----");
			// ファミリーパックの料金を取得する
			getFamipaTanka(handle, param, fixedText, ryokinMap);
			if (JFUStrConst.EMPTY.equals(ryokinMap.get(TANKA_FAMIPA)))
			{
				// ファミパの単価が取れない場合ファミリーパック誘導要否判定「要」を返却する
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_YOU, ryokinMap);
				return param;
			}

			// メールアドレスの判定
			if (chkMailAddress(handle, param, fixedText, ryokinMap))
			{
				// ファミリーパック誘導要否判定「要」を返却する
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_YOU, ryokinMap);
				return param;
			}

			outDebugLog("----- JFUFamipaYudoHanteiCC メールウィルスチェック chkMailVc -----");
			if (chkMailVc(handle, param, fixedText, ryokinMap))
			{
				// ファミリーパック誘導要否判定「要」を返却する
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_YOU, ryokinMap);
				return param;
			}

			// ルーターの判定
			outDebugLog("----- JFUFamipaYudoHanteiCC ルーターチェック chkRooter -----");
			if (chkRooter(handle, param, fixedText, ryokinMap))
			{
				// ファミリーパック誘導要否判定「要」を返却する
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_YOU, ryokinMap);
				return param;
			}

			// 請求先の判定
			outDebugLog("----- JFUFamipaYudoHanteiCC 請求先単位のチェック chkSeiKy -----");
			if (chkSeiKy(handle, param, fixedText, ryokinMap))
			{
				// ファミリーパック誘導要否判定「要」を返却する
				resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_YOU, ryokinMap);
				return param;
			}
		}

		resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_HI, ryokinMap);

		return param;
	}

	/**
	 * ファミリーパックを超えるか判定（メールアドレス）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true：ファミリーパックを超える
	 * @throws Throwable 
	 */
	private boolean chkMailAddress(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// メール申込数を取得する
		String mailCnt = getMailAddKykKk0351(handle, param, fixedText, ryokinMap);
		ryokinMap.put(MAIL_ADD_CNT, String.valueOf(mailCnt));

		// メール無料数を取得する
		String muryoCnt = getMailAddMuryo(handle, param, fixedText, ryokinMap);
		ryokinMap.put(MURYO_MAIL_ADD_CNT, String.valueOf(muryoCnt));
		// メール固定単価を取得する
		String tanka = getMailAddRyokin(handle, param, fixedText, ryokinMap);

		// メール無料数を考慮して、メール料金を算出
		ryokinMap.put(SUM_MAIL_ADD, sumKingk(muryoCnt, mailCnt, tanka));

		// ファミリーパックの金額を超えるかどうか判定する

		return isFamipaOver(ryokinMap, "chkMailAddress");

	}

	/**
	 * ファミリーパックを超えるか判定（メールウィルスチェック）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true：ファミリーパックを超える
	 * @throws Throwable 
	*/
	private boolean chkMailVc(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		String mailCnt = getMailVcKykKk0401(handle, param, fixedText, ryokinMap);
		ryokinMap.put(MAIL_VC_CNT, String.valueOf(mailCnt));

		// メールウィルスチェック無料数を取得する
		String muryoCnt = getMailVcMuryo(handle, param, fixedText, ryokinMap);
		ryokinMap.put(MURYO_MAIL_VC_CNT, String.valueOf(muryoCnt));

		// メールウィルスチェック固定単価を取得する
		String tanka = getMailVcRyokin(handle, param, fixedText, ryokinMap);

		// メールウィルスチェック無料数を考慮して、メールウィルスチェック料金を算出
		ryokinMap.put(SUM_MAIL_VC, sumKingk(muryoCnt, mailCnt, tanka));

		// ファミリーパックの金額を超えるかどうか判定する
		return isFamipaOver(ryokinMap, "chkMailVc");

	}

	/**
	 * ファミリーパックの金額を超えるか判定する（ルーター加算）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true：ファミリーパックの金額を超える
	 * @throws Throwable 
	 */
	private boolean chkRooter(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// 有料の無線ルーターが契約されているか取得する
		String yuryoCnt = getMusenRooter(handle, param, fixedText, ryokinMap);
		ryokinMap.put(ROOTER_CNT, yuryoCnt);
		if (JFUStrConst.S_ZERO.equals(yuryoCnt))
		{
			return false;
		}

		// 無線ルーターの固定単価を取得する
		String tanka = getRooterRyokin(handle, param, fixedText, ryokinMap);

		// 無線ルーターの料金を算出
		ryokinMap.put(SUM_ROOTER, sumKingk(JFUStrConst.S_ZERO, yuryoCnt, tanka));

		// ファミリーパックの金額を超えるかどうか判定する
		return isFamipaOver(ryokinMap, "chkRooter");
	}

	/**
	 * ファミリーパック金額が超えるか判定（同一請求先でのウィルスバスター）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true：ファミリーパックを超える
	 * @throws Throwable 
	 */
	private boolean chkSeiKy(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// 同一請求先のサービス契約番号を取得する
		// ●EKK0321B002_課金先一覧照会（請求契約番号／サービス契約番号
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0321B002CBSMsg.TEMPLATEID, TEMP_ID_EKK0321B002 }, { EKK0321B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0321B002CBSMsg.KEY_SVC_KEI_NO, ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO) } };

		// (1)トリガーの請求契約番号を取得
		//     「課金先」スキーマ ← KEY：サービス契約番号
		//         取得：請求契約番号
		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0321B002CBSMsg().getContents(), EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST)
						.getCAANMsgList(EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST);

		// (2)同じ請求先に紐づくサービス契約番号を取得
		//     「課金先」スキーマ ← KEY：請求契約番号
		//         取得：サービス契約番号の一覧  
		//    注）トリガーのサービス契約番号については、ファミリーパック持っているものはここには入ってこないはず
		HashMap<String, String> shorizumi = new HashMap<String, String>();
		ArrayList<HashMap<String, String>> allList = new ArrayList<HashMap<String, String>>();

		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			CAANMsg childTemplate = rtnMsg1List[i];

			// 請求契約番号
			if (JFUCommonUtil.isNull(childTemplate.getString(EKK0321B002CBSMsg1List.SEIKY_KEI_NO)))
			{
				continue;
			}
			// サービス契約番号
			if (JFUCommonUtil.isNull(childTemplate.getString(EKK0321B002CBSMsg1List.SVC_KEI_NO)))
			{
				continue;
			}

			String svcKeiNo = childTemplate.getString(EKK0321B002CBSMsg1List.SVC_KEI_NO);
			if (shorizumi.containsKey(svcKeiNo))
			{
				// サービス契約番号は処理済
				continue;
			}
			// ※請求先番号を元に、課金先が同じサービス契約番号を取得する ｎ件
			String seikyKeiNo = childTemplate.getString(EKK0321B002CBSMsg1List.SEIKY_KEI_NO);
			ArrayList<HashMap<String, String>> rtnList = getSeikyInfo(handle, param, fixedText, ryokinMap, seikyKeiNo);
			allList.addAll(rtnList);
			shorizumi.put(svcKeiNo, svcKeiNo);
		}

		//  (3) Loop処理
		//        「サービス契約」スキーマ ← KEY: (2)サービス契約番号
		//         注）トリガー以外のサービス契約のステータス（100）のみ対象
		HashMap<String, String> sysIdMap = new HashMap<String, String>();
		HashMap<String, String> svcKeiNoMap = new HashMap<String, String>();
		shorizumi.clear();
		String trgSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);
		int famipacnt = 0;

		for (HashMap<String, String> childMap : allList)
		{
			// 請求先に紐づくファミリーパックの件数とVBライセンスの件数を取得する（ステータス：010、100）
			String sysid = (String)childMap.get(EKK0321B002CBSMsg1List.SYSID);
			String svcKeiNo = (String)childMap.get(EKK0321B002CBSMsg1List.SVC_KEI_NO);
			String svcKeiStat = (String)childMap.get(EKK0321B002CBSMsg1List.SVC_KEI_STAT);

			// ここではネット以外もひろう
			if (shorizumi.containsKey(svcKeiNo))
			{
				// サービス契約番号は処理済
				continue;
			}
			if (trgSvcKeiNo.equals(svcKeiNo))
			{
				if (SVC_KEI_STA_MUKO.contains(svcKeiStat))
				{
					// トリガーのサービス契約番号（トリガーにファミリーパックがない場合に当メソッドが呼び出される）
					continue;
				}
			}
			else if (SVC_KEI_STA_ELS_YUKO.contains(svcKeiStat))
			{
				// トリガー以外のサービス契約で有効なもの
				// ファミリーパックの契約件数を取得する
				famipacnt += getFamipaCntKk0451(handle, param, fixedText, sysid, svcKeiNo);
			}
			else
			{
				continue;
			}
			sysIdMap.put(sysid, sysid);
			svcKeiNoMap.put(svcKeiNo, svcKeiNo);
			shorizumi.put(svcKeiNo, svcKeiNo);
		}

		// ウィルスバスターの件数を取得する
		int vbcnt = getVbCount(handle, param, fixedText, ryokinMap, sysIdMap, svcKeiNoMap);
		ryokinMap.put(FAMIPA_CNT, String.valueOf(famipacnt));

		int vbAddCnt = 0;
		// ウィルスバスターの件数を加算（API呼出時は、件数加算有り）
		vbcnt += cnvInt(ryokinMap.get(VB_ADD));
		ryokinMap.put(VB_CNT, String.valueOf(vbcnt));
		if (famipacnt < vbcnt)
		{
			// ファミリーパックの数＜ウィルスバスターの場合は、件数１件とする
			vbAddCnt = 1;
		}

		// ＶＢの単価を取得する
		String tanka = getVbKoteiAmnt(handle, param, fixedText);
		ryokinMap.put(TANKA_VB, tanka);

		// メールウィルスチェック無料数を考慮して、メールウィルスチェック料金を算出
		ryokinMap.put(SUM_VB, sumKingk(JFUStrConst.S_ZERO, String.valueOf(vbAddCnt), tanka));

		// ファミリーパックの金額を超えるかどうか判定する
		return isFamipaOver(ryokinMap, "chkSeiKy");

	}

	/**
	 * トリガーのファミリーパック
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true：ファミリーパックが存在するため判定不要
	 * @throws Throwable 
	 */
	private boolean chkTrgFamipa(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		/* ■□ 契約済チェック処理D ■□ */
		// ●割引サービス契約(予約とカレント件数)一覧照会
		// IN項目:SYSID 
		String inSysId = ryokinMap.get(IN_PARAM_KEY_SYSID);
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		// 契約数
		int contSumiCnt = getFamipaCntKk0451(handle, param, fixedText, inSysId, inParamSvcKeiNo);

		if (contSumiCnt > 0)
		{
			return true;
		}
		return false;
	}

	/**
	 * nullを０に変換
	 * 
	 * <br>
	 * @param value 値
	 * @return 変換値
	 */
	private BigDecimal convDecimal(String value)
	{
		if (JFUCommonUtil.isNull(value))
		{
			return new BigDecimal(JFUStrConst.S_ZERO);
		}
		return new BigDecimal(value);
	}

	/**
	 * int変換
	 * 
	 * <br>
	 * @param value 値
	 * @return 変換値
	 * @throws Throwable
	 */
	private int cnvInt(String value) throws Throwable
	{

		if (JFUCommonUtil.isNull(value))
		{
			throw new SCCallException(CC_CNV_ERR, String.valueOf(RETURN_CODE_NORMAL), Integer.parseInt(RETURN_CODE_KRCK_ERR));
		}
		try
		{
			BigDecimal dec = new BigDecimal(value);
			return dec.intValue();
		}
		catch (NumberFormatException e)
		{
			throw new SCCallException(CC_CNV_ERR, String.valueOf(RETURN_CODE_NORMAL), Integer.parseInt(RETURN_CODE_KRCK_ERR));
		}

	}

	/**
	 * 【トラン】ファミリーパックの契約数取得（割引サービス契約）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param inSysId SYSID
	 * @param inParamSvcKeiNo サービス契約番号
	 * @return 契約数 ［ステータス] 010：受付済、100：サービス提供中のもの
	 * @throws Throwable 
	*/
	private int getFamipaCntKk0451(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String inSysId, String inParamSvcKeiNo)
			throws Throwable
	{
		// ●割引サービス契約(予約とカレント件数)一覧照会
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0451B506CBSMsg.TEMPLATEID, TEMP_ID_EKK0451B506 }, { EKK0451B506CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0451B506CBSMsg.KEY_SYSID, inSysId }, { EKK0451B506CBSMsg.KEY_SVC_KEI_NO, inParamSvcKeiNo },
						{ EKK0451B506CBSMsg.KEY_WRIB_SVC_CD, JFUStrConst.KK0841_WRIB_SVC_CD_FAMIPA } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0451B506CBSMsg().getContents(), EKK0451B506CBSMsg.EKK0451B506CBSMSG1LIST)
						.getCAANMsgList(EKK0451B506CBSMsg.EKK0451B506CBSMSG1LIST);

		int contSumiCnt = 0;
		// 項目取得
		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];

			String cnt = childTemplate.getString(EKK0451B506CBSMsg1List.CNT);

			contSumiCnt = cnvInt(cnt);
		}

		// ［ステータス] 010：受付済、100：サービス提供中取得
		return contSumiCnt;
	}

	/**
	 * 【マスタ】ファミリーパック（単価）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getFamipaTanka(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		String koteiAmnt = getPlanKoteiAmnt(handle, param, fixedText, JFUStrConst.CD00134_F01, JFUStrConst.CD00565_PF0101);
		ryokinMap.put(TANKA_FAMIPA, String.valueOf(koteiAmnt));
		return koteiAmnt;
	}

	/**
	 * 【トラン】メール契約数を取得（オプションサービス契約）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return メール契約数
	 * @throws Throwable 
	 */
	private String getMailAddKykKk0351(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// ○EKK0351B503_現オプションサービス契約情報一覧照会(ネット)

		// ユーザデータ取得
		// IN項目:SYSID 
		String inSysId = ryokinMap.get(IN_PARAM_KEY_SYSID);
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0351B503CBSMsg.TEMPLATEID, TEMP_ID_EKK0351B503 }, { EKK0351B503CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0351B503CBSMsg.KEY_SYSID, inSysId }, { EKK0351B503CBSMsg.KEY_SVC_KEI_NO, inParamSvcKeiNo } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0351B503CBSMsg().getContents(), EKK0351B503CBSMsg.EKK0351B503CBSMSG1LIST)
						.getCAANMsgList(EKK0351B503CBSMsg.EKK0351B503CBSMSG1LIST);

		// ●結果分ループ
		int keiMailCnt = 0;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];

			//◆Eメールのみ対象とする
			String opSvcCd = childTemplate.getString(EKK0351B503CBSMsg1List.OP_SVC_CD);
			if (!JFUStrConst.CD00136_B001.equals(opSvcCd))
			{
				continue;
			}
			//◆有効ステータスのみ契約数としてカウント
			String opSvcKeiStat = childTemplate.getString(EKK0351B503CBSMsg1List.OP_SVC_KEI_STAT);
			if (SVC_KEI_STA_MUKO.contains(opSvcKeiStat))
			{
				continue;
			}
			keiMailCnt++;
		}
		return String.valueOf(keiMailCnt);
	}

	/**
	 * 【マスタ】メール無料数を取得（料金コース_オプションサービス）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return メール無料数
	 * @throws Throwable 
	 */
	private String getMailAddMuryo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// ○EKK0811A010_料金コース_オプションサービス一意照会
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0811A010CBSMsg.TEMPLATEID, TEMP_ID_EKK0811A010 }, { EKK0811A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0811A010CBSMsg.KEY_PCRS_CD, ryokinMap.get(RYK_NET_PCRS_CD) },
						{ EKK0811A010CBSMsg.KEY_OP_SVC_CD, JFUStrConst.CD00136_B001 },
						{ EKK0811A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null) } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0811A010CBSMsg().getContents(), EKK0811A010CBSMsg.EKK0811A010CBSMSG1LIST)
						.getCAANMsgList(EKK0811A010CBSMsg.EKK0811A010CBSMSG1LIST);

		// 項目取得
		String muryoCnt = JFUStrConst.S_ZERO;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			CAANMsg childTemplate = rtnMsg1List[i];
			// 無料オプションサービス数 数値 null制約
			muryoCnt = childTemplate.getString(EKK0811A010CBSMsg1List.MRYO_OP_SVC_CNT);
		}

		if (JFUCommonUtil.isNull(muryoCnt))
		{
			return JFUStrConst.S_ZERO;
		}

		return muryoCnt;
	}

	/**
	 * 【マスタ】メールアドレス追加料金（単価）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getMailAddRyokin(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		String koteiAmnt = getPlanKoteiAmnt(handle, param, fixedText, JFUStrConst.CD00134_B01, JFUStrConst.CD00565_PB0101);
		ryokinMap.put(TANKA_MAIL_ADD, koteiAmnt);
		return koteiAmnt;
	}

	/**
	 * 【トラン】メールウィルスチェック契約数を取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return メール契約数
	 * @throws Throwable 
	 */
	private String getMailVcKykKk0401(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// ○現サブオプションサービス契約情報一覧照会（ネット）明細
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0401B501CBSMsg.TEMPLATEID, TEMP_ID_EKK0401B501 }, { EKK0401B501CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0401B501CBSMsg.KEY_SVC_KEI_NO, inParamSvcKeiNo } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0401B501CBSMsg().getContents(), EKK0401B501CBSMsg.EKK0401B501CBSMSG1LIST)
						.getCAANMsgList(EKK0401B501CBSMsg.EKK0401B501CBSMSG1LIST);

		// ●結果分ループ
		int keiMailCnt = 0;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];

			String sbopSvcCd = childTemplate.getString(EKK0401B501CBSMsg1List.SBOP_SVC_CD);
			String sbopSvcKeiStat = childTemplate.getString(EKK0401B501CBSMsg1List.SBOP_SVC_KEI_STAT);
			//◆メールウィルスチェックのみ対象とする
			if (!JFUStrConst.CD00137_D03.equals(sbopSvcCd))
			{
				continue;
			}
			//◆有効ステータスのみ契約数としてカウント
			if (SVC_KEI_STA_MUKO.contains(sbopSvcKeiStat))
			{
				continue;
			}
			keiMailCnt++;
		}
		return String.valueOf(keiMailCnt);
	}

	/**
	 * 【マスタ】メールウィルスチェックの無料数を取得（料金コース_サブオプションサービス）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return メールウィルスチェックの無料数
	 * @throws Throwable 
	 */
	private String getMailVcMuryo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// ○EKK1881B001_料金コース_サブオプションサービス一覧照会
		String netPcrsCd = ryokinMap.get(RYK_NET_PCRS_CD);

		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK1881B001CBSMsg.TEMPLATEID, TEMP_ID_EKK1881B001 }, { EKK1881B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK1881B001CBSMsg.KEY_PCRS_CD, netPcrsCd }, { EKK1881B001CBSMsg.KEY_SBOP_SVC_CD, JFUStrConst.CD00137_D03 } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK1881B001CBSMsg().getContents(), EKK1881B001CBSMsg.EKK1881B001CBSMSG1LIST)
						.getCAANMsgList(EKK1881B001CBSMsg.EKK1881B001CBSMSG1LIST);

		// 項目取得
		String muryoCnt = JFUStrConst.S_ZERO;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			CAANMsg childTemplate = rtnMsg1List[i];
			// サービス提供物無料値 数値 null制約
			muryoCnt = childTemplate.getString(EKK1881B001CBSMsg1List.SVCTK_BUT_MRYO_VALUE);
		}

		if (JFUCommonUtil.isNull(muryoCnt))
		{
			return JFUStrConst.S_ZERO;
		}
		return muryoCnt;

	}

	/**
	 * 【マスタ】メールウィルスチェック（単価）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getMailVcRyokin(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		String koteiAmnt = getPlanKoteiAmnt(handle, param, fixedText, JFUStrConst.CD00134_D03, JFUStrConst.CD00565_PD0301);
		ryokinMap.put(TANKA_MAIL_VC, String.valueOf(koteiAmnt));
		return koteiAmnt;
	}

	/**
	 * 有料の無線ルーターが契約されているか取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return 1：有料の無線ルーターが契約されている
	 * @throws Throwable 
	 */
	private String getMusenRooter(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{

		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		// ●現機器提供サービス契約一覧照会
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0341B502CBSMsg.TEMPLATEID, TEMP_ID_EKK0341B502 }, { EKK0341B502CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0341B502CBSMsg.KEY_SVC_KEI_NO, inParamSvcKeiNo }, { EKK0341B502CBSMsg.KEY_SVC_KEI_NO_KAISEN_UCWK, inParamSvcKeiNo } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0341B502CBSMsg().getContents(), EKK0341B502CBSMsg.EKK0341B502CBSMSG1LIST)
						.getCAANMsgList(EKK0341B502CBSMsg.EKK0341B502CBSMSG1LIST);

		int cnt = 0;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];
			// 機器提供サービス契約ステータス
			String kktkSvcKeiStat = childTemplate.getString(EKK0341B502CBSMsg1List.KKTK_SVC_KEI_STAT);
			// 宅内機器種別コード
			String taknkikiSbtCd = childTemplate.getString(EKK0341B502CBSMsg1List.TAKNKIKI_SBT_CD);
			// サービス契約回線内訳番号
			String svcKeiKaisenUcwkNo = childTemplate.getString(EKK0341B502CBSMsg1List.SVC_KEI_KAISEN_UCWK_NO);
			// 宅内機器型式コード
			String taknkikiModelCd = childTemplate.getString(EKK0341B502CBSMsg1List.TAKNKIKI_MODEL_CD);

			// 「宅内機器型式コード=ルーター、多機能ルーター」かつ「ステータス有効」の場合
			if (JFUStrConst.CD01262_F0.equals(taknkikiSbtCd) || JFUStrConst.CD01262_R0.equals(taknkikiSbtCd))
			{
				if (!KKTK_SVC_KEI_STAT_MUKO.contains(kktkSvcKeiStat))
				{
					// 変更手続き中ははいってこない
					if (JFUStrConst.CD01262_F0.equals(taknkikiSbtCd))
					{
						// ルーター（多機能以外）
						cnt += getRouterMusenCnt(handle, param, fixedText, taknkikiModelCd);
					}
					else if (JFUStrConst.CD01262_R0.equals(taknkikiSbtCd))
					{
						// 多機能ルーター
						cnt += getTknRouterMusenCnt(handle, param, fixedText, svcKeiKaisenUcwkNo, ryokinMap);
					}
				}
				if (cnt >= 1)
				{
					break;
				}
			}

		}

		// ルーターは１件のみファミパ対象なので処理を抜ける
		if (cnt > 0)
		{
			return JFUStrConst.S_ONE;
		}
		return JFUStrConst.S_ZERO;
	}

	/**
	 * 【マスタ】料金プラン固定単価から単価を取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCD 料金プランコード
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getPlanKoteiAmnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String pcrsCd, String pplanCD)
			throws Throwable
	{

		// ○EKK0601B001_料金プラン固定単価（オプション申込料金）一覧照会
		//   ※EKK0601B001では運用日付で参照
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0601B001CBSMsg.TEMPLATEID, TEMP_ID_EKK0601B001 }, { EKK0601B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0601B001CBSMsg.KEY_PCRS_CD, pcrsCd }, { EKK0601B001CBSMsg.KEY_PPLAN_CD, pplanCD },
						{ EKK0601B001CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM },
						{ EKK0601B001CBSMsg.DISPLAY_NUM, JFUStrConst.MAX_SEARCH_NUM },
						{ EKK0601B001CBSMsg.DISPLAY_PAGE_NUM, JFUStrConst.MAX_SEARCH_NUM }, { EKK0601B001CBSMsg.SEARCH_TYPE, SEARCH_TYPE_IKT },
						{ EKK0601B001CBSMsg.TOTAL_PAGE_NUM, JFUStrConst.MAX_SEARCH_NUM } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0601B001CBSMsg().getContents(), EKK0601B001CBSMsg.EKK0601B001CBSMSG1LIST)
						.getCAANMsgList(EKK0601B001CBSMsg.EKK0601B001CBSMSG1LIST);

		// 項目取得
		String koteiAmnt = JFUStrConst.EMPTY;
		if (rtnMsg1List != null)
		{
			for (int i = 0; i < rtnMsg1List.length; i++)
			{
				CAANMsg childTemplate = rtnMsg1List[i];

				koteiAmnt = childTemplate.getString(EKK0601B001CBSMsg1List.PPLAN_KOTEI_AMNT);

			}
		}
		return koteiAmnt;
	}

	/**
	 * ウィルスバスターマルチデバイスの単価取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param pcrsCd 料金コースコード
	 * @param pplanCD 料金プランコード
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getVbKoteiAmnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		// 項目取得
		String prcKmkCd = getprcKmkCdFromXml(fixedText);

		// **********************************************************************************************************/
		// * FUFeeParamSettingDefinition.xmlに設定している料金項目コードから「ウィルスバスター　マルチデバイス　月額版」の単価を取得
		// * @@@@@@ 消費税８％、税込金額 @@@@@@
		// * @@@@@@ 消費税率、金額変更時に注意が必要 @@@@@@
		// **********************************************************************************************************/

		String kngak = getAcTegak(handle, param, fixedText, prcKmkCd);
		return kngak;
	}

	/**
	 * フロント用初期費用取得パラメータ定義ファイルから料金項目コード取得
	 * 
	 * <br>
	 * @param fixedText サービスメッセージ
	 * @return 料金項目コード
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private String getprcKmkCdFromXml(String fixedText) throws ParserConfigurationException, SAXException, IOException
	{

		// XMLパース
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(new File(FUSERVICE_FILE_PATH));

		// SERVICEのレベルを取得する
		Element root = doc.getDocumentElement();
		NodeList svcList = root.getElementsByTagName(VB_ROOT_ITEMS.get(1));

		String prcKmkCd = JFUStrConst.EMPTY;
		for (int i = 0; i < svcList.getLength(); i++)
		{
			Element svcElement = (Element)svcList.item(i);
			if (VB_ATTR_FUSV0297.equals(svcElement.getAttribute(QUERY_ATTR_NAME)))
			{
				// 運用日付
				String opeDate = JFUBPCommon.getOpeDate(null);

				// 対象のプロパティ結果を取得
				NodeList resultList = svcElement.getElementsByTagName(VB_ROOT_ITEMS.get(2));
				for (int j = 0; j < resultList.getLength(); j++)
				{
					Element childElement = (Element)resultList.item(j);

					// 適用開始日≦運用日≦適用終了日のデータを取得する
					String fromDate = childElement.getAttribute(VB_ATTRS.get(0));
					String toDate = childElement.getAttribute(VB_ATTRS.get(1));

					if (JFUBPCommon.isNull(fromDate))
					{
						continue;
					}
					if (JFUBPCommon.isNull(toDate))
					{
						continue;
					}

					if (fromDate.compareTo(opeDate) <= 0 && opeDate.compareTo(toDate) <= 0)
					{
						prcKmkCd = childElement.getElementsByTagName(VB_RSLT_ITEMS.get(0)).item(0).getTextContent();
						break;
					}

				}
				break;
			}
		}

		return prcKmkCd;
	}

	/**
	 * 【マスタ】定額料金＜料金シミュレーション＞取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param prcKmkCd 料金コースコード
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getAcTegak(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String prcKmkCd) throws Throwable
	{

		// ○EAC0281B010_定額料金＜料金シミュレーション＞一覧照会
		//   ※EAC0281B010では運用日付で参照
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EZM0321A010CBSMsg.TEMPLATEID, TEMP_ID_EAC0281B010 }, { EAC0281B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EAC0281B010CBSMsg.KEY_SYS_CD, AC_KEY_SYS_CD }, { EAC0281B010CBSMsg.KEY_PCRS_CD, AC_KEY_PCRS_CD },
						{ EAC0281B010CBSMsg.KEY_PRC_SVC_CD, AC_KEY_PRC_SVC_CD }, { EAC0281B010CBSMsg.KEY_PRC_KMK_CD, prcKmkCd } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EAC0281B010CBSMsg().getContents(), EAC0281B010CBSMsg.EAC0281B010CBSMSG1LIST)
						.getCAANMsgList(EAC0281B010CBSMsg.EAC0281B010CBSMSG1LIST);

		// 項目取得
		String koteiAmnt = JFUStrConst.S_ZERO;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			CAANMsg childTemplate = rtnMsg1List[i];

			koteiAmnt = childTemplate.getString(EAC0281B010CBSMsg1List.PRC);

		}
		if (JFUCommonUtil.isNull(koteiAmnt))
		{
			return JFUStrConst.S_ZERO;
		}
		else
		{
			BigDecimal kingk = new BigDecimal(koteiAmnt);
			kingk = kingk.abs();
			koteiAmnt = kingk.toString();
		}
		return koteiAmnt;
	}

	/**
	 * 【マスタ】無線ルーター（単価）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return 単価
	 * @throws Throwable 
	 */
	private String getRooterRyokin(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		String koteiAmnt = getPlanKoteiAmnt(handle, param, fixedText, JFUStrConst.CD00134_G02, JFUStrConst.CD00565_PG0201);
		ryokinMap.put(TANKA_ROOTER, koteiAmnt);
		return koteiAmnt;
	}

	/**
	 * 有料の無線ルーター件数取得<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param taknkikiModelCd 宅内機器型式コード
	 * @return 有料の無線ルーター件数
	 * @throws Throwable 
	 */
	private int getRouterMusenCnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String taknkikiModelCd) throws Throwable
	{
		int cnt = 0;

		if (!JFUBPCommon.isNull(taknkikiModelCd))
		{
			// ● EZM0411A010_宅内機器型式一意照会※ルーター取得用
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);

			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			// 上りマッピング
			Object[][] inputKey =
					{ { EZM0411A010CBSMsg.TEMPLATEID, TEMP_ID_EZM0411A010 }, { EZM0411A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
							{ EZM0411A010CBSMsg.KEY_TAKNKIKI_MODEL_CD, taknkikiModelCd } };

			// サービスIF実行
			CAANMsg[] rtnMsg1List =
					callSC(handle, scCall, param, fixedText, inputKey, new EZM0411A010CBSMsg().getContents(),
							EZM0411A010CBSMsg.EZM0411A010CBSMSG1LIST).getCAANMsgList(EZM0411A010CBSMsg.EZM0411A010CBSMSG1LIST);

			// 項目取得
			String yryoMryoCd = JFUStrConst.EMPTY;
			String hoyuRouterCd = JFUStrConst.EMPTY;
			for (int i = 0; i < rtnMsg1List.length; i++)
			{

				CAANMsg childTemplate = rtnMsg1List[i];

				yryoMryoCd = childTemplate.getString(EZM0411A010CBSMsg1List.YRYO_MRYO_CD);
				hoyuRouterCd = childTemplate.getString(EZM0411A010CBSMsg1List.HOYU_ROUTER_CD);

			}

			// 無線で有料の場合
			if (MUSEN_ROOTER.contains(hoyuRouterCd) && JFUStrConst.CD01277_1.equals(yryoMryoCd))
			{
				cnt++;
			}

		}
		return cnt;
	}

	/**
	 * 同一請求契約番号のサービス契約を取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @param seikyKeiNo 請求契約番号
	 * @return 同一請求契約番号リスト
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, String>> getSeikyInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			HashMap<String, String> ryokinMap, String seikyKeiNo) throws Throwable
	{

		// ●EKK0321B002_課金先一覧照会（請求契約番号／サービス契約番号
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0321B002CBSMsg.TEMPLATEID, TEMP_ID_EKK0321B002 }, { EKK0321B002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0321B002CBSMsg().getContents(), EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST)
						.getCAANMsgList(EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST);

		ArrayList<HashMap<String, String>> rtnList = new ArrayList<HashMap<String, String>>();
		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			HashMap<String, String> recordMap = new HashMap<String, String>();

			CAANMsg childTemplate = rtnMsg1List[i];

			String sysid = childTemplate.getString(EKK0321B002CBSMsg1List.SYSID);
			String svcKeiNo = childTemplate.getString(EKK0321B002CBSMsg1List.SVC_KEI_NO);
			String svcKeiStat = childTemplate.getString(EKK0321B002CBSMsg1List.SVC_KEI_STAT);

			if (JFUCommonUtil.isNull(sysid))
			{
				continue;
			}
			if (JFUCommonUtil.isNull(svcKeiNo))
			{
				continue;
			}

			recordMap.put(EKK0321B002CBSMsg1List.SYSID, sysid);
			recordMap.put(EKK0321B002CBSMsg1List.SVC_KEI_NO, svcKeiNo);
			recordMap.put(EKK0321B002CBSMsg1List.SVC_KEI_STAT, svcKeiStat);
			rtnList.add(recordMap);
		}

		return rtnList;
	}

	/**
	 * 多機能ルーター取得<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @param ryokinMap 料金情報
	 * @return 無線ルーターの件数
	 * @throws Throwable 
	 */
	private int getTknRouterMusenCnt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiKaisenUcwkNo,
			HashMap<String, String> ryokinMap) throws Throwable
	{
		int cnt = 0;

		// ●機器オプションサービス契約一覧照会（フロント）
		String inSysId = ryokinMap.get(IN_PARAM_KEY_SYSID);
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK2811B503CBSMsg.TEMPLATEID, TEMP_ID_EKK2811B503 }, { EKK2811B503CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ EKK2811B503CBSMsg.KEY_SYSID, inSysId }, { EKK2811B503CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo },
						{ EKK2811B503CBSMsg.KEY_TAKNKIKI_SBT_CD, JFUStrConst.CD01262_R0 } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK2811B503CBSMsg().getContents(), EKK2811B503CBSMsg.EKK2811B503CBSMSG1LIST)
						.getCAANMsgList(EKK2811B503CBSMsg.EKK2811B503CBSMSG1LIST);

		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];

			String kkopSvcKeiStat = childTemplate.getString(EKK2811B503CBSMsg1List.KKOP_SVC_KEI_STAT);
			String pplanCd = childTemplate.getString(EKK2811B503CBSMsg1List.PPLAN_CD);
			// ステータスチェック
			if (KKOP_SVC_KEI_STAT_MUKO.contains(kkopSvcKeiStat))
			{
				continue;
			}

			// 無線ルーター機能
			if (JFUStrConst.CD00565_PG0201.equals(pplanCd))
			{
				cnt++; // 無線ルーター機能
				break;
			}

		}
		return cnt;

	}

	/**
	 * 同一請求先のウィルスバスターの件数を取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @param sysIdMap SYSIDマップ
	 * @param svcKeiNoMap サービス契約番号マップ
	 * @return ウィルスバスターの件数
	 * @throws Throwable 
	 */
	private int getVbCount(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap,
			HashMap<String, String> sysIdMap, HashMap<String, String> svcKeiNoMap) throws Throwable
	{

		// 注意）コンテンツ契約状態はチェックしないこと（解約の場合も"0"が設定されるため）
		// 運用日時
		String opeDateHhmiss = JFUBPCommon.getOpeDateTime(null);
		int cnt = 0;

		Set<String> keyS = sysIdMap.keySet();
		for (String sysid : keyS)
		{
			ArrayList<HashMap<String, String>> rtnList = getVbInfo(handle, param, fixedText, sysid);
			for (HashMap<String, String> childMap : rtnList)
			{
				String conSvcCd = (String)childMap.get(ECN0021B001CBSMsgList.CONT_SVC_CD);
				String contSbtCd = (String)childMap.get(ECN0021B001CBSMsgList.CONT_SBT_CD);
				String contKeiStaDtm = (String)childMap.get(ECN0021B001CBSMsgList.CONT_KEI_STA_DTM);
				String contKeiEndDtm = (String)childMap.get(ECN0021B001CBSMsgList.CONT_KEI_END_DTM);
				String ispKssaiSvcKeiNo = (String)childMap.get(ECN0021B001CBSMsgList.ISP_KSSAI_SVC_KEI_NO);
				String contTanka = (String)childMap.get(ECN0021B001CBSMsgList.CONT_TANKA);

				if (JFUCommonUtil.isNull(ispKssaiSvcKeiNo))
				{
					// クレカは対象外（＝サービス契約番号がセットされていない）
					continue;
				}
				if (!svcKeiNoMap.containsKey(ispKssaiSvcKeiNo))
				{
					// 対象のサービス契約でない
					continue;
				}
				if (!JFUStrConst.CD00153_0069.equals(conSvcCd))
				{
					// ウィルスバスターでない
					continue;
				}
				if (JFUCommonUtil.isNull(contTanka) || cnvInt(contTanka) <= 0)
				{
					// コンテンツ単価=null、０以下 対象外
					continue;
				}
				if (!JFUStrConst.CD00517_1.equals(contSbtCd))
				{
					// コンテンツでない
					continue;
				}
				if (contKeiStaDtm.compareTo(opeDateHhmiss) <= 0 && opeDateHhmiss.compareTo(contKeiEndDtm) <= 0)
				{
					// コンテンツ契約開始年月日時分秒<=運用日時<=コンテンツ契約終了年月日時分秒
					// MK_FLG＝"0"はサービスで確認済
					ryokinMap.put(TANKA_VB, contTanka);
					cnt++;
				}
			}
		}
		return cnt;

	}

	/**
	 * ウィルスバスターの検索（SYSID）
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysId SYSID
	 * @return ウィルスバスターの情報
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, String>> getVbInfo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysId)
			throws Throwable
	{

		// ●コンテンツ契約一覧照会
		//検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		// ＫＥＹ＿システム年月日時分秒（※設計書記載17文字：YYYYMMDDhhmmssSSS）
		String strSysId = STRING_SINGLE  + sysId + STRING_SINGLE;
		Object[][] inputKey =
				{ { ECN0021B001CBSMsg.TEMPLATEID, TEMP_ID_ECN0021B001 }, { ECN0021B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1 },
						{ ECN0021B001CBSMsg.KEY_SYSID, strSysId }, { ECN0021B001CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null) },
						{ ECN0021B001CBSMsg.KEY_SYS_DTM, JFUBPCommon.getOpeDateTimeStamp(null) } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new ECN0021B001CBSMsg().getContents(), ECN0021B001CBSMsg.ECN0021B001CBSMSGLIST)
						.getCAANMsgList(ECN0021B001CBSMsg.ECN0021B001CBSMSGLIST);

		ArrayList<HashMap<String, String>> rtnList = new ArrayList<HashMap<String, String>>();
		for (int i = 0; i < rtnMsg1List.length; i++)
		{
			HashMap<String, String> recordMap = new HashMap<String, String>();

			CAANMsg childTemplate = rtnMsg1List[i];

			String conSvcCd = childTemplate.getString(ECN0021B001CBSMsgList.CONT_SVC_CD);
			String contSbtCd = childTemplate.getString(ECN0021B001CBSMsgList.CONT_SBT_CD);
			String contKeiStaDtm = childTemplate.getString(ECN0021B001CBSMsgList.CONT_KEI_STA_DTM);
			String contKeiEndDtm = childTemplate.getString(ECN0021B001CBSMsgList.CONT_KEI_END_DTM);
			String ispKssaiSvcKeiNo = childTemplate.getString(ECN0021B001CBSMsgList.ISP_KSSAI_SVC_KEI_NO);
			String contBuyCnt = childTemplate.getString(ECN0021B001CBSMsgList.CONT_BUY_CNT);
			String contTanka = childTemplate.getString(ECN0021B001CBSMsgList.CONT_TANKA);

			recordMap.put(ECN0021B001CBSMsgList.CONT_SVC_CD, conSvcCd);
			recordMap.put(ECN0021B001CBSMsgList.CONT_SBT_CD, contSbtCd);
			recordMap.put(ECN0021B001CBSMsgList.CONT_KEI_STA_DTM, contKeiStaDtm);
			recordMap.put(ECN0021B001CBSMsgList.CONT_KEI_END_DTM, contKeiEndDtm);
			recordMap.put(ECN0021B001CBSMsgList.ISP_KSSAI_SVC_KEI_NO, ispKssaiSvcKeiNo);
			recordMap.put(ECN0021B001CBSMsgList.CONT_BUY_CNT, contBuyCnt);
			recordMap.put(ECN0021B001CBSMsgList.CONT_TANKA, contTanka);
			rtnList.add(recordMap);
		}

		return rtnList;
	}

	/**
	 * ファミリーパック料金を超えるか判定
	 * 
	 * <br>
	 * @param ryokinMap 料金情報
	 * @param callStep 呼出元
	 * @return true：ファミリーパック料金を超える
	 */
	private boolean isFamipaOver(HashMap<String, String> ryokinMap, String callStep)
	{

		BigDecimal tankaFamipa = convDecimal((String)ryokinMap.get(TANKA_FAMIPA));

		BigDecimal sumMailAdd = convDecimal((String)ryokinMap.get(SUM_MAIL_ADD));
		BigDecimal sumMailVc = convDecimal((String)ryokinMap.get(SUM_MAIL_VC));
		BigDecimal sumRooter = convDecimal((String)ryokinMap.get(SUM_ROOTER));
		BigDecimal sumVb = convDecimal((String)ryokinMap.get(SUM_VB));

		sumMailAdd = sumMailAdd.add(sumMailVc);
		sumMailAdd = sumMailAdd.add(sumRooter);
		sumMailAdd = sumMailAdd.add(sumVb);

		ryokinMap.put(CALL_STEP, callStep);
		ryokinMap.put(SUM_ALL, sumMailAdd.toString());

		if (tankaFamipa.compareTo(sumMailAdd) < 0)
		{
			return true;
		}
		return false;
	}

	/**
	 * ログ
	 * 
	 * <br>
	 * @param ryokinMap 料金情報
	 */
	private void debugKingak(HashMap<String, String> ryokinMap)
	{

		outDebugLog(JFUStrConst.RETURN_CODE + "----- 金額計算 -----");

		StringBuilder sb = new StringBuilder();
		sb.append(JFUStrConst.RETURN_CODE + "【SYSID】" + ryokinMap.get(IN_PARAM_KEY_SYSID));
		sb.append(JFUStrConst.RETURN_CODE + "【サービス契約番号】" + ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO));
		sb.append(JFUStrConst.RETURN_CODE);
		
		sb.append(JFUStrConst.RETURN_CODE + "【メール】");
		sb.append(JFUStrConst.RETURN_CODE + "  [契約件数]＝" + ryokinMap.get(MAIL_ADD_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [無料数]＝" + ryokinMap.get(MURYO_MAIL_ADD_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [単価]＝" + ryokinMap.get(TANKA_MAIL_ADD));

		sb.append(JFUStrConst.RETURN_CODE + "【メールウィルスチェック】");
		sb.append(JFUStrConst.RETURN_CODE + "  [契約件数]＝" + ryokinMap.get(MAIL_VC_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [無料数]＝" + ryokinMap.get(MURYO_MAIL_VC_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [単価]＝" + ryokinMap.get(TANKA_MAIL_VC));

		sb.append(JFUStrConst.RETURN_CODE + "【ルーター】");
		sb.append(JFUStrConst.RETURN_CODE + "  [契約件数]＝" + ryokinMap.get(ROOTER_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [単価]ルーター＝" + ryokinMap.get(TANKA_ROOTER));

		sb.append(JFUStrConst.RETURN_CODE + "【その他単価】");
		sb.append(JFUStrConst.RETURN_CODE + "  [単価]ファミリーパック＝" + ryokinMap.get(TANKA_FAMIPA));
		sb.append(JFUStrConst.RETURN_CODE + "  [単価]ウィルスバスター＝" + ryokinMap.get(TANKA_VB));

		sb.append(JFUStrConst.RETURN_CODE + "【ウィルスバスター関連】注）APIの場合は１加算考慮あり");
		sb.append(JFUStrConst.RETURN_CODE + "  [契約件数]ファミリーパック（トリガー以外）＝" + ryokinMap.get(FAMIPA_CNT));
		sb.append(JFUStrConst.RETURN_CODE + "  [契約件数]ウィルスバスター＝" + ryokinMap.get(VB_CNT));

		sb.append(JFUStrConst.RETURN_CODE + "【金額集計】");
		sb.append(JFUStrConst.RETURN_CODE + "  [メールアドレス]＝" + ryokinMap.get(SUM_MAIL_ADD));
		sb.append(JFUStrConst.RETURN_CODE + "  [ウィルスバスター]＝" + ryokinMap.get(SUM_VB));
		sb.append(JFUStrConst.RETURN_CODE + "  [ルーター]＝" + ryokinMap.get(SUM_ROOTER));
		sb.append(JFUStrConst.RETURN_CODE + "  [メールウィルスチェック]＝" + ryokinMap.get(SUM_MAIL_VC));

		sb.append(JFUStrConst.RETURN_CODE + "【金額集計】");
		sb.append(JFUStrConst.RETURN_CODE + "  [合計]＝" + ryokinMap.get(SUM_ALL));

		outDebugLog(sb.toString());
	}

	/**
	 * 半角英数字チェック<br>
	 * <br>
	 * @param str 対象文字列
	 * @return true：エラー
	 * @throws Exception 例外
	 */
	private boolean isHankakuEisujiErr(String str) throws Exception
	{
		String match_he1 = "^[a-zA-Z0-9]+";

		if (str.matches(match_he1))
		{
			return false;
		}
		return true;
	}

	/**
	 * 関連チェック
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true時エラー
	 * @throws Throwable 例外
	 */
	private boolean isKrckErr(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{

		//検索エラーなし設定
		ignoreSearchError(param, fixedText);
		// IN項目:SYSID 
		String inSysId = ryokinMap.get(IN_PARAM_KEY_SYSID);
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		// ●サービス契約一意照会
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// 上りマッピング
		Object[][] inputKey =
				{ { EKK0081A010CBSMsg.TEMPLATEID, TEMP_ID_EKK0081A010 }, { EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2 },
						{ EKK0081A010CBSMsg.KEY_SVC_KEI_NO, inParamSvcKeiNo }, { EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null) } };

		// サービスIF実行
		CAANMsg[] rtnMsg1List =
				callSC(handle, scCall, param, fixedText, inputKey, new EKK0081A010CBSMsg().getContents(), EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST)
						.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);

		// 存在
		if (rtnMsg1List == null || rtnMsg1List.length == 0)
		{
			// データが存在しない
			resultSet(param, fixedText, RETURN_CODE_KRCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_EA, null, ryokinMap);
			return true;
		}

		// 項目取得
		// SYSID
		String sysid = JFUStrConst.EMPTY;
		// 料金コースコード
		String pcrsCd = JFUStrConst.EMPTY;
		// 料金グループコード
		String prcGrpCd = JFUStrConst.EMPTY;
		// サービス契約ステータス
		String svcKeiStat = JFUStrConst.EMPTY;
		for (int i = 0; i < rtnMsg1List.length; i++)
		{

			CAANMsg childTemplate = rtnMsg1List[i];

			sysid = childTemplate.getString(EKK0081A010CBSMsg1List.SYSID);
			pcrsCd = childTemplate.getString(EKK0081A010CBSMsg1List.PCRS_CD);
			prcGrpCd = childTemplate.getString(EKK0081A010CBSMsg1List.PRC_GRP_CD);
			svcKeiStat = childTemplate.getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);

		}

		ryokinMap.put(RYK_NET_PCRS_CD, pcrsCd);

		if (JFUCommonUtil.isNull(sysid))
		{
			// sysidが取得できない（データが存在しない）
			resultSet(param, fixedText, RETURN_CODE_KRCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_EA, null, ryokinMap);
			return true;
		}
		if (!inSysId.equals(sysid))
		{
			// sysidが取得できない（データが存在しない）
			resultSet(param, fixedText, RETURN_CODE_KRCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_EA, null, ryokinMap);
			return true;
		}

		// 「料金グループコード eo光ネットホームタイプ、eo光ネットメゾンタイプ、eo光ネットマンションタイプ」以外
		if (!NET_PRC_GRP_CD.contains(prcGrpCd))
		{
			// ネットではない
			resultSet(param, fixedText, RETURN_CODE_NORMAL, ERR_LEVEL_000, null, null, RESULT_CD_HI, ryokinMap);
			return true;
		}
		// サービス契約ステータスのチェック
		if (SVC_KEI_STA_MUKO.contains(svcKeiStat))
		{
			resultSet(param, fixedText, RETURN_CODE_KRCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_EB, null, ryokinMap);
			return true;
		}
		return false;
	}

	/**
	 * パラメータチェック
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true時エラー
	 * @throws Throwable 例外
	 */
	private boolean isParamChkErr(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap)
			throws Throwable
	{
		// 単項目チェック
		if (isTmckErr(param, fixedText, ryokinMap))
		{
			return true;
		}

		// 関連チェック
		return isKrckErr(handle, param, fixedText, ryokinMap);

	}

	/**
	 * 単項目チェック
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ryokinMap 料金情報
	 * @return true時エラー
	 * @throws Throwable 例外
	 */
	private boolean isTmckErr(IRequestParameterReadWrite param, String fixedText, HashMap<String, String> ryokinMap) throws Throwable
	{

		// IN項目:SYSID 
		String inSysId = ryokinMap.get(IN_PARAM_KEY_SYSID);
		// IN項目:サービス契約番号
		String inParamSvcKeiNo = ryokinMap.get(IN_PARAM_KEY_SVC_KEI_NO);

		// 必須チェック：SYSID
		if (JFUCommonUtil.isNull(inSysId))
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SYSID, ERR_E1, null, ryokinMap);
			return true;
		}
		// 必須チェック：サービス契約番号
		if (JFUCommonUtil.isNull(inParamSvcKeiNo))
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_E1, null, ryokinMap);
			return true;
		}

		// 属性チェック：SYSID
		if (isHankakuEisujiErr(inSysId))
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SYSID, ERR_E2, null, ryokinMap);
			return true;
		}
		// 属性チェック：サービス契約番号
		if (isHankakuEisujiErr(inParamSvcKeiNo))
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_E2, null, ryokinMap);
			return true;
		}

		// 桁数チェック：SYSID
		if (inSysId.length() != SYSID_LEN)
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SYSID, ERR_E3, null, ryokinMap);
			return true;
		}

		// 桁数チェック：サービス契約番号
		if (inParamSvcKeiNo.length() != SVC_KEI_NO_LEN)
		{
			resultSet(param, fixedText, RETURN_CODE_TMCK_ERR, ERR_LEVEL_888, IN_PARAM_KEY_SVC_KEI_NO, ERR_E3, null, ryokinMap);
			return true;
		}

		return false;
	}

	/**
	 * 処理結果設定
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param retrunCode リターンコード
	 * @param errorLevel エラーレベル
	 * @param errorItem エラー項目名
	 * @param errorVal エラー設定値
	 * @param retultCd 結果コード（0：否、1：要）
	 * @param ryokinMap 判定用情報
	 * @throws Throwable 例外
	 * @throws Exception 例外
	 */
	private void resultSet(IRequestParameterReadWrite param, String fixedText, String retrunCode, String errorLevel, String errorItem,
			String errorVal, String retultCd, HashMap<String, String> ryokinMap) throws Throwable
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// OUT項目:リターンコード
		param.setControlMapData(OUT_RETURN_CODE, retrunCode);
		// OUT項目:リターンメッセージ 
		String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + retrunCode);
		param.setControlMapData(OUT_RETURN_MESSAGE, message);

		// OUT項目:エラーレベルについては「SCCallException」により振り分けられる
		// param.setControlMapData("errorLevel", errorLevel);
		if (!RETURN_CODE_NORMAL.equals(retrunCode))
		{
			makeError(param, fixedText, retrunCode, errorItem, errorVal);
			// ユーザデータ情報
			inMap.put(errorItem + STR_ERR, errorVal);

			if (CALL_API.equals(fixedText))
			{
				// API呼出になるとシステムエラーになってしまうためthrowしない
				return;
			}
			else
			{
				throw new SCCallException(CC_MAKE_ERR, retrunCode, Integer.parseInt(retrunCode));
			}
		}

		debugKingak(ryokinMap);

		// ユーザデータ情報
		// OUT項目:結果コード（0：否、1：要）
		inMap.put(OUT_RESULT_CD, retultCd);

		if (RESULT_CD_YOU.equals(retultCd))
		{
			StringBuilder sb = new StringBuilder();
			// IN項目:SYSID 
			String inSysId = (String)inMap.get(IN_PARAM_KEY_SYSID);
			// IN項目:サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);
			sb.append("ファミリーパック誘導要否判定=「要」");
			sb.append(",サービスID=[" + fixedText + "]");
			sb.append(",SYSID=[" + inSysId + "] サービス契約番号=[" + inParamSvcKeiNo + "]");

			JSYbpmLog.println(JSYLogBase.EXECUTION, this.getClass(), sb.toString(), "", new String[] { "", "" }, "");
		}

	}

	/**
	 * エラー情報生成（独自チェック）
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param retrunCode リターンコード
	 * @param errorItem エラー項目名
	 * @param errorVal エラー設定値
	 * @throws Exception 例外
	 */
	private void makeError(IRequestParameterReadWrite param, String fixedText, String retrunCode, String errorItem, String errorVal) throws Exception
	{

		HashMap<String, Object> errorMapChild = new HashMap<String, Object>();
		HashMap<String, Object> errorMap = new HashMap<String, Object>();

		errorMap.put(ErrorInfoMapKeys.TEMPLATE_ID, fixedText);
		errorMap.put(ErrorInfoMapKeys.STATUS, retrunCode);
		errorMap.put(ErrorInfoMapKeys.RETURN_CODE, retrunCode);

		errorMapChild.put(errorItem, errorVal);
		errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);

		ArrayList<Object> errList = new ArrayList<Object>();
		errList.add(errorMap);

		param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);

		// ステータスエリア編集
		StatusArea sa = param.getStatusArea();
		StatusInfo si = new StatusInfo(ErrorLevel.EL888, OUTBREAK_AREA.CC);
		// StatusInfo si = new StatusInfo(ErrorLevel.EL888, JFUStrConst.EMPTY);
		sa.setCurrent(si);

	}

	/**
	 * SC(サービスインターフェイス）を呼び出す
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @param rtnMsgName 戻り値の明細リスト名
	 * @return CAANMsg CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, IRequestParameterReadWrite param, String dataMapKey,
			Object[][] mappingData, Object[][] contents, String rtnMsgName) throws Throwable
	{
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(dataMapKey);
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData, contents);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if (!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException(CC_MAKE_ERR, return_code.toString(), status);
		}

		// レコードが取得できなかった場合
		if (templates[0].getCAANMsgList(rtnMsgName) == null || templates[0].getCAANMsgList(rtnMsgName).length == 0)
		{
			if (dataMap.containsKey(IGNORE_SEARCH_ERR))
			{
				// SC呼出制御キー(検索時対象データがない場合はエラーにしない) 
				dataMap.remove(IGNORE_SEARCH_ERR);
			}
			else
			{
				// BPにサービスコンポーネントのステータスを設定する。
				String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + RETURN_CODE_KRCK_ERR);

				param.setControlMapData(SCControlMapKeys.RETURN_CODE, RETURN_CODE_KRCK_ERR);

				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);

				HashMap<String, String> inMap = null;
				// ユーザデータ情報
				inMap = (HashMap<String, String>)param.getData(dataMapKey);
				inMap.put(IN_PARAM_KEY_SVC_KEI_NO + STR_ERR, ERR_EA);
				throw new SCCallException(CC_MAKE_ERR, return_code.toString(), Integer.parseInt(RETURN_CODE_KRCK_ERR));
			}
		}

		return msg;
	}

	/**
	 * 共通項目のメッセージを作成します。
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());

		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());

		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());

		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));

		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));

		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));

		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		String svcIf = (String)mappingData[0][1];

		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws Throwable 
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String dataMapKey,
			Object[][] mappingData, Object[][] contents) throws Throwable
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format(FORMAT_NUM, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);

		if (null == obj)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = cnvInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(FORMAT_NUM, templateStatus);

			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);

			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);

			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		HashMap<String, Object> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, Object>)param.getData(dataMapKey);
		for (int i = 0; null != contents && i < contents.length; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JFUCommonUtil.isNull(errCd) || JFUStrConst.EMPTY.equals(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}

		return param;
	}

	/**
	 * 検索エラーなし設定
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	protected void ignoreSearchError(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> dataMap = (HashMap<String, Object>)param.getData(fixedText);

		dataMap.put(IGNORE_SEARCH_ERR, null);
	}

	/////////////////////////////////////////////////////////////////////////////

	/**
	 * 個別料金計算
	 * 
	 * <br>
	 * @param muryoCnt 無料数
	 * @param keiyakCnt 契約数
	 * @param tanka 単価
	 * @return 個別料金
	 * @throws Throwable 
	 */
	private String sumKingk(String muryoCnt, String keiyakCnt, String tanka) throws Throwable
	{
		int iKeiyakCnt = cnvInt(keiyakCnt);
		int iMuryoCnt = cnvInt(muryoCnt);
		if (iKeiyakCnt <= iMuryoCnt)
		{
			return JFUStrConst.S_ZERO;
		}
		BigDecimal sum = new BigDecimal(tanka);
		int yuryoCont = iKeiyakCnt - iMuryoCnt;
		sum = sum.multiply(new BigDecimal(String.valueOf(yuryoCont)));
		return sum.toString();
	}

	/**
	 * デバッグ出力処理
	 * 
	 * <br>
	 * @param obj 出力内容
	 */
	private void outDebugLog(Object obj)
	{
		// デバッグ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), obj, null, null, null);
	}

}
