/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FAW02801SFLogic
 *   ソースファイル名：FAW02801SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年05月31日
 *＜機能概要＞
 *   メールアドレス自動設定ツール連携のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/05/31   FJ）西川    新規作成
 *   v3.00.00    2012/04/04   FJ) 中谷    変更【ANK-0041-00-00】申込完了メール
 *   v4.00       2012/11/07   FJ）中谷    変更【ANK-1255-00-00】オプション解約に伴う課金制御
 *   v4.00       2012/11/12   FJ）井口    変更【ANK-1255-00-00】オプション解約に伴う課金制御
 *   v5.00       2013/03/07   FJ）谷本    変更【ST1-2013-0000437】フロント「オプトインメール受信設定」設定漏れ対応
 *   v6.00       2013/12/03   FJ）中谷    変更【OM-2013-0004592】メールアドレス変更時SOD発行の改修
 *   v7.00       2014/03/05   FJ）谷本    変更【OM-2014-0000779】性能障害対応
 *   v8.00       2014/05/06   FJ）中谷    変更【ANK-2088-00-00】サービスオーダー処理時間改善
 *   v14.0.0     2015/04/23   FJ）谷本    変更【ANK-2414-00-00】メールアドレス変更禁止の期間短縮
 *   
 **********************************************************************/
package eo.web.webview.FUA028SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.web.webview.CommonInfoCF.CommonInfoCFConst.URL_SCREEN_ID_21;
import static eo.web.webview.common.JFUWebCommon.SEP_0;
import static eo.web.webview.common.JFUWebCommon.SSO_INFO;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31SWebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;
import com.fujitsu.futurity.web.x33.X33CUtil;
import com.fujitsu.futurity.web.x33.X33WSessionController;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW02101SF.FUW02101SFConst;
import eo.web.webview.common.JFUMailSupportInterface;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0112_FUSV0112OPDBMapper;
import eo.web.webview.mapping.FUSV0122_FUSV0122OPDBMapper;
import eo.web.webview.mapping.FUSV0272_FUSV0272OPDBMapper;
import eo.web.webview.mapping.FUSV0275_FUSV0275OPDBMapper;

/**
 * メールアドレス自動設定ツール連携のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings( { "serial", "unchecked" })
public class FUA028SFLogic extends JCCWebBusinessLogic
{

	/** 記号イコール */
	private static final String KIGOU_EQUALS_HALF = "=";

	/** エイジング対象値 */
	private static final String AGING_TG_VALUE = "aging_tg_value";

	/** エイジング種別コード */
	private static final String AGING_SBT_CD = "aging_sbt_cd";

	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";

	/** エイジング対象使用終了間 */
	private static final String EZM0111C010 = "EZM0111C010";

	/** エイジング対象登録 */
	private static final String EZM0111D010 = "EZM0111D010";

	/** 現請求契約情報一覧照会明細 */
	private static final String EKK0491B504 = "EKK0491B504";

	/** サービス契約一意照会 */
	private static final String EKK0081A010 = "EKK0081A010";

	/** メールアドレス変更不可期間 */
	private static final String CHANGE_IMPOSSIBLE_FLAG_TRUE = "TRUE";

	/** メールアドレス変更不可期間外 */
	private static final String CHANGE_IMPOSSIBLE_FLAG_FALSE = "FALSE";

	/** メール各種設定引継フラグ 引き継ぐ */
	private static final String MAIL_SUCCESSION_FLAG_TRUE = "TRUE";

	/** メール各種設定引継フラグ 引き継がない */
	private static final String MAIL_SUCCESSION_FLAG_FALSE = "FALSE";

	/** メールアドレス変更時メール転送フラグ 引き継ぐ */
	private static final String MAIL_FORWARD_FLAG_TRUE = "TRUE";

	/** メールアドレス変更時メール転送フラグ 引き継がない */
	private static final String MAIL_FORWARD_FLAG_FALSE = "FALSE";

	/** メールボックス契約容量追加申込 チェックのみ */
	private static final String IS_EXPANDE_FLAG_TRUE = "TRUE";

	/** メールボックス契約容量追加申込 申し込む */
	private static final String IS_EXPANDE_FLAG_FALSE = "FALSE";

	/** オブジェクトの初期容量 */
	private static final int DEFAULT_INITIAL_CAPACITY = 16;

	/** リクエスト結果 */
	private static final String STATUS = "STATUS";

	/** サービス契約番号 */
	private static final String CUSTOMER_ID = "CUSTOMER_ID";

	/** お客様名 */
	private static final String CUSTOMER_NAME = "CUSTOMER_NAME";

	/** POPID */
	private static final String POP_ID = "POP_ID";

	/** メールアドレス */
	private static final String MAIL_ADDRESS = "MAIL_ADDRESS";

	/** メール各種設定引継フラグ */
	private static final String MAIL_SUCCESSION = "MAIL_SUCCESSION";

	/** メールアドレス変更時メール転送フラグ */
	private static final String MAIL_FORWARD = "MAIL_FORWARD";

	/** メールアドレス容量チェック拡張 */
	private static final String IS_EXPANDED = "IS_EXPANDED";

	/** 変更不可期間フラグ */
	private static final String CHANGE_IMPOSSIBLE_FLAG = "CHANGE_IMPOSSIBLE_FLAG";

	/** POPIDパスワード */
	private static final String POP_PW = "POP_PW";

	/** エラーメッセージ */
	private static final String ERROR_MESSAGE = "ERROR_MESSAGE";

	/** リクエスト元の識別子 */
	private static final String SOURCE_ID = "SOURCE_ID";

	/** アクション名 */
	private static final String ACTION_NAME = "ACTION_NAME";

	/** 画面表示認証用POSTデータ */
	private static final String CERTIFICATION_ID = "CERTIFICATION_ID";

	/** メールアカウント */
	private static final String MAIL_ACCOUNT = "MAIL_ACCOUNT";

	/** 不可バージョン */
	private static final String FAIL_KYOKA_VSN = "FAIL_KYOKA_VSN";

	/** 認証用ID */
	private static final String NINSHO_ID = "NINSHO_ID";

	/** レスポンス */
	private static final String RESPONSE = "RESPONSE";

	/** アクション名(CERTIFICATION:POPID認証) */
	private static final String ACTION_NAME_CERTIFICATION = "CERTIFICATION";

	/** アクション名(UPDATE:メールアドレス変更) */
	private static final String ACTION_NAME_UPDATE = "UPDATE";

	/** アクション名(EXPAND:メールボックス契約容量追加申込) */
	private static final String ACTION_NAME_EXPAND = "EXPAND";

	/** 画面表示認証用POSTデータ(チェック用) */
	private static final String CERTIFICATION_ID_MATCH_KEY = "[a-zA-Z0-9]*";

	/** メッセージ分割文字 */
	private static final String MESSAGES_DEMILTE = "%%%%%";

	/** 正常 */
	private static final String SUCCESS = "00000";

	/** アクション名未設定 */
	private static final String ERROR_ACTION_NAME_REQUIRED = "00001";

	/** アクション名不正 */
	private static final String ERROR_ACTION_NAME = "00002";

	/** リクエスト元の識別子未設定 */
	private static final String ERROR_SOURCE_ID_REQUIRED = "00003";

	/** POPID未設定 */
	private static final String ERROR_POP_ID_REQUIRED = "00004";

	/** POPIDパスワード未設定 */
	private static final String ERROR_POP_ID_PW_REQUIRED = "00005";

	/** POPID不正 */
	private static final String ERROR_POP_ID = "00006";

	/** メールアカウント未設定 */
	private static final String ERROR_MAIL_ACCOUNT_REQUIRED = "00009";

	/** メンテナンス中 */
	private static final String ERROR_MAINTENANCE = "00010";

	/** メールアカウント使用済み */
	private static final String ERROR_MAIL_ACCOUNT_USED = "00011";

	/** ログインエラー */
	private static final String ERROR_LOGIN = "00012";

	/** 契約状態エラー */
	private static final String ERROR_CONTRACT_STATUS = "00013";

	/** メールアカウント形式不正 */
	private static final String ERROR_MAIL_ACCOUNT = "00014";

	/** メールアドレス未変更・NGワード */
	private static final String ERROR_MAIL_ACCOUNT_NG_WORD = "00015";

	/** メールアカウント文字数不正 */
	private static final String ERROR_MAIL_ACCOUNT_LENGTH = "00016";

	/** メールアドレス変更不可期間 */
	private static final String ERROR_CHANGE_IMPOSSIBLE_MLAD = "00017";

	/** MAIL_SUCCESSION不正 */
	private static final String ERROR_MAIL_SUCCESSION = "00018";

	/** IS_EXPANDED不正 */
	private static final String ERROR_MAIL_FORWARD = "00019";

	/** IS_EXPANDED不正 */
	private static final String ERROR_IS_EXPANDED_1 = "00020";

	/** IS_EXPANDED不正 */
	private static final String ERROR_IS_EXPANDED_2 = "00021";

	/** メールボックス容量は上限値まで申し込まれていません。 */
	private static final String ERROR_IS_EXPANDED_3 = "50006";

	/** メールボックス容量は既に上限値に達しています。 */
	private static final String ERROR_IS_EXPANDED_4 = "50007";

	/** 排他エラー */
	private static final String ERROR_EXCLUSIVE = "50000";

	/** リクエストメソッド不正 */
	private static final String ERROR_REQUEST_METHOD = "50001";

	/** 画面表示認証用POSTデータ不正 */
	private static final String ERROR_CERTIFICATION_ID = "50002";

	/** 不可バージョン */
	private static final String ERROR_FAIL_KYOKA_VSN = "50003";

	/** POPIDに対応するメールアドレスが存在しない場合 */
	private static final String ERROR_EXISTS_MAIL = "50004";

	/** システムエラー */
	private static final String ERROR_SYSTEM = "99999";

	/** プロパティファイル取得文字列 */
	private static final String QUERY_CHECK_VALUE_PATH = "DISPSETTING/SETTING[@screenId='FUA028']/DISPCTL[@groupid='check_value']";

	/** プロパティファイル取得文字列 */
	private static final String QUERY_STATUS_PATH = "DISPSETTING/SETTING[@screenId='FUA028']/DISPTEXT[@groupid='status']";

	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	/** リクエスト有効メソッド（POSTのみ有効） */
	private static final String REQUEST_METHOD_POST = "POST";

	/** XML終了タグの開始 */
	private static final String XML_BK_START = "</";

	/** XML終了タグ */
	private static final String XML_END = ">";

	/** XML終了タグ２ */
	private static final String XML_END_OPTION = "\">";

	/** XML開始タグ */
	private static final String XML_FR_START = "<";

	/** XMLヘッダー */
	private static final String XML_HEADER = "?xml version=\"1.0\" encoding=\"Shift_JIS\"?";

	/** XML NO属性 */
	private static final String XML_ATTAR_NAME_NO = " NO=\"";

	/** サービスID メールアドレス自動設定ツール連携(初期取得) */
	private static final String USECASE_ID_FUSV0112 = "FUSV0112";

	/** サービスID メールアドレス自動設定ツール連携(指示実行) */
	private static final String USECASE_ID_FUSV0122 = "FUSV0122";

	/** サービスID メールアドレス自動設定ツール連携(指示実行2) */
	private static final String USECASE_ID_FUSV0272 = "FUSV0272";

	/** サービスID メールアドレス自動設定ツール連携(指示実行3) */
	private static final String USECASE_ID_FUSV0275 = "FUSV0275";

	/** ＫＥＹ＿メールアドレス */
	private static final String KEY_MLAD = "key_mlad";

	/** EKK0361B004_メールアドレス自動設定ツール連携契約情報取得一覧照会 */
	private static final String EKK0361B004 = "EKK0361B004";

	/** EKK0361C050_オプションサービス契約＜ISP＞情報変更 */
	private static final String EKK0361C050 = "EKK0361C050";

	/** EKK0401C170_サブオプションサービス契約解約 */
	private static final String EKK0401C170 = "EKK0401C170";

	/** EKK0401C180_サブオプションサービス契約解約確定 */
	private static final String EKK0401C180 = "EKK0401C180";

	/** エラー判定用テンプレート：EKK0411D010_サブオプションサービス契約＜ISP＞登録 */
	private static final String EKK0411D010 = "EKK0411D010";

	/** エラー判定用テンプレート：EKK0411C010_サブオプションサービス契約＜ISP＞変更 */
	private static final String EKK0411C010 = "EKK0411C010";

	/** エラー判定用アイテム：追加容量 */
	private static final String ADD_CAPA = "add_capa";

	/** エラー判定用アイテム：容量 */
	private static final String CAPA = "capa";

	/** エラー判定用アイテム：サブオプションサービス契約番号 */
	private static final String SBOP_SVC_KEI_NO = "sbop_svc_kei_no";

	/** 希望メールアドレス1 */
	private static final String KIBO_ML_ACCOUNT_1 = "kibo_ml_account_1";

	/** メールアドレス */
	private static final String MLAD = "mlad";

	/** 同日を含む／含まないの指定(0：含まない、1：含む) */
	private static final String METHOD_FLG_ISFUTUREDATE_0 = "0";

	/** 申込完了メールID メールアドレス変更申込(申込) */
	private static final String MSKM_COMP_MAIL_ID1 = "FUA028_1";

	/** 申込完了メールID メールボックス契約容量追加申込(申込)*/
	private static final String MSKM_COMP_MAIL_ID2 = "FUA028_2";

	/** 画面ID */
	private static final String SCREEN_ID = "MAIL_ADDRESS_CHANGE";

	/** 会員情報更新依頼CC */
	private static final String CC_TITLE_CKSV9001 = "CKSV9001";

	/** メールアドレス変更期間チェック有効回数 */
	private static final int MLAD_CHG_CHK_YUKO_CNT = 3;

	/**
	 * メールアドレス自動設定ツール連携を行います。
	 *
	 * <br>
	 * @return 処理結果
	 */
	public boolean init()
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		try
		{
			// サービス結果格納用サービスフォームBean取得。
			bean = getServiceFormBean();

			// リクエスト情報取得
			X33WSessionController sc = X33CUtil.getSession(this.getSessionId());
			HttpServletRequest req = sc.getServletRequest();

			Map<String, Object> reqMap = getRequestParams();

			// 業務ログにリクエストパラメータを出力する。
			outputParam(reqMap);

			// ステータス情報を格納する。
			String status = null;

			// ---- 共有フォームbean ----
			// 共有フォームBeanのデータBeanアクセスクラスを取得。
			X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
			// ●共有フォームBeanより現顧客契約情報を取得する。
			X31SDataBeanAccessArray restrictionBeanArray = commoninfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);
			for (int i = 0; i < restrictionBeanArray.getCount(); i++)
			{

				// 業務規制されている場合（自システム、他システム(メールサポート)）
				X31SDataBeanAccess commonSubbean = restrictionBeanArray.getDataBean(i);
				String kiseiFlg = commonSubbean.sendMessageString(CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE);

				if (JFUStrConst.REQUEST_RESTRICTION_FLG_ON.equals(kiseiFlg))
				{
					// 返却値の設定（メンテナンス中）
					return setResponseXml(bean, createResponseXml(ERROR_MAINTENANCE));
				}
			}

			// ●単項目チェック
			status = checkSingleError(reqMap, req.getMethod());
			if (!SUCCESS.equals(status))
			{
				return setResponseXml(bean, createResponseXml(status));
			}

			// ●単関連チェック処理
			status = checkSingleRelationError(reqMap);
			if (!SUCCESS.equals(status))
			{
				return setResponseXml(bean, createResponseXml(status));
			}

			// レスポンス情報
			Map<String, Object> resMap = new HashMap<String, Object>(DEFAULT_INITIAL_CAPACITY);

			// ●DataBean設定プロパティ取得処理
			Map<String, String> fuDispDefinitionMap = JFUWebCommon.getDispItemsAsMap(QUERY_CHECK_VALUE_PATH, QUERY_ATTR_NAME);

			// 認証ID
			resMap.put(NINSHO_ID, fuDispDefinitionMap.get(NINSHO_ID));

			// 不許可バージョン
			resMap.put(FAIL_KYOKA_VSN, fuDispDefinitionMap.get(FAIL_KYOKA_VSN));

			// ●関連チェック処理
			status = checkRelationError(reqMap, resMap);
			if (!SUCCESS.equals(status))
			{
				return setResponseXml(bean, createResponseXml(status));
			}

			// ●外部API呼出処理
			// 外部API「POPID認証照会依頼(FUIFE075)」の呼び出しを行う。
			Map<String, Object> inMap = new HashMap<String, Object>(DEFAULT_INITIAL_CAPACITY);
			inMap.put(JFUMailSupportInterface.POP_ID, reqMap.get(POP_ID));
			inMap.put(JFUMailSupportInterface.POP_ID_PWD, reqMap.get(POP_PW));

			String result = JFUWebCommon.getPopIdNinshoShokaiReqRslt(inMap);

			if (JFUMailSupportInterface.SUCCESS.equals(result))
			{
				// 処理結果コードが、"00"の場合、以降の処理を継続する。
			}
			else if (JFUMailSupportInterface.ERROR_CERTIFICATION.equals(result) || JFUMailSupportInterface.ERROR_PARAMETER.equals(result))
			{
				// 処理結果コードが、"13","92"の場合
				return setResponseXml(bean, createResponseXml(ERROR_LOGIN));
			}
			else
			{
				// 上記以外の場合
				return setResponseXml(bean, createResponseXml(ERROR_SYSTEM));
			}

			// ●リクエスト情報からBeanへの移送処理
			String actionName = (String)reqMap.get(ACTION_NAME);
			// アクション名 action_name
			bean.sendMessageString(FUA028SFConst.ACTION_NAME, X31CWebConst.DATABEAN_SET_VALUE, actionName);

			// リクエスト元の識別子 source_id
			bean.sendMessageString(FUA028SFConst.SOURCE_ID, X31CWebConst.DATABEAN_SET_VALUE, (String)reqMap.get(SOURCE_ID));

			// 画面表示認証用POSTデータ certification_id
			bean.sendMessageString(FUA028SFConst.CERTIFICATION_ID, X31CWebConst.DATABEAN_SET_VALUE, (String)reqMap.get(CERTIFICATION_ID));

			// POPID pop_id
			String popid = (String)reqMap.get(POP_ID);
			bean.sendMessageString(FUA028SFConst.POP_ID, X31CWebConst.DATABEAN_SET_VALUE, popid);

			// POPパスワード pop_pw
			bean.sendMessageString(FUA028SFConst.POP_PW, X31CWebConst.DATABEAN_SET_VALUE, (String)reqMap.get(POP_PW));

			// ●サービス呼び出し処理
			// メールアドレス自動設定ツール連携(初期取得)サービスの呼び出しを行う。
			try
			{
				// ユースケースID格納用マップを生成。
				HashMap<String, String> paramMap = new HashMap<String, String>(DEFAULT_INITIAL_CAPACITY);
				paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0112);

				FUSV0112_FUSV0112OPDBMapper mapper = new FUSV0112_FUSV0112OPDBMapper();

				HashMap<String, Object> dataMap = new HashMap<String, Object>();
				X31SDataBeanAccess[] paramBean = { bean };

				// メールアドレス自動設定ツール連携契約情報取得一覧照会SC設定
				mapper.setFUSV011201SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

				// お客様一意照会ＳＣ設定
				mapper.setFUSV011202SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

				// 業務パラメータ管理一意照会ＳＣ設定
				mapper.setFUSV011203SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

				// オプションサービス契約一意照会ＳＣ設定
				mapper.setFUSV011204SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

				// メールアドレス情報照会ＣＣ設定
				mapper.setFUSV011201CC(dataMap, popid);
				
				// メールアドレス変更回数取得ＣＣ設定
				mapper.setFUSV011202CC(paramBean, dataMap);

				// 検索結果格納用マップを生成。
				HashMap<String, Object> outputMap = new HashMap<String, Object>();

				// サービスの呼び出しを行う。
				invokeService(paramMap, dataMap, outputMap);

				// メールアドレス自動設定ツール連携契約情報取得一覧照会ＳＣ取得
				mapper.getFUSV011201SC(bean, outputMap);

				// お客様一意照会ＳＣ取得
				mapper.getFUSV011202SC(bean, outputMap);

				// 業務パラメータ管理一意照会ＳＣ取得
				mapper.getFUSV011203SC(bean, outputMap);

				// オプションサービス契約一意照会ＳＣ取得
				mapper.getFUSV011204SC(bean, outputMap);

				X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
				// メールアドレス情報照会ＣＣ取得
				mapper.getFUSV011201CC(commonInfoBean, outputMap);

				// メールアドレス変更回数取得ＣＣ取得
				mapper.getFUSV011202CC(bean, outputMap);

				String opSvcKeiNo = bean.sendMessageString(FUA028SFConst.OP_SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE);

				String opSvcKeiStat = bean.sendMessageString(FUA028SFConst.OP_SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE);

				// ●メールアドレス自動設定ツール連携契約情報取得一覧照会ＳＣ設定取得チェック
				if (JFUWebCommon.isNull(opSvcKeiNo) || JFUStrConst.CD00037_910.equals(opSvcKeiStat) || JFUStrConst.CD00037_920.equals(opSvcKeiStat))
				{
					// 返却値の設定（メールアドレス自動設定ツール連携契約情報取得一覧照会ＳＣ設定結果が0件の場合）
					return setResponseXml(bean, createResponseXml(ERROR_EXISTS_MAIL));
				}

				// ACTION_NMが「CERTIFICATION」または「UPDATE」の場合
				// ACTION_NMが「EXPAND」の場合、エラーとせずしない為、ここではチェックしない
				if (ACTION_NAME_CERTIFICATION.equals(actionName) || ACTION_NAME_UPDATE.equals(actionName))
				{
					// ●メールアドレス変更不可期間チェック
					if (!isChangeImpossible(bean))
					{
						if (ACTION_NAME_CERTIFICATION.equals(actionName))
						{
							// メールアドレスの変更不可期間の場合
							resMap.put(CHANGE_IMPOSSIBLE_FLAG, CHANGE_IMPOSSIBLE_FLAG_TRUE);
						}
						else
						{
							// 返却値の設定（メールアドレス変更不可期間）
							return setResponseXml(bean, createResponseXml(ERROR_CHANGE_IMPOSSIBLE_MLAD));
						}
					}
					else
					{
						// メールアドレスの変更不可期間の場合
						resMap.put(CHANGE_IMPOSSIBLE_FLAG, CHANGE_IMPOSSIBLE_FLAG_FALSE);
					}
				}
			}
			catch (JCCWebServiceException se)
			{
				// 例外情報を取得
				X31CMessageResult msgResult = se.getMessageList();
				X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
				X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
				String errStatus = info.getStatus();

				String templateid = info.getTemplateId(); // テンプレートID
				String itemid = info.getItemId(); // アイテム
				String errFlg = info.getItemCheckErr(); // エラーフラグ

				// ●単項目チェック
				if (String.valueOf(JPCModelConstant.SINGLEDATA_ERR).equals(errStatus))
				{
					// テンプレートIDが"EKK0361B004"かつアイテムが"ＫＥＹ＿メールアドレス"の場合
					if (EKK0361B004.equals(templateid) && KEY_MLAD.equals(itemid))
					{
						if (JFUStrConst.DMN_ERR.equals(errFlg) || JFUStrConst.KETA_ERR.equals(errFlg) || JFUStrConst.REF_ERR.equals(errFlg))
						{
							// 返却値の設定（POPID不正）
							return setResponseXml(bean, createResponseXml(ERROR_POP_ID));
						}
					}
				}
				// 返却値の設定（システムエラー）
				return setResponseXml(bean, createResponseXml(ERROR_SYSTEM));
			}

			// スクリーンID
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, SSO_INFO + SEP_0 + URL_SCREEN_ID_21, SCREEN_ID);
			// POPID
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, SSO_INFO + SEP_0 + CommonInfoCFConst.POP_ID_21, popid);
			// SYSID
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, SSO_INFO + SEP_0 + CommonInfoCFConst.SYSID_21, bean.sendMessageString(
					FUA028SFConst.SYSID, X31CWebConst.DATABEAN_GET_VALUE));
			// サービス契約番号
			JFUWebCommon.setDataBeanItemByPath(commoninfoBean, SSO_INFO + SEP_0 + CommonInfoCFConst.SVC_KEI_NO_21, bean.sendMessageString(
					FUA028SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));

			// WEB変更情報
			X31SDataBeanAccess webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0);
			// 現顧客情報
			X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
			// サービス契約情報
			X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);
			// サービス契約内訳情報
			X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);
			// 請求契約情報
			X31SDataBeanAccess seikyKeiInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO).getDataBean(0);
			// SSO情報
			X31SDataBeanAccess ssoInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO).getDataBean(0);

			// オプションサービス契約情報（配列）
			X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

			// ○オプションサービス契約情報
			X31SDataBeanAccess opSvcKeiInfoBean = null;

			for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
			{
				// オプションサービス契約情報（作業用）
				X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);
				// POPID
				String popId = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

				// オプションサービスコード
				String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

				// オプションサービス契約ステータス
				String opSvcKeiStat = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE);

				// オプションサービス契約情報 オプションサービス契約ステータスが「020:照査済」「030:締結済」「100:サービス提供中」が対象
				if (JFUStrConst.CD00037_020.equals(opSvcKeiStat) || JFUStrConst.CD00037_030.equals(opSvcKeiStat)
						|| JFUStrConst.CD00037_100.equals(opSvcKeiStat))
				{
					// サービス提供中 且つ POPID = SSO情報.POPID 且つ 「B001:Eメール」の場合
					if (popid.equals(popId) && JFUStrConst.CD00136_B001.equals(opSvCd))
					{
						// オプションサービス契約情報（確定）
						opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
					}
				}
			}

			if (opSvcKeiInfoBean == null)
			{
				X31SWebLog.DEBUG_LOG.debug("【オプションサービス契約情報なしエラー】");
				// システムエラーをスロー
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}

			if (ACTION_NAME_CERTIFICATION.equals(actionName))
			{
				// ●リクエスト情報からBeanへの移送処理
				// サービス契約番号
				resMap.put(CUSTOMER_ID, bean.sendMessageString(FUA028SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
				// お客さま名
				resMap.put(CUSTOMER_NAME, bean.sendMessageString(FUA028SFConst.CUST_NM, X31CWebConst.DATABEAN_GET_VALUE));

				// メールアドレス
				resMap.put(MAIL_ADDRESS, ((String)reqMap.get(POP_ID)).replace(JFUStrConst.PERCENT, JFUStrConst.ATMARK));
			}
			else if (ACTION_NAME_UPDATE.equals(actionName))
			{

				// ●リクエスト情報からBeanへの移送処理
				// 希望メールアカウント mlad
				StringBuffer chgPopidSb = new StringBuffer(DEFAULT_INITIAL_CAPACITY);

				String chgPopid =
						chgPopidSb.append(reqMap.get(MAIL_ACCOUNT)).append(JFUStrConst.PERCENT).append(popid.split(JFUStrConst.PERCENT)[1])
								.toString();
				String chgMlad = chgPopid.replace(JFUStrConst.PERCENT, JFUStrConst.ATMARK);

				// メールアドレス
				resMap.put(MAIL_ADDRESS, chgMlad);
				// POPID
				resMap.put(POP_ID, chgPopid);

				// 現在のメールアドレス
				String mlAd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.MLAD_28, X31CWebConst.DATABEAN_GET_VALUE);

				// 変更後POP_ID chg_pop_id
				bean.sendMessageString(FUA028SFConst.CHG_POP_ID, X31CWebConst.DATABEAN_SET_VALUE, chgPopid);
				// 変更後メールアドレス chg_mlad
				bean.sendMessageString(FUA028SFConst.CHG_MLAD, X31CWebConst.DATABEAN_SET_VALUE, chgMlad);

				// ●メールアドレス変更サービス呼出処理
				// メールアドレス自動設定ツール連携(指示実行)サービスの呼び出しを行う。
				try
				{
					// ユースケースID格納用マップを生成。
					HashMap<String, String> paramMap = new HashMap<String, String>(DEFAULT_INITIAL_CAPACITY);
					paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0122);

					FUSV0122_FUSV0122OPDBMapper mapper = new FUSV0122_FUSV0122OPDBMapper();

					HashMap<String, Object> dataMap = new HashMap<String, Object>();
					X31SDataBeanAccess[] paramBean = { bean };

					// メール各種設定引継フラグ
					String mailSuccession = (String)reqMap.get(MAIL_SUCCESSION);
					// メールアドレス変更時メール転送フラグ
					String mailForward = (String)reqMap.get(MAIL_FORWARD);

					// メール各種設定引継フラグ
					String mailSuccessionSetValue = null;
					// メールアドレス変更時メール転送フラグ
					String mailForwardSetValue = null;

					// アクション名が、「UPDATE」の場合、MAIL_SUCCESSIONが、未設定/TRUE/FALSE以外はエラー
					if (!JFUWebCommon.isNull(mailSuccession))
					{
						// 引き継ぐ
						if (MAIL_SUCCESSION_FLAG_TRUE.equals(mailSuccession))
						{
							mailSuccessionSetValue = JFUStrConst.CD01598_1;
						}
						// 引き継がない
						else
						{
							mailSuccessionSetValue = JFUStrConst.CD01598_0;
						}
					}
					else
					{
						mailSuccessionSetValue = JFUStrConst.CD01598_0;
					}

					// アクション名が、「UPDATE」の場合、MAIL_FORWARDが、未設定/TRUE/FALSE以外はエラー
					if (!JFUWebCommon.isNull(mailForward))
					{
						// 転送する
						if (MAIL_FORWARD_FLAG_TRUE.equals(mailForward))
						{
							mailForwardSetValue = JFUStrConst.CD01598_1;
						}
						// 転送しない
						else
						{
							mailForwardSetValue = JFUStrConst.CD01598_0;
						}
					}
					else
					{
						mailForwardSetValue = JFUStrConst.CD01598_0;
					}

					// メールアドレス自動設定ツール連携(指示実行)サービス設定
					mapper.setFUSV0122WORK01(paramBean, dataMap);

					// 共通関連チェック共通コンポーネント部品
					mapper.setFUSV012201CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, (String)reqMap.get(POP_ID));
					// オプションサービス契約＜ISP＞一意照会
					mapper.setFUSV012202CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
					// エイジング一覧照会(エイジング対象値)(メールアドレス)
					mapper.setFUSV012203CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング一覧照会(エイジング対象値)(POPID)
					mapper.setFUSV012204CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング一覧照会(エイジング対象値)(エイリアス)
					mapper.setFUSV012205CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// サービスオーダ登録CC
					mapper.setFUSV012206CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, mailSuccessionSetValue, mailForwardSetValue,
							opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.CAPA_28, X31CWebConst.DATABEAN_GET_VALUE));
					// 非課金判定CC
					mapper.setFUSV012208CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// オプトインメール受信設定登録CC
					mapper.setFUSV012209CC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);

					// 申込内容承認登録
					mapper.setFUSV012201SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// サブオプションサービス契約一意照会
					mapper.setFUSV012202SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
					// サブオプションサービス契約解約
					mapper.setFUSV012203SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// サブオプションサービス契約解約確定
					mapper.setFUSV012204SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// オプションサービス契約<ISP>情報変更
					mapper.setFUSV012205SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, mailSuccessionSetValue, mailForwardSetValue);
					// エイジング対象使用終了(メールアドレス)
					mapper.setFUSV012206SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング対象使用終了(POPID)
					mapper.setFUSV012207SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング対象使用終了(エイリアス)
					mapper.setFUSV012208SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング対象登録(メールアドレス)
					mapper.setFUSV012209SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// エイジング対象登録(POPID)
					mapper.setFUSV012210SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// 進捗登録
					mapper.setFUSV012211SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// 申込明細照査・後続業務依頼
					mapper.setFUSV012212SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// サブオプションサービス契約キャンセル
					mapper.setFUSV012213SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
					// オプションサービス契約一意照会
					mapper.setFUSV012214SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
					// オプションサービス契約＜ISP＞一意照会
					mapper.setFUSV012215SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_2);
					// 指示書登録
					mapper.setFUSV012216SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

					// メールエイリアス契約保有時、サブオプションサービス契約ステータスを予備1に設定
					if (!JFUWebCommon.isNull(bean.sendMessageString(FUA028SFConst.ALIAS, X31CWebConst.DATABEAN_GET_VALUE)))
					{
						JFUWebCommon.setSbopSvcKeiStatRsv1(this, dataMap, JFUStrConst.CD00136_B001, JFUStrConst.CD00137_D01);
					}

					// メールエイリアスのステータスをチェック
					if (!checkAliasStatus(commoninfoBean, popid))
					{
						// 返却値の設定（契約状態エラー）
						return setResponseXml(bean, createResponseXml(ERROR_CONTRACT_STATUS));
					}

					// 検索結果格納用マップを生成。
					HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

					// サービスの呼び出しを行う。
					invokeService(paramMap, dataMap, outputMap);
				}
				catch (JCCWebServiceException se)
				{

					// 例外情報を取得
					X31CMessageResult msgResult = se.getMessageList();
					X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
					X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
					String errStatus = info.getStatus();

					String templateid = info.getTemplateId(); // テンプレートID
					String itemid = info.getItemId(); // アイテム
					String errFlg = info.getItemCheckErr(); // エラーフラグ

					// ●単項目チェック
					if (String.valueOf(JPCModelConstant.SINGLEDATA_ERR).equals(errStatus))
					{

						// テンプレートIDが"EKK0361C050"かつエラーフラグが"E2"かつアイテムが"メールアドレス"、又は"希望メールアドレス1"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.DMN_ERR.equals(errFlg)
								&& (MLAD.equals(itemid) || KIBO_ML_ACCOUNT_1.equals(itemid)))
						{
							// 返却値の設定（システムエラー）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT));
						}

						// テンプレートIDが"EKK0361C050"かつエラーフラグが"E3"かつアイテムが"メールアドレス"、又は"希望メールアドレス1"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.KETA_ERR.equals(errFlg)
								&& (MLAD.equals(itemid) || KIBO_ML_ACCOUNT_1.equals(itemid)))
						{
							// 返却値の設定（システムエラー）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_LENGTH));
						}
					}
					// ●関連チェック
					else if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(errStatus))
					{

						// テンプレートIDが"EKK0081A010"かつエラーフラグが"EA"の場合
						if (EKK0081A010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg)
								&& JFUStrConst.RELATION_CHECK_ITEM_SVC_KEI.equals(itemid))
						{
							// 返却値の設定（契約状態エラー）
							return setResponseXml(bean, createResponseXml(ERROR_CONTRACT_STATUS));
						}

						// テンプレートIDが"EKK0081A010"かつエラーフラグが"EA"の場合
						if (EKK0081A010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg)
								&& JFUStrConst.RELATION_CHECK_ITEM_SVC_KEI_STAT.equals(itemid))
						{
							// 返却値の設定（契約状態エラー）
							return setResponseXml(bean, createResponseXml(ERROR_CONTRACT_STATUS));
						}

						// テンプレートIDが"EKK0491B504"かつエラーフラグが"EA"の場合
						if (EKK0491B504.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg)
								&& JFUStrConst.RELATION_CHECK_ITEM_TOKUSOKU.equals(itemid))
						{
							// 返却値の設定（契約状態エラー）
							return setResponseXml(bean, createResponseXml(ERROR_CONTRACT_STATUS));
						}

						// 必須チェック
						// テンプレートIDが"EKK0361C050"かつエラーフラグが"ED"かつアイテムが"オプションサービス契約番号"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_ED.equals(errFlg) && OP_SVC_KEI_NO.equals(itemid))
						{
							// 返却値の設定（メールアカウント未設定）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_REQUIRED));
						}

						// 変更不可期間中チェック
						// テンプレートIDが"EKK0361C050"かつエラーフラグが"EA"かつアイテムが"希望メールアカウント1"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && KIBO_ML_ACCOUNT_1.equals(itemid))
						{
							// 返却値の設定（メールアドレス変更不可期間）
							return setResponseXml(bean, createResponseXml(ERROR_CHANGE_IMPOSSIBLE_MLAD));
						}

						// NGワードチェック
						// テンプレートIDが"EKK0361C050"かつエラーフラグが"EB"かつアイテムが"希望メールアカウント1"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && KIBO_ML_ACCOUNT_1.equals(itemid))
						{
							// 返却値の設定（メールアドレス未変更・NGワード）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_NG_WORD));
						}

						// エイジングチェック
						// テンプレートIDが"EKK0361C050"かつエラーフラグが"EB"かつアイテムが"メールアドレス"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && MLAD.equals(itemid))
						{
							// 返却値の設定（メールアカウント使用済み）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_USED));
						}

						// タイムスタンプチェック(排他チェック)
						// テンプレートIDが"EKK0401C170"かつエラーフラグが"EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
						if (EKK0401C170.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
						{
							// 返却値の設定（排他エラー）
							return setResponseXml(bean, createResponseXml(ERROR_EXCLUSIVE));
						}

						// テンプレートIDが"EKK0401C180"かつエラーフラグが"EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
						if (EKK0401C180.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
						{
							// 返却値の設定（排他エラー）
							return setResponseXml(bean, createResponseXml(ERROR_EXCLUSIVE));
						}

						// テンプレートIDが"EKK0361C050"かつエラーフラグが"EA"かつアイテムが"更新年月日時分秒(更新前)"の場合
						if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
						{
							// 返却値の設定（排他エラー）
							return setResponseXml(bean, createResponseXml(ERROR_EXCLUSIVE));
						}

						// 存在チェック
						// テンプレートIDが"EZM0111C010"かつエラーフラグが"EA"かつアイテムが"エイジング種別コード"の場合
						if (EZM0111C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && AGING_SBT_CD.equals(itemid))
						{
							// 返却値の設定（メールアカウント使用済み）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_USED));
						}

						// 排他チェック
						// テンプレートIDが"EZM0111C010"かつエラーフラグが"EB"かつアイテムが"エイジング種別コード"の場合
						if (EZM0111C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && AGING_SBT_CD.equals(itemid))
						{
							// 返却値の設定（排他エラー）
							return setResponseXml(bean, createResponseXml(ERROR_EXCLUSIVE));
						}

						// 存在チェック
						// テンプレートIDが"EZM0111D010"かつエラーフラグが"EA"かつアイテムが"エイジング対象値"の場合
						if (EZM0111D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && AGING_TG_VALUE.equals(itemid))
						{
							// 返却値の設定（メールアカウント使用済み）
							return setResponseXml(bean, createResponseXml(ERROR_MAIL_ACCOUNT_USED));
						}
					}

					// 返却値の設定（システムエラー）
					return setResponseXml(bean, createResponseXml(ERROR_SYSTEM));
				}

				FUSV0122_FUSV0122OPDBMapper mapper = new FUSV0122_FUSV0122OPDBMapper();
				X31SDataBeanAccess[] paramBean = { bean };

				// CKSV9001のサービス情報を設定
				Map<String, String> ckParamMap = new HashMap<String, String>();
				ckParamMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, CC_TITLE_CKSV9001);

				HashMap<String, Map<String, String>> ckInputMap = new HashMap<String, Map<String, String>>();
				HashMap<String, String> ckOutputMap = new HashMap<String, String>();

				// ●上りマッピング
				// 会員情報更新依頼
				mapper.setCKSV900101CC(paramBean, ckInputMap);

				try
				{
					// ●サービス呼出
					invokeService(ckParamMap, ckInputMap, ckOutputMap);
				}
				catch (Throwable ta)
				{
					// エラーでも何もしない
					DEBUG_LOG.debug("CKSV9001：会員情報更新依頼でエラーが発生したが処理は続行する");
				}

				// 申込完了メール送信部品呼出処理
				// メールアドレス変更申込(申込)
				JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID1, mlAd);
			}

			// ACTION_NMが「EXPAND」の場合
			if (ACTION_NAME_EXPAND.equals(actionName))
			{
				// ---- サービスフォームbean ----
				// サービスフォームBeanのデータBeanアクセスクラスを取得。
				HashMap<String, String> paramMap = new HashMap<String, String>(DEFAULT_INITIAL_CAPACITY);
				paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0272);

				FUSV0272_FUSV0272OPDBMapper mapper = new FUSV0272_FUSV0272OPDBMapper();

				HashMap<String, Object> dataMap = new HashMap<String, Object>();

				X31SDataBeanAccess[] paramBean = { svcKeiInfoBean };

				// SC
				// 1.料金コース_サブオプションサービス一意照会
				dataMap = mapper.setFUSV027201SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

				// 検索結果格納用マップを生成。
				HashMap<String, Object> outputMap = new HashMap<String, Object>();

				try
				{
					// サービスの呼び出しを行う。
					invokeService(paramMap, dataMap, outputMap);

				}
				catch (JCCWebServiceException se)
				{
					// システムエラー
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
				}

				// ●サービス処理結果の取得
				// 1.料金コース_サブオプションサービス一意照会
				bean = mapper.getFUSV027201SC(bean, outputMap);

				// 容量
				int mlboxCapa =
						Long.valueOf(opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.CAPA_28, X31CWebConst.DATABEAN_GET_VALUE)).intValue();
				// 追加容量増分上限値
				int mlboxMaxCapa = bean.sendMessageLong(FUW02101SFConst.ADD_CAPA_ZOUBUN_UPPL_VALUE, X31CWebConst.DATABEAN_GET_VALUE).intValue();
				// 追加可能メールボックス契約容量
				int mlboxKeiCapa = mlboxMaxCapa - mlboxCapa;

				// メールボックス容量拡張指示フラグ
				String isExpanded = (String)reqMap.get(IS_EXPANDED);

				// IS_EXPANDED=TRUEの時
				if (IS_EXPANDE_FLAG_TRUE.equals(isExpanded))
				{
					// オプションサービス契約<ISP>の容量が、上限値でない場合エラー "50006"
					// オプションサービス契約<ISP>の容量が、上限値の場合エラー "50007"
					if (mlboxKeiCapa != 0)
					{
						// メールボックス容量は上限値まで申し込まれていません。
						return setResponseXml(bean, createResponseXml(ERROR_IS_EXPANDED_3));
					}
				}
				// IS_EXPANDED=FALSEの時
				else
				{
					// オプションサービス契約<ISP>の容量が、上限値の場合エラー "50007"
					if (mlboxKeiCapa <= 0)
					{
						// メールボックス容量は既に上限値に達しています。
						return setResponseXml(bean, createResponseXml(ERROR_IS_EXPANDED_4));
					}

					// ●サービス呼び出し処理
					// メールボックス契約容量追加申込（申込み）サービスの呼び出しを行う。
					// ユースケースID格納用マップを生成。
					HashMap<String, String> paramMap2 = new HashMap<String, String>(DEFAULT_INITIAL_CAPACITY);
					paramMap2.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0275);

					FUSV0275_FUSV0275OPDBMapper mapper2 = new FUSV0275_FUSV0275OPDBMapper();

					HashMap<String, Object> dataMap2 = new HashMap<String, Object>();

					// ○サブオプションサービス契約情報
					X31SDataBeanAccess sbopSvcKeiInfoBean = null;
					if (opSvcKeiInfoBean != null)
					{
						// オプションサービス契約情報のオプションサービス番号
						String opInfoOpSvcKeiNo =
								opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);
						if (JFUWebCommon.isNull(opInfoOpSvcKeiNo))
						{
							X31SWebLog.DEBUG_LOG.debug("【オプションサービス契約番号未設定エラー】");
							// システムエラーをスロー
							throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
						}

						// サブオプションサービス契約情報（配列）⇒オプションサービス契約情報の配列の１番目から取得
						X31SDataBeanAccessArray sbopSvcKeiInfoArray =
								opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

						for (int n = 0; n < sbopSvcKeiInfoArray.getCount(); n++)
						{
							// サブオプションサービス契約情報（作業用）
							X31SDataBeanAccess tmpSbopSvcKeiInfoBean = sbopSvcKeiInfoArray.getDataBean(n);

							// オプションサービス契約番号
							String opSvcKeiNo =
									tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE);

							// サブオプションサービス契約ステータス
							String sbopSvcKeiStat =
									tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE);

							// サブオプションサービスコード
							String sbopSvCd =
									tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE);

							// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「910:解約済」と「920:キャンセル済」の場合
							// スキップ
							if (JFUStrConst.CD00037_910.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_920.equals(sbopSvcKeiStat))
							{
								continue;
							}

							// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号 且つ
							// 「D02:メール容量追加の場合」の場合
							if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D02.equals(sbopSvCd))
							{
								// サブオプションサービス契約情報（確定）
								sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean;
							}
						}

						// 新規登録区分
						Boolean newAddDiv = Boolean.TRUE;
						if (sbopSvcKeiInfoBean != null)
						{
							newAddDiv = Boolean.FALSE;
						}

						X31SDataBeanAccess[] paramBean2 =
								{ bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, opSvcKeiInfoBean, sbopSvcKeiInfoBean };

						// SC
						// 1.申込内容承認登録
						dataMap2 = mapper2.setFUSV027501SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1, newAddDiv);
						// 2.オプションサービス契約<ISP>情報変更
						dataMap2 =
								mapper2.setFUSV027502SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1, String.valueOf(mlboxKeiCapa + mlboxCapa));
						// 3.サブオプションサービス契約<ISP>登録
						dataMap2 = mapper2.setFUSV027503SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1, String.valueOf(mlboxKeiCapa));
						// 9.サブオプションサービス契約<ISP>照査
						dataMap2 = mapper2.setFUSV027509SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1);
						// 4.サブオプションサービス契約<ISP>照査締結
						dataMap2 = mapper2.setFUSV027504SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1);
						// 5.サブオプションサービス契約<ISP>使用開始
						dataMap2 = mapper2.setFUSV027505SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1);
						// 6.サブオプションサービス契約<ISP>変更
						dataMap2 = mapper2.setFUSV027506SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1, String.valueOf(mlboxKeiCapa));
						// 7.進捗登録
						dataMap2 = mapper2.setFUSV027507SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1);
						// 8.申込明細照査・後続業務依頼
						dataMap2 = mapper2.setFUSV027508SC(paramBean2, dataMap2, JPCModelConstant.FUNC_CD_1);

						// CC
						// 1.オプションサービス契約＜ISP＞一意照会CC
						dataMap2 = mapper2.setFUSV027501CC(paramBean2, dataMap2);
						// 2.サブオプションサービス契約一意照会CC
						dataMap2 = mapper2.setFUSV027502CC(paramBean2, dataMap2);
						// 3.サービスオーダ登録CC
						dataMap2 =
								mapper2.setFUSV027503CC(paramBean2, dataMap2, opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.CAPA_28,
										X31CWebConst.DATABEAN_GET_VALUE));

						// オプションサービス契約ステータスを設定
						JFUWebCommon.setOpSvcKeiStatMail(this, dataMap2);

						// 検索結果格納用マップを生成。
						HashMap<Object, Object> outputMap2 = new HashMap<Object, Object>();
						try
						{
							// サービスの呼び出しを行う。
							invokeService(paramMap2, dataMap2, outputMap2);

						}
						catch (JCCWebServiceException se)
						{
							String errorStatus = checkException(se);

							return setResponseXml(bean, createResponseXml(errorStatus));
						}

						// 申込完了メール送信部品呼出処理
						// メールボックス契約容量追加申込(申込)
						JFUWebCommon.sendMskmFinMail(this, MSKM_COMP_MAIL_ID2);
					}
				}
			}

			// ●結果返却処理
			return setResponseXml(bean, createResponseXml(SUCCESS, reqMap, resMap));
		}
		catch (Throwable e1)
		{
			JSYwebLog.printStackTrace(JSYwebLog.ERROR, this.getClass(), e1, null, null);
			try
			{
				// 返却値の設定（システムエラー）
				return setResponseXml(bean, createResponseXml(ERROR_SYSTEM));

			}
			catch (Throwable e2)
			{
				JSYwebLog.printStackTrace(JSYwebLog.ERROR, this.getClass(), e2, null, null);
			}
		}
		return true;
	}

	/**
	 * 例外の判定処理。 <BR>
	 *
	 * @param se
	 */
	private String checkException(JCCWebServiceException se)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = se.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();
		String errorStatus = null;

		// エラーを判定
		// 業務エラー
		// 関連チェック
		// エラーを判定
		// システムエラー
		// 関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// オプション契約上限チェック
			if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg) && CAPA.equals(itemid))
			{
				// "50007"(メールボックス容量は既に上限値に達しています。)
				return errorStatus = ERROR_IS_EXPANDED_4;
			}
			// タイムスタンプチェック
			if (EKK0361C050.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemid))
			{
				// "50000"(排他エラー)
				return errorStatus = ERROR_EXCLUSIVE;
			}

			// サブオプションサービス契約＜ISP＞登録
			// 契約単位チェック
			if (EKK0411D010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && ADD_CAPA.equals(itemid))
			{
				// "00013"(契約状態エラー)
				return errorStatus = ERROR_CONTRACT_STATUS;
			}

			// サブオプションサービス契約＜ISP＞変更
			// 契約単位チェック
			if (EKK0411C010.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EJ.equals(errFlg) && SBOP_SVC_KEI_NO.equals(itemid))
			{
				// "00013"(契約状態エラー)
				return errorStatus = ERROR_CONTRACT_STATUS;
			}
		}

		// 上記以外の場合システムエラーをスロー
		errorStatus = ERROR_SYSTEM;

		return errorStatus;
	}

	/**
	 * エイリアスステータスチェック
	 * <br>
	 * @param commoninfoBean
	 * @param popid
	 * @throws Exception
	 */
	private boolean checkAliasStatus(X31SDataBeanAccess commoninfoBean, String popid) throws Exception
	{
		// WEB変更情報
		X31SDataBeanAccess webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0);
		// 現顧客情報
		X31SDataBeanAccess genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0);
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0);
		// サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;

		// オプションサービス契約情報（配列）
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);

			// POPID
			String tmpPopId = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービス契約ステータス
			String opSvcKeiStat = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE);

			// オプションサービス契約情報 オプションサービス契約ステータスが「020:照査済」「030:締結済」「100:サービス提供中」が対象
			if (JFUStrConst.CD00037_020.equals(opSvcKeiStat) || JFUStrConst.CD00037_030.equals(opSvcKeiStat)
					|| JFUStrConst.CD00037_100.equals(opSvcKeiStat))
			{
				// 変更対象POPIDと一致、且つ 「B001:Eメール」の場合
				if (popid.equals(tmpPopId) && JFUStrConst.CD00136_B001.equals(opSvCd))
				{
					// オプションサービス契約情報（確定）
					opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
					break;
				}
			}
		}

		if (opSvcKeiInfoBean != null)
		{
			// オプションサービス契約情報のオプションサービス番号
			String opInfoOpSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE);

			// サブオプションサービス契約情報（配列）⇒オプションサービス契約情報の配列の１番目から取得
			X31SDataBeanAccessArray sbopSvcKeiInfoArray = opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(CommonInfoCFConst.SBOP_SVC_KEI_INFO);

			for (int n = 0; n < sbopSvcKeiInfoArray.getCount(); n++)
			{
				// サブオプションサービス契約情報（作業用）
				X31SDataBeanAccess tmpSbopSvcKeiInfoBean = sbopSvcKeiInfoArray.getDataBean(n);

				// オプションサービス契約番号
				String opSvcKeiNo = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE);

				// サブオプションサービス契約ステータス
				String sbopSvcKeiStat =
						tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE);

				// サブオプションサービスコード
				String sbopSvCd = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE);

				// オプションサービス契約番号 = オプションサービス契約情報.オプションサービス契約番号 且つ
				// 「D01:メールエイリアス」の場合
				if (opInfoOpSvcKeiNo.equals(opSvcKeiNo) && JFUStrConst.CD00137_D01.equals(sbopSvCd))
				{
					// サブオプションサービス契約情報 サブオプションサービス契約ステータスが「210:休止・中断中」と「220:停止中」の場合
					if (JFUStrConst.CD00037_210.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_220.equals(sbopSvcKeiStat))
					{
						return false;
					}
				}
			}
		}
		return true;
	}

	/**
	 * 単項目チェックを行います。
	 *
	 * <br>
	 * @param reqMap リクエスト情報
	 * @param reqMethod
	 * @return エラーコード
	 */
	private static String checkSingleError(Map<String, Object> reqMap, String reqMethod)
	{
		// メソッドがPOSTメソッドでない場合は、エラー
		if (!REQUEST_METHOD_POST.equals(reqMethod))
		{
			return ERROR_REQUEST_METHOD;
		}

		// アクション名がパラメータが送信されていない場合は、エラー
		if (JFUWebCommon.isNull(reqMap.get(ACTION_NAME)))
		{
			return ERROR_ACTION_NAME_REQUIRED;

		}

		// 処理の種類（POPID認証とアドレス変更）
		// CERTIFICATION:POPID認証
		// UPDATE:メールアドレス変更
		String actionName = (String)reqMap.get(ACTION_NAME);
		// リクエスト元が識別できる値
		String sourceId = (String)reqMap.get(SOURCE_ID);

		// 画面表示認証用POSTデータ(認証用のパスワード(10桁固定)＋バージョン番号(3桁固定))
		String certificationId = (String)reqMap.get(CERTIFICATION_ID);

		// POPID
		String popId = (String)reqMap.get(POP_ID);

		// POPパスワード
		String popPw = (String)reqMap.get(POP_PW);

		// アクション名が「CERTIFICATION」/「UPDATE」/「EXPAND」以外はエラー
		if (!ACTION_NAME_CERTIFICATION.equals(actionName) && !ACTION_NAME_UPDATE.equals(actionName) && !ACTION_NAME_EXPAND.equals(actionName))
		{
			return ERROR_ACTION_NAME;
		}

		// リクエスト元の識別子が値が設定されていない場合は、エラー
		if (JFUWebCommon.isNull(sourceId))
		{
			return ERROR_SOURCE_ID_REQUIRED;
		}

		// 画面表示認証用POSTデータが未送信、未設定、桁数が13桁以外、半角英数字(「a〜z、A〜Z、0〜9」)の場合は、エラー
		if (JFUWebCommon.isNull(certificationId) || 13 != certificationId.length() || !certificationId.matches(CERTIFICATION_ID_MATCH_KEY))
		{
			return ERROR_CERTIFICATION_ID;
		}

		// POPID値が設定されていない場合は、エラー
		if (JFUWebCommon.isNull(popId))
		{
			return ERROR_POP_ID_REQUIRED;
		}

		// POPパスワードが値が設定されていない場合は、エラー
		if (JFUWebCommon.isNull(popPw))
		{
			return ERROR_POP_ID_PW_REQUIRED;
		}

		return SUCCESS;
	}

	/**
	 * 単関連チェックを行います。
	 *
	 * <br>
	 * @param reqMap リクエスト情報
	 * @return エラーコード
	 */
	private static String checkSingleRelationError(Map<String, Object> reqMap)
	{
		// 処理の種類（POPID認証とアドレス変更）
		// CERTIFICATION:POPID認証
		// UPDATE:メールアドレス変更
		// EXPAND:メールアドレス容量チェック拡張
		String actionName = (String)reqMap.get(ACTION_NAME);

		// POPID
		String popId = (String)reqMap.get(POP_ID);

		// メール各種設定引継フラグ
		String mailSuccession = (String)reqMap.get(MAIL_SUCCESSION);
		// メールアドレス変更時メール転送フラグ
		String mailForward = (String)reqMap.get(MAIL_FORWARD);
		// メールボックス容量拡張指示フラグ
		String isExpanded = (String)reqMap.get(IS_EXPANDED);
		// 変更希望のメールアカウント(ACTION_NAMEがUPDATEの場合に必須)
		String mailAccount = (String)reqMap.get(MAIL_ACCOUNT);

		if (ACTION_NAME_UPDATE.equals(actionName))
		{// アクション名が「UPDATE」の場合

			// アクション名が「UPDATE」で希望メールアカウントが未設定の場合はエラー
			if (JFUWebCommon.isNull(mailAccount))
			{
				return ERROR_MAIL_ACCOUNT_REQUIRED;
			}

			// アクション名が「UPDATE」でPOPIDのアカウント部分が希望メールアカウントと一致する場合はエラー
			String[] popIdSplit = popId.split(JFUStrConst.PERCENT);
			if (popIdSplit[0].equals(mailAccount))
			{
				return ERROR_MAIL_ACCOUNT_NG_WORD;
			}

			// アクション名が、「UPDATE」の場合、MAIL_SUCCESSIONが、未設定/TRUE/FALSE以外はエラー
			if (!JFUWebCommon.isNull(mailSuccession))
			{
				if (!MAIL_SUCCESSION_FLAG_TRUE.equals(mailSuccession))
				{
					if (!MAIL_SUCCESSION_FLAG_FALSE.equals(mailSuccession))
					{
						return ERROR_MAIL_SUCCESSION;
					}
				}
			}

			// アクション名が、「UPDATE」の場合、MAIL_FORWARDが、未設定/TRUE/FALSE以外はエラー
			if (!JFUWebCommon.isNull(mailForward))
			{
				if (!MAIL_FORWARD_FLAG_TRUE.equals(mailForward))
				{
					if (!MAIL_FORWARD_FLAG_FALSE.equals(mailForward))
					{
						return ERROR_MAIL_FORWARD;
					}
				}
			}
		}

		if (ACTION_NAME_EXPAND.equals(actionName))
		{// アクション名が「EXPAND」の場合

			// アクション名が、「EXPAND」の場合、IS_EXPANDEDが、未設定の場合はエラー
			if (JFUWebCommon.isNull(isExpanded))
			{
				return ERROR_IS_EXPANDED_1;
			}

			// アクション名が、「EXPAND」の場合、IS_EXPANDEDが、TRUE/FALSE以外はエラー
			if (!IS_EXPANDE_FLAG_TRUE.equals(isExpanded) && !IS_EXPANDE_FLAG_FALSE.equals(isExpanded))
			{
				return ERROR_IS_EXPANDED_2;
			}
		}

		return SUCCESS;
	}

	/**
	 * 関連チェックを行います。
	 *
	 * <br>
	 * @param reqMap リクエスト情報
	 * @param resMap
	 * @return エラーコード
	 */
	private static String checkRelationError(Map<String, Object> reqMap, Map<String, Object> resMap)
	{
		// 画面表示認証用POSTデータ(認証用のパスワード(10桁固定)＋バージョン番号(3桁固定))
		String certificationId = (String)reqMap.get(CERTIFICATION_ID);

		// 認証ID
		String ninshoId = (String)resMap.get(NINSHO_ID);

		// 不許可バージョン(カンマ区切りでプロパティに設定)
		String failKyokaVsn = (String)resMap.get(FAIL_KYOKA_VSN);

		// 画面表示認証用POSTデータの上10桁が、DataBean設定プロパティ取得処理で取得した認証IDとマッチしない場合は、エラーとする。
		if (!certificationId.substring(0, 10).equals(ninshoId))
		{
			return ERROR_CERTIFICATION_ID;
		}

		// 画面表示認証用POSTデータの下3桁が、DataBean設定プロパティ取得処理で取得した不許可バージョンのうちの１件とマッチした場合は、エラーとする。
		String version = certificationId.substring(10, 13);
		String[] failKyokaVsnArray = failKyokaVsn.split(JFUStrConst.COMMA);

		for (int i = 0; i < failKyokaVsnArray.length; i++)
		{
			String denyVersion = failKyokaVsnArray[i];
			if (JFUWebCommon.isNull(denyVersion))
			{
				continue;
			}

			if (denyVersion.equals(version))
			{
				return ERROR_FAIL_KYOKA_VSN;
			}
		}

		return SUCCESS;
	}

	/**
	 * 返却用XML作成します。
	 *
	 * <br>
	 * @param status
	 * @return 返却用XML
	 * @throws Exception
	 */
	private static String createResponseXml(String status) throws Exception
	{
		return createResponseXml(status, null, null);
	}

	/**
	 * 返却用XML作成します。
	 *
	 * <br>
	 * @param status
	 * @param reqMap
	 * @param resMap
	 * @return 返却用XML
	 * @throws Exception
	 */
	private static String createResponseXml(String status, Map<String, Object> reqMap, Map<String, Object> resMap) throws Exception
	{

		StringBuffer responseSb = new StringBuffer(DEFAULT_INITIAL_CAPACITY);

		// ヘッダー部（固定）
		responseSb.append(XML_FR_START).append(XML_HEADER).append(XML_END).append(JFUStrConst.RETURN_CODE);
		responseSb.append(XML_FR_START).append(RESPONSE).append(XML_END).append(JFUStrConst.RETURN_CODE);
		responseSb.append(XML_FR_START).append(STATUS).append(XML_END).append(status).append(XML_BK_START).append(STATUS).append(XML_END).append(
				JFUStrConst.RETURN_CODE);

		// ボディー（可変）
		if (SUCCESS.equals(status))
		{
			// 正常系

			if (ACTION_NAME_CERTIFICATION.equals(reqMap.get(ACTION_NAME)))
			{
				// CERTIFICATION:POPID認証

				responseSb = createBodyTag(responseSb, resMap, CUSTOMER_ID);
				responseSb = createBodyTag(responseSb, resMap, CUSTOMER_NAME);
				responseSb = createBodyTag(responseSb, reqMap, POP_ID);
				responseSb = createBodyTag(responseSb, resMap, MAIL_ADDRESS);
				responseSb = createBodyTag(responseSb, resMap, CHANGE_IMPOSSIBLE_FLAG);
			}
			else if (ACTION_NAME_UPDATE.equals(reqMap.get(ACTION_NAME)))
			{
				// UPDATE:メールアドレス変更
				responseSb = createBodyTag(responseSb, resMap, POP_ID);
				responseSb = createBodyTag(responseSb, reqMap, POP_PW);
				responseSb = createBodyTag(responseSb, resMap, MAIL_ADDRESS);
			}
		}
		else
		{
			// 異常系
			responseSb = createErrorMessageTag(responseSb, status, ERROR_MESSAGE);
		}

		// フッター部（固定）
		responseSb.append(XML_BK_START).append(RESPONSE).append(XML_END).append(JFUStrConst.RETURN_CODE);

		return responseSb.toString();
	}

	/**
	 * メールアドレス変更不可期間チェックします。
	 *
	 * <br>
	 * @param bean
	 * @return true:変更可能、false:変更不可
	 * @throws Exception
	 * @throws NumberFormatException
	 */
	private boolean isChangeImpossible(X31SDataBeanAccess bean) throws NumberFormatException, Exception
	{
		// メールアドレス変更回数
		int mladChgCnt = Integer.parseInt(bean.sendMessageString(FUA028SFConst.MLAD_CHG_CNT, X31CWebConst.DATABEAN_GET_VALUE));
		// メールアドレス変更回数＜3回の場合は、無条件で変更可能（変更不可期間チェックをしない）
		if (mladChgCnt < MLAD_CHG_CHK_YUKO_CNT)
		{
			return true;
		}
		String mladChgeYmd = bean.sendMessageString(FUA028SFConst.MLAD_CHGE_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		if (JFUWebCommon.isNull(mladChgeYmd))
		{
			return true;
		}
		int mladAgingPrd = Integer.parseInt(bean.sendMessageString(FUA028SFConst.MLAD_AGING_PRD, X31CWebConst.DATABEAN_GET_VALUE));
		return !JFUWebCommon.isFutureDate(JFUWebCommon.addDay(mladChgeYmd, mladAgingPrd), JFUWebCommon.getOpeDate(this, null),
				METHOD_FLG_ISFUTUREDATE_0);
	}

	/**
	 * 返却XMLの本体部分を設定します。
	 *
	 * <br>
	 * @param inputSb
	 * @param mapInfo
	 * @param tagName
	 * @return XMLの本体部分
	 */
	private static StringBuffer createBodyTag(StringBuffer inputSb, Map<String, Object> mapInfo, String tagName)
	{
		return inputSb.append(XML_FR_START).append(tagName).append(XML_END).append(mapInfo.get(tagName)).append(XML_BK_START).append(tagName).append(
				XML_END).append(JFUStrConst.RETURN_CODE);
	}

	/**
	 * エラーメッセージ作成します。
	 *
	 * <br>
	 * @param inputSb
	 * @param status
	 * @param tagName
	 * @return XMLのエラーメッセージ部分
	 * @throws Exception
	 */
	private static StringBuffer createErrorMessageTag(StringBuffer inputSb, String status, String tagName) throws Exception
	{

		String errorMsgs = getErrorMsg(status);

		if (!JFUWebCommon.isNull(errorMsgs))
		{
			String[] errorMsgArray = errorMsgs.split(MESSAGES_DEMILTE);

			int count = 1;
			for (int i = 0; i < errorMsgArray.length; i++)
			{
				String errorMsg = errorMsgArray[i];

				if (JFUWebCommon.isNull(errorMsg))
				{
					continue;
				}
				inputSb.append(XML_FR_START).append(tagName).append(XML_ATTAR_NAME_NO).append(count).append(XML_END_OPTION).append(errorMsg).append(
						XML_BK_START).append(tagName).append(XML_END).append(JFUStrConst.RETURN_CODE);

				count++;
			}
		}
		return inputSb;
	}

	/**
	 * エラーメッセージ取得します。
	 *
	 * <br>
	 * @param status
	 * @return エラーメッセージ
	 * @throws Exception
	 */
	private static String getErrorMsg(String status) throws Exception
	{

		// ●DataBean設定プロパティ取得処理
		Map<String, String> errInfoMap = JFUWebCommon.getDispItemsAsMap(QUERY_STATUS_PATH, QUERY_ATTR_NAME);

		if (null != errInfoMap && errInfoMap.containsKey(status))
		{
			return errInfoMap.get(status);
		}
		return null;
	}

	/**
	 * 返却XMLの設定します。
	 *
	 * <br>
	 * @param bean
	 * @param xml
	 * @return true
	 */
	private static boolean setResponseXml(X31SDataBeanAccess bean, String xml) throws Exception
	{
		bean.sendMessageString(FUA028SFConst.RETURNDATA, X31CWebConst.DATABEAN_SET_VALUE, xml);
		return true;
	}

	/**
	 * リクエストパラメータ出力処理
	 *
	 * @param reqMap リクエスト情報が格納されたMap
	 */
	private void outputParam(Map<String, Object> reqMap)
	{

		if (reqMap == null || reqMap.size() == 0)
		{
			return;
		}

		Set<String> keys = reqMap.keySet();
		StringBuffer msg = new StringBuffer();
		for (Iterator keyList = keys.iterator(); keyList.hasNext();)
		{
			String key = (String)keyList.next();
			if (POP_PW.equals(key))
			{
				continue;
			}
			msg.append(JFUStrConst.KIGOU_B_KAKKO_STA_HALF).append(key).append(KIGOU_EQUALS_HALF).append(reqMap.get(key)).append(
					JFUStrConst.KIGOU_B_KAKKO_END_HALF);
		}
		outputBusLog(msg.toString());
	}

	/**
	 * ビジネスログへの出力処理
	 *
	 * @param msg ログ情報
	 */
	private void outputBusLog(String msg)
	{
		JSYwebLog.println(JSYwebLog.EXECUTION, getClass(), msg, "CS0003I", null, null);
	}

}
