/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CKA904SFLogic
*   ソースファイル名：CKA904SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年07月01日
*＜機能概要＞
*   お客様情報チェック連携を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/07/01   FJ）眞方    新規作成
*   v17.00.00   2015/07/17   FJ) 山岡    【ANK-2557-00-00_PMP再構築対応】リクエスト、レスポンス時のログ出力を追加
*   v20.00.00   2015/10/15   FJ) 李 擇臣 【ANK-2626-00-00】ＰＭＰ同一人チェック改修
*   v37.00.00   2018/04/11   FJ) 岩本    【ANK-3326-00-00】お客さま情報仮登録状態でのエラー処理変更
**********************************************************************/
package eo.web.webview.CKA904SF;

import static eo.common.constant.JCKStrConst.*;
import static eo.common.util.JCKLcsCommonUtil.*;
import static eo.web.webview.common.JCKLcsApiCommonUtil.*;
import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCKWebCommon;

/**
 * お客様情報チェック連携
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CKA904SFLogic extends JCCWebBusinessLogic
{
	/**
	 * 処理区分とサービスの対応表
	 */
	private static final Map<String, String> PROCESS_MAP = new HashMap<String, String>();

	/**
	 * サービスと必須入力エラーにする項目名の対応表
	 */
	private static final Map<String, String[]> REQUIRE_MAP = new HashMap<String, String[]>();

	/**
	 * サービスとドメイン(形式)、桁数エラー時の戻りコードの対応表
	 */
	private static final Map<String, String> DOMAIN_ERR_MAP = new HashMap<String, String>();

	/**
	 * 処理区分とサービスの対応表をセットする
	 */
	static
	{

		/**
		 * 処理区分とサービスの対応表をセットする
		 */
		PROCESS_MAP.put("01", "CKSV9038"); // グループ入会コード/パスワード存在チェック
		PROCESS_MAP.put("02", "CKSV9039"); // 同一人チェック
		PROCESS_MAP.put("03", "CKSV9040"); // 秘密の質問の答えチェック
		PROCESS_MAP.put("04", "CKSV9041"); // eoID更新日チェック
		PROCESS_MAP.put("05", "CKSV9041"); // ニックネーム更新日チェック
		PROCESS_MAP.put("06", "CKSV9043"); // ファミリー会員登録件数チェック
		PROCESS_MAP.put("07", "CKSV9044"); // eoID重複チェック
		PROCESS_MAP.put("08", "CKSV9044"); // ニックネーム重複チェック
		PROCESS_MAP.put("09", "CKSV9039"); // 同一人チェック（拗音・直音対応）

		/**
		 * 処理区分,業務区分ごとの必須入力項目の定義
		 */
		REQUIRE_MAP.put("01,*", new String[]{"FAMILY_CODE", "FAMILY_PWD"});
		// ANK-2626-00-00 MOD START
//		REQUIRE_MAP.put("02,*", new String[]{"FIRST_NAME_KANA", "SECOND_NAME_KANA", "DATE_OF_BIRTH", "CONTACT_MAIL_ADDRESS"});
		REQUIRE_MAP.put("02,*", new String[]{"FIRST_NAME_KANA", "DATE_OF_BIRTH", "CONTACT_MAIL_ADDRESS"});
		// ANK-2626-00-00 MOD END
		REQUIRE_MAP.put("03,*", new String[]{"SYS_ID", "PWD_REMINDER_ANSWER"});
		REQUIRE_MAP.put("04,*", new String[]{"SYS_ID", "EO_ID"});
		REQUIRE_MAP.put("05,*", new String[]{"SYS_ID", "EO_ID"});
		REQUIRE_MAP.put("06,*", new String[]{"BUSINESS_DIV"});
		REQUIRE_MAP.put("06,0", new String[]{"FAMILY_CODE"});
		REQUIRE_MAP.put("06,1", new String[]{"POP_ID"});
		REQUIRE_MAP.put("06,2", new String[]{"SYS_ID"});
		REQUIRE_MAP.put("07,*", new String[]{"EO_ID"});
		REQUIRE_MAP.put("08,*", new String[]{"EO_ID", "NICK_NAME"});
		// ANK-2626-00-00 MOD START
//		REQUIRE_MAP.put("09,*", new String[]{"FIRST_NAME_KANA", "SECOND_NAME_KANA", "DATE_OF_BIRTH", "CONTACT_MAIL_ADDRESS"});
		REQUIRE_MAP.put("09,*", new String[]{"FIRST_NAME_KANA", "DATE_OF_BIRTH", "CONTACT_MAIL_ADDRESS"});
		// ANK-2626-00-00 MOD END

		/**
		 * 単項目、単項目関連チェックエラー時の戻りコード
		 */
		DOMAIN_ERR_MAP.put("01", "92");
		DOMAIN_ERR_MAP.put("02", "92");
		DOMAIN_ERR_MAP.put("03", "92");
		DOMAIN_ERR_MAP.put("04", "92");
		DOMAIN_ERR_MAP.put("05", "92");
		DOMAIN_ERR_MAP.put("06", "92");
		DOMAIN_ERR_MAP.put("07", "92");
		DOMAIN_ERR_MAP.put("08", "92");
		DOMAIN_ERR_MAP.put("09", "92");

	}

	/**
	 * APIリクエスト時
	 * 
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean action_Init() throws Exception
	{

		DEBUG_LOG.info("action_Init Start!");

		X31SDataBeanAccess bean = getServiceFormBean();

		String resultXml = null;

		// 返却用マップの作成と初期化
		Map returnMap  = createReturnMap();

		// 業務規制チェック
		if (!checkRegulationForUpdateApi(this))
		{
			return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
		}

		try
		{
			//************************************************************
			// リクエストデータ取得
			//************************************************************
			Map receiveMap = (Map)getReceiveXmlFromPmp(getSessionId()).get("LKA11020_RECEIVE");

			//************************************************************
			// 不正リクエスト/必須入力チェック
			//************************************************************
			String checkReturnCd = checkRequest(REQUIRE_MAP, receiveMap);
			if (checkReturnCd != null)
			{
				return setErrorXml(bean, returnMap, checkReturnCd);
			}

			//************************************************************
			// 照会用サービスIDの取得
			//************************************************************
			String processDiv  = (String)JCKWebCommon.getObjFromMap(receiveMap, "PROCESS_DIV");
			String businessDiv = (String)JCKWebCommon.getObjFromMap(receiveMap, "BUSINESS_DIV");
			String serviceId = PROCESS_MAP.get(processDiv);

			//************************************************************
			// 業務区分チェック
			//************************************************************
			if (!checkGyomuKbn(PROCESS_MAP, processDiv, businessDiv))
			{
				return setErrorXml(bean, returnMap, PMP_ERR_PARAM);
			}

			//************************************************************
			// サービス呼出
			//************************************************************

			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			HashMap outputMap = new HashMap();

			// サービスへのデータセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, serviceId);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, serviceId + "OP");

			// サービスへのパラメータ作成
			createServiceMap(serviceId , receiveMap, inputMap);

			// サービスの呼出
			X31CMessageResult msgResult = callService(this, paramMap, inputMap, outputMap);

			// エラー処理 
			if(msgResult != null)
			{
				return setErrorXml(bean, returnMap, getReturnCdForSvcErr(DOMAIN_ERR_MAP, processDiv, msgResult));
			}

			// 正常終了
			resultXml = makeResultXml(serviceId, receiveMap, outputMap);
			bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, resultXml);

		}
		catch (Exception e)
		{
			printErrorLog("お客様情報チェック連携で例外が発生しました", e);
			return setErrorXml(bean, returnMap, PMP_ERR_SYSTEM);
		}

		DEBUG_LOG.info("action_Init End!");

		return true;
	}

	/**
	 * 返却用マップの作成と初期化<br />
	 * @return 返却用マップ
	 */
	@SuppressWarnings("unchecked")
	private Map createReturnMap()
	{
		Map returnMap  = new LinkedHashMap();
		returnMap.put("SYS_ID", "");
		returnMap.put("RETURN_CODE", "");
		return returnMap;
	}

	/**
	 * 処理区分、業務区分チェック。<br />
	 * @param processDiv 処理区分
	 * @param businessDiv 業務区分
	 * @return チェック結果(true:チェックOK、false:チェックNG)
	 */
	@SuppressWarnings("unchecked")
	private boolean checkGyomuKbn(Map processMap, String processDiv, String businessDiv)
	{
		// 想定外の処理区分の時はエラー
		if (!processMap.containsKey(processDiv))
		{
			return false;
		}
		// 業務区分チェック(ファミリー会員登録件数チェック)
		else if ("06".equals(processDiv) && (!inArray(businessDiv, "0", "1", "2")))
		{
			return false;
		}
		return true;
	}

	/**
	 * 返却用XML設定(エラー時用)<br />
	 * @param bean データBean
	 * @param returnMap 返却用マップ
	 * @param returnCd リターンコード
	 * @return 処理結果(常にtrue)
	 */
	@SuppressWarnings("unchecked")
	private boolean setErrorXml(X31SDataBeanAccess bean, Map returnMap, String returnCd)
	{
		returnMap.put("RETURN_CODE", returnCd);
		String xml = JCKWebCommon.parseMapToXmlForPmp(returnMap, 1).replaceAll("\r\n","\n");
		bean.sendMessageString("返却データ", X31CWebConst.DATABEAN_SET_VALUE, xml);

		DEBUG_LOG.info("action_Init End!");

		return true;
	}

	/**
	 * サービスへのパラメータを作成する
	 * @param serviceId
	 * @param receiveMap
	 * @param inputMap
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void createServiceMap(String serviceId, Map receiveMap, Map inputMap) throws Exception
	{

		// 運用日付取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		// 処理区分取得
		String processDiv = (String)JCKWebCommon.getObjFromMap(receiveMap, "PROCESS_DIV");

		// グループ入会コード・パスワードチェックの時
		if ("CKSV9038".equals(serviceId))
		{
			HashMap<String, Object> mapSc01 = new HashMap<String, Object>();
			HashMap<String, Object> mapSc02 = new HashMap<String, Object>();

			mapSc01.put("func_code", "1");
			mapSc01.put("key_func_code", "1");
			mapSc01.put("key_grp_join_cd", receiveMap.get("FAMILY_CODE"));

			mapSc02.put("func_code", "2");
			mapSc02.put("key_func_code", "2");
			mapSc02.put("key_grp_join_cd", receiveMap.get("FAMILY_CODE"));
			mapSc02.put("key_grp_join_cd_pwd", receiveMap.get("FAMILY_PWD"));

			inputMap.put("CKSV903801SC", mapSc01);
			inputMap.put("CKSV903802SC", mapSc02);
		
		}

		// 同一人チェックの時
		if ("CKSV9039".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();

			String funcCode = "1";	// 機能コード
			// ANK-2626-00-00 MOD START
//			String custKana = receiveMap.get("FIRST_NAME_KANA") + PMP_NAME_DELIMITER + receiveMap.get("SECOND_NAME_KANA"); //カナ氏名
			String custKana = String.valueOf(receiveMap.get("FIRST_NAME_KANA"));
			if (!isNullOrBlank(receiveMap.get("SECOND_NAME_KANA")))
			{
				custKana = custKana + PMP_NAME_DELIMITER + receiveMap.get("SECOND_NAME_KANA"); //カナ氏名
			}
			// ANK-2626-00-00 MOD END

			// 同一人チェックの場合
			if ("02".equals(processDiv))
			{
				funcCode = "1";
				mapSc.put("key_cust_kana_chokuon", null);
			}
			// 同一人チェック（拗音・直音対応）の場合
			else
			{
				funcCode = "2";
				// カナ氏名を直音変換
				mapSc.put("key_cust_kana_chokuon", replaceYouonToChokuon(custKana));
			}

			mapSc.put("func_code", funcCode);
			mapSc.put("key_func_code", funcCode);
			mapSc.put("key_cust_kana", custKana);
			mapSc.put("key_cust_birthd", receiveMap.get("DATE_OF_BIRTH"));
			mapSc.put("key_mlad", receiveMap.get("CONTACT_MAIL_ADDRESS"));

			inputMap.put("CKSV903901SC", mapSc);
		}

		//秘密の質問の答えチェックの時
		if ("CKSV9040".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();

			mapSc.put("func_code", "2");
			mapSc.put("key_sysid", receiveMap.get("SYS_ID"));
			mapSc.put("key_rsv_aply_ymd", opeDate);

			inputMap.put("CKSV904001SC", mapSc);
		}

		// eoID・ニックネーム更新日チェックの時
		if ("CKSV9041".equals(serviceId))
		{
			HashMap<String, Object> mapSc01 = new HashMap<String, Object>();
			HashMap<String, Object> mapSc02 = new HashMap<String, Object>();
// ANK-3326-00-00 ADD START
			HashMap<String, Object> mapSc03 = new HashMap<String, Object>();
// ANK-3326-00-00 ADD END
			mapSc01.put("func_code", "2");
			mapSc01.put("key_sysid", receiveMap.get("SYS_ID"));
			mapSc01.put("key_rsv_aply_ymd", opeDate);

			mapSc02.put("func_code", "1");
			if ("04".equals(processDiv))
			{
				mapSc02.put("key_work_param_id", WORK_PARAM_ID_EOID_CHGFAIL_DAYS);
			}
			else
			{
				mapSc02.put("key_work_param_id", WORK_PARAM_ID_NKNM_CHGFAIL_DAYS);
			}
// ANK-3326-00-00 ADD START
			mapSc03.put("func_code", "1");
			mapSc03.put("key_ido_div","00089");
			mapSc03.put("key_ido_rsv_dtl_cd","031");
			mapSc03.put("key_ido_rsv_stat_cd","04");
			mapSc03.put("key_sysid", receiveMap.get("SYS_ID"));
// ANK-3326-00-00 ADD END
			inputMap.put("CKSV904101SC", mapSc01);
			inputMap.put("CKSV904102SC", mapSc02);
// ANK-3326-00-00 ADD START
			inputMap.put("CKSV904103SC", mapSc03);
// ANK-3326-00-00 ADD END
		}

		// ファミリー会員登録件数チェックの時
		if ("CKSV9043".equals(serviceId))
		{
			HashMap<String, Object> mapSc01 = new HashMap<String, Object>();
			HashMap<String, Object> mapSc02 = new HashMap<String, Object>();
			HashMap<String, Object> mapSc03 = new HashMap<String, Object>();

			// グループ入会コード検索(機能コード:1)
			if ("0".equals(receiveMap.get("BUSINESS_DIV")))
			{
				mapSc01.put("func_code", "1");
				mapSc01.put("key_func_code", "1");
				mapSc01.put("key_grp_join_cd", receiveMap.get("FAMILY_CODE"));
			}
			// POPID検索(機能コード:2)
			else if ("1".equals(receiveMap.get("BUSINESS_DIV")))
			{
				mapSc01.put("func_code", "2");
				mapSc01.put("key_func_code", "2");
				mapSc01.put("key_pop_id", receiveMap.get("POP_ID"));
			}
			// SYSID検索(機能コード:3)
			else if ("2".equals(receiveMap.get("BUSINESS_DIV")))
			{
				mapSc01.put("func_code", "3");
				mapSc01.put("key_func_code", "3");
				mapSc01.put("key_sysid", receiveMap.get("SYS_ID"));
			}
			
			mapSc02.put("func_code", "1");
			mapSc02.put("key_work_param_id_kj", WORK_PARAM_ID_FAMILY_KJ_MMB_CNT);
			
			mapSc03.put("func_code", "1");
			mapSc03.put("key_work_param_id_hj", WORK_PARAM_ID_FAMILY_HJ_MMB_CNT);
			
			inputMap.put("CKSV904301SC", mapSc01);
			inputMap.put("CKSV904302SC", mapSc02);
			inputMap.put("CKSV904303SC", mapSc03);
		}

		// eoID・ニックネーム重複チェックの時
		if ("CKSV9044".equals(serviceId))
		{
			HashMap<String, Object> mapSc = new HashMap<String, Object>();

			if ("07".equals(processDiv))
			{
				mapSc.put("func_code", "2");
				mapSc.put("key_aging_tg_value", (String)receiveMap.get("EO_ID"));
			}
			else
			{
				mapSc.put("func_code", "1");
				mapSc.put("key_aging_tg_value", (String)receiveMap.get("NICK_NAME"));
			}

			inputMap.put("CKSV904401SC", mapSc);

		}

	}

	/**
	 * サービス呼び出しが正常終了した時の返却用XML作成
	 * @param serviceId サービスID
	 * @param receiveMap 受信情報
	 * @param outMap サービス実行結果
	 * @throws Exception
	 * @return 返却用XML
	 */
	private String makeResultXml(String serviceId, Map<?, ?> receiveMap, Map<?, ?> outMap) throws Exception
	{

		// 運用日付取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		// 処理区分取得
		String processDiv = (String)JCKWebCommon.getObjFromMap(receiveMap, "PROCESS_DIV");

		String sysid      = "";
		String returnCode = PMP_ERR_SYSTEM; //どのサービスにも当たらない場合は、システムエラーとする

		// グループ入会コード・パスワードチェックの時
		if ("CKSV9038".equals(serviceId))
		{
			ArrayList<?> dataList1 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV903801SC", "grp_list");
			if (isNullOrEmpty(dataList1))
			{
				returnCode = PMP_ERR_NO_GRP; // グループ入会コードなしエラー
			}
			else
			{
				ArrayList<?> dataList2 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV903802SC", "grp_list");
				if (isNullOrEmpty(dataList2))
				{
					returnCode = PMP_ERR_GRP_AUTH; // グループ入会コードパスワード認証エラー
				}
				else
				{
					returnCode = PMP_NORMAL_END; // 正常
				}
			}

			return returnMap(sysid, returnCode);
		}

		// 同一人チェックの時
		if ("CKSV9039".equals(serviceId))
		{
			ArrayList<?> dataList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV903901SC", "sysidList");
			if (isNullOrEmpty(dataList))
			{
				returnCode = PMP_NORMAL_END; // 正常
			}
			else
			{
				Map<?, ?> dataMap = (Map<?, ?>)dataList.get(0);
				sysid = (String)dataMap.get("sysid");
				returnCode = PMP_ERR_MMB_DUP; // フリガナ氏名、生年月日、連絡用アドレス重複エラー
			}

			return returnMap(sysid, returnCode);
		}

		// 秘密の質問の答えチェックの時
		if ("CKSV9040".equals(serviceId))
		{
			ArrayList<?> dataList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904001SC", "dataList");
			if (isNullOrEmpty(dataList))
			{
				returnCode = PMP_ERR_QUESTION_ANSWER; // 秘密の質問の答え認証エラー
			}
			else
			{
				Map<?, ?> dataMap = (Map<?, ?>)dataList.get(0);
				String pwdReminderAns = (String)dataMap.get("pwd_reminder_ans");

				if (receiveMap.get("PWD_REMINDER_ANSWER").equals(pwdReminderAns))
				{
					returnCode = PMP_NORMAL_END; // 正常
				}
				else
				{
					returnCode = PMP_ERR_QUESTION_ANSWER; // 秘密の質問の答え認証エラー
				}
			}

			return returnMap(sysid, returnCode);
		}

		// eoID・ニックネーム更新日チェックの時
		if ("CKSV9041".equals(serviceId))
		{
			return makeResultXmlForCheckChgeYmd(outMap, opeDate, processDiv);
		}

		// 家族会員登録件数チェックの時
		if ("CKSV9043".equals(serviceId))
		{
			return makeResultXmlForFamilyMmbCnt(outMap, opeDate);
		}

		// eoID・ニックネーム重複チェックの時
		if ("CKSV9044".equals(serviceId))
		{
			ArrayList<?> agingList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904401SC", "agingList");
			if (isNullOrEmpty(agingList))
			{
				returnCode = PMP_NORMAL_END; // 正常
			}
			else if ("07".equals(processDiv))
			{
				returnCode = PMP_ERR_EOID_DUP; // eoID重複エラー
			}
			else
			{
				returnCode = PMP_ERR_NKNM_DUP; // ニックネーム重複エラー
			}

			return returnMap(sysid, returnCode);
		}

		return returnMap(sysid, returnCode);
	}

	/**
	 * SYSID、戻りコードから返却用のXMLを生成します。
	 * @param sysid
	 * @param returnCode
	 * @return String 返却用XML
	 */
	private String returnMap(String sysid, String returnCode)
	{

		Map<String, String> returnMap = new LinkedHashMap<String, String>();

		returnMap.put("SYS_ID", sysid);
		returnMap.put("RETURN_CODE", returnCode);
/*---< ANK-2557-00-00 mod start >---*/
		//ログ出力
		//return JCKWebCommon.parseMapToXmlForPmp(returnMap);
		return JCKWebCommon.parseMapToXmlForPmp(returnMap,1);
/*---< ANK-2557-00-00 mod end >---*/
	}

	/**
	 * eoID・ニックネーム更新日チェックの戻りデータから返却用XMLを生成します。
	 * @param outMap
	 * @param opeDate
	 * @param processDiv
	 * @return String 返却用XML
	 */
	private String makeResultXmlForCheckChgeYmd(Map<?, ?> outMap, String opeDate, String processDiv)
	{
		String sysid      = "";
		String returnCode = "";
		
// ANK-3326-00-00 ADD START
		ArrayList<?> dataList3 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904103SC", "dataList3");
		if (!isNullOrEmpty(dataList3))
		{
			returnCode = PMP_ERR_KARI_ADD_CHU; // 仮登録中エラー
			return returnMap(sysid, returnCode);
		}
// ANK-3326-00-00 ADD END
		
		ArrayList<?> dataList1 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904101SC", "dataList1");
		if (isNullOrEmpty(dataList1))
		{
			returnCode = PMP_ERR_NODATA; // データなし
			return returnMap(sysid, returnCode);
		}
		
		// 業務パラメータなしの場合、システムエラー
		ArrayList<?> dataList2 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904102SC", "dataList2");
		if (isNullOrEmpty(dataList2))
		{
			returnCode = PMP_ERR_SYSTEM; // システムエラー
			return returnMap(sysid, returnCode);
		}

		Map<?, ?> dataMap1 = (Map<?, ?>)dataList1.get(0);
		String chgeYmd = (String)dataMap1.get(("04".equals(processDiv)) ? "eoid_chge_ymd" : "nkname_chge_ymd");

		// 変更日付がNULLの場合、正常終了
		if (isNullOrBlank(chgeYmd))
		{
			returnCode = PMP_NORMAL_END; // 正常終了
			return returnMap(sysid, returnCode);
		}
		
		
		Map<?, ?> workParamMap = (Map<?, ?>)dataList2.get(0);
		String workParamTstaymd = (String)workParamMap.get("work_param_tstaymd");
		String workParamTendymd = (String)workParamMap.get("work_param_tendymd");
		String workParamSetteValue = (String)workParamMap.get("work_param_sette_value");

		// 運用日付 < 業務パラメータ適用開始年月日 または 運用日付 > 業務パラメータ適用終了年月日
		if (opeDate.compareTo(workParamTstaymd) < 0 || opeDate.compareTo(workParamTendymd) > 0)
		{
			returnCode = PMP_ERR_SYSTEM; // システムエラー
			return returnMap(sysid, returnCode);
		}
		
		// 更新可能日
		String validDate = addDay(chgeYmd, Integer.parseInt(workParamSetteValue));
		
		// 運用日付 ≧ 更新可能日
		if (opeDate.compareTo(validDate) >= 0)
		{
			returnCode = PMP_NORMAL_END; // 正常終了
		}
		else
		{
			if ("04".equals(processDiv))
			{
				returnCode = PMP_ERR_EOID_TERM; // eoID規定の期間以内の更新エラー
			}
			else
			{
				returnCode = PMP_ERR_NKNM_TERM; // ニックネーム規定の期間以内の更新エラー
			}
		}
		
		return returnMap(sysid, returnCode);
	}
	
	/**
	 * ファミリー会員登録件数チェックの戻りデータから返却用XMLを生成します。
	 * @param outMap
	 * @param opeDate
	 * @param chgeYmdKey
	 * @return String 返却用XML
	 */
	private String makeResultXmlForFamilyMmbCnt(Map<?, ?> outMap, String opeDate)
	{
		String sysid      = "";
		String returnCode = "";
		
		ArrayList<?> dataList1 = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904301SC", "dataList1");
		// 家族会員登録件数の検索結果が0件の場合は、正常終了
		if (isNullOrEmpty(dataList1))
		{
			returnCode = PMP_NORMAL_END; // 正常終了
			return returnMap(sysid, returnCode);
		}

		// 会員種別コード、ファミリー会員数を取得
		Map<?, ?> dataMap1 = (Map<?, ?>)dataList1.get(0);
		String memberSbtCd = (String)dataMap1.get("member_sbt_cd");
		String familyCnt = (String)dataMap1.get("family_cnt");

		List<?> workParamList = new ArrayList<Object>();

		// ファミリー会員(個人)数を取得
		if ("10".equals(memberSbtCd))
		{
			workParamList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904302SC", "dataList2");
		}
		// ファミリー会員(法人)数を取得
		else
		{
			workParamList = (ArrayList<?>)JCKWebCommon.getObjFromMap(outMap, "CKSV904303SC", "dataList3");
		}

		// 業務パラメータが0件の場合は、システムエラー
		if (isNullOrEmpty(workParamList))
		{
			returnCode = PMP_ERR_SYSTEM; // システムエラー
			return returnMap(sysid, returnCode);
		}

		// 業務パラメータ設定値を取得
		Map<?, ?> workParamMap = (Map<?, ?>)workParamList.get(0);
		String workParamTstaymd = (String)workParamMap.get("work_param_tstaymd");
		String workParamTendymd = (String)workParamMap.get("work_param_tendymd");
		String limitCnt = (String)workParamMap.get("work_param_sette_value");

		// 運用日付 < 業務パラメータ適用開始年月日 または 運用日付 > 業務パラメータ適用終了年月日
		if (opeDate.compareTo(workParamTstaymd) < 0 || opeDate.compareTo(workParamTendymd) > 0)
		{
			returnCode = PMP_ERR_SYSTEM; // システムエラー
			return returnMap(sysid, returnCode);
		}

		// ファミリー会員登録最大値≦登録済みファミリー会員数の場合、ファミリー会員登録件数超過エラー
		if (limitCnt.compareTo(familyCnt) <= 0)
		{
			returnCode = PMP_ERR_FAMILY_MMB_CNT; // ファミリー会員登録件数超過エラー
		}
		else
		{
			returnCode = PMP_NORMAL_END; // 正常
		}

		return returnMap(sysid, returnCode);
	}

	/**
	 * 対象文字列の拗音を直音文字に変換して返します。
	 * @param targetValue 対象文字列
	 * @return 変換後文字列
	 */
	private String replaceYouonToChokuon(String targetValue)
	{
		// 引数の対象文字列がnullの場合
		if (targetValue == null)
		{
			// 空文字を返す
			return "";
		}

		String ret = targetValue;

		for(int i = 0; i < PMP_KATAKANA_YOUON.length; i++)
		{
			ret = ret.replaceAll(PMP_KATAKANA_YOUON[i], PMP_KATAKANA_CHOKUON[i]);
		}
		
		// 変換後文字列を返す
		return ret;
	}
}
