/*********************************************************************
* All Rights reserved, Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム共通（共通マスタ）
*   モジュール名    ：ACA001SFLogic
*   ソースファイル名：ACA001SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年12月15日
*＜機能概要＞
*   WEB用通話明細合計情報参照のビューロジッククラスです。
*＜修正履歴＞
*   バージョン	修正日		修正者		修正内容
*
**********************************************************************/

package eo.web.webview.ACA001SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JACStrConst;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCEditString;
import eo.common.util.JPCFomatString;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.mapping.ACSV0028_ACSV0028OPDBMapper;

/**
 * WEB用通話明細合計情報参照のビューロジッククラスです。
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class ACA001SFLogic extends JCCWebBusinessLogic
{

	/** 業務処理名 */
	private static final String BUSINESS_LOGIC_NM = "WEB用通話明細合計情報参照";

	/** サービスID */
	private static final String SERVICE_ID = "ACSV0028";

	/** データ取得件数 */
	private static final String DB_COUNT = "DB_COUNT";

	/** 電話番号 */
	private static final String DNW_BNGU = "DNW_BNGU";

	/** ＳＩＰユーザＩＤ */
	private static final String SIP_USER_ID = "SIP_USER_ID";

	/** お客様ＩＤ */
	private static final String OKYAKSM_ID = "OKYAKSM_ID";

	/** サービス種別区分 */
	private static final String SBS_SHUBT_CF = "SBS_SHUBT_CF";

	/** テーブル番号 */
	private static final String CALL_SPEC_TABLE_CODE = "CALL_SPEC_TABLE_CODE";

	/** 電話番号通番 */
	private static final String DNW_BNGU_TUBN = "DNW_BNGU_TUBN";

	/** ご利用年月 */
	private static final String GORIYO_NNDK = "GORIYO_NNDK";

	/** 表示名（通話） */
	private static final String HYOJI_MI_TWA = "HYOJI_MI_TWA";

	/** 通話合計数 */
	private static final String TWA_GUKISU = "TWA_GUKISU";

	/** 単位（通話） */
	private static final String TNI_TWA = "TNI_TWA";

	/** 表示名（課税分） */
	private static final String HYOJI_MI_KAZEI = "HYOJI_MI_KAZEI";

	/** 通話料金額（課税分） */
	private static final String TWARYO_KNGK_KAZEI = "TWARYO_KNGK_KAZEI";

	/** 表示名（消費税） */
	private static final String HYOJI_MI_SYOHIZEI = "HYOJI_MI_SYOHIZEI";

	/** 通話料金額（消費税） */
	private static final String TWARYO_KNGK_SYOHIZEI = "TWARYO_KNGK_SYOHIZEI";

	/** 表示名（免税分） */
	private static final String HYOJI_MI_MNZEI = "HYOJI_MI_MNZEI";

	/** 通話料金額（免税分） */
	private static final String TWARYO_KNGK_MNZEI = "TWARYO_KNGK_MNZEI";

	/** 表示名（税込金額） */
	private static final String HYOJI_MI_ZIKM = "HYOJI_MI_ZIKM";

	/** 通話料金額（税込金額） */
	private static final String TWARYO_KNGK_ZIKM = "TWARYO_KNGK_ZIKM";

	/** 結果種別（エラー） */
	private static final String RTYPE_CD_ERROR = "E";

	/** 正常終了 */
	private static final String RSLT_CD_NOMAL = "000000";

	/** メンテナンス中エラー */
	private static final String RSLT_CD_MAINTE = "007001";

	/** 致命的なエラー */
	private static final String RSLT_CD_CRITICAL = "009003";

	/** 必須エラー */
	private static final String RSLT_CD_MUST = "009008";

	/** 数値項目エラー */
	private static final String RSLT_CD_NUMBER_CHK = "009009";

	/** 最大桁数エラー */
	private static final String RSLT_CD_KETA = "009010";

	/** メンテナンス中エラーメッセージ */
	private static final String EX_MSG_MAINTE = "メンテナンス中です。";

	/** 必須エラーメッセージ */
	private static final String EX_MSG_MUST = "必須項目が設定されていません。";

	/** 数値属性エラーメッセージ */
	private static final String EX_MSG_NUMBER = "数値属性ではありません。";

	/** 最大桁数エラーメッセージ */
	private static final String EX_MSG_KETA = "最大桁数を超えています。";

	/** 致命的なエラーメッセージ */
	private static final String EX_MSG_CRITICAL = "処理中に致命的なエラーが発生しました。";

	/** 結果種別（共通セクタ） */
	private static final String WDA_COM_RTYPE = "WDA_COM_RTYPE";

	/** 処理結果（共通セクタ） */
	private static final String WDA_COM_RESULT = "WDA_COM_RESULT";

	/** 詳細情報１（共通セクタ） */
	private static final String WDA_COM_DETAIL1 = "WDA_COM_DETAIL1";

	/** 詳細情報２（共通セクタ） */
	private static final String WDA_COM_DETAIL2 = "WDA_COM_DETAIL2";

	/** 詳細情報３（共通セクタ） */
	private static final String WDA_COM_DETAIL3 = "WDA_COM_DETAIL3";

	/** 詳細情報４（共通セクタ） */
	private static final String WDA_COM_DETAIL4 = "WDA_COM_DETAIL4";

	/** 詳細情報５（共通セクタ） */
	private static final String WDA_COM_DETAIL5 = "WDA_COM_DETAIL5";

	/** 詳細情報６（共通セクタ） */
	private static final String WDA_COM_DETAIL6 = "WDA_COM_DETAIL6";

	/** ブランク */
	private static final String BLANK = "";

	/** =（イコール） */
	private static final String EQUAL = "=";

	/** ラインセパレータ */
	private static final String LINE_SEPARATOR = "line.separator";

	/** 共通セクタ */
	private static final String COMMON_SECTOR = "#!sector[CommonPart]!#";

	/** シンプルセクタ */
	private static final String SIMPLE_SECTOR = "#!sector[SimplePart]!#";

	/** マルチパートセクタ（始め） */
	private static final String MULTI_SECTOR_STA = "#!sector[MultiplePart[";

	/** マルチパートセクタ（終わり） */
	private static final String MULTI_SECTOR_END = "]]!#";

	/** マルチパートキー */
	private static final String KEY_MULTI_PART = "M1";

	/** フラグON */
	private static final String FLG_ON = "1";

	/** サーバー名（顧客サーバ） */
	private static final String SERVER_NM = "顧客サーバ";

	/** 改行コードCR */
	private static final String CD_CR = "\r";

	/** 改行コードLF */
	private static final String CD_LF = "\n";

	/** 結果コードマップ */
	private static HashMap<String, String> rtype_result_map = null;

	static
	{
		rtype_result_map = new HashMap<String, String>();
		rtype_result_map.put(RSLT_CD_NOMAL, "N"); 		// 正常終了
		rtype_result_map.put(RSLT_CD_MAINTE, "M"); 		// メンテナンス中です。
		rtype_result_map.put(RSLT_CD_CRITICAL, "E"); 	// 処理中に致命的なエラーが発生しました。
		rtype_result_map.put(RSLT_CD_MUST, "E"); 		// 必須項目が設定されていません。
		rtype_result_map.put(RSLT_CD_NUMBER_CHK, "E"); 	// 数値項目に数値以外が含まれています。
		rtype_result_map.put(RSLT_CD_KETA, "E"); 		// 最大桁数を超えています。
	}

	/**
	 * WEB用通話明細合計情報参照を行います。<BR/>
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		StringBuffer returnData = new StringBuffer();

		try
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();

			// -------------------------------------------------- //
			// 権限チェック
			// ロードバランサにてIPアドレス変換しフレームワークでチェック
			// -------------------------------------------------- //

			// -------------------------------------------------- //
			// 業務規制チェック
			// -------------------------------------------------- //
			if (restrictionCheck(returnData))
			{
				return true;
			}

			// -------------------------------------------------- //
			// リクエスト情報取得(処理要求電文より、パラメータを取得)
			// -------------------------------------------------- //
			HashMap<String, Object> reqMap = getRequestParams();

			// -------------------------------------------------- //
			// 必須入力チェック
			// -------------------------------------------------- //
			if (requireCheck(reqMap, returnData))
			{
				return true;
			}

			// -------------------------------------------------- //
			// 属性チェック
			// -------------------------------------------------- //
			if (numberCheck(reqMap, returnData))
			{
				return true;
			}

			// -------------------------------------------------- //
			// 最大桁数チェック
			// -------------------------------------------------- //
			if (lengthCheck(reqMap, returnData))
			{
				return true;
			}

			// -------------------------------------------------- //
			// サービス呼出処理
			// -------------------------------------------------- //
			// ユースケースID格納用マップ
			HashMap<Object, String> paramMap = new HashMap<Object, String>();

			// ユースケースID格納
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);

			// マッピングクラス
			ACSV0028_ACSV0028OPDBMapper mapper = new ACSV0028_ACSV0028OPDBMapper();

			// マッピング用Map
			HashMap<String, Object> dataMap = new HashMap<String, Object>();

			// マッピング処理（上り）

			mapper.setGETWORKPARAMLISTCC(null, dataMap, JPCModelConstant.FUNC_CD_1);
			mapper.setACSV002801SC(reqMap, dataMap, JPCModelConstant.FUNC_CD_1);

			// 業務パラメータIDリスト
			ArrayList<HashMap<String, Object>> workParamList = new  ArrayList<HashMap<String, Object>>(); 

			HashMap<String, Object> workParamMap1 = new HashMap<String, Object>();
			workParamMap1.put("in_work_param_id", JACStrConst.WKPARA_CH_TUWA_SU);
			workParamList.add(workParamMap1);

			HashMap<String, Object> workParamMap2 = new HashMap<String, Object>();
			workParamMap2.put("in_work_param_id", JACStrConst.WKPARA_CH_TUWA_NM);
			workParamList.add(workParamMap2);

			HashMap<String, Object> workParamMap3 = new HashMap<String, Object>();
			workParamMap3.put("in_work_param_id", JACStrConst.WKPARA_CH_KAZEI_GOKEI_AMNT);
			workParamList.add(workParamMap3);

			HashMap<String, Object> workParamMap4 = new HashMap<String, Object>();
			workParamMap4.put("in_work_param_id", JACStrConst.WKPARA_CH_MENZEI_GOKEI_AMNT);
			workParamList.add(workParamMap4);

			HashMap<String, Object> workParamMap5 = new HashMap<String, Object>();
			workParamMap5.put("in_work_param_id", JACStrConst.WKPARA_CH_ZEIKOMI_AMNT);
			workParamList.add(workParamMap5);

			// 業務パラメータIDリストを設定
			((HashMap)dataMap.get("GETWORKPARAMLISTCC")).put("WORK_PARAM_ID_List", workParamList);

			// 運用日付を基準日とする
			String stdrdDate = JCCWebCommon.getOpeDate(this, null);

			// 請求年月を算出
			String callSpecTableCode = (String)reqMap.get(CALL_SPEC_TABLE_CODE);	// テーブル番号
			String seikyuNengetsu = stdrdDate;

			if ("0".equals(callSpecTableCode))
			{
				// テーブル番号 = "0" の場合、当月
				seikyuNengetsu = JCRUtilCommon.formatDate(stdrdDate, JCRStrConst.FMT_YMD, "yyyyMM");
			}
			else if ("1".equals(callSpecTableCode))
			{
				// テーブル番号 = "1" の場合、前月
				seikyuNengetsu = JCRUtilCommon.formatDate(JPCUtilCommon.addMonth(stdrdDate, -1), JCRStrConst.FMT_YMD, "yyyyMM");
			}
			else if ("2".equals(callSpecTableCode))
			{
				// テーブル番号 = "2" の場合、前々月
				seikyuNengetsu = JCRUtilCommon.formatDate(JPCUtilCommon.addMonth(stdrdDate, -2), JCRStrConst.FMT_YMD, "yyyyMM");
			}

			// 請求年月を設定
			if (dataMap.containsKey("ACSV002801SC"))
			{
				((HashMap<String, Object>)dataMap.get("ACSV002801SC")).put("key_seiky_ym", seikyuNengetsu);
			}

			// サービス実行結果データ用Map
			HashMap<String, Object> outputMap = new HashMap<String, Object>();

			// サービス実行
			invokeService(paramMap, dataMap, outputMap);

			// -------------------------------------------------- //
			// サービス結果取得
			// -------------------------------------------------- //
			List<HashMap<String, Object>> workParamMapList = mapper.getGETWORKPARAMLISTCC(outputMap);
			List<HashMap<String, Object>> resMapList = mapper.getACSV002801SC(outputMap);

			// 処理応答電文（共通セクタ）の形式に変換
			returnData.append(getNomalCommonSector(RSLT_CD_NOMAL));

			// 処理応答電文（シンプルセクタ）の形式に変換
			HashMap<String, Object> scMap = (HashMap<String, Object>)outputMap.get("ACSV002801SC");

			HashMap<String, Object> simSecMap = new HashMap<String, Object>();
			simSecMap.put(DB_COUNT, (String)scMap.get("total_search_num"));
			returnData.append(getSimpleSector(simSecMap));

			// 処理応答電文（マルチパートセクタ）の形式に変換
			returnData.append(getMultipleSector(editreturnDataList(reqMap, workParamMapList, resMapList), KEY_MULTI_PART));

			bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());
		}
		catch (Exception e)
		{
			// "E" "009003" "処理中に致命的なエラーが発生しました。"
			DEBUG_LOG.debug(EX_MSG_CRITICAL);

			// 処理応答電文（共通セクタ）の形式に変換
			returnData.append(getErrCommonSector(RSLT_CD_CRITICAL, "", e.toString(), EX_MSG_CRITICAL));

			// 返却値の設定
			bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());
			return true;
		}

		return true;

	}

	/**
	 * サービス結果リストから返却項目内容を編集しリストを返却します。<BR/>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @param workParamList 業務パラメータ管理一意照会明細リスト
	 * @param workParamList 業務パラメータ管理一意照会明細リスト
	 * @param dataList eo光電話通話合計一覧照会明細リスト
	 * @return 編集済みサービス結果リスト
	 */
	@SuppressWarnings("unchecked")
	private ArrayList editreturnDataList(HashMap<String, Object> reqMap,
				List<HashMap<String, Object>> workParamList, List<HashMap<String, Object>> dataList)
	{
		ArrayList<HashMap<String, Object>> rsList = new ArrayList<HashMap<String, Object>>();
		HashMap dataMap = null;

		HashMap<String, String> workParamMap = new HashMap<String, String>();

		for (int i = 0; i < workParamList.size(); i++)
		{
			HashMap<String, Object> map = (HashMap<String, Object>)workParamList.get(i);

			String key = (String)map.get("work_param_id");
			String value = (String)map.get("work_param_sette_value");

			workParamMap.put(key, value);
		}

		String sipUserId = (String)reqMap.get(SIP_USER_ID);		// ＳＩＰユーザーＩＤ
		String sbsShubtCf = (String)reqMap.get(SBS_SHUBT_CF);	// サービス種別区分
		String hyojiMiTwa = "";									// 通話数の表示名
		String tniTwa = "";										// 単位（通話）の表示名
		String hyojiMiKazei = "";								// 表示名（課税分）の表示名
		String hyojiMiMnzei = "";								// 表示名（免税分）の表示名
		String hyojiMiZikm = "";								// 表示名（税込金額）の表示名

		if (workParamMap.containsKey(JACStrConst.WKPARA_CH_TUWA_SU))
		{
			hyojiMiTwa = (String)workParamMap.get(JACStrConst.WKPARA_CH_TUWA_SU);
		}

		if (workParamMap.containsKey(JACStrConst.WKPARA_CH_TUWA_NM))
		{
			tniTwa = (String)workParamMap.get(JACStrConst.WKPARA_CH_TUWA_NM);
		}

		if (workParamMap.containsKey(JACStrConst.WKPARA_CH_KAZEI_GOKEI_AMNT))
		{
			hyojiMiKazei = (String)workParamMap.get(JACStrConst.WKPARA_CH_KAZEI_GOKEI_AMNT);
		}

		if (workParamMap.containsKey(JACStrConst.WKPARA_CH_MENZEI_GOKEI_AMNT))
		{
			hyojiMiMnzei = (String)workParamMap.get(JACStrConst.WKPARA_CH_MENZEI_GOKEI_AMNT);
		}

		if (workParamMap.containsKey(JACStrConst.WKPARA_CH_ZEIKOMI_AMNT))
		{
			hyojiMiZikm = (String)workParamMap.get(JACStrConst.WKPARA_CH_ZEIKOMI_AMNT);
		}

		for (int i = 0; i < dataList.size(); i++)
		{
			HashMap<String, Object> rsMap = new HashMap<String, Object>();

			dataMap = (HashMap)dataList.get(i);

			String okyaksmId = (String)dataMap.get("svc_kei_no");
			String goriyoNndk = (String)dataMap.get("seiky_ym");
			String twaGukisu = (String)dataMap.get("pcall_cnt_gk");
			String twaryoKngkKazei = (String)dataMap.get("kazeibun_prc_gk");
			String hyojiMiSyohizei = "     ";
			String twaryoKngkSyohizei = "               ";
			String twaryoKngkMnzei = (String)dataMap.get("menzeibun_prc_gk");
			String twaryoKngkZikm = (String)dataMap.get("pcall_prc_gk");
			String dnwBngu = (String)dataMap.get("kakins_telno");

			rsMap.put(OKYAKSM_ID, okyaksmId);
			rsMap.put(SIP_USER_ID, sipUserId);
			rsMap.put(SBS_SHUBT_CF, sbsShubtCf);
			rsMap.put(DNW_BNGU_TUBN, String.valueOf(i + 1));
			rsMap.put(GORIYO_NNDK, goriyoNndk);
			rsMap.put(HYOJI_MI_TWA, hyojiMiTwa);
			rsMap.put(TWA_GUKISU, JPCEditString.fillZero(twaGukisu, 4, false));
			rsMap.put(TNI_TWA, tniTwa);
			rsMap.put(HYOJI_MI_KAZEI, hyojiMiKazei);
			rsMap.put(TWARYO_KNGK_KAZEI, JPCFomatString.formatNumber(twaryoKngkKazei));
			rsMap.put(HYOJI_MI_SYOHIZEI, hyojiMiSyohizei);
			rsMap.put(TWARYO_KNGK_SYOHIZEI, twaryoKngkSyohizei);
			rsMap.put(HYOJI_MI_MNZEI, hyojiMiMnzei);
			rsMap.put(TWARYO_KNGK_MNZEI, JPCFomatString.formatNumber(twaryoKngkMnzei));
			rsMap.put(HYOJI_MI_ZIKM, hyojiMiZikm);
			rsMap.put(TWARYO_KNGK_ZIKM, JPCFomatString.formatNumber(twaryoKngkZikm));
			rsMap.put(DNW_BNGU, dnwBngu);

			rsList.add(rsMap);
		}

		return rsList;
	}

	/**
	 * 結果コードに対応する結果種別を取得します。<BR/>
	 * @param result 処理応答電文の結果コード
	 * @return 結果コードに対応する結果種別（WDA_COM_RTYPE）
	 */
	private static String getRtype(String result)
	{
		if (result == null)
		{
			return BLANK;
		}
		
		String rtype = rtype_result_map.get(result);
		return rtype == null ? BLANK : rtype;
	}

	/**
	 * Mapから共通セクタ情報を取得し、処理応答電文（共通セクタ）の形式に変換します。<BR/>
	 * @param paramMap 共通セクタ情報が格納されているMap
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private static String getCommonSector(HashMap<String, Object> paramMap)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(COMMON_SECTOR);
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_RTYPE);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_RTYPE));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_RESULT);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_RESULT));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL1);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL1));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL2);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL2));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL3);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL3));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL4);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL4));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL5);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL5));
		sb.append(System.getProperty(LINE_SEPARATOR));
		sb.append(WDA_COM_DETAIL6);
		sb.append(EQUAL);
		sb.append(getMapValue(paramMap, WDA_COM_DETAIL6));
		sb.append(System.getProperty(LINE_SEPARATOR));
		
		return sb.toString();
	}

	/**
	 * 正常時、処理応答電文(共通セクタ)の形式に変換された文字列を返却します。<BR/>
	 * @param rsltCd 処理応答電文の結果コード
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private static String getNomalCommonSector(String rsltCd)
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 結果コードに対応する種別を取得する
		paramMap.put(WDA_COM_RTYPE, getRtype(rsltCd));
		paramMap.put(WDA_COM_RESULT, rsltCd);
		
		return getCommonSector(paramMap);
	}

	/**
	 * 異常時、処理応答電文(共通セクタ)の形式に変換された文字列を返却します。<BR/>
	 * @param rsltCd 処理応答電文の結果コード
	 * @param action アクション(key)
	 * @param dtail 詳細ステータス(value)
	 * @param msg エラーメッセージ
	 * @return 処理応答電文（共通セクタ）の形式に変換された文字列
	 */
	private String getErrCommonSector(String rsltCd, String action, String dtail, String msg)
	{
		Exception ex = new Exception(msg);
		
		// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
		String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
		
		HashMap<String, Object> commonMap = new HashMap<String, Object>();
		
		// 結果コードに対応する種別を取得する
		commonMap.put(WDA_COM_RTYPE,   getRtype(rsltCd));
		commonMap.put(WDA_COM_RESULT,  rsltCd);
		commonMap.put(WDA_COM_DETAIL1, this.getClass().getName());
		commonMap.put(WDA_COM_DETAIL2, line_num);
		commonMap.put(WDA_COM_DETAIL3, BUSINESS_LOGIC_NM);
		commonMap.put(WDA_COM_DETAIL4, action);
		commonMap.put(WDA_COM_DETAIL5, BLANK);
		commonMap.put(WDA_COM_DETAIL6, dtail);
		
		return getCommonSector(commonMap);
	}

	/**
	 * Mapからシンプルセクタ情報を取得し、処理応答電文（シンプルセクタ）の形式に変換します。<BR/>
	 * @param paramMap シンプルセクタ情報が格納されているMap
	 * @return 処理応答電文（シンプルセクタ）の形式に変換された文字列
	 */
	private static String getSimpleSector(HashMap<String, Object> paramMap)
	{
		StringBuffer sb = new StringBuffer(BLANK);
		
		if (paramMap == null)
		{
			sb.append(SIMPLE_SECTOR);
			sb.append(System.getProperty(LINE_SEPARATOR));
			return sb.toString();
		}
		
		Iterator<String> iterator = paramMap.keySet().iterator();
		
		// マップに格納されているキーを全て取得するまで処理を繰り返す
		for (int i = 0; iterator.hasNext(); i++)
		{
			if (i == 0)
			{
				sb.append(SIMPLE_SECTOR);
				sb.append(System.getProperty(LINE_SEPARATOR));
			}
			
			String key = (String)iterator.next();
			
			sb.append(key);
			sb.append(EQUAL);
			sb.append(getMapValue(paramMap, key));
			sb.append(System.getProperty(LINE_SEPARATOR));
		}

		return sb.toString();
	}

	/**
	 * Listからマルチセクタ情報Mapを取得し、処理応答電文（マルチセクタ）の形式に変換します。<BR/>
	 * @param paramList マルチセクタ情報が格納されているMapのリスト
	 * @param sector_nm マルチセクタ定義部のセクタ名称（キー名）
	 * @return 処理応答電文（マルチセクタ）の形式に変換された文字列
	 */
	private static String getMultipleSector(ArrayList<HashMap<String, Object>> paramList, String sector_nm)
	{
		
		if (paramList == null)
		{
			return BLANK;
		}
		
		StringBuffer sb = new StringBuffer(BLANK);
		
		for (int i = 0; i < paramList.size(); i++)
		{
			HashMap<String, Object> mltiMap = (HashMap<String, Object>)paramList.get(i);
			
			Iterator<String> iterator = mltiMap.keySet().iterator();
			
			// マップに格納されているキーを全て取得するまで処理を繰り返す
			for (int j = 0; iterator.hasNext(); j++)
			{
				if (j == 0)
				{
					sb.append(MULTI_SECTOR_STA);
					sb.append(sector_nm);
					sb.append(MULTI_SECTOR_END);
					sb.append(System.getProperty(LINE_SEPARATOR));
				}
				
				String key = (String)iterator.next();
				
				sb.append(key);
				sb.append(EQUAL);
				sb.append(getMapValue(mltiMap, key));
				sb.append(System.getProperty(LINE_SEPARATOR));
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * 指定されたキーでマップの値を取得し返却します。<BR/>
	 * マップがnullの場合や値がnullの場合は空文字を返します。<BR/>
	 * 値に改行コード（CRまたはLF）がある場合は除去します。<BR/>
	 * @param map マップ
	 * @param key キー
	 * @return 値
	 */
	private static String getMapValue(HashMap<String, Object> map, String key)
	{
		if (map == null)
		{
			return BLANK;
		}
		
		String value = (String)map.get(key);
		
		if (value == null)
		{
			return BLANK;
		}
		
		// nullでなければ、改行コード（CRLF）の除去
		value = value.replace(CD_CR, BLANK);
		value = value.replace(CD_LF, BLANK);
		
		return value;
	}

	/**
	 * 業務規制エラーがあるかどうか判定します。
	 * <br>
	 * @param returnData 返却電文
	 * @return boolean true：業務規制エラーあり、false：業務規制エラーなし
	 */
	private boolean restrictionCheck(StringBuffer returnData) 
	{
		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// リクエスト業務規制リスト
		X31SDataBeanAccessArray restrictionBeanArray =
				commonInfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);

		// 共有フォームBeanの業務規制フラグ(REQUEST_RESTRICTION_FLG_04)が１つでも、"1:規制中"となっている場合
		for (int i = 0; i < restrictionBeanArray.getCount(); i++)
		{
			X31SDataBeanAccess commonSubbean = restrictionBeanArray.getDataBean(i);

			// 業務規制フラグが立っていた場合
			if (FLG_ON.equals(commonSubbean.sendMessageString(
					CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// "M" "007001" "メンテナンス中です。"
				DEBUG_LOG.debug(EX_MSG_MAINTE);

				// 処理応答電文（共通セクタ）の形式に変換
				returnData.append(getErrCommonSector(RSLT_CD_MAINTE, "", SERVER_NM, EX_MSG_MAINTE));

				// 返却値の設定
				bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());
				return true;
			}
		}

		return false;
	}

	/**
	 * 必須チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @param returnData 返却電文
	 * @return boolean true：必須チェックエラーあり、false：必須チェックエラーなし
	 */
	private boolean requireCheck(HashMap<String, Object> reqMap, StringBuffer returnData)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String chkErrorItem = getRequireErrItem(reqMap);

		if (!JCRUtilCommon.isNull(chkErrorItem))
		{
			// "E" "009008"（必須項目が未設定の場合）
			Exception ex = new Exception(EX_MSG_MUST);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// エラー情報をマップに設定する
			HashMap<String, Object> errMap = setErrMap(RSLT_CD_MUST, line_num, BUSINESS_LOGIC_NM, chkErrorItem, "", "");

			// 処理応答電文（共通セクタ）の形式に変換
			returnData.append(JKKApiCommon.getCommonSector(errMap));

			// 返却値の設定
			bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());

			return true;
		}

		return false;
	}

	/**
	 * 数値属性チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @param returnData 返却電文
	 * @return boolean true：数値チェックエラーあり、false：数値チェックエラーなし
	 */
	private boolean numberCheck(HashMap<String, Object> reqMap, StringBuffer returnData)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String chkErrorItem = getNumberErrItem(reqMap);

		if (!JCRUtilCommon.isNull(chkErrorItem))
		{
			// "E" "009009"（数値属性でない場合）
			Exception ex = new Exception(EX_MSG_NUMBER);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// エラー情報をマップに設定する
			HashMap<String, Object> errMap = setErrMap(RSLT_CD_NUMBER_CHK, line_num, BUSINESS_LOGIC_NM, chkErrorItem, "", "");

			// 処理応答電文（共通セクタ）の形式に変換
			returnData.append(JKKApiCommon.getCommonSector(errMap));

			// 返却値の設定
			bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());

			return true;
		}

		return false;
	}

	/**
	 * 最大桁数エラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @param returnData 返却電文
	 * @return boolean true：最大桁数エラーあり、false：最大桁数エラーなし
	 */
	private boolean lengthCheck(HashMap<String, Object> reqMap, StringBuffer returnData)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		HashMap<String, Object> lengthErrMap = getLengthErrItem(reqMap);
		
		if (!JCRUtilCommon.isNull(lengthErrMap))
		{
			// "E" "009010"（パラメータ値の最大桁数を超えた場合）
			Exception ex = new Exception(EX_MSG_KETA);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// エラー情報をマップに設定する
			HashMap<String, Object> errMap =
				setErrMap(RSLT_CD_KETA, line_num, BUSINESS_LOGIC_NM, (String)lengthErrMap.get("item_name"), "", (String)lengthErrMap.get("item_value"));

			// 処理応答電文（共通セクタ）の形式に変換
			returnData.append(JKKApiCommon.getCommonSector(errMap));

			// 返却値の設定
			bean.sendMessageString(ACA001SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, returnData.toString());

			return true;
		}

		return false;
	}

	/**
	 * 項目の必須チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 必須チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getRequireErrItem(HashMap<String, Object> reqMap) 
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		String dnwBngu = (String)reqMap.get(DNW_BNGU);							// 電話番号
		String okyaksmId = (String)reqMap.get(OKYAKSM_ID);						// お客様ＩＤ
		String sbsShubtCf = (String)reqMap.get(SBS_SHUBT_CF);					// サービス種別区分
		String callSpecTableCode = (String)reqMap.get(CALL_SPEC_TABLE_CODE);	// テーブル番号

		// 電話番号の必須チェックを行う
		if (JCRUtilCommon.isNull(dnwBngu))
		{
			return DNW_BNGU;
		}

		// お客様ＩＤの必須チェックを行う
		if (JCRUtilCommon.isNull(okyaksmId))
		{
			return OKYAKSM_ID;
		}

		// サービス種別区分の必須チェックを行う
		if (JCRUtilCommon.isNull(sbsShubtCf))
		{
			return SBS_SHUBT_CF;
		}

		// サービス種別区分の必須チェックを行う
		if (JCRUtilCommon.isNull(callSpecTableCode))
		{
			return CALL_SPEC_TABLE_CODE;
		}

		return null;
	}

	/**
	 * 項目の数値属性チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 数値属性チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getNumberErrItem(HashMap<String, Object> reqMap)
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		String dnwBngu = reqMap.get(DNW_BNGU).toString().trim();				// 電話番号
		String sbsShubtCf = (String)reqMap.get(SBS_SHUBT_CF);					// サービス種別区分
		String callSpecTableCode = (String)reqMap.get(CALL_SPEC_TABLE_CODE);	// テーブル番号

		// 電話番号の数値属性チェックを行う
		if (!JKKApiCommon.isNumber(dnwBngu))
		{
			return DNW_BNGU;
		}

		// サービス種別区分の数値属性チェックを行う
		if (!JKKApiCommon.isNumber(sbsShubtCf))
		{
			return SBS_SHUBT_CF;
		}

		// テーブル番号の数値属性チェックを行う
		if (!JKKApiCommon.isNumber(callSpecTableCode))
		{
			return CALL_SPEC_TABLE_CODE;
		}

		return null;
	}

	/**
	 * 項目の最大桁数チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 最大桁数チェックでエラーが発生した場合、エラーとなった項目と項目の値を設定する、エラーでない場合は、nullを返却
	 */
	private HashMap<String, Object> getLengthErrItem(HashMap<String, Object> reqMap)
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		String dnwBngu = (String)reqMap.get(DNW_BNGU);							// 電話番号
		String sipUserId = (String)reqMap.get(SIP_USER_ID);						// ＳＩＰユーザＩＤ
		String okyaksmId = (String)reqMap.get(OKYAKSM_ID);						// お客様ＩＤ
		String sbsShubtCf = (String)reqMap.get(SBS_SHUBT_CF);					// サービス種別区分
		String callSpecTableCode = (String)reqMap.get(CALL_SPEC_TABLE_CODE);	// テーブル番号

		HashMap<String, Object> lengthErrMap = new HashMap<String, Object>();

		// 電話番号の最大桁数チェックを行う
		if (12 < dnwBngu.length())
		{
			lengthErrMap.put("item_name", DNW_BNGU);
			lengthErrMap.put("item_value", dnwBngu);
			return lengthErrMap;
		}

		// ＳＩＰユーザＩＤの最大桁数チェックを行う
		if (sipUserId != null && 16 < sipUserId.length())
		{
			lengthErrMap.put("item_name", SIP_USER_ID);
			lengthErrMap.put("item_value", sipUserId);
			return lengthErrMap;
		}

		// お客様ＩＤの最大桁数チェックを行う
		if (10 < okyaksmId.length())
		{
			lengthErrMap.put("item_name", OKYAKSM_ID);
			lengthErrMap.put("item_value", okyaksmId);
			return lengthErrMap;
		}

		// サービス種別区分の最大桁数チェックを行う
		if (1 < sbsShubtCf.length())
		{
			lengthErrMap.put("item_name", SBS_SHUBT_CF);
			lengthErrMap.put("item_value", sbsShubtCf);
			return lengthErrMap;
		}

		// テーブル番号の最大桁数チェックを行う
		if (1 < callSpecTableCode.length())
		{
			lengthErrMap.put("item_name", CALL_SPEC_TABLE_CODE);
			lengthErrMap.put("item_value", callSpecTableCode);
			return lengthErrMap;
		}

		return null;
	}

	/**
	 * エラー情報をマップに設定します。
	 * <br>
	 * @param result 結果コードに設定する値
	 * @param detail2 詳細情報2に設定する値
	 * @param detail3 詳細情報3に設定する値
	 * @param detail4 詳細情報4に設定する値
	 * @param detail5 詳細情報5に設定する値
	 * @param detail6 詳細情報6に設定する値
	 * @return エラー情報を格納したMAP
	 */
	private HashMap<String, Object> setErrMap(String result, String detail2, String detail3, String detail4, String detail5, String detail6)
	{
		HashMap<String, Object> errMap = new HashMap<String, Object>();

		errMap.put(WDA_COM_RTYPE, getRtype(result));
		errMap.put(WDA_COM_RESULT, result);
		errMap.put(WDA_COM_DETAIL1, this.getClass().getName());
		errMap.put(WDA_COM_DETAIL2, detail2);
		errMap.put(WDA_COM_DETAIL3, detail3);
		errMap.put(WDA_COM_DETAIL4, detail4);
		errMap.put(WDA_COM_DETAIL5, detail5);
		errMap.put(WDA_COM_DETAIL6, detail6);

		return errMap;

	}

}
