/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK2811Edit
*	ソースファイル名：JKKejbKK2811Edit.java
*	作成者			：富士通
*	日付			：2011年08月01日
*＜機能概要＞
*	機器オプションサービス契約編集部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v7.00.00	2013/11/12	富士通		新規作成
*   v8.00.00	2014/03/24	FJ）松枝	OM-2014-0000286   
*   v60.00.00	2022/07/20	FJ）謝		【ANK-4287-00-00】【eo定期】機器オプションの予約機能対応
*
**********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
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.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbm.entity.KK2811ETMsg;
import eo.ejb.cbs.cbsmsg.EKK2811D010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK2811DBABase;

/**
 * <p>
 * 機器オプションサービス契約編集部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK2811Edit extends JKKejbKK2811DBABase
{
	/**
	 * コンストラクタです。
	 */
	public JKKejbKK2811Edit()
	{
	}

	/**
	 * <p>
	 * 機器オプションサービス契約のカレントレコードの世代登録年月日時分秒を取得を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kkopsvckeino 検索対象となる機器オプションサービス契約番号
	 * @return 指定された機器オプションサービス契約番号に紐付くカレントレコードの世代登録年月日時分秒
	 */
	public Object getCurrentGeneAddDtm(CAANMsg inMsg, AgentDispatchContext inContext, Object kkopsvckeino)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK2811ETMsg.class.getName());
		inETMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, kkopsvckeino);
		inETMsg.set(KK2811ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器オプションサービス契約のカレント検索を行う
		CAANMsg retKK2811 = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == retKK2811)
		{
			return null;
		}

		Object value = retKK2811.getObject(KK2811ETMsg.GENE_ADD_DTM);

		return value;
	}

	/**
	 * <p>
	 * 指定したステータスの最新の機器オプションサービス契約のカラムを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kkopSvcKeiNo 機器オプションサービス契約番号 
	 * @param kkopSvcKeiStat 機器オプションサービス契約ステータス 
	 * @param columnName 取得するカラム名
	 * @return 違約金発生コード
	 * @throws SQLException 
	 */
	public String getColumnByStat(CAANMsg inMsg, AgentDispatchContext inContext, Object kkopSvcKeiNo, Object kkopSvcKeiStat, String columnName) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String columnValue = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2811ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(columnName).append(" ");
			sql_Buff.append(" FROM   KK_T_KKOP_SVC_KEI KK2811 ");
			sql_Buff.append(" WHERE  KK2811.KKOP_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK2811.KKOP_SVC_KEI_NO, KK2811.RSV_APLY_YMD || KK2811.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK2811_GENE.KKOP_SVC_KEI_NO, MAX(KK2811_GENE.RSV_APLY_YMD || KK2811_GENE.GENE_ADD_DTM) AS KK2811_MAX ");
			sql_Buff.append("         FROM   KK_T_KKOP_SVC_KEI KK2811_GENE ");
			sql_Buff.append("         WHERE  KK2811_GENE.KKOP_SVC_KEI_NO = KK2811.KKOP_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK2811_GENE.KKOP_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK2811_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK2811_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK2811_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK2811_GENE.KKOP_SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(機器オプションサービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 1, kkopSvcKeiNo);
			// パラメータの設定(機器オプションサービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, kkopSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 指定したカラムの値を取得する
			if (rsltQuery.next())
			{
				columnValue = rsltQuery.getString(columnName);
			}

		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
		return columnValue;
	}
	
	/**
	 * <p>
	 * サービス停止解除年月日の編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiNo 検索対象の機器オプションサービス契約番号
	 * @param kaihkYmd 回復年月日
	 * @return サービス停止解除年月日
	 */
	public String getSvcStpRlsYmd(CAANMsg inMsg, AgentDispatchContext inContext, Object kktkSvcKeiNo, Object kaihkYmd)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK2811ETMsg.class.getName());
		inETMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, kktkSvcKeiNo);
		inETMsg.set(KK2811ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK2811ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK2811ETMsg.SVC_STP_RLS_YMD))
		{
			value = kaihkYmd.toString();
		}
		else
		{
			value = outETMsg.getString(KK2811ETMsg.SVC_STP_RLS_YMD);
		}
		return value;
	}

	/**
	 * <p>
	 * サービス停止解除理由コードの編集を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiNo 検索対象の機器オプションサービス契約番号
	 * @return サービス停止解除理由コード
	 */
	public String getSvcStpRlsRsnCd(CAANMsg inMsg, AgentDispatchContext inContext, Object kktkSvcKeiNo)
	{
		String value = null;
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK2811ETMsg.class.getName());
		inETMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, kktkSvcKeiNo);
		inETMsg.set(KK2811ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK2811ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK2811ETMsg.SVC_STP_RLS_YMD))
		{
			value = JKKModelConst.SVC_STP_RLS_RSN_CD_SKK;
		}
		else
		{
			value = outETMsg.getString(KK2811ETMsg.SVC_STP_RLS_RSN_CD);
		}
		return value;
	}
	
	/**
	 * <p>
	 * 機器オプションサービス契約ステータスに応じてカレント引継を行うか判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param kkopSvcKeiNo 検索対象の機器オプションサービス契約番号
	 * @return 受付済、照査済、締結済であればfalse、それ以外の場合true
	 */
	public boolean isStatCurrent(CAANMsg inMsg, AgentDispatchContext inContext, Object kkopSvcKeiNo)
	{
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK2811ETMsg.class.getName());
		inETMsg.set(KK2811ETMsg.KKOP_SVC_KEI_NO, kkopSvcKeiNo);
		inETMsg.set(KK2811ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器オプションサービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);
		
		if(outETMsg == null){
			return false;
		}

		String stat = outETMsg.getString(KK2811ETMsg.KKOP_SVC_KEI_STAT);
		
		if (JKKModelConst.KKTK_SVC_KEI_STAT_UK_ZM.equals(stat) || 
				JKKModelConst.KKTK_SVC_KEI_STAT_SHOSA_ZM.equals(stat) || 
				JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(stat))
		{
			return false;
		}
		return true;
	}
// ANK-4287-00-00 ADD START
	/**
	 * <p>
	 * 機器オプションサービス契約登録用新料金コース適用フラグを取得する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @return 新料金コース適用フラグ
	 */
	public String getNewPcrsAplyFlg(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機器オプションサービスコードを取得する
		String kkopSvcCd = inMsg.getString(EKK2811D010CBSMsg.KKOP_SVC_CD);
		
		// ルーター機能の場合
		if (JKKStrConst.KKOP_SVC_CD_ROUTER.equals(kkopSvcCd))
		{
			// 新料金コース適用フラグを取得する
			String newPcrsAplyFlg = inMsg.getString(EKK2811D010CBSMsg.NEW_PCRS_APLY_FLG);
			
			// 新料金コース適用フラグが設定されている場合
			if (!JKKStringUtil.isNullBlank(newPcrsAplyFlg))
			{
				return newPcrsAplyFlg;
			}
			else
			{
				return JKKStrConst.NEW_PCRS_APLY_FLG_SOKUJI;
			}
		}
		
		return "";
	}
// ANK-4287-00-00 ADD END
}
