/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSysidIchiiSearchCmpCC
*   ソースファイル名：JCKSysidIchiiSearchCmpCC.java
*   作成者          ：FJ
*	日付			：2022年07月12日
*＜機能概要＞
*   SYSID一意照会(CMP)CC
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v60.00.00	2022/07/12	FJ)南		【ANK-4266-00-00】eoID照会・eoIDパスワード変更フォームの改善対応
*	v60.00.01	2022/08/03	FJ)南		【ANK-4266-01-00】入力パラメータの電話番号について最大桁数を14桁に変更する
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
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.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.EmsizeCharCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011B515CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B515CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B516CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B516CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B517CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B517CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA1900001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA1900001CBSMsg1List;

/**
 * SYSID一覧照会(CMP)CC
 * 
 * @author 富士通
 */
public class JCKSysidIchiiSearchCmpCC  extends AbstractCommonComponent
{
	// ----------
	// TemplateID
	// ----------
	/** SYSID一覧照会（CMP連携用） */
	private static final String TEMPLATE_ID_EKK0011B515 = "ECK0011B515";
	/** SYSID一覧照会（CMP連携用）2 */
	private static final String TEMPLATE_ID_EKK0011B516 = "ECK0011B516";
	/** SYSID一覧照会（CMP連携用）3 */
	private static final String TEMPLATE_ID_EKK0011B517 = "ECK0011B517";
	/** 契約サービス照会（MVNO） */
	private static final String TEMPLATE_ID_EKKA1900001 = "EKKA1900001";
	
	// ------------------------
	// CCパラメータ
	// ------------------------
	/** CCパラメータ：ボディ情報 */
	private static final String CC_PARAM_BODY_INFO = "BODY_INFO";
	/** CCパラメータ：エラー情報 */
	private static final String CC_PARAM_ERROR_INFO = "ERROR_INFO";
	/** エラーコードマップキー*/
	private static final String CC_PARAM_ERR_CD = "errCode";
	/** エラーメッセージマップキー*/
	private static final String CC_PARAM_ERR_MSG = "errMessage";
	
	// ------------------------
	// パラメータ定数
	// ------------------------
	/** パラメータ 検索条件パターン */
	private static final String IN_PARAM_SEARCH_JK_PTN = "search_jk_ptn";
	/** パラメータ 電話番号 */
	private static final String IN_PARAM_TELNO = "telno";
	/** パラメータ お客様カナ名 */
	private static final String IN_PARAM_CUST_KANA = "cust_kana";
	/** パラメータ お客様生年月日 */
	private static final String IN_PARAM_CUST_BIRTHD = "cust_birthd";
	/** パラメータ 連絡先メールアドレス */
	private static final String IN_PARAM_RRKS_MLAD = "rrks_mlad";
	/** パラメータ 初期eoID */
	private static final String IN_PARAM_SHK_EOID = "shk_eoid";
	/** パラメータ 初期eoIDパスワード */
	private static final String IN_PARAM_SHK_EOID_PWD = "shk_eoid_pwd";
	/** パラメータ SYSID */
	private static final String IN_PARAM_SYSID = "sysid";
	
	/** 必須チェック 必須（NOT NULL ＝ ○） */
	private static final String HISSU_CHK_HISSU = "1";
	/** 必須チェック 任意（NOT NULL ≠ ○） */
	private static final String HISSU_CHK_NINI = "0";
	/** 属性チェック 半角数字1 */
	private static final String ZOKU_CHK_NUMBER1 = "1";
	/** 属性チェック 半角英数字2 */
	private static final String ZOKU_CHK_ENNUMBER2 = "2";
	/** 属性チェック 全角英数字カナ */
	private static final String ZOKU_CHK_EMSIZEENNUMKANA = "3";
	/** 属性チェック TEL1 */
	// ANK-4266-01-00 MOD START
	// private static final String ZOKU_CHK_TEL2 = "4";
	private static final String ZOKU_CHK_TEL1 = "4";
	// ANK-4266-01-00 MOD END
	/** 属性チェック 年月日1 */
	private static final String ZOKU_CHK_YMD1 = "5";
	/** 桁数チェック 最小値 */
	private static final int LEN_CHK_MIN = 0;
	/** 桁数チェック 最大値 */
	private static final int LEN_CHK_MAX = 1;
	
	// ----------
	// エラー定数
	// ----------
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	
	/** エラーコード 必須チェックエラー*/
	private static final String REQUIRED_ERROR  = "1001";
	/** エラーコード 属性チェックエラー*/
	private static final String ATTRIBUTE_ERROR = "1002";
	/** エラーコード 桁数チェックエラー*/
	private static final String LENGTH_ERROR    = "1003";
	/** エラーコード 検索条件パターンチェックエラー*/
	private static final String SEARCH_JK_PTN_ERROR    = "1004";
	/** エラーコード 件数結果チェックエラー(0件)*/
	private static final String CNT_RSLT_ERR_0    = "2001";
	/** エラーコード 件数結果チェックエラー(2件以上)*/
	private static final String CNT_RSLT_ERR_2 = "2002";
	
	// ----------
	// 検索条件パターン定数
	// ----------
	/** 検索条件パターン 1 */
	private static final String SEARCH_JK_PTN_1 = "1"; 
	/** 検索条件パターン 2 */
	private static final String SEARCH_JK_PTN_2 = "2";
	/** 検索条件パターン 3 */
	private static final String SEARCH_JK_PTN_3 = "3";
	/** 検索条件パターン 4 */
	private static final String SEARCH_JK_PTN_4 = "4";
	/** 検索条件パターン 5 */
	private static final String SEARCH_JK_PTN_5 = "5";
	
	/**
	 * <p>
	 *  SYSID一意照会(CMP)CCを実行する。
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable 
	{
		// リクエスト情報
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// レスポンスマップ
		HashMap<String, Object> outMap = new HashMap<String, Object>();
		param.setData(fixedText, outMap);
		// 業務エラー用返却マップ
		HashMap<String, Object> errBlankMap = new HashMap<String, Object>();
		// 業務エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		try
		{
			// 入力パラメータチェックを実行する
			// 単項目チェック
			if (!checkUnitParam(ccMsg, outMap, errBlankMap))
			{
				// 単項目チェックでエラーの場合は業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}
			// 検索条件パターン
			String searchJkPtn = (String)ccMsg.get(IN_PARAM_SEARCH_JK_PTN);
			// 電話番号
			String telNo = (String)ccMsg.get(IN_PARAM_TELNO);
			// SYSID (レスポンスパラメータ)
			String sysid = "";
			// SYSID取得件数
			int sysidCnt = 0;
			// 件数結果チェック業務エラー(0件)フラグ 
			boolean cntRsltWkErrFlg0 = false;
			// 件数結果チェック業務エラー(2件以上)フラグ
			boolean cntRsltWkErrFlg2 = false;
			
			// 検索条件パターンが、１〜４の場合
			if (SEARCH_JK_PTN_1.equals(searchJkPtn) || SEARCH_JK_PTN_2.equals(searchJkPtn) || SEARCH_JK_PTN_3.equals(searchJkPtn) || SEARCH_JK_PTN_4.equals(searchJkPtn))
			{
				// SYSID一覧照会（CMP連携用）を実行
				CAANMsg[] eck0011b515List = callECK0011B515(handle, param, fixedText, ccMsg);
				sysidCnt = sysidCntChk(eck0011b515List);
				int sysidCnt515 = sysidCnt;
				// 取得件数が0件の場合
				if (sysidCnt515 == 0)
				{
					// 件数結果チェックエラー（0件）
					cntRsltWkErrFlg0 = true;
				}
				// 取得件数が2以上の場合
				else if ((sysidCnt515 == 2))
				{
					// 検索条件パターンが、１、２の場合
					if ((SEARCH_JK_PTN_1.equals(searchJkPtn) || SEARCH_JK_PTN_2.equals(searchJkPtn)))
					{
						// 件数結果チェックエラー（2件以上）
						cntRsltWkErrFlg2 = true;
					}
					// 検索条件パターンが、３、４の場合
					else if ((SEARCH_JK_PTN_3.equals(searchJkPtn) || SEARCH_JK_PTN_4.equals(searchJkPtn)))
					{
						// システムエラー
						Throwable e = new Throwable();
						throw e;
					}
				}
				else if ((sysidCnt515 == 1))
				{
					// 正常時、SYSIDを取得
					sysid = eck0011b515List[0].getString(ECK0011B515CBSMsg1List.SYSID);
				}
			}
			// 検索条件パターンが、５の場合
			else if (SEARCH_JK_PTN_5.equals(searchJkPtn))
			{
				// SYSID一覧照会（CMP連携用）2を実行
				CAANMsg[] eck0011b516List = callECK0011B516(handle, param, fixedText, ccMsg);
				sysidCnt = sysidCntChk(eck0011b516List);
				int sysidCnt516 = sysidCnt;
				// ECK0011B516の取得件数が2以上の場合
				if ((sysidCnt516 == 2))
				{
					// システムエラー
					Throwable e = new Throwable();
					throw e;
				}
				// 取得件数が2件未満の場合
				else
				{
					// SYSID一覧照会（CMP連携用）3を実行
					CAANMsg[] eck0011b517List = callECK0011B517(handle, param, fixedText, ccMsg);
					sysidCnt = sysidCntChk(eck0011b517List);
					int sysidCnt517 = sysidCnt;
					// ECK0011B517の取得件数が2以上
					if ((sysidCnt517 == 2))
					{
						// システムエラー
						Throwable e = new Throwable();
						throw e;
					}
					// ECK0011B516の取得件数が0件かつ、ECK0011B517の取得件数が0件の場合
					else if (sysidCnt516 == 0 && sysidCnt517 == 0)
					{
						// 件数結果チェックエラー（0件）
						cntRsltWkErrFlg0 = true;
					}
					// ECK0011B516の取得件数が0件かつ、ECK0011B517の取得件数が1件の場合
					else if (sysidCnt516 == 0 && sysidCnt517 == 1)
					{
						sysid = eck0011b517List[0].getString(ECK0011B517CBSMsg1List.SYSID);
						
						// 契約サービス照会(MVNO)（EKKA1900001）を呼び出す。
						CAANMsg[] ekka1900001List = callEKKA1900001(handle, param, fixedText, sysid);
						
						if (ekka1900001List != null && ekka1900001List.length > 0)
						{
							boolean telNoFlg = false;
							for (CAANMsg ekka1900001Msg : ekka1900001List)
							{
								String mvnoTelNo = ekka1900001Msg.getString(EKKA1900001CBSMsg1List.TELNUM);
								// リクエストの電話番号と、MVNO電話番号が一致する場合
								if ((telNo.equals(mvnoTelNo)) && !(mvnoTelNo == null))
								{
									telNoFlg = true;
								}
							}
							
							if (telNoFlg)
							{
								// 正常時、SYSIDを取得
								sysid = eck0011b517List[0].getString(ECK0011B517CBSMsg1List.SYSID);
							}
							else if (!telNoFlg)
							{
								// 件数結果チェックエラー（0件）
								cntRsltWkErrFlg0 = true;
							}
						}
						else
						{
							// 件数結果チェックエラー（0件）
							cntRsltWkErrFlg0 = true;
						}
					}
					// ECK0011B516の取得件数が1件かつ、ECK0011B517の取得件数が1件の場合
					else if (sysidCnt516 == 1 && sysidCnt517 == 1)
					{
						String sysid516 = eck0011b516List[0].getString(ECK0011B516CBSMsg1List.SYSID);
						String sysid517 = eck0011b517List[0].getString(ECK0011B517CBSMsg1List.SYSID);
						// ECK0011B516とECK0011B517で取得したSYSIDが一致する場合
						if ( (sysid517.equals(sysid516)) )
						{
							// 正常時、SYSIDを取得
							sysid = eck0011b516List[0].getString(ECK0011B516CBSMsg1List.SYSID);
						}
						else
						{
							// システムエラー
							Throwable e = new Throwable();
							throw e;
							
						}
					}
					// ECK0011B516の取得件数が1件かつ、ECK0011B517の取得件数が0件の場合
					else if (sysidCnt516 == 1 && sysidCnt517 == 0)
					{
						// 正常時、SYSIDを取得
						sysid = eck0011b516List[0].getString(ECK0011B516CBSMsg1List.SYSID);
					}
				}
			}
			
			if ( !(cntRsltErrChk(cntRsltWkErrFlg0, cntRsltWkErrFlg2, outMap, errList, errBlankMap)) )
			{
				// 業務エラー
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}
			
			// 正常終了
			outMap.put(IN_PARAM_SYSID, sysid);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
		}
		catch (Throwable e)
		{
			// 取得に失敗した場合
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			throw new CCException("", e);
		}
		return param;
	}
	
	/**
	 * 単項目チェック
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg, Map<String, Object> outMap, HashMap<String, Object> errBlankMap)
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		String itemName = null;
		String itemValue = null;
		boolean searchJkPtnFlg = false;
		
		// 検索条件パターン
		itemName = IN_PARAM_SEARCH_JK_PTN;
		itemValue = (String)ccMsg.get(itemName);
		singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_HISSU, ZOKU_CHK_NUMBER1, new int[] { 1, 1 }, errList);
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			outMap.put(CC_PARAM_ERROR_INFO, errList);
			// body部を空にする
			outMap.put(CC_PARAM_BODY_INFO, errBlankMap);
			return false;
		}
		
		// 検索条件パターン取得
		String search_jk_ptn = (String)ccMsg.get(IN_PARAM_SEARCH_JK_PTN);
		
		String[][] PATTERN_SHITEI_TBL = {
				{IN_PARAM_TELNO,IN_PARAM_CUST_KANA,IN_PARAM_CUST_BIRTHD},
				{IN_PARAM_TELNO,IN_PARAM_RRKS_MLAD},
				{IN_PARAM_TELNO,IN_PARAM_SHK_EOID,IN_PARAM_SHK_EOID_PWD},
				{IN_PARAM_CUST_KANA,IN_PARAM_CUST_BIRTHD,IN_PARAM_RRKS_MLAD,IN_PARAM_SHK_EOID,IN_PARAM_SHK_EOID_PWD},
				{IN_PARAM_TELNO,IN_PARAM_CUST_KANA,IN_PARAM_CUST_BIRTHD,IN_PARAM_SHK_EOID,IN_PARAM_SHK_EOID_PWD}
		};
		
		String[][] PATTERN_SHITEIGAI_TBL = {
				{IN_PARAM_RRKS_MLAD, IN_PARAM_SHK_EOID, IN_PARAM_SHK_EOID_PWD},
				{IN_PARAM_CUST_KANA, IN_PARAM_CUST_BIRTHD, IN_PARAM_SHK_EOID, IN_PARAM_SHK_EOID_PWD},
				{IN_PARAM_CUST_KANA, IN_PARAM_CUST_BIRTHD, IN_PARAM_RRKS_MLAD},
				{IN_PARAM_TELNO},
				{IN_PARAM_RRKS_MLAD}
		};
		
		int n = Integer.parseInt(search_jk_ptn) - 1;
		
		if (n >= 0 && n <= 4)
		{
			for (int i = 0; i < PATTERN_SHITEI_TBL[n].length; i++)
			{
				if (ccMsg.containsKey(PATTERN_SHITEI_TBL[n][i]))
				{
					itemName = PATTERN_SHITEI_TBL[n][i];
					itemValue = (String)ccMsg.get(itemName);
					// 検索条件パターンで指定項目のエラーチェック
					errChk(ccMsg, itemName, itemValue, errList);
				}
				else 
				{
					searchJkPtnFlg = true;
				}
			}
			for (int i = 0; i < PATTERN_SHITEIGAI_TBL[n].length; i++)
			{
				if (ccMsg.containsKey(PATTERN_SHITEIGAI_TBL[n][i]) )
				{
					searchJkPtnFlg = true;
				}
			}
			if (searchJkPtnFlg)
			{
				// 検索条件パターンチェックエラー
				errList.add(createErrorMap2(SEARCH_JK_PTN_ERROR));
			}
		}
		else
		{
			// 検索条件パターンが、１〜５以外の場合
			errList.add(createErrorMap2(SEARCH_JK_PTN_ERROR));
		}
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			outMap.put(CC_PARAM_ERROR_INFO, errList);
			// body部を空にする
			outMap.put(CC_PARAM_BODY_INFO, errBlankMap);
			return false;
		}
		return true;
	}
	
	/**
	 * リクエスト項目毎に単項目チェックを実施
	 * @param ccMsg
	 * @param itemName 項目名
	 * @param itemValue 項目値
	 * @param errList エラーリスト
	 */
	private void errChk(Map<String, Object> ccMsg, String itemName, String itemValue, List<Map<String, String>> errList)
	{
		if (IN_PARAM_TELNO.equals(itemName))
		{
			// ANK-4266-01-00 MOD START
			// singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_TEL2, new int[] { 10, 11 }, errList);
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_TEL1, new int[] { 10, 14 }, errList);
			// ANK-4266-01-00 MOD END
		}
		else if (IN_PARAM_CUST_KANA.equals(itemName))
		{
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_EMSIZEENNUMKANA, new int[] { 1, 121 }, errList);
		}
		else if (IN_PARAM_CUST_BIRTHD.equals(itemName))
		{
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_YMD1, new int[] { 8, 8 }, errList);
		}
		else if (IN_PARAM_RRKS_MLAD.equals(itemName))
		{
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_ENNUMBER2, new int[] { 1, 256 }, errList);
		}
		else if (IN_PARAM_SHK_EOID.equals(itemName))
		{
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_ENNUMBER2, new int[] { 1, 80 }, errList);
		}
		else if (IN_PARAM_SHK_EOID_PWD.equals(itemName))
		{
			singleItemChk(ccMsg, itemName, itemValue, HISSU_CHK_NINI, ZOKU_CHK_ENNUMBER2, new int[] { 1, 8 }, errList);
		}
	}
	
	/**
	 * 必須・属性・桁数チェック
	 * @param ccMsg 識別コードマップ
	 * @param itemName 項目名
	 * @param itemValue 項目値
	 * @param hissuChkKbn 1：必須項目 0：任意項目
	 * @param zokuChkKbn 属性
	 * @param lenChkKbn lenCheck[0]：最小値 lenCheck[1]最大値
	 * @param errList エラーリスト
	 */
	private void singleItemChk(Map<String, Object> ccMsg,
								String itemName,
								String itemValue,
								String hissuChkKbn,
								String zokuChkKbn,
								int lenChkKbn[],
								List<Map<String, String>> errList)
	{
		// 必須チェック・値の存在チェック
		if ( JKKStringUtil.isNullBlank(itemValue) )
		{
			// 必須チェック（必須項目の場合必須チェックエラー）
			if(HISSU_CHK_HISSU.equals(hissuChkKbn))
			{
				// 必須チェックエラー
				errList.add(createErrorMap(itemName, itemValue, REQUIRED_ERROR));
				return;
			}
		}
		// 桁数チェック
		int min = lenChkKbn[LEN_CHK_MIN];
		int max = lenChkKbn[LEN_CHK_MAX];
		
		if(min == max)
		{
			// 桁数1
			if(!LengthCheck.isLength1Check(itemValue, max))
			{
				// 桁数チェックエラー
				errList.add(createErrorMap(itemName, itemValue, LENGTH_ERROR));
				return;
			}
		}
		else
		{
			// 桁数2
			if(!LengthCheck.isLength2Check(itemValue, min, max))
			{
				// 桁数チェックエラー
				errList.add(createErrorMap(itemName, itemValue, LENGTH_ERROR));
				return;
			}
		}
		// 属性チェック
		if(ZOKU_CHK_NUMBER1.equals(zokuChkKbn))
		{
			// 半角数字1
			if(!HalfCharCheck.isNumber1Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR));
				return;
			}
		}
		// ANK-4266-01-00 MOD START
		// else if(ZOKU_CHK_TEL2.equals(zokuChkKbn))
		else if(ZOKU_CHK_TEL1.equals(zokuChkKbn))
		// ANK-4266-01-00 MOD END
		{
			// TEL1
			// ANK-4266-01-00 MOD START
			// if(!HalfCharCheck.isTelno2Check(itemValue))
			if(!HalfCharCheck.isTelno1Check(itemValue))
			// ANK-4266-01-00 MOD END
			{
				// 属性チェックエラー
				errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR));
				return;
			}
		}
		else if(ZOKU_CHK_EMSIZEENNUMKANA.equals(zokuChkKbn))
		{
			// 全角英数字カナ
			if(!EmsizeCharCheck.isEmsizeEnNumKanaCheck(itemValue))
			{
				// 属性チェックエラー
				errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR));
				return;
			}
		}
		else if(ZOKU_CHK_YMD1.equals(zokuChkKbn))
		{
			// 年月日1
			if(!DatetimeCheck.isDateCheck(itemValue))
			{
				// 属性チェックエラー
				errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR));
				return;
			}
		}
		else if(ZOKU_CHK_ENNUMBER2.equals(zokuChkKbn))
		{
			// 半角英数字2
			if(!HalfCharCheck.isEnNumber2Check(itemValue))
			{
				// 属性チェックエラー
				errList.add(createErrorMap(itemName, itemValue, ATTRIBUTE_ERROR));
				return;
			}
		}
	}
	
	/**
	 * 件数結果チェック
	 * @param cntRsltWkErrFlg0
	 * @param cntRsltWkErrFlg2
	 * @param outMap
	 * @param errList
	 * @param errBlankMap
	 */
	private boolean cntRsltErrChk(boolean cntRsltWkErrFlg0, 
									boolean cntRsltWkErrFlg2, 
									Map<String, Object> outMap, 
									List<Map<String, String>> errList,
									HashMap<String, Object> errBlankMap)
	{
		if (cntRsltWkErrFlg0)
		{
			// 件数結果チェックエラー（0件）
			errList.add(createErrorMap2(CNT_RSLT_ERR_0));
		}
		else if (cntRsltWkErrFlg2)
		{
			// 件数結果チェックエラー（2件以上）
			errList.add(createErrorMap2(CNT_RSLT_ERR_2));
		}
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			outMap.put(CC_PARAM_ERROR_INFO, errList);
			outMap.put(CC_PARAM_BODY_INFO, errBlankMap);
			return false;
		}
		return true;
	}
	
	/**
	 * ECK0011B515_SYSID一覧照会（CMP連携用）を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param reqJkMap リクエスト条件マップ
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0011B515(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> reqJkMap) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SYSID一覧照会（CMP連携用）の上りマッピング
		Object[][] ECK0011B515In =
		{
			{ECK0011B515CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011B515},
			{ECK0011B515CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}, 							// 機能コード："1"
			{ECK0011B515CBSMsg.KEY_TELNO, reqJkMap.get(IN_PARAM_TELNO)},						// ＫＥＹ＿電話番号
			{ECK0011B515CBSMsg.KEY_CUST_KANA, reqJkMap.get(IN_PARAM_CUST_KANA)},				// ＫＥＹ＿お客様カナ名
			{ECK0011B515CBSMsg.KEY_CUST_BIRTHD, reqJkMap.get(IN_PARAM_CUST_BIRTHD)},			// ＫＥＹ＿生年月日
			{ECK0011B515CBSMsg.KEY_RRKS_MLAD, reqJkMap.get(IN_PARAM_RRKS_MLAD)},				// ＫＥＹ＿連絡先メールアドレス
			{ECK0011B515CBSMsg.KEY_SHK_EOID, reqJkMap.get(IN_PARAM_SHK_EOID)},					// ＫＥＹ＿初期eoID
			{ECK0011B515CBSMsg.KEY_SHK_EOID_PWD, reqJkMap.get(IN_PARAM_SHK_EOID_PWD)}			// ＫＥＹ＿初期eoIDパスワード
		};
		
		// サービスIF実行
		CAANMsg[] ECK0011B515Out = callSC(handle, scCall, param, fixedText, ECK0011B515In).getCAANMsgList(ECK0011B515CBSMsg.ECK0011B515CBSMSG1LIST);
		
		// 結果を返却
		return ECK0011B515Out;
	}
	
	/**
	 * ECK0011B516_SYSID一覧照会（CMP連携用）2を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param reqJkMap リクエスト条件マップ
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0011B516(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> reqJkMap) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SYSID一覧照会（CMP連携用）の上りマッピング
		Object[][] ECK0011B516In =
		{
			{ECK0011B516CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011B516},
			{ECK0011B516CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}, 							// 機能コード："1"
			{ECK0011B516CBSMsg.KEY_TELNO, reqJkMap.get(IN_PARAM_TELNO)},						// ＫＥＹ＿電話番号
			{ECK0011B516CBSMsg.KEY_CUST_KANA, reqJkMap.get(IN_PARAM_CUST_KANA)},				// ＫＥＹ＿お客様カナ名
			{ECK0011B516CBSMsg.KEY_CUST_BIRTHD, reqJkMap.get(IN_PARAM_CUST_BIRTHD)},			// ＫＥＹ＿生年月日
			{ECK0011B516CBSMsg.KEY_SHK_EOID, reqJkMap.get(IN_PARAM_SHK_EOID)},					// ＫＥＹ＿初期eoID
			{ECK0011B516CBSMsg.KEY_SHK_EOID_PWD, reqJkMap.get(IN_PARAM_SHK_EOID_PWD)}			// ＫＥＹ＿初期eoIDパスワード
		};
		
		// サービスIF実行
		CAANMsg[] ECK0011B516Out = callSC(handle, scCall, param, fixedText, ECK0011B516In).getCAANMsgList(ECK0011B516CBSMsg.ECK0011B516CBSMSG1LIST);
		
		// 結果を返却
		return ECK0011B516Out;
	}
	
	/**
	 * ECK0011B517_SYSID一覧照会（CMP連携用）3を実行する。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param reqJkMap リクエスト条件マップ
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] callECK0011B517(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> reqJkMap) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// SYSID一覧照会（CMP連携用）の上りマッピング
		Object[][] ECK0011B517In =
		{
			{ECK0011B517CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0011B517},
			{ECK0011B517CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}, 								// 機能コード："1"
			{ECK0011B517CBSMsg.KEY_CUST_KANA, reqJkMap.get(IN_PARAM_CUST_KANA)},					// ＫＥＹ＿お客様カナ名
			{ECK0011B517CBSMsg.KEY_CUST_BIRTHD, reqJkMap.get(IN_PARAM_CUST_BIRTHD)},				// ＫＥＹ＿生年月日
			{ECK0011B517CBSMsg.KEY_SHK_EOID, reqJkMap.get(IN_PARAM_SHK_EOID)},						// ＫＥＹ＿初期eoID
			{ECK0011B517CBSMsg.KEY_SHK_EOID_PWD, reqJkMap.get(IN_PARAM_SHK_EOID_PWD)}				// ＫＥＹ＿初期eoIDパスワード
		};
		
		// サービスIF実行
		CAANMsg[] ECK0011B517Out = callSC(handle, scCall, param, fixedText, ECK0011B517In).getCAANMsgList(ECK0011B517CBSMsg.ECK0011B517CBSMSG1LIST);
		
		// 結果を返却
		return ECK0011B517Out;
	}
	
	/**
	 * 契約サービス照会(MVNO)
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return CAANMsg[] 検索結果
	 * @throws Throwable
	 */
	private CAANMsg[] callEKKA1900001(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid) throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 契約サービス照会(MVNO) EKKA1900001
		Object[][] ekka1900001In = {{EKKA1900001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA1900001},
									{EKKA1900001CBSMsg.FUNC_CODE, "1"},								// 機能コード："1"
									{EKKA1900001CBSMsg.KEYSBT, "1"},								// キー種別："1"
									{EKKA1900001CBSMsg.KEYVAL, sysid},								// キー値：SYSID
									{EKKA1900001CBSMsg.SVCSBT, "010"},								// サービス種別："010"
									{EKKA1900001CBSMsg.KEIYAKUSTS, "4"}								// 契約状態："4"
									};
		// 実行
		CAANMsg[] ekka1900001Out = callSC(handle, scCall, param, fixedText, ekka1900001In).getCAANMsgList(EKKA1900001CBSMsg.EKKA1900001CBSMSG1LIST);
		
		return ekka1900001Out;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
							ServiceComponentRequestInvoker scCall,
							IRequestParameterReadWrite param,
							String dataMapKey,
							Object[][] mappingData) throws Exception
	{
		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];
		
		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		
		int templateStatus = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		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]);
			}
		}
		
		setNullToMsg(template);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}
	
	/**
	 * エラー情報を設定します。
	 * 
	 * @param msg
	 * @param map
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (key.endsWith(ERRITEM_SUFFIX))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, msg.getString(key));
					}
				}
			}
		}
	}
	
	/**
	 * 未入力項目にnullを設定します。
	 * @param msg
	 */
	@SuppressWarnings("unchecked")
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (key.endsWith(ERRITEM_SUFFIX))
			{
				String tmpKey = key.substring(0, key.length() - 4);
				
				if (!msg.containsKeyOfMsgData(tmpKey))
				{
					msg.setNull(tmpKey);
				}
			}
		}
	}
	
	/**
	 * エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	private Map<String, String> createErrorMap(String itemName, String itemValue, String errCd)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;
		
		returnMap.put(CC_PARAM_ERR_CD, errCd);
		returnMap.put(CC_PARAM_ERR_MSG, errMessage);
		
		return returnMap;
	}
	
	/**
	 * エラーマップ作成メソッドです。(エラーメッセージ未設定)
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	private Map<String, String> createErrorMap2(String errCd)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(CC_PARAM_ERR_CD, errCd);
		returnMap.put(CC_PARAM_ERR_MSG, "");
		
		return returnMap;
	}
	
	/**
	 * SYSID取得件数チェックを行う。
	 * 
	 * @param inList
	 * @return sysidCnt
	 */
	private int sysidCntChk(CAANMsg[] inList)
	{
		int sysidCnt = 0;
		if (inList == null || inList.length == 0)
		{
			// SYSIDが未取得の場合
			sysidCnt = 0;
		}
		else
		{
			// inListの先頭のSYSIDを取得
			String sysid1 = inList[0].getString(ECK0011B516CBSMsg1List.SYSID);
			
			// 先頭のSYSIDと、その他のSYSIDを比較
			// 異なるSYSIDがある場合、取得したSYSIDは2件以上あると判断
			for (int i = 1; i < inList.length; i++)
			{
				String sysid2 = inList[i].getString(ECK0011B516CBSMsg1List.SYSID);
				if ( !(sysid1.equals(sysid2)) )
				{
					sysidCnt = 2;
					return sysidCnt;
				}
			}
			
			// 取得したSYSIDは1件
			sysidCnt = 1;
		}
		return sysidCnt;
	}
}