/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKGlobalIpAddCfmCC
 *   ソースファイル名：JKKGlobalIpAddCfmCC.java
 *   作成者          ：FJ
 *   日付            ：2013年12月05日
 *＜機能概要＞
 *   マルチセッションを登録する。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v6.00       2013/12/05   FJ)富士通     [OM-2013-0002398]新規作成
 *	v25.00.00	 2016/08/01   FJ)江藤	  【OM-2016-0000890】認証IDが変わるコース変更の場合、旧認証IDに対して固定IPを払い出す対応
 *	v25.01.00	 2016/08/01   FJ)江藤	  【OM-2016-0000890】認証IDが変わるコース変更の場合、一時金が2重で登録される不具合対応
 *	v26.00.00	 2016/08/03   FJ)原田	  【ANK-2765-00-00】認証IDの統一化
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKHakkoSODConstCC;
import com.fujitsu.futurity.bp.custom.constant.KKSV0022_KKSV0022OP_KKSV002201CC;
import com.fujitsu.futurity.bp.custom.constant.KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list;
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.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0171A010CBSMsg1List;

public class JKKGlobalIpAddCfmCC extends AbstractCommonComponent {
	
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKGlobalIpAddCfmCCMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;
	
	/** 割引解約新規作成用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** 機能コード */
	private final String FUNC_CD_1 = "1";
	private final String FUNC_CD_2 = "2";
	
	/** 引数KEY ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
	
	/** 機能コード */
	private static final String KEY_FUNC_CD                    = "func_cd";
	/** サービス契約番号 */
	private static final String KEY_SVC_KEI_NO                 = "key_svc_kei_no";
	/** SYSID */
	private static final String KEY_SYSID                      = "key_sysid";
	/** 予約適用年月日 */
	private static final String KEY_RSV_APLY_YMD               = "key_rsv_aply_ymd";
	/** 申込種別コード */
	private static final String MSKM_SBT_CD                    = "mskm_sbt_cd";
	/** 運用年月日時分秒 */
	private static final String MSKM_UK_DTM                    = "mskm_uk_dtm";
	/** コンシューマ営業用申込状態識別コード */
	private static final String CONSMBSN_MSKM_STAT_SKBT_CD     = "consmbsn_mskm_stat_skbt_cd";
	/** オプションサービスコード */
	private static final String OP_SVC_CD                      = "op_svc_cd";
	/** オプションサービスコード */
	private static final String PCRS_CD                        = "pcrs_cd";
	/** 料金プランコード */
	private static final String PPLAN_CD                       = "pplan_cd";
	/** 親契約識別コード */
	private static final String OYA_KEI_SKBT_CD                = "oya_kei_skbt_cd";
	/** サービス契約内訳番号 */
	private static final String SVC_KEI_UCWK_NO                = "svc_kei_ucwk_no";
	/** 利用開始年月日 */
	private static final String SVC_USE_STA_KIBO_YMD           = "svc_use_sta_kibo_ymd";
	/** 固定IPアドレス */
	private static final String KOTEI_IP_AD                    = "kotei_ip_ad";
	/** サブネットマスク */
	private static final String NETMASK                        = "netmask";
	/** 請求契約番号 */
	private static final String SEIKY_KEI_NO                   = "seiky_kei_no";
	/** 事務手数料自動適用要否 */
	private static final String RULE0059_AUTO_APLY             = "rule0059_auto_aply";
	/** 課金開始年月日 */
	private static final String SVC_CHRG_STAYMD                = "svc_chrg_staymd";
	/** 異動区分 */
	private static final String IDO_DIV                        = "ido_div";
	/** サービス契約回線内訳番号 */
	private static final String SVC_KEI_KAISEN_UCWK_NO         = "svc_kei_kaisen_ucwk_no";
	/** 進捗ステータス */
	private static final String PRG_STAT                       = "prg_stat";
	/** 進捗特記事項１ */
	private static final String PRG_TKJK_1                     = "prg_tkjk_1";
	/** オーダ種別コード */
	private static final String ORDER_SBT_CD                   = "order_sbt_cd";
	/** サービスオーダコード */
	private static final String SVC_ORDER_CD                   = "svc_order_cd";
	/** 要求種別コード */
	private static final String YOKYU_SBT_CD                   = "yokyu_sbt_cd";
	/** オーダ発行条件コード */
	private static final String ODR_HAKKO_JOKEN_CD             = "odr_hakko_joken_cd";
	/** オーダ内容コード */
	private static final String ODR_NAIYO_CD                   = "odr_naiyo_cd";
	/** 世代登録年月日時分秒 */
	private static final String KK0161_GENE_ADD_DTM            = "kk0161_gene_add_dtm";
	/** 固定ＩＰアドレス */
	private static final String FIXIPAD_IN                     = "fixipad_in";
	/** 更新年月日時分秒 */
	private static final String ZM0101_UPD_DTM_BF              = "zm0101_upd_dtm_bf";
	/** 利用開始年月日 */
	private static final String USE_STAT_YMD                   = "use_stat_ymd";
	/** 集約局 */
	private static final String SHYAKK_CHUSKK_CD_IN            = "shyakk_chuskk_cd_in";
	/** 固定ＩＰ取得種別コード */
	private static final String KOTEI_IP_STKU_SBT_CD_IN        = "kotei_ip_stku_sbt_cd_in";
	/** 使用回数 */
	private static final String USE_CNT_IN                     = "use_cnt_in";
	
	/** 抽出KEY ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
	
	/** EKK0081A010 */
	private static final String RET_EKK0081A010 = "RET_EKK0081A010";
	/** EKK0171A010 */
	private static final String RET_EKK0171A010 = "RET_EKK0171A010";
	/** ECK0011A010 */
	private static final String RET_ECK0011A010 = "RET_ECK0011A010";
	/** EKK0161B001 */
	private static final String RET_EKK0161B001 = "RET_EKK0161B001";
	
	/** EKK0361D010 */
	private static final String RET_EKK0361D010 = "RET_EKK0361D010";
	/** EKK0361C010 */
	private static final String RET_EKK0361C010 = "RET_EKK0361C010";
	/** EKK0361C030 */
	private static final String RET_EKK0361C030 = "RET_EKK0361C030";
	/** EKK0361C040 */
	private static final String RET_EKK0361C040 = "RET_EKK0361C040";
	/** EKK0011D020 */
	private static final String RET_EKK0011D020 = "RET_EKK0011D020";
	/** EKK1091D010 */
	private static final String RET_EKK1091D010 = "RET_EKK1091D010";
	/** EKK1081D010 */
	private static final String RET_EKK1081D010 = "RET_EKK1081D010";
	/** EKK1551D010 */
	private static final String RET_EKK1551D010 = "RET_EKK1551D010";
	/** EKK0021C060 */
	private static final String RET_EKK0021C060 = "RET_EKK0021C060";
	/** EKK0321B002 */
	private static final String RET_EKK0321B002 = "RET_EKK0321B002";
	
	// OM-2016-0000890 固定IPアドレス、事務手数料自動適用要否の登録用のWORKキーを追加 2016/08/01 ADD START
	/** ワークKEY ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
	/** WK固定IPアドレス */
	private static final String WK_KOTEI_IP_AD = "wk_kotei_ip_ad";
	/** WKネットマスク */
	private static final String WK_NETMASK = "wk_netmask";
	/** WK事務手数料自動適用要否 */
	private static final String WK_RULE0059_AUTO_APLY = "wk_rule0059_auto_aply";
	// OM-2016-0000890 固定IPアドレス、事務手数料自動適用要否の登録用のWORKキーを追加 2016/08/01 ADD END
	
	/**
	 * 
	 * <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);
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>グローバルIPアドレス情報を登録する.<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("execute start");
		
		// 初期処理
		initSetUp(handle, param, fixedText);
		
		// 入力データチェック
		chkInMap(handle, param);
		
		// 機能コード「チェックのみ」の場合は、主処理は行わない
		if (this.FUNC_CD_2.equals(this.ccWorkMap.get(KEY_FUNC_CD)))
			return param;
		
		// メイン処理実行
		main(handle, param);

		printlnEjbLog("execute end");
		return param;
	}
	
	/**
	 * 
	 * <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) throws RequestParameterException {
		printlnEjbLog("initSetUp start");
		
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKGlobalIpAddCfmCCMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>) param.getData(fixedText);
		printlnEjbLog("fixedText=" + fixedText);
		
		// 割引解約新規作成部品クラス用の作業領域
		this.ccWorkMap = new HashMap();
		
		printlnEjbLog("initSetUp end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>主処理<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  handle セッションハンドル
	 * @param  param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void main(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("main start");
		
		// 申込明細照査・後続業務依頼判定用
		boolean reqChkmskm = false;
		
		// ループ外での使用項目
		String svcKeiUcwkNo  = "";		// サービス契約内訳番号
		String opSvcKeiNo    = "";		// オプションサービス契約番号
		String opDtm         = "";		// オプション更新年月日
		String opGeneAddDtm  = "";		// オプション世代登録年月日
		
		// ANK-2765-00-00 ADD START
		// サービスオーダ発行CCに渡すリスト
		List<Map<String, String>> sodList = new ArrayList<Map<String, String>>();
		// ANK-2765-00-00 ADD END
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// １．検索：サービス契約一意照会
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_EKK0081A010, this.mapper.callEKK0081A010(this.FUNC_CD_2, (String) this.ccWorkMap.get(KEY_SVC_KEI_NO)));
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// ２．検索：お客様一意照会
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_ECK0011A010, this.mapper.callECK0011A010(this.FUNC_CD_2, (String) this.ccWorkMap.get(KEY_SYSID)));
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// ３．検索：課金先一覧照会
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_EKK0321B002, this.mapper.callEKK0321B002(this.FUNC_CD_1, (String) this.ccWorkMap.get(KEY_SVC_KEI_NO)));
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// ４．登録：申込内容承認登録
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_EKK0011D020, this.mapper.callEKK0011D020((String) this.ccWorkMap.get(KEY_FUNC_CD), this.ccWorkMap));
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// ５．検索：サービス契約内訳（予約の最新とカレント）一覧照会
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_EKK0161B001, this.mapper.callEKK0161B001(this.FUNC_CD_1, (String) this.ccWorkMap.get(KEY_SVC_KEI_NO)));
		
		// サービス契約内訳の件数分
		CAANMsg[] msg = (CAANMsg[]) this.ccWorkMap.get(RET_EKK0161B001);
		// OM-2016-0000890 コース変更中の旧認証の固定IPを払い出す対応 2016/08/01 MOD START
//		for (CAANMsg caanMsg : msg) {
		// コース変更中の場合、新認証IDの固定IPアドレスを画面で払い出しており、
		// 旧認証IDの固定IPを払い出す前に、新認証IDの固定IPをオプションサービス契約に登録およびエイジイング登録しないと、
		// 旧認証IDの固定IPを払い出そうとすると、固定IPのプールが同じ場合、画面で払い出した固定IPと同じものを払い出してしまう。
		// このため、新認証ID側から先に処理するようサービス契約内訳番号の降順で繰り返す。
		for (int i = msg.length - 1; i >= 0; i--)
		{
			CAANMsg caanMsg = msg[i]; 
		// OM-2016-0000890 コース変更中の旧認証の固定IPを払い出す対応 2016/08/01 MOD END
			
			// 処理不要
			if (caanMsg == null)
				continue;
			
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD START
			HashMap<String, Object> fixipadHradsiMap = new HashMap<String, Object>();
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD END

			// サービス契約内訳番号
			svcKeiUcwkNo = caanMsg.getString("svc_kei_ucwk_no");
			// 内訳ステータス
			String uwStat = caanMsg.getString("svc_kei_ucwk_stat");
			
			// ANK-2765-00-00 ADD START
			// サービス契約内訳世代登録年月日時分秒
			String svcKeiUcwkGeneAddDtm = caanMsg.getString("gene_add_dtm");
			// ANK-2765-00-00 ADD END
			
			// 申込明細照査・後続業務依頼判定実施
			reqChkmskm = !"010".equals(uwStat) ? true : false;
			
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// ６．検索：サービス契約内訳＜eo光ネット＞一意照会
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			this.ccWorkMap.put(RET_EKK0171A010, this.mapper.callEKK0171A010(this.FUNC_CD_2, caanMsg.getString("svc_kei_ucwk_no")));
			
			
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD START
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// 登録用の固定IPアドレスの設定
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// INPUT.サービス契約内訳番号 ＝ 処理中のサービス契約内訳番号の場合
			if (svcKeiUcwkNo.equals(this.ccWorkMap.get(SVC_KEI_UCWK_NO)))
			{
				// WK固定IPアドレス ← INPUT.固定IPアドレス
				this.ccWorkMap.put(WK_KOTEI_IP_AD, this.ccWorkMap.get(KOTEI_IP_AD));
				// WKネットマスク ← INPUT.ネットマスク
				this.ccWorkMap.put(WK_NETMASK, this.ccWorkMap.get(NETMASK));
				
				// コース変更中でない場合
				if(msg.length == 1)
				{
					// WK事務手数料自動適用要否  ← INPUT.事務手数料自動適用要否 
					this.ccWorkMap.put(WK_RULE0059_AUTO_APLY, this.ccWorkMap.get(RULE0059_AUTO_APLY));
				}
				// コース変更中の新認証の場合
				else
				{
					// WK事務手数料自動適用要否  ← 否(固定)
					this.ccWorkMap.put(WK_RULE0059_AUTO_APLY, JKKStrConst.CD00001_0);
				}
			}
			// INPUT.サービス契約内訳番号 ≠ 処理中のサービス契約内訳番号の場合(コース変更中の旧認証の内訳の場合)
			else
			{
				// サービス契約内訳＜eo光ネット＞一意照会結果からISP認証IDを取得
				CAANMsg[] eKK0171A010CBSMSG1LIST = (CAANMsg[])this.ccWorkMap.get(RET_EKK0171A010);
				
				String ispNinshoId = eKK0171A010CBSMSG1LIST[0].getString(EKK0171A010CBSMsg1List.ISP_NINSHO_ID);
				
				// サービス契約番号とISP認証IDをもとに、固定IPアドレスの払出
				fixipadHradsiMap=  this.getKoteiIpAd(handle, param, ispNinshoId);
				
				// WK固定IPアドレス ← 新たに払出した固定IPアドレス
				this.ccWorkMap.put(WK_KOTEI_IP_AD, fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.FIXIPAD));
				// WKネットマスク ← 新たに払出したネットマスク
				this.ccWorkMap.put(WK_NETMASK, fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.NETMASK));
				// WK事務手数料自動適用要否  ← INPUT.事務手数料自動適用要否 
				this.ccWorkMap.put(WK_RULE0059_AUTO_APLY, this.ccWorkMap.get(RULE0059_AUTO_APLY));
			}
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD END
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// ７．オプションサービス契約＜ISP＞登録
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			this.ccWorkMap.put(RET_EKK0361D010,
								this.mapper.callEKK0361D010(this.FUNC_CD_1,
																this.ccWorkMap,
																caanMsg.getString("svc_kei_ucwk_no"),
																getRetDbInf(this.mapper.callEKK0081A010(this.FUNC_CD_2, (String) this.ccWorkMap.get(KEY_SVC_KEI_NO)), "last_upd_dtm"),
																getRetDbInf((CAANMsg[]) this.ccWorkMap.get(RET_EKK0321B002), "seiky_kei_no"),
																getRetDbInf(((CAANMsg) this.ccWorkMap.get(RET_EKK0011D020)).getCAANMsgList("EKK0011D020CBSMsg1List"), "mskm_dtl_no")));
			
			// 値を保持
			CAANMsg ekk0361D010 = (CAANMsg) this.ccWorkMap.get(RET_EKK0361D010);
			
			opSvcKeiNo    = ekk0361D010.getString("op_svc_kei_no");						// オプションサービス契約番号
			opDtm         = ekk0361D010.getString("upd_dtm");							// 更新年月日
			opGeneAddDtm  = ekk0361D010.getString("kk0351_gene_add_dtm");				// 世代登録年月日
			
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// ８．オプションサービス契約＜ISP＞照査
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// [照査済]の場合
			if ("020".equals(uwStat)) {
				
				this.ccWorkMap.put(RET_EKK0361C010, this.mapper.callEKK0361C010(this.FUNC_CD_1, this.ccWorkMap, opSvcKeiNo, opDtm));
				
				// 値を保持
				CAANMsg ekk0361C010 = (CAANMsg) this.ccWorkMap.get(RET_EKK0361C010);
				
				opSvcKeiNo    = ekk0361C010.getString("op_svc_kei_no");					// オプションサービス契約番号
				opDtm         = ekk0361C010.getString("upd_dtm");						// 更新年月日
				// ANK-2765-00-00 ADD START
				opGeneAddDtm  = ekk0361C010.getString("kk0351_gene_add_dtm");			// 世代登録年月日時分秒(オプションサービス契約) 
				// ANK-2765-00-00 ADD END
			}
			
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// ９．オプションサービス契約＜ISP＞照査締結
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// [締結済][サービス提供中]の場合
			if ("030".compareTo(uwStat) <= 0) {
				
				this.ccWorkMap.put(RET_EKK0361C030, this.mapper.callEKK0361C030(this.FUNC_CD_1, this.ccWorkMap, opSvcKeiNo, opDtm));
				
				// 値を保持
				CAANMsg ekk0361C030 = (CAANMsg) this.ccWorkMap.get(RET_EKK0361C030);
				
				opSvcKeiNo    = ekk0361C030.getString("op_svc_kei_no");					// オプションサービス契約番号
				opDtm         = ekk0361C030.getString("upd_dtm");						// 更新年月日
				// ANK-2765-00-00 ADD START
				opGeneAddDtm  = ekk0361C030.getString("kk0351_gene_add_dtm");			// 世代登録年月日時分秒(オプションサービス契約) 
				// ANK-2765-00-00 ADD END
			}
			
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// １０．オプションサービス契約＜ISP＞開始
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// [サービス提供中]の場合
			if ("100".compareTo(uwStat) <= 0) {
				
				this.ccWorkMap.put(RET_EKK0361C040, this.mapper.callEKK0361C040(this.FUNC_CD_1, this.ccWorkMap, opSvcKeiNo, opDtm));
				
				// 値を保持
				CAANMsg ekk0361C040 = (CAANMsg) this.ccWorkMap.get(RET_EKK0361C040);
				
				opSvcKeiNo    = ekk0361C040.getString("op_svc_kei_no");					// オプションサービス契約番号
				opDtm         = ekk0361C040.getString("upd_dtm");						// 更新年月日
				// ANK-2765-00-00 ADD START
				opGeneAddDtm  = ekk0361C040.getString("kk0351_gene_add_dtm");			// 世代登録年月日時分秒(オプションサービス契約) 
				// ANK-2765-00-00 ADD END
			}
			
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD START
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// 
			// 固定ＩＰアドレス払出コモンコンポーネント部品（JKKFixipadCC）
			// 
			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			// コース変更中でない、またはコース変更中の新認証の場合（画面で固定IPを払い出した場合）
			if (fixipadHradsiMap.isEmpty())
			{
				callJKKFixipadCC(handle, param);
			}
			// コース変更中の旧認証の場合（当処理で固定IPを払い出した場合）
			else
			{
				callJKKFixipadCC(handle, param, fixipadHradsiMap);
			}
			// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD END
			// ANK-2765-00-00 MOD START
//			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//			// 
//			// １１．オーダ発行条件登録
//			// 
//			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//			this.ccWorkMap.put(RET_EKK1081D010, this.mapper.callEKK1081D010(this.FUNC_CD_1, this.ccWorkMap));
//			
//			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//			// 
//			// １２．オーダ情報作成ワーク登録
//			// 
//			// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//			this.ccWorkMap.put(RET_EKK1551D010, 
//								this.mapper.callEKK1551D010(this.FUNC_CD_1,
//																this.ccWorkMap,
//																(((CAANMsg) this.ccWorkMap.get(RET_EKK1081D010)).getString("odr_hakko_joken_no")),
//																getRetDbInf(this.mapper.callEKK0081A010(this.FUNC_CD_2, (String) this.ccWorkMap.get(KEY_SVC_KEI_NO)), "gene_add_dtm"),
//																opSvcKeiNo,
//																opGeneAddDtm,
//																svcKeiUcwkNo,
//																caanMsg.getString("gene_add_dtm")));
			
			// サービスオーダ発行CC
			Map<String, String> sodMap = new HashMap<String, String>();
			sodMap.put("op_svc_kei_no", opSvcKeiNo);							// サービス契約番号
			sodMap.put("op_svc_kei_gene_add_dtm", opGeneAddDtm);				// 世代登録年月日時分秒(オプションサービス契約) 
			sodMap.put("svc_kei_ucwk_no", svcKeiUcwkNo);						// サービス契約内訳番号
			sodMap.put("svc_kei_ucwk_gene_add_dtm", svcKeiUcwkGeneAddDtm);		// 世代登録年月日時分秒(サービス契約内訳)
			sodList.add(sodMap);
			// ANK-2765-00-00 MOD END
		}
		
		// ANK-2765-00-00 ADD START
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// サービスオーダ発行ＣＣ
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		List<Map<String, Object>> trgtList = new ArrayList<Map<String, Object>>();
		for (Map<String, String> sodMap : sodList)
		{
			HashMap<String, Object> sod_kihon_info_Map = new HashMap<String, Object>();			// SOD基本情報
			HashMap<String, Object> svc_kei_info_Map = new HashMap<String, Object>();			// サービス契約情報
			HashMap<String, Object> opsvkei_info_Map = new HashMap<String, Object>();			// オプションサービス契約情報
			HashMap<String, Object> svc_kei_ucwk_info_Map = new HashMap<String, Object>();		// サービス契約内訳情報

			Map<String, Object> trgtMap = new HashMap<String, Object>();
			sod_kihon_info_Map.put(JKKHakkoSODConstCC.INFO_IDO_DIV, JKKHakkoSODConstCC.IDO_DIV_OPSETTE);								// SOD基本情報.異動区分（オプション設定） 
			svc_kei_info_Map.put(JKKHakkoSODConstCC.INFO_SVC_KEI_NO, (String)this.ccWorkMap.get(KEY_SVC_KEI_NO));						// サービス契約情報.サービス契約番号
			opsvkei_info_Map.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_NO, sodMap.get("op_svc_kei_no"));									// オプションサービス契約情報.オプションサービス契約番号
			opsvkei_info_Map.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_GENE_ADD_DTM, sodMap.get("op_svc_kei_gene_add_dtm"));				// オプションサービス契約情報.世代登録年月日時分秒(オプションサービス契約)
			svc_kei_ucwk_info_Map.put(JKKHakkoSODConstCC.INFO_SVC_KEI_UCWK_NO, sodMap.get("svc_kei_ucwk_no"));							// サービス契約内訳情報.サービス契約内訳番号
			svc_kei_ucwk_info_Map.put(JKKHakkoSODConstCC.INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM, sodMap.get("svc_kei_ucwk_gene_add_dtm"));	// サービス契約内訳情報.変更後サービス契約内訳世代登録年月日
			
			// それぞれの情報を対象データリストに入れるためにまとめる
			trgtMap.put(JKKHakkoSODConstCC.SOD_KIHON_INFO, sod_kihon_info_Map);
			trgtMap.put(JKKHakkoSODConstCC.SVC_KEI_INFO, svc_kei_info_Map);
			trgtMap.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opsvkei_info_Map);
			trgtMap.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, svc_kei_ucwk_info_Map);
			trgtList.add(trgtMap);
		}
		Map<String, Object> sodccMap = new HashMap<String, Object>();
		sodccMap.put(JCMConstants.FUNC_CODE_KEY, JPCModelConstant.FUNC_CD_1);
		sodccMap.put(JKKHakkoSODConstCC.TRGT_DATA_LIST, trgtList);
		param.setData("JKKHakkoSODCC", sodccMap);
		
		// サービスオーダ発行CCの呼び出し
		new JKKHakkoSODCC().hakkoSOD(handle, param, "JKKHakkoSODCC");
		// ANK-2765-00-00 ADD END
		
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// １３．申込明細照査・後続業務依頼
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// [受付済]以外の内訳が存在する場合
		if (reqChkmskm) {
			this.ccWorkMap.put(RET_EKK0021C060,
									this.mapper.callEKK0021C060(this.FUNC_CD_1,
																	this.ccWorkMap,
																	getRetDbInf(((CAANMsg) this.ccWorkMap.get(RET_EKK0011D020)).getCAANMsgList("EKK0011D020CBSMsg1List"), "mskm_dtl_no"),
																	((CAANMsg) this.ccWorkMap.get(RET_EKK0011D020)).getString("upd_dtm")));
		}
		// OM-2016-0000890 コース変更中の固定IP登録対応のため処理タイミングを変更 2016/08/01 DEL START
//		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//		// 
//		// １４．固定ＩＰアドレス払出コモンコンポーネント部品（JKKFixipadCC）
//		// 
//		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//		callJKKFixipadCC(handle, param);
		// OM-2016-0000890 コース変更中の固定IP登録対応のため処理タイミングを変更 2016/08/01 DEL END
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// 
		// １５．進捗登録（あとがち）
		// 
		// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		this.ccWorkMap.put(RET_EKK1091D010,
							this.mapper.callEKK1091D010(this.FUNC_CD_1,
															this.ccWorkMap,
															getRetDbInf(((CAANMsg) this.ccWorkMap.get(RET_EKK0011D020)).getCAANMsgList("EKK0011D020CBSMsg1List"), "mskm_dtl_no"),
															svcKeiUcwkNo,
															opSvcKeiNo));
		printlnEjbLog("main end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>固定ＩＰアドレス払出コモンコンポーネント部品呼び出し<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private void callJKKFixipadCC(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		
		
		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		
		ccMap.put(JCMConstants.FUNC_CODE_KEY, this.ccWorkMap.get(KEY_FUNC_CD));
		ccMap.put("fixipad_in",               this.ccWorkMap.get(FIXIPAD_IN));
		ccMap.put("zm0101_upd_dtm_bf",        this.ccWorkMap.get(ZM0101_UPD_DTM_BF));
		ccMap.put("use_stat_ymd",             this.ccWorkMap.get(USE_STAT_YMD));
		ccMap.put("shyakk_chuskk_cd_in",      this.ccWorkMap.get(SHYAKK_CHUSKK_CD_IN));
		ccMap.put("kotei_ip_stku_sbt_cd_in",  this.ccWorkMap.get(KOTEI_IP_STKU_SBT_CD_IN));
		ccMap.put("use_cnt_in",               this.ccWorkMap.get(USE_CNT_IN));
		
		param.setData("KKSV002201CC", ccMap);
		
		new JKKFixipadCC().runFixipadHradsi(handle, param, "post");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェック.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("chkInMap start");
		
		// チェック
		
		setterWorkParam(KEY_FUNC_CD);					// 機能コード
		setterWorkParam(KEY_SVC_KEI_NO);				// サービス契約番号
		setterWorkParam(KEY_SYSID);						// SYSID
		setterWorkParam(KEY_RSV_APLY_YMD);				// 予約適用年月日
		setterWorkParam(MSKM_SBT_CD);					// 申込種別コード
		setterWorkParam(MSKM_UK_DTM);					// 運用年月日時分秒
		setterWorkParam(CONSMBSN_MSKM_STAT_SKBT_CD);	// コンシューマ営業用申込状態識別コード
		setterWorkParam(OP_SVC_CD);						// オプションサービスコード
		setterWorkParam(PCRS_CD);						// オプションサービスコード
		setterWorkParam(PPLAN_CD);						// 料金プランコード
		setterWorkParam(OYA_KEI_SKBT_CD);				// 親契約識別コード
		setterWorkParam(SVC_KEI_UCWK_NO);				// サービス契約内訳番号
		setterWorkParam(SVC_USE_STA_KIBO_YMD);			// 利用開始年月日
		setterWorkParam(KOTEI_IP_AD);					// 固定IPアドレス
		setterWorkParam(NETMASK);						// サブネットマスク
		setterWorkParam(SEIKY_KEI_NO);					// 請求契約番号
		setterWorkParam(RULE0059_AUTO_APLY);			// 事務手数料自動適用要否
		setterWorkParam(SVC_CHRG_STAYMD);				// 課金開始年月日
		setterWorkParam(IDO_DIV);						// 異動区分
		setterWorkParam(SVC_KEI_KAISEN_UCWK_NO);		// サービス契約回線内訳番号
		setterWorkParam(PRG_STAT);						// 進捗ステータス
		setterWorkParam(PRG_TKJK_1);					// 進捗特記事項１
		setterWorkParam(ORDER_SBT_CD);					// オーダ種別コード
		setterWorkParam(SVC_ORDER_CD);					// サービスオーダコード
		setterWorkParam(YOKYU_SBT_CD);					// 要求種別コード
		setterWorkParam(ODR_HAKKO_JOKEN_CD);			// オーダ発行条件コード
		setterWorkParam(ODR_NAIYO_CD);					// オーダ内容コード
		setterWorkParam(KK0161_GENE_ADD_DTM);			// 世代登録年月日時分秒
		setterWorkParam(FIXIPAD_IN);					// 固定ＩＰアドレス
		setterWorkParam(ZM0101_UPD_DTM_BF);				// 更新年月日時分秒
		setterWorkParam(USE_STAT_YMD);					// 利用開始年月日
		setterWorkParam(SHYAKK_CHUSKK_CD_IN);			// 集約局
		setterWorkParam(KOTEI_IP_STKU_SBT_CD_IN);		// 固定ＩＰ取得種別コード
		setterWorkParam(USE_CNT_IN);					// 使用回数
		
		setterWorkParamList("EKK0011D020CBSMsg1List");
		setterWorkParamList("EKK1091D010CBSMsg1List");
		
		printlnEjbLog("chkInMap end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>keyに紐づく引数を内部mapへ保持<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  key 
	 * @throws CCException 
	 */
	private void setterWorkParam(String key) throws CCException {
		
		String obj = (String) this.inMap.get(key);
		
		if (!JKKStringUtil.isNullBlank(obj)) {
			printlnEjbLog(key + "=" + obj);
			this.ccWorkMap.put(key, obj);
			
		} else if (!key.substring(0,4).equals("key_")) {
			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 
	 */
	@SuppressWarnings("unchecked")
	private void setterWorkParamList(String key) throws CCException {
		
		ArrayList obj = (ArrayList) this.inMap.get(key);
		
		if (obj == null || obj.size() == 0) {
			printlnEjbLog(key + "=NULL");
			throw new CCException(key + "=NULL", new Exception());
			
		}
		printlnEjbLog(key + "=" + obj);
		this.ccWorkMap.put(key, obj);
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>最終更新値を取得<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private String getRetDbInf(CAANMsg[] tgCaanMsg, String key) throws Throwable {
		
		String ret = "";
		
		for (CAANMsg msg : tgCaanMsg)
			ret = msg.getString(key);
		
		return ret;
	}
	
	// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD START
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>引数で指定したISP認証IDについて、固定IPアドレスの取得を行います<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private HashMap<String, Object> getKoteiIpAd(SessionHandle handle, IRequestParameterReadWrite param, String ispNinshoId) 
	throws Throwable 
	{
		// 戻り値
		HashMap<String, Object> result = new HashMap<String, Object>();
		
		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		
		// 機能コード
		ccMap.put(JCMConstants.FUNC_CODE_KEY, this.ccWorkMap.get(KEY_FUNC_CD));
		
		// サービス契約番号
		ccMap.put(KKSV0022_KKSV0022OP_KKSV002201CC.SVC_KEI_NO, this.ccWorkMap.get(KEY_SVC_KEI_NO));
		
		// ISP認証ID
		ccMap.put(KKSV0022_KKSV0022OP_KKSV002201CC.ISP_NINSHO_ID, ispNinshoId);
		
		param.setData("KKSV002201CC", ccMap);
		
		// 固定IPアドレスの取得
		new JKKFixipadCC().runFixipadHradsi(handle, param, "get");
		
		// 払い出された固定IPアドレスを取得し、戻り値に設定
		ArrayList<HashMap<String, Object>> fixipadHradsiList = 
			(ArrayList<HashMap<String, Object>>)ccMap.get(KKSV0022_KKSV0022OP_KKSV002201CC.FIXIPAD_HRADSI_LIST);
		
		if (fixipadHradsiList != null && fixipadHradsiList.size() > 0)
		{
			result = fixipadHradsiList.get(0); 
		}
		
		return result;
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>固定ＩＰアドレス払出コモンコンポーネント部品呼び出し（当処理で固定IPを払い出した場合）<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private void callJKKFixipadCC(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> fixipadHradsiMap) 
	throws Throwable 
	{
		
		HashMap<String, Object> ccMap = new HashMap<String, Object>();
		
		ccMap.put(JCMConstants.FUNC_CODE_KEY, this.ccWorkMap.get(KEY_FUNC_CD));
		ccMap.put("fixipad_in",               fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.FIXIPAD));
		ccMap.put("zm0101_upd_dtm_bf",        fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.ZM0101_UPD_DTM));
		ccMap.put("use_stat_ymd",             this.ccWorkMap.get(USE_STAT_YMD));
		ccMap.put("shyakk_chuskk_cd_in",      fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.SHYAKK_CHUSKK_CD));
		ccMap.put("kotei_ip_stku_sbt_cd_in",  fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.KOTEI_IP_STKU_SBT_CD));
		// 使用回数は+1する。(画面で払い出した場合は、画面で+1している)
		int useCnt = Integer.parseInt((String)fixipadHradsiMap.get(KKSV0022_KKSV0022OP_KKSV002201CC_fixipad_hradsi_list.USE_CNT)) + 1;
		ccMap.put("use_cnt_in", String.valueOf(useCnt));
		
		param.setData("KKSV002201CC", ccMap);
		
		new JKKFixipadCC().runFixipadHradsi(handle, param, "post");
	}
	// OM-2016-0000890 固定IPアドレスの払出処理を追加 2016/08/01 ADD END
}
