/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：eo光電話住所変更コンポーネント部品クラス
 *  ソースファイル名：JKKTelNoReserveCC.java
 *  作成者          ：FJ
 *  日付            ：2012年04月01日
 *＜機能概要＞
 *  住所変更に伴うeo光電話のエイジング削除、
 *  予約番号削除の処理を行う部品クラス。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/04/01  FJ          新規作成
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKAdchgConstCC;
import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;

import eo.ejb.cbs.cbsmsg.EZM0181B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0181E010CBSMsg;

public class JKKTelNoReserveCC  extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKTelNoReserveCC() {
	}

	/**
	 * 発番取消処理（電話番号予約削除）を実施する.
	 * 
	 * @.電話番号予約一覧照会(EZM0181B020)を実施
	 * A.@の結果として、取得件数が1件以上かつ、削除対象番号が存在する場合、
	 *    予約番号削除処理(EZM0181E010)を実施する。
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @return  リクエストパラメータ(param)
	 * @throws  Exception  例外が発生した場合
	 */
	public IRequestParameterReadWrite delTelNoReserve( SessionHandle handle, IRequestParameterReadWrite param, String fixedText ) throws Exception {

		try {

			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set( handle );

			/** 事前準備 */
			// 呼び出し元から渡されたパラメータMap
			HashMap<String, Object> paramMap = (HashMap<String, Object>)( param.getData(fixedText) );
			// CCに渡すパラメータMap
			HashMap<String, Object> reqMap;
			// CC結果Map
			Map<?, ?> resMap;

			// CCに渡すパラメータMap
			HashMap<String, Object> childMap = null;
		
			// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
	
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
	
			HashMap<String, String> condMap = new HashMap<String, String>();
	
			// ○電話番号予約一覧照会（前処理）
			// SYSID
			String sys_id = (String)paramMap.get( JKKAdchgConstCC.PARAM_KEY_SYSID );
			condMap.put(JKKAdchgMapperCC.COND_KEY_SYSID, sys_id);
			
			// ○電話番号予約一覧照会（上りマッピング）
			reqMap =mapper.setEZM0181B020(param, fixedText, condMap);
			// ○電話番号予約一覧照会（実行）
			resMap = scCall.run( reqMap, keepSesHandle.get() );
			// ○電話番号予約一覧照会（下りマッピング）
			ArrayList<HashMap<String, Object>> msgListEZM0181B020 = mapper.getEZM0181B020( param, fixedText, resMap );
			// ○電話番号予約一覧照会（チェック）
			mapper.scResultCheck( param );
	
			Iterator<HashMap<String, Object>> ezm0181b020Ite = msgListEZM0181B020.iterator();
	
			String tel_no = (String)paramMap.get( "key_telno");
			String update_day_String = "";
			
			while (ezm0181b020Ite.hasNext()) {
				
				// ■電話番号予約一覧照会での取得件数分繰返し処理を行う
				childMap = ezm0181b020Ite.next();
	
				if(tel_no.equals((String)childMap.get(EZM0181B020CBSMsg1List.TELNO))){
					
					// ■対象電話番号 = 電話番号予約一覧照会にて取得した電話番号
					String tgtUpdDt = (String) childMap.get(EZM0181B020CBSMsg1List.UPD_DTM);
					
					if (tgtUpdDt != null && (! tgtUpdDt.equals(""))) {
						
						// ■取得した更新年月日が null 以外、かつ 空文字("")以外の場合
						if (update_day_String.equals("") || 
							Integer.parseInt(tgtUpdDt) > Integer.parseInt(update_day_String)) {
							
							// ■カレントの更新年月日の場合
							update_day_String = tgtUpdDt;
						}
					}
				}
			}
	
			if (childMap != null && (! update_day_String.equals(""))) {
				
				// ■電話番号予約一覧照会結果に、対象電話番号が存在した場合
				// ○予約一覧番号削除（前処理）
				// 予約番号
				condMap.put( EZM0181E010CBSMsg.TELNO_RSV_NO, (String)childMap.get(EZM0181B020CBSMsg1List.TELNO_RSV_NO) );
				// 電話番号
				condMap.put( EZM0181E010CBSMsg.TELNO, (String)childMap.get(EZM0181B020CBSMsg1List.TELNO) );
				// 更新年月日時分秒
				condMap.put( EZM0181E010CBSMsg.LAST_UPD_DTM_BF, update_day_String );
	
				// ○予約一覧番号削除（上りマッピング）
				reqMap = mapper.setEZM0181E010( param, fixedText, condMap );
				// ○予約一覧番号削除（実行）
				resMap = scCall.run( reqMap, keepSesHandle.get() );
				// ○予約一覧番号削除（下りマッピング）
				mapper.getEZM0181E010( param, fixedText, resMap );
				// ○予約一覧番号削除（チェック処理）
				mapper.scResultCheck( param );
			}
		
		} finally {
			
			// ・セッションハンドル保持域
			if( keepSesHandle.get() != null ){
				keepSesHandle.remove();
			}
		}
		return param;
	}
}
