/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKItntokiStaEnd
*   ソースファイル名：JKKItntokiStaEnd.java
*   作成者          ：富士通
*   日付            ：2013年06月17日
*＜機能概要＞
*   移転トーキ開始終了部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/06/17   FJ）        新規作成
*   v8.00.00    2014/06/11   FJ）藤本    【OM-2014-0002118】撤去解約時に移転元解約によるトーキが即時開始されない
*   v9.00.00    2014/07/14   FJ）藤本    【OM-2014-0002367】移転元の移転先登録トーキの転送先電話を強制解約すると回復できない
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKItntokiStaEndConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKSvcConst;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCDateChecker;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191B502CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191B502CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191C011CBSMsg;

/**
 * 移転トーキ開始終了部品です。<p>
 * <br>
 * @author FJ
 */
public class JKKItntokiStaEnd extends AbstractCommonComponent
{
	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";

	/** エラーメッセージ : パラメータ設定不正 */
	private static final String ERR_MSG_PARAM = "リクエストパラメータに誤りがあります。";

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKItntokiStaEndMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** 運用日 */
	private String opeDate = null;

	/**
	 * 移転トーキ開始終了判定・更新処理の初期処理です。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKItntokiStaEndMapperCC();
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// 運用日
		if (null == this.opeDate)
		{
			this.opeDate = JCCBPCommon.getOpeDate(null);
		}

		// ユーザ定義領域作成
		createUserData(param, fixedText);

		// リターンコードに正常を設定
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JCMConstants.RET_NORMAL);
	}

	/**
	 * 移転トーキ開始終了判定・更新処理を行います。<br>
	 * 移転先登録によるトーキ、移転元解約によるトーキ、休止によるトーキを開始／終了するかどうかを判定し、
	 * 判定結果を出力パラメータに設定します。入力パラメータ．更新フラグが'1'の場合は、サービス契約内訳＜eo光電話＞
	 * スキーマの移転トーキの開始／終了情報を更新します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite judgeUpdItntokiStaEnd(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData, String fixedText)
	throws Throwable
	{
		// 初期処理
		init(param, fixedText);

		// 入力パラメータチェック
		String errMsg = chkInput(handle, param, trgtData);
		if (null != errMsg && !errMsg.isEmpty())
		{
			// チェックエラー
			throw new CCException("", new SCCallException(errMsg, "9051", 8011));
		}

		// サービス契約内訳番号を取得
		String svcKeiUcwkNo = (String)trgtData.get(JKKItntokiStaEndConstCC.SVC_KEI_UCWK_NO);

		// サービス契約内訳一意照会
		CAANMsg msgEKK0161A010 = searchSvcKeiUcwk(handle, param, fixedText, svcKeiUcwkNo);

		// サービス契約内訳<eo光電話>一意照会
		CAANMsg msgEKK0191A010 = searchSvkeiuwEohTel(handle, param, fixedText, svcKeiUcwkNo);

		// 移転トーキ開始終了判定
		judgeItntokiStaEnd(handle, param, fixedText, trgtData, msgEKK0161A010, msgEKK0191A010);

		// 更新フラグを取得
		String updFlg = (String)trgtData.get(JKKItntokiStaEndConstCC.UPD_FLG);
		if (JKKSvcConst.FLG_ON.equals(updFlg))
		{
			// サービス契約内訳<eo光電話>移転トーキ設定
			addSvkeiuwEohTelItnToki(handle, param, fixedText, trgtData, msgEKK0191A010);
		}

		return param;
	}

	/**
	 * 入力パラメータのチェックを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return エラーメッセージ
	 */
	@SuppressWarnings("unchecked")
	private String chkInput(SessionHandle handle, IRequestParameterReadWrite param, HashMap trgtData)
	{
		// 必須チェック
		String svcKeiNo = (String)trgtData.get(JKKItntokiStaEndConstCC.SVC_KEI_NO);
		if (null == svcKeiNo || svcKeiNo.isEmpty())
		{
			return ERR_MSG_PARAM + "サービス契約番号が設定されていません。";
		}

		String svcKeiUcwkNo = (String)trgtData.get(JKKItntokiStaEndConstCC.SVC_KEI_UCWK_NO);
		if (null == svcKeiUcwkNo || svcKeiUcwkNo.isEmpty())
		{
			return ERR_MSG_PARAM + "サービス契約内訳番号が設定されていません。";
		}

		String idoDiv = (String)trgtData.get(JKKItntokiStaEndConstCC.IDO_DIV);
		if (null == idoDiv || idoDiv.isEmpty())
		{
			return ERR_MSG_PARAM + "異動区分が設定されていません。";
		}

		String mskmDtlNo = (String)trgtData.get(JKKItntokiStaEndConstCC.MSKM_DTL_NO);
		if (null == mskmDtlNo || mskmDtlNo.isEmpty())
		{
			return ERR_MSG_PARAM + "申込明細番号が設定されていません。";
		}

		String updFlg = (String)trgtData.get(JKKItntokiStaEndConstCC.UPD_FLG);
		if (null == updFlg || updFlg.isEmpty())
		{
			return ERR_MSG_PARAM + "更新フラグが設定されていません。";
		}

		// チェックOK
		return "";
	}

	/**
	 * 移転トーキ開始終了判定を行います。<br>
	 * 移転先登録によるトーキ、移転元解約によるトーキ、休止によるトーキを開始／終了するかどうかを判定し、
	 * 判定結果を出力パラメータに設定します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0161A010 サービス契約内訳一意照会結果
	 * @param msgEKK0191A010 サービス契約内訳＜eo光電話＞一意照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private void judgeItntokiStaEnd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
		HashMap<String, Object> trgtData, CAANMsg msgEKK0161A010, CAANMsg msgEKK0191A010)
	throws Throwable
	{
		// 出力パラメータ．移転トーキ開始終了判定コード
		String itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_NON;
		// 出力パラメータ．移転元解約トーキ実施中コード
		String dslTokiJssiChuCd = "";
		// 出力パラメータ．移転元サービス契約内訳リスト
		List<Map<String, String>> itnmSvcKeiUcwkList = new ArrayList<Map<String, String>>();

		// 入力パラメータ．異動区分
		String idoDiv = (String)trgtData.get(JKKItntokiStaEndConstCC.IDO_DIV);
		// 入力パラメータ．異動詳細コード
		String idoDtlCd = (String)trgtData.get(JKKItntokiStaEndConstCC.IDO_DTL_CD);

		// サービス契約内訳一意照会結果の各項目
		String svcKeiUcwkNo = msgEKK0161A010.getString(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_NO);
		String svcKeiUcwkStat = msgEKK0161A010.getString(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
		String pauseStpCd = msgEKK0191A010.getString(EKK0161A010CBSMsg1List.PAUSE_STP_CD);

		// サービス契約内訳＜eo光電話＞一意照会結果の各項目
		String itensOpafTokiAddCd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_ADD_CD);
		String itensOpafTokiEndRsymd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_END_RSYMD);
		String itensOpafTokiStaYmd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_STA_YMD);
		String itensOpafTokiEndYmd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_END_YMD);
		String dslPauseTokiAddCd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_ADD_CD);
		String dslPauseTokiEndRsymd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_END_RSYMD);
		String dslPauseTokiStaYmd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_STA_YMD);
		String dslPauseTokiEndYmd = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_END_YMD);

		// (1) 異動対象のサービス契約内訳に対してのトーキ開始／終了

		// @ 移転先登録によるトーキの開始／移転元解約によるトーキの開始判定
		// 異動区分が「キャンセル」(サービス契約内訳ステータスは「受付済」)「解約」「撤去(解約)」「光電話・番号解約」の場合
		if ((JKKSvcConst.IDO_DIV_CANCEL.equals(idoDiv) && JKKSvcConst.SVC_KEI_STAT_010.equals(svcKeiUcwkStat))
			|| JKKSvcConst.IDO_DIV_DSL.equals(idoDiv)
			// OM-2014-0002118 撤去解約時に移転元解約によるトーキが即時開始されない 2014/06/11 START
			|| JKKSvcConst.IDO_DIV_TEKKYODSL.equals(idoDiv)
			// OM-2014-0002118 撤去解約時に移転元解約によるトーキが即時開始されない 2014/06/11 END
			|| JKKSvcConst.IDO_DIV_HTELNODSL.equals(idoDiv))
		{
			// @-1 移転先登録によるトーキの開始判定
			// ・移転先開通後トーキ登録コードが'1'(移転先登録によるトーキ)
			// ・移転先開通後トーキ終了予定年月日が運用日より未来
			// ・移転先開通後トーキ開始年月日が設定されていない、または'20991231'が設定されている
			// ・移転先開通後トーキ終了年月日が設定されていない、または'20991231'が設定されている
			// ・移転先開通後トーキ転送先サービス契約内訳番号に紐付くサービス契約内訳のサービス契約内訳ステータスが'100'(サービス提供中)(※)
			if (JKKSvcConst.ITNTOKI_ADD_CD_ADD.equals(itensOpafTokiAddCd)
				&& JPCDateChecker.isFutureDate(itensOpafTokiEndRsymd, opeDate, "0")
				&& isEmptyDate(itensOpafTokiStaYmd)
				&& isEmptyDate(itensOpafTokiEndYmd))
			{
				// 移転先開通後トーキ転送先サービス契約内訳番号に紐付くサービス契約内訳を取得
				String itnsOpafTokiTssSvkuwno = msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITNS_OPAF_TOKI_TSS_SVKUWNO);
				// サービス契約内訳一意照会
				CAANMsg tssMsgEKK0161A010 = searchSvcKeiUcwk(handle, param, fixedText, itnsOpafTokiTssSvkuwno);
				String tssSvcKeiUcwkStat = tssMsgEKK0161A010.getString(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
				if (JKKSvcConst.SVC_KEI_STAT_100.equals(tssSvcKeiUcwkStat))
				{
					// 移転トーキ開始終了判定コード
					itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_STA;
					// 移転元解約トーキ実施中コード
					if (JKKSvcConst.ITNTOKI_ADD_CD_DSL.equals(dslPauseTokiAddCd)
						&& isEmptyDate(dslPauseTokiEndYmd))
					{
						// トーキ実施中の場合
						if (!isEmptyDate(dslPauseTokiStaYmd))
						{
							dslTokiJssiChuCd = JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD_JSSI;
						}
						// トーキ予約中の場合
						else
						{
							dslTokiJssiChuCd = JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD_RSV;
						}
					}
				}
			}

			// 移転先登録によるトーキを開始しない場合
			if (!JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_STA.equals(itntokiStaEndJudgeCd))
			{
				// @-2 移転元解約によるトーキの開始判定
				// ・解約・休止トーキ登録コードが'2'(移転元解約によるトーキ)
				// ・解約・休止トーキ終了予定年月日が運用日より未来
				// ・解約・休止トーキ開始年月日が設定されていない、または'20991231'が設定されている
				// ・解約・休止トーキ終了年月日が設定されていない、または'20991231'が設定されている
				if (JKKSvcConst.ITNTOKI_ADD_CD_DSL.equals(dslPauseTokiAddCd)
					&& JPCDateChecker.isFutureDate(dslPauseTokiEndRsymd, opeDate, "0")
					&& isEmptyDate(dslPauseTokiStaYmd)
					&& isEmptyDate(dslPauseTokiEndYmd))
				{
					// 移転トーキ開始終了判定コード
					itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_DSL_STA;
					// 移転元解約トーキ実施中コード
					// 設定しない
				}
			}
		}

		// 異動区分が「休止受付」の場合
		if (JKKSvcConst.IDO_DIV_PAUSEUK.equals(idoDiv))
		{
			// A 休止によるトーキの開始判定(通常の休止時)
			if (null == idoDtlCd || !JKKItntokiStaEndConstCC.IDO_DTL_CD_KAIHK_PAUSE.equals(idoDtlCd))
			{
				// ・解約・休止トーキ登録コードが'3'(休止によるトーキ)
				// ・解約・休止トーキ終了予定年月日が運用日より未来
				// ・解約・休止トーキ開始年月日が設定されていない、または'20991231'が設定されている
				// ・解約・休止トーキ終了年月日が設定されていない、または'20991231'が設定されている
				if (JKKSvcConst.ITNTOKI_ADD_CD_PAUSE.equals(dslPauseTokiAddCd)
					&& JPCDateChecker.isFutureDate(dslPauseTokiEndRsymd, opeDate, "0")
					&& isEmptyDate(dslPauseTokiStaYmd)
					&& isEmptyDate(dslPauseTokiEndYmd))
				{
					// 移転トーキ開始終了判定コード
					itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_PAUSE_STA;
					// 移転元解約トーキ実施中コード
					// 設定しない
				}
			}
			// B 休止によるトーキの開始判定(回復／番号回復に伴う休止時のトーキ再開)
			else
			{
				// サービス契約内訳ステータスが'210'(休止・中断中)で、休止中断コードが'02'(中断中)でない場合
				if (JKKSvcConst.SVC_KEI_STAT_210.equals(svcKeiUcwkStat) && !JKKSvcConst.PAUSE_STP_CD_02.equals(pauseStpCd))
				{
					// ・解約・休止トーキ登録コードが'3'(休止によるトーキ)
					// ・解約・休止トーキ終了予定年月日が運用日より未来
					// ・解約・休止トーキ開始年月日が設定されている('20991231'以外)
					if (JKKSvcConst.ITNTOKI_ADD_CD_PAUSE.equals(dslPauseTokiAddCd)
						&& JPCDateChecker.isFutureDate(dslPauseTokiEndRsymd, opeDate, "0")
						&& !isEmptyDate(dslPauseTokiStaYmd))
					{
						// 移転トーキ開始終了判定コード
						itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_PAUSE_STA;
						// 移転元解約トーキ実施中コード
						// 設定しない
					}
				}
			}
		}

		// C 休止によるトーキの終了判定
		// 異動区分が「休止変更・予約取消」の場合
		if (JKKSvcConst.IDO_DIV_PAUSERLSCHGE.equals(idoDiv))
		{
			// サービス契約内訳ステータスが'100'(サービス提供中)、'220'(停止中)、'920'(キャンセル済)、'910'(解約済)の場合
			if (JKKSvcConst.SVC_KEI_STAT_100.equals(svcKeiUcwkStat) || JKKSvcConst.SVC_KEI_STAT_220.equals(svcKeiUcwkStat)
				|| JKKSvcConst.SVC_KEI_STAT_920.equals(svcKeiUcwkStat) || JKKSvcConst.SVC_KEI_STAT_910.equals(svcKeiUcwkStat))
			{
				// ・解約・休止トーキ登録コードが'3'(休止によるトーキ)
				// ・解約・休止トーキ開始年月日が設定されている('20991231'以外)
				// ・解約・休止トーキ終了年月日が設定されていない、または'20991231'が設定されている
				if (JKKSvcConst.ITNTOKI_ADD_CD_PAUSE.equals(dslPauseTokiAddCd)
					&& !isEmptyDate(dslPauseTokiStaYmd)
					&& isEmptyDate(dslPauseTokiEndYmd))
				{
					// 移転トーキ開始終了判定コード
					itntokiStaEndJudgeCd = JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_PAUSE_END;
					// 移転元解約トーキ実施中コード
					// 設定しない
				}
			}
		}

		// (2) 移転元サービス契約内訳に対してのトーキ開始／終了

		// D 移転先登録によるトーキの開始判定(回復／番号回復によるトーキ再開、または番ポ切替時)
		// 異動区分が「回復」「光電話・番号回復」「利用停止解除(番ポ処理区分「利用停止解除」)」の場合
		if (JKKSvcConst.IDO_DIV_KAIHK.equals(idoDiv)
			|| JKKSvcConst.IDO_DIV_HTELNOKAIHK.equals(idoDiv)
			|| JKKSvcConst.IDO_DIV_USESTPRLS.equals(idoDiv))
		{
			// サービス契約内訳ステータスが'100'(サービス提供中)
			if (JKKSvcConst.SVC_KEI_STAT_100.equals(svcKeiUcwkStat))
			{
				// 移転元サービス契約内訳<eo光電話>一覧照会
				CAANMsg[] msgEKK0191B502List = searchItnmSvkeiuwEohTel(handle, param, fixedText, svcKeiUcwkNo);
				for (CAANMsg msgEKK0191B502 : msgEKK0191B502List)
				{
					String itnmItensOpafTokiAddCd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_ADD_CD);
					String itnmItensOpafTokiEndRsymd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_END_RSYMD);
					String itnmItensOpafTokiStaYmd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_STA_YMD);
					String itnmSvcKeiUcwkStat = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_KEI_UCWK_STAT);
					String itnmSvcDlreCd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_DLRE_CD);

					boolean isTokiStart = false;
					// 異動区分が「利用停止解除(番ポ処理区分「利用停止解除」)」の場合
					if (JKKSvcConst.IDO_DIV_USESTPRLS.equals(idoDiv))
					{
						// ・移転先開通後トーキ登録コードが'1'(移転先登録によるトーキ)
						// ・移転先開通後トーキ終了予定年月日が運用日より未来
						// ・サービス契約内訳ステータスが'910'(解約済)、かつサービス解約理由コードが'02'(強制解約)以外
						if (JKKSvcConst.ITNTOKI_ADD_CD_ADD.equals(itnmItensOpafTokiAddCd)
							&& JPCDateChecker.isFutureDate(itnmItensOpafTokiEndRsymd, opeDate, "0")
							&& JKKSvcConst.SVC_KEI_STAT_910.equals(itnmSvcKeiUcwkStat) && !JKKSvcConst.SVC_DLRE_CD_KYOSEIDSL.equals(itnmSvcDlreCd))
						{
							isTokiStart = true;
						}
					}
					else
					{
						// ・移転先開通後トーキ登録コードが'1'(移転先登録によるトーキ)
						// ・移転先開通後トーキ終了予定年月日が運用日より未来
						// ・移転先開通後トーキ開始年月日が設定されている('20991231'以外)
						// ・サービス契約内訳ステータスが'910'(解約済)、かつサービス解約理由コードが'02'(強制解約)以外
						if (JKKSvcConst.ITNTOKI_ADD_CD_ADD.equals(itnmItensOpafTokiAddCd)
							&& JPCDateChecker.isFutureDate(itnmItensOpafTokiEndRsymd, opeDate, "0")
							&& !isEmptyDate(itnmItensOpafTokiStaYmd)
							&& JKKSvcConst.SVC_KEI_STAT_910.equals(itnmSvcKeiUcwkStat) && !JKKSvcConst.SVC_DLRE_CD_KYOSEIDSL.equals(itnmSvcDlreCd))
						{
							isTokiStart = true;
						}
					}

					if (isTokiStart)
					{
						Map<String, String> itnmSvcKeiUcwk = new HashMap<String, String>();
						String itnmSvcKeiNo = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_KEI_NO);
						String itnmSvcKeiUcwkNo = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_KEI_UCWK_NO);
						String itnmSvcKeiUcwkGeneAddDtm= msgEKK0191B502.getString(EKK0191B502CBSMsg1List.GENE_ADD_DTM);
						// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
						String mskmDtlNo= msgEKK0191B502.getString(EKK0191B502CBSMsg1List.MSKM_DTL_NO);
						// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

						// 移転元移転トーキ開始終了判定コード
						itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_ITNTOKI_STA_END_JUDGE_CD,
								JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_STA);
						// 移転元サービス契約番号
						itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_NO, itnmSvcKeiNo);
						// 移転元サービス契約内訳番号
						itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_NO, itnmSvcKeiUcwkNo);
						// 移転元サービス契約内訳世代登録年月日時分秒
						itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_GENE_ADD_DTM, itnmSvcKeiUcwkGeneAddDtm);
						// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
						// 移転元サービス契約内訳申込明細番号
						itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_MSKM_DTL_NO, mskmDtlNo);
						// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

						// 移転元サービス契約内訳リストに追加
						itnmSvcKeiUcwkList.add(itnmSvcKeiUcwk);
					}
				}
			}
		}

		// E 移転先登録によるトーキの終了判定
		// 異動区分が「解約」「撤去(解約)」「強制解約」「利用停止(番ポ処理区分「利用停止」)」「光電話・番号解約」の場合
		if (JKKSvcConst.IDO_DIV_DSL.equals(idoDiv)
			// OM-2014-0002118 撤去解約時に移転元解約によるトーキが即時開始されない 2014/06/11 START
			|| JKKSvcConst.IDO_DIV_TEKKYODSL.equals(idoDiv)
			// OM-2014-0002118 撤去解約時に移転元解約によるトーキが即時開始されない 2014/06/11 END
			|| JKKSvcConst.IDO_DIV_KYOSEIDSL.equals(idoDiv)
			|| JKKSvcConst.IDO_DIV_USESTP.equals(idoDiv)
			|| JKKSvcConst.IDO_DIV_HTELNODSL.equals(idoDiv))
		{
			// 移転元サービス契約内訳<eo光電話>一覧照会
			CAANMsg[] msgEKK0191B502List = searchItnmSvkeiuwEohTel(handle, param, fixedText, svcKeiUcwkNo);
			for (CAANMsg msgEKK0191B502 : msgEKK0191B502List)
			{
				String itnmItensOpafTokiAddCd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_ADD_CD);
				String itnmItensOpafTokiStaYmd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_STA_YMD);
				String itnmItensOpafTokiEndYmd = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.ITENS_OPAF_TOKI_END_YMD);
				// ・移転先開通後トーキ登録コードが'1'(移転先登録によるトーキ)
				// ・移転先開通後トーキ開始年月日が設定されている('20991231'以外)
				// ・移転先開通後トーキ終了年月日が設定されていない、または'20991231'が設定されている
				if (JKKSvcConst.ITNTOKI_ADD_CD_ADD.equals(itnmItensOpafTokiAddCd)
					&& !isEmptyDate(itnmItensOpafTokiStaYmd)
					&& isEmptyDate(itnmItensOpafTokiEndYmd))
				{
					Map<String, String> itnmSvcKeiUcwk = new HashMap<String, String>();
					String itnmSvcKeiNo = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_KEI_NO);
					String itnmSvcKeiUcwkNo = msgEKK0191B502.getString(EKK0191B502CBSMsg1List.SVC_KEI_UCWK_NO);
					String itnmSvcKeiUcwkGeneAddDtm= msgEKK0191B502.getString(EKK0191B502CBSMsg1List.GENE_ADD_DTM);
					// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
					String mskmDtlNo= msgEKK0191B502.getString(EKK0191B502CBSMsg1List.MSKM_DTL_NO);
					// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

					// 移転元移転トーキ開始終了判定コード
					itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_ITNTOKI_STA_END_JUDGE_CD,
							JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_END);
					// 移転元サービス契約番号
					itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_NO, itnmSvcKeiNo);
					// 移転元サービス契約内訳番号
					itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_NO, itnmSvcKeiUcwkNo);
					// 移転元サービス契約内訳世代登録年月日時分秒
					itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_GENE_ADD_DTM, itnmSvcKeiUcwkGeneAddDtm);
					// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
					// 移転元サービス契約内訳申込明細番号
					itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_MSKM_DTL_NO, mskmDtlNo);
					// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

					// 移転元サービス契約内訳リストに追加
					itnmSvcKeiUcwkList.add(itnmSvcKeiUcwk);
				}
			}
		}

		// 出力パラメータに判定結果を設定
		trgtData.put(JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD, itntokiStaEndJudgeCd);
		trgtData.put(JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD, dslTokiJssiChuCd);
		trgtData.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_LIST, itnmSvcKeiUcwkList);
	}

	/**
	 * サービス契約内訳＜eo光電話＞移転トーキ設定サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param trgtData 対象データ
	 * @param msgEKK0191A010 サービス契約内訳＜eo光電話＞一意照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private void addSvkeiuwEohTelItnToki(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
		HashMap<String, Object> trgtData, CAANMsg msgEKK0191A010)
	throws Throwable
	{
		// 出力パラメータ．移転トーキ開始終了判定コード
		String itntokiStaEndJudgeCd = (String)trgtData.get(JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD);
		// 出力パラメータ．移転元解約トーキ実施中コード
		String dslTokiJssiChuCd = (String)trgtData.get(JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD);

		// トーキを開始／終了する場合
		if (!JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_NON.equals(itntokiStaEndJudgeCd))
		{
			// 更新するトーキ開始終了情報
			Map<String, String> tokiStaEnd = new HashMap<String, String>();
	
			// サービス契約内訳＜eo光電話＞一意照会結果の値で初期化
			tokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_STA_YMD, msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_STA_YMD));
			tokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_END_YMD, msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_END_YMD));
			tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_STA_YMD, msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_STA_YMD));
			tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, msgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_END_YMD));
	
			// (1) 異動対象のサービス契約内訳に対しての移転先登録によるトーキ、移転元解約によるトーキ、休止によるトーキの開始／終了年月日を設定
			// 移転トーキ開始終了判定コードが'1'(移転先登録によるトーキの開始)の場合
			if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_STA.equals(itntokiStaEndJudgeCd))
			{
				tokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_STA_YMD, opeDate);
				tokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_END_YMD, null);
				// 移転元解約トーキ実施中コードが'1'(移転元解約によるトーキが実施中)の場合
				if (JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD_JSSI.equals(dslTokiJssiChuCd))
				{
					tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, opeDate);
				}
				// 移転元解約トーキ実施中コードが'2'(移転元解約によるトーキが予約中)の場合
				else if (JKKItntokiStaEndConstCC.DSL_TOKI_JSSI_CHU_CD_RSV.equals(dslTokiJssiChuCd))
				{
					tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_STA_YMD, opeDate);
					tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, opeDate);
				}
				else
				{
					// 移転元解約トーキへの更新はなし
				}
			}
			// 移転トーキ開始終了判定コードが'3'(移転元解約によるトーキの開始)の場合
			else if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_DSL_STA.equals(itntokiStaEndJudgeCd))
			{
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_STA_YMD, opeDate);
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, null);
			}
			// 移転トーキ開始終了判定コードが'4'(移転元解約によるトーキの終了)の場合
			else if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_DSL_END.equals(itntokiStaEndJudgeCd))
			{
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, opeDate);
			}
			// 移転トーキ開始終了判定コードが'5'(休止によるトーキの開始)の場合
			else if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_PAUSE_STA.equals(itntokiStaEndJudgeCd))
			{
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_STA_YMD, opeDate);
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, null);
			}
			// 移転トーキ開始終了判定コードが'6'(休止によるトーキの終了)の場合
			else if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_PAUSE_END.equals(itntokiStaEndJudgeCd))
			{
				tokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, opeDate);
			}
			else
			{
				// 上記以外の設定はない
			}

			// 上りマッピング処理
			HashMap<String, Object> inMap = this.mapper.editInMsgEKK0191C011(param, trgtData, opeDate, msgEKK0191A010, tokiStaEnd);
			// サービスインターフェース呼び出し
			CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0191C011CBSMsg().getContents());
			// 更新後の世代登録年月日時分秒(サービス契約内訳)を取得
			String kk0161GeneAddDtm = rsltMsg.getString(EKK0191C011CBSMsg.KK0161_GENE_ADD_DTM);
			// サービス契約内訳世代登録年月日時分秒に設定
			trgtData.put(JKKItntokiStaEndConstCC.SVC_KEI_UCWK_GENE_ADD_DTM, kk0161GeneAddDtm);
		}

		// (2) 移転元サービス契約内訳に対しての移転先登録によるトーキの開始／終了年月日を設定
		// 出力パラメータ．移転元サービス契約内訳リスト
		List<Map<String, String>> itnmSvcKeiUcwkList = (List<Map<String, String>>)trgtData.get(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_LIST);
		for (Map<String, String> itnmSvcKeiUcwk : itnmSvcKeiUcwkList)
		{
			// 移転元移転トーキ開始終了判定コード 
			String itnmItntokiStaEndJudgeCd = itnmSvcKeiUcwk.get(JKKItntokiStaEndConstCC.ITNM_ITNTOKI_STA_END_JUDGE_CD);
			// 移転元のサービス契約番号を取得
			String itnmSvcKeiNo = itnmSvcKeiUcwk.get(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_NO);
			// 移転元のサービス契約内訳番号を取得
			String itnmSvcKeiUcwkNo = itnmSvcKeiUcwk.get(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_NO);
			// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
			String mskmDtlNo= itnmSvcKeiUcwk.get(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_MSKM_DTL_NO);
			// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

			// サービス契約内訳＜eo光電話＞一意照会
			CAANMsg itnmMsgEKK0191A010 = searchSvkeiuwEohTel(handle, param, fixedText, itnmSvcKeiUcwkNo);

			// 更新するトーキ開始終了情報
			Map<String, String> itnmTokiStaEnd = new HashMap<String, String>();

			// サービス契約内訳＜eo光電話＞一意照会結果の値で初期化
			itnmTokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_STA_YMD, itnmMsgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_STA_YMD));
			itnmTokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_END_YMD, itnmMsgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_END_YMD));
			itnmTokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_STA_YMD, itnmMsgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_STA_YMD));
			itnmTokiStaEnd.put(EKK0191C011CBSMsg.DSL_PAUSE_TOKI_END_YMD, itnmMsgEKK0191A010.getString(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_END_YMD));
			// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 START
			// 移転元サービス契約内訳<eo光電話>一覧照会結果の申込明細番号を設定
			itnmTokiStaEnd.put(EKK0191C011CBSMsg.MSKM_DTL_NO, mskmDtlNo);
			// OM-2014-0002367 移転元の移転先登録トーキの転送先電話を強制解約すると回復できない 2014/07/14 END

			// 移転トーキ開始終了判定コードが'1'(移転先登録によるトーキの開始)の場合
			if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_STA.equals(itnmItntokiStaEndJudgeCd))
			{
				itnmTokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_STA_YMD, opeDate);
				itnmTokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_END_YMD, null);
			}
			// 移転トーキ開始終了判定コードが'2'(移転先登録によるトーキの終了)の場合
			else if (JKKItntokiStaEndConstCC.ITNTOKI_STA_END_JUDGE_CD_ITNS_END.equals(itnmItntokiStaEndJudgeCd))
			{
				itnmTokiStaEnd.put(EKK0191C011CBSMsg.ITENS_OPAF_TOKI_END_YMD, opeDate);
			}
			else
			{
				// 上記以外の設定はない
			}

			// 上りマッピング処理
			HashMap<String, Object> inMapItnm = this.mapper.editInMsgEKK0191C011(param, trgtData, opeDate, itnmMsgEKK0191A010, itnmTokiStaEnd);
			// サービスインターフェース呼び出し
			CAANMsg rsltMsgItnm = callSvcInter(handle, param, fixedText, inMapItnm, new EKK0191C011CBSMsg().getContents());

			// 更新後の世代登録年月日時分秒(サービス契約内訳)を取得
			String itnmKk0161GeneAddDtm = rsltMsgItnm.getString(EKK0191C011CBSMsg.KK0161_GENE_ADD_DTM);
			// 移転元サービス契約内訳世代登録年月日時分秒に設定
			itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_UCWK_GENE_ADD_DTM, itnmKk0161GeneAddDtm);

			// サービス契約一意照会
			CAANMsg msgEKK0081A010 = searchSvcKei(handle, param, fixedText, itnmSvcKeiNo);
			// サービス契約世代登録年月日時分秒を取得
			String itnmGeneAddDtm = msgEKK0081A010.getString(EKK0081A010CBSMsg1List.GENE_ADD_DTM);
			// 移転元サービス契約世代登録年月日時分秒に設定
			itnmSvcKeiUcwk.put(JKKItntokiStaEndConstCC.ITNM_SVC_KEI_GENE_ADD_DTM, itnmGeneAddDtm);
		}
	}

	/**
	 * 移転元サービス契約内訳＜eo光電話＞一覧照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param itensSvkeiuwNo 移転先サービス契約内訳番号
	 * @return 移転元サービス契約内訳＜eo光電話＞一覧照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg[] searchItnmSvkeiuwEohTel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String itensSvkeiuwNo)
	throws Throwable
	{
		CAANMsg[] msgEKK0191B502List = new CAANMsg[0];

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0191B502(param, opeDate, itensSvkeiuwNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0191B502CBSMsg().getContents());

		CAANMsg[] eKK0191B502CBSMSG1LIST = rsltMsg.getCAANMsgList(EKK0191B502CBSMsg.EKK0191B502CBSMSG1LIST);
		if (null != eKK0191B502CBSMSG1LIST)
		{
			msgEKK0191B502List = eKK0191B502CBSMSG1LIST;
		}

		return msgEKK0191B502List;
	}

	/**
	 * サービス契約内訳一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳一意照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg searchSvcKeiUcwk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo)
	throws Throwable
	{
		CAANMsg msgEKK0161A010 = new CAANMsg(EKK0161A010CBSMsg.class.getName());

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0161A010(param, opeDate, svcKeiUcwkNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0161A010CBSMsg().getContents());

		CAANMsg[] eKK0161A010CBSMSG1LIST = rsltMsg.getCAANMsgList(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
		if (null != eKK0161A010CBSMSG1LIST && 0 < eKK0161A010CBSMSG1LIST.length)
		{
			msgEKK0161A010 = eKK0161A010CBSMSG1LIST[0];
		}

		return msgEKK0161A010;
	}

	/**
	 * サービス契約内訳＜eo光電話＞一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return サービス契約内訳＜eo光電話＞一意照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg searchSvkeiuwEohTel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo)
	throws Throwable
	{
		CAANMsg msgEKK0191A010 = new CAANMsg(EKK0191A010CBSMsg.class.getName());

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0191A010(param, svcKeiUcwkNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0191A010CBSMsg().getContents());

		CAANMsg[] eKK0191A010CBSMSG1LIST = rsltMsg.getCAANMsgList(EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST);
		if (null != eKK0191A010CBSMSG1LIST && 0 < eKK0191A010CBSMSG1LIST.length)
		{
			msgEKK0191A010 = eKK0191A010CBSMSG1LIST[0];
		}

		return msgEKK0191A010;
	}

	/**
	 * サービス契約一意照会サービスインターフェースを呼び出します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約一意照会結果
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg searchSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String svcKeiNo)
	throws Throwable
	{
		CAANMsg msgEKK0081A010 = new CAANMsg(EKK0081A010CBSMsg.class.getName());

		// 上りマッピング処理
		HashMap<String, Object> inMap = this.mapper.editInMsgEKK0081A010(param, opeDate, svcKeiNo);
		// サービスインターフェース呼び出し
		CAANMsg rsltMsg = callSvcInter(handle, param, fixedText, inMap, new EKK0081A010CBSMsg().getContents());

		CAANMsg[] eKK0081A010CBSMSG1LIST = rsltMsg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		if (null != eKK0081A010CBSMSG1LIST && 0 < eKK0081A010CBSMSG1LIST.length)
		{
			msgEKK0081A010 = eKK0081A010CBSMSG1LIST[0];
		}

		return msgEKK0081A010;
	}

	/*
	 * --------------------------------------------------------------------------------------------
	 *  以下共通で使用するUtil系のメソッド ↓↓↓↓↓
	 * --------------------------------------------------------------------------------------------
	 */

	/**
	 * サービスインターフェース呼び出し処理です。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @param siInMap サービスインターフェースの入力マップ
	 * @param contents サービスインターフェースのテンプレート項目の配列
	 * @return 業務データ
	 * @throws Throwable 
	 */
	private CAANMsg callSvcInter(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			HashMap<String, Object> siInMap,
			Object[][] contents)
			throws Throwable
	{
		
		// サービスインターフェースの呼び出し
		Map<?, ?> rsltMap = this.scCall.run(siInMap, handle);
		// エラーマッピング処理
		this.mapper.editResultRP(rsltMap, param, fixedText, contents);
		// エラーチェック処理
		errChk(rsltMap);
		// 業務データ取得処理
		CAANMsg workData = getWorkCAANMsg(rsltMap);

		return workData;
	}

	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * @throws SCCallException 
	 */
	private void errChk(
			Map<?, ?> msgList) 
			throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = ERR_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}

	/**
	 * ユーザ定義文字列がユーザ情報になければデータを作成します。
	 * <br>
	 * @param param 業務データ取得用I/F
	 * @param workMapKey 業務データのマップキー
	 * @return true：作成した　False：存在していたため作成不要
	 * @throws RequestParameterException
	 */
	private boolean createUserData(IRequestParameterReadWrite param, String workMapKey)
			throws RequestParameterException
	{
		if (param.getData(workMapKey) == null)
		{
			param.setData(workMapKey, new HashMap<String, Object>());
			return true;
		}

		return false;
	}

	/**
	 * 年月日(YYYYMMDD)が空(有効な日付が設定されていない)かどうかを返します。
	 * <br>
	 * @param ymd 年月日
	 * @return 年月日がnull、空文字、'20991231'のいずれかの場合はtrue、そうでない場合はfalse
	 */
	private boolean isEmptyDate(String ymd)
	{
		if (null == ymd || ymd.isEmpty() || JKKStrConst.END_YMD_DEFAULT.equals(ymd))
		{
			return true;
		}

		return false;
	}

}
