/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKCancelKaisenTgKei
*   ソースファイル名：JKKCancelKaisenTgKei.java
*   作成者          ：FJ
*   日付            ：2012年12月20日
*＜機能概要＞
*   住所変更回線利用場所キャンセル部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v4.00.00	2012/12/20	FJ			新規作成
*	v23.00.00	2016/02/29	FJ)星野		OM-2016-0000424対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.List;
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.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK2091A010CBSMsg1List;

/**
 * 住所変更回線利用場所キャンセル部品
 * 
 * @author 富士通
 */
public class JKKCancelKaisenTgKei extends AbstractCommonComponent
{

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKCancelKaisenTgKeiMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;
	/** 住所変更申込キャンセルクラス用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	
	/** 引数設定：サービス契約番号のList */
	private final String PARA_KEY_SVC_KEI_NO_LIST    = "svcKeiList";
	/** 引数設定Key：サービス契約回線内訳番号 */
	private final String PARA_KEY_KEI_KAISEN_UCWK_NO = "kei_kaisen_ucwk_no";
	/** 引数設定Key：更新年月日時分秒(更新前)のList */
	private final String PARA_KEY_UPD_DTM_BF_LIST    = "updDtmList";
	/* ++++++++++ v23.00.00 ADD START ++++++++++ */
	private static final String PARA_KEY_ADCHG_NO = "adchg_no";
	/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
	
	/** サービス契約番号のList */
	private List<HashMap<String,String>> svcKeiNoList      = 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("＃＃＃＃JKKCancelKaisenTgKei.execute start");
		
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKCancelKaisenTgKeiMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>)param.getData(fixedText);
		printlnEjbLog("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 chk = chkInMap(handle, param);
		if (!chk) {
			printlnEjbLog("execute end");
			return param;
		}
		
		// メイン処理実行
		/* ++++++++++ v23.00.00 MOD START ++++++++++ */
//		modKaisenTgSvcInfo(handle, param);
		modKaisenTgSvcInfo(handle, param, fixedText);
		/* ++++++++++ v23.00.00 MOD END   ++++++++++ */

		// 作業領域のクリア
		workMap.remove(this.getClass().getName());
		
		printlnEjbLog("＃＃＃＃JKKCancelKaisenTgKei.execute end");
		return param;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェックします.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private boolean chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap start");
		
		// サービス契約番号リスト取得
		this.svcKeiNoList = (List<HashMap<String,String>>) this.inMap.get(this.PARA_KEY_SVC_KEI_NO_LIST);

		// 未設定であればfalseでリターン
		if (this.svcKeiNoList == null || this.svcKeiNoList.size() == 0) {
			printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap サービス契約番号=未設定");
			return false;
		}
		printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap サービス契約番号リストの件数=" + this.svcKeiNoList.size());

		for (int i = 0; i < this.svcKeiNoList.size(); i++)
		{
			Map<String, String> childMap = svcKeiNoList.get(i);
			
			String svcKeiNo        = childMap.get("svc_kei_no");
			String keiKaisenUcwkNo = childMap.get("kei_kaisen_ucwk_no");
			printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap# i=" + i + ", svcKeiNo=" + svcKeiNo + ", keiKaisenUcwkNo=" + keiKaisenUcwkNo);

			// サービス契約番号のチェック
			if (JKKStringUtil.isNullBlank(svcKeiNo)) {
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap サービス契約番号=NULL");
				return false;
			}
			
			// サービス契約回線内訳番号のチェック
			if (JKKStringUtil.isNullBlank(keiKaisenUcwkNo)) {
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap サービス契約回線内訳番号=NULL");
				return false;
			}
		}
		printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.chkInMap end");
		return true;
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>申込明細関連のキャンセル処理実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void modKaisenTgSvcInfo(
		SessionHandle handle, 
		IRequestParameterReadWrite param
		/* ++++++++++ v23.00.00 ADD START ++++++++++ */
		, String fixedText
		/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
	) throws Throwable {
		printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#start");
		
		/* ++++++++++ v23.00.00 ADD START ++++++++++ */
		// 住所変更番号取得
		String adchgNo = (String)this.inMap.get(PARA_KEY_ADCHG_NO);
		// 住所変更の取得処理
		HashMap<String, Object> adchgMap = callEKK2091A010(handle, param, fixedText, adchgNo);
		// 住所変更登録日を取得
		String adchgAddYmd = (String)adchgMap.get(EKK2091A010CBSMsg1List.ADD_UNYO_YMD);
		/* ++++++++++ v23.00.00 ADD END   ++++++++++ */

		
		for (int i = 0; i < svcKeiNoList.size(); i++)
		{
			Map<String, String> childMap = svcKeiNoList.get(i);
			String svcKeiNo        = childMap.get("svc_kei_no");
			String keiKaisenUcwkNo = childMap.get("kei_kaisen_ucwk_no");

			printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo# i=" + i + ", svcKeiNo=" + svcKeiNo + ", keiKaisenUcwkNo=" + keiKaisenUcwkNo);

			// 検索：回線対象サービス契約一意照会
			CAANMsg[] kk0241A010 = this.mapper.callEKK0241A010(svcKeiNo, keiKaisenUcwkNo);
			if (kk0241A010 == null || kk0241A010.length == 0) {
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#回線対象サービス契約なし");
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#├サービス契約番号="        + svcKeiNo);
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#└サービス契約回線内訳番号="+ keiKaisenUcwkNo);
				return;
			}
			
			// 検索：サービス契約一意照会
			CAANMsg[] kk0081A010 = this.mapper.callEKK0081A010(svcKeiNo);
			if (kk0081A010 == null || kk0081A010.length == 0) {
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#サービス契約なし");
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#└サービス契約番号="        + svcKeiNo);
				return;
			}
			String lastUpdDtm = kk0081A010[0].getString("last_upd_dtm");
			printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#最終更新年月日時分秒="+ lastUpdDtm);
			
			// 更新：回線対象サービス契約
			CAANMsg[] kk0241CAANMsg = this.mapper.callEKK0241C010(svcKeiNo,
																	keiKaisenUcwkNo,
																	/* ++++++++++ v23.00.00 ADD START ++++++++++ */
																	adchgAddYmd,
																	/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
																	lastUpdDtm);
			if (kk0241CAANMsg == null || kk0241CAANMsg.length == 0) {
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#更新対象となる回線対象サービス契約なし");
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#├サービス契約番号="        + svcKeiNo);
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#├サービス契約回線内訳番号="+ keiKaisenUcwkNo);
				printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo#└更新年月日時分秒(更新前)="+ lastUpdDtm);
			}
			
		}
		printlnEjbLog("＃＃＃JKKCancelKaisenTgKei.modKaisenTgSvcInfo end");
	}
	
	/* ++++++++++ v23.00.00 ADD START ++++++++++ */
	/**
	 * 住所変更一意照会呼出
	 * 
	 * @param	handle
	 * @param	param
	 * @param	fixedText
	 * @param	adchgNo 住所変更番号
	 * @return
	 * @throws	Throwable
	 */
	private HashMap<String, Object> callEKK2091A010(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			String fixedText,
			String adchgNo
	) throws Throwable
	{
		JKKAdchgMapperCC adchgMapper = new JKKAdchgMapperCC();
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービス契約検索用の情報を設定
		HashMap<String, String> condMap = new HashMap<String, String>();
		
		// 検索条件を設定
		condMap.put(JKKAdchgMapperCC.COND_KEY_ADCHG_NO, adchgNo);
		
		// サービス契約一覧照会
		HashMap<String, Object> mapEKK2091A010 = adchgMapper.setEKK2091A010(param, fixedText, condMap);
		Map<?, ?> resMap = scCall.run(mapEKK2091A010, handle);
		HashMap<String, Object> kk2091_A010 = adchgMapper.getEKK2091A010( param, fixedText, resMap );
		adchgMapper.scResultCheck( param );

		return kk2091_A010;
	}
	/* ++++++++++ v23.00.00 ADD END   ++++++++++ */
}
