/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKWrisvcHktgiSetCC
*   ソースファイル名：JKKWrisvcHktgiSetCC.java
*   作成者          ：FJ
*   日付            ：2012年09月21日
*＜機能概要＞
*   割引サービスの引継設定を行う。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v4.00.00	2012/09/18	FJ			新規作成
*	v4.00.01	2012/10/23   富士通		ANK-1223-00-00
*	v4.00.02	2012/11/06   富士通		SEP-0020-00-00
*	v4.00.03	2012/11/29   富士通		IT1-2012-0002276
*	v6.00.00	2013/12/22   富士通		OM-2013-0005053
*	v9.00.00	2014/06/19   富士通		IT2-2014-0000260
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg;

/**
 * 割引サービス引継設定クラス
 * 
 * @author 富士通
 */
public class JKKWrisvcHktgiSetCC extends AbstractCommonComponent
{

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKWrisvcHktgiSetCCMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;

	/** 割引サービス引継設定クラス用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	/** 引継ぎ元サービス契約の情報取得 */
	private HashMap<String, Object> motoSvcKeiMap = null;
	/** 引継ぎ元機器提供サービス契約リスト内の各引継ぎ元機器提供サービス契約情報 */
	private HashMap<String, Object> motoKktkSvcKeiMap = null;
	/** 引継ぎ先サービス契約の情報取得 */
	private HashMap<String, Object> sakiSvcKeiMap = null;
	/** 引継ぎ先機器提供サービス契約リスト内の各引継ぎ先機器提供サービス契約情報 */
	private HashMap<String, Object> sakiKktkSvcKeiMap = null;
	
	// -----------------------------------------------------
	// 内部使用キー項目
	/** 引継ぎ元割引サービス契約番号候補リスト　Map設定キー */
	private static final String WRIB_SVC_KEI_NO_LIST = "WRIB_SVC_KEI_NO_LIST";

	/** 引継ぎ元割引サービス契約　Map設定キー */
	private static final String MOTO_KK_T_WRIB_SVC_KEI = "MOTO_KK_T_WRIB_SVC_KEI";

	/** 引継ぎ元割引サービス対象契約　Map設定キー */
	private static final String MOTO_KK_T_WRISVC_TG_KEI = "MOTO_KK_T_WRISVC_TG_KEI";

	/** 引継ぎ元割引サービス契約内訳　Map設定キー */
	private static final String MOTO_KK_T_WRISVC_KEI_UCWK = "MOTO_KK_T_WRISVC_KEI_UCWK";

	/** 引継ぎ先割引サービス契約　Map設定キー */
	private static final String SAKI_KK_T_WRIB_SVC_KEI = "SAKI_KK_T_WRIB_SVC_KEI";

	/** 引継ぎ先割引サービス対象契約　Map設定キー */
	private static final String SAKI_KK_T_WRISVC_TG_KEI = "SAKI_KK_T_WRISVC_TG_KEI";

	/** 引継ぎ先割引サービス契約内訳　Map設定キー */
	private static final String SAKI_KK_T_WRISVC_KEI_UCWK = "SAKI_KK_T_WRISVC_KEI_UCWK";

	/** 引継ぎ先サービス契約　Map設定キー */
	private static final String SAKI_SVC_KEI = "SAKI_SVC_KEI";
	/** 引継ぎ先機器提供サービス契約　Map設定キー */
	private static final String SAKI_KKTK_SVC_KEI = "SAKI_KKTK_SVC_KEI";
	/** 引継ぎ先オプションサービス契約番号　Map設定キー */
	private static final String SAKI_OPT_SVC_KEI_NO = "SAKI_OPT_SVC_KEI_NO";
	// -----------------------------------------------------

	// -----------------------------------------------------
	// コード関連
	/** 割賦契約割引の割引サービスタイプ[42] */
	private static final String KAP_KEI_ERIB = "42";

	/** 04.承認済 */
	private static final String SHONINZM = "04";
	
	/** 01.通常解約 */
	private static final String TUJYO_DSL = "01";

	/** 05.その他理由によるキャンセル */
	private static final String SONOTA_RSN_CANCEL = "05";

	// SEP-0020-00-00 ADD Start
	/** 1:自動算出する */
	private static final String AUTO_CNT_ON = "1";
	// SEP-0020-00-00 ADD End
	// v6.00.00 MOD Start
	/** 0:自動算出しない */
	private static final String AUTO_CNT_OFF = "0";
	// v6.00.00 MOD End

	// 引継ぎ元割引サービス契約ステータス
	private String motoWribSvcKeiStat = "";
	
	// -----------------------------------------------------

	/**
	 * 割引割引登録契機コード（自動適用）
	 */
	private static final String WRIB_ADD_OPTY_CD_AUTO_APLY = "1";

	/**
	 * デバッグログを出力します。<BR>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	/**
	 * 割引サービスの引継設定を実施する
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable
	{
		printlnEjbLog("execute start");
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKWrisvcHktgiSetCCMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		inMap = (HashMap<String, Object>)param.getData(fixedText);
		printlnEjbLog("fixedText=" + fixedText);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		ccWorkMap = new HashMap();
		// 割引サービス引継設定クラス用の作業領域
		workMap.put(this.getClass().getName(), ccWorkMap);

		// 入力データチェック
		chkInMap(handle, param);
		
		// 引継ぎ可否判定
		if (!jdgHktgi(handle, param))
		{
			// 割引サービス引継設定クラス用の作業領域のクリア
			workMap.remove(this.getClass().getName());
			printlnEjbLog("引継ぎ対象外 引継ぎ可否判定=false");
			printlnEjbLog("execute end");
			return param;
		}

		// 引継ぎ元割引サービス契約番号取得
		getWrisvcTgkei(handle, param);
		ArrayList<String> trgt = (ArrayList<String>)this.ccWorkMap.get(WRIB_SVC_KEI_NO_LIST);
		if (trgt == null || trgt.size() == 0)
		{
			printlnEjbLog("引継ぎ元サービス契約に紐づく割引サービス対象契約が存在しません。");
			//throw new CCException("引継ぎ元サービス契約に紐づく割引サービス対象契約が存在しません。", new Exception());
			return param;
		}

		// 引継ぎ元割引サービス契約情報取得
		getHktgiMtWribsvcInfo(handle, param);
		if (this.ccWorkMap.get(MOTO_KK_T_WRIB_SVC_KEI) == null)
		{
			printlnEjbLog("引継ぎ元サービス契約に紐づく割引サービス契約内に割賦契約が存在しません。");
			printlnEjbLog("execute end");
			return param;
		}
		printlnEjbLog("ccWorkMap=" + ccWorkMap.toString());

		// オプションサービス判定
		if (jdgOpsvkei(handle, param))
		{
			// 引継ぎ元割引サービス情報の解約（キャンセル）
			dslHktgiMtWrisvcInfo(handle, param);
			printlnEjbLog("ccWorkMap=" + ccWorkMap.toString());

			// 引継ぎ先割引サービス情報の登録
			addHktgiSkWrisvcInfo(handle, param);
			printlnEjbLog("ccWorkMap=" + ccWorkMap.toString());
			
			if (JKKStrConst.CD00055_SVCTK_CHU.equals(this.motoWribSvcKeiStat))
			{
				// 引継ぎ先割引サービス情報の更新
				updHktgiSkWrisvcInfo(handle, param);
				printlnEjbLog("ccWorkMap=" + ccWorkMap.toString());
			}
		}
		else
		{
			// 引継ぎ元割引サービス情報の解約（キャンセル）
			dslHktgiMtWrisvcInfo(handle, param);
			printlnEjbLog("ccWorkMap=" + ccWorkMap.toString());
		}

		// 割引サービス引継設定クラス用の作業領域のクリア
		workMap.remove(this.getClass().getName());
		
		printlnEjbLog("execute end");
		return param;
	}

	/**
	 * 入力データをチェックします。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @return true:引継ぎ可能、false：引継ぎ不可
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("chkInMap start");
		
		// 引継ぎ元サービス契約の情報取得
		this.motoSvcKeiMap = (HashMap<String, Object>)inMap.get("MOTO_KK_T_SVC_KEI");
		if (this.motoSvcKeiMap != null)
		{
			printlnEjbLog("引継ぎ元サービス契約=" + this.motoSvcKeiMap.toString());
		}
		else
		{
			printlnEjbLog("引継ぎ元サービス契約=NULL");
			throw new CCException("引継ぎ元サービス契約=NULL", new Exception());
		}
		String motoSvcKeiNo = ((String)this.motoSvcKeiMap.get("SVC_KEI_NO"));
		if (motoSvcKeiNo == null || "".equals(motoSvcKeiNo.trim()))
		{
			printlnEjbLog("引継ぎ元サービス契約．サービス契約番号=未設定");
			throw new CCException("引継ぎ元サービス契約．サービス契約番号=未設定", new Exception());
		}
		
		// 引継ぎ元機器提供サービス契約リストの情報取得
		ArrayList<HashMap> motoKktkSvcKeiList = (ArrayList<HashMap>)inMap.get("MOTO_KK_T_KKTK_SVC_KEI_List");
		if (motoKktkSvcKeiList != null)
		{
			// 引継ぎ元機器提供サービス契約リスト内の各引継ぎ元機器提供サービス契約情報
			printlnEjbLog("引継ぎ元機器提供サービス契約=" + motoKktkSvcKeiList.toString());
			for (int i = 0; i < motoKktkSvcKeiList.size(); i++)
			{
				this.motoKktkSvcKeiMap = motoKktkSvcKeiList.get(i);
			}
			if (this.motoKktkSvcKeiMap == null)
			{
				throw new CCException("引継ぎ元機器提供サービス契約=NULL", new Exception());
			}
			String motoKktkSvcKeiNo = ((String)this.motoKktkSvcKeiMap.get("KKTK_SVC_KEI_NO"));
			if (motoKktkSvcKeiNo == null || "".equals(motoKktkSvcKeiNo.trim()))
			{
				printlnEjbLog("引継ぎ元機器提供サービス契約．機器提供サービス契約番号=未設定");
				throw new CCException("引継ぎ元機器提供サービス契約．機器提供サービス契約番号=未設定", new Exception());
			}
		}
		else
		{
			printlnEjbLog("引継ぎ元機器提供サービス契約=NULL");
			throw new CCException("引継ぎ元機器提供サービス契約=NULL", new Exception());
		}
		
		
		// 引継ぎ先サービス契約の情報取得
		// 引継ぎ元機器提供サービス契約リスト内の各引継ぎ元機器提供サービス契約情報
		this.sakiSvcKeiMap = (HashMap<String, Object>)inMap.get("SAKI_KK_T_SVC_KEI");
		if (this.sakiSvcKeiMap != null)
		{
			printlnEjbLog("引継ぎ先サービス契約=" + this.sakiSvcKeiMap.toString());
			this.ccWorkMap.put(SAKI_SVC_KEI, sakiSvcKeiMap);
		}
		else
		{
			printlnEjbLog("引継ぎ先サービス契約=NULL");
			throw new CCException("引継ぎ先サービス契約=NULL", new Exception());
		}
		String sakiSvcKeiNo = ((String)this.sakiSvcKeiMap.get("SVC_KEI_NO"));
		if (sakiSvcKeiNo == null || "".equals(sakiSvcKeiNo.trim()))
		{
			printlnEjbLog("引継ぎ先サービス契約．サービス契約番号=未設定");
			throw new CCException("引継ぎ先サービス契約．サービス契約番号=未設定", new Exception());
		}
		
		// 引継ぎ先機器提供サービス契約リストの情報取得
		ArrayList<HashMap> sakiKktkSvcKeiList = (ArrayList<HashMap>)inMap.get("SAKI_KK_T_KKTK_SVC_KEI_List");
		if (sakiKktkSvcKeiList != null)
		{
			// 引継ぎ先機器提供サービス契約リスト内の各引継ぎ先機器提供サービス契約情報
			printlnEjbLog("引継ぎ先機器提供サービス契約=" + sakiKktkSvcKeiList.toString());
			for (int i = 0; i < sakiKktkSvcKeiList.size(); i++)
			{
				this.sakiKktkSvcKeiMap = sakiKktkSvcKeiList.get(i);
				this.ccWorkMap.put(SAKI_KKTK_SVC_KEI, sakiKktkSvcKeiList);
			}
			if (this.sakiKktkSvcKeiMap == null)
			{
				throw new CCException("引継ぎ先機器提供サービス契約=NULL", new Exception());
			}
			String sakiKktkSvcKeiNo = ((String)this.sakiKktkSvcKeiMap.get("KKTK_SVC_KEI_NO"));
			if (sakiKktkSvcKeiNo == null || "".equals(sakiKktkSvcKeiNo.trim()))
			{
				printlnEjbLog("引継ぎ先機器提供サービス契約．機器提供サービス契約番号=未設定");
				throw new CCException("引継ぎ先機器提供サービス契約．機器提供サービス契約番号=未設定", new Exception());
			}
		}
		else
		{
			printlnEjbLog("引継ぎ先機器提供サービス契約=NULL");
			throw new CCException("引継ぎ先機器提供サービス契約=NULL", new Exception());
		}
		
		printlnEjbLog("chkInMap end");
	}
		
	/**
	 * 「eo光ネット」の契約であるか、引継ぎ可能のステータスであるか判定します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @return true:引継ぎ可能、false：引継ぎ不可
	 * @throws Throwable 
	 */
	private boolean jdgHktgi(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("jdgHktgi start");
		
		// 引継ぎ元でチェック
		boolean ret = this.mapper.callEKK0091A010((String)this.motoSvcKeiMap.get("SVC_KEI_NO"));
		if (!ret)
		{
			printlnEjbLog("引継ぎ元サービス契約＜eo光ネット＞一意照会結果がNULL");
			printlnEjbLog("jdgHktgi end");
			return false;
		}

		// 引継ぎ元サービス契約のステータス
		// 引継ぎ元サービス契約の情報取得
		String mSvcKeiStat = (String)this.motoSvcKeiMap.get("SVC_KEI_STAT");
		if (!JKKStrConst.CD00037_SVCTK_CHU.equals(mSvcKeiStat))
		{
			printlnEjbLog("引継ぎ元サービス契約番号ステータス=" + mSvcKeiStat);
			printlnEjbLog("jdgHktgi end");
			return false;
		}
		
		// 引継ぎ先でチェック
		boolean ret2 = this.mapper.callEKK0091A010((String)this.sakiSvcKeiMap.get("SVC_KEI_NO"));
		if (!ret2)
		{
			printlnEjbLog("引継ぎ先サービス契約＜eo光ネット＞一意照会結果がNULL");
			printlnEjbLog("jdgHktgi end");
			return false;
		}

		// 引継ぎ先サービス契約のステータス
		// 引継ぎ先サービス契約の情報取得
		String sSvcKeiStat = (String)this.sakiSvcKeiMap.get("SVC_KEI_STAT");
		if (!JKKStrConst.CD00037_SVCTK_CHU.equals(sSvcKeiStat))
		{
			printlnEjbLog("引継ぎ先サービス契約番号ステータス=" + sSvcKeiStat);
			printlnEjbLog("jdgHktgi end");
			return false;
		}
		
		printlnEjbLog("jdgHktgi end");
		return true;
	}

	/**
	 * 引継ぎ元の割引サービス対象契約を取得します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	private void getWrisvcTgkei(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("getWrisvcTgkei start");
		
		// サービス契約番号を元に割引サービス契約番号を取得する
		CAANMsg[] rsltList = 
			this.mapper.callEKK0481B001(JKKWrisvcHktgiSetCCMapper.typeSvcKeiNo, (String)this.motoSvcKeiMap.get("SVC_KEI_NO"));
		
		// １サービス契約番号に対して複数の割引サービス契約番号がある。
		Set<String> set = new HashSet<String>();
		for (CAANMsg row : rsltList)
		{
			String svcKeiNo = row.getString("wrib_svc_kei_no");
			printlnEjbLog("引継ぎ元の割引サービス対象契約のサービス契約番号＝" + svcKeiNo);

			set.add(svcKeiNo);
		}
		
		this.ccWorkMap.put(WRIB_SVC_KEI_NO_LIST, new ArrayList<String>(set));
		printlnEjbLog("getWrisvcTgkei end");
	}

	/**
	 * 引継ぎ元の割引サービス契約を取得します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void getHktgiMtWribsvcInfo(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("getHktgiMtWribsvcInfo start");
		// 可能性のある割引サービス契約番号
		ArrayList<String> warbSvcKeiNoList = (ArrayList<String>)this.ccWorkMap.get(WRIB_SVC_KEI_NO_LIST);
		
		// 割引サービス契約の特定取得
		for (String wribSvckeiNo : warbSvcKeiNoList)
		{
			// 割引サービス契約を一意照会する
			CAANMsg wribSvcKeiInfo = this.mapper.callEKK0451A010(wribSvckeiNo);
			String wribSvcCd = wribSvcKeiInfo.getString("wrib_svc_cd");
			
			// 割引サービスを取得して割引サービスタイプを取得する
			CAANMsg wribSvcInfo = this.mapper.callEKK0841A010(wribSvcCd);
			String wribTypeCd = wribSvcInfo.getString("wrib_type_cd");
			
			if (KAP_KEI_ERIB.equals(wribTypeCd))
			{
// v9.00.00 ADD START
				
				// 条件追加：割賦割引特定だけで処理抜けてはならない.
				if (!isKapWriKiki(wribSvcKeiInfo)) continue;
// v9.00.00 ADD END
				
				// 割賦契約であった割引サービス契約を作業領域に保持
				this.ccWorkMap.put(MOTO_KK_T_WRIB_SVC_KEI, wribSvcKeiInfo);
				printlnEjbLog("getHktgiMtWribsvcInfo 引継ぎ元割引サービス契約番号＝" + wribSvckeiNo);
				break;
			}
		}

		if (!this.ccWorkMap.containsKey(MOTO_KK_T_WRIB_SVC_KEI))
		{
			printlnEjbLog("引継ぎ元の割引サービス対象契約の候補内に割賦契約なし");
			printlnEjbLog("getHktgiMtWribsvcInfo end");
			return;
		}
		CAANMsg wribSvcKeiInfo = (CAANMsg)this.ccWorkMap.get(MOTO_KK_T_WRIB_SVC_KEI);
		String wribSvckeiNo =  wribSvcKeiInfo.getString("wrib_svc_kei_no");
		String wribSvcStat = wribSvcKeiInfo.getString("wrib_svc_kei_stat");
		if (JKKStrConst.CD00055_UKZM.equals(wribSvcStat) || JKKStrConst.CD00055_SVCTK_CHU.equals(wribSvcStat))
		{
			// 受付済、サービス提供中を対象とする。
			this.motoWribSvcKeiStat = wribSvcKeiInfo.getString("wrib_svc_kei_stat");
		}
		else
		{
			this.ccWorkMap.remove(MOTO_KK_T_WRIB_SVC_KEI);
			return;
		}
		
		// 割引サービス対象契約を一覧照会する
		// 割引サービス契約番号を元に割引サービス対象契約を取得する
		CAANMsg[] wribsvcTgKeiList = 
			this.mapper.callEKK0481B001(JKKWrisvcHktgiSetCCMapper.typeWribSvcKeiNo, wribSvckeiNo);
		
		// 割賦契約であった割引サービス対象契約を作業領域に保持
		this.ccWorkMap.put(MOTO_KK_T_WRISVC_TG_KEI, wribsvcTgKeiList);
		
		// 割引サービス契約内訳
		CAANMsg[] wrisvcKeiUcwkList = this.mapper.callEKK2361B010(wribSvckeiNo);
		// 割賦契約であった割引サービス契約内訳を作業領域に保持
		this.ccWorkMap.put(MOTO_KK_T_WRISVC_KEI_UCWK, wrisvcKeiUcwkList);
		printlnEjbLog("getHktgiMtWribsvcInfo end");
	}

	/**
	 * 引継ぎ元、引継ぎ先のオプションサービス契約が同構成か判定します。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	private boolean jdgOpsvkei(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("jdgOpsvkei start");
//		boolean motoOpt = false;
		boolean sakiOpt = false;
		
		// 割引としては、
		// 1.ネット（サービス契約）
		// 2.端末機器（機器提供サービス契約）
		// 3.プレミアムオプション（オプションサービス契約）
		// の３つがそろっていないと割賦割引として成立しない。
		// ネットは既に存在している前提、端末機器に関しては引き継がれる為、考慮しない。
		// プレミアムオプションに関しては、引継ぎ元には、基本的に存在（オプションの解約を行わない限り）
		// 引継ぎ先に対してプレミアムオプションが存在しない場合は、割引の引継ぎ処理を行わず、
		// 引継ぎ元の解約（キャンセル）処理を実施する。
		
		// 引継ぎ先
		// 引継ぎ先サービス契約の情報取得
		CAANMsg[] sakiOptSvcKeiList = this.mapper.callEKK0351B002((String)this.sakiSvcKeiMap.get("SVC_KEI_NO"));
		
		for (CAANMsg row : sakiOptSvcKeiList)
		{
			String opSvcCd = row.getString("op_svc_cd");
			
			if (JKKStrConst.OP_SVC_CD_SMARTLINK_PREMIUM.equals(opSvcCd))
			{
				if (JKKStrConst.CD00037_DSL_ZM.equals(row.getString("op_svc_kei_stat")) ||
					JKKStrConst.CD00037_CANCEL_ZM.equals(row.getString("op_svc_kei_stat")))
				{
					// 解約、キャンセルの場合
					continue;
				}
				sakiOpt = true;
				this.ccWorkMap.put(SAKI_OPT_SVC_KEI_NO, row.getString("op_svc_kei_no"));
				printlnEjbLog("引継ぎ先　オプションサービス契約番号＝" + row.getString("op_svc_kei_no"));
				
				break;
			}
		}
		
//		// 引継ぎ元
//		String opSvcKeiNo = "";
//		CAANMsg[] wribsvcTgKeiList = (CAANMsg[])this.ccWorkMap.get(MOTO_KK_T_WRISVC_TG_KEI);
//		for (CAANMsg row : wribsvcTgKeiList)
//		{
//			String tmp = row.getString("op_svc_kei_no");
//			if (tmp == null || "".equals(tmp))
//			{
//				continue;
//			}
//			opSvcKeiNo = tmp;
//		}
//		
//		// 引継ぎ元サービス契約の情報取得
//		if (!"".equals(opSvcKeiNo))
//		{
//			CAANMsg[] motoOptSvcKeiList = this.mapper.callEKK0351B002((String)this.motoSvcKeiMap.get("SVC_KEI_NO"));
//			
//			for (CAANMsg row : motoOptSvcKeiList)
//			{
//				String opSvcCd = row.getString("op_svc_cd");
//				String nowOpSvcKeiNo = row.getString("op_svc_kei_no");
//				
//				if (!opSvcKeiNo.equals(nowOpSvcKeiNo))
//				{
//					continue;
//				}
//				
//				if (JKKStrConst.OP_SVC_CD_SMARTLINK_PREMIUM.equals(opSvcCd))
//				{
//					if (OPT_SVC_KEI_STAT_SVC_KAIYAKU_ZM.equals(row.getString("op_svc_kei_stat")) ||
//						OPT_SVC_KEI_STAT_SVC_CANCEL_ZM.equals(row.getString("op_svc_kei_stat")))
//					{
//						// 解約、キャンセルの場合
//						continue;
//					}
//					motoOpt = true;
//					
//					break;
//				}
//			}
//		}
//		
//		printlnEjbLog("引継ぎ元＝" + motoOpt);
		printlnEjbLog("引継ぎ先＝" + sakiOpt);
		
		// 引継ぎ元、引継ぎ先のオプション契約状態が同一であること
		if (sakiOpt)
		{
			printlnEjbLog("オプションサービス契約が存在。");
			printlnEjbLog("jdgOpsvkei end");
			return sakiOpt;
		}
		
		printlnEjbLog("オプションサービス契約が存在しない。");
		printlnEjbLog("jdgOpsvkei end");
		return sakiOpt;
	}


	/**
	 * 申込、申込明細の登録を行います。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	private String addMskm(SessionHandle handle, IRequestParameterReadWrite param, String sysid) throws Throwable
	{
		printlnEjbLog("addMskm start");
		// 申込、申込明細の登録
		CAANMsg mskmRslt = this.mapper.callEKK0011D020(sysid, JKKStrConst.MSKM_SBT_CD_WARIB_MSKM, SHONINZM);
		
		String updDtmBf = mskmRslt.getString("upd_dtm");
		CAANMsg mskmDtl = mskmRslt.getCAANMsgList("EKK0011D020CBSMsg1List")[0];
		String mskmDtlNo = mskmDtl.getString("mskm_dtl_no");

		// 申込明細の更新
		this.mapper.callEKK0021C060(mskmDtlNo, updDtmBf);
		
		printlnEjbLog("addMskm end");
		return mskmDtlNo;
	}

	/**
	 * 引継ぎ元の割引サービス情報の解約（キャンセル）を行います。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	private void dslHktgiMtWrisvcInfo(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("dslHktgiMtWrisvcInfo start");
		// 引継ぎ元サービス契約の情報取得
		String sysid = (String)this.motoSvcKeiMap.get("SYSID");
		String svcKeiNo = (String)this.motoSvcKeiMap.get("SVC_KEI_NO");
		
		// 申込明細番号
		String mskmDtlNo = addMskm(handle, param, sysid);
		printlnEjbLog("申込明細番号＝" + mskmDtlNo);
		
		CAANMsg wribSvcKei = (CAANMsg)this.ccWorkMap.get(MOTO_KK_T_WRIB_SVC_KEI);
		String wribSvcKeiNo = wribSvcKei.getString("wrib_svc_kei_no");
		
		// 割引サービス契約一意照会
		CAANMsg svcKei = this.mapper.callEKK0451A010(wribSvcKeiNo);
		String updDtmBf = svcKei.getString("last_upd_dtm");
		
		if (JKKStrConst.CD00055_UKZM.equals(this.motoWribSvcKeiStat))
		{
			// 受付済　→　キャンセル
			this.mapper.callEKK0451C070(wribSvcKeiNo, 
					mskmDtlNo,
					SONOTA_RSN_CANCEL,		// その他
					JKKStrConst.CD00576_WRIB_INF_ADD,
					WRIB_ADD_OPTY_CD_AUTO_APLY,
					updDtmBf);
		}
		else if (JKKStrConst.CD00055_SVCTK_CHU.equals(this.motoWribSvcKeiStat))
		{
			
// SEP-0020-00-00 ADD Start
			String svcChrgStaymd = svcKei.getString("svc_chrg_staymd");
// SEP-0020-00-00 ADD End
			
// SEP-0020-00-00 MOD Start
//			CAANMsg wribSvcKeiDsl = this.mapper.callEKK0451C020(wribSvcKeiNo, 
//																mskmDtlNo, 
//																TUJYO_DSL, 
//																JKKStrConst.CD00576_WRIB_INF_ADD, 
//																WRIB_ADD_OPTY_CD_AUTO_APLY, 
//																updDtmBf);
			
// v6.00.00 MOD Start
//			CAANMsg wribSvcKeiDsl = this.mapper.callEKK0451C020(wribSvcKeiNo, 
//					mskmDtlNo, 
//					TUJYO_DSL, 
//					JKKStrConst.CD00576_WRIB_INF_ADD, 
//					WRIB_ADD_OPTY_CD_AUTO_APLY, 
//					updDtmBf, 
//					svcChrgStaymd,
//					AUTO_CNT_ON);
			
			// 課金終了日を取得
			CAANMsg prcSchdlTeigi = this.mapper.callECH0501B010(JCCBPCommon.getOpeDate(null));
			String seikyYm = prcSchdlTeigi.getString("seiky_ym");
			String svcChrgEndYmd = seikyYm + JPCDateUtil.getEndOfMonth(seikyYm);
			
			CAANMsg wribSvcKeiDsl = this.mapper.callEKK0451C020(wribSvcKeiNo, 
					mskmDtlNo, 
					TUJYO_DSL, 
					JKKStrConst.CD00576_WRIB_INF_ADD, 
					WRIB_ADD_OPTY_CD_AUTO_APLY, 
					updDtmBf, 
					svcChrgStaymd,
					AUTO_CNT_OFF,
					svcChrgEndYmd);
// v6.00.00 MOD End
// SEP-0020-00-00 MOD End
			
			String updDtm = wribSvcKeiDsl.getString("upd_dtm");
			String geneAddDtm = wribSvcKeiDsl.getString("gene_add_dtm");
			String svcChrgEndYmdO = wribSvcKeiDsl.getString("svc_chrg_endymd_o");
			
			this.mapper.callEKK0451C030(wribSvcKeiNo, 
										geneAddDtm, 
										TUJYO_DSL, 
										updDtm,
										svcChrgEndYmdO);
		}
		else
		{
			throw new RuntimeException();
		}
		
		// 割引サービス対象契約
		CAANMsg[] wribsvcTgKeiList = (CAANMsg[])this.ccWorkMap.get(MOTO_KK_T_WRISVC_TG_KEI);
		String tgKeiSkbtCd = "";
		String keiNo = "";
//		String idoDiv = "";
		// サービス提供中　→　解約
		String prgStat = JKKStrConst.CD00647_CAMPAIGN_CSL;
		int type = 0;
		for (CAANMsg wribsvcTgKei : wribsvcTgKeiList)
		{
			tgKeiSkbtCd = wribsvcTgKei.getString("tg_kei_skbt_cd");
			if (JKKStrConst.CD_DIV_OYAKEISKBTCD_SVCKEI.equals(tgKeiSkbtCd))
			{
				// 01:サービス契約
				type = JKKWrisvcHktgiSetCCMapper.TYPE_1;
				keiNo = "";
//				// サービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0081A010(svcKeiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
			}
// ANK-1223-00-00 MOD Start
//			else if (OYA_KEI_SKBT_CD_04.equals(tgKeiSkbtCd))
//			{
//				// 04:オプションサービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_2;
//				keiNo = wribsvcTgKei.getString("op_svc_kei_no");
//				// オプションサービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0351A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
//			else if (OYA_KEI_SKBT_CD_06.equals(tgKeiSkbtCd))
//			{
//				// 06:機器提供サービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_3;
//				keiNo = wribsvcTgKei.getString("kktk_svc_kei_no");
//				// 機器提供サービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0341A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
			else 
			{
				continue;
			}
			this.mapper.callEKK1091D010(mskmDtlNo, type, svcKeiNo, keiNo, JKKStrConst.CD00576_WRIB_INF_ADD, prgStat, JKKStrConst.CD00846_OTHER);
		}
//		// 割引サービス契約番号
//		this.mapper.callEKK1091D010(mskmDtlNo, JKKWrisvcHktgiSetCCMapper.TYPE_4, svcKeiNo, wribSvcKeiNo, JKKStrConst.CD00576_WRIB_INF_ADD, prgStat, JKKStrConst.CD00846_OTHER);
// ANK-1223-00-00 MOD End
		
		printlnEjbLog("dslHktgiMtWrisvcInfo end");
	}

	/**
	 * 引継ぎ先の割引サービス情報の登録を行います。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void addHktgiSkWrisvcInfo(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("addHktgiSkWrisvcInfo start");
		// 引継ぎ先サービス契約の情報取得
		HashMap<String, Object> sakiSvcKeiMap = (HashMap<String, Object>)inMap.get("SAKI_KK_T_SVC_KEI");
		String sysid = (String)sakiSvcKeiMap.get("SYSID");
		String svcKeiNo = (String)sakiSvcKeiMap.get("SVC_KEI_NO");
		
		// 引継ぎ先登録情報設定
		hktgSakiAddInfo();
		
		// 申込明細番号
		String mskmDtlNo = addMskm(handle, param, sysid);
		printlnEjbLog("申込明細番号＝" + mskmDtlNo);
		printlnEjbLog("引継ぎ先の割引サービス契約＝" + this.ccWorkMap.get(SAKI_KK_T_WRIB_SVC_KEI).toString());
		printlnEjbLog("引継ぎ先の割引サービス契約対象契約＝" + this.ccWorkMap.get(SAKI_KK_T_WRISVC_TG_KEI).toString());
		
		// サービス契約一意照会
		CAANMsg svcKei = this.mapper.callEKK0081A010(svcKeiNo);
		String updDtmBf = svcKei.getString("last_upd_dtm");
		printlnEjbLog("updDtmBf＝" + updDtmBf);
		
		CAANMsg addDataRet = this.mapper.callEKK0451D010((HashMap<String, Object>)this.ccWorkMap.get(SAKI_KK_T_WRIB_SVC_KEI),
														(ArrayList<HashMap<String, Object>>)this.ccWorkMap.get(SAKI_KK_T_WRISVC_TG_KEI),
														mskmDtlNo,
														updDtmBf);
		
		this.ccWorkMap.put("SAKI_WARIBSVC_INFO", addDataRet);
		
		// 割引サービス対象契約
		CAANMsg[] kk0481 = addDataRet.getCAANMsgList(EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST);
		// 
		String prgStat = JKKStrConst.CD00647_CAMPAIGN_FIN;
//		String wribSvcKeiNo = addDataRet.getString("wrib_svc_kei_no");
		String tgKeiSkbtCd = "";
		String keiNo = "";
//		String idoDiv = "";
		int type = 0;
		for (CAANMsg wribsvcTgKei : kk0481)
		{
			tgKeiSkbtCd = wribsvcTgKei.getString("tg_kei_skbt_cd");
			if (JKKStrConst.CD_DIV_OYAKEISKBTCD_SVCKEI.equals(tgKeiSkbtCd))
			{
				// 01:サービス契約
				type = JKKWrisvcHktgiSetCCMapper.TYPE_1;
				keiNo = "";
//				idoDiv = svcKei.getString("ido_div");
			}
// ANK-1223-00-00 MOD Start
//			else if (OYA_KEI_SKBT_CD_04.equals(tgKeiSkbtCd))
//			{
//				// 04:オプションサービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_2;
//				keiNo = wribsvcTgKei.getString("op_svc_kei_no");
//				// オプションサービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0351A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
//			else if (OYA_KEI_SKBT_CD_06.equals(tgKeiSkbtCd))
//			{
//				// 06:機器提供サービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_3;
//				keiNo = wribsvcTgKei.getString("kktk_svc_kei_no");
//				// 機器提供サービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0341A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
			else 
			{
				continue;
			}
			this.mapper.callEKK1091D010(mskmDtlNo, type, svcKeiNo, keiNo, JKKStrConst.CD00576_WRIB_INF_ADD, prgStat, JKKStrConst.CD00846_OTHER);
		}
//		// 割引サービス契約番号
//		this.mapper.callEKK1091D010(mskmDtlNo, JKKWrisvcHktgiSetCCMapper.TYPE_4, svcKeiNo, wribSvcKeiNo, JKKStrConst.CD00576_WRIB_INF_ADD, prgStat, JKKStrConst.CD00846_OTHER);
// ANK-1223-00-00 MOD End
		
		printlnEjbLog("addHktgiSkWrisvcInfo end");
	}

	/**
	 * 引継ぎ先の割引サービス情報の更新を行います。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void updHktgiSkWrisvcInfo(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("updHktgiSkWrisvcInfo start");
		// 引継ぎ先サービス契約の情報取得
//		HashMap<String, Object> sakiSvcKeiMap = (HashMap<String, Object>)inMap.get("SAKI_KK_T_SVC_KEI");
//		String sysid = (String)sakiSvcKeiMap.get("SYSID");
//		String svcKeiNo = (String)sakiSvcKeiMap.get("SVC_KEI_NO");

		// 引継ぎ先登録情報設定
		hktgSakiUpdInfo();
		
		HashMap<String, Object> wribSvcKeiMap = (HashMap<String, Object>)this.ccWorkMap.get(SAKI_KK_T_WRIB_SVC_KEI);
		String wribSvcKeiNo = (String)wribSvcKeiMap.get("wrib_svc_kei_no");
		
		// 割引サービス契約一意照会
		CAANMsg wrivSvcKei = this.mapper.callEKK0451A010(wribSvcKeiNo);
		String updDtmBf = wrivSvcKei.getString("upd_dtm");
		String mskmDtlNo = wrivSvcKei.getString("mskm_dtl_no");
//		String updDtmBf = (String)wribSvcKeiMap.get("upd_dtm_bf");
//		
//		// 申込明細番号
//		String mskmDtlNo = addMskm(handle, param, sysid);
		printlnEjbLog("申込明細番号＝" + mskmDtlNo);
		printlnEjbLog("割引サービス契約番号＝" + wribSvcKeiNo);
		printlnEjbLog("更新年月日時分秒(更新前)＝" + updDtmBf);
		printlnEjbLog("引継ぎ先の割引サービス契約＝" + wribSvcKeiMap.toString());
		printlnEjbLog("引継ぎ先の割引サービス契約内訳＝" + this.ccWorkMap.get(SAKI_KK_T_WRISVC_KEI_UCWK).toString());
		
// v6.00.00 MOD Start
//		this.mapper.callEKK0451C200(wribSvcKeiMap,
//									(ArrayList<HashMap<String, Object>>)this.ccWorkMap.get(SAKI_KK_T_WRISVC_KEI_UCWK),
//									mskmDtlNo,
//									updDtmBf);
		this.mapper.callEKK2361C020(wribSvcKeiMap,
				(ArrayList<HashMap<String, Object>>)this.ccWorkMap.get(SAKI_KK_T_WRISVC_KEI_UCWK),
				updDtmBf);
// v6.00.00 MOD End
		
// ANK-1223-00-00 MOD Start
//		// 登録後割引サービス契約情報
//		CAANMsg addDataRet = (CAANMsg)this.ccWorkMap.get("SAKI_WARIBSVC_INFO");
//		
//		// 割引サービス対象契約
//		CAANMsg[] kk0481 = addDataRet.getCAANMsgList(EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST);
//		// 
//		String prgStat = JKKStrConst.CD00647_CAMPAIGN_FIN;
//		String tgKeiSkbtCd = "";
//		String keiNo = "";
//		String idoDiv = "";
//		int type = 0;
//		
//		// 進捗登録：[割引サービス対象契約]の件数分、繰り返す。
//		for (CAANMsg wribsvcTgKei : kk0481)
//		{
//			tgKeiSkbtCd = wribsvcTgKei.getString("tg_kei_skbt_cd");
//			if (JKKStrConst.CD_DIV_OYAKEISKBTCD_SVCKEI.equals(tgKeiSkbtCd))
//			{
//				// 01:サービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_1;
//				keiNo = "";
//				// サービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0081A010(svcKeiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
//			else if (OYA_KEI_SKBT_CD_04.equals(tgKeiSkbtCd))
//			{
//				// 04:オプションサービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_2;
//				keiNo = wribsvcTgKei.getString("op_svc_kei_no");
//				// オプションサービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0351A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
//			else if (OYA_KEI_SKBT_CD_06.equals(tgKeiSkbtCd))
//			{
//				// 06:機器提供サービス契約
//				type = JKKWrisvcHktgiSetCCMapper.TYPE_3;
//				keiNo = wribsvcTgKei.getString("kktk_svc_kei_no");
//				// 機器提供サービス契約一意照会
//				CAANMsg svcKeiRet = this.mapper.callEKK0341A010(keiNo);
//				idoDiv = svcKeiRet.getString("ido_div");
//			}
//			else 
//			{
//				continue;
//			}
//			this.mapper.callEKK1091D010(mskmDtlNo, type, svcKeiNo, keiNo, idoDiv, prgStat, JKKStrConst.CD00846_OTHER);
//		}
//		this.mapper.callEKK1091D010(mskmDtlNo, JKKWrisvcHktgiSetCCMapper.TYPE_4, svcKeiNo, wribSvcKeiNo, JKKStrConst.CD00576_WRIB_INF_ADD, prgStat, JKKStrConst.CD00846_OTHER);
// ANK-1223-00-00 MOD End
		
		printlnEjbLog("updHktgiSkWrisvcInfo end");
	}

	/**
	 * 引継ぎ先登録情報の作成
	 * 
	 * @param svcStaYmd サービス開始日
	 * @param svcChrgStaymd サービス課金開始日
	 * @return
	 * @throws Throwable
	 */
	private void hktgSakiAddInfo() throws Throwable
	{
		printlnEjbLog("hktgSakiAddInfo start");
		// 引継ぎ元情報
		// 割賦契約であった割引サービス契約を取得
		CAANMsg wribSvcKeiInfo = (CAANMsg)this.ccWorkMap.get(MOTO_KK_T_WRIB_SVC_KEI);
		// 割賦契約であった割引サービス対象契約を取得
		CAANMsg[] wribsvcTgKeiList = (CAANMsg[])ccWorkMap.get(MOTO_KK_T_WRISVC_TG_KEI);
		
		// 引継ぎ先情報
		String sakiOptSvcKeiNo = (String)ccWorkMap.get("SAKI_OPT_SVC_KEI_NO");
		
		// 引継ぎ先情報
		// 引継ぎ先割引サービス契約
		HashMap<String, String> sakiWribSvcKeiInfo = new HashMap<String, String>();
		this.ccWorkMap.put(SAKI_KK_T_WRIB_SVC_KEI, sakiWribSvcKeiInfo);
		// 引継ぎ先割引サービス対象契約
		ArrayList<HashMap<String, String>> sakiWribsvcTgKeiList = new ArrayList<HashMap<String, String>>();
		this.ccWorkMap.put(SAKI_KK_T_WRISVC_TG_KEI, sakiWribsvcTgKeiList);
		// 引継ぎ先割引サービス契約内訳
		ArrayList<HashMap<String, String>> sakiWrisvcKeiUcwkList = new ArrayList<HashMap<String, String>>();
		this.ccWorkMap.put(SAKI_KK_T_WRISVC_KEI_UCWK, sakiWrisvcKeiUcwkList);
		
		// ----------------------------------------------
		// 割引サービス契約
		// ----------------------------------------------
		
		// 割引サービス契約のマッピング
		sakiWribSvcKeiInfo.put("sysid", (String)this.sakiSvcKeiMap.get("SYSID"));										// SYSID
		sakiWribSvcKeiInfo.put("wrib_svc_cd", wribSvcKeiInfo.getString("wrib_svc_cd"));									// 割引サービスコード
		sakiWribSvcKeiInfo.put("wrib_svc_cd_nm", wribSvcKeiInfo.getString("wrib_svc_cd_nm"));							// 割引サービスコード名称
		sakiWribSvcKeiInfo.put("pcrs_cd", wribSvcKeiInfo.getString("pcrs_cd"));											// 料金コースコード
		sakiWribSvcKeiInfo.put("pplan_cd", wribSvcKeiInfo.getString("pplan_cd"));										// 料金プランコード
		sakiWribSvcKeiInfo.put("svc_use_sta_kibo_ymd", wribSvcKeiInfo.getString("svc_use_sta_kibo_ymd"));				// サービス利用開始希望年月日
		sakiWribSvcKeiInfo.put("rsv_tsta_kibo_ymd", wribSvcKeiInfo.getString("rsv_tsta_kibo_ymd"));						// 予約適用開始希望年月日
		sakiWribSvcKeiInfo.put("aply_jun", wribSvcKeiInfo.getString("aply_jun"));										// 即時適用フラグ
		sakiWribSvcKeiInfo.put("pnlty_hassei_cd", wribSvcKeiInfo.getString("pnlty_hassei_cd"));							// 違約金発生コード
		sakiWribSvcKeiInfo.put("ido_div", JKKStrConst.CD00576_WRIB_INF_ADD);											// 異動区分
		sakiWribSvcKeiInfo.put("mskm_kisan_ymd", wribSvcKeiInfo.getString("mskm_kisan_ymd"));							// 申込起算年月日
		sakiWribSvcKeiInfo.put("wrib_add_opty_cd", wribSvcKeiInfo.getString("wrib_add_opty_cd"));						// 割引登録契機コード
		sakiWribSvcKeiInfo.put("wrib_svc_kei_at_keizk_skcd", wribSvcKeiInfo.getString("wrib_svc_kei_at_keizk_skcd"));	// 割引サービス契約自動継続識別コード
		sakiWribSvcKeiInfo.put("upd_dtm_bf", wribSvcKeiInfo.getString("upd_dtm_bf"));									// 更新年月日時分秒(更新前)
		
		// ----------------------------------------------
		// 割引サービス対象契約
		// ----------------------------------------------
		
		// 引継ぎ先割引サービス対象契約
		String tgKeiSkbtCd = "";
		for (int i = 0; i < wribsvcTgKeiList.length; i++)
		{
			tgKeiSkbtCd = "";
			// 引継ぎ元
			CAANMsg row = wribsvcTgKeiList[i];
			// 引継ぎ先
			HashMap<String, String> sakiWribsvcTgKei = new HashMap<String, String>();
			
			sakiWribsvcTgKei.put("svc_kei_no", row.getString("svc_kei_no"));							// サービス契約番号
			sakiWribsvcTgKei.put("op_svc_kei_no", row.getString("op_svc_kei_no"));						// オプションサービス契約番号
			sakiWribsvcTgKei.put("kktk_svc_kei_no", row.getString("kktk_svc_kei_no"));					// 機器提供サービス契約番号
			sakiWribsvcTgKei.put("wrib_svc_trgt_svc_cd", row.getString("wrib_svc_trgt_svc_cd"));		// 割引サービス対象サービスコード
			sakiWribsvcTgKei.put("set_add_ymd", row.getString("set_add_ymd"));							// 設定登録年月日
			sakiWribsvcTgKei.put("wrisvc_tg_kei_tstaymd", row.getString("wrisvc_tg_kei_tstaymd"));		// 割引サービス対象契約適用開始年月日
			sakiWribsvcTgKei.put("wrisvc_tg_kei_tendymd", row.getString("wrisvc_tg_kei_tendymd"));		// 割引サービス対象契約適用終了年月日
			
			// 引継ぎ先への洗い変え
			// オプションサービス契約番号
			if (sakiWribsvcTgKei.get("op_svc_kei_no") != null && !"".equals(sakiWribsvcTgKei.get("op_svc_kei_no").trim()))
			{
				tgKeiSkbtCd = "04";
				sakiWribsvcTgKei.put("op_svc_kei_no", sakiOptSvcKeiNo);
			}
			
			// 機器提供サービス契約番号
			if (sakiWribsvcTgKei.get("kktk_svc_kei_no") != null && !"".equals(sakiWribsvcTgKei.get("kktk_svc_kei_no").trim()))
			{
				tgKeiSkbtCd = "06";
				sakiWribsvcTgKei.put("kktk_svc_kei_no", (String)this.sakiKktkSvcKeiMap.get("KKTK_SVC_KEI_NO"));
			}
			// サービス契約番号
			if (sakiWribsvcTgKei.get("svc_kei_no") != null && !"".equals(sakiWribsvcTgKei.get("svc_kei_no").trim()))
			{
				sakiWribsvcTgKei.put("svc_kei_no", (String)this.sakiSvcKeiMap.get("SVC_KEI_NO"));
				
				if ("".equals(tgKeiSkbtCd))
				{
					tgKeiSkbtCd = "01";
				}
			}
			sakiWribsvcTgKei.put("tg_kei_skbt_cd", tgKeiSkbtCd);										// 対象契約識別コード
			
			sakiWribsvcTgKeiList.add(sakiWribsvcTgKei);
		}
		
		printlnEjbLog("hktgSakiAddInfo end");
	}
	
	/**
	 * 引継ぎ先更新情報の作成
	 * 
	 * @param svcStaYmd サービス開始日
	 * @param svcChrgStaymd サービス課金開始日
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void hktgSakiUpdInfo() throws Throwable
	{
		printlnEjbLog("hktgSakiUpdInfo start");
		// 引継ぎ元情報
		// 割賦契約であった割引サービス契約を取得
		CAANMsg wribSvcKeiInfo = (CAANMsg)this.ccWorkMap.get(MOTO_KK_T_WRIB_SVC_KEI);
		// 割賦契約であった割引サービス契約内訳を取得
		CAANMsg[] wrisvcKeiUcwkList = (CAANMsg[])ccWorkMap.get(MOTO_KK_T_WRISVC_KEI_UCWK);

		// 登録後割引サービス契約情報
		CAANMsg addDataRet = (CAANMsg)this.ccWorkMap.get("SAKI_WARIBSVC_INFO");
		
		// ----------------------------------------------
		// 割引サービス契約
		// ----------------------------------------------
		
		// 引継ぎ先情報
		// 引継ぎ先割引サービス契約
		HashMap<String, String> sakiWribSvcKeiInfo = (HashMap<String, String>)this.ccWorkMap.get(SAKI_KK_T_WRIB_SVC_KEI);
		this.ccWorkMap.put(SAKI_KK_T_WRIB_SVC_KEI, sakiWribSvcKeiInfo);
		// 引継ぎ先割引サービス契約内訳
		ArrayList<HashMap<String, String>> sakiWrisvcKeiUcwkList = (ArrayList<HashMap<String, String>>)this.ccWorkMap.get(SAKI_KK_T_WRISVC_KEI_UCWK);
		
		// 割引サービス契約のマッピング
		// 登録後情報
		sakiWribSvcKeiInfo.put("wrib_svc_kei_no", addDataRet.getString("wrib_svc_kei_no"));			// 割引サービス契約番号
		sakiWribSvcKeiInfo.put("upd_dtm_bf", addDataRet.getString("upd_dtm_bf"));					// 更新年月日時分秒(更新前)
		
		// 引継ぎ元情報
		sakiWribSvcKeiInfo.put("plan_staymd", wribSvcKeiInfo.getString("plan_staymd"));				// プラン開始年月日
		sakiWribSvcKeiInfo.put("plan_endymd", wribSvcKeiInfo.getString("plan_endymd"));				// プラン終了年月日
		sakiWribSvcKeiInfo.put("plan_chrg_staymd", wribSvcKeiInfo.getString("plan_chrg_staymd"));	// プラン課金開始年月日
		sakiWribSvcKeiInfo.put("plan_chrg_endymd", wribSvcKeiInfo.getString("plan_chrg_endymd"));	// プラン課金終了年月日
		sakiWribSvcKeiInfo.put("svc_sta_ymd", wribSvcKeiInfo.getString("svc_sta_ymd"));				// サービス開始年月日
		sakiWribSvcKeiInfo.put("svc_chrg_staymd", wribSvcKeiInfo.getString("svc_chrg_staymd"));		// サービス課金開始年月日
		sakiWribSvcKeiInfo.put("svc_endymd", wribSvcKeiInfo.getString("svc_endymd"));				// サービス終了年月日
		sakiWribSvcKeiInfo.put("svc_chrg_endymd", wribSvcKeiInfo.getString("svc_chrg_endymd"));		// サービス課金終了年月日
		sakiWribSvcKeiInfo.put("ido_div", JKKStrConst.CD00576_WRIB_INF_ADD);						// 異動区分
		
		
		// ----------------------------------------------
		// 割引サービス契約内訳
		// ----------------------------------------------
		
		int motoCnt = 0;
		int sakiCnt = 0;
		// 引継ぎ元
		if (wrisvcKeiUcwkList != null)
		{
			motoCnt = wrisvcKeiUcwkList.length;
		}
		
		// 登録後割引サービス契約内訳
		CAANMsg[] kk2361 = addDataRet.getCAANMsgList(EKK0451D010CBSMsg.EKK0451D010CBSMSG3LIST);
		if (kk2361 != null)
		{
			sakiCnt = kk2361.length;
		}
		if (motoCnt != sakiCnt)
		{
			throw new CCException("割引サービス契約内訳件数差異：引継ぎ元＝" + motoCnt + "：引継ぎ先＝" + sakiCnt, new Exception());
		}
		
		for (int i = 0; i < motoCnt; i++)
		{
			// 引継ぎ元情報
			CAANMsg moto = wrisvcKeiUcwkList[i];
			String motoWribSvcDtlCd = moto.getString("wrib_svc_dtl_cd");
			printlnEjbLog("引継ぎ元 割引サービス詳細コード");
			
			for (int j = 0; j < sakiCnt; j++)
			{
				// 登録後情報
				CAANMsg add = kk2361[j];
				String sakiWribSvcDtlCd = add.getString("kk2361_wrib_svc_dtl_cd");
				printlnEjbLog("引継ぎ先 割引サービス詳細コード");
				
				if (motoWribSvcDtlCd.equals(sakiWribSvcDtlCd))
				{
					// 詰め替えたやつ
					HashMap<String, String> upd = new HashMap<String, String>();
					
					upd.put("wrib_svc_kei_no", add.getString("kk2361_wrib_svc_kei_no"));				// 割引サービス契約番号
					upd.put("wrib_svc_kei_ucwk_no", add.getString("kk2361_wrib_svc_kei_ucwk_no"));		// 割引サービス契約内訳番号
					upd.put("wrib_aply_cnt", moto.getString("wrib_aply_cnt"));							// 割引適用回数
					upd.put("svc_chrg_staymd", moto.getString("svc_chrg_staymd"));						// サービス課金開始年月日
					upd.put("svc_chrg_endymd", moto.getString("svc_chrg_endymd"));						// サービス課金終了年月日
					upd.put("chrg_sta_ymd_hosei_um", moto.getString("chrg_sta_ymd_hosei_um"));			// 課金開始年月日補正有無
					upd.put("first_wrib_aply_ymd", moto.getString("first_wrib_aply_ymd"));				// 初回割引適用年月日
					
					sakiWrisvcKeiUcwkList.add(upd);
					break;
				}
			}
		}
		printlnEjbLog("hktgSakiUpdInfo end");
	}
	
// v9.00.00 ADD START
	
	/**
	 * 
	 * 該当の割賦割引が解約対象が否かを判定.
	 * 
	 * 1.機器が紐づく事.
	 * 2.[受付済][サービス提供中]である事.
	 * 
	 * @param  wribInf
	 * @return true：解約対象、false：以外
	 * @throws Throwable 
	 */
	private boolean isKapWriKiki(CAANMsg wribInf) throws Throwable {
		printlnEjbLog("isKapWriKiki start");
		
		final List<String> stat = Arrays.asList(new String[] {JKKStrConst.CD00055_UKZM, JKKStrConst.CD00055_SVCTK_CHU});
		
		String wNo   = wribInf.getString("wrib_svc_kei_no");		// 割引サービス契約番号
		String wstat = wribInf.getString("wrib_svc_kei_stat");		// 割引サービス契約ステータス
		
		// 引継元：機器提供サービス契約番号リスト
		ArrayList<String> mKktkNoList = mRetKktkSvcKeiNo();
		
		// 割引サービス対象契約を一覧照会する
		CAANMsg[] kk0481List = this.mapper.callEKK0481B001(JKKWrisvcHktgiSetCCMapper.typeWribSvcKeiNo, wNo);
		
		// チェック
		for (CAANMsg tg : kk0481List) {
			
			// 機器提供サービス契約番号
			String kktkNo = tg.getString("kktk_svc_kei_no");
			
			
			// 機器に紐づかない対象はスルー.
			if (JKKStringUtil.isNullBlank(kktkNo))
				continue;
			
			// 引継元機器と一致.[受付済][サービス提供中]以外もここでハジく.
			if (mKktkNoList.contains(kktkNo) && stat.contains(wstat))
				return true;
		}
		
		printlnEjbLog("isKapWriKiki end");
		return false;
	}
	
	/**
	 * 元：機器提供サービス契約番号取得
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<String> mRetKktkSvcKeiNo() {
		printlnEjbLog("mRetKktkSvcKeiNo start");
		
		ArrayList<String> ret = new ArrayList<String>();
		
		// 引継ぎ元：機器情報
		ArrayList<HashMap> mKktkList = (ArrayList<HashMap>)inMap.get("MOTO_KK_T_KKTK_SVC_KEI_List");
		
		// なぜリストかは不明...とりあえず,全て担保可能な実装.
		for (HashMap tg : mKktkList)
			ret.add((String) tg.get("KKTK_SVC_KEI_NO"));
		
		printlnEjbLog("mRetKktkSvcKeiNo end");
		return ret;
	}
// v9.00.00 ADD END
}
