/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECR0011B140TPDA
*	ソースファイル名：JSYejbECR0011B140TPDA.java
*	作成者			：EK909035
*	日付			：2011年06月10日
*＜機能概要＞
*	SQLFacility
*	テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ8.00.00	2014/04/23	FJ)斉藤		ANK-2007-00-00 【ＮＯ．１４１１】対応履歴Ｓのケース表示について
 *	ｖ9.00.00	2014/05/20	FJ)小野		ANK-2082-00-00 【ＮＯ．１３７１】問合せ一覧の表示日数について
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
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.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateDBAccessHandler;

import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.CR0011ETMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B140CBSMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B140CBSMsg1List;
import eo.ejb.common.JCCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECR0011B140_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECR0011B140TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECR0011B140TPDA()	{
	}
	
	/**
	*   ECR0011B140_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		//パラメータ設定リスト
		List<Object> replaceList = new ArrayList<Object>();

		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			//****************** 以降、コーディング修正  START  ************************************//
			// ＫＥＹ＿問合せ状態コード
			String statCd = inMsg.getString(ECR0011B140CBSMsg.KEY_TOIAWASE_STAT_CD);
			// ＳＯＲＴ指定項目
			String sortItem = inMsg.getString(ECR0011B140CBSMsg.SORT_SHITEI_KMK_NM);

			// 問合せ客番号（不明顧客）をプロパティファイルから取得
			String unknownCst = JCCModelCommon.getApplicationConst(JCRStrConst.PROP_KEY_CR_PROSCST_UNKNOWN_CST);
			//****************** 以降、コーディング修正   END   ************************************//
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CR0011ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     TKRK.TAIO_KIROK_NO, ")
					.append("     TKRK.UK_DTM, ")
					.append("     TKRK.TITLE, ")
					.append("     NULL, ")
					.append("     NULL, ")
					.append("     TKRK.TOIAWASE_STAT_CD, ")
					.append("     CD01.CD_DIV_NM                         AS TOIAWASE_STAT_CD_NM, ")
					.append("     NULL, ")
					.append("     NULL, ")
					.append("     NULL, ")
					.append("     NULL, ")
					.append("     TKRK.TOIAWASE_UK_SBT_CD, ")
					.append("     (SELECT  ")
					.append("          TORK_EFILE_KNRI_NO ")
					.append("      FROM CR_T_TORK_EFILE_KNRI ")
					.append("      WHERE TAIO_KIROK_NO    = TKRK.TAIO_KIROK_NO ")
					.append("      AND  BUNSHO_SBT_CD    = '01' ")
					.append("      AND  MK_FLG           = '0' ")
					.append("      AND  ROWNUM           = 1 ")
					.append("      ) AS TORK_EFILE_KNRI_NO, ")
					.append("     TKRK.TAIO_STA_DTM ")
					.append(" FROM   CR_T_TAIO_KIROK      TKRK ")
					.append(" LEFT JOIN ZM_M_CD_NM_KANRI CD01 ")
					.append("   ON  (CD01.CD_SBT_CD    =  'CD00229' ")
					.append("   AND  CD01.CD_DIV       =  TKRK.TOIAWASE_STAT_CD ")
					.append("   AND  CD01.CD_TSTAYMD  <=  SUBSTR(TKRK.UPD_DTM, 1, 8) ")
					.append("   AND  CD01.CD_TENDYMD  >=  SUBSTR(TKRK.UPD_DTM, 1, 8) ")
					.append("   AND  CD01.MK_FLG       = '0' ")
					.append("     ) ");
			// SQL文_個別部1
			//****************** 以降、コーディング修正  START  ************************************//

			// ＫＥＹ＿検索期間コード
			String certainCd = null;

			// 期間指定ありの場合の検索基準となる過去年月日
			String pastKijunDate = "";

			if (!inMsg.isNull(ECR0011B140CBSMsg.KEY_CERTAIN_CD))
			{
				certainCd = inMsg.getString(ECR0011B140CBSMsg.KEY_CERTAIN_CD);

				try {
					// システム日付
					String sysdate = JCCModelCommon.getSysDate();

					if (JCRStrConst.CERTAIN_CD_3YEARS.equals(certainCd))
					{
						pastKijunDate = JPCUtilCommon.addMonth(sysdate, JCRStrConst.CERTAIN_3YEARS);
					}
					else if (JCRStrConst.CERTAIN_CD_3MONTHS.equals(certainCd))
					{
						pastKijunDate = JPCUtilCommon.addMonth(sysdate, JCRStrConst.CERTAIN_3MONTHS);
					}
				} catch (ParseException e) {
					throw new CAANRuntimeException(e);
				}
			}

			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getString(ECR0011B140CBSMsg.FUNC_CODE) ) ) 
			{
 				sql_Buff.append(" WHERE ")
						.append("     (TKRK.PROSCST_NO = ? ")
 						.append(" AND  TKRK.PROSCST_NO > ?) ");

				replaceList.add(inMsg.getString(ECR0011B140CBSMsg.KEY_PROSCST_NO));
				replaceList.add(unknownCst);

				// 問合せ状態コードが指定ありの場合（「全て」以外の場合）
 				if (statCd != null && !"".equals(statCd))
				{
					sql_Buff.append(" AND  TKRK.TOIAWASE_STAT_CD = ? ");
					replaceList.add(inMsg.getString(ECR0011B140CBSMsg.KEY_TOIAWASE_STAT_CD));

					// 検索期間コードが指定ありの場合（「全て」以外の場合）かつ、問合せ状態コードが"クローズ"または"キャンセル"の場合、対応開始年月日時分秒の条件を加える。
					if ((!JCRUtilCommon.isNull(certainCd) && !JCRStrConst.CERTAIN_CD_NONE.equals(certainCd)) && 
							(JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(statCd) || JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CNCL.equals(statCd)))
					{
						sql_Buff.append(" AND TKRK.TAIO_STA_DTM >= ? ");
						replaceList.add(pastKijunDate);
					}
				}
 				else
 				{
 					// 問合せ状態コードが指定なしの場合（「全て」の場合）

 					// 検索期間コードが指定ありの場合（「全て」以外の場合）
 					// 問合せ状態コードが"クローズ"または"キャンセル"の場合のみ、対応開始年月日時分秒の条件を加える。
 					if (!JCRUtilCommon.isNull(certainCd) && !JCRStrConst.CERTAIN_CD_NONE.equals(certainCd))
 					{
 						sql_Buff.append(" AND (TKRK.TOIAWASE_STAT_CD IN ('101', '102') OR (TKRK.TOIAWASE_STAT_CD IN ('103', '104') AND TKRK.TAIO_STA_DTM >= ?)) ");
 						replaceList.add(pastKijunDate);
 					}
 				}

				sql_Buff.append(" AND  TKRK.MK_FLG     = '0' ");
				
				if (JCRStrConst.TOIAWASE_STAT_CD.equals( sortItem ))  
				{
					sql_Buff.append(" ORDER BY  ")
							.append("    TKRK.TOIAWASE_STAT_CD ")
							.append("   ,TKRK.TAIO_STA_DTM DESC ")
							.append("   ,TKRK.TAIO_KIROK_NO DESC ");
				}
				else
				{
					sql_Buff.append(" ORDER BY  ")
							.append("    TKRK.TAIO_KIROK_NO ")
							.append("   ,TKRK.TOIAWASE_STAT_CD ");
				}
			}

			if ( JPCModelConstant.FUNC_CD_2.equals( inMsg.getString(ECR0011B140CBSMsg.FUNC_CODE) ) ) 
			{
 				sql_Buff.append(" WHERE ")
						.append("     (TKRK.PROSCST_NO = ? ")
 						.append(" AND  TKRK.PROSCST_NO > ?) ");

				replaceList.add(inMsg.getString(ECR0011B140CBSMsg.KEY_PROSCST_NO));
				replaceList.add(unknownCst);

				// 問合せ状態コードが指定ありの場合（「全て」以外の場合）
				if (statCd != null && !"".equals(statCd))
				{
					sql_Buff.append(" AND  TKRK.TOIAWASE_STAT_CD = ? ");
					replaceList.add(inMsg.getString(ECR0011B140CBSMsg.KEY_TOIAWASE_STAT_CD));

					// 検索期間コードが指定ありの場合（「全て」以外の場合）かつ、問合せ状態コードが"クローズ"または"キャンセル"の場合、対応開始年月日時分秒の条件を加える。
					if ((!JCRUtilCommon.isNull(certainCd) && !JCRStrConst.CERTAIN_CD_NONE.equals(certainCd)) && 
							(JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(statCd) || JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CNCL.equals(statCd)))
					{
						sql_Buff.append(" AND TKRK.TAIO_STA_DTM >= ? ");
						replaceList.add(pastKijunDate);
					}
				}
 				else
 				{
 					// 問合せ状態コードが指定なしの場合（「全て」の場合）

 					// 検索期間コードが指定ありの場合（「全て」以外の場合）
 					// 問合せ状態コードが"クローズ"または"キャンセル"の場合のみ、対応開始年月日時分秒の条件を加える。
 					if (!JCRUtilCommon.isNull(certainCd) && !JCRStrConst.CERTAIN_CD_NONE.equals(certainCd))
 					{
 						sql_Buff.append(" AND (TKRK.TOIAWASE_STAT_CD IN ('101', '102') OR (TKRK.TOIAWASE_STAT_CD IN ('103', '104') AND TKRK.TAIO_STA_DTM >= ?)) ");
 						replaceList.add(pastKijunDate);
 					}
 				}

				sql_Buff.append(" AND  TKRK.MK_FLG     = '0' ");

				if (JCRStrConst.TOIAWASE_STAT_CD.equals( sortItem ))  
				{
					sql_Buff.append(" ORDER BY  ")
							.append("    TKRK.TOIAWASE_STAT_CD DESC ")
							.append("   ,TKRK.TAIO_STA_DTM DESC ")
							.append("   ,TKRK.TAIO_KIROK_NO DESC ");
				}
				else  
				{
					sql_Buff.append(" ORDER BY  ")
							.append("    TKRK.TAIO_KIROK_NO  DESC")
							.append("   ,TKRK.TOIAWASE_STAT_CD ");
				}
			//****************** 以降、コーディング修正  END  ************************************//
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			for (int idx = 0; idx < replaceList.size(); idx++ )
			{
				CAANJDBCUtil.setParam(pstmt, idx+1, replaceList.get(idx));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// ECR0011B140CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECR0011B140CBSMsg1List.TAIO_KIROK_NO
					, ECR0011B140CBSMsg1List.UK_DTM
					, ECR0011B140CBSMsg1List.TITLE
					, ECR0011B140CBSMsg1List.SVC_KEI_NO
					, ECR0011B140CBSMsg1List.SVC_KEI_NO_NM
					, ECR0011B140CBSMsg1List.TOIAWASE_STAT_CD
					, ECR0011B140CBSMsg1List.TOIAWASE_STAT_CD_NM
					, ECR0011B140CBSMsg1List.EOID
					, ECR0011B140CBSMsg1List.SYSID
					, ECR0011B140CBSMsg1List.MEMBER_SBT_CD
					, ECR0011B140CBSMsg1List.MEMBER_SBT_CD_NM
					, ECR0011B140CBSMsg1List.TOIAWASE_UK_SBT_CD
					, ECR0011B140CBSMsg1List.TORK_EFILE_KNRI_NO
					, ECR0011B140CBSMsg1List.TAIO_STA_DTM
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECR0011B140CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECR0011B140CBSMsg1List", outMsg1);
			
			//****************** 以降、コーディング修正 START ************************************//
			// 総検索件数の設定
			inMsg.set(ECR0011B140CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(outMsg1.length));
			//****************** 以降、コーディング修正  END  ************************************//

		} catch(SQLException e) {
			inMsg.set(ECR0011B140CBSMsg.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(ECR0011B140CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
