/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKIdoRsvCnclCC
*   ソースファイル名：JKKIdoRsvCnclCC.java
*   作成者          ：FJ
*   日付            ：2012年12月23日
*＜機能概要＞
*   異動予約キャンセル部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v4.00.00	2012/12/23	FJ			新規作成
*
**********************************************************************/
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.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKStringUtil;

/**
 * 異動予約キャンセル部品
 * 
 * @author 富士通
 */
public class JKKIdoRsvCnclCC extends AbstractCommonComponent
{

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKIdoRsvCnclCCMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;
	/** 異動予約キャンセル用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** 引数設定：申込明細番号のList */
	private final String PARA_KEY_MSKM_DTL_NO_LIST    = "keyMskmDtlNoList";
	/** 引数設定Key：ＫＥＹ＿異動区分 */
	private final String PARA_KEY_IDO_DIV             = "key_ido_div";
	
	/** 申込明細番号のList */
	private List<HashMap<String,String>>  mskmDtlNoList      = null;
	/** 申込明細番号 */
	private String mskmDtlNo        = null;
	/** 異動区分 */
	private String idoDiv           = null;
	
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>異動予約キャンセル処理を実施する.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle    セッションハンドル
	 * @param param     リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable {
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute start");
		
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKIdoRsvCnclCCMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>)param.getData(fixedText);
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute fixedText=" + fixedText);
		
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		// 異動予約キャンセル部品クラス用の作業領域
		this.ccWorkMap = new HashMap();
		workMap.put(this.getClass().getName(), this.ccWorkMap);
		
		// 入力データチェック
		boolean ret = chkInMap(handle, param);
		if (!ret)
		{
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute 入力チェックでfalse. execute end");
			return param;
		}
		
		// 入力の申込明細番号分、繰返す
		for (int i = 0; i < mskmDtlNoList.size(); i++)
		{

			Map<String, String> childMap = mskmDtlNoList.get(i);
			
			this.mskmDtlNo       = childMap.get("mskm_dtl_no");

			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute i=" + i + ", 開始_申込明細番号=" + this.mskmDtlNo);
			
			// 異動予約一覧照会 検索処理実行
			CAANMsg[] kk1681 = search(handle, param);
			if (kk1681 == null)
			{
				printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute 異動予約検索結果なし。申込明細番号=" + this.mskmDtlNo);
				// 次のループ処理へ
				continue;
			}
			this.ccWorkMap.put("KK1681B001_RET_" + i, kk1681);
			
			cancel(handle, param, kk1681);
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute i=" + i + ", 終了_申込明細番号=" + this.mskmDtlNo);
			
		}
		// 作業領域のクリア
		workMap.remove(this.getClass().getName());
		
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.execute end");
		return param;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェックします.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @return true:チェックOK、false:チェックNG
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private boolean chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap start");
		
		// 申込明細番号のList：未設定時はエラーで処理終了
		this.mskmDtlNoList = (List<HashMap<String,String>>) this.inMap.get(this.PARA_KEY_MSKM_DTL_NO_LIST);
		
		if (this.mskmDtlNoList == null || this.mskmDtlNoList.size() == 0) {
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap 申込明細番号のList=未設定");
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap chkInMap end");
			return false;
		}
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap 申込明細番号リストの件数=" + this.mskmDtlNoList.size());
		
		// ＫＥＹ＿異動区分：未設定時はエラーで処理終了
		this.idoDiv = (String) this.inMap.get(this.PARA_KEY_IDO_DIV);
		
		if (JKKStringUtil.isNullBlank(this.idoDiv)) {
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap 異動区分=未設定");
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap chkInMap end");
			return false;
		}
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap 異動区分=" + this.idoDiv);
		
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.chkInMap end");
		return true;
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>異動予約の一覧照会処理実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private CAANMsg[] search(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search start");
		
		// 検索：異動予約一覧照会
		CAANMsg[] kk1681B001 = this.mapper.callEKK1681B001(this.idoDiv, this.mskmDtlNo);
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search 異動予約一覧照会 異動区分=" + this.idoDiv + ", 申込明細番号=" + this.mskmDtlNo);
		if (kk1681B001 == null || kk1681B001.length == 0) {
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search 異動予約一覧照会結果なし");
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search ├異動区分="        + this.idoDiv);
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search └申込明細番号="+ this.mskmDtlNo);
			return null;
		}
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search 異動予約一覧照会結果 件数=" + kk1681B001.length);
		
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.search end");
		return kk1681B001;
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>異動予約のキャンセル処理実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void cancel(SessionHandle handle, IRequestParameterReadWrite param, CAANMsg[] kk1681) throws Throwable {
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.cancel start");
		
		for (CAANMsg row : kk1681)
		{
			// 異動予約番号
			String idoRsvNo = row.getString("ido_rsv_no");
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.cancel 異動予約番号=" + idoRsvNo);
			CAANMsg[] kk1681A0101 = this.mapper.callEKK1681A010(idoRsvNo);
			
			if (kk1681A0101 == null)
			{
				// 一覧照会したあとの一意照会なので、null はありえない。
				throw new CCException("異動予約一意照会がNULL", new Exception());
			}
			// 更新年月日時分秒
			String updDtm = kk1681A0101[0].getString("upd_dtm");
			
			// キャンセル処理
			this.mapper.callEKK1681C010(idoRsvNo, "02", updDtm);
			printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.cancel キャンセル処理OK. 異動予約番号=" + idoRsvNo);
		}
		
		printlnEjbLog("＃＃＃＃JKKIdoRsvCnclCC.cancel end");
	}

// ANK-1665-00-00 2013.11.30 メソッド追加
	/**
	 * 異動予約キャンセル処理<br>
	 * 申込明細番号、異動予約詳細コード、サービス契約内訳番号 指定で異動予約の取消しを行う
	 * 
	 * @param handle		セッションハンドル
	 * @param requestParam	リクエストパラメータ
	 * @param fixedText		サービスメッセージ
	 * @return				リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite cancelIdoRsv(SessionHandle handle, IRequestParameterReadWrite requestParam, String fixedText) throws Throwable {

		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);

		// マッピングクラスのインスタンス生成
		mapper = new JKKIdoRsvCnclCCMapper(handle, requestParam, opeDate);

		// ユーザデータ情報
		inMap = (HashMap<String, Object>)requestParam.getData(fixedText);

		// 異動区分取得
		idoDiv = (String)inMap.get(PARA_KEY_IDO_DIV);

		// キャンセル対象の申込明細番号の一覧を全て処理する
		ArrayList<HashMap<String, String>> cancelList = (ArrayList<HashMap<String, String>>)inMap.get("cancel_list");

		for (HashMap<String, String> param : cancelList) {

			// 申込明細番号
			mskmDtlNo = (String)param.get("mskm_dtl_no");
			// 異動予約詳細コード
			String idoRsvDtlCd = (String)param.get("ido_rsv_dtl_cd");
			// サービス契約内訳番号
			String svcKeiUcwkNo = (String)param.get("svc_kei_ucwk_no");
			
			if (svcKeiUcwkNo == null || svcKeiUcwkNo.isEmpty()) {
				continue;
			}

			// 異動予約の一覧を取得
			CAANMsg[] kk1681 = search(handle, requestParam, idoRsvDtlCd, svcKeiUcwkNo);
			if (kk1681 == null) {
				continue;	// 対象なし
			}

			// 異動予約を取消し
			cancel(handle, requestParam, kk1681);
		}
		
		return requestParam;
	}

// ANK-1665-00-00 2013.11.30 メソッド追加
	/**
	 * 異動予約一覧照会<br>
	 * 異動区分、申込明細番号、異動予約詳細コード、サービス契約内訳番号で予約適用日が未来となる一覧を取得する
	 * 
	 * @param handle
	 * @param param
	 * @param idoRsvDtlCd
	 * @param svcKeiUcwkNo
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg[] search(SessionHandle handle, IRequestParameterReadWrite param, String idoRsvDtlCd, String svcKeiUcwkNo) throws Throwable {

		// EKK1681B001 異動予約一覧照会
		CAANMsg[] kk1681B001 = this.mapper.callEKK1681B001(this.idoDiv, this.mskmDtlNo, idoRsvDtlCd, svcKeiUcwkNo);
		if (kk1681B001 == null || kk1681B001.length == 0) {
			return null;
		}
		return kk1681B001;
	}
	
// IT1-2014-0000040対応 20140124 星野 ADD START
	/**
	 * 異動予約キャンセル処理<br>
	 * 申込明細番号、異動予約詳細コード、サービス契約内訳番号 指定で異動予約の取消しを行う
	 * 
	 * @param handle		セッションハンドル
	 * @param requestParam	リクエストパラメータ
	 * @param fixedText		サービスメッセージ
	 * @return				リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite cancelIdoRsvBySvcKeiNo(SessionHandle handle, IRequestParameterReadWrite requestParam, String fixedText) throws Throwable {

		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);

		// マッピングクラスのインスタンス生成
		mapper = new JKKIdoRsvCnclCCMapper(handle, requestParam, opeDate);

		// ユーザデータ情報
		inMap = (HashMap<String, Object>)requestParam.getData(fixedText);

		// 異動区分取得
		idoDiv = (String)inMap.get(PARA_KEY_IDO_DIV);

		// キャンセル対象の申込明細番号の一覧を全て処理する
		ArrayList<HashMap<String, String>> cancelList = (ArrayList<HashMap<String, String>>)inMap.get("cancel_list");

		for (HashMap<String, String> param : cancelList) {

			// 申込明細番号
			mskmDtlNo = (String)param.get("mskm_dtl_no");
			// 異動予約詳細コード
			String idoRsvDtlCd = (String)param.get("ido_rsv_dtl_cd");
			// サービス契約番号
			String svcKeiNo = (String)param.get("svc_kei_no");
			
			if (svcKeiNo == null || svcKeiNo.isEmpty()) {
				continue;
			}

			// 異動予約の一覧を取得
			CAANMsg[] kk1681 = searchBySvcKeiNo(handle, requestParam, idoRsvDtlCd, svcKeiNo);
			if (kk1681 == null) {
				continue;	// 対象なし
			}

			// 異動予約を取消し
			cancel(handle, requestParam, kk1681);
		}
		
		return requestParam;

	}
	
	/**
	 * 異動予約一覧照会<br>
	 * 異動区分、申込明細番号、異動予約詳細コード、サービス契約番号で予約適用日が未来となる一覧を取得する
	 * 
	 * @param handle
	 * @param param
	 * @param idoRsvDtlCd
	 * @param svcKeiUcwkNo
	 * @return
	 * @throws Throwable
	 */
	private CAANMsg[] searchBySvcKeiNo(SessionHandle handle, IRequestParameterReadWrite param, String idoRsvDtlCd, String svcKeiNo) throws Throwable {

		// EKK1681B001 異動予約一覧照会
		CAANMsg[] kk1681B001 = this.mapper.callEKK1681B001(this.idoDiv, this.mskmDtlNo, idoRsvDtlCd, svcKeiNo, null);
		if (kk1681B001 == null || kk1681B001.length == 0) {
			return null;
		}
		return kk1681B001;
	}
	

// IT1-2014-0000040対応 20140124 星野 ADD END
}
