/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JSYejbEKK2471B001TPDA
 *	ソースファイル名：JSYejbEKK2471B001TPDA.java
 *	作成者			：EK911015
 *	日付			：2012年07月19日
 *＜機能概要＞
 *	他事業者割引コード変換一覧照会テンプレートDBアクセス部品です。
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v1.00.00    2012/07/19  FJ          新規作成
 *  v4.00.00    2013/07/12  FJ)沖田     LT-2013-0000381
 *
 ********************************************************************************/

package eo.ejb.cbs.sqlf;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateDBAccessHandler;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import eo.ejb.cbs.cbsmsg.EKK2471B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2471B001CBSMsg1List;
import eo.ejb.cbm.entity.KK2471ETMsg;
import eo.ejb.common.JKKModelCommon;

/**
*
*  テンプレートDBアクセス部品　EKK2471B001_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEKK2471B001TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEKK2471B001TPDA()	{
	}
	
	/**
	*   EKK2471B001_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// バインド変数格納用配列
		ArrayList<Object> alBind = new ArrayList<Object>();

		// パラメータカウント
		int paramCnt = 0;

		// SQL連結判定
		boolean conctFlg = false;

		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2471ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK2471.TAJGS_WRIB_TK_JGS_CD ")
					.append("       ,KK2471.TAJGSWR_CD_CHG_SBT_CD ")
					.append("       ,KK2471.TAJGSWR_CD_CHG_NO ")
					.append("       ,KK2471.IDO_DIV ")
					.append("       ,KK2471.SMTVL_IDO_DTL_CD ")
					.append("       ,KK2471.PRG_STAT ")
					.append("       ,KK2471.TAJGS_WRIB_KEI_TRAN_CD ")
					.append("       ,KK2471.KDDI_WKEI_IDT_SBT_CD ")
					.append("       ,KK2471.TAJGSWR_CNRE_CHG_SBT_CD ")
					.append("       ,KK2471.IDO_RSN_CD ")
					.append("       ,KK2471.KOJIAK_STP_RSN_CD_1 ")
					.append("       ,KK2471.KOJIAK_STP_RSN_CD_2 ")
					.append("       ,KK2471.SMTVL_DSL_CNCL_RSN_CD ")
					.append("       ,KK2471.TAJGSWR_CD_CHG_TSTAYMD ")
					.append("       ,KK2471.TAJGSWR_CD_CHG_TENDYMD ")
					.append(" FROM KK_M_TAJGSWR_CD_CHG KK2471 ");
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(EKK2471B001CBSMsg.FUNC_CODE).toString() ) ) {
 
				sql_Buff.append(" WHERE KK2471.TAJGS_WRIB_TK_JGS_CD = ?  ");
 				// バインドリスト設定_他事業者割引提供事業者コード
 				alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_TAJGS_WRIB_TK_JGS_CD));

				// ＫＥＹ＿他事業者割引コード変換種別コードの設定
				String[] wkChgSbtCd = inMsg.getString(EKK2471B001CBSMsg.KEY_TAJGSWR_CD_CHG_SBT_CD).split(",");
				StringBuffer sbBindSbtCd = new StringBuffer();
 				sql_Buff.append("   AND KK2471.TAJGSWR_CD_CHG_SBT_CD IN (  ");

 				// ＫＥＹ＿他事業者割引コード変換種別コード件数分設定する
				for (int i = 0; i < wkChgSbtCd.length; i++)
				{
					// 入力値をカンマで分割した数分OR条件にて設定した内容を
					// AND条件にてWHERE句に設定する
					sbBindSbtCd.append(" , ? ");
					
					// バインド変数設定
					alBind.add(wkChgSbtCd[i]);
				}
				// 最初のカンマを取り除いてSQLに設定
				sql_Buff.append(sbBindSbtCd.toString().substring(2));
				sql_Buff.append(" ) ");

				sql_Buff.append("   AND KK2471.TAJGSWR_CD_CHG_TSTAYMD <= ?  ")
						.append("   AND KK2471.TAJGSWR_CD_CHG_TENDYMD >= ?  ")
						.append("   AND KK2471.MK_FLG = '0' ");
				// バインドリスト設定_運用日付
				alBind.add(opeDate);
				alBind.add(opeDate);

				// ＫＥＹ＿異動区分、ＫＥＹ＿異動理由コード、ＫＥＹ＿工事案件中止理由コード1、2のいずれかが設定されている場合
				if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_IDO_DIV)
						|| !inMsg.isNull(EKK2471B001CBSMsg.KEY_IDO_RSN_CD)
						|| !inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_1)
						|| !inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2))
				{
					sql_Buff.append("   AND (");

					// ＫＥＹ＿異動区分が設定されている場合
					if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_IDO_DIV))
					{
						sql_Buff.append("     (KK2471.IDO_DIV = ?  ");
		 				// バインドリスト設定_異動区分
						alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_IDO_DIV));

						// ＫＥＹ＿スマートバリュー異動詳細コードが設定されている場合
						if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_SMTVL_IDO_DTL_CD))
						{
							sql_Buff.append("      AND KK2471.SMTVL_IDO_DTL_CD = ?  ");
			 				// バインドリスト設定_スマートバリュー異動詳細コード
							alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_SMTVL_IDO_DTL_CD));
						}
						else
						{
							sql_Buff.append("      AND KK2471.SMTVL_IDO_DTL_CD IS NULL  ");							
						}

						// ＫＥＹ＿進捗ステータスが設定されている場合
						if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_PRG_STAT))
						{
							sql_Buff.append("      AND KK2471.PRG_STAT = ?  ");
			 				// バインドリスト設定_進捗ステータス
							alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_PRG_STAT));
						}
						sql_Buff.append(" ) ");
						conctFlg = true;
					}

					// フラグがtrue、かつＫＥＹ＿異動理由コードが設定されている場合
					if (conctFlg && !inMsg.isNull(EKK2471B001CBSMsg.KEY_IDO_RSN_CD))
					{
						sql_Buff.append("     OR ");
					}

					// ＫＥＹ＿異動理由コードが設定されている場合
					if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_IDO_RSN_CD))
					{
						// ＫＥＹ＿異動理由コードの設定
						String[] wkIdoRsnCd = inMsg.getString(EKK2471B001CBSMsg.KEY_IDO_RSN_CD).split(",");
						StringBuffer sbBindRsnCd = new StringBuffer();
						sql_Buff.append("     (KK2471.IDO_RSN_CD IN ( ");
	
						// ＫＥＹ＿異動理由コード件数分設定する
						for (int i = 0; i < wkIdoRsnCd.length; i++)
						{
							// 入力値をカンマで分割した数分OR条件にて設定した内容を
							// AND条件にてWHERE句に設定する
							sbBindRsnCd.append(" , ? ");
							
							// バインド変数設定
							alBind.add(wkIdoRsnCd[i]);
						}
						// 最初のカンマを取り除いてSQLに設定
						sql_Buff.append(sbBindRsnCd.toString().substring(2));
						sql_Buff.append(" ) ")
								.append(" ) ");
						conctFlg = true;
					}

					// フラグがtrue、かつＫＥＹ＿工事案件中止理由コード１、２のいずれかが設定されている場合
					if (conctFlg
							&& (!inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_1)
									|| !inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2)))
					{
						sql_Buff.append("     OR ");
					}

					// ＫＥＹ＿工事案件中止理由コード１が設定されている場合
					if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_1))
					{
						sql_Buff.append("     (KK2471.KOJIAK_STP_RSN_CD_1 = ?  ");
		 				// バインドリスト設定_工事案件中止理由コード１
						alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_1));

						// ＫＥＹ＿工事案件中止理由コード２が設定されている場合
						if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2))
						{
							sql_Buff.append("      AND KK2471.KOJIAK_STP_RSN_CD_2 = ?  ");
			 				// バインドリスト設定_工事案件中止理由コード２
							alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2));
						}
						sql_Buff.append("    ) ");
					}
					// 上記以外
					else if (!inMsg.isNull(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2))
					{
						sql_Buff.append("      (KK2471.KOJIAK_STP_RSN_CD_2 = ? ) ");
		 				// バインドリスト設定_工事案件中止理由コード２
						alBind.add(inMsg.getString(EKK2471B001CBSMsg.KEY_KOJIAK_STP_RSN_CD_2));
					}
					sql_Buff.append("    ) ");
				}
				sql_Buff.append(" ORDER BY KK2471.TAJGS_WRIB_TK_JGS_CD ASC ")
						.append("         ,KK2471.TAJGSWR_CD_CHG_SBT_CD ASC ")
						.append("         ,KK2471.TAJGSWR_CNRE_CHG_SBT_CD ASC ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			for(int i = 0; i < alBind.size(); i++)
			{
				// FROM句以降に設定するバインド変数値
				CAANJDBCUtil.setParam(pstmt, ++paramCnt, alBind.get(i));
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK2471B001CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK2471B001CBSMsg1List.TAJGS_WRIB_TK_JGS_CD
					, EKK2471B001CBSMsg1List.TAJGSWR_CD_CHG_SBT_CD
					, EKK2471B001CBSMsg1List.TAJGSWR_CD_CHG_NO
					, EKK2471B001CBSMsg1List.IDO_DIV
					, EKK2471B001CBSMsg1List.SMTVL_IDO_DTL_CD
					, EKK2471B001CBSMsg1List.PRG_STAT
					, EKK2471B001CBSMsg1List.TAJGS_WRIB_KEI_TRAN_CD
					, EKK2471B001CBSMsg1List.KDDI_WKEI_IDT_SBT_CD
					, EKK2471B001CBSMsg1List.TAJGSWR_CNRE_CHG_SBT_CD
					, EKK2471B001CBSMsg1List.IDO_RSN_CD
					, EKK2471B001CBSMsg1List.KOJIAK_STP_RSN_CD_1
					, EKK2471B001CBSMsg1List.KOJIAK_STP_RSN_CD_2
					, EKK2471B001CBSMsg1List.SMTVL_DSL_CNCL_RSN_CD
					, EKK2471B001CBSMsg1List.TAJGSWR_CD_CHG_TSTAYMD
					, EKK2471B001CBSMsg1List.TAJGSWR_CD_CHG_TENDYMD
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EKK2471B001CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK2471B001CBSMsg1List", outMsg1);
			

		} catch(SQLException e) {
			inMsg.set(EKK2471B001CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(EKK2471B001CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
