/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKTelSelectOpPackOperateCC
*   ソースファイル名：JKKTelSelectOpPackOperateCC.java
*   作成者          ：FJ
*   日付            ：2014年04月17日
*＜機能概要＞
*   電話セレクトオプションパック操作部品CC
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v9.00.00    2014/04/17  FJ)三宅     新規作成(ANK-2056-00-00)
*	v9.00.01    2014/05/01  FJ)三宅     ANK-2056-00-00 PT故障修正
*	v9.00.02    2014/05/07  FJ)三宅     IT1-2014-0000115
*	v9.00.03    2014/05/08  FJ)三宅     IT1-2014-0000117
*	v9.00.04    2014/05/09  FJ)三宅     IT1-2014-0000120
*	v9.00.05    2014/05/10  FJ)三宅     IT1-2014-0000122
*	v9.00.06    2014/05/10  FJ)三宅     IT1-2014-0000117
*	v9.00.07    2014/05/15  FJ)三宅     IT1-2014-0000140
*	v9.00.08    2014/06/12  FJ)山裾     IT2-2014-0000243
*	v9.00.09    2014/07/24  FJ)福岡     OM-2014-0002452
*	v9.00.10    2014/08/08  FJ)西面     OM-2014-0002685 1日解約時の判定条件変更
*	v10.00.00	2014/08/28	FJ)西面     OM-2014-0002779 電話番号変更時の条件変更
*	v50.00.00   2020/05/21  FJ)三原     ANK-3754-00-00_トビラフォン対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.common.x01.sc.SCControlMapKeys;
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.JPCDateChecker;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C070CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C080CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0481B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0481B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0851B001CBSMsg1List;

/**
 * 電話セレクトオプションパック操作部品CC
 * 
 * @author 富士通
 */
public class JKKTelSelectOpPackOperateCC extends AbstractCommonComponent {
	
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKTelSelectOpPackOperateMapperCC mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;

	/** ファミリーパック割引操作の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** CC機能コード（チェック・登録） */
	private final String CC_FUNC_CD_1 = "1";
	/** CC機能コード（チェック） */
	private final String CC_FUNC_CD_2 = "2";
	
	/** 機能コード 1 */
	private final String FUNC_CD_1 = "1";
	/** 機能コード 2 */
	private final String FUNC_CD_2 = "2";
	/** 機能コード 3 */
	private final String FUNC_CD_3 = "3";
	
	/** 処理区分（照会） */
	private final String TRN_DIV_SYOKAI = "00";
	/** 処理区分（登録） */
	private final String TRN_DIV_ADD    = "01";
	/** 処理区分（解約） */
	private final String TRN_DIV_DSL    = "02";
	/** 処理区分（回復） */
	private final String TRN_DIV_KIHK   = "03";
	/** 処理区分（紐付登録） */
	private final String TRN_DIV_TGADD  = "05";
	
	/** パック割区分（eo光電話パック３） */
	private final String PACK_DIV_PACK3 = "1";
	/** パック割区分（eo光電話パック７） */
	private final String PACK_DIV_PACK7 = "2";
	// ANK-3754-00-00 ADD START
	/** パック割区分（あんしん電話パック） */
	private final String PACK_DIV_ANSN_TEL_PACK = "3";
	// ANK-3754-00-00 ADD END
	
	/** 課金区分（課金） */
	private final String KAKIN_DIV_KAKIN   = "1";
	/** 課金区分（非課金） */
	private final String KAKIN_DIV_HIKAKIN = "2";
	
	/** 違約金区分（違約金なし） */
	private final String PNLTY_DIV_NASHI = "0";
	/** 違約金区分（違約金発生） */
	private final String PNLTY_DIV_ARI   = "1";
	
	/** 割引サービスコード ｅｏ光電話パック３ */
	private final String WRIB_SVC_CD_PACK3 = "W00000007";
	/** 割引サービスコード ｅｏ光電話パック７ */
	private final String WRIB_SVC_CD_PACK7 = "W00000008";
	// ANK-3754-00-00 ADD START
	/** 割引サービスコード あんしん電話パック */
	private final String WRIB_SVC_CD_ANSN_TEL_PACK = "W00000023";
	// ANK-3754-00-00 ADD END
	
	/** 料金コースコード ｅｏ光電話パック３ */
	private final String PCRS_CD_PACK3 = "F03";
	/** 料金コースコード ｅｏ光電話パック７ */
	private final String PCRS_CD_PACK7 = "F04";
	// ANK-3754-00-00 ADD START
	/** 料金コースコード あんしん電話パック */
	private final String PCRS_CD_ANSN_TEL_PACK = "F09";
	// ANK-3754-00-00 ADD END
	
	/** 料金プランコード ｅｏ光電話パック３ */
	private final String PPLAN_CD_PACK3 = "PF0301";
	/** 料金プランコード ｅｏ光電話パック７ */
	private final String PPLAN_CD_PACK7 = "PF0401";
	// ANK-3754-00-00 ADD START
	/** 料金プランコード あんしん電話パック */
	private final String PPLAN_CD_ANSN_TEL_PACK = "PF0901";
	// ANK-3754-00-00 ADD END
	
// v9.00.05 ADD Start
	/** ソート区分（昇順） */
	private final String SORT_DIV_ASC   = "1";
	/** ソート区分（降順） */
	private final String SORT_DIV_DESC  = "2";
// v9.00.05 ADD End
// v9.00.07 ADD Start
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−非課金選択） */
	private final String DSL_DIV_01 = "01";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−課金選択） */
	private final String DSL_DIV_02 = "02";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−課金／非課金不可） */
	private final String DSL_DIV_03 = "03";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−サービス契約・サービス契約内訳の解約） */
	private final String DSL_DIV_04 = "04";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−サービス契約・サービス契約内訳の非課金解約） */
	private final String DSL_DIV_05 = "05";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−初回料金計算日翌日以降−パック単独解約） */
	private final String DSL_DIV_06 = "06";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−初回料金計算日翌日以降−サービス契約・サービス契約内訳の解約） */
	private final String DSL_DIV_07 = "07";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−パック単独解約−非課金解約） */
	private final String DSL_DIV_08 = "08";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−パック単独解約−課金解約） */
	private final String DSL_DIV_09 = "09";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−サービス契約・サービス契約内訳の解約） */
	private final String DSL_DIV_10 = "10";
	/** 解約区分（サービス契約内訳課金開始前） */
	private final String DSL_DIV_11 = "11";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−同日解約−パック単独解約） */
	private final String DSL_DIV_12 = "12";
	/** 解約区分（サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−同日解約−サービス契約・サービス契約内訳の解約） */
	private final String DSL_DIV_13 = "13";
	
	// 2014.06.12 IT2-2014-0000243 Add Start
	/** 解約区分（電番変更かつ非課金） */
	private final String DSL_DIV_14 = "14";
	
	/** 異動区分（電番変更） */
	private final String IDO_DIV_00042 = "00042";
	
	//v10.00.00 2014/08/28 Add Start
	/** 異動区分（光電話・番ポ情報変更） */
	private final String IDO_DIV_00045 = "00045";
	//v10.00.00 2014/08/28 Add End
	
	// 2014.06.12 IT2-2014-0000243 Add End
	
// v9.00.07 ADD End
	
	/** 運用日取得キー */
	private final String OPE_DATE = "OPE_DATE";
	
	/**
	 * 
	 * 引数キー
	 * 
	 * ・機能コード
	 * ・処理区分
	 * ・SYSID
	 * ・サービス契約番号
	 * ・サービス契約内訳番号
	 * ・申込明細番号
	 * ・サービス解約理由コード
	 * ・サービスキャンセル理由コード
	 * ・起算日
	 * ・利用開始希望年月日
	 * ・異動区分
	 * ・パック割区分
	 * ・課金区分
	 * ・違約金区分
	 * ・更新年月日時分秒（更新前）
	 */
	public static final String KEY_FUNC_CD           = "func_cd";
	public static final String KEY_TRN_DIV           = "trn_div";
	public static final String KEY_SYSID             = "sysid";
	public static final String KEY_SVC_KEI_NO        = "svc_kei_no";
	public static final String KEY_SVC_KEI_UCWK_NO   = "svc_kei_ucwk_no";
	public static final String KEY_MSKM_DTL_NO       = "mskm_dtl_no";
	public static final String KEY_SVC_DLRE_CD       = "svc_dlre_cd";
	public static final String KEY_SVC_CANCEL_RSN_CD = "svc_cancel_rsn_cd";
	public static final String KEY_KISAN_YMD         = "kisan_ymd";
	public static final String KEY_USE_STA_KIBO_YMD  = "use_sta_kibo_ymd";
	public static final String KEY_IDO_DIV           = "ido_div";
	public static final String KEY_PACK_DIV          = "pack_div";
	public static final String KEY_KAKIN_DIV         = "kakin_div";
	public static final String KEY_PNLTY_DIV         = "pnlty_div";
	public static final String KEY_KK0081_UPD_DTM    = "kk0081_upd_dtm";
	public static final String KEY_WRIB_SVC_KEI_NO   = "wrib_svc_kei_no";
// v9.00.05 ADD Start
	public static final String KEY_SORT_DIV          = "sort_div";
// v9.00.05 ADD End
	
	/**
	 * 戻り値キー
	 * ・割引サービス契約情報リスト
	 * ・更新年月日時分秒
	 */
	private final String RTRN_KEY_WRIB_SVC_KEI_LIST = "wrib_svc_kei_list";
	private final String RTRN_KEY_UPD_DTM           = "upd_dtm";
	
	/**
	 * 
	 * 作業領域キー
	 * 
	 * ・割引サービス契約番号List → key：割引サービス契約番号、val：サービス契約番号
	 * ・サービス契約番号List     → key：割引サービス契約番号、val：EKK0451A010 Msg
	 * 
	 */
	private final String KEY_PACK_CD_LIST      = "PACK_CD_LIST";
	private final String KEY_WRIB_SVC_CD_MAP   = "WRIB_SVC_CD_MAP";
	private final String KEY_PCRS_CD_MAP       = "PCRS_CD_MAP";
	private final String KEY_PPLAN_CD_MAP      = "PPLAN_CD_MAP";
// v9.00.07 DEL Start
//// v9.00.04 ADD Start
//	private final String KEY_SVC_CHRG_STA_DSL  = "SVC_CHRG_STA_DSL";
//	private final String KEY_KAKIN_DIV_SET     = "KAKIN_DIV_SET";
//// v9.00.04 ADD End
// v9.00.07 DEL End
	
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引解約新規作成処理を実施する.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle    セッションハンドル
	 * @param param     リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable {
		printlnEjbLog("JKKTelSelectOpPackOperateCC.execute start");
		
		// 基準となる日付の取得
		String opeDate = getOpeDateCc(param);
		
		// 初期処理
		initSetUp(handle, param, fixedText, opeDate);
		
		// 入力データチェック
		chkInMap(handle, param);
		
		// 機能コード「チェックのみ」の場合は、主処理は行わない
		if (this.CC_FUNC_CD_2.equals(this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_FUNC_CD)))
			return param;
		
		// メイン処理実行
		main(handle, param);

		printlnEjbLog("JKKTelSelectOpPackOperateCC.execute end");
		return param;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>主処理<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  handle セッションハンドル
	 * @param  param  リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("serial")
	private void main(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("JKKTelSelectOpPackOperateCC.main start");
		
		// 対象とする割引サービスコードのリストを生成（ｅｏ光電話パック３、ｅｏ光電話パック７、あんしん電話パック）
		// ANK-3754-00-00 MOD START
		//ArrayList<String> telSelectOpPackList = new ArrayList(Arrays.asList(WRIB_SVC_CD_PACK3, WRIB_SVC_CD_PACK7));
		ArrayList<String> telSelectOpPackList = new ArrayList(Arrays.asList(WRIB_SVC_CD_PACK3, WRIB_SVC_CD_PACK7, WRIB_SVC_CD_ANSN_TEL_PACK));
		// ANK-3754-00-00 MOD END
		this.ccWorkMap.put(this.KEY_PACK_CD_LIST, telSelectOpPackList);
		
		// 割引サービスコードのマップを生成（key:パック割区分 value:割引サービスコード）
		// ANK-3754-00-00 MOD START
		//HashMap<String, String> wribSvcCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, WRIB_SVC_CD_PACK3); put(PACK_DIV_PACK7, WRIB_SVC_CD_PACK7);}};
		HashMap<String, String> wribSvcCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, WRIB_SVC_CD_PACK3); put(PACK_DIV_PACK7, WRIB_SVC_CD_PACK7);
												put(PACK_DIV_ANSN_TEL_PACK, WRIB_SVC_CD_ANSN_TEL_PACK);}};
		// ANK-3754-00-00 MOD END
		this.ccWorkMap.put(this.KEY_WRIB_SVC_CD_MAP, wribSvcCdMap);
		
		// 料金コースコードのマップを生成（key:パック割区分 value:料金コースコード）
		// ANK-3754-00-00 MOD START
		//HashMap<String, String> pcrsCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, PCRS_CD_PACK3); put(PACK_DIV_PACK7, PCRS_CD_PACK7);}};
		HashMap<String, String> pcrsCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, PCRS_CD_PACK3); put(PACK_DIV_PACK7, PCRS_CD_PACK7);
												put(PACK_DIV_ANSN_TEL_PACK, PCRS_CD_ANSN_TEL_PACK);}};
		// ANK-3754-00-00 MOD END
		this.ccWorkMap.put(this.KEY_PCRS_CD_MAP, pcrsCdMap);
		
		// 料金プランコードのマップを生成（key:パック割区分 value:料金プランコード）
		// ANK-3754-00-00 MOD START
		//HashMap<String, String> pplanCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, PPLAN_CD_PACK3); put(PACK_DIV_PACK7, PPLAN_CD_PACK7);}};
		HashMap<String, String> pplanCdMap = new HashMap<String, String>(){{put(PACK_DIV_PACK3, PPLAN_CD_PACK3); put(PACK_DIV_PACK7, PPLAN_CD_PACK7);
												put(PACK_DIV_ANSN_TEL_PACK, PPLAN_CD_ANSN_TEL_PACK);}};
		// ANK-3754-00-00 MOD END
		this.ccWorkMap.put(this.KEY_PPLAN_CD_MAP, pplanCdMap);
		
		String updDtm = null;
		if(TRN_DIV_SYOKAI.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV)))
		{
			// 照会
			ArrayList<HashMap<String, String>>  syokaiRtrnList = syokaiTelSelectOpPack();
			this.inMap.put(RTRN_KEY_WRIB_SVC_KEI_LIST, syokaiRtrnList);
		}
		else if(TRN_DIV_ADD.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV)))
		{
			// 登録
			updDtm = addTelSelectOpPack();
			if(!JKKStringUtil.isNullBlank(updDtm))
			{
				// 登録処理が行われているので、更新年月日時分秒に対して登録結果の更新年月日時分秒を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, updDtm);
			}
			else
			{
				// 登録処理が行われていないため、連携された更新年月日時分秒(更新前)の値を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KK0081_UPD_DTM));
			}
		}
		else if(TRN_DIV_DSL.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV)))
		{
			// 解約
			updDtm = dslTelSelectOpPack();
			if(!JKKStringUtil.isNullBlank(updDtm))
			{
				// 解約処理が行われているので、更新年月日時分秒に対して登録結果の更新年月日時分秒を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, updDtm);
			}
			else
			{
				// 解約処理が行われていないため、連携された更新年月日時分秒(更新前)の値を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KK0081_UPD_DTM));
			}
		}
		else if(TRN_DIV_KIHK.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV)))
		{
			// 回復
			updDtm = kaihkTelSelectOpPack();
			if(!JKKStringUtil.isNullBlank(updDtm))
			{
				// 登録処理が行われているので、更新年月日時分秒に対して登録結果の更新年月日時分秒を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, updDtm);
			}
			else
			{
				// 登録処理が行われていないため、連携された更新年月日時分秒(更新前)の値を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KK0081_UPD_DTM));
			}
		}
		else if(TRN_DIV_TGADD.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV)))
		{
			// 紐付登録
			updDtm = addTrgtSvcKei();
			if(!JKKStringUtil.isNullBlank(updDtm))
			{
				// 紐付登録処理が行われているので、更新年月日時分秒に対して登録結果の更新年月日時分秒を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, updDtm);
			}
			else
			{
				// 紐付登録処理が行われていないため、連携された更新年月日時分秒(更新前)の値を設定
				this.inMap.put(RTRN_KEY_UPD_DTM, this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KK0081_UPD_DTM));
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.main end");
	}
	
	
	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>電話セレクトオプションパック処理 照会処理<BR>
	 * <dt>処理補足：
	 * <dd>電話セレクトオプションパックの照会処理を行う
	 * </dl>
	 * @return 割引サービス契約（電話セレクトオプションパック）の照会結果リスト
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, String>> syokaiTelSelectOpPack() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.syokaiTelSelectOpPack start");
		
		// 割引サービス契約一覧照会
		HashMap<String, Object> ekk0451b001Msg = callEKK0451B001();
		// 割引サービス対象契約一覧照会
		HashMap<String, Object> ekk0481b001Msg = callEKK0481B001(ekk0451b001Msg);
		// 割引サービス契約一意照会
		HashMap<String, Object> ekk0451a010Msg = callEKK0451A010(ekk0481b001Msg);
		
		// 呼出元への返却情報の作成
		ArrayList<HashMap<String, String>> rtrnList = new ArrayList();
		
// v9.00.01 ADD Start
		// ソート用マップ
		HashMap<String, HashMap<String, String>> sortMap = new HashMap<String, HashMap<String, String>>();
		ArrayList<String> sortList = new ArrayList();
// v9.00.01 ADD End
		
		String WRIB_SVC_KEI_NO      = "wrib_svc_kei_no";
		String WRIB_SVC_KEI_STAT    = "wrib_svc_kei_stat";
		String WRIB_SVC_CD          = "wrib_svc_cd";
		String SVC_USE_STA_KIBO_YMD = "svc_use_sta_kibo_ymd";
		String SVC_CHRG_STAYMD      = "svc_chrg_staymd";
		String SVC_CHRG_ENDYMD      = "svc_chrg_endymd";
		String PACK_DIV             = "pack_div";
// v9.00.05 ADD Start
		String RSV_APLY_YMD         = "rsv_aply_ymd";
// v9.00.05 ADD End
		
		Iterator<String> ite = ekk0451a010Msg.keySet().iterator();
		while (ite.hasNext())
		{
			String wribSvcKeiNo = ite.next();
			CAANMsg ekk0451a010 = (CAANMsg)ekk0451a010Msg.get(wribSvcKeiNo);
			String wribSvcCd = ekk0451a010.getString("wrib_svc_cd");
			
			//---------------------
			// 返却用の情報を詰める
			//---------------------
			HashMap wribSvcKei = new HashMap();
			wribSvcKei.put(WRIB_SVC_KEI_NO,      wribSvcKeiNo);
			wribSvcKei.put(WRIB_SVC_KEI_STAT,    ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_KEI_STAT));
			wribSvcKei.put(WRIB_SVC_CD,          wribSvcCd);
			wribSvcKei.put(SVC_USE_STA_KIBO_YMD, ekk0451a010.getString(EKK0451A010CBSMsg1List.SVC_USE_STA_KIBO_YMD));
			wribSvcKei.put(SVC_CHRG_STAYMD,      ekk0451a010.getString(EKK0451A010CBSMsg1List.SVC_CHRG_STAYMD));
			wribSvcKei.put(SVC_CHRG_ENDYMD,      ekk0451a010.getString(EKK0451A010CBSMsg1List.SVC_CHRG_ENDYMD));
// v9.00.05 ADD Start
			wribSvcKei.put(RSV_APLY_YMD,         ekk0451a010.getString(EKK0451A010CBSMsg1List.RSV_APLY_YMD));
// v9.00.05 ADD End
			if(WRIB_SVC_CD_PACK3.equals(wribSvcCd))
			{
				wribSvcKei.put(PACK_DIV,  PACK_DIV_PACK3);
			}
			// ANK-3754-00-00 ADD START
			else if (WRIB_SVC_CD_ANSN_TEL_PACK.equals(wribSvcCd))
			{
				wribSvcKei.put(PACK_DIV,  PACK_DIV_ANSN_TEL_PACK);
			}
			// ANK-3754-00-00 ADD END
			else
			{
				wribSvcKei.put(PACK_DIV,  PACK_DIV_PACK7);
			}
// v9.00.01 MOD Start
//			rtrnList.add(wribSvcKei);
			sortMap.put(wribSvcKeiNo, wribSvcKei);
			sortList.add(wribSvcKeiNo);
// v9.00.01 MOD End
		}
// v9.00.01 ADD Start
		// ソート
		Collections.sort(sortList);
		
// v9.00.05 ADD Start
		if(SORT_DIV_DESC.equals((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SORT_DIV)))
		{
			// ソート区分に"降順"が指定されている場合は割引サービス契約番号の降順に並べ替え
			// ※ソート区分が"昇順"または未設定の場合には昇順とするためリバースしない
			printlnEjbLog("ソート区分に降順が指定されているため、降順に並べ替え");
			Collections.reverse(sortList);
		}
// v9.00.05 ADD End
		
		for(int i = 0; i < sortList.size(); i++)
		{
			String wribsvcKeiNo = sortList.get(i);
			if(sortMap.containsKey(wribsvcKeiNo))
			{
				// ソートした割引サービス契約番号の順に返却用リストに詰める
				rtrnList.add(sortMap.get(wribsvcKeiNo));
			}
		}
// v9.00.01 ADD End
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.syokaiTelSelectOpPack end");
		return rtrnList;
	}

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>電話セレクトオプションパック処理 登録処理<BR>
	 * <dt>処理補足：
	 * <dd>電話セレクトオプションパックの登録処理を行う
	 * </dl>
	 * @return 登録結果の更新年月日時分秒
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String addTelSelectOpPack() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.addTelSelectOpPack start");
		
		// 割引サービス契約一覧照会
		HashMap<String, Object> ekk0451b001Msg = callEKK0451B001();
		// 割引サービス対象契約一覧照会
		HashMap<String, Object> ekk0481b001Msg = callEKK0481B001(ekk0451b001Msg);
		// 割引サービス契約一意照会
		HashMap<String, Object> ekk0451a010Msg = callEKK0451A010(ekk0481b001Msg);
		
		// パック割区分から割引サービスコードを特定
		HashMap<String, String> packMap = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_WRIB_SVC_CD_MAP);
		String wribSvcCd = (String)packMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		
		Iterator<String> ite = ekk0451a010Msg.keySet().iterator();
		while (ite.hasNext())
		{
			String wribSvcKeiNo = ite.next();
			CAANMsg ekk0451a010 = (CAANMsg)ekk0451a010Msg.get(wribSvcKeiNo);
			
			if(wribSvcCd.equals(ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_CD)))
			{
				String wribSvcKeiStat = ekk0451a010.getString("wrib_svc_kei_stat");
				if(!JKKStrConst.CD00055_DSLZM.equals(wribSvcKeiStat) && !JKKStrConst.CD00055_CSLZM.equals(wribSvcKeiStat))
				{
					printlnEjbLog("有効な割引サービス契約(" + wribSvcKeiNo + ")が存在するため以降の処理をスキップ");
					printlnEjbLog("JKKTelSelectOpPackOperateCC.addTelSelectOpPack end");
					return null;
				}
			}
		}
		// サービス契約一意照会
		CAANMsg ekk0081a010 = callEKK0081A010();
		
		// 課金先一覧照会（請求契約番号／サービス契約番号）
		String seikyKeiNo = callEKK0321B002();
		
		// 請求契約一意照会
		String updDtm = callEKK0491A010(seikyKeiNo);
		
		// 割引サービス対象サービス一覧照会
		CAANMsg ekk0851b001 = callEKK0851B001(ekk0081a010);
		
		if(ekk0851b001 == null)
		{
			// 該当の電話セレクトオプションパックが存在しない or サービス契約のプランに該当する割引サービス対象サービスが存在しない
			return null;
		}
		
		// 割引サービス契約登録
		CAANMsg ekk0451d010Msg = callEKK0451D010(ekk0851b001);
		
		// 課金先登録
		callEKK0321D010(seikyKeiNo, ekk0451d010Msg.getString(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO), updDtm);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.addTelSelectOpPack end");
		
		// 更新年月日時分秒を返却
		return ekk0451d010Msg.getString(EKK0451D010CBSMsg.UPD_DTM);
	}

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>電話セレクトオプションパック処理 解約処理<BR>
	 * <dt>処理補足：
	 * <dd>電話セレクトオプションパックの解約処理を行う
	 * </dl>
	 * @return 更新結果の更新年月日時分秒
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String dslTelSelectOpPack() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.dslTelSelectOpPack start");
		
// v9.00.07 DEL Start
//		// サービス契約一意照会
//		CAANMsg ekk0081a010 = callEKK0081A010();
// v9.00.07 DEL End
		// 割引サービス契約一覧照会
		HashMap<String, Object> ekk0451b001Msg = callEKK0451B001();
		// 割引サービス対象契約一覧照会
		HashMap<String, Object> ekk0481b001Msg = callEKK0481B001(ekk0451b001Msg);
		// 割引サービス契約一意照会
		HashMap<String, Object> ekk0451a010Msg = callEKK0451A010(ekk0481b001Msg);
		
// v9.00.04 ADD Start
		// サービス契約内訳一意照会
		CAANMsg ekk0161a010 = callEKK0161A010();
// v9.00.04 ADD End
		
// v9.00.01 ADD Start
		if(ekk0451a010Msg.size() == 0)
		{
// v9.00.06 MOD Start
//			// 該当の割引サービスコードのデータが存在しない場合
//			throw new CCException("解約対象の割引サービス契約が存在しません。", new Exception());
			
			printlnEjbLog("JKKTelSelectOpPackOperateCC.dslTelSelectOpPack end");
			return "";
// v9.00.06 MOD End
		}
// v9.00.01 ADD End
// v9.00.06 DEL Start
//// v9.00.03 ADD Start
//		// 連携されたパック割区分に該当する電話セレクトオプションパック存在フラグ
//		boolean existFlg = false;
//// v9.00.03 ADD End
// v9.00.06 DEL End
		
		// パック割区分から割引サービスコードを特定
		HashMap<String, String> packMap = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_WRIB_SVC_CD_MAP);
		String wribSvcCd = (String)packMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		
		String updDtm = "";
		Iterator<String> ite = ekk0451a010Msg.keySet().iterator();
		while (ite.hasNext())
		{
			String wribSvcKeiNo = ite.next();
			CAANMsg ekk0451a010 = (CAANMsg)ekk0451a010Msg.get(wribSvcKeiNo);
			
			if(wribSvcCd.equals(ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_CD)))
			{
// v9.00.02 DEL Start
//				// 課金非課金判定
//				String kakin = judgeKakinHikakin(ekk0081a010, ekk0451a010);
// v9.00.02 DEL End
// v9.00.06 DEL Start
//// v9.00.03 ADD Start
//				existFlg = true;
//// v9.00.03 ADD End
// v9.00.06 DEL End
				
				// パック割区分から特定した割引サービスコードで有効な割引サービス契約が存在する
				// 割引サービス契約ステータスによって解約・キャンセルを切り分ける
				String wribSvcKeiStat = ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_KEI_STAT);
				if(JKKStrConst.CD00055_SVCTK_CHU.equals(wribSvcKeiStat))
				{
					String dlreCd = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_DLRE_CD);
					if(JKKStringUtil.isNullBlank(dlreCd))
					{
						throw new CCException("サービス解約理由コードが設定されていません。", new Exception());
					}
						
// v9.00.02 ADD Start
// v9.00.04 MOD Start
					// 課金非課金判定
//					String kakin = judgeKakinHikakin(ekk0081a010, ekk0451a010);
					String kakin = judgeKakinHikakin(ekk0161a010, ekk0451a010);
// v9.00.04 MOD End
// v9.00.02 ADD End
// v9.00.04 MOD Start
// v9.00.07 DEL Start
//					String svcChrgStaYmd = ekk0161a010.getString(EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD);
//					String kisanYmd      = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KISAN_YMD);
//					String svcChrgStaDsl = "0";
//					if(JPCDateChecker.isEqualDate(svcChrgStaYmd, kisanYmd))
//					{
//						// サービス契約内訳の課金開始日に解約された場合のフラグを立てる（非課金にする）
//						svcChrgStaDsl = "1";
//					}
//					this.ccWorkMap.put(KEY_SVC_CHRG_STA_DSL, svcChrgStaDsl);
// v9.00.07 DEL End
					
//					// 割引サービス契約解約
//					CAANMsg ekk0451C020Msg = callEKK0451C020(ekk0451a010, kakin);
					CAANMsg ekk0451C020Msg = callEKK0451C020(ekk0451a010, ekk0161a010, kakin);
// v9.00.04 MOD End
					
					// 割引サービス契約解約確定
					CAANMsg ekk0451C030Msg = callEKK0451C030(ekk0451a010, ekk0451C020Msg);
					
					// 返却用の更新年月日時分秒を保持
					updDtm = ekk0451C030Msg.getString(EKK0451C030CBSMsg.UPD_DTM);
					break;
				}
				if(JKKStrConst.CD00055_UKZM.equals(wribSvcKeiStat))
				{
					// 割引サービス契約キャンセル
					CAANMsg ekk0451C070Msg = callEKK0451C070(ekk0451a010);
					
					// 返却用の更新年月日時分秒を保持
					updDtm = ekk0451C070Msg.getString(EKK0451C070CBSMsg.UPD_DTM);
					break;
				}
			}
// v9.00.03 DEL Start
//// v9.00.01 ADD Start
//			else
//			{
//				// 該当の割引サービスコードのデータが存在しない場合
//				throw new CCException("解約対象の割引サービス契約が存在しません。", new Exception());
//			}
//// v9.00.01 ADD End
// v9.00.03 DEL End
		}
		
// v9.00.06 DEL Start
//// v9.00.03 ADD Start
//		if(!existFlg)
//		{
//			// 該当の割引サービスコードのデータが存在しない場合
//			throw new CCException("解約対象の割引サービス契約が存在しません。", new Exception());
//		}
//// v9.00.03 ADD End
// v9.00.06 DEL End
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.dslTelSelectOpPack end");
		return updDtm;
	}

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>電話セレクトオプションパック処理 回復処理<BR>
	 * <dt>処理補足：
	 * <dd>電話セレクトオプションパックの回復処理を行う
	 * </dl>
	 * @return 更新結果の更新年月日時分秒
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private String kaihkTelSelectOpPack() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.kaihkTelSelectOpPack start");
		
		// 回復対象の割引サービス契約番号取得
		ArrayList kihkTgWribList = kihkTgTokut();
		
		if(JKKStringUtil.isNullEmpty(kihkTgWribList))
		{
			// 回復対象の割引なし
			return null;
		}
		
		// 割引サービス契約一覧照会
		HashMap<String, Object> ekk0451b001Msg = callEKK0451B001();
		// 割引サービス対象契約一覧照会
		HashMap<String, Object> ekk0481b001Msg = callEKK0481B001(ekk0451b001Msg);
		// 割引サービス契約一意照会
		HashMap<String, Object> ekk0451a010Msg = callEKK0451A010(ekk0481b001Msg);
		
		// パック割区分から割引サービスコードを特定
		HashMap<String, String> packMap = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_WRIB_SVC_CD_MAP);
		String wribSvcCd = (String)packMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		
		String updDtm = "";
		Iterator<String> ite = ekk0451a010Msg.keySet().iterator();
		while (ite.hasNext())
		{
			String wribSvcKeiNo = ite.next();
			CAANMsg ekk0451a010 = (CAANMsg)ekk0451a010Msg.get(wribSvcKeiNo);
			
			if(wribSvcCd.equals(ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_CD)) && kihkTgWribList.contains(wribSvcKeiNo))
			{
				// 該当の電話セレクトオプションパックが回復対象なので回復を実施
				if(JKKStrConst.CD00055_CSLZM.equals(ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_KEI_STAT)))
				{
					// 割引サービス契約キャンセル取消
					CAANMsg ekk0451C080Msg = callEKK0451C080(ekk0451a010);
					updDtm = ekk0451C080Msg.getString(EKK0451C080CBSMsg.UPD_DTM);
				}
				else if(JKKStrConst.CD00055_DSLZM.equals(ekk0451a010.getString(EKK0451A010CBSMsg1List.WRIB_SVC_KEI_STAT)))
				{
					// 割引サービス契約回復
					CAANMsg ekk0451C050Msg = callEKK0451C050(ekk0451a010);
					updDtm = ekk0451C050Msg.getString(EKK0451C050CBSMsg.UPD_DTM);
				}
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.kaihkTelSelectOpPack end");
		// 更新年月日時分秒を返却
		return updDtm;
	}

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>電話セレクトオプションパック処理 紐付登録<BR>
	 * <dt>処理補足：
	 * <dd>電話セレクトオプションパックの紐付登録処理を行う
	 * </dl>
	 * @return 登録結果の更新年月日時分秒
	 * @throws Throwable
	 */
	private String addTrgtSvcKei() throws Throwable, CCException
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.addTrgtSvcKei start");
		
		// 連携された割引サービス契約番号で、ダミーの割引サービス契約一覧照会情報リストを設定
		HashMap<String, Object> wribSvcInf = new HashMap<String, Object>();
		wribSvcInf.put((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_WRIB_SVC_KEI_NO), null);
		
		// 割引サービス対象契約一覧照会
		HashMap<String, Object> ekk0481b001Msg = callEKK0481B001(wribSvcInf);
		
		if(ekk0481b001Msg.size() != 0)
		{
			// 割引サービス対象契約一覧照会で結果が取得できたため、登録済として処理を終了する
			// ※既に割引サービス契約に対して該当のサービス契約内訳が紐付いている
			return null;
		}
		
		// 割引サービス契約一意照会
		HashMap<String, Object> ekk0451a010Msg = callEKK0451A010(wribSvcInf);
		
		if(ekk0451a010Msg.size() == 0)
		{
			// 紐付対象の割引サービス契約が存在しない（連携された割引サービス契約番号が"ｅｏ光電話パック３"・"ｅｏ光電話パック７"・"あんしん電話パック"でない）
			throw new CCException("指定の割引サービス契約番号は対象の割引サービスコードではありません。(" + this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_WRIB_SVC_KEI_NO) + ")", new Exception());
		}
		
		CAANMsg ekk0451a010 = null;
		Iterator<String> ite = ekk0451a010Msg.keySet().iterator();
		while (ite.hasNext())
		{
			String wribSvcKeiNo = ite.next();
			ekk0451a010 = (CAANMsg)ekk0451a010Msg.get(wribSvcKeiNo);
		}
		
		// 割引サービス対象契約登録
		CAANMsg ekk0481D010Msg = callEKK0481D010(ekk0451a010);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.addTrgtSvcKei end");
		
		// 更新年月日時分秒を返却
		return ekk0481D010Msg.getString(EKK0451D010CBSMsg.UPD_DTM);
	}

// v9.00.07 MOD Start
//	/**
//	 * <dl>
//	 * <dt>処理概要：
//	 * <dd>課金判定<BR>
//	 * <dt>処理補足：
//	 * <dd>課金・非課金の判定を行う
//	 * </dl>
//	 * @return rtrnDiv (1:課金 2:非課金)
//	 * @throws Throwable 
//	 */
	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>課金判定<BR>
	 * <dt>処理補足：
	 * <dd>課金・非課金の判定を行う
	 * </dl>
	 * @return rtrnDiv 解約区分
	 * @throws Throwable 
	 */
// v9.00.07 MOD End
	private String judgeKakinHikakin(CAANMsg svcKeiInf, CAANMsg wribSvcKeiInf) throws Throwable
	{
		
// v9.00.09 DEL START
//		
//		printlnEjbLog("JKKTelSelectOpPackOperateCC.judgeKakinHikakin start");
//		
//		String rtrnDiv = "";
//		String kakinDiv = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KAKIN_DIV);
//		
//// v9.00.07 MOD Start
//		// 異動区分
//		String idoDiv = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_IDO_DIV);
//		
////		String wribSvcKeiStat = wribSvcKeiInf.getString(EKK0451A010CBSMsg1List.WRIB_SVC_KEI_STAT);
////		if(JKKStrConst.CD00055_UKZM.equals(wribSvcKeiStat))
////		{
////			printlnEjbLog("受付済のため非課金とします");
////			// 割引サービス契約ステータスが「キャンセル済」の場合には判定処理を行わず非課金を返却
////			return KAKIN_DIV_HIKAKIN;
////		}
//// v9.00.07 MOD End
//		
//		String kisanYmd   = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KISAN_YMD);
//// v9.00.04 MOD Start
////		String svcChrgStaymd = svcKeiInf.getString(EKK0081A010CBSMsg1List.SVC_CHRG_STAYMD);
//		String svcChrgStaymd = svcKeiInf.getString(EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD);
//		
//// v9.00.07 DEL Start
////		// 課金区分連携あり
////		String kakinDivSet = "1";
//// v9.00.07 DEL End
//// v9.00.04 MOD End
//		if(JPCDateChecker.isFutureDate(svcChrgStaymd, kisanYmd, "0"))
//		{
//			// サービス契約の課金開始での解約
//// v9.00.07 MOD Start
////			rtrnDiv = KAKIN_DIV_HIKAKIN;
////			printlnEjbLog("サービス契約の課金開始前のため非課金とします。");
//			
//			// サービス契約内訳課金開始前での解約
//			rtrnDiv = DSL_DIV_11;
//// v9.00.07 MOD End
//		}
//		else
//		{
//			// 2014.06.12 IT2-2014-0000243 Add Start
//			// 異動区分が電番変更で、課金フラグが非課金の場合
//			if (IDO_DIV_00042.equals(idoDiv) && KAKIN_DIV_HIKAKIN.equals(kakinDiv))
//			{
//				rtrnDiv = DSL_DIV_14;
//			}
//			else
//			{
//			// 2014.06.12 IT2-2014-0000243 Add End
//			
//			String wribAddYmd = wribSvcKeiInf.getString(EKK0451A010CBSMsg1List.WRIB_ADD_YMD);
//			if(kisanYmd.substring(0, 6).equals(wribAddYmd.substring(0, 6)))
//			{
//				// 起算日と割引登録年月日が同月であることから、同月内の解約と判断
//				if(wribAddYmd.equals(kisanYmd))
//				{
//					// 起算日と割引登録年月日が同日であることから、同一登録解約と判断
//// v9.00.07 MOD Start
////					rtrnDiv = KAKIN_DIV_HIKAKIN;
////					printlnEjbLog("同一日登録解約のため非課金とします。");
//					
//					if(JKKStrConst.CD00576_00031.equals(idoDiv))
//					{
//						// 異動区分が "オプション設定" のため、割引単独解約と判定
//						rtrnDiv = DSL_DIV_12;
//					}
//					else
//					{
//						//  異動区分が "オプション設定" 以外のため、サービス契約・サービス契約内訳の解約に伴う解約と判定
//						rtrnDiv = DSL_DIV_13;
//					}
//// v9.00.07 MOD End
//				}
//				else
//				{
//// v9.00.07 MOD Start
////					// 連携された課金区分を使用する
////					if(JKKStringUtil.isNullBlank(kakinDiv))
////					{
////// v9.00.04 MOD Start
//////						throw new CCException("課金区分が設定されていません。", new Exception());
////						kakinDiv = KAKIN_DIV_KAKIN;
////						// 課金区分連携なし
////						kakinDivSet = "0";
////// v9.00.04 MOD End
////					}
////					rtrnDiv = kakinDiv;
////					printlnEjbLog("連携された課金区分で登録を行います。");
//					
//					// 登録翌日以降の解約
//					if(JKKStrConst.CD00576_00031.equals(idoDiv))
//					{
//						// 異動区分が "オプション設定" のため、割引単独解約と判定
//						if(KAKIN_DIV_KAKIN.equals(kakinDiv))
//						{
//							// サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−パック単独解約−課金解約
//							rtrnDiv = DSL_DIV_09;
//						}
//						else
//						{
//							// サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−パック単独解約−非課金解約
//							rtrnDiv = DSL_DIV_08;
//						}
//					}
//					else
//					{
//						// サービス契約内訳課金開始後−電話オプションパック申込と同月内解約−登録翌日以降−サービス契約・サービス契約内訳の解約
//						rtrnDiv = DSL_DIV_10;
//					}
//// v9.00.07 MOD End
//				}
//			}
//			else
//			{
//				// 割引のサービス課金開始年月日取得
//				String wribSvcChrgStaYmd = wribSvcKeiInf.getString(EKK0451A010CBSMsg1List.SVC_CHRG_STAYMD);
//				// 初回料金計算日を取得（割引のサービス課金開始日以降で直近の料金計算日を取得する）
//				CAANMsg[] ech0501a010 = this.mapper.callECH0501A010(FUNC_CD_2, wribSvcChrgStaYmd);
//				String eventYmd = ech0501a010[0].getString(ECH0501A010CBSMsg1List.EVENT_YMD);
//				
//				if(JPCDateChecker.isFutureDate(eventYmd, kisanYmd, "1"))
//				{
//// v9.00.07 MOD Start
////					if(JKKStringUtil.isNullBlank(kakinDiv))
////					{
////// v9.00.04 MOD Start
//////						throw new CCException("課金区分が設定されていません。", new Exception());
////						kakinDiv = KAKIN_DIV_KAKIN;
////						// 課金区分連携なし
////						kakinDivSet = "0";
////// v9.00.04 MOD End
////					}
////					// 起算日が初回料金計算日前or初回料金計算日当日
////					rtrnDiv = kakinDiv;
////					printlnEjbLog("連携された課金区分で登録を行います。");
//					
//					if(JKKStrConst.CD00576_00031.equals(idoDiv))
//					{
//						if(KAKIN_DIV_KAKIN.equals(kakinDiv))
//						{
//							// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−課金選択
//							rtrnDiv = DSL_DIV_02;
//						}
//						else if(KAKIN_DIV_HIKAKIN.equals(kakinDiv))
//						{
//							// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−非課金選択
//							rtrnDiv = DSL_DIV_01;
//						}
//						else
//						{
//							// サービス契約内訳の課金開始日と割引サービス契約の課金開始日が同日で、その課金開始日に解約
//							// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−パック単独解約−課金／非課金不可
//							rtrnDiv = DSL_DIV_03;
//						}
//					}
//					else
//					{
//						if(JPCDateChecker.isEqualDate(svcChrgStaymd, kisanYmd))
//						{
//							// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−サービス契約・サービス契約内訳の非課金解約
//							rtrnDiv = DSL_DIV_05;
//						}
//						else
//						{
//							// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−１日〜初回料金計算日まで−サービス契約・サービス契約内訳の解約
//							rtrnDiv = DSL_DIV_04;
//						}
//					}
//// v9.00.07 MOD End
//				}
//				else
//				{
//// v9.00.07 MOD Start
////					rtrnDiv = KAKIN_DIV_KAKIN;
////					printlnEjbLog("初回料金計算日以降のため課金とします。");
//					
//					if(JKKStrConst.CD00576_00031.equals(idoDiv))
//					{
//						// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−初回料金計算日翌日以降−パック単独解約
//						rtrnDiv = DSL_DIV_06;
//					}
//					else
//					{
//						// サービス契約内訳課金開始後−電話オプションパックの申込翌月以降−初回料金計算日翌日以降−サービス契約・サービス契約内訳の解約
//						rtrnDiv = DSL_DIV_07;
//					}
//// v9.00.07 MOD End
//				}
//			}
//			// 2014.06.12 IT2-2014-0000243 Add Start
//			}
//			// 2014.06.12 IT2-2014-0000243 Add End
//		}
//// v9.00.07 DEL Start
////// v9.00.04 ADD Start
////		// 課金区分連携有無を設定（割引の課金開始日当日に課金解約された場合に課金解約とするための判定に使用）
////		this.ccWorkMap.put(KEY_KAKIN_DIV_SET, kakinDivSet);
////// v9.00.04 ADD End
//// v9.00.07 DEL End
// v9.00.09 DEL END
		
		
// v9.00.09 ADD START
		
		// 引数
		String kakinDiv          = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KAKIN_DIV);	// 引数.課金区分
		String idoDiv            = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_IDO_DIV);		// 引数.異動区分
		String kisanYmd          = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_KISAN_YMD);	// 引数.解約起算日
		
		// DB情報
		String sCstaYmd          = svcKeiInf.getString(EKK0161A010CBSMsg1List.SVC_CHRG_STAYMD);				// サビ内訳.課金開始
		String wCstaYmd          = wribSvcKeiInf.getString(EKK0451A010CBSMsg1List.SVC_CHRG_STAYMD);			// 割引サビ.課金開始
		String wSstaymd          = wribSvcKeiInf.getString(EKK0451A010CBSMsg1List.SVC_STA_YMD);				// 割引サビ.サビ開始
		
		//電話番号変更による解約で、課金区分が非課金の場合は、非課金とする
		if (isDiv42(idoDiv) && isHikakin(kakinDiv))
			return DSL_DIV_14;
		
		if(JPCDateChecker.isFutureDate(sCstaYmd, kisanYmd, "0")) {
			
			/** サービス契約内訳課金開始前での解約  */
			
			// 異動区分が電話番号変更の場合
			if (isDiv42(idoDiv))
				return this.DSL_DIV_03;																	// 03
			
			// 電話番号変更以外の場合は、電話の単独解約またはサービス解約に伴った解約
			return this.DSL_DIV_02;																		// 02
		}
		
		/** サービス契約内訳課金開始後(同日含む)での解約  */
		
		// 7.同日解約の場合
		if (kisanYmd.compareTo(wSstaymd) == 0)
			return this.DSL_DIV_07;																		// 07
		
		// サービス開始前
		if (kisanYmd.compareTo(wSstaymd) < 0)																// 14
			return this.DSL_DIV_14;
		
		// 年月日定義
		String dslYm = kisanYmd.substring(0, 6);
		String staYm = wSstaymd.substring(0, 6);
		
		if (dslYm.equals(staYm)) {
			
			/** 同月解約 */
			
			// 異動区分が電話番号変更の場合
			if (isDiv42(idoDiv))
				return this.DSL_DIV_06;																	// 06
			
			// 電話番号変更以外の場合は、電話の単独解約またはサービス解約に伴った解約
			return this.DSL_DIV_05;																		// 05
			
		}
		
		/** ↓以降は,必然的に翌月以降 */
		
		String oneDay = kisanYmd.substring(kisanYmd.length() - 2);
		if ("01".equals(oneDay)) {
			
			/** １日解約 */
			
			// 異動区分が電話番号変更の場合
			if (isDiv42(idoDiv))
				return this.DSL_DIV_11;																	// 11
			
			// 電話番号変更以外の場合は、電話の単独解約またはサービス解約に伴った解約且つ電オプの課金開始日とサービス契約内訳のサービス課金開始日が同日
			if (kisanYmd.equals(sCstaYmd) && kisanYmd.equals(wCstaYmd)) 
				return this.DSL_DIV_12;																	// 12

//v9.00.10 MOD START
//			// 電話番号変更以外の場合は、電話の単独解約またはサービス解約に伴った解約であり、電オプのサービス課金会日当日
//			return this.DSL_DIV_13;																		// 13
			//電話オプションパックのサービス課金開始日と同日の場合、
			if (kisanYmd.equals(wCstaYmd))
				return this.DSL_DIV_13;
			
			//上記以外の場合は、サービス契約内訳のサービス課金開始日、電話オプションパックのサービス課金開始日以外である。
			return this.DSL_DIV_11;
//v9.00.10 MOD END
		}
		
		/** 翌月以降で,１日以外 */
		
		// 異動区分が電話番号変更の場合
		if (isDiv42(idoDiv))
			return this.DSL_DIV_10;																		// 10
		
		// 電話番号変更以外の場合は、電話の単独解約またはサービス解約に伴った解約
		return this.DSL_DIV_09;																			// 09
		
		// ↓↓以降は到達しない為,返却不要.
		
// v9.00.09 ADD END
// v9.00.09 DEL START
//		printlnEjbLog("JKKTelSelectOpPackOperateCC.judgeKakinHikakin end");
//		return rtrnDiv;
// v9.00.09 DEL END
	}

// v9.00.09 ADD START
	
	/**
	 * 
	 * 異動区分判定：異動区分（電番変更）or(光電話・番ポ情報変更)か否かを判定
	 * 
	 * @param  div
	 * @return true：電番変更or光電話・番ポ情報変更、false：以外
	 */
	private boolean isDiv42(String div) {
		//v10.00.00 2014/08/28 Mod Start
		//return this.IDO_DIV_00042.equals(div) ? true : false;
		return this.IDO_DIV_00042.equals(div)||this.IDO_DIV_00045.equals(div) ? true : false;
		//v10.00.00 2014/08/28 Mod End
	}
	
	/**
	 * 
	 * 課金区分判定：課金区分（非課金）か否かを判定
	 * 
	 * @param  kakinDiv
	 * @return true：非課金、false：課金
	 */
	private boolean isHikakin(String kakinDiv) {
		return this.KAKIN_DIV_HIKAKIN.equals(kakinDiv) ? true : false;
	}
	
// v9.00.09 ADD END
	
	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>回復対象割引サービス契約情報取得<BR>
	 * <dt>処理補足：
	 * <dd>回復対象となる該当割引の情報を取得する
	 * </dl>
	 * @return wriList 回復対象となる割引の割引サービス契約番号のリスト
	 * @throws Throwable 
	 */
	private ArrayList<String> kihkTgTokut() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.kihkTgTokut start");
		
// v9.00.01 MOD Start
//		// KK0481_割引サービス対象契約
//		CAANMsg[] ekk0481b003List = this.mapper.callEKK0481B003
//										(this.FUNC_CD_3, (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SYSID), (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_NO));
//		
//		// 割引サービス契約番号
//		ArrayList<String> wriList = new ArrayList<String>();
//		
//		for (CAANMsg ekk0481b003 : ekk0481b003List) {
//			wriList.add(ekk0481b003.getString(EKK0481B003CBSMsg1List.WRIB_SVC_KEI_NO));
//		}

		// KK0481_割引サービス対象契約
		CAANMsg[] ekk0481b004List = this.mapper.callEKK0481B004
										(this.FUNC_CD_1, (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SYSID), (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_UCWK_NO));
		
		// 割引サービス契約番号
		ArrayList<String> wriList = new ArrayList<String>();
		
		for (CAANMsg ekk0481b004 : ekk0481b004List) {
			wriList.add(ekk0481b004.getString(EKK0481B004CBSMsg1List.WRIB_SVC_KEI_NO));
		}
// v9.00.01 MOD End
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.kihkTgTokut end");
		
		return wriList;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0481_割引サービス対象契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> callEKK0451B001() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451B001 start");
		
		// KK0481_割引サービス対象契約
		CAANMsg[] ekk0451b001List = this.mapper.callEKK0451B001(this.FUNC_CD_1, (String) this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_NO));
		
		// key：割引サービス契約番号 value:DB取得結果
		HashMap<String, Object> wriInf = new HashMap<String, Object>();
		
		for (CAANMsg ekk0451b001 : ekk0451b001List) {
			
			if(((ArrayList)this.ccWorkMap.get(KEY_PACK_CD_LIST)).contains(ekk0451b001.getString(EKK0451B001CBSMsg1List.WRIB_SVC_CD)))
			{
				// 該当の電話セレクトオプションパックの場合に割引情報を保持する
				String wribSvcKeiNo = ekk0451b001.getString(EKK0451B001CBSMsg1List.WRIB_SVC_KEI_NO);
				wriInf.put(wribSvcKeiNo, ekk0451b001);
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451B001 end");
		return wriInf;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0451_割引サービス契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private HashMap<String, Object> callEKK0451A010(HashMap<String, Object> wribSvcTgKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451A010 start");
		
		// key:割引サービス契約番号 value:DB取得結果
		HashMap<String, Object> workMap = new HashMap<String, Object>();
		
		Iterator<String> ite = wribSvcTgKeiInf.keySet().iterator();
		while (ite.hasNext()) {
			String wribSvcKeiNo = ite.next();
			
			CAANMsg[] ekk0451a010 = this.mapper.callEKK0451A010(this.FUNC_CD_2, wribSvcKeiNo);
			
			if(((ArrayList)this.ccWorkMap.get(KEY_PACK_CD_LIST)).contains(ekk0451a010[0].getString(EKK0451A010CBSMsg1List.WRIB_SVC_CD)))
			{
				// eo光電話パック３、eo光電話パック７、あんしん電話パックの場合に情報を保持させる
				workMap.put(wribSvcKeiNo, ekk0451a010[0]);
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451A010 end");
		return workMap;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約登録<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callEKK0451D010(CAANMsg wrisvcTrgtSvcInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451D010 start");
		
		// 呼出元から連携されたパック割区分から割引サービスコード・料金コースコード・料金プランコードを取得
		HashMap<String, String> wribSvcCdMap = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_WRIB_SVC_CD_MAP);
		HashMap<String, String> pcrsCdMap    = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_PCRS_CD_MAP);
		HashMap<String, String> pplanCdMap   = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_PPLAN_CD_MAP);
		String wribSvcCd = (String)wribSvcCdMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		String pcrsCd    = (String)pcrsCdMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		String pplanCd   = (String)pplanCdMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		
		// 割引サービス対象サービスコード取得
		String wribSvcTgSvcCd = wrisvcTrgtSvcInf.getString(EKK0851B001CBSMsg1List.WRIB_SVC_TRGT_SVC_CD);
		
		// KK0451_割引サービス契約登録
		CAANMsg ekk0451d010Msg = this.mapper.callEKK0451D010(this.FUNC_CD_1, this.ccWorkMap, wribSvcCd, pcrsCd, pplanCd, wribSvcTgSvcCd);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451D010 end");
		return ekk0451d010Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約解約<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @param kakinDiv
	 * @return
	 * @throws Throwable
	 */
// v9.00.04 MOD Start
//	private CAANMsg callEKK0451C020(CAANMsg wribSvcKeiInf, String kakinDiv) throws Throwable
	private CAANMsg callEKK0451C020(CAANMsg wribSvcKeiInf, CAANMsg svcKeiUcwkInf, String kakinDiv) throws Throwable
// v9.00.04 MOD End
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C020 start");
		
// v9.00.04 MOD Start
//		CAANMsg ekk0451C020Msg = this.mapper.callEKK0451C020(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf, kakinDiv);
		CAANMsg ekk0451C020Msg = this.mapper.callEKK0451C020(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf, svcKeiUcwkInf, kakinDiv);
// v9.00.04 MOD End
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C020 end");
		return ekk0451C020Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約解約確定<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @param kakinDiv
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg callEKK0451C030(CAANMsg wribSvcKeiInf, CAANMsg ekk0451C020Msg) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C030 start");
		
		CAANMsg ekk0451C030Msg = this.mapper.callEKK0451C030(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf, ekk0451C020Msg);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C030 end");
		return ekk0451C030Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約キャンセル<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg callEKK0451C070(CAANMsg wribSvcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C070 start");
		
		CAANMsg ekk0451C070Msg = this.mapper.callEKK0451C070(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C070 end");
		return ekk0451C070Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約回復<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg callEKK0451C050(CAANMsg wribSvcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C050 start");
		
		CAANMsg ekk0451C050Msg = this.mapper.callEKK0451C050(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C050 end");
		return ekk0451C050Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス契約キャンセル取消<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg callEKK0451C080(CAANMsg wribSvcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C080 start");
		
		CAANMsg ekk0451C080Msg = this.mapper.callEKK0451C080(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0451C080 end");
		return ekk0451C080Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0481_割引サービス対象契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private HashMap<String, Object> callEKK0481B001(HashMap<String, Object> wribSvcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0481B001 start");
		
		// 連携されたサービス契約内訳番号
		String svcKeiUcwkNo = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_UCWK_NO);
		
		// key：割引サービス契約番号 value:DB取得結果
		HashMap<String, Object> wriInf = new HashMap<String, Object>();
		
		Iterator<String> ite = wribSvcKeiInf.keySet().iterator();
		while (ite.hasNext()) {
			String wribSvcKeiNo = ite.next();
			
			CAANMsg[] ekk0481b001 = this.mapper.callEKK0481B001(this.FUNC_CD_1, wribSvcKeiNo);
			
			for(int i = 0; i < ekk0481b001.length; i++)
			{
				if(svcKeiUcwkNo.equals(ekk0481b001[i].getString(EKK0481B001CBSMsg1List.SVC_KEI_UCWK_NO)))
				{
					// 連携されたサービス契約内訳番号に紐付く割引サービス契約対象契約の情報を保持させる
					wriInf.put(wribSvcKeiNo, ekk0481b001[i]);
				}
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0481B001 end");
		return wriInf;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引サービス対象契約登録<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param wribSvcKeiInf
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg callEKK0481D010(CAANMsg wribSvcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0481D010 start");
		
		CAANMsg ekk0481D010Msg = this.mapper.callEKK0481D010(this.FUNC_CD_1, this.ccWorkMap, wribSvcKeiInf);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0481D010 end");
		return ekk0481D010Msg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0081_サービス契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private CAANMsg callEKK0081A010() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0081A010 start");
		
		// サービス契約番号
		String svcKeiNo = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_NO);
		
		CAANMsg[] ekk0081a010 = this.mapper.callEKK0081A010(this.FUNC_CD_2, svcKeiNo);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0081A010 end");
		return ekk0081a010[0];
	}

// v9.00.04 ADD Start
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0161_サービス契約内訳を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private CAANMsg callEKK0161A010() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0161A010 start");
		
		// サービス契約内訳番号
		String svcKeiUcwkNo = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_UCWK_NO);
		
		CAANMsg[] ekk0161a010 = this.mapper.callEKK0161A010(this.FUNC_CD_2, svcKeiUcwkNo);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0161A010 end");
		return ekk0161a010[0];
	}
// v9.00.04 ADD End

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0491_請求契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private String callEKK0491A010(String seikyKeiNo) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0491A010 start");
		
		CAANMsg[] ekk0491a010 = this.mapper.callEKK0491A010(this.FUNC_CD_2, seikyKeiNo);
		
		String lastUpdDtm = ekk0491a010[0].getString(EKK0491A010CBSMsg1List.LAST_UPD_DTM);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0491A010 end");
		
		return lastUpdDtm;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0851_割引サービス対象サービスを検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callEKK0851B001(CAANMsg svcKeiInf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0851B001 start");
		
		// サービス契約情報からプランコード取得
		String pplancd = svcKeiInf.getString(EKK0081A010CBSMsg1List.PPLAN_CD);
		
		// 呼出元から連携されたパック割区分から割引サービスコードを取得
		HashMap<String, String> packMap = (HashMap<String, String>)this.ccWorkMap.get(this.KEY_WRIB_SVC_CD_MAP);
		String wribSvcCd = (String)packMap.get((String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV));
		
		// KK0851_割引サービス対象サービス
		CAANMsg[] ekk0851b001List = this.mapper.callEKK0851B001(this.FUNC_CD_3, wribSvcCd);
		
		CAANMsg rtrnCaanMsg = null;
		if(ekk0851b001List != null && ekk0851b001List.length != 0)
		{
			for (CAANMsg ekk0851b001 : ekk0851b001List) {
				
				String pplanCd = ekk0851b001.getString(EKK0851B001CBSMsg1List.PPLAN_CD);
				if(pplancd.equals(pplanCd))
				{
					// サービス契約の料金プランと一致した割引サービス対象サービスコードの情報を保持する
					rtrnCaanMsg = ekk0851b001;
					break;
				}
			}
		}
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0851B001 end");
		return rtrnCaanMsg;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0321_課金先を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private String callEKK0321B002() throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0321B002 start");
		
		// KK0321_課金先
		CAANMsg[] ekk0321b002List = this.mapper.callEKK0321B002(this.FUNC_CD_1, (String) this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_NO));
		
		String seikyKeiNo = ekk0321b002List[0].getString(EKK0321B002CBSMsg1List.SEIKY_KEI_NO);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0321B002 end");
		return seikyKeiNo;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>課金先登録<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private void callEKK0321D010(String seikyKeiNo, String wribSvcKeiNo, String updDtmBf) throws Throwable
	{
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0321D010 start");
		
		// KK0321_課金先登録
		this.mapper.callEKK0321D010(this.FUNC_CD_1, seikyKeiNo, wribSvcKeiNo, updDtmBf);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.callEKK0321D010 end");
	}


	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>初期設定を実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  handle    セッションハンドル
	 * @param  param     リクエストパラメータ
	 * @param  fixedText サービスメッセージ
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings({ "unchecked" })
	private void initSetUp(SessionHandle handle,
								IRequestParameterReadWrite param,
								String fixedText,
								String opeDate) throws RequestParameterException {
		printlnEjbLog("JKKTelSelectOpPackOperateCC.initSetUp start");
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKTelSelectOpPackOperateMapperCC(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>) param.getData(fixedText);
		printlnEjbLog("fixedText=" + fixedText);
		
		// 電話セレクトオプションパック操作部品クラス用の作業領域
		this.ccWorkMap = new HashMap();
		this.ccWorkMap.put(OPE_DATE, opeDate);
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.initSetUp end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェック.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("JKKTelSelectOpPackOperateCC.chkInMap start");
		
		// 機能コード
		setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_FUNC_CD, "0");
		List<String> funcCdList = Arrays.asList(CC_FUNC_CD_1, CC_FUNC_CD_2);
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_FUNC_CD, funcCdList);
		
		// 処理区分
		setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV, "0");
		List<String> trnDivList = Arrays.asList(TRN_DIV_SYOKAI, TRN_DIV_ADD, TRN_DIV_DSL, TRN_DIV_KIHK, TRN_DIV_TGADD);
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV, trnDivList);
		
		//---------------------------
		// 必須チェック
		//---------------------------
		// サービス契約番号
		setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_NO, "0");
		
		// サービス契約内訳番号
		setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SVC_KEI_UCWK_NO, "0");
		
		
		String trnDiv = (String)this.ccWorkMap.get(JKKTelSelectOpPackOperateCC.KEY_TRN_DIV);
		if(!this.TRN_DIV_SYOKAI.equals(trnDiv))
		{
			//----------------------------------------------
			//  照会以外での呼出
			//----------------------------------------------
			// SYSID
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SYSID, "0");
			
			// 申込明細番号
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_MSKM_DTL_NO, "0");
			
			
			if(this.TRN_DIV_DSL.equals(trnDiv))
			{
				//-------------------------------------------------
				// 解約での呼出しの場合は下記項目を必須とする
				//-------------------------------------------------
				// サービス解約理由コード
				setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SVC_DLRE_CD, "1");
				
				// サービスキャンセル理由コード
				setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SVC_CANCEL_RSN_CD, "0");
				
				// 課金区分
				setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_KAKIN_DIV, "1");
				
				// 違約金区分
				setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_PNLTY_DIV, "0");
			}
			
			// 起算日
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_KISAN_YMD, "0");
			
			// 利用開始希望日
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_USE_STA_KIBO_YMD, "1");
			
			// 異動区分
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_IDO_DIV, "0");
			
			// パック割区分
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV, "0");
			
			// 更新年月日時分秒（更新前）
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_KK0081_UPD_DTM, "0");
			
		}
		if(this.TRN_DIV_TGADD.equals(trnDiv))
		{
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_WRIB_SVC_KEI_NO, "0");
		}
		
// v9.00.05 ADD Start
		if(this.TRN_DIV_SYOKAI.equals(trnDiv))
		{
			setterWorkParam(JKKTelSelectOpPackOperateCC.KEY_SORT_DIV, "1");
		}
// v9.00.05 ADD End
		
		//---------------------------
		// 設定値チェック
		//---------------------------
		// パック割区分
		// ANK-3754-00-00 MOD START
		//List<String> packDivList = Arrays.asList(PACK_DIV_PACK3, PACK_DIV_PACK7);
		List<String> packDivList = Arrays.asList(PACK_DIV_PACK3, PACK_DIV_PACK7, PACK_DIV_ANSN_TEL_PACK);
		// ANK-3754-00-00 MOD END
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_PACK_DIV, packDivList);
		
		// 課金区分
		List<String> kakinDivList = Arrays.asList(KAKIN_DIV_KAKIN, KAKIN_DIV_HIKAKIN);
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_KAKIN_DIV, kakinDivList);
		
		// 違約金区分
		List<String> pnltyDivList = Arrays.asList(PNLTY_DIV_NASHI, PNLTY_DIV_ARI);
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_PNLTY_DIV, pnltyDivList);
		
// v9.00.05 ADD Start
		// ソート区分
		List<String> sortDivList = Arrays.asList(SORT_DIV_ASC, SORT_DIV_DESC);
		setterWorkParamValue(JKKTelSelectOpPackOperateCC.KEY_SORT_DIV, sortDivList);
// v9.00.05 ADD End
		
		printlnEjbLog("JKKTelSelectOpPackOperateCC.chkInMap end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>keyに紐づく引数を内部mapへ保持<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  key 
	 * @throws CCException 
	 */
	private void setterWorkParam(String key, String nullDiv) throws CCException {
		
		String obj = (String) this.inMap.get(key);
		
		if (!JKKStringUtil.isNullBlank(obj) || "1".equals(nullDiv)) {
			printlnEjbLog(key + "=" + obj);
			this.ccWorkMap.put(key, obj);
		} else {
			printlnEjbLog(key + "=NULL");
			throw new CCException(key + "=NULL", new Exception());
		}
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>keyに紐づく引数を内部mapへ保持<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  key 
	 * @throws CCException 
	 */
	private void setterWorkParamValue(String key, List valueList) throws CCException {
		
		String obj = (String) this.inMap.get(key);
		
		if(JKKStringUtil.isNullBlank(obj))
		{
			return;
		}
		
		if (!valueList.contains(obj)) {
			printlnEjbLog(key + "=対象外の値が設定されています");
			throw new CCException(key + "=対象外の値が設定されています", new Exception());
		}
	}
	
	/**
	 * 基準となる日付を取得
	 * 
	 * バッチから呼び出された場合、「バッチ運用日+1日」
	 * オンラインがら呼び出された場合、「オンライン運用日」
	 * 
	 * @param param 
	 * @throws Throwable 
	 */
	private String getOpeDateCc(IRequestParameterReadWrite param) throws Throwable {
		
		final String CALL_TYPE_BATCH = "4";
		final int TRAN_ID_JOB_ID_DIGIT_STA = 9;
		final int TRAN_ID_JOB_ID_DIGIT_END = 20;
		final List<String> tgJobBDate = Arrays.asList(new String[] {"EO2270210J0"});	// 強制解約バッチ
		final List<String> tgJobNDate = Arrays.asList(new String[] {"EO2A60220J0"});	// 異動予約反映バッチ
		
		String batchJobId = "";
		String trnId = (String) param.getControlMapData(SCControlMapKeys.REQ_VIEWID);
		String callType = param.getCallType();
		
		if (trnId != null && trnId.length() >= TRAN_ID_JOB_ID_DIGIT_END)
			batchJobId = trnId.substring(TRAN_ID_JOB_ID_DIGIT_STA, TRAN_ID_JOB_ID_DIGIT_END);
		
		if (CALL_TYPE_BATCH.equals(callType)) {
			if (tgJobBDate.contains(batchJobId))
			{
				return JCCBPCommon.getBatOpeDate(null);
			}
			if (tgJobNDate.contains(batchJobId))
			{
				return JCCBPCommon.getOpeDate(null);
			}
		}
		return JCCBPCommon.getOpeDate(null);
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	@SuppressWarnings("static-access")
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
}
