/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKIsSserviceOpUpdCC
*   ソースファイル名：JKKIsSserviceOpUpdCC.java
*   作成者          ：FJ
*   日付            ：2013年12月22日
*＜機能概要＞
*   割引解約新規作成部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v6.00.00	2013/12/22	FJ			新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
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.exception.RequestParameterException;
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;
import eo.ejb.cbs.cbsmsg.EKK2541B004CBSMsg1List;

/**
 * 割賦情報取得部品
 * 
 * @author 富士通
 */
public class JKKIsSserviceOpUpdCC extends AbstractCommonComponent {
	
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKIsSserviceOpUpdCCMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;

	/** 割引解約新規作成用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** 機能コード */
	private final String FUNC_CD_1 = "1";
	private final String FUNC_CD_2 = "2";
	
	/** 割賦ステータス */
	final List<String> K_KAP_STAT = Arrays.asList(new String[] {"010", "020"});
	
	/**
	 * 
	 * 引数キー
	 * 
	 * ・機能コード
	 * ・サービス契約番号
	 * 
	 */
	private final String KEY_FUNC_CD     = "func_code";
	private final String KEY_SVC_KEI_NO  = "key_svc_kei_no";
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>割引解約新規作成処理を実施する.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle    セッションハンドル
	 * @param param     リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable {
		printlnEjbLog("execute start");
		
		// 初期処理
		initSetUp(handle, param, fixedText);
		
		// 入力データチェック
		chkInMap(handle, param);
		
		// 機能コード「チェックのみ」の場合は、主処理は行わない
		if (this.FUNC_CD_2.equals(this.ccWorkMap.get(this.KEY_FUNC_CD)))
			return param;
		
		// メイン処理実行
		main(handle, param);
		
		printlnEjbLog("execute end");
		return param;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>主処理<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  handle セッションハンドル
	 * @param  param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void main(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("main start");
		
		// 割賦照会
		serchEkk2541Inf();
		
		printlnEjbLog("main end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>KK0451_割引サービス契約を検索<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @throws Throwable 
	 */
	private void serchEkk2541Inf() throws Throwable {
		printlnEjbLog("serchEkk2541Inf start");
		
		// 検索
		CAANMsg[] ekk2541b004 = this.mapper.callEKK2541B004(this.FUNC_CD_1, (String) this.ccWorkMap.get(this.KEY_SVC_KEI_NO));
		
		// チェック１
		if (ekk2541b004.length == 0) {
			this.inMap.put("EKK2541B004CBSMsg1List", "OK");
			return;
		}
		
		// チェック２
		int cnt = 0;
		for (CAANMsg msg : ekk2541b004) {
			
			if (this.K_KAP_STAT.contains(msg.getString(EKK2541B004CBSMsg1List.KAP_KEI_STAT)))
				cnt++;
		}
		
		this.inMap.put("EKK2541B004CBSMsg1List", cnt == 0 ? "OK" : "");
		printlnEjbLog("serchEkk2541Inf end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>初期設定を実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  handle    セッションハンドル
	 * @param  param     リクエストパラメータ
	 * @param  fixedText サービスメッセージ
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings({ "unchecked", "boxing" })
	private void initSetUp(SessionHandle handle,
								IRequestParameterReadWrite param,
								String fixedText) throws RequestParameterException {
		printlnEjbLog("initSetUp start");
		
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKIsSserviceOpUpdCCMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>) param.getData(fixedText);
		printlnEjbLog("fixedText=" + fixedText);
		
		// 割引解約新規作成部品クラス用の作業領域
		this.ccWorkMap = new HashMap();
		
		// 判定初期値
		this.inMap.put("EKK2541B004CBSMsg1List", "");
		
		printlnEjbLog("initSetUp end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェック.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("chkInMap start");
		
		// 機能コード
		setterWorkParam(this.KEY_FUNC_CD);
		
		// サービス契約番号
		setterWorkParam(this.KEY_SVC_KEI_NO);
		
		printlnEjbLog("chkInMap end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>keyに紐づく引数を内部mapへ保持<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param  key 
	 * @throws CCException 
	 */
	private void setterWorkParam(String key) throws CCException {
		
		String obj = (String) this.inMap.get(key);
		
		if (!JKKStringUtil.isNullBlank(obj)) {
			printlnEjbLog(key + "=" + obj);
			this.ccWorkMap.put(key, obj);
		} else {
			printlnEjbLog(key + "=NULL");
			throw new CCException(key + "=NULL", new Exception());
		}
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	@SuppressWarnings("static-access")
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
}
