/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKItenTokiInfoCC
*   ソースファイル名：JKKItenTokiInfoCC.java
*   作成者          ：富士通
*   日付            ：2013年4月17日
*＜機能概要＞
*   移転トーキ情報共通部品
*   
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v5.00.00    2013/04/17   FJ）鈴木    新規作成
*   v8.04.00    2014/04/09   FJ）星野    OM-2014-0001466対応
**********************************************************************/
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.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191C011CBSMsg;

public class JKKItenTokiInfoCC extends AbstractCommonComponent {

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKTelSvcChgMapperCC mapper = null;

	/** SC呼び出し部品 */
	ServiceComponentRequestInvoker scCall = null;

	/** 運用年月日*/
	private String opDtm = "";

	/** 変更前サービス契約内訳番号	 */
	public String CHBF_SVC_KEI_UCWK_NO = "chbf_svc_kei_ucwk_no";
	
	/** 異動区分 */
	public String IDO_DIV = "ido_div";

	/** 予約適用年月日 */
	public String RSV_APLY_YMD = "rsv_aply_ymd";

	/** 更新年月日時分秒(更新前) */
	public String UPD_DTM_BF = "upd_dtm_bf";
	
	/** 移転先開通後トーキ開始予定年月日 */
	public String ITENS_OPAF_TOKI_STA_RSYMD = "itens_opaf_toki_sta_rsymd";
// OM-2014-0001466対応 20140410 星野 ADD START
	/** 移転先開通前トーキ開始年月日 */
	public String DSL_PAUSE_TOKI_STA_YMD = "dsl_pause_toki_sta_ymd";
	/** 更新後世代登録年月日時分秒（出力パラメータ） */
	public String SVC_KEI_UCWK_GENE_ADD_DTM = "svc_kei_ucwk_gene_add_dtm";
// OM-2014-0001466対応 20140410 星野 ADD END
	
	/** 申込明細番号 */
	public String MSKM_DTL_NO = "mskm_dtl_no";
	
	/**
	 * 移転トーキ情報の初期処理です。
	 * 
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return void
	 * @throws Throwable 
	 */
	private void init(IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// マッパーの初期化
		if (null == this.mapper)
		{
			this.mapper = new JKKTelSvcChgMapperCC();
		}

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		if (null == this.scCall)
		{
			this.scCall = new ServiceComponentRequestInvoker();
		}

		// 運用日を取得する。
		opDtm = JKKBpCommon.getOpeDateTimeStamp(null);

		// コントロールマップのエラー情報を初期化
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, new ArrayList<Object>());
	}
	/**
	 * 移転先開通後トーキ開始予定年月日の更新処理です。
	 * 
	 * パラメータの開始予定年月日に従って移転先開通後トーキ開始予定年月日を更新します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite updateStaYoteiYmd4Tel1(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd4Tel1() start");
		
		// 初期処理
		init(param, fixedText);
		
		// リクエストパラメータの取得処理
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		if (inMap == null) {
			// 処理しません。
			printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd4Tel1() inMap がnullのため修了。");
			return param;
		}
		
		updateStaYoteiYmd(handle, param, inMap, fixedText);
		
		return param;
		
	}
	
	/**
	 * 移転先開通後トーキ開始予定年月日の更新処理です。
	 * 
	 * パラメータの開始予定年月日に従って移転先開通後トーキ開始予定年月日を更新します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite updateStaYoteiYmd4Tel2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd4Tel2() start");
		
		// 初期処理
		init(param, fixedText);
		
		// リクエストパラメータの取得処理
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		if (inMap == null) {
			// 処理しません。
			printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd4Tel2() inMap がnullのため修了。");
			return param;
		}
		
		updateStaYoteiYmd(handle, param, inMap, fixedText);
		
		return param;
		
	}

// OM-2014-0001466対応 20140409 星野 ADD START
	/**
	 * 移転先開通前トーキ開始年月日の更新処理です。
	 * 
	 * パラメータの開始予定年月日に従って移転先開通前トーキ開始年月日を更新します。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite updateDslTokiStaYmd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// 初期処理
		init(param, fixedText);
		
		// リクエストパラメータの取得処理
		HashMap inMap = (HashMap)param.getData(fixedText);
		
		if (inMap == null) {
			// 処理しません。
			return param;
		}
		
		updateDslTokiStaYmd(handle, param, inMap, fixedText);
		
		return param;
		
	}
	
// OM-2014-0001466対応 20140409 星野 ADD END


	/**
	 * 移転先開通後トーキ開始予定年月日を指定された値で更新します。
	 * @param handle
	 * @param param
	 * @param inMap
	 * @param fixedText
	 * @throws Throwable
	 */
	private void updateStaYoteiYmd(SessionHandle handle, IRequestParameterReadWrite param, HashMap inMap, String fixedText) throws Throwable {

		// inMapから、各種データを取得する。
		//　変更前サービス契約内訳番号
		String bfSvcKeiUcwkNo = (String)inMap.get(CHBF_SVC_KEI_UCWK_NO);
		String rsv_aply_ymd = (String)inMap.get(RSV_APLY_YMD);
		String ido_div = (String)inMap.get(IDO_DIV);
		String itens_opaf_toki_sta_rsymd = (String)inMap.get(ITENS_OPAF_TOKI_STA_RSYMD);
		String mskm_dtl_no = (String)inMap.get(MSKM_DTL_NO);

		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() bfSvcKeiUcwkNo=" + bfSvcKeiUcwkNo);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() rsv_aply_ymd=" + rsv_aply_ymd);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() ido_div=" + ido_div);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itens_opaf_toki_sta_rsymd=" + itens_opaf_toki_sta_rsymd);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() mskm_dtl_no=" + mskm_dtl_no);

		// ******************************************************* //
		// サービス契約内訳＜eo光電話＞一意照会実行処理            //
		// ******************************************************* //
		HashMap<String, Object> mapEKK0191A010 = this.mapper.editInMsgEKK0191A010(param, fixedText, bfSvcKeiUcwkNo);
		Map<?, ?> rsltEKK0191A010 = this.scCall.run(mapEKK0191A010, handle);
		this.mapper.editResultRPEKK0191A010(rsltEKK0191A010, param, fixedText);
		errChk(rsltEKK0191A010);
		// 業務データの取得処理
		CAANMsg workEKK0191A010 = getWorkCAANMsg(rsltEKK0191A010);
		CAANMsg msgEKK0191A010  = workEKK0191A010.getCAANMsgList(EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST)[0];

		String itensOpafTokiKiboUm = (String)msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_KIBO_UM);
		String itensOpafTokiAddCd = (String)msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_ADD_CD);
		String itensOpafTokiEndYmd = (String)msgEKK0191A010.getString(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_END_YMD);
		String lastUpdDtm = (String)msgEKK0191A010.getString(EKK0191A010CBSMsg1List.LAST_UPD_DTM);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itensOpafTokiKiboUm=" + itensOpafTokiKiboUm);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itensOpafTokiAddCd=" + itensOpafTokiAddCd);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itensOpafTokiEndYmd=" + itensOpafTokiEndYmd);
		printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() lastUpdDtm=" + lastUpdDtm);

		// ******************************************************* //
		// 実施可否の判定                                          //
		// ******************************************************* //
		if(JKKStringUtil.isNullBlank(itensOpafTokiAddCd)) {
			// 移転先開通後トーキ登録コード が未設定のときは、更新しない。
			printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itensOpafTokiAddCd が未設定なので更新しない");
			return;
		}
		
		if(!JKKStringUtil.isNullBlank(itensOpafTokiEndYmd)) {
			// 移転先開通後トーキ終了年月日 が設定されている場合は、更新しない。
			printlnEjbLog("＃＃＃＃JKKItenTokiInfoCC.updateStaYoteiYmd() itensOpafTokiEndYmd が設定されているので更新しない");
			return;
		}
		
		// ******************************************************* //
		// 更新したい内容を設定                                    //
		// ******************************************************* //
		HashMap<String, Object> eKK0191C011 = new HashMap<String, Object>(1);
		eKK0191C011.put(EKK0191A010CBSMsg1List.SVC_KEI_UCWK_NO, bfSvcKeiUcwkNo);
		eKK0191C011.put(EKK0191A010CBSMsg1List.ITENS_OPAF_TOKI_STA_RSYMD, itens_opaf_toki_sta_rsymd);
		
		// *******************************************************************  //
		// サービス契約内訳＜eo光電話＞サービス契約内訳<eo光電話>移転トーキ設定 //
		// *******************************************************************  //
		HashMap<String, Object> mapEKK0191C011 = this.mapper.editInMsgEKK0191C011_2(param, fixedText, msgEKK0191A010, eKK0191C011, 
				mskm_dtl_no, rsv_aply_ymd, ido_div, lastUpdDtm);
		Map<?, ?> rsltEKK0191C011 = this.scCall.run(mapEKK0191C011, handle);
		this.mapper.editResultRPEKK0191C050(rsltEKK0191C011, param, fixedText);
		errChk(rsltEKK0191C011);
//		// 業務データの取得処理
//		CAANMsg workEKK0191C010 = getWorkCAANMsg(rsltEKK0191C010);

	}
	
// OM-2014-0001466対応 20140409 星野 ADD START
	/**
	 * 移転先開通後トーキ開始予定年月日を指定された値で更新します。
	 * @param handle
	 * @param param
	 * @param inMap
	 * @param fixedText
	 * @throws Throwable
	 */
	private void updateDslTokiStaYmd(SessionHandle handle, IRequestParameterReadWrite param, HashMap inMap, String fixedText) throws Throwable {

		// inMapから、各種データを取得する。
		//　変更前サービス契約内訳番号
		String bfSvcKeiUcwkNo = (String)inMap.get(CHBF_SVC_KEI_UCWK_NO);
		String rsv_aply_ymd = (String)inMap.get(RSV_APLY_YMD);
		String ido_div = (String)inMap.get(IDO_DIV);
		String dsl_pause_toki_sta_ymd = (String)inMap.get(DSL_PAUSE_TOKI_STA_YMD);
		String mskm_dtl_no = (String)inMap.get(MSKM_DTL_NO);

		// ******************************************************* //
		// サービス契約内訳＜eo光電話＞一意照会実行処理            //
		// ******************************************************* //
		HashMap<String, Object> mapEKK0191A010 = this.mapper.editInMsgEKK0191A010(param, fixedText, bfSvcKeiUcwkNo);
		Map<?, ?> rsltEKK0191A010 = this.scCall.run(mapEKK0191A010, handle);
		this.mapper.editResultRPEKK0191A010(rsltEKK0191A010, param, fixedText);
		errChk(rsltEKK0191A010);
		// 業務データの取得処理
		CAANMsg workEKK0191A010 = getWorkCAANMsg(rsltEKK0191A010);
		CAANMsg msgEKK0191A010  = workEKK0191A010.getCAANMsgList(EKK0191A010CBSMsg.EKK0191A010CBSMSG1LIST)[0];

		String lastUpdDtm = (String)msgEKK0191A010.getString(EKK0191A010CBSMsg1List.LAST_UPD_DTM);
		// ******************************************************* //
		// 実施可否の判定は呼出元に委ねる                          //
		// ******************************************************* //
		
		// ******************************************************* //
		// 更新したい内容を設定                                    //
		// ******************************************************* //
		HashMap<String, Object> eKK0191C011 = new HashMap<String, Object>(1);
		eKK0191C011.put(EKK0191A010CBSMsg1List.SVC_KEI_UCWK_NO, bfSvcKeiUcwkNo);
		eKK0191C011.put(EKK0191A010CBSMsg1List.DSL_PAUSE_TOKI_STA_YMD, dsl_pause_toki_sta_ymd);
		
		// *******************************************************************  //
		// サービス契約内訳＜eo光電話＞サービス契約内訳<eo光電話>移転トーキ設定 //
		// *******************************************************************  //
		HashMap<String, Object> mapEKK0191C011 = this.mapper.editInMsgEKK0191C011_2(param, fixedText, msgEKK0191A010, eKK0191C011, 
				mskm_dtl_no, rsv_aply_ymd, ido_div, lastUpdDtm);
		Map<?, ?> rsltEKK0191C011 = this.scCall.run(mapEKK0191C011, handle);
		this.mapper.editResultRPEKK0191C050(rsltEKK0191C011, param, fixedText);
		errChk(rsltEKK0191C011);
		// 業務データの取得処理
		CAANMsg workEKK0191C011 = getWorkCAANMsg(rsltEKK0191C011);
		String kk0161GeneAddDtm = workEKK0191C011.getString(EKK0191C011CBSMsg.KK0161_GENE_ADD_DTM);
		// サービス契約内訳世代登録年月日時分秒に設定
		inMap.put(SVC_KEI_UCWK_GENE_ADD_DTM, kk0161GeneAddDtm);

		

	}
// OM-2014-0001466対応 20140409 星野 ADD END
	
	
	/**
	 * エラーチェック処理です。
	 * <br>
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private static void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(EKK0081A010CBSMsg.STATUS);
		
		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = "INVALID_RETURN_MESSAGE";
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private static CAANMsg getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate;
	}

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}


}
