/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbECH0051B020TPDA
*	ソースファイル名：JSYejbECH0051B020TPDA.java
*	作成者			：EK910079
*	日付			：2013年09月12日
*＜機能概要＞
*	請求一覧照会(請求ステータス)テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*   ｖ5.00.00	2013/07/11  FJ) 林	   【LT-2013-0000363】 請求額取得用業務パラメータＩＤ変更
*	ｖ5.00.01	2013/07/28  FJ) 林     【LT-2013-0000600】 請求金額の取得内容変更
*                                                         ・変更前請求額合計(00900900630)が存在すれば 変更前請求額合計(00900900630)
*                                                         ・変更前請求額合計(00900900630)が存在しなければ 請求書データ作成（請求金額）(00900900601)
*	ｖ5.00.02	2013/08/20  FJ)小野    【OM-2013-0000496】 督促管理画面で、直近の債権の一覧表示不具合を修正
*	ｖ6.00.00	2013/12/06  FJ)小野    【OM-2013-0003732】SQL長時間走行のため性能改善。機能コード1,2の場合、件数を1件のみ返却するように修正。
*                                                         今後、一覧を取得したい場合は別の機能コードを追加すること。
*
********************************************************************************/

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.common.constant.JACStrConst;
import eo.ejb.cbm.entity.CH0051ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.ECH0051B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0051B020CBSMsg1List;
import eo.ejb.common.JPCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECH0051B020_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECH0051B020TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECH0051B020TPDA()	{
	}
	
	/**
	*   ECH0051B020_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt0 = null;
		PreparedStatement pstmt1 = null;
		
		// リザルトセット
		ResultSet rsltQuery0 = null;
		ResultSet rsltQuery1 = null;

		/******************** 
		 * SQL文の作成
		 ********************/

		try{

			// 運用日付
			String opeDate = (String)JPCModelCommon.getOpeDate(inMsg, inContext, null);
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CH0051ETMsg.getTableName());

			// 機能コード
			String funcCode = inMsg.getString(ECH0051B020CBSMsg.FUNC_CODE);

			String seikyNo = "";
			String seikyYm = "";

			StringBuffer sql_Buff = new StringBuffer();

			if ("1".equals(funcCode))
			{
				sql_Buff.append(" SELECT ")
						.append(" 	SEIKY_NO ")
						.append(" 	,SEIKY_YM ")
						.append(" FROM ")
						.append(" ( ")
						.append(" 	SELECT ")
						.append(" 		CH0051_2.SEIKY_NO ")
						.append(" 		,CH0051_2.SEIKY_YM ")
						.append(" 	FROM ")
						.append(" 		CH_T_SEIKY CH0051_2 ")
						.append(" 	WHERE  ")
						.append(" 		CH0051_2.SEIKY_KEI_NO = ? ")
						.append(" 		AND CH0051_2.SEIKY_STAT = ? ")
						.append(" 		AND CH0051_2.MK_FLG = '0' ")
						.append(" 	ORDER BY ")
						.append(" 		CASE WHEN CH0051_2.SEIKYUS_HAKKO_YMD IS NULL THEN CH0051_2.SEIKY_FIX_YMD ELSE CH0051_2.SEIKYUS_HAKKO_YMD END DESC, ")
						.append(" 		CH0051_2.SEIKY_FIX_YMD DESC, ")
						.append(" 		CH0051_2.SEIKY_NO DESC ")
						.append(" ) ")
						.append(" WHERE ")
						.append(" 	ROWNUM = 1 ");

				//prepareStatementにSQL文をセット
				pstmt0 = con1.prepareStatement(sql_Buff.toString());

				//ログ出力(SQL文の出力)
				JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

				// WHERE句のパラメータ設定
				// パラメータインデックス
				int i = 1;
				// パラメータの設定(ＫＥＹ＿請求契約番号を指定)
				CAANJDBCUtil.setParam(pstmt0, i++, inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_KEI_NO));
				// パラメータの設定(ＫＥＹ＿請求ステータスを指定)
				CAANJDBCUtil.setParam(pstmt0, i++, inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_STAT));

				// ResultSetの取得
				rsltQuery0 = pstmt0.executeQuery();

				if (rsltQuery0.next()){
					seikyNo = rsltQuery0.getString(CH0051ETMsg.SEIKY_NO);
					seikyYm = rsltQuery0.getString(CH0051ETMsg.SEIKY_YM);
				}
				else
				{
					inMsg.set(ECH0051B020CBSMsg.SEARCH_ERR_FLG , "1");
					return;
				}
			}

			// SQL文_基本部1
			sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT CH0051.SEIKY_NO ")
					.append(" ,CH0051.SEIKY_YM ")
					.append(" ,CH0051.SEIKY_SBT_CD ")
					.append(" ,(SELECT ZM0171.CD_DIV_NM ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00164' ")
					.append("   AND    ZM0171.CD_DIV = CH0051.SEIKY_SBT_CD ")
					.append("   AND    ? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append(" ) AS SEIKY_SBT_CD_NM ")
					.append(" ,(SELECT ZM0171.CD_DIV_ALI ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00164' ")
					.append("   AND    ZM0171.CD_DIV = CH0051.SEIKY_SBT_CD ")
					.append("   AND    ? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append(" ) AS SEIKY_SBT_CD_ALI ")
					.append(" ,CH0051.SEIKY_WAY_CD ")
					.append(" ,(SELECT ZM0171.CD_DIV_NM ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append("   AND    ZM0171.CD_DIV = CH0051.SEIKY_WAY_CD ")
					.append("   AND    ? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append(" ) AS SEIKY_WAY_CD_NM ")
					.append(" ,(SELECT ZM0171.CD_DIV_ALI ")
					.append("   FROM   ZM_M_CD_NM_KANRI ZM0171 ")
					.append("   WHERE  ZM0171.CD_SBT_CD = 'CD00166' ")
					.append("   AND    ZM0171.CD_DIV = CH0051.SEIKY_WAY_CD ")
					.append("   AND    ? BETWEEN ZM0171.CD_TSTAYMD AND ZM0171.CD_TENDYMD ")
					.append("   AND    ZM0171.MK_FLG = '0' ")
					.append(" ) AS SEIKY_WAY_CD_ALI ")
					.append(" 	,CASE WHEN ")
					.append(" 	 	 ( ")
					.append(" 	 		SELECT ")
					.append(" 	 			AMNT ")
					.append(" 	 		FROM ")
					.append(" 	 			CH_T_SEIKY_UCWK CH0101_1 ")
					.append(" 	 			INNER JOIN ")
					.append(" 	 			( ")
					.append(" 	 				SELECT ")
					.append(" 	 					CH0401.PRC_GRP_CD, ")
					.append(" 	 					CH0401.PCRS_CD, ")
					.append(" 	 					CH0401.PRC_SVC_CD, ")
					.append(" 	 					CH0401.PRC_KMK_CD ")
					.append(" 	 				FROM ")
					.append(" 	 					CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 	 				WHERE ")
					.append(" 	 					CH0401.SYS_CD = 'CH' ")
					.append(" 	 					AND CH0401.WORK_KINO_SKBT_CD = ? ")
					.append(" 	 					AND CH0401.CHSHT_CHG_CD = '1' ")
					.append(" 	 					AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 	 					AND CH0401.MK_FLG = '0' ")
					.append(" 	 			) CH0401 ")
					.append(" 	 			ON  CH0401.PRC_GRP_CD = CH0101_1.PRC_GRP_CD ")
					.append(" 	 			AND CH0401.PCRS_CD = CH0101_1.PCRS_CD ")
					.append(" 	 			AND CH0401.PRC_SVC_CD = CH0101_1.PRC_SVC_CD ")
					.append(" 	 			AND CH0401.PRC_KMK_CD = CH0101_1.PRC_KMK_CD ")
					.append(" 	 		WHERE ")
					.append(" 	 			CH0101_1.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 	 			AND CH0101_1.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 	 			AND CH0101_1.MK_FLG = '0' ")
					.append(" 	 			AND ROWNUM <= 1 ")
					.append(" 	 	 ) ")
					.append(" 	 IS NOT NULL THEN ") // 変更前請求額合計: CHG_SEIKG(00900900630)が存在すれば、変更前請求額合計: CHG_SEIKG(00900900630)
					.append(" 	 	 ( ")
					.append(" 	 		SELECT ")
					.append(" 	 			AMNT ")
					.append(" 	 		FROM ")
					.append(" 				CH_T_SEIKY_UCWK CH0101_1 ")
					.append(" 	 			INNER JOIN ")
					.append(" 	 			( ")
					.append(" 	 				SELECT ")
					.append(" 	 					CH0401.PRC_GRP_CD, ")
					.append(" 	 					CH0401.PCRS_CD, ")
					.append(" 	 					CH0401.PRC_SVC_CD, ")
					.append(" 	 					CH0401.PRC_KMK_CD ")
					.append(" 	 				FROM ")
					.append(" 	 					CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 	 				WHERE ")
					.append(" 	 					CH0401.SYS_CD = 'CH' ")
					.append(" 	 					AND CH0401.WORK_KINO_SKBT_CD = ? ")
					.append(" 	 					AND CH0401.CHSHT_CHG_CD = '1' ")
					.append(" 	 					AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 	 					AND CH0401.MK_FLG = '0' ")
					.append(" 	 			) CH0401 ")
					.append(" 	 			ON  CH0401.PRC_GRP_CD = CH0101_1.PRC_GRP_CD ")
					.append(" 	 			AND CH0401.PCRS_CD = CH0101_1.PCRS_CD ")
					.append(" 	 			AND CH0401.PRC_SVC_CD = CH0101_1.PRC_SVC_CD ")
					.append(" 	 			AND CH0401.PRC_KMK_CD = CH0101_1.PRC_KMK_CD ")
					.append(" 	 		WHERE ")
					.append(" 	 			CH0101_1.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 	 			AND CH0101_1.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 	 			AND CH0101_1.MK_FLG = '0' ")
					.append(" 	 			AND ROWNUM <= 1 ")
					.append(" 	 	 ) ")
					.append(" 	 ELSE")             // 変更前請求額合計: CHG_SEIKG(00900900630)が存在しなければ 請求書データ作成（請求金額）: SIKY_AMNT(00900900601)
					.append(" 	 	 ( ")
					.append(" 		SELECT ")
					.append(" 			AMNT ")
					.append(" 		FROM ")
					.append(" 			CH_T_SEIKY_UCWK CH0101_1 ")
					.append(" 			INNER JOIN ")
					.append(" 			( ")
					.append(" 				SELECT ")
					.append(" 					CH0401.PRC_GRP_CD, ")
					.append(" 					CH0401.PCRS_CD, ")
					.append(" 					CH0401.PRC_SVC_CD, ")
					.append(" 					CH0401.PRC_KMK_CD ")
					.append(" 				FROM ")
					.append(" 					CH_M_PRC_KMK_CS_CHGE CH0401 ")
					.append(" 				WHERE ")
					.append(" 					CH0401.SYS_CD = 'CH' ")
					.append(" 					AND CH0401.WORK_KINO_SKBT_CD = ? ")
					.append(" 					AND CH0401.CHSHT_CHG_CD = '1' ")
					.append(" 					AND ? BETWEEN CH0401.PRC_KMK_CS_CHGE_TSTAYMD AND CH0401.PRC_KMK_CS_CHGE_TENDYMD ")
					.append(" 					AND CH0401.MK_FLG = '0' ")
					.append(" 			) CH0401 ")
					.append(" 			ON  CH0401.PRC_GRP_CD = CH0101_1.PRC_GRP_CD ")
					.append(" 			AND CH0401.PCRS_CD = CH0101_1.PCRS_CD ")
					.append(" 			AND CH0401.PRC_SVC_CD = CH0101_1.PRC_SVC_CD ")
					.append(" 			AND CH0401.PRC_KMK_CD = CH0101_1.PRC_KMK_CD ")
					.append(" 		WHERE ")
					.append(" 			CH0101_1.SEIKY_YM = CH0051.SEIKY_YM ")
					.append(" 			AND CH0101_1.SEIKY_NO = CH0051.SEIKY_NO ")
					.append(" 			AND CH0101_1.MK_FLG = '0' ")
					.append(" 			AND ROWNUM <= 1 ")
					.append(" 	 ) ")
					.append(" END SEIKY_AMNT ")
					.append(" ,CH0051.SEIKY_FIX_YMD ")
					.append(" ,CH0051.SEIKYUS_HAKKO_YMD AS SEIKY_HAKKO_YMD ")
					.append("  FROM CH_T_SEIKY CH0051 ");

			// SQL文_個別部1
			if ("1".equals(funcCode))
			{
 				sql_Buff.append(" WHERE ")
						.append(" 	CH0051.SEIKY_NO = ? ")
						.append(" 	AND CH0051.SEIKY_YM = ? ");
			}
			else if ("2".equals(funcCode))
			{
 				sql_Buff.append(" WHERE  ")
						.append(" 	CH0051.SEIKY_KEI_NO = ? ")
						.append(" 	AND CH0051.SEIKY_STAT = ? ")
						.append(" 	AND CH0051.SEIKY_YM = ? ")
						.append(" 	AND CH0051.MK_FLG = '0' ")
						.append(" 	AND ROWNUM = 1 ");
			}

			//prepareStatementにSQL文をセット
			pstmt1 = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			//SELECT句のパラメータ設定

			// 業務機能識別コード取得
			String workParam[] = getWorkParam();

			// パラメータインデックス
			int i = 1;
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, workParam[1]);  // 変更前請求額合計 : CHG_SEIKG(00900900630)
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, workParam[1]);  // 変更前請求額合計 : CHG_SEIKG(00900900630)
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);
			CAANJDBCUtil.setParam(pstmt1, i++, workParam[0]);  // 請求書データ作成（請求金額）: SIKY_AMNT(00900900601)
			CAANJDBCUtil.setParam(pstmt1, i++, opeDate);

			if ("1".equals(funcCode))
			{
				// パラメータの設定(ＫＥＹ＿請求番号を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, seikyNo);
				// パラメータの設定(ＫＥＹ＿請求年月を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, seikyYm);
			}

			if ("2".equals(funcCode))
			{
				// パラメータの設定(ＫＥＹ＿請求契約番号を指定)
				CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_KEI_NO));
				// パラメータの設定(ＫＥＹ＿請求ステータスを指定)
				CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_STAT));
				// パラメータの設定(ＫＥＹ＿請求年月を指定)
				if(inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_YM) != null)
				{
					CAANJDBCUtil.setParam(pstmt1, i++, inMsg.getObject(ECH0051B020CBSMsg.KEY_SEIKY_YM));
				}
			}
			
			// ResultSetの取得
			rsltQuery1 = pstmt1.executeQuery();
			
			// ECH0051B020CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECH0051B020CBSMsg1List.SEIKY_NO
					, ECH0051B020CBSMsg1List.SEIKY_YM
					, ECH0051B020CBSMsg1List.SEIKY_SBT_CD
					, ECH0051B020CBSMsg1List.SEIKY_SBT_CD_NM
					, ECH0051B020CBSMsg1List.SEIKY_SBT_CD_ALI
					, ECH0051B020CBSMsg1List.SEIKY_WAY_CD
					, ECH0051B020CBSMsg1List.SEIKY_WAY_CD_NM
					, ECH0051B020CBSMsg1List.SEIKY_WAY_CD_ALI
					, ECH0051B020CBSMsg1List.SEIKY_AMNT
					, ECH0051B020CBSMsg1List.SEIKY_FIX_YMD
					, ECH0051B020CBSMsg1List.SEIKY_HAKKO_YMD
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery1,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECH0051B020CBSMsg1List",0);
			// inMsg(CBSMsg)に取得した明細をセット
			inMsg.set("ECH0051B020CBSMsg1List", outMsg1);

		} catch(SQLException e) {
			inMsg.set(ECH0051B020CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery0 != null){
					rsltQuery0.close();
				}
				if(pstmt0 != null){
					pstmt0.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
				if(rsltQuery1 != null){
					rsltQuery1.close();
				}
				if(pstmt1 != null){
					pstmt1.close();
				}
			}catch(SQLException e){
				inMsg.set(ECH0051B020CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	/**
	*   ECH0051B020_SQLF<br>
	*   @return String[]
	*/
	private String[] getWorkParam()
	{
		String[] workParam = new String[2];

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（請求書データ作成（請求金額）を取得する
		CAANMsg msgZM0321 = new CAANMsg(ZM0321ETMsg.class.getName());
		ZM0321LE le = new ZM0321LE();

		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPRA_CH_WKS_SIKY_AMNT);
		msgZM0321.set(ZM0321ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

		CAANMsg retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[0] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // SIKY_AMNT(00900900601)

		// 業務パラメータ管理より業務機能識別コード：料金項目コード（変更前請求額合計）を取得する
		msgZM0321.set(ZM0321ETMsg.WORK_PARAM_ID, JACStrConst.WKPARA_CH_WKS_CHG_SEIKY_GS);
		retZM0321 = le.findByPrimaryKey(msgZM0321);

		workParam[1] = retZM0321.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);              // CHG_SEIKG(00900900630)

		return workParam;
	}

}
