/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECH0201B010TPDA
*	ソースファイル名：JSYejbECH0201B010TPDA.java
*	作成者			：EK910079
*	日付			：2013年07月06日
*＜機能概要＞
*	充当一覧照会テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ5.00.00   2013/07/06  FJ)垣内     【LT-2013-0000235】金庫スキーマを外部結合
*	ｖ5.00.01	2013/08/13	FJ)米谷		【TG-2013-0000806】入金取消時の金庫登録処理を修正
*	ｖ6.00.00	2013/11/24	FJ)小野		【OM-2013-0003532】入金取消時の債権、債権内訳、請求テーブルの更新処理変更に伴い出力項目(入金更新年月日時分秒)を追加。
*	ｖ9.00.00	2014/09/04	FJ)古田		【OM-2013-0001880】機能コード3追加（充当番号で検索する条件を追加）
*	 v12.00.00	2015/03/04	FJ)桑島		【OM-2014-0003792】料金対応記録設定対応
********************************************************************************/

package eo.ejb.cbs.sqlf;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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.ejb.cbm.entity.CH0201ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0201B010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0201B010CBSMsg1List;
import eo.ejb.common.JPCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECH0201B010_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECH0201B010TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECH0201B010TPDA()	{
	}
	
	/**
	*   ECH0201B010_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		
		// リザルトセット
		ResultSet rsltQuery1 = null;
		ResultSet rsltQuery2 = null;
		
		// 手修正箇所S
		// ページング用
		int iTotalSearchNum = 0;			// 総検索数
		int iTotalPageNum = 0;				// 総ページ数
		int iDisplayNum = 0;				// 表示件数
		int iMaxSearchNum = 0;				// 最大検索件数
		int iDisplayPageNum = 0;			// 表示ページ番号
		int iArrayCopyStart = 0;			// 取得範囲先頭
		int iArrayCopyCount = 0;			// 取得件数
		// 手修正箇所E
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0201ETMsg.getTableName());
			
			// 手修正箇所S
			// 総件数取得
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT COUNT(CH0201.JUTO_NO) AS CNT ")
					.append("  FROM CH_T_JUTO CH0201 ")
					.append("  LEFT JOIN CH_T_NYUKIN CH0111 ON ")
					.append("        CH0111.NYUKIN_NO = CH0201.NYUKIN_NO ")
					.append("        AND CH0111.MK_FLG = '0' ");
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.SAIKEN_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ");
			}
			if ( "2".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.NYUKIN_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ");
			}
			if ( "3".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.JUTO_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータインデックス
			int i = 1;
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿債権番号を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_SAIKEN_NO));
			}
			if ( "2".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿入金番号を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_NYUKIN_NO));
			}
			if ( "3".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿充当番号を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_JUTO_NO));
			}
			// ResultSetの取得
			rsltQuery1 = pstmt1.executeQuery();
			
			// ECH0201B010CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECH0201B010CBSMsg.TOTAL_SEARCH_NUM
			};
			
			rsltQuery1.next();
			mapMessage(rsltQuery1, msgKeyList1, inMsg);

			// パラメータの設定
			// パラメータの最大検索件数がnullでない場合、最大検索件数の設定
			if (!inMsg.isNull(ECH0201B010CBSMsg.MAX_SEARCH_NUM))
			{
				iMaxSearchNum = Integer.parseInt(inMsg.getString(ECH0201B010CBSMsg.MAX_SEARCH_NUM));
			}
			// パラメータの表示件数がnullでない場合、表示件数の設定
			if (!inMsg.isNull(ECH0201B010CBSMsg.DISPLAY_NUM))
			{
				iDisplayNum = Integer.parseInt(inMsg.getString(ECH0201B010CBSMsg.DISPLAY_NUM));
			}
			// パラメータの表示ページ番号がnullでない場合、表示ページ番号の設定
			if (!inMsg.isNull(ECH0201B010CBSMsg.DISPLAY_PAGE_NUM))
			{
				iDisplayPageNum = Integer.parseInt(inMsg.getString(ECH0201B010CBSMsg.DISPLAY_PAGE_NUM));
			}
			// 総検索件数の設定
			iTotalSearchNum = Integer.parseInt(inMsg.getString(ECH0201B010CBSMsg.TOTAL_SEARCH_NUM));
			// 総ページ数の設定
			// 表示件数が0の場合
			if (0 == iDisplayNum) 
			{
				iTotalPageNum = 1;
			}
			// 検索件数/表示件数の余りがない場合
			else if (0 == iTotalSearchNum % iDisplayNum)
			{
				iTotalPageNum = iTotalSearchNum / iDisplayNum;
			}
			else
			{
				iTotalPageNum = iTotalSearchNum / iDisplayNum + 1;
			}
			
			// 総検索数と総ページ数の設定
			inMsg.set(ECH0201B010CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(iTotalSearchNum));
			inMsg.set(ECH0201B010CBSMsg.TOTAL_PAGE_NUM, String.valueOf(iTotalPageNum));
			
			// 検索エラーの設定
			// 総検索件数が0の場合
			if(0 == iTotalSearchNum)
			{
				inMsg.set(ECH0201B010CBSMsg.SEARCH_ERR_FLG , "1");
				return;
			}
			// 総検索件数が最大検索件数より大きい場合(最大検索件数超え)
			else if(0 != iMaxSearchNum && iTotalSearchNum > iMaxSearchNum)
			{
				inMsg.set(ECH0201B010CBSMsg.SEARCH_ERR_FLG , "2");
				return;
			}
			// 表示ページに該当するデータがない場合
			else if(iTotalPageNum < iDisplayPageNum)
			{
				inMsg.set(ECH0201B010CBSMsg.SEARCH_ERR_FLG , "3");
				return;
			}
			
			// 手修正箇所E
			
			// SQL文_基本部1
			sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT CH0201.JUTO_NO ")
					.append(" ,CH0111.RECEIPT_YMD JUTO_YMD ")
					.append(" ,CH0111.RECEIPT_HMS JUTO_HMS ")
					.append(" ,CH0111.NYUKIN_ADD_WAY_CD ")
					.append(" ,CASE CH0191.KNK_PRC_KMK_CD  ")
					.append("   WHEN '00900081301' ")
					.append("   THEN '90' ELSE CH0111.NYUKIN_ROUTE_CD  ")
					.append("   END AS NYUKIN_ROUTE_CD ")
					.append(" ,(SELECT ZM0171.CD_DIV_NM ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00176' ")
					.append("   AND    ZM0171.CD_DIV = RTRIM(CASE CH0191.KNK_PRC_KMK_CD ")
					.append("                                 WHEN '00900081301' ")
					.append("                                 THEN '90' ")
					.append("                                 ELSE CH0111.NYUKIN_ROUTE_CD END) ")
					.append("   AND    ZM0171.CD_TSTAYMD <= ? ")
					.append("   AND    ZM0171.CD_TENDYMD >= ? ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append("  ) AS NYUKIN_ROUTE_NM ")
					.append(" ,(SELECT ZM0171.CD_DIV_ALI ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00176' ")
					.append("   AND    ZM0171.CD_DIV = RTRIM(CASE CH0191.KNK_PRC_KMK_CD ")
					.append("                                 WHEN '00900081301' ")
					.append("                                 THEN '90'  ")
					.append("                                 ELSE CH0111.NYUKIN_ROUTE_CD END) ")
					.append("   AND    ZM0171.CD_TSTAYMD <= ? ")
					.append("   AND    ZM0171.CD_TENDYMD >= ? ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append("  ) AS NYUKIN_ROUTE_ALI ")
					.append(" ,CH0111.UPD_DTM AS NYUKIN_UPD_DTM")
					.append(" ,CH0201.JUTO_AMNT ")
					.append(" ,CH0201.JUTO_SBT_CD ")
					.append(" ,(SELECT ZM0171.CD_DIV_NM ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00182' ")
					.append("   AND    ZM0171.CD_DIV = RTRIM(CH0201.JUTO_SBT_CD) ")
					.append("   AND    ZM0171.CD_TSTAYMD <= ? ")
					.append("   AND    ZM0171.CD_TENDYMD >= ? ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append("  ) AS JUTO_SBT_NM ")
					.append(" ,(SELECT ZM0171.CD_DIV_ALI ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00182' ")
					.append("   AND    ZM0171.CD_DIV = RTRIM(CH0201.JUTO_SBT_CD) ")
					.append("   AND    ZM0171.CD_TSTAYMD <= ? ")
					.append("   AND    ZM0171.CD_TENDYMD >= ? ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append("  ) AS JUTO_SBT_ALI ")
					.append(" ,CH0201.NYUKIN_NO ")
					.append(" ,CH0201.UPD_DTM ")
					.append(" ,CH0201.KNK_NO ")
					//OM-2014-0003792 ADD START
					.append(" ,CH0011.SEIKY_SBT_CD ")
					//OM-2014-0003792 ADD END
					.append("  FROM CH_T_JUTO CH0201 ")
					.append("  LEFT JOIN CH_T_NYUKIN CH0111 ")
					.append("        ON  CH0111.NYUKIN_NO = CH0201.NYUKIN_NO ")
					.append("        AND CH0111.MK_FLG = '0' ")
					.append("  LEFT JOIN CH_T_KNK CH0191 ")
					.append("        ON  CH0201.KNK_NO          = CH0191.KNK_NO ")
					.append("        AND CH0191.KNK_PRC_KMK_CD  = '00900081301' ")
					.append("        AND CH0191.RIREKI_DATA_FLG = '1' ")
					.append("        AND CH0191.MK_FLG = '0' ")
					//OM-2014-0003792 ADD START
					.append("  LEFT JOIN CH_T_SAIKEN CH0011  ")
					.append("         ON  CH0011.SAIKEN_NO      = CH0201.SAIKEN_NO  ")
					.append("         AND CH0011.MK_FLG = '0'  ");
					//OM-2014-0003792 ADD END
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.SAIKEN_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ")
						.append(" ORDER BY ")
						.append("     CH0201.JUTO_YMD DESC,CH0111.NYUKIN_TRN_YMD DESC,CH0111.NYUKIN_TRN_HMS DESC ");
			}
			if ( "2".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.NYUKIN_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ")
						.append(" ORDER BY ")
						.append("     CH0201.JUTO_YMD DESC,CH0111.NYUKIN_TRN_YMD DESC,CH0111.NYUKIN_TRN_HMS DESC ");
			}
			if ( "3".equals( inMsg.getObject(ECH0201B010CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE  CH0201.JUTO_NO = ? ")
						.append("   AND  CH0201.CL_YMD IS NULL ")
						.append("   AND  CH0201.MK_FLG = '0' ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt2 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
// 手修正箇所S
			// パラメータインデックス
			i = 1;
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータの設定(運用日を指定)
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			CAANJDBCUtil.setParam(pstmt2, i++, JPCModelCommon.getOpeDate(inMsg, inContext, null));
			
			if ( "1".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿債権番号を指定)
				CAANJDBCUtil.setParam(pstmt2, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_SAIKEN_NO));
			}
			if ( "2".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿入金番号を指定)
				CAANJDBCUtil.setParam(pstmt2, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_NYUKIN_NO));
			}
			if ( "3".equals( inMsg.getString(ECH0201B010CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿充当番号を指定)
				CAANJDBCUtil.setParam(pstmt2, i++, inMsg.getObject(ECH0201B010CBSMsg.KEY_JUTO_NO));
			}
// 手修正箇所E
			
			// ResultSetの取得
			rsltQuery2 = pstmt2.executeQuery();
			
			// ECH0201B010CBSMsgの明細にセットする項目
			String[] msgKeyList2 = {
					  ECH0201B010CBSMsg1List.JUTO_NO
					, ECH0201B010CBSMsg1List.JUTO_YMD
					, ECH0201B010CBSMsg1List.JUTO_HMS
					, ECH0201B010CBSMsg1List.NYUKIN_ADD_WAY_CD
					, ECH0201B010CBSMsg1List.NYUKIN_ROUTE_CD
					, ECH0201B010CBSMsg1List.NYUKIN_ROUTE_CD_NM
					, ECH0201B010CBSMsg1List.NYUKIN_ROUTE_CD_ALI
					, ECH0201B010CBSMsg1List.NYUKIN_UPD_DTM
					, ECH0201B010CBSMsg1List.JUTO_AMNT
					, ECH0201B010CBSMsg1List.JUTO_SBT_CD
					, ECH0201B010CBSMsg1List.JUTO_SBT_CD_NM
					, ECH0201B010CBSMsg1List.JUTO_SBT_CD_ALI
					, ECH0201B010CBSMsg1List.NYUKIN_NO
					, ECH0201B010CBSMsg1List.UPD_DTM
					, ECH0201B010CBSMsg1List.KNK_NO
					, ECH0201B010CBSMsg1List.SEIKY_SBT_CD
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery2,msgKeyList2,"eo.ejb.cbs.cbsmsg.ECH0201B010CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECH0201B010CBSMsg1List", outMsg1);
			
			// 手修正箇所S
			// ページング関連処理
			CAANMsg[] outMsg2 = null;
			
			// 対象データの取得
			if(null == inMsg.getString(ECH0201B010CBSMsg.SEARCH_ERR_FLG))
			{
				// 取得範囲の設定
				// 取得範囲先頭の設定
				iArrayCopyStart = iDisplayNum * (iDisplayPageNum - 1);
				// 取得範囲末尾の設定
				// 表示件数が指定されていない場合
				if (0 == iDisplayNum)
				{
					// 取得件数に総検索件数を設定
					iArrayCopyCount = iTotalSearchNum;
				}
				// 表示ページ数が最終ページかつ総検索件数/表示件数の余りがある場合
				else if(iTotalPageNum == iDisplayPageNum && 0 < iTotalSearchNum % iDisplayNum)
				{
					// 取得件数に総検索数/表示件数の余りを設定
					iArrayCopyCount = iTotalSearchNum % iDisplayNum;
				}
				// 表示ページ数が最終ページでないまたは総検索件数/表示件数の余りがない場合
				else
				{
					// 取得件数に総検索数/表示件数を設定
					iArrayCopyCount = iDisplayNum;
				}
				
				// ページング範囲のデータを取得
				outMsg2 = new CAANMsg[iArrayCopyCount];
				System.arraycopy(outMsg1, iArrayCopyStart, outMsg2, 0, iArrayCopyCount);
			
				// inMsg(CBSMsg)に明細をセット
				inMsg.set("ECH0201B010CBSMsg1List", outMsg2);
			}
			// 手修正箇所E


		} catch(SQLException e) {
			inMsg.set(ECH0201B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery1 != null){
					rsltQuery1.close();
				}
				if(rsltQuery2 != null){
					rsltQuery2.close();
				}
				if(pstmt1 != null){
					pstmt1.close();
				}
				if(pstmt2 != null){
					pstmt2.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(ECH0201B010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
