/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKKeishaChgOrsCC
*	ソースファイル名：JCKKeishaChgOrsCC.java
*	作成者			：FJ)藤本
*	日付			：2018年03月23日
*＜機能概要＞
*	契約者情報変更(卸先事業者)の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v37.00.00   2018/03/23   FJ)藤本     【ANK-3366-00-00】eo光設備卸対応
*   v39.00.00	2018/09/02   FJ)澤田     【ANK-3458-00-00】契約者氏名変更時の副次処理を追加（緊急通報氏名の更新）
*   v47.00.00	2020/01/10   FJ)三原     【IT1-2020-0000002】CKIFE050_契約者情報変更(卸先事業者)でシステムエラー
*   v48.00.00	2020/02/17   FJ)美濃原   【ANK-3814-00-00】eoIDログインセキュリティ強化フォロー対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.getSecurityRenkeiTelno;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.getResultString;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.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 eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbs.cbsmsg.ECH0911A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0911A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0241A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0241A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;


/**
 * 契約者情報変更(卸先事業者)の共通コンポーネントクラスです。
 * <br>
 * @author FJ
 */
public class JCKKeishaChgOrsCC extends AbstractCommonComponent
{
	/** CCパラメータ：機能コード */
	public static final String FUNC_CODE = "func_code";
	/** CCパラメータ：リクエストID */
	public static final String REQUEST_ID = "requestID";
	/** CCパラメータ：サービスID */
	public static final String SERVICE_ID = "serviceID";
	/** CCパラメータ：依頼元区分 */
	public static final String CHANNEL = "channel";
	/** CCパラメータ：運用日時 */
	public static final String OPERATE_DATE_TIME = "operateDateTime";
	/** CCパラメータ：共通キー */
	public static final String COMMON_KEY = "commonKey";
	/** CCパラメータ：氏名 */
	public static final String NAME = "name";
	/** CCパラメータ：氏名（カナ） */
	public static final String NAME_KANA = "nameKana";
	/** CCパラメータ：生年月日 */
	public static final String BIRTHDAY = "birthday";
	/** CCパラメータ：性別 */
	public static final String GENDER = "gender";
	/** CCパラメータ：契約者住所_郵便番号 */
	public static final String CONTRACTOR_ADDRESS_ZIPCODE = "contractorAddressZipcode";
	/** CCパラメータ：契約者住所_都道府県名 */
	public static final String CONTRACTOR_ADDRESS_1 = "contractorAddress1";
	/** CCパラメータ：契約者住所_市区町村名 */
	public static final String CONTRACTOR_ADDRESS_2 = "contractorAddress2";
	/** CCパラメータ：契約者住所_大字通称名 */
	public static final String CONTRACTOR_ADDRESS_3 = "contractorAddress3";
	/** CCパラメータ：契約者住所_字丁目 */
	public static final String CONTRACTOR_ADDRESS_4 = "contractorAddress4";
	/** CCパラメータ：契約者住所_番地号 */
	public static final String CONTRACTOR_ADDRESS_5 = "contractorAddress5";
	/** CCパラメータ：契約者住所_建物名 */
	public static final String CONTRACTOR_ADDRESS_6 = "contractorAddress6";
	/** CCパラメータ：契約者住所_部屋番号 */
	public static final String CONTRACTOR_ADDRESS_7 = "contractorAddress7";
	/** CCパラメータ：契約者電話番号 */
	public static final String CONTRACTOR_PHONE_NUM = "contractorPhoneNum";
	/** CCパラメータ：優先連絡先電話番号 */
	public static final String PRIORITY_PHONE_NUM = "priorityPhoneNum";
	/** CCパラメータ：リターンコード */
	public static final String RETURN_CODE = "returnCode";
	/** CCパラメータ：リターンメッセージ */
	public static final String RETURN_MESSAGE = "returnMessage";

	/** テンプレートID：サービス契約一意照会 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** テンプレートID：お客様関連情報一意照会 */
	private static final String TEMPLATE_ID_ECK0241A010 = "ECK0241A010";
	/** テンプレートID：卸先事業者一意照会 */
	private static final String TEMPLATE_ID_ECH0911A010 = "ECH0911A010";

	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";

	/** 作業用マップのキー：運用日 */
	private static final String WORK_KEY_OPEDATE = "opeDate";
	/** 作業用マップのキー：サービス契約一意照会明細 */
	private static final String WORK_KEY_EKK0081A010CBSMSGLIST = "EKK0081A010CBSMsg1List";
	/** 作業用マップのキー：住所編集結果 */
	private static final String WORK_KEY_AD_EDIT_RSLT = "adEditRslt";

	/** お客様変更_お客様情報取得CCマップのキー */
	private static final String CUST_INF_CC_MAP = "CustInfChgCustInfCC";
	/** お客様変更_履歴情報取得CCマップのキー */
	private static final String CUST_RIREKI_INF_CC_MAP = "CustInfChgRirekiInfCC";
	/** お客様変更_予約取消CCマップのキー */
	private static final String CUST_RSV_CL_CC_MAP = "CustInfChgRsvClCC";
	/** 住所編集部品マップのキー */
	private static final String AD_EDIT_MAP = "AdEdit";
	/** お客様変更_内容変更CCマップのキー */
	private static final String CUST_NYO_CHG_CC_MAP = "CustInfChgNyoChgCC";
	/** お客様連絡先登録変更CCマップのキー */
	private static final String RRKS_ADD_UPD_CC_MAP = "RrksAddUpdCC";
	/** お客様変更_進捗登録CCマップのキー */
	private static final String PRG_ADD_CC_MAP = "CustInfChgPrgAddCC";
	/** お客様変更_指示書登録CCマップのキー */
	private static final String SJISHO_ADD_CC_MAP = "CustInfChgSjishoAddCC";
	/** お客様情報変更時工事案件反映CCマップのキー */
	private static final String UPD_KOJI_ANKEN_CC_MAP = "UpdKojiAnkenNameCC";
	// ANK-3458-00-00 ADD START
	/** 緊急通報用契約者名・カナ名更新CCマップのキー */
	private static final String EMG_RRK_SNM_UPD_CC_MAP = "EmgRrksNmUpdCC";
	// ANK-3458-00-00 ADD END

	/** コード名称(性別)：男性 */
	private static final String GENDER_NM_MAN = "男";
	/** コード名称(性別)：女性 */
	private static final String GENDER_NM_WOMAN = "女";
	/** コード名称(性別)：不明 */
	private static final String GENDER_NM_OTHER = "不明";

	/**
	 * 契約者情報を変更します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite chgKeisha(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 契約者情報変更(卸先事業者)CCマップ
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		// 作業用マップ
		Map<String, Object> work = new HashMap<String, Object>();

		try
		{
			// 運用日
			work.put(WORK_KEY_OPEDATE, JPCBPCommon.getOpeDate(null));
			// パラメータチェック
			if (!checkParameter(handle, param, fixedText, ccMsg, work))
			{
				return param;
			}

			//  お客様変更予約取消処理
			cancelCustChgRsv(handle, param, work);

			// 申込／申込明細／お客様登録処理
			addMskmCust(handle, param, ccMsg, work);

			// 連絡先登録
			addRrks(handle, param, ccMsg, work);

			// 進捗登録処理
			addPrg(handle, param, ccMsg, work);

			// 指示書登録処理
			addSjisho(handle, param, ccMsg, work);

			// 工事案件更新処理
			updateKojiak(handle, param, ccMsg, work);
			// ANK-3458-00-00 ADD START
			//緊急通報用契約者名・カナ名更新処理
			emgRrksNmUpd(handle, param, work);
			// ANK-3458-00-00 ADD END
			// レスポンス項目設定
			setResponse(ccMsg, JKKStrConst.CHECK_OK, null);
		}
		catch (Throwable throwable)
		{
			setResponse(ccMsg, JKKStrConst.RETURN_CD_9000, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw throwable;
		}

		return param;
	}

	/**
	 * パラメータチェックを行います。<br>
	 * ※後続処理に必要な情報の取得も行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @return チェックエラーの場合はfalse、チェックOKの場合はtrue
	 * @throws Throwable 例外が発生した場合
	 */
	private boolean checkParameter(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// リターンコード
		String returnCode = "";
		// リターンメッセージ
		String returnMessage = "";
		// サービス契約一意照会明細
		CAANMsg[] ekk0081a010MsgList = null;
		// お客様変更_お客様情報取得CCマップ
		Map<String, Object> cust = null;

		// 関連チェック(契約存在チェック)
		// サービス契約一意照会
		Object[][] ekk0081a010In =
		{
			{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010}
			// 機能コード
			, {EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿サービス契約番号
			, {EKK0081A010CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get(COMMON_KEY)}
			// ＫＥＹ＿予約適用年月日
			, {EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
		};
		// サービスIF実行
		ekk0081a010MsgList = callSC(handle, scCall, param, fixedText, ekk0081a010In)
				.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);

		// サービス契約が取得できない場合
		if (ekk0081a010MsgList == null || ekk0081a010MsgList.length == 0)
		{
			returnCode = JKKStrConst.RETURN_CD_1100;
			returnMessage = JKKStrConst.RETURN_MESSAGE_KEI_EXISTS_CHECK_ERROR;
		}

		// 関連チェック(卸先事業者チェック)
		if (JKKStringUtil.isNullBlank(returnCode))
		{
			boolean isError = true;
			// お客様情報取得
			cust = getCust(handle, param, fixedText, work, ekk0081a010MsgList[0]);
			// 入力パラメータ.依頼元区分とお客様変更_お客様情報取得CCマップ.卸先事業者コードが一致する場合
			String channel = (String)ccMsg.get(CHANNEL);
			if (!JKKStringUtil.isNullBlank(channel) && channel.equals((String)cust.get("orsjgs_cd")))
			{
				// 卸先事業者一意照会
				Object[][] ech0911a010In =
				{
					{ECH0911A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECH0911A010}
					// 機能コード
					, {ECH0911A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
					// ＫＥＹ＿卸先事業者コード
					, {ECH0911A010CBSMsg.KEY_ORSJGS_CD, (String)ccMsg.get(CHANNEL)}
				};
				// サービスIF実行
				CAANMsg[] ech0911a010msgList = callSC(handle, scCall, param, fixedText, ech0911a010In)
						.getCAANMsgList(ECH0911A010CBSMsg.ECH0911A010CBSMSG1LIST);

				if (ech0911a010msgList != null && ech0911a010msgList.length > 0)
				{
					String orsjgsTstaymd = ech0911a010msgList[0].getString(ECH0911A010CBSMsg1List.ORSJGS_TSTAYMD);
					String orsjgsTendymd = ech0911a010msgList[0].getString(ECH0911A010CBSMsg1List.ORSJGS_TENDYMD);
					// 卸先事業者適用開始年月日≦運用日≦卸先事業者適用終了年月日の場合
					if (orsjgsTstaymd.compareTo(opeDate) <= 0 && opeDate.compareTo(orsjgsTendymd) <= 0)
					{
						// チェックOK
						isError = false;
					}
				}
			}
			// チェックNGの場合
			if (isError)
			{
				returnCode = JKKStrConst.RETURN_CD_1101;
				returnMessage = JKKStrConst.RETURN_MESSAGE_ORSJIGS_CHECK_ERROR;
			}
		}

		// 関連チェック(契約状態チェック)
		if (JKKStringUtil.isNullBlank(returnCode))
		{
			// サービス契約ステータスが照査済、締結済、サービス提供中、休止・中断中、停止中のいずれでもない場合
			String svcKeiStat = ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.SVC_KEI_STAT);
			if (!Arrays.asList(JKKStrConst.CD00037_SHOSA_ZUMI, JKKStrConst.CD00037_CNC_ZM, JKKStrConst.CD00037_SVCTK_CHU,
					JKKStrConst.CD00037_STAT_PAUSE, JKKStrConst.CD00037_STAT_STP).contains(svcKeiStat))
			{
				returnCode = JKKStrConst.RETURN_CD_1102;
				returnMessage = JKKStrConst.RETURN_MESSAGE_KEI_STAT_CHECK_ERROR;
			}
		}

		// 関連チェック(ネット契約チェック)
		if (JKKStringUtil.isNullBlank(returnCode))
		{
			// 料金グループコードがｅｏ光ネット（ホームタイプ）でない場合
			if (!JKKStrConst.CD00133_02.equals(ekk0081a010MsgList[0].getString(EKK0081A010CBSMsg1List.PRC_GRP_CD)))
			{
				returnCode = JKKStrConst.RETURN_CD_1103;
				returnMessage = "ネット契約チェックエラー";
			}
		}

		// チェックエラーの場合
		if (!JKKStringUtil.isNullBlank(returnCode))
		{
			setResponse(ccMsg, returnCode, returnMessage);
			return false;
		}

		// サービス契約一意照会明細を作業用マップに設定
		work.put(WORK_KEY_EKK0081A010CBSMSGLIST, ekk0081a010MsgList);
		// お客様の最終更新年月日時分秒をワーク領域に設定
		param.getMappingWorkArea().put("upd_dtm_bf", (String)cust.get("last_upd_dtm"));

		return true;
	}

	/**
	 * お客様情報を取得します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param work 作業用マップ
	 * @param ekk0081a010Msg サービス契約一意照会明細(1レコード目)
	 * @return お客様情報
	 * @throws Throwable 例外が発生した場合
	 */
	private Map<String, Object> getCust(SessionHandle handle, IRequestParameterReadWrite param,  String fixedText,
			Map<String, Object> work, CAANMsg ekk0081a010Msg)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// お客様変更_お客様情報取得CCマップ
		Map<String, Object> cust = new HashMap<String, Object>();
		// 機能コード
		cust.put("func_code", JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿ＳＹＳＩＤ
		cust.put("key_sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// ＫＥＹ＿予約適用年月日
		cust.put("key_rsv_aply_ymd", opeDate);
		// ＫＥＹ＿連絡先コード
		cust.put("key_rrks_cd", JCKStrConst.CD00268_KEISHA);
		// 基準日
		cust.put("base_ymd", opeDate);
		// 権限制御フラグ
		cust.put("authority_ctl_flg", "1");
		// 異動区分遷移フラグ
		cust.put("ido_div_seni_flg", true);
		// 照査遷移フラグ
		cust.put("shosa_seni_flg", false);
		// 顧客契約引継リスト
		List<Map<String, Object>> custKeiHktgiList = new ArrayList<Map<String, Object>>();
		cust.put("cust_kei_hktgi_list", custKeiHktgiList);
		Map<String, Object> custKeiHktgi = new HashMap<String, Object>();
		custKeiHktgiList.add(custKeiHktgi);
		// サービス契約番号
		custKeiHktgi.put("svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
		// 異動区分
		custKeiHktgi.put("ido_div", JKKStrConst.CD00576_CUST_INFO_CHG);		// 「お客様情報変更」
		// 異動理由リスト
		List<Map<String, String>> idoRsnList = new ArrayList<Map<String, String>>();
		Map<String, String> idoRsn = new HashMap<String, String>();
		custKeiHktgi.put("ido_rsn_list", idoRsnList);
		idoRsnList.add(idoRsn);
		// 異動理由コード
		idoRsn.put("ido_rsn_cd", JKKStrConst.CD00846_OTHER);				// 「その他」
		param.setData(CUST_INF_CC_MAP, cust);

		// お客様変更_お客様情報取得CCを実行
		new JCKCustInfChgCustInfCC().getCustInf(handle, param, CUST_INF_CC_MAP);

		// お客様関連情報一意照会
		Object[][] eck0241a010In =
		{
			{ECK0241A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0241A010}
			// 機能コード
			, {ECK0241A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECK0241A010CBSMsg.KEY_SYSID, ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID)}
		};
		// サービスIF実行
		CAANMsg[] eck0241a010MsgList = callSC(handle, scCall, param, fixedText, eck0241a010In)
				.getCAANMsgList(ECK0241A010CBSMsg.ECK0241A010CBSMSG1LIST);

		if (eck0241a010MsgList != null && eck0241a010MsgList.length > 0)
		{
			//  契約内容通知書電子通知同意有無
			cust.put("knytcs_dnskh_doi_um", eck0241a010MsgList[0].getString(ECK0241A010CBSMsg1List.KNYTCS_DNSKH_DOI_UM));
		}

		return cust;
	}

	/**
	 * お客様、連絡先の変更予約を取り消します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void cancelCustChgRsv(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> work)
	throws Throwable
	{
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];

		// お客様変更_予約取消CCの入力パラメータ作成
		// お客様変更_履歴情報取得CCマップ
		Map<String, Object> rireki = new HashMap<String, Object>();
		// サービス契約番号
		rireki.put("key_svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
		// SYSID
		rireki.put("key_sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// 参照遷移フラグ
		rireki.put("reference_seni_flg", "1");
		param.setData(CUST_RIREKI_INF_CC_MAP, rireki);

		// お客様変更_履歴情報取得CCを実行
		new JCKCustInfChgRirekiInfCC().getCustRkInf(handle, param, CUST_RIREKI_INF_CC_MAP);

		// お客様変更_予約取消CCマップ
		Map<String, Object> custRsvCl = new HashMap<String, Object>();
		// 機能コード
		custRsvCl.put("func_code", JPCModelConstant.FUNC_CD_1);
		// ＳＹＳＩＤ
		custRsvCl.put("key_sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// 適用開始日
		custRsvCl.put("base_ymd", opeDate);
		// 更新年月日時分秒(更新前)
		custRsvCl.put("upd_dtm_bf", param.getMappingWorkArea().get("upd_dtm_bf"));
		// お客様情報履歴一覧
		List<Map<String, Object>> mmbRirekiList = new ArrayList<Map<String, Object>>();
		custRsvCl.put("mmb_rireki_list", mmbRirekiList);
		List<Map<String, Object>> eck0011b001MsgList = (List<Map<String, Object>>)rireki.get("ECK0011B001CBSMsg1List");
		if (eck0011b001MsgList != null)
		{
			for (Map<String, Object> eck0011b001Msg : eck0011b001MsgList)
			{
				// 履歴適用開始日
				String rsvAplyYmd = (String)eck0011b001Msg.get("rsv_aply_ymd");
				// 未来予約の場合
				if (JPCUtilCommon.isFutureDate(rsvAplyYmd, opeDate, "0"))
				{
					Map<String, Object> mmbRireki = new HashMap<String, Object>();
					// 履歴ＳＹＳＩＤ
					mmbRireki.put("mmb_rireki_sysid", (String)eck0011b001Msg.get("sysid"));
					// 履歴世代登録年月日時分秒
					mmbRireki.put("mmb_rireki_gene_add_dtm", (String)eck0011b001Msg.get("gene_add_dtm"));

					mmbRirekiList.add(mmbRireki);
				}
			}
		}

		param.setData(CUST_RSV_CL_CC_MAP, custRsvCl);

		// お客様変更_予約取消CCを実行
		new JCKCustInfChgRsvClCC().execRsvCl(handle, param, CUST_RSV_CL_CC_MAP);
	}

	/**
	 * 申込、申込明細、お客様に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void addMskmCust(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
		// お客様情報
		Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
		// 住所編集結果
		Map<String, Object> adEditRslt = null;

		// 入力パラメータ.郵便番号が設定されている場合
		if (!JKKStringUtil.isNullSpace((String)ccMsg.get(CONTRACTOR_ADDRESS_ZIPCODE)))
		{
			// 住所編集部品のパラメータ作成
			Map<String, Object> trgtData = new HashMap<String, Object>();
			// 編集モード
			trgtData.put(JKKAdEdit.EDIT_MODE, JKKAdEdit.EDIT_MODE_CHG);
			// 郵便番号
			trgtData.put(JKKAdEdit.PCD, (String)ccMsg.get(CONTRACTOR_ADDRESS_ZIPCODE));
			// 都道府県名
			trgtData.put(JKKAdEdit.STATE_NM, (String)ccMsg.get(CONTRACTOR_ADDRESS_1));
			// 市区町村名
			trgtData.put(JKKAdEdit.CITY_NM, (String)ccMsg.get(CONTRACTOR_ADDRESS_2));
			// 大字通称名
			trgtData.put(JKKAdEdit.OAZTSU_NM, (String)ccMsg.get(CONTRACTOR_ADDRESS_3));
			// 字丁目名
			trgtData.put(JKKAdEdit.AZCHO_NM, (String)ccMsg.get(CONTRACTOR_ADDRESS_4));
			// 番地号
			trgtData.put(JKKAdEdit.BNCHIGO, (String)ccMsg.get(CONTRACTOR_ADDRESS_5));
			// 建物名
			trgtData.put(JKKAdEdit.ADRTTM, (String)ccMsg.get(CONTRACTOR_ADDRESS_6));
			// 部屋番号
			trgtData.put(JKKAdEdit.ADRRM, (String)ccMsg.get(CONTRACTOR_ADDRESS_7));
			// 住所編集部品を実行
			adEditRslt = JKKBpCommon.editAd(handle, param, trgtData, AD_EDIT_MAP);
		}

		// お客様変更_内容変更CCマップ
		Map<String, Object> custChg = new HashMap<String, Object>();
		// 機能コード
		custChg.put("func_code", JPCModelConstant.FUNC_CD_1);
		// ＳＹＳＩＤ
		custChg.put("sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// 更新年月日時分秒（更新前）
		// ※ワーク領域に設定済み
		// 異動区分遷移フラグ
		custChg.put("ido_div_seni_flg", true);
		// 照査遷移フラグ
		custChg.put("shosa_seni_flg", false);
		// 会員種別変更フラグ
		custChg.put("member_sbt_chg_flg", false);
		// 契約者タイプ変更フラグ
		custChg.put("keisha_type_chg_flg", false);
		// 秘密の質問変更フラグ
		custChg.put("secret_question_chg_flg", false);
		// ISP決済利用変更フラグ
		custChg.put("isp_kssai_use_chg_flg", false);
		// 個人変更フラグ
		custChg.put("kojin_chg_flg", true);
		// 法人変更フラグ
		custChg.put("hojin_chg_flg", false);
		// 変更有無フラグ
		custChg.put("chg_um_flg", false);
		// 申込種別コード
		custChg.put("mskm_sbt_cd", JCKStrConst.MSKM_SBT_CUST_CHG);
		// 申込受付年月日時分秒
		custChg.put("mskm_uk_dtm", JPCBPCommon.getOpeDateTimeStamp(null));
		// 申込年月日
		custChg.put("mskm_ymd", opeDate);
		// コンシューマ営業用申込状態識別コード
		custChg.put("consmbsn_mskm_stat_skbt_cd", JKKStrConst.CD00760_04);	// 「承認済」
		// 異動区分
		custChg.put("ido_div", JKKStrConst.CD00576_CUST_INFO_CHG);			// 「お客様情報変更」
		// サービス契約番号
		custChg.put("svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
		// 会員種別コード
		custChg.put("member_sbt_cd", JKKStringUtil.nullToBlank((String)cust.get("member_sbt_cd")));
		// 変更前電子通知同意
		custChg.put("before_knytcs_etc_doi", JKKStringUtil.nullToBlank((String)cust.get("knytcs_dnskh_doi_um")));
		// 電子通知同意
		custChg.put("knytcs_etc_doi", JKKStringUtil.nullToBlank((String)cust.get("knytcs_dnskh_doi_um")));
		// お客様名
		custChg.put("cust_nm", getValue(ccMsg, NAME, (String)cust.get("cust_nm")));
		// お客様カナ名
		custChg.put("cust_kana", getValue(ccMsg, NAME_KANA, (String)cust.get("cust_kana")));
		// お客様性別コード
		custChg.put("cust_sex_cd", getValue(ccMsg, GENDER, (String)cust.get("cust_sex_cd")));
		// お客様生年月日
		custChg.put("cust_birthd", getValue(ccMsg, BIRTHDAY, (String)cust.get("cust_birthd")));
		// 氏名敬称
		custChg.put("nm_kisho", JKKStringUtil.nullToBlank((String)cust.get("nm_kisho")));
		// お客様確認備考
		custChg.put("cust_cfm_biko", JKKStringUtil.nullToBlank((String)cust.get("cust_cfm_biko")));
		// 契約者住所コード
		custChg.put("keisha_ad_cd", getAdCd(adEditRslt, (String)cust.get("keisha_ad_cd")));
		// 契約者郵便番号
		custChg.put("keisha_pcd", getValue(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
		// 契約者都道府県名
		custChg.put("keisha_state_nm", getValue(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm")));
		// 契約者市区町村名
		custChg.put("keisha_city_nm", getValue(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm")));
		// 契約者大字通称名
		custChg.put("keisha_oaztsu_nm", getValue(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm")));
		// 契約者字丁目名
		custChg.put("keisha_azcho_nm", getValue(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm")));
		// 契約者番地号
		custChg.put("keisha_bnchigo", getValue(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo")));
		// 契約者住所補記・建物名
		custChg.put("keisha_adrttm", getValue(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm")));
		// 契約者住所補記・部屋番号
		custChg.put("keisha_adrrm", getValue(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
		// 契約者電話番号
		custChg.put("keisha_telno", getValue(ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno")));
		// お客様指定送付先住所コード
		custChg.put("cssti_shs_ad_cd", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_ad_cd")));
		// お客様指定送付先郵便番号
		custChg.put("cssti_shs_pcd", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_pcd")));
		// お客様指定送付先都道府県名
		custChg.put("cssti_shs_state_nm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_state_nm")));
		// お客様指定送付先市区町村名
		custChg.put("cssti_shs_city_nm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_city_nm")));
		// お客様指定送付先大字通称名
		custChg.put("cssti_shs_oaztsu_nm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_oaztsu_nm")));
		// お客様指定送付先字丁目名
		custChg.put("cssti_shs_azcho_nm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_azcho_nm")));
		// お客様指定送付先番地号
		custChg.put("cssti_shs_bnchigo", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_bnchigo")));
		// お客様指定送付先住所補記・建物名
		custChg.put("cssti_shs_adrttm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_adrttm")));
		// お客様指定送付先住所補記・部屋番号
		custChg.put("cssti_shs_adrrm", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_adrrm")));
		// お客様指定送付先住所手動入力フラグ
		custChg.put("cssti_shs_ad_man_input_flg", JKKStringUtil.nullToBlank((String)cust.get("cssti_shs_ad_man_input_flg")));
		// お客様ランクコード
		custChg.put("cust_rank_cd", JKKStringUtil.nullToBlank((String)cust.get("cust_rank_cd")));
		// 連絡手段コード
		custChg.put("rrk_way_cd", JKKStringUtil.nullToBlank((String)cust.get("rrk_way_cd")));
		// 連絡手段補記
		custChg.put("rrk_way_hoki", JKKStringUtil.nullToBlank((String)cust.get("rrk_way_hoki")));
		// コンテンツお客様名
		custChg.put("cont_cust_nm", JKKStringUtil.nullToBlank((String)cust.get("cont_cust_nm")));
		// コンテンツお客様カナ名
		custChg.put("cont_cust_kana", JKKStringUtil.nullToBlank((String)cust.get("cont_cust_kana")));
		// コンテンツお客様性別コード
		custChg.put("cont_cust_sex_cd", JKKStringUtil.nullToBlank((String)cust.get("cont_cust_sex_cd")));
		// コンテンツお客様生年月日
		custChg.put("cont_cust_birthd", JKKStringUtil.nullToBlank((String)cust.get("cont_cust_birthd")));
		// コンテンツ住所コード
		custChg.put("cont_ad_cd", JKKStringUtil.nullToBlank((String)cust.get("cont_ad_cd")));
		// コンテンツ郵便番号
		custChg.put("cont_pcd", JKKStringUtil.nullToBlank((String)cust.get("cont_pcd")));
		// コンテンツ都道府県名
		custChg.put("cont_state_nm", JKKStringUtil.nullToBlank((String)cust.get("cont_state_nm")));
		// コンテンツ市区町村名
		custChg.put("cont_city_nm", JKKStringUtil.nullToBlank((String)cust.get("cont_city_nm")));
		// コンテンツ大字通称名
		custChg.put("cont_oaztsu_nm", JKKStringUtil.nullToBlank((String)cust.get("cont_oaztsu_nm")));
		// コンテンツ字丁目名
		custChg.put("cont_azcho_nm", JKKStringUtil.nullToBlank((String)cust.get("cont_azcho_nm")));
		// コンテンツ番地号
		custChg.put("cont_bnchigo", JKKStringUtil.nullToBlank((String)cust.get("cont_bnchigo")));
		// コンテンツ住所補記・建物名
		custChg.put("cont_adrttm", JKKStringUtil.nullToBlank((String)cust.get("cont_adrttm")));
		// コンテンツ住所補記・部屋番号
		custChg.put("cont_adrrm", JKKStringUtil.nullToBlank((String)cust.get("cont_adrrm")));
		// コンテンツ住所分割開始位置
		custChg.put("cont_ad_bnkt_sta_pst", JKKStringUtil.nullToBlank((String)cust.get("cont_ad_bnkt_sta_pst")));
		// 予約適用年月日
		custChg.put("rsv_aply_ymd", JKKStringUtil.nullToBlank((String)cust.get("rsv_aply_ymd")));
		// 内販外販コード
		custChg.put("naihan_gaihan_cd", JKKStringUtil.nullToBlank((String)cust.get("naihan_gaihan_cd")));
		// 内販企業識別コード
		custChg.put("naihan_comp_skbt_cd", JKKStringUtil.nullToBlank((String)cust.get("naihan_comp_skbt_cd")));
		// 要補助コード
		custChg.put("necessary_hojo_cd", JKKStringUtil.nullToBlank((String)cust.get("necessary_hojo_cd")));
		// ｅｏｎｅｔＩＤ未移行フラグ
		custChg.put("eonetid_mi_iko_flg", JKKStringUtil.nullToBlank((String)cust.get("eonetid_mi_iko_flg")));
		// ログイン認証可否
		custChg.put("login_ninsho_kh", JKKStringUtil.nullToBlank((String)cust.get("login_ninsho_kh")));
		// 購入可否フラグコード
		custChg.put("konyu_kahi_flg_cd", JKKStringUtil.nullToBlank((String)cust.get("konyu_kahi_flg_cd")));
		// お客様特記事項コード
		custChg.put("cust_tkjk_cd", JKKStringUtil.nullToBlank((String)cust.get("cust_tkjk_cd")));
		// ログイン認証停止年月日
		custChg.put("login_ninsho_stp_ymd", JKKStringUtil.nullToBlank((String)cust.get("login_ninsho_stp_ymd")));
		// 会員種別特定フラグ
		custChg.put("mmb_sbt_tokut_flg", JKKStringUtil.nullToBlank((String)cust.get("mmb_sbt_tokut_flg")));
		// 旧ｅｏｎｅｔ会員認証用ＩＤ
		custChg.put("old_eonetmb_ninsho_id", JKKStringUtil.nullToBlank((String)cust.get("old_eonetmb_ninsho_id")));
		// 会員ＩＳＰ決済状態コード
		custChg.put("mmb_isp_kssai_stat_cd", JKKStringUtil.nullToBlank((String)cust.get("mmb_isp_kssai_stat_cd")));
		// 削除対象外フラグ
		custChg.put("del_trgt_gai_flg", JKKStringUtil.nullToBlank((String)cust.get("del_trgt_gai_flg")));
		// 職業コード
		custChg.put("shokugyo_cd", JKKStringUtil.nullToBlank((String)cust.get("shokugyo_cd")));
		// 職業その他
		custChg.put("shokugyo_other", JKKStringUtil.nullToBlank((String)cust.get("shokugyo_other")));
		// 勤務先名
		custChg.put("offc_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_nm")));
		// 学校名
		custChg.put("school_nm", JKKStringUtil.nullToBlank((String)cust.get("school_nm")));
		// 勤務先業種コード
		custChg.put("offc_gshu_cd", JKKStringUtil.nullToBlank((String)cust.get("offc_gshu_cd")));
		// 勤務先部署名
		custChg.put("offc_busho_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_busho_nm")));
		// 勤務先住所コード
		custChg.put("offc_ad_cd", JKKStringUtil.nullToBlank((String)cust.get("offc_ad_cd")));
		// 勤務先郵便番号
		custChg.put("offc_pcd", JKKStringUtil.nullToBlank((String)cust.get("offc_pcd")));
		// 勤務先都道府県名
		custChg.put("offc_state_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_state_nm")));
		// 勤務先市区町村名
		custChg.put("offc_city_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_city_nm")));
		// 勤務先大字通称名
		custChg.put("offc_oaztsu_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_oaztsu_nm")));
		// 勤務先字丁目名
		custChg.put("offc_azcho_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_azcho_nm")));
		// 勤務先番地号
		custChg.put("offc_bnchigo", JKKStringUtil.nullToBlank((String)cust.get("offc_bnchigo")));
		// 勤務先住所補記・建物名
		custChg.put("offc_adrttm", JKKStringUtil.nullToBlank((String)cust.get("offc_adrttm")));
		// 勤務先住所補記・部屋番号
		custChg.put("offc_adrrm", JKKStringUtil.nullToBlank((String)cust.get("offc_adrrm")));
		// 勤務先電話番号
		custChg.put("offc_telno", JKKStringUtil.nullToBlank((String)cust.get("offc_telno")));
		// 勤務先内線番号
		custChg.put("offc_nisnno", JKKStringUtil.nullToBlank((String)cust.get("offc_nisnno")));
		// 勤務先従業員数（規模）
		custChg.put("offc_worker_cnt_scale", JKKStringUtil.nullToBlank((String)cust.get("offc_worker_cnt_scale")));
		// お客様年収
		custChg.put("cust_salary", JKKStringUtil.nullToBlank((String)cust.get("cust_salary")));
		// 親権者名
		custChg.put("sksha_nm", JKKStringUtil.nullToBlank((String)cust.get("sksha_nm")));
		// 親権者カナ名
		custChg.put("sksha_kana", JKKStringUtil.nullToBlank((String)cust.get("sksha_kana")));
		// 親権者生年月日
		custChg.put("sksha_birthd", JKKStringUtil.nullToBlank((String)cust.get("sksha_birthd")));
		// 親権者続柄コード
		custChg.put("sksha_zokugara_cd", JKKStringUtil.nullToBlank((String)cust.get("sksha_zokugara_cd")));
		// 続柄その他
		custChg.put("zokugara_other", JKKStringUtil.nullToBlank((String)cust.get("zokugara_other")));
		// 親権者住所コード
		custChg.put("sksha_ad_cd", JKKStringUtil.nullToBlank((String)cust.get("sksha_ad_cd")));
		// 親権者郵便番号
		custChg.put("sksha_pcd", JKKStringUtil.nullToBlank((String)cust.get("sksha_pcd")));
		// 親権者都道府県名
		custChg.put("sksha_state_nm", JKKStringUtil.nullToBlank((String)cust.get("sksha_state_nm")));
		// 親権者市区町村名
		custChg.put("sksha_city_nm", JKKStringUtil.nullToBlank((String)cust.get("sksha_city_nm")));
		// 親権者大字通称名
		custChg.put("sksha_oaztsu_nm", JKKStringUtil.nullToBlank((String)cust.get("sksha_oaztsu_nm")));
		// 親権者字丁目名
		custChg.put("sksha_azcho_nm", JKKStringUtil.nullToBlank((String)cust.get("sksha_azcho_nm")));
		// 親権者住所番地号
		custChg.put("sksha_ad_bnchigo", JKKStringUtil.nullToBlank((String)cust.get("sksha_ad_bnchigo")));
		// 親権者住所補記・建物名
		custChg.put("sksha_adrttm", JKKStringUtil.nullToBlank((String)cust.get("sksha_adrttm")));
		// 親権者住所補記・部屋番号
		custChg.put("sksha_adrrm", JKKStringUtil.nullToBlank((String)cust.get("sksha_adrrm")));
		// 親権者電話番号
		custChg.put("sksha_telno", JKKStringUtil.nullToBlank((String)cust.get("sksha_telno")));
		// 契約者住所手動入力フラグ
		custChg.put("keisha_ad_man_input_flg", getValue(adEditRslt, JKKAdEdit.MAN_INPUT_FLG, (String)cust.get("keisha_ad_man_input_flg")));
		// 親権者住所手動入力フラグ
		custChg.put("sksha_ad_man_input_flg", JKKStringUtil.nullToBlank((String)cust.get("sksha_ad_man_input_flg")));
		// 関電G個人情報取扱同意有無
		custChg.put("kepg_kjnif_trat_doi_um", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnif_trat_doi_um")));
		// 関電G個人情報取扱同意年月日
		custChg.put("kepg_kjnif_trat_doi_ymd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnif_trat_doi_ymd")));
		// 関電G個人情報提供不可フラグ
		custChg.put("kepg_kjnift_ffg", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_ffg")));
		// 関電G個人情報提供不可フラグ変更年月日
		custChg.put("kepg_kjnift_ffg_chg_ymd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_ffg_chg_ymd")));
		// 関電G個人情報提供不可フラグ変更受付方法コード
		custChg.put("kepg_kjnift_ffg_chg_uwy_cd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_ffg_chg_uwy_cd")));
		// 関電G個人情報提供状況コード
		custChg.put("kepg_kjnift_jokyo_cd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_jokyo_cd")));
		// 関電G個人情報提供開始年月日
		custChg.put("kepg_kjnift_staymd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_staymd")));
		// 関電G個人情報提供連携状態コード
		custChg.put("kepg_kjnift_rscd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_rscd")));
		// 関電G個人情報提供連携状態コード変更年月日
		custChg.put("kepg_kjnift_rscd_chg_ymd", JKKStringUtil.nullToBlank((String)cust.get("kepg_kjnift_rscd_chg_ymd")));

		param.setData(CUST_NYO_CHG_CC_MAP, custChg);

		// お客様変更_内容変更CCを実行
		new JCKCustInfChgNyoChgCC().updateCustInf(handle, param, CUST_NYO_CHG_CC_MAP);
		// 住所編集結果を作業用マップに設定
		work.put(WORK_KEY_AD_EDIT_RSLT, adEditRslt);
	}

	/**
	 * 連絡先に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void addRrks(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// 入力パラメータ.優先連絡先電話番号が設定されている場合
		if (ccMsg.containsKey(PRIORITY_PHONE_NUM))
		{
			// 運用日
			String opeDate = (String)work.get(WORK_KEY_OPEDATE);
			// サービス契約一意照会明細
			CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
			// お客様情報
			Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
			// お客様連絡先登録変更CCマップ
			Map<String, Object> rrksAddUpd = new HashMap<String, Object>();
			// 機能コード
			rrksAddUpd.put("func_code", JPCModelConstant.FUNC_CD_1);
			// ＳＹＳＩＤ
			rrksAddUpd.put("sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
			// 予約適用年月日
			rrksAddUpd.put("rsv_aply_ymd", opeDate);
			// 更新年月日時分秒（更新前）
			// ※ワーク領域に設定済み
			// メールアドレス処理フラグ
			rrksAddUpd.put("mlad_div_flg", JKKStrConst.CD_DIV_UM_NASHI);
			// PHS/携帯電話処理フラグ
			rrksAddUpd.put("ktai_telno_div_flg", getKtaiTelnoDivFlg((String)cust.get("rrks_ktai_telno_rrks_no")));
			// 勤務先電話番号処理フラグ
			rrksAddUpd.put("offc_telno_div_flg", JKKStrConst.CD_DIV_UM_NASHI);		// 「処理なし」
			// 内線番号処理フラグ
			rrksAddUpd.put("nisnno_div_flg", JKKStrConst.CD_DIV_UM_NASHI);			// 「処理なし」
			// メール連絡先番号
			rrksAddUpd.put("gen_mlad_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("gen_mlad_rrks_no")));
			// 携帯連絡先番号
			rrksAddUpd.put("rrks_ktai_telno_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("rrks_ktai_telno_rrks_no")));
			// 勤務先連絡先番号
			rrksAddUpd.put("offc_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("offc_rrks_no")));
			// 内線連絡先番号
			rrksAddUpd.put("offc_nisnno_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("offc_nisnno_rrks_no")));
			// メールアドレス
			rrksAddUpd.put("gen_mlad", JKKStringUtil.nullToBlank((String)cust.get("gen_mlad")));
			// 携帯電話
			rrksAddUpd.put("rrks_ktai_telno", JKKStringUtil.nullToBlank((String)ccMsg.get(PRIORITY_PHONE_NUM)));
			// 勤務先電話番号
			rrksAddUpd.put("offc_telno", JKKStringUtil.nullToBlank((String)cust.get("offc_telno")));
			// 内線番号
			rrksAddUpd.put("offc_nisnno", JKKStringUtil.nullToBlank((String)cust.get("offc_nisnno")));
			// 変更手続中メールアドレス連絡先番号
			rrksAddUpd.put("chgechu_mlad_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("chgechu_mlad_rrks_no")));
			// 変更手続中メールアドレス
			rrksAddUpd.put("chgechu_mlad", JKKStringUtil.nullToBlank((String)cust.get("chgechu_mlad")));
			// コンテンツ電話番号処理フラグ
			rrksAddUpd.put("cont_telno_div_flg", JKKStrConst.CD_DIV_UM_NASHI);		// 「処理なし」
			// コンテンツメールアドレス処理フラグ
			rrksAddUpd.put("cont_mlad_div_flg", JKKStrConst.CD_DIV_UM_NASHI);		// 「処理なし」
			// お客様ステータス
			rrksAddUpd.put("cust_stat", JKKStringUtil.nullToBlank((String)cust.get("cust_stat")));

			param.setData(RRKS_ADD_UPD_CC_MAP, rrksAddUpd);

			// お客様連絡先登録変更CCを実行
			new JCKRrksAddUpdCC().execUseStart(handle, param, RRKS_ADD_UPD_CC_MAP);
		}
	}

	/**
	 * 進捗に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void addPrg(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
		// お客様情報
		Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
		// 住所編集結果
		Map<String, Object> adEditRslt = (Map<String, Object>)work.get(WORK_KEY_AD_EDIT_RSLT);
		// お客様変更_進捗登録CC実行マップ
		Map<String, Object> prgAdd = new HashMap<String, Object>();

		// 進捗特記事項を取得
		Map<String, String> prgTkjk = getPrgTkjk(ccMsg, cust, adEditRslt);
		// 機能コード
		prgAdd.put("func_code", JPCModelConstant.FUNC_CD_1);
		// 進捗登録実行判定フラグ
		prgAdd.put("prgExecFlg", true);
		// 異動区分遷移フラグ
		prgAdd.put("ido_div_seni_flg", true);
		// 照査遷移フラグ
		prgAdd.put("shosa_seni_flg", false);
		// サービス契約番号
		prgAdd.put("svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
		// 異動区分
		prgAdd.put("ido_div", JKKStrConst.CD00576_CUST_INFO_CHG);			// 「お客様情報変更」
		// 異動年月日時分秒
		prgAdd.put("ido_dtm", JPCBPCommon.getSysDateTimeStamp());
		// 進捗特記事項1
		prgAdd.put("prg_tkjk_1", prgTkjk.get("prg_tkjk_1"));
		// 進捗特記事項2
		prgAdd.put("prg_tkjk_2", prgTkjk.get("prg_tkjk_2"));
		// 親権者進捗特記事項1
		// ※設定しない
		// 親権者進捗特記事項2
		// ※設定しない
		// 利用場所住所で上書きチェックフラグ
		prgAdd.put("uepcad_copy_chk_flg", false);
		// 異動理由リスト
		List<Map<String, String>> idoRsnList = new ArrayList<Map<String, String>>();
		prgAdd.put("EKK1091D010CBSMsg1List", idoRsnList);
		Map<String, String> idoRsn = new HashMap<String, String>();
		idoRsnList.add(idoRsn);
		// 異動理由コード
		idoRsn.put("ido_rsn_cd", JKKStrConst.CD00846_OTHER);				// 「その他」
		// 異動理由メモ
		// ※設定しない

		param.setData(PRG_ADD_CC_MAP, prgAdd);
		// フェムトセル異動情報登録CCマップをダミーで設定(お客様変更_進捗登録CCでエラーが発生するため)
		param.setData("CKSV000933CC", new HashMap<String, Object>());

		// お客様変更_進捗登録CCを実行
		new JCKCustInfChgPrgAddCC().addPrg(handle, param, PRG_ADD_CC_MAP);
	}

	/**
	 * 指示書に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void addSjisho(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
		// お客様情報
		Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
		// お客様変更_指示書登録CC実行マップ
		Map<String, Object> sjishoAdd = new HashMap<String, Object>();
		// 機能コード
		sjishoAdd.put("func_code", JPCModelConstant.FUNC_CD_1);
		// 処理コード
		sjishoAdd.put("trn_cd", "A01");
		// 処理対象SYSID
		sjishoAdd.put("tran_trgt_sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// 変更前ｅｏＩＤ
		sjishoAdd.put("before_eoid", JKKStringUtil.nullToBlank((String)cust.get("eoid")));
		// ｅｏＩＤ
		sjishoAdd.put("eoid", JKKStringUtil.nullToBlank((String)cust.get("eoid")));
		// 変更前ニックネーム
		sjishoAdd.put("before_nkname", JKKStringUtil.nullToBlank((String)cust.get("nkname")));
		// ニックネーム
		sjishoAdd.put("nkname", JKKStringUtil.nullToBlank((String)cust.get("nkname")));
		// 変更前会員種別
		sjishoAdd.put("before_member_sbt_cd", JKKStringUtil.nullToBlank((String)cust.get("member_sbt_cd")));
		// 会員種別
		sjishoAdd.put("member_sbt_cd", JKKStringUtil.nullToBlank((String)cust.get("member_sbt_cd")));
		// 変更前メールアドレス
		sjishoAdd.put("before_mlad", JKKStringUtil.nullToBlank((String)cust.get("gen_mlad")));
		// メールアドレス
		sjishoAdd.put("mlad", JKKStringUtil.nullToBlank((String)cust.get("gen_mlad")));
		// 変更前年齢
		sjishoAdd.put("before_age", JKKStringUtil.nullToBlank((String)cust.get("cust_birthd")));
		// 年齢
		sjishoAdd.put("age", getValue(ccMsg, BIRTHDAY, (String)cust.get("cust_birthd")));
		// 変更前性別
		sjishoAdd.put("before_sex_cd", JKKStringUtil.nullToBlank((String)cust.get("cust_sex_cd")));
		// 性別
		sjishoAdd.put("sex_cd", getValue(ccMsg, GENDER, (String)cust.get("cust_sex_cd")));
		// お客様ステータス
		sjishoAdd.put("cust_stat", JKKStringUtil.nullToBlank((String)cust.get("cust_stat")));
		// 変更前ISP決済利用
		sjishoAdd.put("before_isp_kssai_use", JKKStringUtil.nullToBlank((String)cust.get("cont_isp_use_fail_flg")));
		// ISP決済利用
		sjishoAdd.put("isp_kssai_use", JKKStringUtil.nullToBlank((String)cust.get("cont_isp_use_fail_flg")));
		// 変更前契約者タイプ
		sjishoAdd.put("before_keisha_type_cd", JKKStringUtil.nullToBlank((String)cust.get("keisha_type_cd")));
		// 契約者タイプ
		sjishoAdd.put("keisha_type_cd", JKKStringUtil.nullToBlank((String)cust.get("keisha_type_cd")));
		// 基準日
		sjishoAdd.put("stdardymd", opeDate);
		// 変更前ログイン認証可否
		sjishoAdd.put("before_login_ninsho", JKKStringUtil.nullToBlank((String)cust.get("login_ninsho_kh")));
		// ログイン認証可否
		sjishoAdd.put("login_ninsho", JKKStringUtil.nullToBlank((String)cust.get("login_ninsho_kh")));
		// 予約適用年月日
		sjishoAdd.put("rsv_aply_ymd", opeDate);

		// IT1-2020-0000002 ADD START
		// 変更前契約者電話番号
		sjishoAdd.put("before_gen_telno", JKKStringUtil.nullToBlank((String)cust.get("keisha_telno")));
		// ANK-3814-00-00 DEL START
		// 契約者電話番号
		//String afKeishaTelno = "";
		//if (ccMsg != null && ccMsg.containsKey(CONTRACTOR_PHONE_NUM))
		//{
		//	afKeishaTelno = JKKStringUtil.nullToBlank((String)ccMsg.get(CONTRACTOR_PHONE_NUM));
		//}
		// ANK-3814-00-00 DEL END

		// ANK-3814-00-00 ADD START
		// 連携電話番号（契約者電話番号、コンテンツ電話番号等）
		// eoIDセキュリティ強化連携電話番号取得
		String wkTelno = getValue(ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno")); //最新の契約者電話番号
		String memberSbtCd = JKKStringUtil.nullToBlank((String)cust.get("member_sbt_cd"));
		String afKeishaTelno = getSecurityRenkeiTelno(handle, param, ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID), memberSbtCd, wkTelno);
		// ANK-3814-00-00 ADD END

		sjishoAdd.put("gen_telno", JKKStringUtil.nullToBlank(afKeishaTelno));
		// 変更前ログイン認証レベル
		sjishoAdd.put("before_authentication_level", "");
		// ログイン認証レベル
		sjishoAdd.put("authentication_level", "");
		// 変更前ワンタイムキー送付先優先区分
		sjishoAdd.put("before_onetimekey_destination", "");
		// ワンタイムキー送付先優先区分
		sjishoAdd.put("onetimekey_destination", "");
		// IT1-2020-0000002 ADD END
		
		// ユーザーＩＤ
		// ※使用されていない
		// ユーザー名
		// ※使用されていない

		param.setData(SJISHO_ADD_CC_MAP, sjishoAdd);
		// ワークマップを設定
		Map<String, Object> workMsg = new HashMap<String, Object>();
		param.setData("CKSV0009WORK01", workMsg);
		// 予約フラグ
		workMsg.put("rsv_flg", false);
		// 指示書登録判定フラグ
		workMsg.put("add_sjisho_flg", true);

		// お客様変更_指示書登録CCを実行
		new JCKCustInfChgSjishoAddCC().addSjisho(handle, param, SJISHO_ADD_CC_MAP);
	}

	/**
	 * 工事案件を更新します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void updateKojiak(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg, Map<String, Object> work)
	throws Throwable
	{
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
		// お客様情報
		Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
		// 住所編集結果
		Map<String, Object> adEditRslt = (Map<String, Object>)work.get(WORK_KEY_AD_EDIT_RSLT);

		// お客様情報変更時工事案件反映CC実行可否判定
		if (isChanged(ccMsg, NAME, (String)cust.get("cust_nm"))
			|| isChanged(ccMsg, NAME_KANA, (String)cust.get("cust_kana"))
			|| isChangedAdCd(adEditRslt, (String)cust.get("keisha_ad_cd"))
			|| isChanged(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd"))
			|| isChangedAdInf(adEditRslt, cust)
			|| isChanged(ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno"))
			|| isChanged(ccMsg, PRIORITY_PHONE_NUM, (String)cust.get("rrks_ktai_telno")))
		{
			// お客様情報変更時工事案件反映CCマップ
			Map<String, Object> updKojiAnken = new HashMap<String, Object>();
			// 機能コード
			updKojiAnken.put("func_code", JPCModelConstant.FUNC_CD_1);
			// SYSID
			updKojiAnken.put("sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
			// ＫＥＹ＿サービス契約番号
			updKojiAnken.put("key_svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));
			// ＫＥＹ＿システム日付
			updKojiAnken.put("key_system_dtm", JPCBPCommon.getSysDateTimeStamp());
			// ＫＥＹ＿運用日付
			updKojiAnken.put("key_opedate", opeDate);
			// お客様名
			updKojiAnken.put("cust_nm", getValue(ccMsg, NAME, (String)cust.get("cust_nm")));
			// お客様名変更フラグ
			updKojiAnken.put("cust_nm_chg_flg", isChanged(ccMsg, NAME, (String)cust.get("cust_nm")));
			// お客様カナ名
			updKojiAnken.put("cust_kana", getValue(ccMsg, NAME_KANA, (String)cust.get("cust_kana")));
			// お客様カナ名変更フラグ
			updKojiAnken.put("cust_kana_chg_flg", isChanged(ccMsg, NAME_KANA, (String)cust.get("cust_kana")));
			// お客様携帯電話番号
			updKojiAnken.put("cust_ktai_tel_no", getValue(ccMsg, PRIORITY_PHONE_NUM, (String)cust.get("rrks_ktai_telno")));
			// お客様携帯電話番号変更フラグ
			updKojiAnken.put("cust_ktai_tel_no_chg_flg", isChanged(ccMsg, PRIORITY_PHONE_NUM, (String)cust.get("rrks_ktai_telno")));
			// お客様連絡先電話番号
			updKojiAnken.put("cust_rrks_tel_no", JKKStringUtil.nullToBlank((String)cust.get("offc_telno")));
			// お客様連絡先電話番号変更フラグ
			updKojiAnken.put("cust_rrks_tel_no_chg_flg", false);
			// 連絡先勤務先名
			updKojiAnken.put("rrks_offc_nm", JKKStringUtil.nullToBlank((String)cust.get("offc_nm")));
			// 連絡先勤務先名変更フラグ
			updKojiAnken.put("rrks_offc_nm_chg_flg", false);
			// 契約者住所コード
			updKojiAnken.put("keisha_ad_cd", getAdCd(adEditRslt, (String)cust.get("keisha_ad_cd")));
			// 契約者住所コード変更フラグ
			updKojiAnken.put("keisha_ad_cd_chg_flg", isChanged(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
			// 契約者郵便番号
			updKojiAnken.put("keisha_pcd", getValue(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
			// 契約者郵便番号変更フラグ
			updKojiAnken.put("keisha_pcd_chg_flg", isChanged(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
			// 契約者都道府県名
			updKojiAnken.put("keisha_state_nm", getValue(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm")));
			// 契約者都道府県名変更フラグ
			updKojiAnken.put("keisha_state_nm_chg_flg", isChanged(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm")));
			// 契約者市区町村名
			updKojiAnken.put("keisha_city_nm", getValue(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm")));
			// 契約者市区町村名変更フラグ
			updKojiAnken.put("keisha_city_nm_chg_flg", isChanged(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm")));
			// 契約者大字通称名
			updKojiAnken.put("keisha_oaztsu_nm", getValue(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm")));
			// 契約者大字通称名変更フラグ
			updKojiAnken.put("keisha_oaztsu_nm_chg_flg", isChanged(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm")));
			// 契約者字丁目名
			updKojiAnken.put("keisha_azcho_nm", getValue(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm")));
			// 契約者字丁目名変更フラグ
			updKojiAnken.put("keisha_azcho_nm_chg_flg", isChanged(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm")));
			// 契約者住所番地号
			updKojiAnken.put("keisha_ad_bnchigo", getValue(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo")));
			// 契約者住所番地号変更フラグ
			updKojiAnken.put("keisha_ad_bnchigo_chg_flg", isChanged(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo")));
			// 契約者住所補記・建物名
			updKojiAnken.put("keisha_adrttm", getValue(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm")));
			// 契約者住所補記・建物名変更フラグ
			updKojiAnken.put("keisha_adrttm_chg_flg", isChanged(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm")));
			// 契約者住所補記・部屋番号
			updKojiAnken.put("keisha_adrrm", getValue(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
			// 契約者住所補記・部屋番号変更フラグ
			updKojiAnken.put("keisha_adrrm_chg_flg", isChanged(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
			// 現住所_電話番号
			updKojiAnken.put("gen_tel_no", getValue(ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno")));
			// 現住所_電話番号変更フラグ
			updKojiAnken.put("gen_tel_no_chg_flg", isChanged(ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno")));

			param.setData(UPD_KOJI_ANKEN_CC_MAP, updKojiAnken);

			// お客様情報変更時工事案件反映CCを実行
			new JCKUpdKojiAnkenNameCC().updKojiAnkenName(handle, param, UPD_KOJI_ANKEN_CC_MAP);
		}
	}
	// ANK-3458-00-00 ADD START
	/**
	 * 緊急通報用契約者名・カナ名更新処理
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void emgRrksNmUpd(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> work)
	throws Throwable
	{
		Map workMap = param.getMappingWorkArea();

		// お客様変更_予約取消CCマップ
		Map<String, Object> emgRrksNmUpdMap = new HashMap<String, Object>();
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
		// ＳＹＳＩＤ
		emgRrksNmUpdMap.put("sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// 異動区分
		emgRrksNmUpdMap.put("ido_div", JKKStrConst.CD00576_CUST_INFO_CHG);// 「お客様情報変更」
		// 申込明細番号
		emgRrksNmUpdMap.put("mskm_dtl_no", (String)workMap.get("mskm_dtl_no"));

		param.setData(EMG_RRK_SNM_UPD_CC_MAP, emgRrksNmUpdMap);

		// お客様変更_予約取消CCを実行
		new JKKEmgRrksNmUpdCC().execute(handle, param, EMG_RRK_SNM_UPD_CC_MAP);
	}
	// ANK-3458-00-00 ADD END

	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(Map<String, Object> ccMsg, String returnCode, String returnMessage)
	{
		// リターンコード
		ccMsg.put(RETURN_CODE, returnCode);
		// リターンメッセージ
		ccMsg.put(RETURN_MESSAGE, returnMessage);
	}

	/**
	 * 指定された項目の値を取得します。
	 * <br>
	 * @param map 指定された項目を持つマップ
	 * @param key マップのキー
	 * @param defaultVal デフォルト値
	 * @return 指定された項目の値。設定されていない場合はデフォルト値
	 */
	private String getValue(Map<String, Object> map, String key, String defaultVal)
	{
		if (map != null && map.containsKey(key))
		{
			return JKKStringUtil.nullToBlank((String)map.get(key));
		}

		return JKKStringUtil.nullToBlank(defaultVal);
	}

	/**
	 * 変更後の値となる住所コードを取得します。<br>
	 * 住所編集結果に住所コードが設定されていない(空文字含む)場合は変更前の住所コードを返します。
	 * <br>
	 * @param adEditRslt 住所編集結果
	 * @param adCdBf 変更前の住所コード
	 * @return 変更後の値となる住所コード
	 */
	private String getAdCd(Map<String, Object> adEditRslt, String adCdBf)
	{
		if (adEditRslt != null)
		{
			String adCd = (String)adEditRslt.get("ad_cd");
			if (!JKKStringUtil.isNullBlank(adCd))
			{
				return adCd;
			}
		}

		return adCdBf;
	}

	/**
	 * PHS/携帯電話処理フラグを取得します。
	 * @param rrksKtaiTelnoRrksNo 携帯連絡先番号
	 * @return PHS/携帯電話処理フラグ
	 */
	private String getKtaiTelnoDivFlg(String rrksKtaiTelnoRrksNo)
	{
		if (!JKKStringUtil.isNullBlank(rrksKtaiTelnoRrksNo))
		{
			return "2";	// 更新
		}

		return "1";	// 登録
	}

	/**
	 * 進捗特記事項1、進捗特記事項2を取得します。
	 * <br>
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param cust お客様情報
	 * @param adEditRslt 住所編集結果
	 * @return 進捗特記事項1、進捗特記事項2を設定したMap
	 * @see CKSV0009_CKSV0009OPDBMapper#setPrgTkjk
	 */
	private Map<String, String> getPrgTkjk(Map<String, Object> ccMsg, Map<String, Object> cust, Map<String, Object> adEditRslt)
	{
		StringBuilder tmpPrgTkjk1 = new StringBuilder();
		StringBuilder tmpPrgTkjk2 = new StringBuilder();

		tmpPrgTkjk1.append(editPrgTkjk("契約者名（カナ）", ccMsg, NAME_KANA, (String)cust.get("cust_kana")))
				.append(editPrgTkjk("契約者名", ccMsg, NAME, (String)cust.get("cust_nm")))
				.append(editPrgTkjk("生年月日", ccMsg, BIRTHDAY, (String)cust.get("cust_birthd")))
				.append(editPrgTkjkGender("性別", ccMsg, GENDER, (String)cust.get("cust_sex_cd")))
				.append(editPrgTkjkAdInf(ccMsg, cust, adEditRslt))
				.append(editPrgTkjk("電話番号", ccMsg, CONTRACTOR_PHONE_NUM, (String)cust.get("keisha_telno")))
				.append(editPrgTkjk("携帯電話", ccMsg, PRIORITY_PHONE_NUM, (String)cust.get("rrks_ktai_telno")))
				;

		// 末尾の空白を削除
		if (tmpPrgTkjk1.length() > 0 && tmpPrgTkjk1.substring(tmpPrgTkjk1.length() - 1, tmpPrgTkjk1.length()).equals(" "))
		{
			tmpPrgTkjk1 = tmpPrgTkjk1.deleteCharAt(tmpPrgTkjk1.length() - 1);
		}

		String prgTkjk1 = "";
		String prgTkjk2 = "利用場所住所で上書き：しない";
		if (tmpPrgTkjk1.length() > 256)
		{
			prgTkjk1 = tmpPrgTkjk1.substring(0, 128);
			tmpPrgTkjk2.append(tmpPrgTkjk1.substring(128, 256));
		}
		else if (tmpPrgTkjk1.length() > 128)
		{
			prgTkjk1 = tmpPrgTkjk1.substring(0, 128);
			tmpPrgTkjk2.append(tmpPrgTkjk1.substring(128));
		}
		else
		{
			prgTkjk1 = tmpPrgTkjk1.toString();
		}

		if (tmpPrgTkjk2.length() > 0)
		{
			if (tmpPrgTkjk2.length() + "　".length() + prgTkjk2.length() <= 128)
			{
				prgTkjk2 = tmpPrgTkjk2 + "　" + prgTkjk2;
			}
			else
			{
				prgTkjk2 = tmpPrgTkjk2.toString();
			}
		}

		Map<String, String> prgTkjk = new HashMap<String, String>();
		prgTkjk.put("prg_tkjk_1", prgTkjk1);
		prgTkjk.put("prg_tkjk_2", prgTkjk2);

		return prgTkjk;
	}

	/**
	 * 進捗特記事項を編集します。
	 * <br>
	 * @param itemNm 変更項目名
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param paramNm 変更対象の値が設定されているパラメータ名 
	 * @param bfVal 変更前の値
	 * @return 進捗特記事項
	 */
	private String editPrgTkjk(String itemNm, Map<String, Object> ccMsg, String paramNm, String bfVal)
	{
		// 変更がある場合
		if (isChanged(ccMsg, paramNm, bfVal))
		{
			return itemNm + ":(修正前)" + JKKStringUtil.nullToBlank(bfVal)
					+ "(修正後)" + JKKStringUtil.nullToBlank((String)ccMsg.get(paramNm)) + " ";
		}

		return "";
	}

	/**
	 * 性別変更時の進捗特記事項を編集します。
	 * <br>
	 * @param itemNm 変更項目名
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param paramNm 変更対象の値が設定されているパラメータ名 
	 * @param bfVal 変更前の値
	 * @return 進捗特記事項
	 */
	private String editPrgTkjkGender(String itemNm, Map<String, Object> ccMsg, String paramNm, String bfVal)
	{
		// 変更がある場合
		if (isChanged(ccMsg, paramNm, bfVal))
		{
			String bfNm = getGenderNm(bfVal);
			String afNm = getGenderNm((String)ccMsg.get(paramNm));
			return itemNm + ":(修正前)" + bfNm + "(修正後)" + afNm + " ";
		}

		return "";
	}

	/**
	 * 性別のコード値に対応する名称を返します。
	 * <br>
	 * @param cd コード値
	 * @return 名称
	 */
	private String getGenderNm(String cd)
	{
		if (JCKStrConst.CD00245_SEX_CD_MAN.equals(cd))
		{
			return GENDER_NM_MAN;
		}
		else if (JCKStrConst.CD00245_SEX_CD_WOMAN.equals(cd))
		{
			return GENDER_NM_WOMAN;
		}
		else if (JCKStrConst.CD00245_SEX_CD_OTHER.equals(cd))
		{
			return GENDER_NM_OTHER;
		}

		return "";
	}

	/**
	 * 進捗特記事項の住所情報を編集します。
	 * <br>
	 * @param ccMsg 契約者情報変更(卸先事業者)CCマップ
	 * @param cust お客様情報
	 * @param adEditRslt 住所編集結果
	 * @return 進捗特記事項
	 */
	private String editPrgTkjkAdInf(Map<String, Object> ccMsg, Map<String, Object> cust, Map<String, Object> adEditRslt)
	{
		StringBuilder prgTkjk = new StringBuilder();

		if (adEditRslt != null)
		{
			// 郵便番号の変更がある場合
			if (isChanged(ccMsg, CONTRACTOR_ADDRESS_ZIPCODE, (String)cust.get("keisha_pcd")))
			{
				prgTkjk.append("郵便番号:(修正前)").append(JKKStringUtil.nullToBlank((String)cust.get("keisha_pcd")))
						.append("(修正後)").append(JKKStringUtil.nullToBlank((String)ccMsg.get(CONTRACTOR_ADDRESS_ZIPCODE))).append(" ");
			}

			// 住所コードの変更がある場合
			if (isChangedAdCd(adEditRslt, (String)cust.get("keisha_ad_cd")))
			{
				prgTkjk.append("住所コード:(修正前)").append(JKKStringUtil.nullToBlank((String)cust.get("keisha_ad_cd")))
						.append("(修正後)").append((String)adEditRslt.get(JKKAdEdit.AD_CD)).append(" ");
			}

			// 都道府県名〜部屋番号の変更がある場合
			if (isChangedAdInf(adEditRslt, cust))
			{
				// 変更後の契約者住所_都道府県名〜契約者住所_部屋番号
				String adInf = (String)adEditRslt.get(JKKAdEdit.STATE_NM) + (String)adEditRslt.get(JKKAdEdit.CITY_NM)
						+ (String)adEditRslt.get(JKKAdEdit.OAZTSU_NM) + (String)adEditRslt.get(JKKAdEdit.AZCHO_NM)
						+ (String)adEditRslt.get(JKKAdEdit.BNCHIGO) + (String)adEditRslt.get(JKKAdEdit.ADRTTM)
						+ (String)adEditRslt.get(JKKAdEdit.ADRRM);

				// 変更前の契約者住所_都道府県名〜契約者住所_部屋番号
				String adInfBf = JKKStringUtil.nullToBlank((String)cust.get("keisha_state_nm"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_city_nm"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_oaztsu_nm"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_azcho_nm"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_bnchigo"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_adrttm"))
						+ JKKStringUtil.nullToBlank((String)cust.get("keisha_adrrm"));

				prgTkjk.append("住所情報変更:(修正前)").append(adInfBf).append("(修正後)").append(adInf).append(" ");
			}
		}

		return prgTkjk.toString();
	}

	/**
	 * 変更があるかどうかを返します。
	 * <br>
	 * @param map 対象項目を持つマップ
	 * @param key マップのキー
	 * @param bfVal 変更前の値
	 * @return 対象項目に変更がある場合はtrue、変更がない場合はfalse
	 */
	private boolean isChanged(Map<String, Object> map, String key, String bfVal)
	{
		// 変更がある場合
		if (map != null && map.containsKey(key)
				&& !JKKStringUtil.nullToBlank((String)map.get(key)).equals(JKKStringUtil.nullToBlank(bfVal)))
		{
			return true;
		}

		return false;
	}

	/**
	 * 住所コードに変更があるかどうかを返します。<br>
	 * 住所コードが設定されていない場合は変更なしと判定します。
	 * <br>
	 * @param adEditRslt 住所編集結果
	 * @param adCdBf 変更前の住所コード
	 * @return 住所コードに変更がある場合はtrue、変更がない場合はfalse
	 */
	private boolean isChangedAdCd(Map<String, Object> adEditRslt, String adCdBf)
	{
		if (adEditRslt != null)
		{
			String adCd = (String)adEditRslt.get(JKKAdEdit.AD_CD);
			return !JKKStringUtil.isNullBlank(adCd) && !adCd.equals(adCdBf);
		}

		return false;
	}

	/**
	 * 都道府県名〜部屋番号に変更があるかどうかを返します。<br>
	 * <br>
	 * @param adEditRslt 住所編集結果
	 * @param cust お客様情報
	 * @return 都道府県名〜部屋番号に変更がある場合はtrue、変更がない場合はfalse
	 */
	private boolean isChangedAdInf(Map<String, Object> adEditRslt, Map<String, Object> cust)
	{
		return (isChanged(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm"))
			|| isChanged(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm"))
			|| isChanged(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm"))
			|| isChanged(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm"))
			|| isChanged(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo"))
			|| isChanged(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm"))
			|| isChanged(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
	}

	/**
	 * SC(サービスインターフェイス）を呼び出します。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param dataMapKey パラメータキー
	 * @param mappingData マッピングデータ
	 * @return サービスインターフェイス実行結果
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							Object[][] mappingData) throws Throwable
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);

		Map<?, ?> result = scCall.run(paramMap, handle);

		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);

		CAANMsg msg = templates[0];

		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);

		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);

		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);

		if (null == errList)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}

		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 (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}

		CAANMsg[] templates = new CAANMsg[1];

		templates[0] = template;

		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * エラー情報を取得します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != returnCode)
		{
			templateStatus = 9000;
		}

		if (null == JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, templateStatus)))
		{
			templateStatus = 0;
		}

		int bpStatus = 0;

		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (null == obj)
		{
			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);
		}

		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(dataMapKey);

		HashMap map = template.getHashMap();
		Iterator it = map.keySet().iterator();
		while (it.hasNext())
		{
			String key = (String)it.next();
			Object value = map.get(key);
			if (value instanceof HashMap[])
			{
				HashMap[] childMapList = (HashMap[])value;
				for (HashMap childMap : childMapList)
				{
					Iterator childIt = childMap.keySet().iterator();
					while (childIt.hasNext())
					{
						String childKey = (String)childIt.next();
						if (childKey.endsWith(ERRITEM_SUFFIX))
						{
							int keyIdx = childKey.lastIndexOf(ERRITEM_SUFFIX);
							if (inMap.containsKey(childKey.substring(0, keyIdx)))
							{
								inMap.put(childKey, childMap.get(childKey));
							}
						}
					}
				}
			}
			else
			{
				if (key.endsWith(ERRITEM_SUFFIX))
				{
					int keyIdx = key.lastIndexOf(ERRITEM_SUFFIX);
					if (inMap.containsKey(key.substring(0, keyIdx)))
					{
						inMap.put(key, map.get(key));
					}
				}
			}
		}

		return param;
	}
}
