/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKKeishaChgCmpCC
*	ソースファイル名：JCKKeishaChgCmpCC.java
*	作成者			：FJ)中原
*	日付			：2018年11月27日
*＜機能概要＞
*	お客様住所情報更新受付(CMP)の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v39.00.00   2018/11/27   FJ)中原     【ANK-3477-00-00】eoマイページからのお客さま情報変更自動反映
*   v40.00.00   2019/01/15   FJ)中原     【ANK-3477-01-00】マイページのコンテンツ住所更新対応
*   v41.00.00   2019/04/16   FJ)岡井     【ANK-3612-00-00】eoマイページからのお客さま情報自動更新機能改善
*   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.callECK0151D010Map;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.isSuccess;
import static eo.common.constant.JCKStrConst.ADMIN_SJISHO_PARAM1_UPD_PART;
import static eo.common.constant.JCKStrConst.SJISHO_TRN_CD_ADMIN_API;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9001_CKSV9001OP_CKSV900101CC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCCSuperComExecUtil;
import com.fujitsu.futurity.common.JCCSyslogFormat;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.model.common.check.MixCharCheck;

import eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.common.util.JZMCommonUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0151D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0241A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0241A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B042CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B012CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491B008CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;


/**
 * お客様住所情報更新受付(CMP)の共通コンポーネントクラスです。
 * <br>
 * @author FJ
 */
public class JCKKeishaChgCmpCC extends AbstractCommonComponent
{
	/** CCパラメータ：SYSID */
	public static final String SYSID = "sysid";
	/** CCパラメータ：契約者住所_郵便番号 */
	public static final String PCD = "pcd";
	/** CCパラメータ：契約者住所_住所（都道府県/市区町村/大字通称） */
	public static final String ADDRESS_1 = "address1";
	/** CCパラメータ：契約者住所_丁目・番地号 */
	public static final String ADDRESS_2 = "address2";
	/** CCパラメータ：契約者住所_建物名 */
	public static final String ADDRESS_3 = "address3";
	/** CCパラメータ：契約者住所_部屋番号 */
	public static final String ADDRESS_4 = "address4";
	/** CCパラメータ：契約者電話番号 */
	public static final String PHONE_NUM = "telno";
	/** CCパラメータ：請求書送付先住所更新有無 */
	public static final String SKSSHSADUPDFLAG = "sksshsadupdflag";
	/** CCパラメータ：エラーコード */
	public static final String ERROR_CODE = "errCode";
	/** CCパラメータ：エラーメッセージ */
	public static final String ERROR_MESSAGE = "errMessage";
	// ANK-3477-01-00 ADD START
	/** 部品パラメータ：都道府県名 */
	public static final String STATE_NM = "state_nm";
	/** 部品パラメータ：市区町村名 */
	public static final String CITY_NM = "city_nm";
	/** 部品パラメータ：大字通称名 */
	public static final String OAZTSU_NM = "oaztsu_nm";
	/** 部品パラメータ：字丁目名 */
	public static final String AZCHO_NM = "azcho_nm";
	/** 部品パラメータ：番地号 */
	public static final String BNCHIGO = "bnchigo";
	/** 部品パラメータ：建物名 */
	public static final String ADRTTM = "adrttm";
	/** 部品パラメータ：部屋番号 */
	public static final String ADRRM = "adrrm";
	// ANK-3477-01-00 ADD END

	/** テンプレート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_ECK0011A010 = "ECK0011A010";
 	/** テンプレートID：サービス契約一覧照会（SYSID）2 */
	private static final String TEMPLATE_ID_EKK0081B004 = "EKK0081B004";
 	/** テンプレートID：請求契約番号一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0321B012 = "EKK0321B012";
 	/** テンプレートID：サービス契約番号(代表)一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0081B042 = "EKK0081B042";
 	/** テンプレートID：異動予約一覧照会 */
	private static final String TEMPLATE_ID_EKK1681B001 = "EKK1681B001";
	// ANK-3477-00-00_MOD START
	/** テンプレートID：請求書送付先住所一覧照会 */
//	private static final String TEMPLATE_ID_EKK0491B004 = "EKK0491B004";
	/** テンプレートID：請求契約一覧照会(CMP) */
	private static final String TEMPLATE_ID_EKK0491B008 = "EKK0491B008";
	// ANK-3477-00-00_MOD END
	/** テンプレートID：請求契約一意照会 */
	private static final String TEMPLATE_ID_EKK0491A010 = "EKK0491A010";

	/** リターンメッセージ取得キー */
	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_NYO_CHG_CC_MAP = "CustInfChgNyoChgCC";
	// ANK-3477-01-00 ADD START
	/** お客様連絡先登録変更CCマップのキー */
	private static final String RRKS_ADD_UPD_CC_MAP = "RrksAddUpdCC";
	// ANK-3477-01-00 ADD END
	/** お客様変更_進捗登録CCマップのキー */
	private static final String PRG_ADD_CC_MAP = "CustInfChgPrgAddCC";
	/** お客様情報変更時工事案件反映CCマップのキー */
	private static final String UPD_KOJI_ANKEN_CC_MAP = "UpdKojiAnkenNameCC";
	/** 住所情報変更コンポーネント部品CCマップのキー */
	private static final String AD_INF_CHG_CC_MAP = "JKKAdInfChgCC";
	// ANK-3477-01-00 ADD START
	/** 番地号の最大文字数 */
	private static final int MAX_LEN_BNCHIGO = 61;
	/** 建物名の最大文字数 */
	private static final int MAX_LEN_ADRTTM = 45;

	/** 住所登録時エラーメッセージ */
	private static final String MESLOG_ADDRESS = "設定された住所が最大桁数を超えています。住所を再登録してください。";
	// ANK-3477-01-00 ADD END


	/**
	 * 契約者情報を変更します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite chgKeisha(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// お客様住所情報更新受付(CMP)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 (!checkUnitParam(handle, param, fixedText, ccMsg, work))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 関連チェック
			if (!checkParameter(handle, param, fixedText, ccMsg, work))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				return param;
			}

			// 申込／申込明細／お客様登録処理
			addMskmCust(handle, param, ccMsg, work);

			// ANK-3477-01-00 ADD START
			// 連絡先登録
			addRrks(handle, param, ccMsg, work);
			// ANK-3477-01-00 ADD END

			// 進捗登録処理
			addPrg(handle, param, ccMsg, work);

			// 工事案件更新処理
			updateKojiak(handle, param, ccMsg, work);

			// 請求書送付先住所情報変更
			if ( "1".equals((String)ccMsg.get(SKSSHSADUPDFLAG)) )
			{
				updateSeikySofuskJyuSyo(handle, param, fixedText, ccMsg, work);
			}

			// ANK-3814-00-00 ADD START
			// 指示書登録、AxM会員情報更新依頼（IDA連携）
			addSjishoRenkei(handle, param, ccMsg);
			// ANK-3814-00-00 ADD END

			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		catch (Throwable throwable)
		{
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_9000, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw throwable;
		}

		return param;
	}

	/**
	 * 単項目チェック
	 * @param param
	 * @param ccMsg
	 * @param ekk0081b043Msg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			Map<String, Object> ccMsg, Map<String, Object> work)
	throws Exception
	{
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		String itemName = null;
		String itemValue = null;

		// SYSID
		itemName = "sysid";
		itemValue = (String)ccMsg.get("sysid");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// 郵便番号
		itemName = "pcd";
		itemValue = (String)ccMsg.get("pcd");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 7))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// 住所（都道府県/市区町村/大字通称）
		itemName = "address1";
		itemValue = (String)ccMsg.get("address1");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!MixCharCheck.isNameAddressCheck(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 1, 46))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// 丁目・番地号
		itemName = "address2";
		itemValue = (String)ccMsg.get("address2");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!MixCharCheck.isNameAddressCheck(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 1, 73))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// 建物名
		itemName = "address3";
		itemValue = (String)ccMsg.get("address3");
		// 入力チェック
		if ( !(itemValue == null || "".equals(itemValue)) )
		{
			if (!MixCharCheck.isNameAddressCheck(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName));
			}
			else if (!LengthCheck.isLength2Check(itemValue, 1, 45))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName));
			}
		}

		// 部屋番号
		itemName = "address4";
		itemValue = (String)ccMsg.get("address4");
		// 入力チェック
		if ( !(itemValue == null || "".equals(itemValue)) )
		{
			if (!MixCharCheck.isNameAddressCheck(itemValue))
			{
				// 属性チェックエラー
				errList.add(getFormErrInfMap(itemName));
			}
			else if (!LengthCheck.isLength2Check(itemValue, 1, 15))
			{
				// 桁数チェックエラー
				errList.add(getLenErrInfMap(itemName));
			}
		}

		// 電話番号
		itemName = "telno";
		itemValue = (String)ccMsg.get("telno");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isTelno2Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength2Check(itemValue, 10, 11))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}
		
		// 請求書送付先住所更新有無
		itemName = "sksshsadupdflag";
		itemValue = (String)ccMsg.get("sksshsadupdflag");
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(itemName));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(itemName));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(itemName));
		}

		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put("ERROR_INFO", errList);
			return false;
		}
		
		return true;

	}

	/**
	 * 関連チェックを行います。<br>
	 * ※後続処理に必要な情報の取得も行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg お客様住所情報更新受付(CMP)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);
		// お客様一意照会明細
		CAANMsg[] eck0011a010MsgList = null;
		// サービス契約一覧照会（SYSID）2明細
		CAANMsg[] ekk0081b004MsgList = null;
		// 異動予約一覧照会明細
		CAANMsg[] ekk1681b001MsgList = null;
		// 異動予約一覧照会明細2
		CAANMsg[] ekk1681b001MsgList2 = null;
		// 請求契約番号一覧照会(CMP)明細
		CAANMsg[] ekk0321b012MsgList = null;
		// サービス契約番号(代表)一覧照会(CMP)
		CAANMsg[] ekk0081b042MsgList = null;
		// サービス契約一意照会
		CAANMsg[] ekk0081a010MsgList = null;
		// お客様変更_お客様情報取得CCマップ
		Map<String, Object> cust = null;

		// 関連チェック(SYSID存在チェック、会員種別コードチェック)
		// お客様一意照会
		Object[][] eck0011a010In =
		{
			{ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
			// 機能コード
			, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {ECK0011A010CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
			// ＫＥＹ＿予約適用年月日
			, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
		};
		// サービスIF実行
		eck0011a010MsgList = callSC(handle, scCall, param, fixedText, eck0011a010In)
				.getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);

		// SYSIDが取得できない場合
		if (eck0011a010MsgList == null || eck0011a010MsgList.length == 0)
		{
			// SYSID存在チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2001, JKKStrConst.RETURN_MESSAGE_SYSID_EXISTT_CHECK_ERROR);
			return false;
		}
		else {
			// 会員種別コードのチェック
			String memberSbtCd = eck0011a010MsgList[0].getString(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
			// ファミリー会員（個人）:11、ファミリー会員（法人）:21、オープン会員：30の場合
			if ( memberSbtCd != null && (JKKStrConst.CD00039_11.equals(memberSbtCd) ||  JKKStrConst.CD00039_21.equals(memberSbtCd) ||  JKKStrConst.CD00039_30.equals(memberSbtCd) ) )
			{
				// 会員種別コードチェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2002, JKKStrConst.RETURN_MESSAGE_MEMBER_SBT_CD_CHECK_ERROR);
				return false;
			}
		}

		// 関連チェック(サービス開始前mineo契約チェック)
		// サービス契約一覧照会（SYSID）2
		//*****************************************************************
		// サービス契約一覧照会(SYSID)2への上りマッピング
		// （表示件数、表示ページ番号、最大検索件数は
		//   ページング処理機能を必要としないためエラーとならない値を設定）
		//*****************************************************************
		Object[][] ekk0081b004In =
		{
			{EKK0081B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B004}
			// 表示件数
			, {EKK0081B004CBSMsg.DISPLAY_NUM, "2000"}
			// 表示ページ数
			, {EKK0081B004CBSMsg.DISPLAY_PAGE_NUM, "1"}
			// 最大取得件数
			, {EKK0081B004CBSMsg.MAX_SEARCH_NUM, "2000"}
			// 機能コード
			, {EKK0081B004CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK0081B004CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
			// ＫＥＹ＿料金グループコード（mineo）
			, {EKK0081B004CBSMsg.KEY_PRC_GRP_CD, JKKStrConst.CD00133_51}
		};
		// サービスIF実行
		ekk0081b004MsgList = callSC(handle, scCall, param, fixedText, ekk0081b004In)
				.getCAANMsgList(EKK0081B004CBSMsg.EKK0081B004CBSMSG1LIST);

		// mineoのレコードが取得出来た場合
		if(ekk0081b004MsgList != null && ekk0081b004MsgList.length > 0)
		{
			for(int i = 0; i < ekk0081b004MsgList.length; i++)
			{
				// サービス契約ステータスのチェック
				String svcKeiStat = ekk0081b004MsgList[i].getString(EKK0081B004CBSMsg1List.SVC_KEI_STAT);
				// 受付済：010、照査済：020、締結済：030の場合
				if ( JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat) ||  JKKStrConst.CD00037_SHOSA_ZUMI.equals(svcKeiStat) ||  JKKStrConst.CD00037_CNC_ZM.equals(svcKeiStat) )
				{
					// サービス開始前mineo契約チェックエラー
					setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2003, JKKStrConst.RETURN_MESSAGE_PRE_SVC_START_MINEO_CHECK_ERROR);
					return false;
				}
			}
		}

		// 関連チェック(お客様情報異動予約存在チェック)
		// 異動予約一覧照会
		Object[][] ekk1681b001In =
		{
			{EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001}
			// 機能コード
			, {EKK1681B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK1681B001CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
			// ＫＥＹ＿異動予約状態コード(未反映:00,予約手続中:03,異動予約対象外:04)
			, {EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, JKKStrConst.CD01168_IDO_RSV_STAT_CD_00 + "," + JKKStrConst.CD01168_IDO_RSV_STAT_CD_03 + "," + JKKStrConst.CD01168_IDO_RSV_STAT_CD_04}
		};
		// サービスIF実行
		ekk1681b001MsgList = callSC(handle, scCall, param, fixedText, ekk1681b001In)
				.getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);

		// 異動予約一覧照会のレコードが取得出来た場合
		if(ekk1681b001MsgList != null && ekk1681b001MsgList.length > 0)
		{
			for(int j = 0; j < ekk1681b001MsgList.length; j++)
			{
				// 異動区分の取得
				String idoDiv = ekk1681b001MsgList[j].getString(EKK1681B001CBSMsg1List.IDO_DIV);
				// 予約適用年月日の取得
				String rsvAplyYmd = ekk1681b001MsgList[j].getString(EKK1681B001CBSMsg1List.RSV_APLY_YMD);
				// 異動予約状態コードの取得
				String idoRsvStatCd = ekk1681b001MsgList[j].getString(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD);
				// お客様情報変更の場合
				if ( JKKStrConst.CD00576_CUST_INFO_CHG.equals(idoDiv) && opeDate.compareTo(rsvAplyYmd) <= 0 && JKKStrConst.CD01168_IDO_RSV_STAT_CD_04.equals(idoRsvStatCd) )
				{
					// お客様情報異動予約存在チェックエラー
					setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2004, JKKStrConst.RETURN_MESSAGE_CUST_IDO_RSV_CHECK_ERROR);
					return false;
				}
				// お客様分割,お客様併合の場合
				if ( (JKKStrConst.CD00576_CUST_HEIGO.equals(idoDiv) || JKKStrConst.CD00576_CUST_BNKT.equals(idoDiv)) && (JKKStrConst.CD01168_IDO_RSV_STAT_CD_00.equals(idoRsvStatCd) || JKKStrConst.CD01168_IDO_RSV_STAT_CD_03.equals(idoRsvStatCd)) )
				{
					// お客様情報異動予約存在チェックエラー
					setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2004, JKKStrConst.RETURN_MESSAGE_CUST_IDO_RSV_CHECK_ERROR);
					return false;
				}
			}
		}

		// 関連チェック(契約状態チェック)
		// 請求契約番号一覧照会(CMP)
		Boolean chkFlg = false;
		Object[][] ekk0321b012In =
		{
			{EKK0321B012CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0321B012}
			// 機能コード
			, {EKK0321B012CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK0321B012CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
		};
		// サービスIF実行
		ekk0321b012MsgList = callSC(handle, scCall, param, fixedText, ekk0321b012In)
				.getCAANMsgList(EKK0321B012CBSMsg.EKK0321B012CBSMSG1LIST);

		// 請求契約のレコードが取得出来た場合
		if(ekk0321b012MsgList != null && ekk0321b012MsgList.length > 0)
		{
			for(int m = 0; m < ekk0321b012MsgList.length; m++)
			{
				String seikyKeiNo = ekk0321b012MsgList[m].getString(EKK0321B012CBSMsg1List.SEIKY_KEI_NO);
				// サービス契約番号(代表)一覧照会(CMP)
				Object[][] ekk0081b042In =
				{
					{EKK0081B042CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B042}
					// 機能コード
					, {EKK0081B042CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
					// ＫＥＹ＿請求契約番号
					, {EKK0081B042CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
				};
				// サービスIF実行
				ekk0081b042MsgList = callSC(handle, scCall, param, fixedText, ekk0081b042In)
						.getCAANMsgList(EKK0081B042CBSMsg.EKK0081B042CBSMSG1LIST);
				if(ekk0081b042MsgList != null && ekk0081b042MsgList.length > 0)
				{
					//ワーク領域設定用サービス契約番号
					String svcKeiNo = ekk0081b042MsgList[0].getString(EKK0081B042CBSMsg1List.SVC_KEI_NO);
					// サービス契約一意照会
					Object[][] ekk0081a010In =
					{
						{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010}
						// 機能コード
						, {EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
						// ＫＥＹ＿サービス契約番号
						, {EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
						// ＫＥＹ＿予約適用年月日
						, {EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
					};
					// サービスIF実行
					ekk0081a010MsgList = callSC(handle, scCall, param, fixedText, ekk0081a010In)
							.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);

					// サービス契約が取得できた場合
					if (ekk0081a010MsgList != null && ekk0081a010MsgList.length > 0)
					{
						chkFlg = true;
						break;
					}
				}
			}
			// すべての契約状態が対象外の場合
			if ( chkFlg == false )
			{
				// 契約状態チェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2006, JKKStrConst.RETURN_MESSAGE_KEI_STAT_CHECK_ERROR);
				return false;
			}
		}

		// 関連チェック(請求契約情報異動予約存在チェック)
		// 請求書送付先住所更新有無が"1"(更新する)の場合のみ実施
		if ( "1".equals((String)ccMsg.get(SKSSHSADUPDFLAG) ))
		{
			// 請求契約番号一覧照会(CMP)のレコードが取得出来た場合
			if(ekk0321b012MsgList != null && ekk0321b012MsgList.length > 0)
			{
				for(int k = 0; k < ekk0321b012MsgList.length; k++)
				{
					// 異動予約一覧照会
					String seikyKeiNo = ekk0321b012MsgList[k].getString(EKK0321B012CBSMsg1List.SEIKY_KEI_NO);
					Object[][] ekk1681b001In2 =
						{
						{EKK1681B001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1681B001}
						// 機能コード
						, {EKK1681B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
						// ＫＥＹ＿請求契約番号
						, {EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
						// ＫＥＹ＿異動予約状態コード(未反映:00,予約手続中:03,異動予約対象外:04)
						, {EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, JKKStrConst.CD01168_IDO_RSV_STAT_CD_00 + "," + JKKStrConst.CD01168_IDO_RSV_STAT_CD_03 + "," + JKKStrConst.CD01168_IDO_RSV_STAT_CD_04}
					};
					// サービスIF実行
					ekk1681b001MsgList2 = callSC(handle, scCall, param, fixedText, ekk1681b001In2)
							.getCAANMsgList(EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST);

					// 異動予約一覧照会のレコードが取得出来た場合
					if(ekk1681b001MsgList2 != null && ekk1681b001MsgList2.length > 0)
					{
						for(int l = 0; l < ekk1681b001MsgList2.length; l++)
						{
							// 異動区分の取得
							String idoDiv = ekk1681b001MsgList2[l].getString(EKK1681B001CBSMsg1List.IDO_DIV);
							// 予約適用年月日の取得
							String rsvAplyYmd = ekk1681b001MsgList2[l].getString(EKK1681B001CBSMsg1List.RSV_APLY_YMD);
							// 異動予約状態コードの取得
							String idoRsvStatCd = ekk1681b001MsgList2[l].getString(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD);
							// 請求契約情報変更の場合
							if ( JKKStrConst.CD00576_SEIKY_INFO_CHG.equals(idoDiv) && opeDate.compareTo(rsvAplyYmd) <= 0 && JKKStrConst.CD01168_IDO_RSV_STAT_CD_04.equals(idoRsvStatCd) )
							{
								// 請求契約情報異動予約存在チェックエラー
								setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2005, JKKStrConst.RETURN_MESSAGE_SEIKY_IDO_RSV_CHECK_ERROR);
								return false;
							}
							// 請求契約情報分割,請求契約情報併合の場合
							if ( (JKKStrConst.CD00576_SEIKY_HEIGO.equals(idoDiv) || JKKStrConst.CD00576_SEIKY_BNKT.equals(idoDiv)) && (JKKStrConst.CD01168_IDO_RSV_STAT_CD_00.equals(idoRsvStatCd) || JKKStrConst.CD01168_IDO_RSV_STAT_CD_03.equals(idoRsvStatCd)) )
							{
								// 請求契約情報異動予約存在チェックエラー
								setResponse(param,  ccMsg, JKKStrConst.RETURN_CD_2005, JKKStrConst.RETURN_MESSAGE_SEIKY_IDO_RSV_CHECK_ERROR);
								return false;
							}
						}
					}
				}
			}
		}


		// サービス契約一意照会明細を作業用マップに設定
		work.put(WORK_KEY_EKK0081A010CBSMSGLIST, ekk0081a010MsgList);

		// お客様情報取得
		cust = getCust(handle, param, fixedText, work, (String)ccMsg.get(SYSID));

		// お客様の最終更新年月日時分秒をワーク領域に設定
		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, String sysId)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 運用日
		String opeDate = (String)work.get(WORK_KEY_OPEDATE);
		// サービス契約一意照会明細
		CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];

		// お客様変更_お客様情報取得CCマップ
		Map<String, Object> cust = new HashMap<String, Object>();
		// 機能コード
		cust.put("func_code", JPCModelConstant.FUNC_CD_2);
		// ＫＥＹ＿ＳＹＳＩＤ
		cust.put("key_sysid", 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, 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 ccMsg お客様住所情報更新受付(CMP)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;
		// ANK-3477-01-00 ADD START
		// コンテンツ住所編集結果
		Map<String, Object> contAdEditRslt = null;
		// ANK-3477-01-00 ADD END

		// サービスIDを取得
		String serviceId = param.getUsecaseID();

		// 入力パラメータ.郵便番号が設定されている場合
		if (!JKKStringUtil.isNullSpace((String)ccMsg.get(PCD)))
		{
			// 住所編集部品のパラメータ作成
			Map<String, Object> trgtData = new HashMap<String, Object>();
			// 編集モード
			trgtData.put(JKKAdEdit.EDIT_MODE, JKKAdEdit.EDIT_MODE_CHG);
			// 郵便番号
			trgtData.put(JKKAdEdit.PCD, (String)ccMsg.get(PCD));
			// 住所（都道府県/市区町村/大字通称）+ 丁目・番地号 → 番地号
			// 入力パラメータが結合しているため、番地号にまとめて設定する
			trgtData.put(JKKAdEdit.BNCHIGO, (String)ccMsg.get(ADDRESS_1) +  (String)ccMsg.get(ADDRESS_2));
			// 建物名
			trgtData.put(JKKAdEdit.ADRTTM, (String)ccMsg.get(ADDRESS_3));
			// 部屋番号
			trgtData.put(JKKAdEdit.ADRRM, (String)ccMsg.get(ADDRESS_4));
			// 住所編集部品を実行(呼び出し元サービスIDが追加の場合、住所編集部品も修正すること)
			adEditRslt = JKKBpCommon.editAd(handle, param, trgtData, serviceId + "01CC");
		}

		// お客様変更_内容変更CCマップ
		Map<String, Object> custChg = new HashMap<String, Object>();
		// 機能コード
		custChg.put("func_code", JPCModelConstant.FUNC_CD_1);
		// ＳＹＳＩＤ
		custChg.put("sysid", (String)ccMsg.get(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", JKKStringUtil.nullToBlank((String)cust.get("cust_nm")));
		// お客様カナ名
		custChg.put("cust_kana", JKKStringUtil.nullToBlank((String)cust.get("cust_kana")));
		// お客様性別コード
		custChg.put("cust_sex_cd", JKKStringUtil.nullToBlank((String)cust.get("cust_sex_cd")));
		// お客様生年月日
		custChg.put("cust_birthd", JKKStringUtil.nullToBlank((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, 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")));
		// ANK-3477-01-00 MOD START
		//// コンテンツ住所コード
		//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")));
		// コンテンツ表示有無により契約者住所をコンテンツ住所に設定する
		if ( (Boolean)cust.get("cont_disp_um") )
		{
			// コンテンツ住所編集部品
			contAdEditRslt = separateContAd(param, adEditRslt, (String)ccMsg.get(SYSID));

			// コンテンツ番地号には都道府県名〜番地号を結合
			String contBnchigo = getValue(contAdEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("cont_bnchigo"));

			// ANK-3612-00-00 MOD/ADD START
			// コンテンツ建物名には建物名を設定する
			String contAdrttm = getValue(contAdEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("cont_adrttm"));
			// コンテンツ部屋番号には部屋番号を設定する
			String contAdrrm = getValue(contAdEditRslt, JKKAdEdit.ADRRM, (String)cust.get("cont_adrrm"));
			// ANK-3612-00-00 MOD/ADD END

			// コンテンツ住所コード
			custChg.put("cont_ad_cd", getAdCd(adEditRslt, (String)cust.get("cont_ad_cd")));
			// コンテンツ郵便番号
			custChg.put("cont_pcd", getValue(adEditRslt, JKKAdEdit.PCD, (String)cust.get("cont_pcd")));
			// コンテンツ都道府県名
			custChg.put("cont_state_nm", "");
			// コンテンツ市区町村名
			custChg.put("cont_city_nm", "");
			// コンテンツ大字通称名
			custChg.put("cont_oaztsu_nm", "");
			// コンテンツ字丁目名
			custChg.put("cont_azcho_nm", "");
			// コンテンツ番地号
			custChg.put("cont_bnchigo", contBnchigo);
			// コンテンツ住所補記・建物名
			custChg.put("cont_adrttm", contAdrttm);
			// コンテンツ住所補記・部屋番号
			// ANK-3612-00-00 MOD START
			//custChg.put("cont_adrrm", "");
			custChg.put("cont_adrrm", contAdrrm);
			// ANK-3612-00-00 MOD END
			// コンテンツ住所分割開始位置
			String[] contAdLst = JZMCommonUtil.getPtn05(getValue(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("cont_state_nm")),
														getValue(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("cont_city_nm")),
														getValue(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("cont_oaztsu_nm")),
														getValue(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("cont_azcho_nm")),
														getValue(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("cont_bnchigo")),
														getValue(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("cont_adrttm")),
														getValue(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("cont_adrrm")));
			custChg.put("cont_ad_bnkt_sta_pst", getContAdBnktStaPst(contAdLst[3]));
		}
		else {
			// コンテンツ住所コード
			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", opeDate);
		// ANK-3477-01-00 MOD END
		// 内販外販コード
		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);
	}


	// ANK-3477-01-00 ADD START
	/**
	 * コンテンツ住所分割開始位置を取得します。
	 * @param contAdBnktStaPst コンテンツ住所分割開始位置
	 * @return コンテンツ住所分割開始位置
	 */
	private String getContAdBnktStaPst(String contAdBnktStaPst)
	{
		
		if ( contAdBnktStaPst != null && !"".equals(contAdBnktStaPst) )
		{
			int start = Integer.parseInt(contAdBnktStaPst);
			if ( start < 5 )
			{
				return "5";		// お客様情報変更画面(CKW00401)の画面表示同様に開始位置は5以下は設定しない
			}
		}

		return contAdBnktStaPst;
	}

	/**
	 * 連絡先に登録します。
	 * <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
	{

		// お客様情報
		Map<String, Object> cust = (Map<String, Object>)param.getData(CUST_INF_CC_MAP);
		// コンテンツ表示有無により連絡先情報を更新する
		if ( (Boolean)cust.get("cont_disp_um") )
		{
			// 運用日
			String opeDate = (String)work.get(WORK_KEY_OPEDATE);
			// サービス契約一意照会明細
			CAANMsg ekk0081a010Msg = ((CAANMsg[])work.get(WORK_KEY_EKK0081A010CBSMSGLIST))[0];
			// お客様連絡先登録変更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", JKKStrConst.CD_DIV_UM_NASHI);		// 「処理なし」
			// 勤務先電話番号処理フラグ
			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)cust.get("rrks_ktai_telno")));
			// 勤務先電話番号
			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", getContTelNoDivFlg((String)cust.get("cont_rrks_no"),  (String)ccMsg.get(PHONE_NUM), (String)cust.get("cont_telno") ));
			// コンテンツ連絡先番号
			rrksAddUpd.put("cont_rrks_no", JKKStringUtil.nullToBlank((String)cust.get("cont_rrks_no")));
			// コンテンツ電話番号
			rrksAddUpd.put("cont_telno", getValue(ccMsg, PHONE_NUM, (String)cust.get("cont_telno")));
			// コンテンツメールアドレス処理フラグ
			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);
		}
	}

	/**
	 * コンテンツ電話番号処理フラグを取得します。
	 * @param contTelNo コンテンツ連絡先番号
	 * @param newTelNo 新コンテンツ電話番号
	 * @param OldTelNo 旧コンテンツ電話番号
	 * @return コンテンツ電話番号処理フラグ
	 */
	private String getContTelNoDivFlg(String contTelNo, String newTelNo, String OldTelNo)
	{
		if (!JKKStringUtil.isNullBlank(contTelNo))
		{
			if ( OldTelNo.equals(newTelNo) )
			{
				return JKKStrConst.CD_DIV_UM_NASHI;		// 処理なし
			}
			else
			{
				return "2";	// 更新
			}
		}

		return "1";	// 登録
	}
	// ANK-3477-01-00 ADD END

	/**
	 * 進捗に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg お客様住所情報更新受付(CMP)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 お客様住所情報更新受付(CMP)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", JKKStringUtil.nullToBlank((String)cust.get("cust_birthd")));
//		// 変更前性別
//		sjishoAdd.put("before_sex_cd", JKKStringUtil.nullToBlank((String)cust.get("cust_sex_cd")));
//		// 性別
//		sjishoAdd.put("sex_cd", JKKStringUtil.nullToBlank((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);
//		// ユーザーＩＤ
//		// ※使用されていない
//		// ユーザー名
//		// ※使用されていない
//
//		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 お客様住所情報更新受付(CMP)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);

		// ワークマップを設定
		Map<String, Object> workMsg = new HashMap<String, Object>();
		param.setData("CKSV0009WORK01", workMsg);
		// 予約フラグ
		workMsg.put("rsv_flg", false);
		
		// お客様情報変更時工事案件反映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", JKKStringUtil.nullToBlank((String)cust.get("cust_nm")));
		// お客様名変更フラグ
		updKojiAnken.put("cust_nm_chg_flg", false);
		// お客様カナ名
		updKojiAnken.put("cust_kana", JKKStringUtil.nullToBlank((String)cust.get("cust_kana")));
		// お客様カナ名変更フラグ
		updKojiAnken.put("cust_kana_chg_flg", false);
		// お客様携帯電話番号
		updKojiAnken.put("cust_ktai_tel_no", JKKStringUtil.nullToBlank((String)cust.get("rrks_ktai_telno")));
		// お客様携帯電話番号変更フラグ
		updKojiAnken.put("cust_ktai_tel_no_chg_flg", false);
		// お客様連絡先電話番号
		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, PHONE_NUM, (String)cust.get("keisha_telno")));
		// 現住所_電話番号変更フラグ
		updKojiAnken.put("gen_tel_no_chg_flg", isChanged(ccMsg, 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);
	}

	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(IRequestParameterReadWrite param,  Map<String, Object> ccMsg, String errCode, String errMessage)
	throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		Map<String, String> errMap = new HashMap<String, String>();
		// エラーコード
		errMap.put(ERROR_CODE, errCode);
		// エラーメッセージ
		errMap.put(ERROR_MESSAGE, errMessage);
		errList.add(errMap);
		ccMsg.put("ERROR_INFO", errList);

	}

	/**
	 * 請求書送付先住所情報変更に登録します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ
	 * @param work 作業用マップ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void updateSeikySofuskJyuSyo(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);
		// サービス契約一意照会明細
		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);

		// 請求書送付先住所一覧照会明細
		// ANK-3477-00-00_MOD START
		//CAANMsg[] ekk0491b004MsgList = null;
		CAANMsg[] ekk0491b008MsgList = null;
		// ANK-3477-00-00_MOD END
		// 請求契約一意照会明細
		CAANMsg[] ekk0491a010MsgList = null;

		// 住所情報変更コンポーネント部品マップ
		Map<String, Object> adInChg = new HashMap<String, Object>();

		// 機能コード
		adInChg.put("func_code", JPCModelConstant.FUNC_CD_1);

		// 異動区分
		adInChg.put("ido_div", JKKStrConst.CD00576_SEIKY_INFO_CHG);			// 「請求先情報変更」
		// 運用日付
		adInChg.put("ope_date", opeDate);
		// SYSID
		adInChg.put("sysid", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SYSID));
		// サービス契約番号
		adInChg.put("svc_kei_no", ekk0081a010Msg.getString(EKK0081A010CBSMsg1List.SVC_KEI_NO));

		// 利用場所住所_更新要否を設定
		adInChg.put("setplace_ad_upd_um", false);
		// 請求書送付先住所_更新要否を設定
		adInChg.put("seiky_shs_ad_upd_um", true);
		// ガイド誌送付先_更新要否を設定
		adInChg.put("guide_shs_ad_upd_um", false);
		
		// 異動理由リスト
		List<Map<String, String>> idoRsnList = new ArrayList<Map<String, String>>();
		Map<String, String> idoRsn = new HashMap<String, String>();
		// 異動理由コード
		idoRsn.put("ido_rsn_cd", JKKStrConst.CD00846_OTHER);				// 「その他」
		idoRsnList.add(idoRsn);
		adInChg.put("ido_rsn_list", idoRsnList);

		// 変更後_契約者住所_選択 → 住所情報変更CCマップ.契約者住所_更新要否
		adInChg.put("ksh_ad_upd_um", false);

		// 変更後_お客様指定送付先住所_選択 → 住所情報変更CCマップ.お客様指定送付先住所_更新要否
		adInChg.put("cssti_shs_ad_upd_um", "0");

		// 例外（手動入力） → 住所情報変更CCマップ.例外
		if ( "0".equals((String)adEditRslt.get(JKKAdEdit.MAN_INPUT_FLG )))
		{
			adInChg.put("reigai", false);
		}
		else
		{
			adInChg.put("reigai", true);
		}
		
		// ユーザID
		adInChg.put("user_id", "");

		/** 更新項目(利用場所住所) の空データを生成 */
		ArrayList<HashMap<String, Object>> setplace_ad_list = new ArrayList<HashMap<String, Object>>();
		// 変更後_利用場所住所_利用場所住所一覧 → 住所情報変更CCマップ.利用場所住所情報リスト
		adInChg.put("setplace_ad_list", setplace_ad_list);

		/** 更新項目(ガイド誌送付先住所) 空データの生成 */
		ArrayList<HashMap<String, Object>> guide_shs_ad_list = new ArrayList<HashMap<String, Object>>();
		// 変更後_ガイド誌送付先住所一覧 → 住所情報変更CCマップ.ガイド誌送付先住所情報リスト
		adInChg.put("guide_shs_ad_list", guide_shs_ad_list);
		// ANK-3477-00-00_MOD START
//		// 請求書送付先住所一覧照会
//		Object[][] ekk0491b004In =
//		{
//			{EKK0491B004CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491B004}
//			// 機能コード
//			, {EKK0491B004CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
//			// ＫＥＹ＿ＳＹＳＩＤ
//			, {EKK0491B004CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
//		};
//		// サービスIF実行
//		ekk0491b004MsgList = callSC(handle, scCall, param, fixedText, ekk0491b004In)
//				.getCAANMsgList(EKK0491B004CBSMsg.EKK0491B004CBSMSG1LIST);
//
//		/** 更新項目(請求書送付先住所) の生成 */
//		ArrayList<HashMap<String, Object>> seiky_shs_ad_list = new ArrayList<HashMap<String, Object>>();
//		for(int i=0; i < ekk0491b004MsgList.length; i++)
//		{
//			String seikyKeiNo = ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.SEIKY_KEI_NO);
//			// 請求契約一意照会
//			Object[][] ekk0491a010In =
//			{
//				{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010}
//				// 機能コード
//				, {EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
//				// ＫＥＹ＿請求契約番号
//				, {EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
//				// ＫＥＹ＿予約適用年月日
//				, {EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
//			};
//			// サービスIF実行
//			ekk0491a010MsgList = callSC(handle, scCall, param, fixedText, ekk0491a010In)
//					.getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
//			
//			if (ekk0491a010MsgList != null && ekk0491a010MsgList.length > 0)
//			{
//
//				// 更新項目追加用マップの生成
//				HashMap<String, Object> seiky_shs_ad = new HashMap<String, Object>();
//
//				// 変更後_送付先住所_請求契約番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_請求契約番号
//				seiky_shs_ad.put("seiky_shs_ad_seiky_kei_no", ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.SEIKY_KEI_NO));
//				// 変更後_送付先住所_サービス契約番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_サービス契約番号
//				seiky_shs_ad.put("seiky_shs_ad_svc_kei_no", ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.SVC_KEI_NO));
//				// 変更後_送付先住所_適用年月日 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_適用年月日
//				seiky_shs_ad.put("seiky_shs_ad_aply_ymd", opeDate);
//				// 変更後_送付先住所_送付先住所コード → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所コード
//				seiky_shs_ad.put("seiky_shs_ad_ad_cd", getAdCd(adEditRslt, (String)cust.get("keisha_ad_cd")));
//				// 変更後_送付先住所_送付先郵便番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_郵便番号
//				seiky_shs_ad.put("seiky_shs_ad_pcd", getValue(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
//				// 変更後_送付先住所_送付先住所都道府県名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_都道府県名
//				seiky_shs_ad.put("seiky_shs_ad_state", getValue(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm")));
//				// 変更後_送付先住所_送付先住所市区町村名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_市区町村名
//				seiky_shs_ad.put("seiky_shs_ad_city", getValue(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm")));
//				// 変更後_送付先住所_送付先住所大字通称名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_大字通称名
//				seiky_shs_ad.put("seiky_shs_ad_oaztsu", getValue(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm")));
//				// 変更後_送付先住所_送付先住所字丁目名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_字丁目名
//				seiky_shs_ad.put("seiky_shs_ad_azcho", getValue(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm")));
//				// 変更後_送付先住所_送付先住所番地号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_番地号
//				seiky_shs_ad.put("seiky_shs_ad_bnchigo", getValue(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo")));
//				// 変更後_送付先住所_送付先住所住所補記・建物名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所補記・建物名
//				seiky_shs_ad.put("seiky_shs_ad_adrttm", getValue(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm")));
//				// 変更後_送付先住所_送付先住所住所補記・部屋番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所補記・部屋番号
//				seiky_shs_ad.put("seiky_shs_ad_adrrm", getValue(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
//				// 変更後_送付先住所_送付先名（カナ） → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_送付先名（カナ）
//				seiky_shs_ad.put("seiky_shs_ad_kana", ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.SHS_KANA));
//				// 変更後_送付先住所_送付先名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_送付先名
//				seiky_shs_ad.put("seiky_shs_ad_nm", ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.SOHUS_NM));
//				// 変更後_送付先住所_電話番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_電話番号
//				seiky_shs_ad.put("seiky_shs_ad_telno", getValue(ccMsg, PHONE_NUM, (String)cust.get("keisha_telno")));
//				// 変更後_送付先住所_更新年月日時分秒 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_更新年月日時分秒(更新前)
//				seiky_shs_ad.put("seiky_shs_ad_upd_dtm_bf", ekk0491b004MsgList[i].getString(EKK0491B004CBSMsg1List.UPD_DTM));
//				// 変更後_送付先住所_最終更新年月日時分秒 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_最終更新年月日時分秒(更新前)
//				seiky_shs_ad.put("seiky_shs_ad_last_upd_dtm_bf", ekk0491a010MsgList[0].getString(EKK0491A010CBSMsg1List.LAST_UPD_DTM));
//
//				// 更新項目(請求書送付先住所)へ更新項目追加用マップを登録
//				seiky_shs_ad_list.add(seiky_shs_ad);
//
//			}
//		}
		// 請求書送付先住所一覧照会
		Object[][] ekk0491b008In =
		{
			{EKK0491B008CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491B008}
			// 機能コード
			, {EKK0491B008CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
			// ＫＥＹ＿ＳＹＳＩＤ
			, {EKK0491B008CBSMsg.KEY_SYSID, (String)ccMsg.get(SYSID)}
		};
		// サービスIF実行
		ekk0491b008MsgList = callSC(handle, scCall, param, fixedText, ekk0491b008In)
				.getCAANMsgList(EKK0491B008CBSMsg.EKK0491B008CBSMSG1LIST);

		/** 更新項目(請求書送付先住所) の生成 */
		ArrayList<HashMap<String, Object>> seiky_shs_ad_list = new ArrayList<HashMap<String, Object>>();
		for(int i=0; i < ekk0491b008MsgList.length; i++)
		{
			String seikyKeiNo = ekk0491b008MsgList[i].getString(EKK0491B008CBSMsg1List.SEIKY_KEI_NO);
			// 請求契約一意照会
			Object[][] ekk0491a010In =
			{
				{EKK0491A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0491A010}
				// 機能コード
				, {EKK0491A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
				// ＫＥＹ＿請求契約番号
				, {EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo}
				// ＫＥＹ＿予約適用年月日
				, {EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, opeDate}
			};
			// サービスIF実行
			ekk0491a010MsgList = callSC(handle, scCall, param, fixedText, ekk0491a010In)
					.getCAANMsgList(EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST);
			
			if (ekk0491a010MsgList != null && ekk0491a010MsgList.length > 0)
			{

				// 更新項目追加用マップの生成
				HashMap<String, Object> seiky_shs_ad = new HashMap<String, Object>();

				// 変更後_送付先住所_請求契約番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_請求契約番号
				seiky_shs_ad.put("seiky_shs_ad_seiky_kei_no", ekk0491b008MsgList[i].getString(EKK0491B008CBSMsg1List.SEIKY_KEI_NO));
				// 変更後_送付先住所_サービス契約番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_サービス契約番号
				seiky_shs_ad.put("seiky_shs_ad_svc_kei_no", ekk0491b008MsgList[i].getString(EKK0491B008CBSMsg1List.SVC_KEI_NO));
				// 変更後_送付先住所_適用年月日 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_適用年月日
				seiky_shs_ad.put("seiky_shs_ad_aply_ymd", opeDate);
				// 変更後_送付先住所_送付先住所コード → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所コード
				seiky_shs_ad.put("seiky_shs_ad_ad_cd", getAdCd(adEditRslt, (String)cust.get("keisha_ad_cd")));
				// 変更後_送付先住所_送付先郵便番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_郵便番号
				seiky_shs_ad.put("seiky_shs_ad_pcd", getValue(adEditRslt, JKKAdEdit.PCD, (String)cust.get("keisha_pcd")));
				// 変更後_送付先住所_送付先住所都道府県名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_都道府県名
				seiky_shs_ad.put("seiky_shs_ad_state", getValue(adEditRslt, JKKAdEdit.STATE_NM, (String)cust.get("keisha_state_nm")));
				// 変更後_送付先住所_送付先住所市区町村名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_市区町村名
				seiky_shs_ad.put("seiky_shs_ad_city", getValue(adEditRslt, JKKAdEdit.CITY_NM, (String)cust.get("keisha_city_nm")));
				// 変更後_送付先住所_送付先住所大字通称名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_大字通称名
				seiky_shs_ad.put("seiky_shs_ad_oaztsu", getValue(adEditRslt, JKKAdEdit.OAZTSU_NM, (String)cust.get("keisha_oaztsu_nm")));
				// 変更後_送付先住所_送付先住所字丁目名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_字丁目名
				seiky_shs_ad.put("seiky_shs_ad_azcho", getValue(adEditRslt, JKKAdEdit.AZCHO_NM, (String)cust.get("keisha_azcho_nm")));
				// 変更後_送付先住所_送付先住所番地号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_番地号
				seiky_shs_ad.put("seiky_shs_ad_bnchigo", getValue(adEditRslt, JKKAdEdit.BNCHIGO, (String)cust.get("keisha_bnchigo")));
				// 変更後_送付先住所_送付先住所住所補記・建物名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所補記・建物名
				seiky_shs_ad.put("seiky_shs_ad_adrttm", getValue(adEditRslt, JKKAdEdit.ADRTTM, (String)cust.get("keisha_adrttm")));
				// 変更後_送付先住所_送付先住所住所補記・部屋番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_住所補記・部屋番号
				seiky_shs_ad.put("seiky_shs_ad_adrrm", getValue(adEditRslt, JKKAdEdit.ADRRM, (String)cust.get("keisha_adrrm")));
				// 変更後_送付先住所_送付先名（カナ） → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_送付先名（カナ）
				seiky_shs_ad.put("seiky_shs_ad_kana", ekk0491b008MsgList[i].getString(EKK0491B008CBSMsg1List.SHS_KANA));
				// 変更後_送付先住所_送付先名 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_送付先名
				seiky_shs_ad.put("seiky_shs_ad_nm", ekk0491b008MsgList[i].getString(EKK0491A010CBSMsg1List.SOHUS_NM));
				// 変更後_送付先住所_電話番号 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_電話番号
				seiky_shs_ad.put("seiky_shs_ad_telno", getValue(ccMsg, PHONE_NUM, (String)cust.get("keisha_telno")));
				// 変更後_送付先住所_更新年月日時分秒 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_更新年月日時分秒(更新前)
				seiky_shs_ad.put("seiky_shs_ad_upd_dtm_bf", ekk0491b008MsgList[i].getString(EKK0491A010CBSMsg1List.UPD_DTM));
				// 変更後_送付先住所_最終更新年月日時分秒 → 住所情報変更CCマップ.請求書送付先住所情報リスト.請求書送付先住所_最終更新年月日時分秒(更新前)
				seiky_shs_ad.put("seiky_shs_ad_last_upd_dtm_bf", ekk0491a010MsgList[0].getString(EKK0491A010CBSMsg1List.LAST_UPD_DTM));

				// 更新項目(請求書送付先住所)へ更新項目追加用マップを登録
				seiky_shs_ad_list.add(seiky_shs_ad);

			}
		}
		// ANK-3477-00-00_MOD END
		// 変更後_請求書送付先住所_請求書送付先住所一覧 → 住所情報変更CCマップ.請求書送付先住所情報リスト
		adInChg.put("seiky_shs_ad_list", seiky_shs_ad_list);

		param.setData(AD_INF_CHG_CC_MAP, adInChg);

		// 住所情報変更コンポーネント部品CCを実行
		new JKKAdInfChgCC().adInfChgCommit(handle, param, AD_INF_CHG_CC_MAP);
	}

	/**
	 * 指定された項目の値を取得します。
	 * <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;
	}


	/**
	 * 進捗特記事項1、進捗特記事項2を取得します。
	 * <br>
	 * @param ccMsg お客様住所情報更新受付(CMP)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(editPrgTkjkAdInf(ccMsg, cust, adEditRslt))
				.append(editPrgTkjk("電話番号", ccMsg, PHONE_NUM, (String)cust.get("keisha_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 お客様住所情報更新受付(CMP)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 ccMsg お客様住所情報更新受付(CMP)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, PCD, (String)cust.get("keisha_pcd")))
			{
				prgTkjk.append("郵便番号:(修正前)").append(JKKStringUtil.nullToBlank((String)cust.get("keisha_pcd")))
						.append("(修正後)").append(JKKStringUtil.nullToBlank((String)ccMsg.get(PCD))).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 errorCode リターンコード
	 * @param dataMapKey パラメータキー
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int errorCode,
														String dataMapKey) throws RequestParameterException
	{
		CAANMsg template = templates[0];

		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (0 != errorCode)
		{
			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;
	}

	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, JKKStrConst.RETURN_MESSAGE_HISSU_CHECK_ERROR + " " + itemName);
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getFormErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, JKKStrConst.RETURN_MESSAGE_ZOKUSEI_CHECK_ERROR + " " + itemName);
		
		return returnMap;
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public static Map<String, String> getLenErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, JKKStrConst.RETURN_MESSAGE_KETASU_CHECK_ERROR + " " + itemName);
		
		return returnMap;
	}
	// ANK-3477-01-00 ADD START
	/**
	 * コンテンツ住所編集結果として返します。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param trgtData 対象データ
	 * @param SYSID sysid
	 * @return 住所編集結果
	 * @throws Throwable
	 */
	private Map<String, Object> separateContAd(IRequestParameterReadWrite param, Map<String, Object> trgtData, String sysid ) throws Throwable
	{

		Map<String, Object> returnMap = new HashMap<String, Object>();

		String stateNm = JKKStringUtil.nullToBlank((String)trgtData.get(STATE_NM));
		String cityNm = JKKStringUtil.nullToBlank((String)trgtData.get(CITY_NM));
		String oaztsuNm = JKKStringUtil.nullToBlank((String)trgtData.get(OAZTSU_NM));
		String azchoNm = JKKStringUtil.nullToBlank((String)trgtData.get(AZCHO_NM));
		String bnchigo = JKKStringUtil.nullToBlank((String)trgtData.get(BNCHIGO));
		String adrttm = JKKStringUtil.nullToBlank((String)trgtData.get(ADRTTM));
		String adrrm = JKKStringUtil.nullToBlank((String)trgtData.get(ADRRM));

		//シスログ出力
        String proId = param.getUsecaseID();
        String msgId = "";
        String msg   = "";
        String keyCd = "";

		// 入力パラメータの都道府県名、市区町村名、大字通称名、字丁目名番地号、建物名、部屋番号を連結
		String adInf = stateNm + cityNm + oaztsuNm + azchoNm + bnchigo + adrttm + adrrm;

		// 入力パラメータの都道府県名、市区町村名、大字通称名、字丁目名番地号を連結
		String bnchigoTmp = stateNm + cityNm + oaztsuNm + azchoNm + bnchigo;
		String editBnchigo = "";
		String editTtm = "";
		// ANK-3612-00-00 ADD START
		String editRm = "";
		// ANK-3612-00-00 ADD END

		if (bnchigoTmp.length() > MAX_LEN_BNCHIGO)
		{
			editBnchigo = bnchigoTmp.substring(0, MAX_LEN_BNCHIGO);
			// ANK-3612-00-00 MOD START
			//editTtm = bnchigoTmp.substring(MAX_LEN_BNCHIGO) + adrttm + adrrm;
			editTtm = bnchigoTmp.substring(MAX_LEN_BNCHIGO) + adrttm;
			editRm  = adrrm;
			// ANK-3612-00-00 MOD END
		}
		else
		{
			editBnchigo = bnchigoTmp;
			// ANK-3612-00-00 MOD START
			//editTtm = adrttm + adrrm;
			editTtm = adrttm;
			editRm  = adrrm;
			// ANK-3612-00-00 MOD END
		}

		// 建物名が最大文字数を超えている場合
		if (editTtm.length() > MAX_LEN_ADRTTM)
		{
			String tmpTtm2 = editTtm;
			editTtm = tmpTtm2.substring(0, MAX_LEN_ADRTTM);
			// 入力住所が登録最大桁数を超えた場合マイナーアラームを出力
			String sysdate = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));
			HashMap<String, Object> propMap = new HashMap<String, Object>();

			propMap.put(JCCSuperComExecUtil.EXEC_BUFF_SIZE, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_BUFF_SIZE));
			propMap.put(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY));
			propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY));
			propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY));
			propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));
			
			keyCd = " SYSID：" + sysid;
			msg = MESLOG_ADDRESS + keyCd + " 住所："+ adInf;
			msgId = "EKKB1920KW";
				
            JCCSyslogFormat.logger(proId, msgId, sysdate, msg, null, propMap);
		}
		// 番地号、建物名、部屋番号を再設定する
		returnMap.put(BNCHIGO, JKKStringUtil.nullToBlank(editBnchigo));
		returnMap.put(ADRTTM, JKKStringUtil.nullToBlank(editTtm));
		// ANK-3612-00-00 ADD START
		returnMap.put(ADRRM, JKKStringUtil.nullToBlank(editRm));
		// ANK-3612-00-00 ADD END

		return returnMap;
	}
	// ANK-3477-01-00 ADD END
	// ANK-3814-00-00 ADD START
	/**
	 * 指示書登録、AxM会員情報更新依頼（IDA連携）
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ	
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void addSjishoRenkei(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg) throws Throwable
	{
		Map<String, Object> inMap = new HashMap<String, Object>();

		String sysid = (String)ccMsg.get(SYSID);

		// eoIDセキュリティ強化連携電話番号その他取得
		Map result = JCKPmpCommonUtil.getSecurityRenkeiTelnoSonota(handle, param, sysid);
		String outRenkeiTelno = "";
		if (result == null || result.size() == 0)
		{
			// お客様スキーマ存在なし（SYSID存在チェックエラー）
			String msg = "お客様スキーマにレコードが存在しません。";
			printSyslog(param, "EKKB0150JE", msg, (String)ccMsg.get("sysid"));
			throw new CCException(msg, new Exception(msg + " sysid[" + (String)ccMsg.get("sysid") + "]"));
		}
		else
		{
			outRenkeiTelno = (String)result.get("outRenkeiTelno");
		}

		if (JKKStringUtil.isNullSpace(outRenkeiTelno))
		{
			// 契約者電話番号が未設定の場合は指示書を作成せずに処理を抜ける（正常）（コンテンツ電話番号がない場合はAll'9'のはず。）
			return;
		}

		// 指示書登録
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(ECK0151D010CBSMsg.TRGT_TABLE_ID, null);
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, (String)ccMsg.get(SYSID));
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "22");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, ADMIN_SJISHO_PARAM1_UPD_PART);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_2, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_3, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_4, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_5, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_6, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_7, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_8, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_9, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_10, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_11, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_12, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_13, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_14, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_15, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_16, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_17, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_18, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_19, JCCBPCommon.getSysDateTime());
		inMap.put(ECK0151D010CBSMsg.PARAMETER_20, outRenkeiTelno);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_21, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_22, "");

		result = callECK0151D010Map(handle, param, inMap);
		if (isSuccess(result))
		{
			// AxM会員情報更新依頼CC呼び出し処理
			execIdaSijishoRenkeiCall(handle, param, ccMsg);
			return;
		}
		// システムエラー
		String msg = "指示書登録に失敗しました。";
		printSyslog(param, "ECCB0120CE", msg, (String)ccMsg.get("sysid"));
		throw new CCException(msg, new Exception(msg + " sysid[" + (String)ccMsg.get("sysid") + "]" + " returnCD["
				+ String.valueOf(JCKPmpScParamHenshu.getReturnCode(result)) + "] status[" + JCKPmpScParamHenshu.getStatus(result) + "]"));
	}

	/**
	 * AxM会員情報更新依頼CC呼び出し処理<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ	
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void execIdaSijishoRenkeiCall(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccMsg) throws Throwable
	{
		String fixedText = "IdaSijishoRenkeiCC";
		param.setData(fixedText, new HashMap<String, Object>());

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// パラメータ設定
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.UPD_TRGT_SYSID, ccMsg.get("sysid"));
		inMap.put(CKSV9001_CKSV9001OP_CKSV900101CC.TRGT_TABLE_ID, null);

		// AxM会員情報更新依頼CCを実行
		JCKSV900101CC idaSijishoRenkeiCC = new JCKSV900101CC();
		idaSijishoRenkeiCC.executeMain(handle, param, fixedText);

		// エラー時リターンコードを設定
		if ("1".equals(inMap.get("err_flg")))
		{
			// システムエラー
			String msg = "IDA連携に失敗しました。";
			printSyslog(param, "ECCB0120CE", msg, (String)ccMsg.get("sysid"));
			throw new CCException(msg, new Exception(msg + " sysid[" + (String)ccMsg.get("sysid") + "]" + " err_flg[" + inMap.get("err_flg") + "]"));
		}
		JCKPmpCommonUtil.printDebugLog("IDA連携正常終了（execIdaSijishoRenkeiCall）sysid[" + (String)ccMsg.get("sysid") + "]");
	}

	/**
	 * ＳＹＳログ出力
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param msgId メッセージID
	 * @param msg メッセージ本文
	 * @param sysid SYSID
	 */
	private void printSyslog(IRequestParameterReadWrite param, String msgId, String msg, String sysid)
	{
		HashMap<String, Object> propMap = new HashMap<String, Object>();
		propMap.put(JCCSuperComExecUtil.EXEC_BUFF_SIZE, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_BUFF_SIZE));
		propMap.put(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY, JCMAPLConstMgr.getString(JCCSuperComExecUtil.EXEC_PERMIT_MEMORY));
		propMap.put(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_FOMAT_PTN_KEY));
		propMap.put(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_MAILING_ID_KEY));
		propMap.put(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION, JCMAPLConstMgr.getString(JCCSyslogFormat.SYSLOG_OUT_DIR_OPTION));

		String wMsg = JKKStringUtil.nullToBlank(msg) + "（SYSID：" + sysid + "）";
		String sysdate = JPCBPCommon.getSysDateTime();

		JCCSyslogFormat.logger(param.getUsecaseID(), msgId, sysdate, wMsg, null, propMap);
	}
	// ANK-3814-00-00 ADD END
}
