/*********************************************************************
* All Rights reserve,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKMainSubKeiJudge
*   ソースファイル名：JKKMainSubKeiJudge.java
*   作成者          ：FJ）時見
*   日付            ：2015年10月20日
*＜機能概要＞
*   解約実行CCクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v20.00.00   2015/10/20   FJ）時見    新規作成
*   v20.01.00   2015/11/24   FJ）時見    IT1-2015-0000127
*   v20.02.00   2015/11/25   FJ）時見    IT2-2015-0000039
*   v20.03.00   2016/01/19   FJ）藤田    IT2-2016-0000003
*   v23.00.00   2016/03/02   FJ) 森脇    OM-2016-0000505 
*   v23.01.00   2016/04/25   FJ) 森脇    OM-2016-0001015 
*   v25.00.00   2016/06/28   FJ) 森脇    OM-2016-0001582 
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.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.model.base.CAANMsg;

import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateChecker;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B513CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0601B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091B002CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * 主従切替実行部品です。<p>
 * <br>
 * @author FJ
 */
public class JKKMainSubKeiJudge extends AbstractCommonComponent
{
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKMainSubKeiJudgeMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** SYSID */
	private String sys_Id;

	/** upddtm */
	private String upd_dtm;

	/** 料金プランコード主従切替対象 */

	private String pplanCdLastArray[] = {"1", "2", "3", "4", "5", "6"};
	
	/** 主従切替対象サービス契約番号 */
	private String mskj_Svc_Kei_No = null;

	/** サービスコード(TV) */
	private static final  String svcCdTv = "03";

	/** リターンコード設定(主従切替なし) */
	private static final  String retNoChange = "01";

	/** リターンコード設定(主従切替あり) */
	private static final  String retEnd = "00";

	/**
	 * 主従切替処理の初期処理です。
	 * 
	 * <br>
	 * @return void
	 * @throws Throwable 
	 */
	private void init()
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKMainSubKeiJudgeMapperCC();
		}
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}
	}

	/**
	 * 主従切替実行処理です。<br>
	 * パラメータのサービス契約番号に従って主従切替対象処理データを取得します。<br>
	 * <br>
	 * @param	handle		セッションハンドル
	 * @param	param		パラメータオブジェクト
	 * @param	fixedText	ユーザ任意文字列
	 * @return String	
	 * @throws	Throwable 
	 */
	@SuppressWarnings("unchecked")
	public String runMainSubKeijudge(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> inMap, String fixedText)
	throws Throwable
	{
		// 初期処理
		init();

		// パラメータサービス契約番号
		mskj_Svc_Kei_No  = (String)inMap.get("svc_kei_no");
		/**************************************************************************************/
		/** サービス契約一意照会実行処理                                                     **/
		/**************************************************************************************/
		CAANMsg msgEKK0081A010 = callEKK0081A010(handle,param,fixedText,mskj_Svc_Kei_No);
		sys_Id = msgEKK0081A010.getString("sysid");
		upd_dtm = msgEKK0081A010.getString("last_upd_dtm");
		if(!svcCdTv.equals(msgEKK0081A010.getString("svc_cd"))){
				return retNoChange;
		}

		/**************************************************************************************/
		/** サービス契約内訳主従切替一覧照会実行処理                                         **/
		/**************************************************************************************/
		CAANMsg[] msgEKK0161B513 = callEKK0161B513(handle, param, fixedText, mskj_Svc_Kei_No);
		// データが存在しない場合は処理終了
		if(msgEKK0161B513 == null ){
				return retNoChange;
		}
		/**************************************************************************************/
		/** 主従切替対象判定処理                                                             **/
		/**************************************************************************************/
		ArrayList<HashMap<String, Object>> allSvcKeiUcwkList = new ArrayList<HashMap<String, Object>>() ;
		
		// 全て課金が開始済みかの判定を行う
		boolean pastFuturExisteFlg = judgePlanChrgStaymd(msgEKK0161B513,allSvcKeiUcwkList);
		// 料金プランコードが主従切替対象なしの場合は処理終了
		if(0 == allSvcKeiUcwkList.size()){
				return retNoChange;
		}
		// 主従切替実行処理呼び出し
		if(!changeMainSub( handle,  param, fixedText, allSvcKeiUcwkList,pastFuturExisteFlg)){
				return retNoChange;
		}
		
		// 主従切替を行い正常終了
		return retEnd;
	}

	/**
	 * 主従切替切替実行処理<br>
	 * <br>
	 * @param	handle		セッションハンドル
	 * @param	param		パラメータオブジェクト
	 * @param	fixedText	ユーザ任意文字列
	 * @param	msgEKK0161B513	サービス契約内訳主従切替一覧
	 * @param	pastFuturExisteFlg	課金開始済未フラグ
	 * @return	boolean				
	 * @throws Throwable 
	 */
	private boolean changeMainSub(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			ArrayList<HashMap<String, Object>> msgEKK0161B513,
			boolean pastFuturExisteFlg
	) throws Throwable
	{
		String main_svc_kei_ucwk_no = null;
		boolean mainSubChangeFlg = false;
		int loopcount = 0;
		BigDecimal tmpAmnt = new BigDecimal(0);
		// OM-2016-0000505 ADD START
		HashMap<String, Object> reqMap = (HashMap<String, Object>)param.getData(fixedText);
		String idoRsvDtlCd = (String)reqMap.get("ido_rsv_dtl_cd");
		// OM-2016-0000505 ADD END

		for (HashMap<String, Object> EKK0161B513 : msgEKK0161B513){

// OM-2016-0000505 MOD START
//			// 課金開始済と未来課金どちらも存在する場合
//			if(pastFuturExisteFlg){
//				// 未来課金内訳情報は主にならない
//				if (EKK0161B513.get("pastFutureFlg").toString().equals("1")){
//					continue;
//				}
//			}
			// サービス開始時主従切替の場合
			if("030".equals(idoRsvDtlCd))
			{
				// 課金開始済と未来課金どちらも存在する場合
				if(pastFuturExisteFlg){
					// 未来課金内訳情報は主にならない
					if (EKK0161B513.get("pastFutureFlg").toString().equals("1")){
						continue;
					}
				}
			}
			else
			{
				// 未来課金内訳情報も主対象として保持
			}
// OM-2016-0000505 MOD END
			
			StringBuilder pplanBf = new StringBuilder();
			// 主の料金プランコード生成
			pplanBf = makePplanCd( EKK0161B513.get("pplan_cd").toString(),  true);
			
			/**************************************************************************************/
			/** 料金プラン固定単価（オプション申込料金）一覧照会処理                             **/
			/**************************************************************************************/
			CAANMsg msgEKK0601B001 = callGetPplanKttankaListSc(handle,param,fixedText,EKK0161B513.get("pcrs_cd").toString(),pplanBf.toString());

			BigDecimal amnt = new BigDecimal(msgEKK0601B001.getString("pplan_kotei_amnt"));
			// 料金が同じ場合は最小の機器製造番号のものとします。（サービス契約内訳は機器製造番号順に取得している）

			if(0 > tmpAmnt.compareTo(amnt) || 0 == loopcount)
			{
				tmpAmnt = amnt;
				main_svc_kei_ucwk_no = EKK0161B513.get("svc_kei_ucwk_no").toString();
			}
			loopcount++;
		}
		/**************************************************************************************/
		/** 主従切替処理                                                                     **/
		/**************************************************************************************/
		String last_upd_dtm = null;
		long upd_count = 0;

		for (HashMap<String, Object> EKK0161B513 : msgEKK0161B513){

// OM-2016-0001582 ADD START
			// 解約済レコードは主従切替対象としない
			String svcDslKisanYmd = (String)EKK0161B513.get("svc_dsl_kisan_ymd");

			if (!JKKStringUtil.isNullBlank(svcDslKisanYmd))
			{
				continue;
			}
// OM-2016-0001582 ADD END
// OM-2016-0000505 MOD START
//			// 20151125 IT2-2015-0000039 ADD START
//			// 課金開始済と未来課金どちらも存在する場合
//			if(pastFuturExisteFlg){
//				// 未来課金内訳情報は主従切替対象としない
//				if (EKK0161B513.get("pastFutureFlg").toString().equals("1")){
//					continue;
//				}
//			}
//			// 20151125 IT2-2015-0000039 ADD END
			// サービス開始時主従切替の場合
			if("030".equals(idoRsvDtlCd))
			{
				// 未来課金内訳情報も主従切替対象とする
			}
			else
			{
				// 課金開始済と未来課金どちらも存在する場合
				if(pastFuturExisteFlg){
					// 未来課金内訳情報は主従切替対象としない
					if (EKK0161B513.get("pastFutureFlg").toString().equals("1")){
						continue;
					}
				}
			}
// OM-2016-0000505 MOD END
			StringBuilder pplanBf = new StringBuilder();
			// 主の料金設定
			if(EKK0161B513.get("svc_kei_ucwk_no").equals(main_svc_kei_ucwk_no) )
			{
				// 主の料金プランコード生成
				pplanBf = makePplanCd( EKK0161B513.get("pplan_cd").toString(),  true);

				// 主従切替変更なしの場合は次の処理へ
				if(EKK0161B513.get("pplan_cd").toString().equals(pplanBf.toString())){
					continue;
				}
				
			} else{
				// 従の料金プランコード生成
				pplanBf = makePplanCd( EKK0161B513.get("pplan_cd").toString(),  false);

				// 主従切替変更なしの場合は次の処理へ
				if(EKK0161B513.get("pplan_cd").toString().equals(pplanBf.toString())){
					continue;
				}
			}

			if(upd_count == 0){
				last_upd_dtm = upd_dtm;
			}
			upd_count++;

			// IT2-2016-0000003 ADD START
// OM-2016-0000505 DEL START
//			HashMap<String, Object> reqMap = (HashMap<String, Object>)param.getData(fixedText);
// OM-2016-0000505 DEL END
			String stbPlanEndYmd = (String)reqMap.get("stb_plan_end_ymd");
			String kidoCD = (String)reqMap.get("kido_cd");
			// IT2-2016-0000003 ADD END
// OM-2016-0001582 DEL START
//			// OM-2016-0001015 ADD START
//			String svcDslKisanYmd = (String)EKK0161B513.get("svc_dsl_kisan_ymd");
//			// OM-2016-0001015 ADD END
// OM-2016-0001582 DEL END
			
			//変更前情報登録
			HashMap<String, Object> mapEKK0161C290bf = this.mapper.editInMsgEKK0161C290(
					param, 
					fixedText, 
					EKK0161B513.get("svc_kei_ucwk_no").toString(), 
					EKK0161B513.get("gene_add_dtm").toString(),
					EKK0161B513.get("plan_chrg_staymd").toString(),
					EKK0161B513.get("pplan_cd").toString(),
					// IT2-2016-0000003 ADD START
					stbPlanEndYmd,
					kidoCD,
					// IT2-2016-0000003 ADD END
					// OM-2016-0000505 ADD START
					idoRsvDtlCd,
					// OM-2016-0000505 ADD END
					// OM-2016-0001015 ADD START
					svcDslKisanYmd,
					// OM-2016-0001015 ADD END
					last_upd_dtm,
					"1");
			Map<?, ?> rsltEKK0161C290bf = this.scCall.run(mapEKK0161C290bf, handle);

			last_upd_dtm = this.mapper.editResultRPEKK0161C290(rsltEKK0161C290bf, param, fixedText, last_upd_dtm);
			errChk(rsltEKK0161C290bf);

			//変更後情報登録
			HashMap<String, Object> mapEKK0161C290af = this.mapper.editInMsgEKK0161C290(
					param, 
					fixedText, 
					EKK0161B513.get("svc_kei_ucwk_no").toString(), 
					EKK0161B513.get("gene_add_dtm").toString(),
					EKK0161B513.get("plan_chrg_staymd").toString(),
					pplanBf.toString(),
					// IT2-2016-0000003 ADD START
					stbPlanEndYmd,
					kidoCD,
					// IT2-2016-0000003 ADD END
					// OM-2016-0000505 ADD START
					idoRsvDtlCd,
					// OM-2016-0000505 ADD END
					// OM-2016-0001015 ADD START
					svcDslKisanYmd,
					// OM-2016-0001015 ADD END
					last_upd_dtm,
					"2");
			Map<?, ?> rsltEKK0161C290af = this.scCall.run(mapEKK0161C290af, handle);

			last_upd_dtm = this.mapper.editResultRPEKK0161C290(rsltEKK0161C290af, param, fixedText, last_upd_dtm);
			errChk(rsltEKK0161C290af);

			/**************************************************************************************/
			/** 進捗一覧照会処理                                                                 **/
			/**************************************************************************************/
			CAANMsg msgEKK1091B002 = callGetKktPrgListSc(handle,param,fixedText,mskj_Svc_Kei_No);
			
			/**************************************************************************************/
			/** 進捗登録処理                                                                     **/
			/**************************************************************************************/
			HashMap<String, Object> mapEKK1091D010 = this.mapper.editInMsgEKK1091D010(
					param,
					fixedText,
					mskj_Svc_Kei_No,
					EKK0161B513.get("svc_kei_ucwk_no").toString(),
					msgEKK1091B002
			);
			Map<?, ?> rsltEKK1091D010 = this.scCall.run(mapEKK1091D010, handle);
			this.mapper.editResultRPEKK1091D010(rsltEKK1091D010, param, fixedText);
			errChk(rsltEKK1091D010);

			mainSubChangeFlg = true;
			
		}

		// 変更があった場合のみ割引適用処理を行う
		if(mainSubChangeFlg){
			runMskjWrisvcAutoAply(handle,param,fixedText,main_svc_kei_ucwk_no);
		}
		
		return mainSubChangeFlg;
	}

	/**
	 * 割引適用処理を行う。
	 * @param	handle		セッションハンドル
	 * @param	param		パラメータオブジェクト
	 * @param	fixedText	ユーザ任意文字列
	 * @param	svcKeiUcwkNo	サービス契約番号
	 * @throws Throwable
	 */
	private void runMskjWrisvcAutoAply(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String svcKeiUcwkNo
	) throws Throwable
	{
		/**************************************************************************************/
		/** サービス契約内訳一意照会処理                                                     **/
		/**************************************************************************************/
		CAANMsg msgEKK0161A010 =  callEKK0161A010(handle, param, fixedText, svcKeiUcwkNo);
		/**************************************************************************************/
		/** 申込明細一意照会実行処理                                                         **/
		/**************************************************************************************/
		CAANMsg msgEKK0021A010 = callEKK0021A010(handle, param, fixedText, msgEKK0161A010.getString("mskm_dtl_no"));
		/**************************************************************************************/
		/** 申込一意照会実行処理                                                         **/
		/**************************************************************************************/
		CAANMsg msgEKK0011A010 = callEKK0011A010(handle, param, fixedText, msgEKK0021A010.getString("mskm_no"));
		/*************************************************************************************/
		/** 割引サービス自動適用ＣＣ実行                                                    **/
		/*************************************************************************************/
		String workWrisvcAutoAplyDataKey = "WrisvcAutoAplyCC";
		param.setData(workWrisvcAutoAplyDataKey, new HashMap<String, Object>());
				
		HashMap<String, Object> lpr = new HashMap<String, Object>();
		// ＳＹＳＩＤ
		lpr.put("sysid", sys_Id);
		// 登録／変更区分
		lpr.put("add_chge_div", "16");
		// 申込番号
		lpr.put("mskm_no", msgEKK0021A010.getString("mskm_no"));
		// 申込種別コード
		lpr.put("mskm_sbt_cd", msgEKK0011A010.getString("mskm_sbt_cd"));
		// 異動区分
		lpr.put("ido_div", msgEKK0161A010.getString("ido_div"));
		// 機能コード
		lpr.put("func_code", "1");
		// サービス解約理由コード
		lpr.put("svc_dlre_cd", "01");
		// サービス契約グループリスト
		ArrayList<HashMap<String, Object>> workSvcKeiArray = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> workSvcKeiMap = new HashMap<String, Object>();
		// グループ区分
		workSvcKeiMap.put("grp_div", "00");
		// サービス契約リスト
		ArrayList<HashMap<String, Object>> workSvcKeiList = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> workSvcKeiData = new HashMap<String, Object>();
		// 対象契約識別コード
		workSvcKeiData.put("tg_kei_skbt_cd", "03");
		// サービス契約内訳番号
		workSvcKeiData.put("svc_kei_ucwk_no", msgEKK0161A010.getString("svc_kei_ucwk_no"));
		// サービス契約内訳ステータス
		workSvcKeiData.put("svc_kei_ucwk_stat", msgEKK0161A010.getString("svc_kei_ucwk_stat"));
		// 料金コースコード
		workSvcKeiData.put("pcrs_cd", msgEKK0161A010.getString("pcrs_cd"));
		// 料金プランコード
		workSvcKeiData.put("pplan_cd", msgEKK0161A010.getString("pplan_cd"));
		
		workSvcKeiList.add(workSvcKeiData);
		workSvcKeiMap.put("svc_kei_list", workSvcKeiList);
		workSvcKeiArray.add(workSvcKeiMap);
		lpr.put("svc_kei_grp_list", workSvcKeiArray);
		
		// 割引サービス自動適用CC実行処理
		param.setData(workWrisvcAutoAplyDataKey, lpr);
		JKKWrisvcAutoAplyCC wrisvcAutoAplyCC = new JKKWrisvcAutoAplyCC();
		wrisvcAutoAplyCC.execute(handle, param, workWrisvcAutoAplyDataKey);
		
		param.removeData(workWrisvcAutoAplyDataKey);
	}

	/**
	 * 主従切替判定処理
	 * 
	 * @param msgEKK0161B513	主従切替判定対象データ
	 * @param allSvcKeiUcwkList
	 * @return	boolean
	 * @throws Throwable
	 */
	private boolean judgePlanChrgStaymd(
			CAANMsg[] msgEKK0161B513,
			ArrayList<HashMap<String, Object>> allSvcKeiUcwkList
			) throws Throwable	
	{
		int pastCount = 0;
		int futureCount = 0;
		for (CAANMsg msgEKK0161B513data : msgEKK0161B513){
			boolean judgePplanFlg = false;

			// 料金プランコードの末尾が主従切替対象外の場合はスキップする
			for (String pplanCdLast : pplanCdLastArray){
				if(pplanCdLast.equals(msgEKK0161B513data.getString("pplan_cd").substring(5,6))){
					judgePplanFlg = true;
					break;
				}
			}

			if(!judgePplanFlg){
				continue;
			}
			
			HashMap<String, Object> allucwkmap = new HashMap<String, Object>();
			
			allucwkmap.put("pcrs_cd", msgEKK0161B513data.getString("pcrs_cd"));
			allucwkmap.put("pplan_cd", msgEKK0161B513data.getString("pplan_cd"));
			allucwkmap.put("gene_add_dtm", msgEKK0161B513data.getString("gene_add_dtm"));
			allucwkmap.put("plan_chrg_staymd", msgEKK0161B513data.getString("plan_chrg_staymd"));
			// OM-2016-0001015 ADD START
			allucwkmap.put("svc_dsl_kisan_ymd", msgEKK0161B513data.getString("svc_dsl_kisan_ymd"));
			// OM-2016-0001015 ADD END
			allucwkmap.put("svc_kei_ucwk_no", msgEKK0161B513data.getString("svc_kei_ucwk_no"));
			allucwkmap.put("kiki_seizo_no", msgEKK0161B513data.getString("kiki_seizo_no"));
			//課金開始済み
			if(JPCDateChecker.isPastDate(msgEKK0161B513data.getString("plan_chrg_staymd"),JKKModelCommon.getOpeDate(msgEKK0161B513data) , "1")){
				allucwkmap.put("pastFutureFlg", "0");
				pastCount++;
			//未来課金
			}else{
				allucwkmap.put("pastFutureFlg", "1");
				futureCount++;
			}
			allSvcKeiUcwkList.add(allucwkmap);
		}
	
		if(pastCount > 0 && futureCount > 0){
			return true;
		}
		
		return false;
	}

	/**
	 * 料金プランコード作成処理
	 * 
	 * @param pplanCd		料金プランコード
	 * @param mainFlg		主フラグ(true = 主)
	 * @return	StringBuilder
	 * @throws Throwable
	 */
	private StringBuilder makePplanCd( String pplanCd,  boolean mainFlg) 
	{
		StringBuilder pplanBf = new StringBuilder();
		if (mainFlg){
			
			// 料金プランコードの末尾が「2」のとき末尾を「1」に編集します。
			if("2".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("1");
			}
			// 料金プランコードの末尾が「4」のとき末尾を「3」に編集します。
			else if("4".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("3");
			}
			// 料金プランコードの末尾が「6」のとき末尾を「5」に編集します。
			else if("6".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("5");
			}else{
				pplanBf.append(pplanCd);
			}
		}else{
			
			// 料金プランコードの末尾が「1」のとき末尾を「2」に編集します。
			if("1".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("2");
			}
			// 料金プランコードの末尾が「3」のとき末尾を「4」に編集します。
			else if("3".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("4");
			}
			// 料金プランコードの末尾が「5」のとき末尾を「6」に編集します。
			else if("5".equals(pplanCd.substring(5,6)))
			{
				pplanBf.append(pplanCd.substring(0,5));
				pplanBf.append("6");
			}else{
				pplanBf.append(pplanCd);
			}
		}
		
		return pplanBf;
	}
	
	/**
	 * サービス契約一意照会呼出
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo	サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callEKK0081A010(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0081A010 = this.mapper.editInMsgEKK0081A010(param, svcKeiNo);
		Map<?, ?> rsltEKK0081A010 = this.scCall.run(mapEKK0081A010, handle);
		this.mapper.editResultRPEKK0081A010(rsltEKK0081A010, param, fixedText);
		errChk(rsltEKK0081A010);

		// 業務データの取得
		CAANMsg workEKK0081A010 = getWorkCAANMsg(rsltEKK0081A010);
		CAANMsg[] msgEKK0081A010List = workEKK0081A010.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
		if (msgEKK0081A010List == null || msgEKK0081A010List.length == 0) {
			throw new CCException("", new SCCallException("主従切替：サービス契約一意照会 該当データなし", String.valueOf(9051), 8011));
		}
		return msgEKK0081A010List[0];
	}

	/**
	 * サービス契約内訳主従切替一覧照会呼出
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo		サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg[] callEKK0161B513(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0161B513 = this.mapper.editInMsgEKK0161B513(param, fixedText, svcKeiNo);
		Map<?, ?> rsltEKK0161B513 = this.scCall.run(mapEKK0161B513, handle);
		this.mapper.editResultRPEKK0161B513(rsltEKK0161B513, param, fixedText);
		errChk(rsltEKK0161B513);

		// 業務データの取得
		CAANMsg workEKK0161B513 = getWorkCAANMsg(rsltEKK0161B513);
		CAANMsg[] msgEKK0161B513List = workEKK0161B513.getCAANMsgList(EKK0161B513CBSMsg.EKK0161B513CBSMSG1LIST);
		if ( msgEKK0161B513List== null || msgEKK0161B513List.length == 0) {
			return null;
		}
		return msgEKK0161B513List;
	}

	/**
	 * 料金プラン固定単価（オプション申込料金）一覧照会SCを呼び出します。
	 * <br/>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param pcrsCd		料金コースコード
	 * @param pplanCd		料金プランコード
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callGetPplanKttankaListSc(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String pcrsCd,
			String pplanCd
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0601B001 = this.mapper.editInMsgEKK0601B001(param, pcrsCd, pplanCd);
		Map<?, ?> rsltEKK0601B001 = this.scCall.run(mapEKK0601B001, handle);
		this.mapper.editResultRPEKK0601B001(rsltEKK0601B001, param, fixedText);
		errChk(rsltEKK0601B001);

		// 業務データの取得
		CAANMsg workEKK0601B001 = getWorkCAANMsg(rsltEKK0601B001);
		CAANMsg[] msgEKK0601B001List = workEKK0601B001.getCAANMsgList(EKK0601B001CBSMsg.EKK0601B001CBSMSG1LIST);
		
		if (msgEKK0601B001List == null || msgEKK0601B001List.length == 0) {
			throw new CCException("", new SCCallException("主従切替：料金プラン固定単価（オプション申込料金）一覧照会 該当データなし", String.valueOf(9051), 8011));
		}
		return msgEKK0601B001List[0];
	}		

	/**
	 * 進捗一覧照会SCを呼び出します。
	 * <br/>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param svcKeiNo		サービス契約番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callGetKktPrgListSc(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String svcKeiNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK1091B002 = this.mapper.editInMsgEKK1091B002(param, svcKeiNo);
		Map<?, ?> rsltEKK1091B002 = this.scCall.run(mapEKK1091B002, handle);
		this.mapper.editResultRPEKK1091B002(rsltEKK1091B002, param, fixedText);
		errChk(rsltEKK1091B002);

		// 業務データの取得
		CAANMsg workEKK1091B002 = getWorkCAANMsg(rsltEKK1091B002);
		CAANMsg[] msgEKK1091B002List = workEKK1091B002.getCAANMsgList(EKK1091B002CBSMsg.EKK1091B002CBSMSG1LIST);
		
		if (msgEKK1091B002List == null || msgEKK1091B002List.length == 0) {
			return null;
		}
		return msgEKK1091B002List[0];
	}

	/**
	 * サービス契約内訳一意照会呼出
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param svcKeiUcwkNo	サービス契約内訳番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callEKK0161A010(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String svcKeiUcwkNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0161A010 = this.mapper.editInMsgEKK0161A010(param, svcKeiUcwkNo);
		Map<?, ?> rsltEKK0161A010 = this.scCall.run(mapEKK0161A010, handle);
		this.mapper.editResultRPEKK0161A010(rsltEKK0161A010, param, fixedText);
		errChk(rsltEKK0161A010);

		// 業務データの取得
		CAANMsg workEKK0161A010 = getWorkCAANMsg(rsltEKK0161A010);
		CAANMsg[] msgEKK0161A010List = workEKK0161A010.getCAANMsgList(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
		
		if (msgEKK0161A010List == null || msgEKK0161A010List.length == 0) {
			throw new CCException("", new SCCallException("主従切替：サービス契約内訳一意 該当データなし", String.valueOf(9051), 8011));
		}
		return msgEKK0161A010List[0];
	}

	/**
	 * 申込一意照会を実施する
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param mskmNo	申込番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callEKK0011A010(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String mskmNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0011A010 = this.mapper.editInMsgEKK0011A010(param, mskmNo);
		Map<?, ?> rsltEKK0011A010 = this.scCall.run(mapEKK0011A010, handle);
		this.mapper.editResultRPEKK0011A010(rsltEKK0011A010, param, fixedText);
		errChk(rsltEKK0011A010);

		// 業務データの取得
		CAANMsg workEKK0011A010 = getWorkCAANMsg(rsltEKK0011A010);
		CAANMsg[] msgEKK0011A010List = workEKK0011A010.getCAANMsgList(EKK0011A010CBSMsg.EKK0011A010CBSMSG1LIST);
		
		if (msgEKK0011A010List == null || msgEKK0011A010List.length == 0) {
			throw new CCException("", new SCCallException("主従切替：申込一意照会 該当データなし", String.valueOf(9051), 8011));
		}
		return msgEKK0011A010List[0];

	}

	/**
	 * 申込明細一意照会を実施する
	 *
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param mskmDtlNo		申込明細番号
	 * @return CAANMsg
	 * @throws Throwable
	 */
	private CAANMsg callEKK0021A010(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String mskmDtlNo
	) throws Throwable
	{
		HashMap<String, Object> mapEKK0021A010 = this.mapper.editInMsgEKK0021A010(param, mskmDtlNo);
		Map<?, ?> rsltEKK0021A010 = this.scCall.run(mapEKK0021A010, handle);
		this.mapper.editResultRPEKK0021A010(rsltEKK0021A010, param, fixedText);
		errChk(rsltEKK0021A010);

		// 業務データの取得
		CAANMsg workEKK0021A010 = getWorkCAANMsg(rsltEKK0021A010);
		CAANMsg[] msgEKK0021A010List = workEKK0021A010.getCAANMsgList(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST);
		
		if (msgEKK0021A010List == null || msgEKK0021A010List.length == 0) {
			throw new CCException("", new SCCallException("主従切替：申込明細一意照会 該当データなし", String.valueOf(9051), 8011));
		}
		
		return msgEKK0021A010List[0];
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private static CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}

	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private static 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 = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
}
	