/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0341Edit
*	ソースファイル名：JKKejbKK0341Edit.java
*	作成者			：富士通
*	日付			：2011年08月01日
*＜機能概要＞
*	機器提供サービス契約世代登録年月日時分秒取得部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/01	富士通		新規作成
*   v4.00.00    2013/04/10  FJ）寺園    IT2-2013-0000251
*   v5.00.00    2013/10/11  FJ）小島    OM-2013-0002974
*   v5.00.01    2013/10/31  FJ）寺園    OM-2013-0003686
*   v8.00.00	2014/03/24	FJ）松枝	OM-2014-0000286
*   v8.00.01    2014/03/28  FJ）小島    OM-2014-0001235
*
**********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCMConstants;
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.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C200CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0341DBABase;

/**
 * <p>
 * 機器提供サービス契約のカレントレコードの世代登録年月日時分秒を取得する部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0341Edit extends JKKejbKK0341DBABase
{

	/** 開始日・終了日未設定ステータス用マップ */
	private static final HashMap<String, String> MAP_CONT_NULL_STAT = new HashMap<String, String>();

	static
	{
		MAP_CONT_NULL_STAT.put("010", null);
		MAP_CONT_NULL_STAT.put("020", null);
		MAP_CONT_NULL_STAT.put("030", null);
	}
	
	/** 予約適用年月日 CBSMsg定数名 */
	private static final String RSV_APLY_YMD = "rsv_aply_ymd";
	
	/**機器設置承認状態初期化要否（要） */
	private static final String KKST_SNN_STAT_INIT_YH_YO = "1";

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0341Edit()
	{
	}

	/**
	 * <p>
	 * 機器提供サービス契約のカレントレコードの世代登録年月日時分秒を取得を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktksvckeino 検索対象となる機器提供サービス契約番号
	 * @return 指定された機器提供サービス契約番号に紐付くカレントレコードの世代登録年月日時分秒
	 */
	public Object getCurrentGeneAddDtm(CAANMsg inMsg, AgentDispatchContext inContext, Object kktksvckeino)
	{

		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktksvckeino);
		inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器提供サービス契約のカレント検索を行う
		CAANMsg ret0341C = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == ret0341C)
		{
			return null;
		}

		Object value = ret0341C.getObject(KK0341ETMsg.GENE_ADD_DTM);

		return value;
	}

	/**
	 * <p>
	 * カレントレコードのステータスに応じて値を設定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktksvckeino 検索対象となる機器提供サービス契約番号
	 * @param input 該当ステータス時に設定する値
	 * @return 項目に設定するべき値
	 */
	public Object setContPlanCng(CAANMsg inMsg, AgentDispatchContext inContext, Object kktksvckeino, Object input)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktksvckeino);
		// 検索条件の設定：予約適用年月日
		String templateID = inMsg.getString(JCMConstants.TEMPLATE_ID_KEY);
        if ("EKK0341C250".equals(templateID))
        {
        	inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, inMsg.getObject(RSV_APLY_YMD));
        }
        else
        {
        	inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));
        }

		// 機器提供サービス契約のカレント検索を行う
		CAANMsg ret0341C = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == ret0341C)
		{
			return null;
		}

		// 設定対象外のステータスの場合はnullを返却する
		if (MAP_CONT_NULL_STAT.containsKey(ret0341C.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT)))
		{
			return null;
		}

		return input;
	}

	/**
	 * <p>
	 * サービス提供中（解約前／休止中前）の違約金発生コードを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiNo 機器提供サービス契約番号 
	 * @param kktkSvcKeiStat 機器提供サービス契約ステータス 
	 * @return 違約金発生コード
	 * @throws SQLException 
	 */
	public String getPnltyHasseiCdMae(CAANMsg inMsg, AgentDispatchContext inContext, Object kktkSvcKeiNo, Object kktkSvcKeiStat) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String pnltyHasseiCd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.PNLTY_HASSEI_CD ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  KK0341.KKTK_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("         WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0341_GENE.KKTK_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0341_GENE.KKTK_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, kktkSvcKeiNo);
			// パラメータの設定(機器提供サービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, kktkSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 違約金発生コードを取得する
			if (rsltQuery.next())
			{
				pnltyHasseiCd = rsltQuery.getString("PNLTY_HASSEI_CD");
			}

		}
		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 pnltyHasseiCd;
	}
	
	/**
	 * <p>
	 * 指定したステータスの最新の機器提供サービス契約のカラムを取得します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kktkSvcKeiNo 機器提供サービス契約番号 
	 * @param kktkSvcKeiStat 機器提供サービス契約ステータス 
	 * @param columnName 取得するカラム名
	 * @return 違約金発生コード
	 * @throws SQLException 
	 */
	public String getColumnByStat(CAANMsg inMsg, AgentDispatchContext inContext, Object kktkSvcKeiNo, Object kktkSvcKeiStat, String columnName) 
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 返却用変数
		String pnltyHasseiCd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(columnName).append(" ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  KK0341.KKTK_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND    (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("        (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("         WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0341_GENE.KKTK_SVC_KEI_STAT = ? ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0341_GENE.KKTK_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, kktkSvcKeiNo);
			// パラメータの設定(機器提供サービス契約ステータス)
			CAANJDBCUtil.setParam(pstmt, 2, kktkSvcKeiStat);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 違約金発生コードを取得する
			if (rsltQuery.next())
			{
				pnltyHasseiCd = 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 pnltyHasseiCd;
	}
	
	/**
	 * <p>
	 * EKK0341C200_機器提供サービス契約場所変更
	 * 住所変更の異動区分に対する編集判定を行います。
	 * </p>
	 * @param inETMsg 処理対象のメッセージキャリア
	 * @param context Agentから渡されたAgentDispatchContext
	 * @return true：住所変更でない false：住所変更である
	 */
	public boolean isAdChgFlg(CAANMsg inETMsg, AgentDispatchContext context)
	{
		// 入力.異動区分の値が "00019"(住所変更) 以外の場合
		if (!JKKModelConst.IDO_DIV_ADCHG_ADD.equals(inETMsg.getString(KK0341ETMsg.IDO_DIV)))
		{
			return true;
		}
		return false;
	}

	/**
	 * <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(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器提供サービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0341ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0341ETMsg.SVC_STP_RLS_YMD))
		{
			value = kaihkYmd.toString();
		}
		else
		{
			value = outETMsg.getString(KK0341ETMsg.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(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器提供サービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (null == outETMsg)
		{
			return null;
		}

		// 利用停止中（カレント．サービス停止年月日≠NULLかつカレント．サービス停止解除年月日＝NULL）の場合
		if (!outETMsg.isNull(KK0341ETMsg.SVC_STP_YMD) && outETMsg.isNull(KK0341ETMsg.SVC_STP_RLS_YMD))
		{
			value = JKKModelConst.SVC_STP_RLS_RSN_CD_SKK;
		}
		else
		{
			value = outETMsg.getString(KK0341ETMsg.SVC_STP_RLS_RSN_CD);
		}
		return value;
	}
	/**
	 * <p>
	 * 機器提供サービス契約ステータスに応じてカレント引継を行うか判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param kktkSvcKeiNo 検索対象の機器提供サービス契約番号
	 * @return 受付済、照査済、締結済であればfalse、それ以外の場合true
	 */
	public boolean isStatCurrent(CAANMsg inMsg, AgentDispatchContext inContext, Object kktkSvcKeiNo)
	{
		
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0341ETMsg.class.getName());
		inETMsg.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		inETMsg.set(KK0341ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inMsg));

		// 機器提供サービス契約のカレント検索を行う
		CAANMsg outETMsg = super.findByCurrent(inETMsg);
		
		if(outETMsg == null){
			return false;
		}

		String stat = outETMsg.getString(KK0341ETMsg.KKTK_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;
	}
	
	/**
	 * <p>
	 * 機器提供サービス契約場所変更機器NULL設定判定部品
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param context Agentから渡されたAgentDispatchContext
	 * @param idoDiv 異動区分
	 * @param idoDiv 機器設置承認状態初期化要否
	 * @return true：異動区分が住所変更かつ機器設置承認状態初期化要否が要の場合
	 */
	public boolean isNullValueSet(CAANMsg inMsg, AgentDispatchContext context, String idoDiv, String kkstSnnStatInitYh)
	{
		// 入力.異動区分の値が "00019"(住所変更) かつ機器設置承認状態初期化要否が "1"(要) の場合
		if (JKKModelConst.IDO_DIV_ADCHG_ADD.equals(idoDiv)
				&& KKST_SNN_STAT_INIT_YH_YO.equals(kkstSnnStatInitYh))
		{
			return true;
		}
		return false;
	}
}
