/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAKTuwaPrcPrckmkChg
*	ソースファイル名	：JBSbatAKTuwaPrcPrckmkChg.java
*	作成者				：富士通　
*	作成日				：2013年05月09日
*＜機能概要＞
*　通話料料金項目変換部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/05/09  高橋		新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatAKIFM006;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAKTuwaPrcPrckmkChg extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AK_SELECT_001)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AK_SELECT_001 = "AK_SELECT_001";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 通話料料金項目コード変換マップ */
	private HashMap<ArrayList<String>, JBSbatCommonDBInterface> twryoPrckmkCdCnvMap = null;

	/** 退避．料金項目コード */
	private String tmpPrcKmkCd = null;
	
	/** 退避．業務機能識別コード＿通話料料金項目コード変換表 */
	private String  tmpWKSCd_TwryoCnvMap = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 退避．料金項目コードをクリア
		this.tmpPrcKmkCd = null;
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 業務パラメータを取得する。
		this.getWorkPara();
		
		// 通話料金料金項目コード変換マップを作成する。
		this.createTuwaPrcPrckmkCdCnvMap();
		
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		
		// 比較検証結果情報出力
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 通話料料金項目コード変換表検索
		this.schTwryoPrckmkCdCnvMap(inMap);
		
		// 比較検証結果情報出力
		this.makeOutputInfo(inMap,outputItem);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	料金項目抽出変換適用開始年月日
	 *		 	料金項目抽出変換適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_CS_CHGE_AK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AK_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/


	/**
	 * 業務パラメータ管理から必要なパラメータを取得します。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getWorkPara() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getWorkPara]");
		
		// 退避.業務機能識別コード_通話料料金項目コード変換表 を初期化
		this.tmpWKSCd_TwryoCnvMap = null;
		
		// 業務パラメータ取得
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		try
		{
			// 退避.業務機能識別コード_通話料料金項目コード変換表 ← 業務機能識別コード_通話料料金項目コード変換表
			this.tmpWKSCd_TwryoCnvMap 	= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AK_WKS_TWRYO_CNVMAP);
		}
		finally
		{
			paramUtil.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getWorkPara][退避.業務機能識別コード = " + this.tmpWKSCd_TwryoCnvMap.toString()  + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getWorkPara]");
		return;
	}	
	
	/**
	 * 料金項目抽出変換スキーマを参照し、
	 * 通話料料金項目コード変換マップを生成します。
	 * 
	 * @throws Exception
	 */
	private void createTuwaPrcPrckmkCdCnvMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createTuwaPrcPrckmkCdCnvMap]");

		this.twryoPrckmkCdCnvMap = new HashMap<ArrayList<String>, JBSbatCommonDBInterface>();
		
		// 料金項目抽出変換マスタ検索用のキーパラメータを生成する
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(JACStrConst.SYS_CD_AK);			// システムコード
//		paramList.setValue(this.tmpWKSCd_TwryoCnvMap);		// 業務機能識別コード
		paramList.setValue(JPCUtilCommon.fillHalfSpace( this.tmpWKSCd_TwryoCnvMap, JACStrConst.WORK_KINO_SKBT_LENGTH, true));		// 業務機能識別コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_2);		// 抽出変換コード
		paramList.setValue(super.opeDate);					// バッチ運用日
		paramList.setValue(super.opeDate);					// バッチ運用日
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][createTuwaPrcPrckmkCdCnvMap][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AK_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap =  db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		// 取得結果をマップに格納する
		while(null != dbMap)
		{
			// グループ、コース、サービス、料金項目でキーを生成する
			ArrayList<String> mapKey = createMapKey(dbMap);
			// キー単位に抽出結果を格納する
			this.twryoPrckmkCdCnvMap.put(mapKey, dbMap);
			// 次のレコードを読み込む
			dbMap =  db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		assert this.twryoPrckmkCdCnvMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createTuwaPrcPrckmkCdCnvMap]マスタ取得件数：" + this.twryoPrckmkCdCnvMap.size()) : true;
		
		return ;
	}
	
	/**
	 * 通話料料金項目コード変換マップ検索用のキーを生成します。
	 * @param dbMap 料金項目抽出変換出力結果
	 * @return マップ検索用キーリスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<String> createMapKey(JBSbatCommonDBInterface dbMap) throws Exception
	{
		ArrayList<String> keyList = new ArrayList<String>();
		keyList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD));	// 料金グループコード
		keyList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD));		// 料金コースコード
		keyList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD));	// 料金サービスコード
		keyList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));	// 料金項目コード
		return keyList;
	}
	
	/**
	 * * 検証対象契約情報（状態判定済み）出力します。
	 * @param inMap       入力電文
	 * @param tmpPrcKmkCd 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void schTwryoPrckmkCdCnvMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][schTwryoPrckmkCdCnvMap]");
		
		ArrayList<String> mapKey = new ArrayList<String>();
		mapKey.add(JACStrConst.PRC_GRP_CD_SP);	// 料金グループコード（空白）
		mapKey.add(JACStrConst.PCRS_CD_SP);	// 料金コースコード（空白）
		mapKey.add(JACStrConst.PRC_SVC_CD_SP);	// 料金サービスコード（空白）
		mapKey.add(inMap.getString(JBSbatAKIFM006.PRC_KMK_CD));	// 料金項目コード
		
		//
		JBSbatCommonDBInterface dbMap = this.twryoPrckmkCdCnvMap.get(mapKey);
		if (dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][schTwryoPrckmkCdCnvMap][通話料料金項目コード変換マップに存在したため、置換]");
			// 出力料金項目コードを返却する
			this.tmpPrcKmkCd =  dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD);
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][schTwryoPrckmkCdCnvMap][通話料料金項目コード変換マップに存在せず。置換なし]");
			this.tmpPrcKmkCd = inMap.getString(JBSbatAKIFM006.PRC_KMK_CD);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][schTwryoPrckmkCdCnvMap][退避．料金項目コード=" + this.tmpPrcKmkCd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][schTwryoPrckmkCdCnvMap]");
	}
	
	/**
	 * * 検証対象契約情報（状態判定済み）出力します。
	 * @param inMap       入力電文
	 * @param ymdData     料金検証契約状態コード
	 * @param useDayCnt   月中利用日数
	 * @param outputItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo( JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo][inMap=" + inMap.toString() + "]") : true;
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 入力電文コピー
		outMap.getMap().putAll(inMap.getMap());
		
		// 差分設定
		outMap.set(JBSbatAKIFM006.PRC_KMK_CD,	this.tmpPrcKmkCd);		// 退避．料金項目コードを再設定
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputItem.addOutMapList(outMap);

		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputInfo][outMap = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}

}
