/********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：eo光テレビ引継コンポーネント部品クラス
 *  ソースファイル名：JKKAdchgSvcKeiTVTakeOverCC.java
 *  作成者          ：FJ
 *  日付            ：2012年8月27日
 *＜機能概要＞
 *  住所変更に伴うeo光テレビの
 *  引継処理を行う部品クラス。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/8/20  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.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0441C130CBSMsg;

/**
 * eo光ネット引継コンポーネント部品クラス.
 * <br>
 * @author FJ
 */
public class JKKAdchgSvcKeiTVTakeOverCC extends AbstractCommonComponent {

	/** セッションハンドル保持域 */
	private static ThreadLocal<SessionHandle> keepSesHandle = new ThreadLocal<SessionHandle>()
	{
		// 保持域への設定はinitialValue()ではなくset()を使用する為、
		// initialValue()は実装しない
	};

	/**
	 * コンストラクタ.
	 * <br>
	 */
	public JKKAdchgSvcKeiTVTakeOverCC() {
	}

	/**
	 * eo光ネット引継
	 * <br>
	 * @param   handle     セッションマネージャなどを持ったハンドル情報
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Throwable  例外が発生した場合
	 * @return  リクエストパラメータ(param)に戻り値を追加して返却する
	 */
	public IRequestParameterReadWrite adchgSvcKeiTvTakeOver(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {

		try {

			/** リソース保持 */
			// セッションハンドルをローカル変数に保持
			keepSesHandle.set(handle);
			
			// 違約金発生コード設定
			penaltyChgCdEditTV(param, fixedText);
			
			// 請求オプションサービス差替
			seiOpSvcKeiSlide(param, fixedText);

			} finally {
				
			// ・セッションハンドル保持域
			if(keepSesHandle.get() != null){
				keepSesHandle.remove();
			}
		}

		return param;
	}
	
	/**
	 * eo光テレビサービス違約金発生コード設定処理
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 */
	private void penaltyChgCdEditTV(IRequestParameterReadWrite param, String fixedText) throws Exception {
		
		/** 事前準備 */
		HashMap<String, String> condMap;
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;
		
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ・EKK0081A010  サービス契約一意照会
		condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO));
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_OPE_DATE));
		reqMap = mapper.setEKK0081A010( param, fixedText, condMap );
		resMap = scCall.run( reqMap, keepSesHandle.get() );
		HashMap<String, Object> kk0081_a010_map = mapper.getEKK0081A010(param, fixedText, resMap);
		mapper.scResultCheck(param);

		// ■ EKK0101A010 サービス契約＜eo光テレビ＞一意照会
		condMap = new HashMap<String, String>();
		// サービス契約番号
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO).toString());
		// 運用日付
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, paramMap.get(JKKAdchgConstCC.PARAM_KEY_OPE_DATE).toString());
		reqMap = mapper.setEKK0101A010(param, fixedText, condMap);
		resMap = scCall.run(reqMap, keepSesHandle.get());
		HashMap<String, Object> kk0101_a010_map = mapper.getEKK0101A010(param, fixedText, resMap);
		mapper.scResultCheck(param);

		// kk0081_a010_map.違約金発生コードを解約／新規では"無"で更新
		kk0081_a010_map.put(EKK0081A010CBSMsg1List.PNLTY_HASSEI_CD, JKKAdchgConstCC.CD00002_NASHI);
// 20130105 星野 ADD START
		// 申込明細番号を設定
		kk0081_a010_map.put(EKK0081A010CBSMsg1List.MSKM_DTL_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_MSKM_DTL_NO));
// 20130105 星野 ADD END
// 20131028 ADD START
		kk0081_a010_map.put(EKK0081A010CBSMsg1List.IDO_DIV, "00019");
// 20131028 ADD END
		
		// ・EKK0101C041  サービス契約＜eo光TV＞情報変更（住所変更）
		reqMap = mapper.setEKK0101C041(param, fixedText, kk0081_a010_map, kk0101_a010_map);
		resMap = scCall.run(reqMap, keepSesHandle.get());
		mapper.getEKK0101C041(param, fixedText, resMap);
		mapper.scResultCheck(param);
		
	}
	
	/**
	 * 請求オプションサービス契約差替処理.
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @throws  Exception  例外が発生した場合
	 */
	public void seiOpSvcKeiSlide(IRequestParameterReadWrite param, String fixedText) throws Exception {

		/** 事前準備 */
		HashMap<String, String> condMap;
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();


		/** 差替対象の抽出 */
		// ・EKK0441B001  請求オプションサービス契約一覧照会
		condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_SVC_KEI_NO));
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_OPE_DATE));
		reqMap = mapper.setEKK0441B001(param, fixedText, condMap);
		resMap = scCall.run(reqMap, keepSesHandle.get());
		ArrayList<HashMap<String, Object>> kk0441_b001_map_lst = mapper.getEKK0441B001(param, fixedText, resMap);
		mapper.scResultCheck(param);


		/** 請求オプションサービス契約サービス契約変更ループ */
		Iterator<HashMap<String, Object>> seiky_kei_list_ite = kk0441_b001_map_lst.iterator();
		while(seiky_kei_list_ite.hasNext()){

			HashMap<String, Object> cur_seiky_kei = seiky_kei_list_ite.next();

			// ・EKK0441A010  請求オプションサービス契約一意照会
			condMap = new HashMap<String, String>();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SEIOPSVC_KEI_NO, (String)cur_seiky_kei.get( EKK0441B001CBSMsg1List.SEIOPSVC_KEI_NO));
			condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_OPE_DATE));
			reqMap = mapper.setEKK0441A010(param, fixedText, condMap);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			HashMap<String, Object> kk0441_a010_map = mapper.getEKK0441A010(param, fixedText, resMap);
			mapper.scResultCheck(param);


			// ・EKK0441C130  請求オプションサービス契約サービス契約変更
			HashMap<String, Object> kk0441_c130_map = new HashMap<String, Object>();
			kk0441_c130_map.put(EKK0441C130CBSMsg.SEIOPSVC_KEI_NO, (String)kk0441_a010_map.get(EKK0441A010CBSMsg1List.SEIOPSVC_KEI_NO));
			kk0441_c130_map.put(EKK0441C130CBSMsg.MSKM_DTL_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_MSKM_DTL_NO));
			kk0441_c130_map.put(EKK0441C130CBSMsg.SVC_KEI_NO, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_NEW_SVC_KEI_NO));
			kk0441_c130_map.put(EKK0441C130CBSMsg.RSV_APLY_YMD, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_CHG_RSV_YMD));
			kk0441_c130_map.put(EKK0441C130CBSMsg.IDO_DIV, (String)paramMap.get(JKKAdchgConstCC.PARAM_KEY_IDO_DIV));
			kk0441_c130_map.put(EKK0441C130CBSMsg.UPD_DTM_BF, (String)kk0441_a010_map.get(EKK0441A010CBSMsg1List.LAST_UPD_DTM));
			reqMap = mapper.setEKK0441C130(param, fixedText, kk0441_c130_map);
			resMap = scCall.run(reqMap, keepSesHandle.get());
			mapper.getEKK0441C130(param, fixedText, resMap);
			mapper.scResultCheck(param);
		}
	}

}