/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JSYejbECR0011B040TPDA
 *	ソースファイル名：JSYejbECR0011B040TPDA.java
 *	作成者			：EK949708
 *	日付			：2019年04月05日
 *＜機能概要＞
 *	対応記録一覧照会(顧客過去)テンプレートDBアクセス部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	ｖ7.00.00	2014/01/22	FJ)伊藤		ANK-1952-00-00 〔運開後：ロット１ＯＴ分〕QA起票分　No12　CRW02101
 *	ｖ8.00.00	2014/04/17	FJ)斉藤		ANK-2007-00-00 【ＮＯ．１４１１】対応履歴Ｓのケース表示について
 *	ｖ9.00.00	2014/05/20	FJ)小野		ANK-2082-00-00 【ＮＯ．１３７１】問合せ一覧の表示日数について
 *	v41.00.00	2019/04/03	FJ)前田		ANK-3593-00-00_オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
 *	v71.00.00	2023/12/14	GDC)J.Zabala	ANK-4468-00-00 _eo光ネット「シンプルプラン」追加対応
 ********************************************************************************/

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.ECR0011B040CBSMsg;
import eo.ejb.cbs.cbsmsg.ECR0011B040CBSMsg1List;
import eo.ejb.common.JCCModelCommon;

/**
*
*  テンプレートDBアクセス部品　ECR0011B040_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbECR0011B040TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbECR0011B040TPDA()	{
	}
	
	/**
	*   ECR0011B040_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(CR0011ETMsg.getTableName());

			// ＫＥＹ＿問合せ状態コード
			String statCd = inMsg.getString(ECR0011B040CBSMsg.KEY_TOIAWASE_STAT_CD);
			// ＳＯＲＴ指定項目
			String sortItem = inMsg.getString(ECR0011B040CBSMsg.SORT_SHITEI_KMK_NM);

			//パラメータ設定リスト
			List<Object> replaceList = new ArrayList<Object>();

			//運用日付
			String opeDate = JCCModelCommon.getOpeDate(inMsg, null);

			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     TKRK.TAIO_KIROK_NO, ")
					.append("     TKRK.UK_DTM, ")
					.append("     TKRK.TITLE, ")
					.append("     TKRK.SVC_KEI_NO, ")
					.append("     SVCK.SVC_NM, ")
					.append("     TKRK.TOIAWASE_STAT_CD, ")
					.append("     ( ")
					.append("         SELECT ")
					.append("             CD01.CD_DIV_NM ")
					.append("         FROM ")
					.append("             ZM_M_CD_NM_KANRI CD01 ")
					.append("         WHERE ")
					.append("             CD01.CD_SBT_CD    =  'CD00229' AND ")
					.append("             CD01.CD_DIV       =  TKRK.TOIAWASE_STAT_CD AND ")
					.append("             CD01.CD_TSTAYMD  <=  SUBSTR(TKRK.UPD_DTM, 1, 8) AND ")
					.append("             CD01.CD_TENDYMD  >=  SUBSTR(TKRK.UPD_DTM, 1, 8) AND ")
					.append("             CD01.MK_FLG       = '0' ")
					.append("     ) AS TOIAWASE_STAT_CD_NM, ")
					.append("     SVCK.EOID, ")
					.append("     SVCK.SYSID, ")
					.append("     SVCK.MEMBER_SBT_CD, ")
					.append("     SVCK.MEMBER_SBT_CD_NM, ")
					.append("     TKRK.TOIAWASE_UK_SBT_CD, ")
					.append("     TBNS.TORK_EFILE_KNRI_NO, ")
					.append("     SVCK.PRC_GRP_CD, ")
					// ANK-4468-00-00 MOD START
//					.append("     SVCK.PRC_GRP_NM, ")
					.append("     CASE WHEN (SVCK.PRC_GRP_CD = '02' AND SVCK.PCRS_CD IN ('A97', 'A99')) THEN ( ")
					.append("         SELECT ZM0321.WORK_PARAM_SETTE_VALUE ")
					.append("         FROM ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append("         WHERE ZM0321.WORK_PARAM_ID = 'KK_SIMPL_C_GRPNM_01' ")
					.append("     ) ELSE ( ")
					.append("         SVCK.PRC_GRP_NM ")
					.append("     ) END AS PRC_GRP_NM, ")
					// ANK-4468-00-00 MOD END
					.append("     SVCK.PPLAN_CD, ")
					// ANK-4468-00-00 MOD START
//					.append("     SVCK.PPLAN_NM, ")
					.append("     CASE WHEN (SVCK.PRC_GRP_CD = '02' AND SVCK.PCRS_CD IN ('A97', 'A99')) THEN ( ")
					.append("         CASE WHEN SVCK.PCRS_CD = 'A97' THEN ( ")
					.append("             SELECT ZM0321.WORK_PARAM_SETTE_VALUE ")
					.append("             FROM ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append("             WHERE ZM0321.WORK_PARAM_ID = 'KK_SIMPL_C_PCRSNM_02' ")
					.append("         ) ELSE ( ")
					.append("             SELECT ZM0321.WORK_PARAM_SETTE_VALUE ")
					.append("             FROM ZM_M_WORK_PARAM_KNRI ZM0321 ")
					.append("             WHERE ZM0321.WORK_PARAM_ID = 'KK_SIMPL_C_PCRSNM_03' ")
					.append("         ) END ")
					.append("     ) ELSE ( ")
					.append("         SVCK.PPLAN_NM ")
					.append("     ) END AS PPLAN_NM, ")
					// ANK-4468-00-00 MOD END
					// ANK-3593-00-00 MOD START
					//.append("     TKRK.TAIO_STA_DTM ")
					.append("     TKRK.TAIO_STA_DTM, ")
					// ANK-3593-00-00 MOD END
					// ANK-3593-00-00 ADD START
					.append("     TKRK.HANKYO_PSB_FLG ")
					// ANK-3593-00-00 ADD END
					.append(" FROM ")
					.append("     CR_T_TAIO_KIROK TKRK ")
					.append("     LEFT OUTER JOIN ")
					.append("     ( ")
					.append("         SELECT ")
					.append("             CR0231.TAIO_KIROK_NO, ")
					.append("             MAX(CR0231.TORK_EFILE_KNRI_NO) AS TORK_EFILE_KNRI_NO ")
					.append("         FROM ")
					.append("             CR_T_TORK_EFILE_KNRI CR0231 ")
					.append("         WHERE ")
					.append("             CR0231.BUNSHO_SBT_CD = '01' AND ")
					.append("             CR0231.MK_FLG = '0' ")
					.append("         GROUP BY ")
					.append("             CR0231.TAIO_KIROK_NO ")
					.append("     ) TBNS ON ( ")
					.append("          TBNS.TAIO_KIROK_NO = TKRK.TAIO_KIROK_NO ")
					.append("     ), ")
					.append("     ( ")
					.append("         SELECT ")
					.append("             SVCK1.SVC_KEI_NO, ")
					.append("             SVCK1.SYSID, ")
					.append("             SVCK1.SVC_CD, ")
					.append("             ( ")
					.append("                 SELECT ")
					.append("                     MSVC.SVC_NM ")
					.append("                 FROM ")
					.append("                     KK_M_SVC MSVC ")
					.append("                 WHERE ")
					.append("                     MSVC.SVC_CD = SVCK1.SVC_CD AND ")
					.append("                     (MSVC.SVC_CD,MSVC.RSV_APLY_YMD || MSVC.GENE_ADD_DTM) = ")
					.append("                     ( ")
					.append("                         SELECT ")
					.append("                             MSVC_RCNT.SVC_CD, ")
					.append("                             MAX(MSVC_RCNT.RSV_APLY_YMD || MSVC_RCNT.GENE_ADD_DTM) AS MSVC_RCNT_MAX ")
					.append("                         FROM ")
					.append("                             KK_M_SVC MSVC_RCNT ")
					.append("                         WHERE ")
					.append("                             MSVC_RCNT.SVC_CD = MSVC.SVC_CD AND ")
					.append("                             MSVC_RCNT.RSV_APLY_YMD <= ? AND ")
					.append("                             MSVC_RCNT.MK_FLG = '0' ")
					.append("                         GROUP BY MSVC_RCNT.SVC_CD ")
					.append("                     ) ")
					.append("             ) AS SVC_NM, ")
					.append("             SVCK1.PRC_GRP_CD, ")
					.append("             (SELECT PRGP1.PRC_GRP_NM ")
					.append("                FROM KK_M_PRC_GRP PRGP1 ")
					.append("               WHERE PRGP1.PRC_GRP_CD = SVCK1.PRC_GRP_CD ")
					.append("                 AND (PRGP1.PRC_GRP_CD,PRGP1.RSV_APLY_YMD || PRGP1.GENE_ADD_DTM) = ")
					.append("                                                                (SELECT PRGP1_GENE.PRC_GRP_CD, ")
					.append("                                                                        MAX(PRGP1_GENE.RSV_APLY_YMD || PRGP1_GENE.GENE_ADD_DTM) AS PRGP1_MAX ")
					.append("                                                                   FROM KK_M_PRC_GRP PRGP1_GENE ")
					.append("                                                                  WHERE PRGP1_GENE.PRC_GRP_CD   = PRGP1.PRC_GRP_CD ")
					.append("                                                                    AND PRGP1_GENE.RSV_APLY_YMD <= ? ")
					.append("                                                                    AND PRGP1_GENE.MK_FLG       =  '0' ")
					.append("                                                                  GROUP BY PRGP1_GENE.PRC_GRP_CD ")
					.append("                                                                ) ")
					.append("             ) AS PRC_GRP_NM, ")
					.append("             SVCK1.PPLAN_CD, ")
					.append("             (SELECT PPLN1.PPLAN_NM ")
					.append("                FROM KK_M_PPLAN PPLN1 ")
					.append("               WHERE PPLN1.PCRS_CD  = SVCK1.PCRS_CD ")
					.append("                 AND PPLN1.PPLAN_CD = SVCK1.PPLAN_CD ")
					.append("                 AND PPLN1.MK_FLG   = '0' ")
					.append("             ) AS PPLAN_NM, ")
					// ANK-4468-00-00 ADD START
					.append("             SVCK1.PCRS_CD, ")
					// ANK-4468-00-00 ADD END
					.append("             CUST.EOID, ")
					.append("             CUST.MEMBER_SBT_CD, ")
					.append("             ( ")
					.append("                 SELECT ")
					.append("                     CD02.CD_DIV_NM ")
					.append("                 FROM ")
					.append("                     ZM_M_CD_NM_KANRI CD02 ")
					.append("                 WHERE ")
					.append("                     CD02.CD_SBT_CD    =  'CD00039' AND ")
					.append("                     CD02.CD_DIV       =  CUST.MEMBER_SBT_CD AND ")
					.append("                     CD02.CD_TSTAYMD  <=  SUBSTR(CUST.UPD_DTM, 1, 8) AND ")
					.append("                     CD02.CD_TENDYMD  >=  SUBSTR(CUST.UPD_DTM, 1, 8) AND ")
					.append("                     CD02.MK_FLG       = '0' ")
					.append("             ) AS MEMBER_SBT_CD_NM, ")
					.append("             CUST.UPD_DTM ")
					.append("         FROM ")
					.append("             KK_T_SVC_KEI SVCK1 ")
					.append("             LEFT OUTER JOIN ")
					.append("             ( ")
					.append("                 SELECT ")
					.append("                     CUST.SYSID, ")
					.append("                     CUST.EOID, ")
					.append("                     CUST.MEMBER_SBT_CD, ")
					.append("                     CUST.UPD_DTM ")
					.append("                 FROM ")
					.append("                     CK_T_CUST CUST ")
					.append("                 WHERE ")
					.append("                     (CUST.SYSID,CUST.RSV_APLY_YMD || CUST.GENE_ADD_DTM) = ")
					.append("                     ( ")
					.append("                         SELECT ")
					.append("                             CUST_RCNT.SYSID, ")
					.append("                             MAX(CUST_RCNT.RSV_APLY_YMD || CUST_RCNT.GENE_ADD_DTM) AS CUST_RCNT_MAX ")
					.append("                         FROM ")
					.append("                             CK_T_CUST CUST_RCNT ")
					.append("                         WHERE ")
					.append("                             CUST_RCNT.SYSID = CUST.SYSID AND ")
					.append("                             CUST_RCNT.RSV_APLY_YMD <= ? AND ")
					.append("                             CUST_RCNT.RSV_APLY_CD = '2' AND ")
					.append("                             CUST_RCNT.MK_FLG = '0' ")
					.append("                         GROUP BY CUST_RCNT.SYSID ")
					.append("                     ) AND ")
					.append("                     CUST.KEISHA_TYPE_CD <> '5' ")
					.append("             ) CUST ON ( ")
					.append("                 CUST.SYSID = SVCK1.SYSID ")
					.append("             ) ")
					.append("         WHERE ")
					.append("             SVCK1.SVC_KEI_NO IN ( ")
					.append(inMsg.getString(ECR0011B040CBSMsg.KEY_SVC_KEI_NO))
					.append("             ) AND ")
					.append("             (SVCK1.SVC_KEI_NO,SVCK1.RSV_APLY_YMD || SVCK1.GENE_ADD_DTM) = ")
					.append("                 ( ")
					.append("                     SELECT ")
					.append("                         SVCK1_RCNT.SVC_KEI_NO, ")
					.append("                         MAX(SVCK1_RCNT.RSV_APLY_YMD || SVCK1_RCNT.GENE_ADD_DTM) AS SVCK1_RCNT_MAX ")
					.append("                     FROM ")
					.append("                         KK_T_SVC_KEI SVCK1_RCNT ")
					.append("                     WHERE ")
					.append("                         SVCK1_RCNT.SVC_KEI_NO = SVCK1.SVC_KEI_NO AND ")
					.append("                         SVCK1_RCNT.RSV_APLY_YMD <= ? AND ")
					.append("                         SVCK1_RCNT.RSV_APLY_CD = '2' AND ")
					.append("                         SVCK1_RCNT.MK_FLG = '0' ")
					.append("                     GROUP BY SVCK1_RCNT.SVC_KEI_NO ")
					.append("                 ) AND ")
					.append("             SVCK1.PRC_GRP_CD <> '99' ")
					.append("     ) SVCK ")
					.append(" WHERE ")
					.append("     TKRK.SVC_KEI_NO = SVCK.SVC_KEI_NO AND ")
					.append("     TKRK.MK_FLG = '0' ");

			replaceList.add(opeDate);
			replaceList.add(opeDate);
			replaceList.add(opeDate);
			replaceList.add(opeDate);

			// ＫＥＹ＿検索期間コード
			String certainCd = null;

			// 期間指定ありの場合の検索基準となる過去年月日
			String pastKijunDate = "";

			if (!inMsg.isNull(ECR0011B040CBSMsg.KEY_CERTAIN_CD))
			{
				certainCd = inMsg.getString(ECR0011B040CBSMsg.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 (!JCRUtilCommon.isNull(statCd))
			{
				sql_Buff.append("     AND TKRK.TOIAWASE_STAT_CD = ? ");
				replaceList.add(statCd);

				// 検索期間コードが指定ありの場合（「全て」以外の場合）かつ、問合せ状態コードが"クローズ"または"キャンセル"の場合、対応開始年月日時分秒の条件を加える。
				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);
				}
			}

			if ( JPCModelConstant.FUNC_CD_1.equals( inMsg.getString(ECR0011B040CBSMsg.FUNC_CODE) ) )
			{
				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 ");
				}
			}
			else
			{
				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 ");
				}
			}

			//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();
			
			// ECR0011B040CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  ECR0011B040CBSMsg1List.TAIO_KIROK_NO
					, ECR0011B040CBSMsg1List.UK_DTM
					, ECR0011B040CBSMsg1List.TITLE
					, ECR0011B040CBSMsg1List.SVC_KEI_NO
					, ECR0011B040CBSMsg1List.SVC_KEI_NO_NM
					, ECR0011B040CBSMsg1List.TOIAWASE_STAT_CD
					, ECR0011B040CBSMsg1List.TOIAWASE_STAT_CD_NM
					, ECR0011B040CBSMsg1List.EOID
					, ECR0011B040CBSMsg1List.SYSID
					, ECR0011B040CBSMsg1List.MEMBER_SBT_CD
					, ECR0011B040CBSMsg1List.MEMBER_SBT_CD_NM
					, ECR0011B040CBSMsg1List.TOIAWASE_UK_SBT_CD
					, ECR0011B040CBSMsg1List.TAIORRKI_BUNSHO_KANRI_NO
					, ECR0011B040CBSMsg1List.PRC_GRP_CD
					, ECR0011B040CBSMsg1List.PRC_GRP_NM
					, ECR0011B040CBSMsg1List.PPLAN_CD
					, ECR0011B040CBSMsg1List.PPLAN_NM
					, ECR0011B040CBSMsg1List.TAIO_STA_DTM
					// ANK-3593-00-00 ADD START
					, ECR0011B040CBSMsg1List.HANKYO_PSB_FLG
					// ANK-3593-00-00 ADD END
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.ECR0011B040CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("ECR0011B040CBSMsg1List", outMsg1);
			
			//****************** 以降、コーディング修正 START ************************************//
			// 総検索件数の設定
			inMsg.set(ECR0011B040CBSMsg.TOTAL_SEARCH_NUM, String.valueOf(outMsg1.length));
			//****************** 以降、コーディング修正  END  ************************************//

		} catch(SQLException e) {
			inMsg.set(ECR0011B040CBSMsg.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(ECR0011B040CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
