/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEKK0161B514TPDA
*	ソースファイル名：JSYejbEKK0161B514TPDA.java
*	作成者			：EK945615
*	日付			：2019年03月07日
*＜機能概要＞
*	サービス契約付属情報照会（電話）（オペレータ支援）テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ42.00.00	2019/03/07	FJ)周藤		【ANK-3593-00-00】オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
*	ｖ42.00.01	2019/05/14	FJ)黒田		【IT2-2019-0000022】障害対応
*	ｖ45.00.01	2019/10/30	FJ)中原		【ANK-3766-00-00】営業チャネルでの既契約者対応
*	ｖ47.00.00	2019/12/24	FJ)北谷		【ANK-3798-00-00】オペレータ支援システムの表示改善対応（2020年1月リリース分)
*	ｖ47.00.01	2020/01/30	FJ)舘山		【OM-2020-0000140】カーソルのオープン上限値が超えました
*	ｖ50.00.00	2020/05/19	FJ)大島		【ANK-3862-00-00】【CMP】WEB電話オプション外出し対応
*	ｖ50.00.00	2020/06/10	FJ)大島		【ANK-3862-03-00】【WEB電話オプション外出し対応】エラーチェック機能追加
*	ｖ72.00.00	2024/05/24	FJ)丸田		【ANK-4494-00-00】【eo定期】 双方向番ポ対応
********************************************************************************/

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.EKK0161B514CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B514CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B514CBSMsg2List;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.common.JKKModelCommon;

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

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("     KK0191.TELNO, ")
					.append("     KK0161.SVC_STA_YMD, ")
					.append("     KK0191.BMP_UM, ")
					.append("     KK0191.HELLOPAGE_KEISAI_UM, ")
			    	// ANK-3766-00-00 MOD START
					//.append("     KK0191.NTT_NO_GUIDE_UM ");
					.append("     KK0191.NTT_NO_GUIDE_UM, ")
					.append("     KK0161.SVC_KEI_UCWK_NO, ")
			    	// ANK-3766-00-00 MOD END
					// ANK-3862-00-00 MOD START
					.append("     KK0191.VA_PORT_NO, ")
					// ANK-3862-00-00 MOD END
					// ANK-4494-00-00 MOD START
					// ANK-3862-03-00 MOD START
					//.append("     KK0161.SVC_KEI_UCWK_STAT ");
					.append("     KK0161.SVC_KEI_UCWK_STAT, ")
					// ANK-3862-03-00 MOD END
					// ANK-4494-00-00 MOD END
					// ANK-4494-00-00 ADD START
					.append("     CASE ")
					.append("         WHEN KK0161.SVC_KEI_UCWK_STAT = '010' ")
					.append("         THEN NULL ")
					.append("         WHEN ( ")
					.append("             KK0161.SVC_KEI_UCWK_STAT <> '010' ")
					.append("             AND TU0051.JISHA_TASHA_FLG = '1' ")
					.append("             AND TU0011.SVC_KEI_UCWK_NO > '000000000000' ")
					.append("         ) THEN '1' ")
					.append("         WHEN ( ")
					.append("             KK0161.SVC_KEI_UCWK_STAT <> '010' ")
					.append("             AND (TU0051.JISHA_TASHA_FLG <> '1' OR NVL(TU0051.TSJGS_CD, '1') = '1') ")
					.append("             AND TU0011.SVC_KEI_UCWK_NO > '000000000000' ")
					.append("         ) THEN '0' ")
					.append("         WHEN ( ")
					.append("             KK0161.SVC_KEI_UCWK_STAT <> '010' ")
					.append("             AND (NVL(TU0011.SVC_KEI_UCWK_NO, '1') = '1') ")
					.append("         ) THEN '0' ")
					.append("     END AS NO_STKU_JGS_RTRN_DIV ");
					// ANK-4494-00-00 ADD END
			// SQL文_個別部1
			if ( "1".equals( inMsg.getObject(EKK0161B514CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" FROM KK_T_SVC_KEI_UCWK KK0161 ")
						.append(" INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ")
						.append(" ON KK0191.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
						.append(" AND KK0191.GENE_ADD_DTM = KK0161.GENE_ADD_DTM ")
						// ANK-4494-00-00 ADD START
						.append(" INNER JOIN ZM_M_TELNO ZM0121 ")
						.append(" ON ZM0121.TELNO = KK0191.TELNO ")
						.append(" LEFT OUTER JOIN TU_M_TUSHIN_JGYOSHA TU0051 ")
						.append(" ON TU0051.TSJGS_CD = ZM0121.TLN_STKU_TSJGS_CD ")
						.append(" AND TU0051.MK_FLG = '0' ")
						.append(" LEFT OUTER JOIN ")
						.append("     (SELECT TU0011_WK.SVC_KEI_UCWK_NO ")
						.append("     FROM TU_T_BMP_KOJI TU0011_WK ")
						.append("     WHERE (TU0011_WK.GENE_ADD_DTM) = ")
						.append("         (SELECT MAX(TU0011_GENE.GENE_ADD_DTM) ")
						.append("         FROM TU_T_BMP_KOJI TU0011_GENE ")
						.append("         WHERE TU0011_GENE.SVC_KEI_UCWK_NO = TU0011_WK.SVC_KEI_UCWK_NO ")
						.append("         AND TU0011_GENE.MK_FLG = '0' ")
						.append("         GROUP BY TU0011_GENE.SVC_KEI_UCWK_NO) ")
						.append("     ) TU0011 ")
						.append(" ON KK0161.SVC_KEI_UCWK_NO = TU0011.SVC_KEI_UCWK_NO ")
						// ANK-4494-00-00 ADD END
						.append(" WHERE KK0161.SVC_KEI_NO = ? ")
						.append(" AND (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ")
						.append("         (SELECT ")
						.append("             KK0161_GENE.SVC_KEI_UCWK_NO, ")
						.append("             MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) ")
						.append("         FROM KK_T_SVC_KEI_UCWK KK0161_GENE ")
						.append("         WHERE KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
						.append("         AND KK0161_GENE.RSV_APLY_YMD <= ? ")
						.append("         AND KK0161_GENE.RSV_APLY_CD = '2' ")
						.append("         AND KK0161_GENE.MK_FLG = '0' ")
						.append("         GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ")
						.append(" AND KK0161.SVC_KEI_UCWK_STAT IN ('010','020','030','100','210','220') ")
// IT2-2019-0000022 ADD START
						.append(" AND KK0161.KEIZK_AF_KEI_CHGECHU_FLG = '0' ")
// IT2-2019-0000022 ADD END
						// ANK-4494-00-00 ADD START
						.append(" AND ZM0121.MK_FLG = '0' ")
						// ANK-4494-00-00 ADD END
						.append(" ORDER BY KK0191.TELNO_JUN ASC ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(EKK0161B514CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, 1, inMsg.getObject(EKK0161B514CBSMsg.KEY_SVC_KEI_NO));
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK0161B514CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK0161B514CBSMsg1List.TELNO
					, EKK0161B514CBSMsg1List.SVC_STA_YMD
					, EKK0161B514CBSMsg1List.BMP_UM
					, EKK0161B514CBSMsg1List.HELLOPAGE_KEISAI_UM
					, EKK0161B514CBSMsg1List.NTT_NO_GUIDE_UM
			    	// ANK-3766-00-00 ADD START
					, EKK0161B514CBSMsg1List.SVC_KEI_UCWK_NO
			    	// ANK-3766-00-00 ADD END
					// ANK-3862-00-00 ADD START
					, EKK0161B514CBSMsg1List.VA_PORT_NO
					// ANK-3862-00-00 ADD END
					// ANK-3862-03-00 ADD START
					, EKK0161B514CBSMsg1List.SVC_KEI_UCWK_STAT
					// ANK-3862-03-00 ADD END
					// ANK-4494-00-00 ADD START
					, EKK0161B514CBSMsg1List.NO_STKU_JGS_RTRN_DIV
					// ANK-4494-00-00 ADD END
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EKK0161B514CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0161B514CBSMsg1List", outMsg1);
// OM-2020-0000140 ADD START
		} catch(SQLException e) {
			inMsg.set(EKK0161B514CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
			}catch(SQLException e){
				inMsg.set(EKK0161B514CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		try 
		{
			StringBuffer sql_Buff = new StringBuffer();

// OM-2020-0000140 ADD END
		// ANK-3798-00-00 ADD START
			//コネクション取得
			con2 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());
			
			
			// SQL文_基本部2
			sql_Buff.delete(0,sql_Buff.length());
			sql_Buff.append(" SELECT ")
					.append("     DNWACHO.SVC_KEI_UCWK_NO, ")
					.append("     DNWACHO.DNWACHO_KISAI_CD, ")
					.append("     DNWACHO.DNWACHO_KISAI_CD_NM, ")
					.append("     DNWACHO.DNWACHO_MSKM_STAT, ")
					.append("     DNWACHO.DNWACHOMSK_IDO_NAIYO_CD, ")
					.append("     DNWACHO.COMP_KOBET_FLG, ")
					.append("     DNWACHO.COMP_KOBET_FLG_NM, ")
					.append("     DNWACHO.DBLE_KEISAI_FLG, ")
					.append("     DNWACHO.DBLE_KEISAI_FLG_NM, ")
					.append("     DNWACHO.KEISAI_KANA_NM, ")
					.append("     DNWACHO.KEISAI_NM, ")
					.append("     DNWACHO.REQ_JI_KISAI_JUN_SKCD ")
					.append(" FROM KK_T_SVC_KEI_UCWK KK0161 ")
					.append(" LEFT OUTER JOIN  ")
					.append("     (SELECT  ")
					.append("         TU0081.SVC_KEI_UCWK_NO, ")
					.append("         TU0081.REQ_JI_KISAI_JUN_SKCD, ")
					.append("         TU0081.DNWACHO_KISAI_CD, ")
					.append("         (SELECT ZM0171_01.CD_DIV_NM FROM ZM_M_CD_NM_KANRI ZM0171_01  ")
					.append("          WHERE ZM0171_01.CD_SBT_CD = 'CD00438' AND ZM0171_01.CD_DIV = TU0081.DNWACHO_KISAI_CD AND ZM0171_01.MK_FLG='0') AS DNWACHO_KISAI_CD_NM, ")
					.append("         TU0081.DNWACHO_MSKM_STAT, ")
					.append("         TU0081.DNWACHOMSK_IDO_NAIYO_CD, ")
					.append("         TU0091.COMP_KOBET_FLG, ")
					.append("         (SELECT ZM0171_02.CD_DIV_NM FROM ZM_M_CD_NM_KANRI ZM0171_02  ")
					.append("          WHERE ZM0171_02.CD_SBT_CD = 'CD00449' AND ZM0171_02.CD_DIV = TU0091.COMP_KOBET_FLG AND ZM0171_02.MK_FLG='0') AS COMP_KOBET_FLG_NM, ")
					.append("         TU0091.DBLE_KEISAI_FLG, ")
					.append("         (SELECT ZM0171_03.CD_DIV_ALI FROM ZM_M_CD_NM_KANRI ZM0171_03  ")
					.append("          WHERE ZM0171_03.CD_SBT_CD = 'CD00450' AND ZM0171_03.CD_DIV = TU0091.DBLE_KEISAI_FLG AND ZM0171_03.MK_FLG='0') AS DBLE_KEISAI_FLG_NM, ")
					.append("         TU0091.KEISAI_KANA_NM, ")
					.append("         TU0091.KEISAI_NM ")
					.append("      FROM TU_T_DNWACHOMSK TU0081  ")
					.append("      INNER JOIN TU_T_DNWACHOMSK_NYO TU0091   ")
					.append("      ON TU0091.DNWACHO_MSKM_NO = TU0081.DNWACHO_MSKM_NO AND  ")
					.append("      TU0091.GENE_ADD_DTM = TU0081.GENE_ADD_DTM AND  ")
					.append("      TU0091.DNWACHOMSK_NEW_OLD_FLG='0' AND  ")
					.append("      TU0091.MK_FLG='0' ")
					.append("      WHERE TU0081.GENE_ADD_DTM || NVL(TU0081.DNWACHO_MSKM_YMD,'20991231')  =   ")
					.append("          (SELECT  ")
					.append("              MAX(TU0081_GENE.GENE_ADD_DTM || NVL(TU0081_GENE.DNWACHO_MSKM_YMD,'20991231') )  ")
					.append("          FROM TU_T_DNWACHOMSK TU0081_GENE  ")
					.append("          WHERE TU0081_GENE.SVC_KEI_UCWK_NO = TU0081.SVC_KEI_UCWK_NO  ")
					.append("          AND TU0081_GENE.REQ_JI_KISAI_JUN_SKCD = TU0081.REQ_JI_KISAI_JUN_SKCD  ")
					.append("          AND TU0081_GENE.MK_FLG='0') ")
					.append("      AND TU0081.DNWACHO_MSKM_STAT IN ('021','022','031') ")
					.append("     ) DNWACHO  ")
					.append(" ON  DNWACHO.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");

			// SQL文_個別部2
			if ( "1".equals( inMsg.getObject(EKK0161B514CBSMsg.FUNC_CODE).toString() ) ) {
 				sql_Buff.append(" WHERE KK0161.SVC_KEI_NO = ? ")
						.append(" AND (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =  ")
						.append("         (SELECT ")
						.append("             KK0161_GENE.SVC_KEI_UCWK_NO, ")
						.append("             MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) ")
						.append("         FROM KK_T_SVC_KEI_UCWK KK0161_GENE ")
						.append("         WHERE KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
						.append("         AND KK0161_GENE.RSV_APLY_YMD <= ? ")
						.append("         AND KK0161_GENE.RSV_APLY_CD = '2'  ")
						.append("         AND KK0161_GENE.MK_FLG = '0' ")
						.append("         GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ")
						.append(" AND KK0161.SVC_KEI_UCWK_STAT in ('010','020','030','100','210','220') ")
						.append(" AND KK0161.KEIZK_AF_KEI_CHGECHU_FLG = '0' ")
						.append(" ORDER BY KK0161.SVC_KEI_UCWK_NO ASC, DNWACHO.REQ_JI_KISAI_JUN_SKCD ASC ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con2.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(EKK0161B514CBSMsg.FUNC_CODE) ) ) {
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, 1, inMsg.getObject(EKK0161B514CBSMsg.KEY_SVC_KEI_NO));
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			}
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK0161B514CBSMsgの明細にセットする項目
			String[] msgKeyList2 = {
					  EKK0161B514CBSMsg2List.SVC_KEI_UCWK_NO_DNWACHO
					, EKK0161B514CBSMsg2List.DNWACHO_KISAI_CD
					, EKK0161B514CBSMsg2List.DNWACHO_KISAI_CD_NM
					, EKK0161B514CBSMsg2List.DNWACHO_MSKM_STAT
					, EKK0161B514CBSMsg2List.DNWACHOMSK_IDO_NAIYO_CD
					, EKK0161B514CBSMsg2List.COMP_KOBET_FLG
					, EKK0161B514CBSMsg2List.COMP_KOBET_FLG_NM
					, EKK0161B514CBSMsg2List.DBLE_KEISAI_FLG
					, EKK0161B514CBSMsg2List.DBLE_KEISAI_FLG_NM
					, EKK0161B514CBSMsg2List.KEISAI_KANA_NM
					, EKK0161B514CBSMsg2List.KEISAI_NM
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg2 = mapMessageList2(rsltQuery,msgKeyList2,"eo.ejb.cbs.cbsmsg.EKK0161B514CBSMsg2List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0161B514CBSMsg2List", outMsg2);
			// ANK-3798-00-00 ADD END

		} catch(SQLException e) {
			inMsg.set(EKK0161B514CBSMsg.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);
				}
				// ANK-3798-00-00 ADD START
				if(con2 != null){
					closeConnection(con2);
				}
				// ANK-3798-00-00 ADD END
			}catch(SQLException e){
				inMsg.set(EKK0161B514CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}

	// ANK-3798-00-00 ADD START
	/**
	 * 電話帳で最新が複数存在する場合、1件だけ設定するために個別で用意
	 * @param rslt
	 * @param clmList
	 * @param schema
	 * @param maxCnt
	 * @return
	 * @throws SQLException
	 */
	protected CAANMsg[] mapMessageList2(ResultSet rslt, String[] clmList, String schema, int maxCnt) throws SQLException {
			ArrayList<String> check = new ArrayList<String>();

			int cnt = 0;
			if (maxCnt <= 0) {
			    maxCnt = Integer.MAX_VALUE;
			}
			ArrayList rsltMsgList = new ArrayList();
			
			while (rslt.next()) {
				String ucwkno = rslt.getString(1);
				String no = rslt.getString(12);
				String key = ucwkno+no;
				if (!check.contains(key))
				{
					check.add(key);
					cnt++;
					if (cnt > maxCnt) {
						break;
					}
					// 検索結果の転記

					CAANMsg rsltMsg = new CAANMsg(schema);
					mapMessage(rslt, clmList, rsltMsg);
					rsltMsgList.add(rsltMsg);
				}
			}
			// 正常終了。
			return (CAANMsg[])rsltMsgList.toArray(new CAANMsg[0]);
	}
	// ANK-3798-00-00 ADD END
	


}
