/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom  					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JACbatSchdlUtil
 *	ソースファイル名	：JACbatSchdlUtil.java
 *	作成者				：富士通　
 *	作成日				：2011年06月07日
 *＜機能概要＞
 *　料金スケジュール定義アクセス部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/06/07   富士通		新規作成
 *********************************************************************/
package eo.business.common;

import java.util.HashMap;

import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;

/**
 * 料金スケジュール定義アクセス部品です。
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JACbatSchdlUtil
{
	/** バッチ共通パラメータ */
	private JBSbatCommonItem commonItem = null;

	/** テーブルアクセスクラス(料金スケジュール定義) */
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
	
	/** SQL定義キー(AC_SELECT_004)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_004 = "AC_SELECT_004";
	
	/** SQL定義キー(AC_SELECT_005)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_005 = "AC_SELECT_005";
	
	/** 請求年月保持用マップ */
	private HashMap<String, String> mapBillDate = null;

	/** 利用開始日、終了日保持用マップ */
	private HashMap<String, String[]> mapUseStrEnd = null;

	/**
	 * コンストラクタ
	 * 
	 * @param commonItem バッチ共通パラメータ
	 */
	public JACbatSchdlUtil(JBSbatCommonItem commonItem)
	{
		this.commonItem = commonItem;
		mapBillDate = new HashMap<String, String>();
		mapUseStrEnd = new HashMap<String, String[]>();
	}

	/**
	 * バッチ運用日、指定されたイベントコードに対応する請求年月を取得します。
	 * 
	 * @param eventYmd イベント年月日
	 * @param eventCd イベントコード
	 * @return String 請求年月
	 * @throws Exception 取得に失敗した場合
	 */
	public String getBillDate(String eventYmd, String eventCd) throws Exception
	{
		// イベント年月日の妥当性チェック
		if(!JPCUtilCommon.checkDate(eventYmd, 8))
		{
			String[] msgParam = new String[]{ "イベント年月日:" + eventYmd + " "};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0480CE, msgParam);
		}

		// keyの組み立て（イベント年月日 + イベントコード）
		StringBuilder key = new StringBuilder();
		key.append(eventYmd).append(eventCd);

		// 対象のデータを取得済みの場合、HashMapより値を取得し、返却する。
		if (mapBillDate.containsKey(key.toString()))
		{
			return mapBillDate.get(key.toString());
		}

		// テーブルアクセスクラスがnullのとき、生成する。
		if (db_CH_M_PRC_SCHDL_TEIGI == null)
		{
			db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME);
		}
		
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(eventCd);
		whereMap.setValue(eventYmd);
		
		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(whereMap, CH_M_PRC_SCHDL_TEIGI_AC_SELECT_004);
		
		JBSbatCommonDBInterface commonDBInterface = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		
		// 取得結果判定
		if (commonDBInterface == null || commonDBInterface.getMapSize() == 0)
		{
			// DB未存在エラー
			String[] msgParam = new String[]
			{ JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, JPCUtilCommon.convListToString(whereMap.getList()) };
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, msgParam);
		}
		
		String seikyYm = commonDBInterface.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);

		// 取得した値を、請求年月保持用マップに保持
		mapBillDate.put(key.toString(), seikyYm);
		return seikyYm;
	}

	/**
	 * 請求年月、イベントコードから、利用開始日、終了日を取得します。
	 * @param seikyYm 請求年月
	 * @param eventCdStr イベントコード（開始）
	 * @param eventCdEnd イベントコード（終了）
	 * @return String[] イベント日付
	 * @throws Exception 取得に失敗した場合
	 */
	public String[] getUseStrEnd(String seikyYm, String eventCdStr, String eventCdEnd) throws Exception
	{
		// 請求年月の妥当性チェック
		if(!JPCUtilCommon.checkDate(seikyYm, 6))
		{
			String[] msgParam = new String[]{ "請求年月:" + seikyYm + " "};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0480CE, msgParam);
		}

		// keyの組み立て（請求年月 + イベントコード（開始） + イベントコード（終了））
		StringBuilder key = new StringBuilder();
		key.append(seikyYm).append(eventCdStr).append(eventCdEnd);

		// 対象のデータを取得済みの場合、HashMapより値を取得し、返却する。
		if (mapUseStrEnd.containsKey(key.toString()))
		{
			return mapUseStrEnd.get(key.toString());
		}

		// テーブルアクセスクラスがnullのとき、生成する。
		if (db_CH_M_PRC_SCHDL_TEIGI == null)
		{
			db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME);
		}

		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(seikyYm);
		whereMap.setValue(eventCdStr);
		whereMap.setValue(eventCdEnd);
		
		// DBアクセスを実行します。正常な場合は2件取得。
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(whereMap, CH_M_PRC_SCHDL_TEIGI_AC_SELECT_005);
		
		String[] returnDate = new String[2];
		
		JBSbatCommonDBInterface commonDBInterface = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		
		int selectCnt = 0;
		
		// 検索結果がnullになるまで繰り返す。
		while(commonDBInterface != null)
		{
			returnDate[selectCnt] = commonDBInterface.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.EVENT_YMD);
			selectCnt += 1;
			commonDBInterface = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		}
		
		// 取得結果判定
		if(selectCnt != 2)
		{
			// DB設定値エラー
			String[] msgParam = new String[]
			{ JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, JPCUtilCommon.convListToString(whereMap.getList()), "検索結果：" + selectCnt + "件"};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0370CE, msgParam);
		}

		// 取得した値を、利用開始日、終了日保持用マップに保持
		mapUseStrEnd.put(key.toString(), returnDate);
		return returnDate;
	}
	
	/**
	 * テーブルアクセスクラスをクローズします。
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	public void close() throws Exception
	{
		// 料金スケジュール定義
		if (db_CH_M_PRC_SCHDL_TEIGI != null)
		{
			db_CH_M_PRC_SCHDL_TEIGI.close();
		}
	}
}
