/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACEmJgsSsnTrgChsht
*	ソースファイル名	：JBSbatACEmJgsSsnTrgChsht.java
*	作成者				：富士通　
*	作成日				：2013年02月22日
*＜機能概要＞
*　ＥＭ事業者間精算対象抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/02/22  FJ)早崎		【ST2-2013-0000612】対応 新規作成
*********************************************************************/
package eo.business.service;

import java.util.HashSet;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM017;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACEmJgsSsnTrgChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AC_SELECT_025)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_025 = "AC_SELECT_025";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 退避．料金項目抽出変換マスタSet*/
	private HashSet<String> bkPrcKmkCsChgeSet = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");

		// 業務パラメータ取得
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 業務機能識別コード(外部料金取込用モバイル機器関連課題情報)
		String WorkKinoSkbtCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_OT_ML_KK_CRIF);

		// パラメータ取得部品のクローズ処理
		paramUtil.close();
		
		// 退避．料金項目抽出変換マスタSet設定処理
		this.bkPrcKmkCsChgeSet = makeSet(WorkKinoSkbtCd);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		
		// 出力共通電文
		JBSbatOutputItem outputItem = new JBSbatOutputItem();

		// 請求内訳コード
		String sikyUwCd = inMap.getString(JBSbatACIFM017.SIKY_UW_CD).trim();
		
		// 
		JBSbatServiceInterfaceMap outPutList = null;
		// 
		if(this.bkPrcKmkCsChgeSet.contains(sikyUwCd))
		{
			// 出力情報作成
			outPutList = this.makeOutputInfo(inMap);
			
			// 出力処理
			outputItem.addOutMapList(outPutList);
		}
		else
		{
			// 出力対象外
			return null;
		}
		
		
		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(AC_SELECT_025)で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_AC_SELECT_025(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());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_025);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	/**
	 * 料金項目抽出変換情報の取得を行いSetに設定します。
	 * 
	 * @param workKinoSkbtCd		業務機能識別コード
	 * @return HashSet<String>		退避用セット
	 * @throws Exception 			業務サービス内で発生した例外全般
	 */
	private HashSet<String> makeSet(String workKinoSkbtCd) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeSet]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSet][workKinoSkbtCd=" + workKinoSkbtCd + "]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(JACStrConst.SYS_CD_AC);	// システムコード
		paramList.setValue(workKinoSkbtCd);			// 業務機能識別コード
		paramList.setValue(super.opeDate);			// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);			// 料金項目抽出変換適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSet][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_025(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext(); 
		
		HashSet<String> tmpSet = new HashSet<String>();
		
		// 対象データが存在しない場合
		if(dbMap == null)
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSet][DB未存在エラー]");
			String[] outCntMsg = {JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, workKinoSkbtCd};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}

		while(dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSet][dbMap=" + dbMap.getMap().toString() + "]");
			// キー作成
			String key = dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD).trim();
			// マップにデータを格納
			tmpSet.add(key);
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeSet]");
		
		return tmpSet;
		
	}
	
	/**
	 * EM請求明細データ(抽出)情報作成処理を行います。
	 * 
	 * @param inMap　入力電文
	 * @param outputInItem　出力情報
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap makeOutputInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		// EM請求明細データ(抽出)情報
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// レコードタイプ
		outMap.set(JBSbatACIFM017.REC_TYPE, 			inMap.getString(JBSbatACIFM017.REC_TYPE));
		// 再販事業者管理コード
		outMap.set(JBSbatACIFM017.SVC_KEI_NO, 			inMap.getString(JBSbatACIFM017.SVC_KEI_NO));
		// MSISDN
		outMap.set(JBSbatACIFM017.MSISDN, 				inMap.getString(JBSbatACIFM017.MSISDN));
		// ICCID
		outMap.set(JBSbatACIFM017.ICCID, 				inMap.getString(JBSbatACIFM017.ICCID));
		// IMEI
		outMap.set(JBSbatACIFM017.IMEI,					inMap.getString(JBSbatACIFM017.IMEI));
		// EM契約者コード
		outMap.set(JBSbatACIFM017.EM_KSH, 				inMap.getString(JBSbatACIFM017.EM_KSH));
		// プランコード
		outMap.set(JBSbatACIFM017.PLAN_NO, 				inMap.getString(JBSbatACIFM017.PLAN_NO));
		// 請求内訳コード
		outMap.set(JBSbatACIFM017.SIKY_UW_CD, 			inMap.getString(JBSbatACIFM017.SIKY_UW_CD));
		// 請求内訳名称
		outMap.set(JBSbatACIFM017.SIKY_UW_NM, 			inMap.getString(JBSbatACIFM017.SIKY_UW_NM));
		// 請求内訳金額
		outMap.set(JBSbatACIFM017.SIKY_UW_AMNT, 		inMap.getString(JBSbatACIFM017.SIKY_UW_AMNT));
		// 請求適用開始日
		outMap.set(JBSbatACIFM017.SIKY_APLY_STAYMD, 	inMap.getString(JBSbatACIFM017.SIKY_APLY_STAYMD));
		// 請求適用終了日
		outMap.set(JBSbatACIFM017.SIKY_APLY_ENDYMD, 	inMap.getString(JBSbatACIFM017.SIKY_APLY_ENDYMD));
		// 総利用パケット数
		outMap.set(JBSbatACIFM017.TTL_USE_PCT_CNT, 		inMap.getString(JBSbatACIFM017.TTL_USE_PCT_CNT));
		// 備考
		outMap.set(JBSbatACIFM017.BIKO,				 	inMap.getString(JBSbatACIFM017.BIKO));
		
		// 出力フラグ設定
		outMap.setOutFlg(true);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");
		
		return outMap;
	}


}
