/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEKK0351B522TPDA
*	ソースファイル名：JSYejbEKK0351B522TPDA.java
*	作成者			：EK944897
*	日付			：2025年01月15日
*＜機能概要＞
*	オプションチャンネル契約状態一覧照会（ＣＳコース）テンプレートDBアクセス部品です。【フロント】
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

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 eo.ejb.cbs.cbsmsg.EKK0351B522CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B522CBSMsg1List;
import eo.ejb.cbm.entity.KK0811ETMsg;
import eo.ejb.common.JCCModelCommon;

/**
*
*  テンプレートDBアクセス部品　EKK0351B522_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEKK0351B522TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEKK0351B522TPDA()	{
	}
	
	/**
	*   EKK0351B522_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(KK0811ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("  SELECT ")
			.append("     KK0811.OP_SVC_CD ")
			.append("     ,KK0821.OP_SVC_NM ")
			.append("     ,KK0821.DGTIA_GRP_CD ")
			.append("     ,KK0821.OP_CHANNEL_SBT_CD ")
			.append("     ,KK0821.UK_STA_YMDHM ")
			.append("     ,KK0821.UK_END_YMDHM ")
			.append("     ,KK0811.OP_SVC_BIKO ")
			.append("     ,KK0811.BIKO_SCREEN_DSP_STAYMD ")
			.append("     ,KK0811.BIKO_SCREEN_DSP_ENDYMD ")
			.append("     ,KK0351.OP_SVC_KEI_STAT ")
			.append("     ,KK0351.RSV_APLY_YMD ")
			.append("     ,KK0791.PCRS_CD ")
			.append("     ,KK0591.PPLAN_CD ")
			.append("     ,KK0591.PPLAN_NM ")
			// 				当月単価
			.append("     ,DECODE(KK0601.PPLAN_KOTEI_AMNT, NULL, KK0601_NEXT.PPLAN_KOTEI_AMNT, KK0601.PPLAN_KOTEI_AMNT) PPLAN_KOTEI_AMNT ")
			.append("     , ")
			// 				(1)料金単価  コード名称管理より現在有効な情報を取得 -----------------
			.append("     ( ")
			.append("        SELECT ")
			.append("           ZM0171_TMP.CD_DIV_NM ")
			.append("        FROM   ZM_M_CD_NM_KANRI ZM0171_TMP ")
			.append("        WHERE ")
			.append("           ZM0171_TMP.CD_SBT_CD = 'CD00896' ")
			.append("           AND    ( ? BETWEEN ZM0171_TMP.CD_TSTAYMD AND ZM0171_TMP.CD_TENDYMD ) ")
			.append("           AND    ZM0171_TMP.MK_FLG = '0' ")
			.append("           AND    ZM0171_TMP.CD_DIV = DECODE(KK0601.PPLAN_KOTEI_AMNT, NULL, KK0601_NEXT.PPLAN_KOTEI_TANI_CD, KK0601.PPLAN_KOTEI_TANI_CD) ")
			.append("     ) AS PPLAN_KOTEI_TANI_CD_NM ")
			// 				来月単価
			.append("     ,DECODE(KK0601_NEXT.PPLAN_KOTEI_AMNT, NULL, KK0601.PPLAN_KOTEI_AMNT, KK0601_NEXT.PPLAN_KOTEI_AMNT) PPLAN_KOTEI_AMNT_NEXT_M ")
			.append("     , ")
			// 				(2)料金単価(来月)  コード名称管理より現在有効な情報を取得 -----------------
			.append("     ( ")
			.append("        SELECT ")
			.append("           ZM0171_TMP.CD_DIV_NM ")
			.append("        FROM   ZM_M_CD_NM_KANRI ZM0171_TMP ")
			.append("        WHERE ")
			.append("           ZM0171_TMP.CD_SBT_CD = 'CD00896' ")
			.append("           AND    ( TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD') BETWEEN ZM0171_TMP.CD_TSTAYMD AND ZM0171_TMP.CD_TENDYMD ) ")
			.append("           AND    ZM0171_TMP.MK_FLG = '0' ")
			.append("           AND    ZM0171_TMP.CD_DIV = DECODE(KK0601_NEXT.PPLAN_KOTEI_TANI_CD, NULL, KK0601.PPLAN_KOTEI_TANI_CD, KK0601_NEXT.PPLAN_KOTEI_TANI_CD) ")
			.append("     ) AS PPLAN_KOTEI_TANI_CD_NM_NEXT_M ")
			.append("     ,KK0811.OPCH_DSL_TG_CHSHT_FLG ")
			.append("     ,KK0811.OPCH_ADD_SCREEN_DSP_TG_FLG ")
			.append("     ,DECODE(OPCH_DSL_TG_CHSHT_FLG,'1','1',DECODE(KK0351.SORT_FLG,'','4',KK0351.SORT_FLG)) AS SORT_FLG ")
			.append("  FROM ")
			// 			(MAIN-1) KK0081:サービス契約、KK3541:CASカード管理
			.append("     KK_T_SVC_KEI KK0081 ")
			.append("     INNER JOIN KK_T_CASCD_KNRI KK3541 ")
			.append("        ON KK3541.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("       AND KK3541.CASCD_NO = ? ")
			.append("        AND KK3541.MK_FLG = '0' ")
			.append("     INNER JOIN ")
			.append("        ( ")
			// 				(MAIN-2) 料金コース_オプションサービスマスタより現在有効な情報を取得 (料金別の番組情報) 
			.append("           SELECT ")
			.append("              KK0811_TMP.PCRS_CD ")
			.append("              ,KK0811_TMP.OP_SVC_CD ")
			.append("              ,KK0811_TMP.OP_SVC_BIKO ")
			.append("              ,KK0811_TMP.BIKO_SCREEN_DSP_STAYMD ")
			.append("              ,KK0811_TMP.BIKO_SCREEN_DSP_ENDYMD ")
			// 						オプションチャンネル解約対象抽出フラグ＝'1'の場合のみ、相関チェック開始、終了年月日が設定される。 
			.append("              ,CASE ")
			.append("                 WHEN KK0811_TMP.OPCH_DSL_TG_CHSHT_FLG = '1' THEN ")
			.append("                    CASE ")
			.append("                       WHEN ? BETWEEN KK0811_TMP.SOKAN_CHK_STAYMD AND KK0811_TMP.SOKAN_CHK_ENDYMD THEN '1' ")
			.append("                       ELSE '0' ")
			.append("                    END ")
			.append("                 ELSE '0' ")
			.append("               END AS OPCH_DSL_TG_CHSHT_FLG ")
			.append("              ,KK0811_TMP.OPCH_ADD_SCREEN_DSP_TG_FLG ")
			.append("              ,KK0811_TMP.OPSV_CHPSB_SCREEN_SKBT_CD ")
			.append("              ,KK0811_TMP.GENE_ADD_DTM ")
			.append("              ,KK0811_TMP.RSV_APLY_YMD ")
			.append("              ,MAX(KK0811_TMP.RSV_APLY_YMD || KK0811_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0811_TMP.PCRS_CD,KK0811_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM ")
			.append("           FROM   KK_M_PCRS_OP_SVC KK0811_TMP ")
			.append("           WHERE ")
			.append("              KK0811_TMP.RSV_APLY_YMD <= ? ")
			.append("              AND    KK0811_TMP.MK_FLG = '0' ")
			.append("              AND    ( ? BETWEEN KK0811_TMP.PCRS_OP_SVC_TSTAYMD AND KK0811_TMP.PCRS_OP_SVC_TENDYMD ) ")
			.append("        ) KK0811 ")
			.append("        ON KK0811.PCRS_CD = KK0081.PCRS_CD ")
			.append("        AND (KK0811.RSV_APLY_YMD || KK0811.GENE_ADD_DTM) = KK0811.MAX_GENE_ADD_DTM ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-1) オプションサービスマスタより、予約適用日が当日以前 かつ 世代登録年月日時分秒が最大の情報を取得 (番組の契約情報)    
			.append("           SELECT ")
			.append("              KK0821_TMP.OP_SVC_CD ")
			.append("              ,KK0821_TMP.OP_SVC_NM ")
			.append("              ,KK0821_TMP.DGTIA_GRP_CD ")
			.append("              ,KK0821_TMP.OP_CHANNEL_SBT_CD ")
			.append("              ,KK0821_TMP.UK_STA_YMDHM ")
			.append("              ,KK0821_TMP.UK_END_YMDHM ")
			.append("              ,KK0821_TMP.GENE_ADD_DTM ")
			.append("              ,KK0821_TMP.OP_SVC_TSTAYMD ")
			.append("              ,KK0821_TMP.RSV_APLY_YMD ")
			.append("              ,MAX(KK0821_TMP.RSV_APLY_YMD || KK0821_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0821_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM ")
			.append("           FROM   KK_M_OP_SVC KK0821_TMP ")
			.append("           WHERE ")
			.append("              KK0821_TMP.RSV_APLY_YMD <= ? ")
			.append("              AND    KK0821_TMP.MK_FLG = '0' ")
			.append("              AND    ( ? BETWEEN KK0821_TMP.OP_SVC_TSTAYMD AND KK0821_TMP.OP_SVC_TENDYMD ) ")
			.append("        ) KK0821 ")
			.append("        ON KK0811.OP_SVC_CD = KK0821.OP_SVC_CD ")
			.append("        AND (KK0821.RSV_APLY_YMD || KK0821.GENE_ADD_DTM) = KK0821.MAX_GENE_ADD_DTM ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-2) 料金コースマスタより、予約適用日が当日以前 かつ 世代登録年月日時分秒が最大の情報を取得
			.append("           SELECT ")
			.append("              KK0791_TMP.PCRS_CD ")
			.append("              ,KK0791_TMP.OP_SVC_CD ")
			.append("              ,KK0791_TMP.GENE_ADD_DTM ")
			.append("              ,KK0791_TMP.PCRS_TSTAYMD ")
			.append("              ,KK0791_TMP.RSV_APLY_YMD ")
			.append("              ,MAX(KK0791_TMP.RSV_APLY_YMD || KK0791_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0791_TMP.PCRS_CD) MAX_GENE_ADD_DTM ")
			.append("           FROM   KK_M_PCRS KK0791_TMP ")
			.append("           WHERE ")
			.append("              KK0791_TMP.RSV_APLY_YMD <= ? ")
			.append("              AND    ( ? BETWEEN KK0791_TMP.PCRS_TSTAYMD AND KK0791_TMP.PCRS_TENDYMD ) ")
			.append("              AND    KK0791_TMP.MK_FLG = '0' ")
			.append("        ) KK0791 ")
			.append("        ON KK0821.OP_SVC_CD = KK0791.OP_SVC_CD ")
			.append("        AND (KK0791.RSV_APLY_YMD || KK0791.GENE_ADD_DTM) = KK0791.MAX_GENE_ADD_DTM ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-3) 料金プランマスタより、情報を取得
			.append("           SELECT ")
			.append("              KK0591_TMP.PCRS_CD ")
			.append("              ,KK0591_TMP.PPLAN_CD ")
			.append("              ,KK0591_TMP.PPLAN_NM ")
			.append("           FROM   KK_M_PPLAN KK0591_TMP ")
			.append("           WHERE ")
			.append("              ( ? BETWEEN KK0591_TMP.PPLAN_TSTAYMD AND KK0591_TMP.PPLAN_TENDYMD ) ")
			.append("              AND    KK0591_TMP.MK_FLG = '0' ")
			.append("        ) KK0591 ")
			.append("        ON KK0791.PCRS_CD = KK0591.PCRS_CD ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-4) 当月  料金プラン固定単価マスタより、    
			// 				料金プラン種別コードが基本料金    
			// 				かつ 契約状態種別コードが通常    
			// 				かつ 予約適用日が当日以前    
			// 				かつ 世代登録年月日時分秒が最大の情報を取得    
			.append("           SELECT ")
			.append("              KK0601_TMP.PCRS_CD ")
			.append("              ,KK0601_TMP.PPLAN_CD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_AMNT ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANI_CD ")
			.append("              ,KK0601_TMP.PPLAN_TANKA_SBT_CD ")
			.append("              ,KK0601_TMP.PPLAN_PRC_SBT_CD ")
			.append("              ,KK0601_TMP.KEI_STAT_SBT_CD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ")
			.append("              ,KK0601_TMP.GENE_ADD_DTM ")
			.append("              ,KK0601_TMP.RSV_APLY_YMD ")
			.append("              ,MAX(KK0601_TMP.RSV_APLY_YMD || KK0601_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0601_TMP.PCRS_CD, KK0601_TMP.PPLAN_CD) MAX_GENE_ADD_DTM ")
			.append("           FROM   KK_M_PPLAN_KTTANKA KK0601_TMP ")
			.append("           WHERE ")
			.append("              KK0601_TMP.RSV_APLY_YMD <= ? ")
			.append("              AND  ( ? ")
			.append("                     BETWEEN KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD AND KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ) ")
			.append("              AND    KK0601_TMP.MK_FLG = '0' ")
			.append("              AND    KK0601_TMP.PPLAN_TANKA_SBT_CD = 'K01' ")
			.append("              AND    KK0601_TMP.PPLAN_PRC_SBT_CD = '00' ")
			.append("              AND    KK0601_TMP.KEI_STAT_SBT_CD = '01' ")
			.append("        ) KK0601 ")
			.append("        ON  KK0591.PCRS_CD = KK0601.PCRS_CD ")
			.append("        AND KK0591.PPLAN_CD = KK0601.PPLAN_CD ")
			.append("        AND (KK0601.RSV_APLY_YMD || KK0601.GENE_ADD_DTM) = KK0601.MAX_GENE_ADD_DTM ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-5) 来月 料金プラン固定単価マスタより、    
			// 				料金プラン種別コードが基本料金    
			// 				かつ 契約状態種別コードが通常    
			// 				かつ 予約適用日が当日以前    
			// 				かつ 世代登録年月日時分秒が最大の情報を取得    
			.append("           SELECT ")
			.append("              KK0601_TMP.PCRS_CD ")
			.append("              ,KK0601_TMP.PPLAN_CD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_AMNT ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANI_CD ")
			.append("              ,KK0601_TMP.PPLAN_TANKA_SBT_CD ")
			.append("              ,KK0601_TMP.PPLAN_PRC_SBT_CD ")
			.append("              ,KK0601_TMP.KEI_STAT_SBT_CD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD ")
			.append("              ,KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ")
			.append("              ,KK0601_TMP.GENE_ADD_DTM ")
			.append("              ,KK0601_TMP.RSV_APLY_YMD ")
			.append("              ,MAX(KK0601_TMP.RSV_APLY_YMD || KK0601_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0601_TMP.PCRS_CD, KK0601_TMP.PPLAN_CD) MAX_GENE_ADD_DTM ")
			.append("           FROM   KK_M_PPLAN_KTTANKA KK0601_TMP ")
			.append("           WHERE ")
			.append("              KK0601_TMP.RSV_APLY_YMD <= TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD') ")
			.append("              AND  ( TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD') ")
			.append("                     BETWEEN KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD AND KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ) ")
			.append("              AND    KK0601_TMP.MK_FLG = '0' ")
			.append("              AND    KK0601_TMP.PPLAN_TANKA_SBT_CD = 'K01' ")
			.append("              AND    KK0601_TMP.PPLAN_PRC_SBT_CD = '00' ")
			.append("              AND    KK0601_TMP.KEI_STAT_SBT_CD = '01' ")
			.append("        ) KK0601_NEXT ")
			.append("        ON  KK0591.PCRS_CD = KK0601_NEXT.PCRS_CD ")
			.append("        AND KK0591.PPLAN_CD = KK0601_NEXT.PPLAN_CD ")
			.append("        AND (KK0601_NEXT.RSV_APLY_YMD || KK0601_NEXT.GENE_ADD_DTM) = KK0601_NEXT.MAX_GENE_ADD_DTM ")
			.append("     LEFT OUTER JOIN ")
			.append("        ( ")
			// 				(SUB-6) オプションチャンネル（トラン）の契約状態を取得
			.append("           SELECT ")
			.append("               KK0351_02.SVC_KEI_NO ")
			.append("              ,KK0351_02.SVC_KEI_UCWK_NO ")
			.append("              ,KK0351_02.OP_SVC_CD ")
			.append("              ,KK0351_02.OP_SVC_KEI_STAT ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT, '', '', KK0351_02.RSV_APLY_YMD) RSV_APLY_YMD ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'210','1' ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'220','1' ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'100',DECODE(TRIM(KK0351_02.IDO_RSV_DTL_CD),'014','2','1') ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'010','2' ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'020','2' ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'030','2' ")
			.append("              ,DECODE(KK0351_02.OP_SVC_KEI_STAT,'910','3'))))))) AS SORT_FLG ")
			.append("           FROM ( ")
			// 						KK0351_02 start
			.append("              SELECT ")
			.append("                  KK0351_01.SVC_KEI_NO ")
			.append("                 ,KK0351_01.SVC_KEI_UCWK_NO ")
			.append("                 ,KK0351_01.OP_SVC_KEI_NO ")
			.append("                 ,KK0351_01.OP_SVC_CD ")
			.append("                 ,KK1681.IDO_RSV_DTL_CD ")
			// 						当月中にサービス提供中の解約があったかどうか判定する。[今すぐ視聴]ボタンを押せなくする
			// 						（「サービス提供中の解約」は運用日が末日の場合は異動予約が作成されずに、
			// 						オプションの解約が作成される。末日以外は期日到来まで異動予約。）
			// 						（「締結済の解約」はオプションの解約が作成される。）
			//
			// 						※ 基本的に[今すぐ視聴]＝サービス提供中、[来月から視聴]＝締結済
			// 						※ バックヤード対応のもので、[申込]でとまるものもある。
			// 						※ 異動予約で未処理分は「来月から視聴」で申込の予約、「サービス提供中」で解約の予約。
			// 						サービス提供中の解約「サービス開始年月日≠NULL かつ サービス終了年月日の年月 = 運用年月は、当月に「解約」として扱う。」
			// 						締結済の解約「サービス開始年月日＝NULL」
			// 						異動予約詳細コード＝016(解約手続中),014(申込手続中) 
			//
			// 						@[来月から視聴]の予約が入っているか（「手続中」として表示。ボタンは使用不可。）
			// 						A当月内に解約があるか    
			// 						B A以外のオプションサービス契約の解約は、「サービス提供中以外」の解約のため、 [今すぐ視聴]ボタンを有効にする    
			.append("                 ,CASE WHEN KK0351_TG.OP_SVC_KEI_STAT IS NULL THEN ")
			.append("                    CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '910' THEN '' ")
			.append("                       WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '' ")
			.append("                    ELSE KK0351_01.OP_SVC_KEI_STAT ")
			.append("                    END ")
			.append("                  ELSE ")
			.append("                    CASE WHEN (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) > KK0351_TG.TG_RSV_GENE_ADD_DTM THEN ")
			.append("                       CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '910' ")
			.append("                       ELSE KK0351_01.OP_SVC_KEI_STAT ")
			.append("                       END ")
			.append("                    ELSE KK0351_TG.OP_SVC_KEI_STAT ")
			.append("                    END ")
			.append("                  END AS OP_SVC_KEI_STAT ")
			.append("                 ,CASE WHEN KK0351_TG.OP_SVC_KEI_STAT IS NULL THEN ")
			.append("                    CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '910' THEN '' ")
			.append("                       WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '' ")
			.append("                    ELSE KK0351_01.RSV_APLY_YMD ")
			.append("                    END ")
			.append("                  ELSE ")
			.append("                    CASE WHEN (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) > KK0351_TG.TG_RSV_GENE_ADD_DTM THEN ")
			.append("                       KK0351_01.RSV_APLY_YMD ")
			.append("                    ELSE TO_CHAR(LAST_DAY(TO_DATE(?, 'YYYYMMDD')), 'YYYYMMDD') ")
			.append("                    END ")
			.append("                  END AS RSV_APLY_YMD ")
			.append("              FROM ")
			.append("                 ( ")
			// 							KK0351:オプションサービス契約（トラン）より情報を取得
			.append("                    SELECT ")
			.append("                       KK0351_01_TMP.SVC_KEI_NO ")
			.append("                       ,KK0351_01_TMP.SVC_KEI_UCWK_NO ")
			.append("                       ,KK0351_01_TMP.OP_SVC_CD ")
			.append("                       ,KK0351_01_TMP.OP_SVC_KEI_NO ")
			.append("                       ,KK0351_01_TMP.OP_SVC_KEI_STAT ")
			.append("                       ,KK0351_01_TMP.GENE_ADD_DTM ")
			.append("                       ,KK0351_01_TMP.RSV_APLY_YMD ")
			.append("                       ,KK0351_01_TMP.SVC_STAYMD ")
			.append("                       ,KK0351_01_TMP.SVC_ENDYMD ")
			.append("                       ,MAX(KK0351_01_TMP.RSV_APLY_YMD || KK0351_01_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0351_01_TMP.OP_SVC_KEI_NO) MAX_GENE_ADD_DTM ")
			.append("                       ,MAX(KK0351_01_TMP.RSV_APLY_YMD || KK0351_01_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0351_01_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM_OPCD ")
			.append("                       ,KK0351_01_TMP.MK_FLG ")
			.append("                    FROM   KK_T_OP_SVC_KEI KK0351_01_TMP ")
			// 							KK3561:CAS番号対象オプションサービス契約
			.append("                    INNER JOIN KK_T_CSNT_OPSVKEI KK3561 ")
			.append("                       ON KK3561.OP_SVC_KEI_NO = KK0351_01_TMP.OP_SVC_KEI_NO ")
			.append("                       AND KK3561.CASCD_NO = ? ")
			.append("                       AND KK3561.MK_FLG = '0' ")
			.append("                    WHERE ")
			.append("                       KK0351_01_TMP.RSV_APLY_YMD <= ? ")
			.append("                    AND KK0351_01_TMP.MK_FLG = '0' ")
			.append("                    AND KK0351_01_TMP.RSV_APLY_CD = '2' ")
			.append("                 ) KK0351_01 ")
			.append("                 LEFT OUTER JOIN KK_T_IDO_RSV KK1681 ")
			// 							KK1681:異動予約よりオプション申込予約、オプション解約予約の情報を取得
			.append("                    ON KK1681.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ")
			.append("                    AND KK1681.IDO_RSV_DTL_CD IN ('014','016') ")
			.append("                    AND KK1681.IDO_RSV_STAT_CD IN ('00','03') ")
			.append("                    AND KK1681.RSV_APLY_YMD >= ? ")
			.append("                    AND KK1681.MK_FLG = '0' ")
			.append("                 LEFT OUTER JOIN ( ")
			// 							当月中にサービス提供中の解約があったかどうか取得する
			// 							（トラン  KK0351:オプションサービス契約、KK3561:CAS番号対象オプションサービス契約、KK1681:異動予約）   
			.append("                   SELECT ")
			.append("                        '910' OP_SVC_KEI_STAT ")
			.append("                       ,KK0351_TG.OP_SVC_CD ")
			.append("                      ,KK0351_TG.SVC_KEI_NO ")
			.append("                       ,MAX(KK0351_TG.RSV_APLY_YMD || KK0351_TG.GENE_ADD_DTM) TG_RSV_GENE_ADD_DTM ")
			.append("                       FROM KK_T_OP_SVC_KEI KK0351_TG ")
			.append("                       INNER JOIN KK_T_CSNT_OPSVKEI KK3561 ")
			.append("                          ON KK3561.OP_SVC_KEI_NO = KK0351_TG.OP_SVC_KEI_NO ")
			.append("                          AND KK3561.CASCD_NO = ? ")
			.append("                         AND KK3561.MK_FLG = '0' ")
			.append("                        LEFT OUTER JOIN KK_T_IDO_RSV KK1681_TG ")
			.append("                          ON KK1681_TG.OP_SVC_KEI_NO = KK0351_TG.OP_SVC_KEI_NO ")
			.append("                          AND KK1681_TG.IDO_RSV_DTL_CD IN ('016') ")
			.append("                          AND KK1681_TG.IDO_RSV_STAT_CD IN ('00','03') ")
			.append("                          AND KK1681_TG.RSV_APLY_YMD >=  ? ")
			.append("                          AND KK1681_TG.MK_FLG = '0' ")
			.append("                        WHERE ")
			.append("                        KK0351_TG.SVC_KEI_NO = ?  ")
			.append("                        AND KK0351_TG.RSV_APLY_YMD <= ? ")
			.append("                          AND KK0351_TG.MK_FLG = '0' ")
			.append("                          AND KK0351_TG.RSV_APLY_CD = '2' ")
			.append("                           AND ( ")
			.append("                              ( KK0351_TG.OP_SVC_KEI_STAT = '910' ")
			.append("                                 AND   (TRIM(KK0351_TG.SVC_STAYMD) IS NOT NULL) AND (SUBSTR(KK0351_TG.SVC_ENDYMD, 1, 6) = SUBSTR(?, 1, 6)) ")
			.append("                                 AND  KK1681_TG.OP_SVC_KEI_NO IS NULL ")
			.append("                              ) OR ( ")
			.append("                                 KK0351_TG.OP_SVC_KEI_STAT = '100'  AND KK1681_TG.OP_SVC_KEI_NO IS NOT NULL ")
			.append("                              ) ")
			.append("                             ) ")
			.append("                        GROUP BY KK0351_TG.SVC_KEI_NO, KK0351_TG.OP_SVC_CD ")
			.append("                     ) KK0351_TG ")
			.append("                    ON  KK0351_01.SVC_KEI_NO = KK0351_TG.SVC_KEI_NO ")
			.append("                    AND KK0351_TG.OP_SVC_CD = KK0351_01.OP_SVC_CD ")
			// 					同じオプションサービスコードで、最新の契約番号 かつ 最新のステータスのレコードに絞り込む
			.append("              WHERE ")
			.append("                     KK0351_01.OP_SVC_KEI_STAT IN('010','020','030','100','210','220') ")
			.append("              AND    KK0351_01.MK_FLG = '0' ")
			.append("              AND    KK0351_01.MAX_GENE_ADD_DTM = (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) ")
			.append("              ) KK0351_02 ")
			.append("        ) KK0351 ")
			.append("        ON KK0351.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("        AND KK0351.OP_SVC_CD = KK0811.OP_SVC_CD ");
	// SQL文_個別部1
			// KK0081：サービス契約、KK0811：料金コース_オプションサービス(M)、    
			// KK0821:オプションサービス(M)、KK0601：料金プラン固定単価(M)、    
	if ( "1".equals( inMsg.getObject(EKK0351B522CBSMsg.FUNC_CODE).toString() ) ) {
			sql_Buff.append("    WHERE ")
				.append("          KK0081.SVC_KEI_NO = ?  ")
				.append("        AND   KK0081.SVC_KEI_STAT IN ('100', '030') ")
				.append("        AND  (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ")
				.append("                                                                 (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) ")
				.append("                                                                 FROM   KK_T_SVC_KEI KK0081_GENE ")
				.append("                                                                 WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
				.append("                                                                 AND    KK0081_GENE.RSV_APLY_YMD <= ? ")
				.append("                                                                 AND    KK0081_GENE.RSV_APLY_CD = '2' ")
				.append("                                                                 AND    KK0081_GENE.MK_FLG = '0' ")
				.append("                                                                 GROUP BY KK0081_GENE.SVC_KEI_NO) ")
				.append("        AND    (KK0811.OPSV_CHPSB_SCREEN_SKBT_CD IN ('1', '3') OR KK0811.OPSV_CHPSB_SCREEN_SKBT_CD IS NULL) ")
				.append("        AND    ( (KK0601.PCRS_CD IS NOT NULL) OR (KK0601_NEXT.PCRS_CD IS NOT NULL )) ")
				.append("        AND    KK0821.OP_CHANNEL_SBT_CD= ? ")
				.append("     ORDER BY ")
				.append("        SORT_FLG ASC ")
				.append("        ,OP_SVC_CD ASC ");
			}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			/* ++++++++++ v74.00 修正開始 ++++++++++ */
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			// パラメータのカウント
			int iPCnt = 1;
			if ( "1".equals( inMsg.getString(EKK0351B522CBSMsg.FUNC_CODE) ) ) {
				// ●運用日付取得
				String opeDate = JCCModelCommon.getOpeDate(inMsg, null);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿CASカード番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_CASCD_NO));
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
	
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
	
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
	
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿CASカード番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_CASCD_NO));
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿CASカード番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_CASCD_NO));
	
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_SVC_KEI_NO));
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿サービス契約番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_SVC_KEI_NO));
	
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿オプションチャンネル種別コードを指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B522CBSMsg.KEY_OP_CHANNEL_SBT_CD));
			}
			/* ++++++++++ v74.00 修正終了 ++++++++++ */

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK0351B522CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK0351B522CBSMsg1List.OP_SVC_CD
					, EKK0351B522CBSMsg1List.OP_SVC_CD_NM
					, EKK0351B522CBSMsg1List.DGTIA_GRP_CD
					, EKK0351B522CBSMsg1List.OP_CHANNEL_SBT_CD
					, EKK0351B522CBSMsg1List.UK_STA_YMDHM
					, EKK0351B522CBSMsg1List.UK_END_YMDHM
					, EKK0351B522CBSMsg1List.OP_SVC_BIKO
					, EKK0351B522CBSMsg1List.BIKO_SCREEN_DSP_STAYMD
					, EKK0351B522CBSMsg1List.BIKO_SCREEN_DSP_ENDYMD
					, EKK0351B522CBSMsg1List.OP_SVC_KEI_STAT
					, EKK0351B522CBSMsg1List.RSV_APLY_YMD
					, EKK0351B522CBSMsg1List.PCRS_CD
					, EKK0351B522CBSMsg1List.PPLAN_CD
					, EKK0351B522CBSMsg1List.PPLAN_NM
					, EKK0351B522CBSMsg1List.PPLAN_KOTEI_AMNT
					, EKK0351B522CBSMsg1List.PPLAN_KOTEI_TANI_CD_NM
					, EKK0351B522CBSMsg1List.PPLAN_KOTEI_AMNT_NEXT_M
					, EKK0351B522CBSMsg1List.PPLAN_KOTEI_TANI_CD_NM_NEXT_M
					, EKK0351B522CBSMsg1List.OPCH_DSL_TG_CHSHT_FLG
					, EKK0351B522CBSMsg1List.OPCH_ADD_SCREEN_DSP_TG_FLG
					, EKK0351B522CBSMsg1List.SORT_FLG
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EKK0351B522CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0351B522CBSMsg1List", outMsg1);
			

		} catch(SQLException e) {
			inMsg.set(EKK0351B522CBSMsg.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(EKK0351B522CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
