/*********************************************************************
* All Right reserved,Copyright (c) Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：料金システム
*   ソースファイル名：JACTaxCalcShikibetuCodeUtil.java
*   作成者          ：富士通
*   日付            ：2014年02月15日
*＜機能概要＞
*   税計算識別コード管理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*	v8.00.00	2014/02/15   FJ）北端	【IT1-2014-0000059】税率マスタ参照条件見直し。新規作成
*	v8.00.01	2014/03/04   FJ）後藤	【TG1-2014-0000003】適用開始日最新の税計算識別コードを取得するメソッドを追加
**********************************************************************/
package eo.common.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;

import eo.common.constant.JACStrConst;

/**
 * 税計算識別コード管理クラス
 *
 */
public class JACTaxCalcShikibetuCodeUtil
{
	/** パラメータＩＤの前方一致部分 */
	private static final String PARAM_ID = "AC_TAXCALC_SKBT_";
	
	/** テーブル名 */
	private static final String TABLE_NAME = "ZM_M_WORK_PARAM_KNRI";
	
	/** 業務パラメータ 検索結果 */
	private HashMap<String, String> skbtCdMap = new HashMap<String, String>();

	/** 呼出し元 */
	private String caller = null;

	/** DBコネクション */
	private Connection con = null;

	/**
	 * コンストラクタ
	 * 
	 * 呼出し元がDBコネクションを渡せない場合（オンライン）
	 * @param caller 呼出し元種別
	 */
	public JACTaxCalcShikibetuCodeUtil(String caller)
	{
		this.caller = caller;
		this.con = JSYejbConnection.getConnection(TABLE_NAME);
	}
	
	/**
	 * コンストラクタ
	 * 
	 * 呼出し元がDBコネクションを渡せる場合（バッチ）
	 * @param caller 呼出し元種別
	 * @param con DBコネクション
	 */
	public JACTaxCalcShikibetuCodeUtil(String caller, Connection con)
	{
		this.caller = caller;
		this.con = con;
	}
	
	/**
     * 税計算識別コード取得
     * 
     * @param taxRateCd 税率コード
     * @param zeiKind 内税外税識別コード（1:内税 2:外税）
     * @param baseDate 基準日（YYYYMMDD形式）
     * @return String 税計算識別コード
     */
	public String getTaxSkbtCd(String taxRateCd, String zeiKind, String baseDate) throws Exception
	{
		String keyString = PARAM_ID + taxRateCd + "_" + zeiKind;

		String skbtCd = this.skbtCdMap.get(keyString);
		if(skbtCd != null) 
		{
			// キャッシュ済み
			return skbtCd;
		}

		PreparedStatement pstmt = null;
		ResultSet rsltQuery = null;
		String setteValue = null;

		try{
			StringBuffer sb = new StringBuffer();
		    sb.append("SELECT ");
		    sb.append("   WORK_PARAM_SETTE_VALUE ");
		    sb.append(" FROM ");
		    sb.append("   ZM_M_WORK_PARAM_KNRI ZM0321");
		    sb.append(" WHERE");
		    sb.append("   ZM0321.WORK_PARAM_ID LIKE ?");
		    sb.append(" AND");
		    sb.append("   ZM0321.WORK_PARAM_TSTAYMD <= ?");
		    sb.append(" AND");
		    sb.append("   ZM0321.WORK_PARAM_TENDYMD >= ?");
		    sb.append(" AND ");
		    sb.append("   ZM0321.MK_FLG = '0'");
		    sb.append("");

			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sb.toString());
			CAANJDBCUtil.setParam(pstmt, 1, keyString);
			CAANJDBCUtil.setParam(pstmt, 2, baseDate);
			CAANJDBCUtil.setParam(pstmt, 3, baseDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			if (rsltQuery.next())
			{
				setteValue = rsltQuery.getString("WORK_PARAM_SETTE_VALUE");
			}
			// キャッシュ
			this.skbtCdMap.put(keyString, setteValue);
			return setteValue;

		} catch(SQLException e) {
			throw new Exception(e);

		} finally {
			try {
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if (pstmt != null){
					pstmt.close();
				}
				if (JACStrConst.CALLER_SCREEN.equals(this.caller)) {
					// ここで取得したコネクションはクローズする
					if(con != null) {
						CAANConnectionMgr.getInstance().close(con);
					}
				}
			} catch(SQLException e){
				throw new Exception(e);

			}
		}
	}
	
	/**
     * 税計算識別コード取得（適用開始日最新）
     * 
     * @param zeiKind 内税外税識別コード（1:内税 2:外税）
     * @param baseDate 基準日（YYYYMMDD形式）
     * @return String 税計算識別コード
     */
	public String getTaxSkbtCdStaMax(String zeiKind, String baseDate) throws Exception
	{
		String keyString = zeiKind + baseDate;

		String skbtCd = this.skbtCdMap.get(keyString);
		if(skbtCd != null) 
		{
			// キャッシュ済み
			return skbtCd;
		}

		PreparedStatement pstmt = null;
		ResultSet rsltQuery = null;
		String setteValue = null;

		try{
			StringBuffer sb = new StringBuffer();
			sb.append("SELECT");
			sb.append("   AC0271.TAX_CALC_SKBT_CD");
			sb.append(" FROM");
			sb.append("   AC_M_TAX_RT AC0271");
			sb.append(" WHERE");
			sb.append("   AC0271.UZEI_SZEI_SKBT_CD = ?");
			sb.append(" AND");
			sb.append("   AC0271.TAX_RT_TSTAYMD <= ?");
			sb.append(" AND");
			sb.append("   AC0271.TAX_RT_TENDYMD >= ?");
			sb.append(" AND");
			sb.append("   AC0271.MK_FLG = '0'");
			sb.append(" AND ");
			sb.append("   ROWNUM = 1");
			sb.append(" ORDER BY");
			sb.append("   AC0271.TAX_RT_TSTAYMD DESC");
		    sb.append("");

			// prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sb.toString());
			CAANJDBCUtil.setParam(pstmt, 1, zeiKind);
			CAANJDBCUtil.setParam(pstmt, 2, baseDate);
			CAANJDBCUtil.setParam(pstmt, 3, baseDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			if (rsltQuery.next())
			{
				setteValue = rsltQuery.getString("TAX_CALC_SKBT_CD");
			}
			// キャッシュ
			this.skbtCdMap.put(keyString, setteValue);
			return setteValue;

		} catch(SQLException e) {
			throw new Exception(e);

		} finally {
			try {
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if (pstmt != null){
					pstmt.close();
				}
				if (JACStrConst.CALLER_SCREEN.equals(this.caller)) {
					// ここで取得したコネクションはクローズする
					if(con != null) {
						CAANConnectionMgr.getInstance().close(con);
					}
				}
			} catch(SQLException e){
				throw new Exception(e);

			}
		}
	}
}
