/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKAdchgCancelHenpinCC
 *  ソースファイル名：JKKAdchgCancelHenpinCC.java
 *  作成者          ：FJ
 *  日付            ：2013年05月13日
 *＜機能概要＞
 *  サービス契約論理削除CC部品
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2013/05/13  FJ          新規作成
 *  v8.00.00    2014/04/11  FJ)金田     OM-2014-0001454
 *
 ********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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 com.fujitsu.futurity.model.base.CAANMsg;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.util.JKKCommonUtil;
import eo.ejb.cbs.cbsmsg.EDK0301B060CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0301B060CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2101B001CBSMsg1List;

public class JKKAdchgCancelHenpinCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgCancelHenpinCC() {
	}
	

	/**
	 * 返品取消処理
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite updateRonriDel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {
		
// OM-2013-0004303対応 20131120 星野 ADD START
		try {
// OM-2013-0004303対応 20131120 星野 ADD END
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set( handle );
	
			// 事前準備
			HashMap<String, Object> paramMap = (HashMap<String, Object>)( param.getData(fixedText) );
			HashMap<String, String> condMap = new HashMap<String, String>();
			HashMap<String, Object> reqMap;
			Map<?, ?> resMap;
			
			// SCリクエストInvokerを取得
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			
			// 住所変更明細取得処理
			JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
			
			ArrayList<HashMap<String, Object>> kktkSvcKeiInfList = new ArrayList<HashMap<String, Object>>();
			
			//機器提供サービス契約の取得
			// EKK2101B001 住所変更明細一覧照会
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHG_NO , (String)paramMap.get("adchg_no"));
			condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHG_DTL_SBT_CD, "03");
			reqMap = mapper.setEKK2101B001(param, fixedText, condMap);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			ArrayList<HashMap<String, Object>> kk2101_b001_map_list = mapper.getEKK2101B001(param, fixedText, resMap);
			mapper.scResultCheck(param);
			
			if (kk2101_b001_map_list.size() == 0)
			{
				// 取得できない場合、処理終了
				return param;
			}
			
			for (HashMap<String, Object> kk2101_b001_mapInf : kk2101_b001_map_list)
			{
				String kktkSvcKeiNo = (String)kk2101_b001_mapInf.get("chg_tg_kei_no");
				
				// 返品機器取消一覧照会処理を実施
				HashMap<String, Object> eDK0301B060Hash = new HashMap<String, Object>();
				JKKBpCommon.searchHmpinInfo(param, handle, kktkSvcKeiNo, eDK0301B060Hash, fixedText);
				
				// 返品機器取消情報を取り出す
				CAANMsg[] eDK0301B060CBSMSG1list = (CAANMsg[])eDK0301B060Hash.get(EDK0301B060CBSMsg.EDK0301B060CBSMSG1LIST);
					
				if (eDK0301B060CBSMSG1list == null || eDK0301B060CBSMSG1list.length == 0)
				{
					// 取得できない場合、コンテニュー
					continue;
				}
				
// OM-2013-0005394対応 20131228 星野 MOD START
//				HashMap<String, Object> eDK0301B060CBSMSG1 = eDK0301B060CBSMSG1list[0].getMsgData();
				
				// 住所変更明細の変更前識別番号から返品対象の機器変更番号を取得している
				String kikiChgNo = (String)kk2101_b001_mapInf.get(EKK2101B001CBSMsg1List.CHBF_SKBT_NO);
// OM-2014-0001454 2014.04.11 Y.Kanata ADD START
				// 機器提供サービス契約が解約済の場合、機器自体は返品しなければいけないため取消さない。
				boolean isKikiDsl = isKikiDslCheck(param, fixedText, kktkSvcKeiNo, kikiChgNo);
				if (isKikiDsl) {
					continue;
				}
// OM-2014-0001454 2014.04.11 Y.Kanata ADD END
				for( int i=0; i<eDK0301B060CBSMSG1list.length; i++ ){
					HashMap<String, Object> eDK0301B060CBSMSG1 = eDK0301B060CBSMSG1list[i].getMsgData();
					
					// ステータス取消済は対象外
					if("004".equals( eDK0301B060CBSMSG1.get(EDK0301B060CBSMsg1List.HMPIN_KIKI_STAT) ) ){
						continue;
					}
					
					// 機器変更番号が不一致の場合は対象外
					if( StringUtils.isEmpty(kikiChgNo) 
						|| !kikiChgNo.equals( eDK0301B060CBSMSG1.get(EDK0301B060CBSMsg1List.KIKI_CHG_NO) ) 
					){
						continue;
					}
// OM-2013-0005394対応 20131228 星野 MOD END
					String hmpinKikiNo = (String)eDK0301B060CBSMSG1.get(EDK0301B060CBSMsg1List.HMPIN_KIKI_NO);
					String updDtm = (String)eDK0301B060CBSMSG1.get(EDK0301B060CBSMsg1List.UPD_DTM);
					
					// 返品対象の機器提供サービス契約として設定する
					kk2101_b001_mapInf.put("hmpin_kiki_no", hmpinKikiNo);
					kk2101_b001_mapInf.put("upd_dtm", updDtm);
					kktkSvcKeiInfList.add(kk2101_b001_mapInf);
// OM-2013-0005394対応 20131228 星野 ADD START
				}
// OM-2013-0005394対応 20131228 星野 ADD END
				
			}
			
			if (kktkSvcKeiInfList.size() == 0)
			{
				// 機器提供サービス契約情報が空の場合、処理終了
				return param;
			}
			
			for (HashMap<String, Object> kktkSvcKeiInf : kktkSvcKeiInfList)
			{
				String hmpinKikiNo = (String)kktkSvcKeiInf.get("hmpin_kiki_no");
				String updDtm = (String)kktkSvcKeiInf.get("upd_dtm");
				
				// 返品機器取消処理を実施
				HashMap<String, Object> eDK0301C040Hash = new HashMap<String, Object>();
				JKKBpCommon.updateHempinStp(param, handle, hmpinKikiNo, updDtm, eDK0301C040Hash, fixedText);
				
			}
			
			return param;
			
// OM-2013-0004303対応 20131120 星野 ADD START
		} finally {

			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}

// OM-2013-0004303対応 20131120 星野 ADD END
	}

// OM-2014-0001454 2014.04.11 Y.Kanata ADD START
	/**
	 * 対象機器が解約済か調べる
	 * @return 解約済の場合 true を返却
	 * @return 上記以外の場合は false を返却
	 */
	private boolean isKikiDslCheck(
		IRequestParameterReadWrite param
		, String fixedText
		, String kktkSvcKeiNo
		, String kikiChgNo
	) throws Throwable {
		// パラメータ確認
		if (StringUtils.isEmpty(kktkSvcKeiNo)
				|| StringUtils.isEmpty(kikiChgNo)
				) {
			return false;
		}
		
		// 事前準備
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		// 住所変更明細取得処理
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		//機器提供サービス契約の取得
		// EKK0341A010 機器提供サービス契約一意照会（カレント）
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, "20991231");
		reqMap = mapper.setEKK0341A010(param, fixedText, condMap);
		resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> kk0341b001Map = mapper.getEKK0341A010(param, fixedText, resMap);
		mapper.scResultCheck(param);
		if (kk0341b001Map == null) {
			return false;
		}
		// 機器変更番号が一致し、解約済なら true 返却
		String srcKikiChgNo = (String)kk0341b001Map.get(EKK0341A010CBSMsg1List.KIKI_CHG_NO);
		String srcKikiStat = (String)kk0341b001Map.get(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT);
		if (kikiChgNo.equals(srcKikiChgNo) && "910".equals(srcKikiStat)) {
			return true;
		}
		
		return false;
	}
// OM-2014-0001454 2014.04.11 Y.Kanata ADD END
}