/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*   モジュール名    ：JECC0081A010TPMA
*   ソースファイル名：JECC0081A010TPMA.java
*   作成者          ：富士通
*   日付            ：2011年05月27日
*＜機能概要＞
*   主処理(共通)<BR>
*   ワンタイムパスワード認証独自処理部品クラス.
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/05/27  富士通      新規作成
*   v32.00.00   2017/05/26  FJ)河邊    【OM-2017-0000488】オープンカーソルエラー
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

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.ejb.common.JSYejbConnection;
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.TemplateMainHandler;

import eo.common.util.JCCFrameworkException;
import eo.ejb.cbm.entity.CC0081ETMsg;
import eo.ejb.cbm.entity.JSYejbCC0081ETDA;
import eo.ejb.cbs.cbsmsg.ECC0081A010CBSMsg;
import eo.ejb.common.JCCModelCommon;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * <p>
 * ワンタイムパスワード認証独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JECC0081A010TPMA implements TemplateMainHandler {

	/**
	 * コンストラクタ.
	 */
	public JECC0081A010TPMA()
	{
		super();
	}
	
	/** 認証状態 - 認証OK */
	private final static String NINSHO_OK = "0";
	/** 認証状態 - 認証NG */
	private final static String NINSHO_NG = "1";
	/**
	 * ワンタイムパスワード認証.
	 * ワンタイムパスワードの照会、登録ユーザの組織・立場情報の取得<BR>
	 * ワンタイムパスワード管理の論理削除を行なう。
	 * @param inMsg 
	 * @param inContext 
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{
		//----------------------------------------------------
		// ワンタイムパスワード認証と組織・立場情報の取得
		// ----------------------------------------------------
		
		// ユーザ情報、組織情報、立場情報の取得
		// コネクションの取得
		Connection con = JSYejbConnection.getConnection(CC0081ETMsg.getTableName());
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try
		{
			// 有効期限の確認
			// アプリケーションコンストから、ワンタイムパスワードの有効期間(秒)を取得
			String sso_term = JCCModelCommon.getApplicationConst("SSO_TERM");
			
			// システム時刻を取得し日付型へ変換
			String sys_dtm = JCCModelCommon.getSysDateTimeStamp();
			DateFormat lastModifiedDate = new SimpleDateFormat("yyyyMMddHHmmssSSS");
			long longNum = lastModifiedDate.parse(sys_dtm).getTime();
			long lon = longNum -Long.parseLong(sso_term) * 1000;
			Date date = new Date(lon);
			
			// SQL文の組立て
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
					.append("    CC0081.ONET_PWD, ")
					//2012/02/21 システムコードも取得対象とする start
					.append("    CC0081.OUT_SYS_CD, ")
					//2012/02/21 システムコードも取得対象とする end
					.append("    ZM0051.USER_ID, ")
					.append("    ZM0051.USER_NM, ")
					.append("    ZM0061.ORG_CD, ")
					.append("    ZM0071.POSITION_CD, ")
					.append("    ZM0061.ORG_NM, ")
					.append("    ZM0071.POSITION_NM ")
					.append(" FROM ")
					.append("    CC_T_ONET_PWD CC0081 ")
					.append("      LEFT OUTER JOIN ZM_M_USER ZM0051 ")
					.append("        ON CC0081.USER_ID = ZM0051.USER_ID ")
					//2012/02/21 スキーマ変更対応(ユーザーの有効期限) start
					.append("        AND ZM0051.USER_TSTAYMD <= ? ")
					.append("        AND ZM0051.USER_TENDYMD >= ? ")
					//2012/02/21 スキーマ変更対応(ユーザーの有効期限) end
					.append("        AND ZM0051.MK_FLG = '0' ")
					.append("      LEFT OUTER JOIN ZM_M_ORGANIZATION ZM0061 ")
					.append("        ON CC0081.ORG_CD = ZM0061.ORG_CD ")
					//2012/02/21 スキーマ変更対応(組織の有効期限) start
					.append("        AND ZM0061.ORG_TSTAYMD <= ? ")
					.append("        AND ZM0061.ORG_TENDYMD >= ? ")
					//2012/02/21 スキーマ変更対応(組織の有効期限) end
					.append("        AND ZM0061.MK_FLG = '0' ")
					.append("      LEFT OUTER JOIN ZM_M_POSITION ZM0071")
					.append("        ON CC0081.POSITION_CD = ZM0071.POSITION_CD")
					//2012/02/21 スキーマ変更対応(立場の有効期限) start
					.append("        AND ZM0071.POSITION_TSTAYMD <= ? ")
					.append("        AND ZM0071.POSITION_TENDYMD >= ? ")
					//2012/02/21 スキーマ変更対応(立場の有効期限) end
					.append("        AND ZM0071.MK_FLG = '0'")
					.append(" WHERE ")
					.append("     CC0081.ONET_PWD = ? ")
					// 2012/02/21 システムコードは設定しない start
					//.append("     AND  CC0081.OUT_SYS_CD = ? ")
					// 2012/02/21 システムコードは設定しない end
					// 20110823 FST start パスワード有効期間判定方法変更 
					//.append("     AND　CC0081.ADD_DTM < ? ")
					.append("     AND CC0081.ADD_DTM > ? ")
					//20110823 FST end
					.append("     AND  CC0081.MK_FLG = '0' ");
			
			pstmt = con.prepareStatement(sql_Buff.toString());
			
			//2012/02/21 スキーマ変更対応(バインド変数の追加) start
			int setCnt = 0;
			
			// バインド変数（運用日付の設定）
			String opeDate = JCCModelCommon.getOpeDate(inCBSMsg, null);
			
			//ユーザー開始／終了
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			
			//組織開始／終了
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			
			//立場開始／終了
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			CAANJDBCUtil.setParam(pstmt, ++setCnt, opeDate);
			
			//2012/02/21 スキーマ変更対応(バインド変数の追加) end
			
			// inCBSMsg からワンタイムパスワードを取得
			CAANJDBCUtil.setParam(pstmt, ++setCnt, inCBSMsg.getObject(ECC0081A010CBSMsg.ONE_TIME_PWD));
			// システムコードを設定
			// 2012/02/21 システムコードは設定しない start
			//CAANJDBCUtil.setParam(pstmt, ++setCnt, getSysCdDate(inContext));
			// 2012/02/21 システムコードは設定しない end
			// システム時刻-有効期間を設定
			CAANJDBCUtil.setParam(pstmt, ++setCnt, lastModifiedDate.format(date));
			
			// SQL実行
			rs = pstmt.executeQuery();
			
			// ワンタイムパスワードが取得できなかった場合
			if (!rs.next())
			{
				// 認証エラー
				// inCBSMsg(認証状態)に"1"(認証NG)を設定
				inCBSMsg.set(ECC0081A010CBSMsg.NINSHO_STAT, NINSHO_NG);
				return;
			}
			
			// 取得したレコードの各項目に対してNULLチェック
			String user_id = rs.getString("USER_ID");
			String user_nm = rs.getString("USER_NM");
			String org_cd = rs.getString("ORG_CD");
			String position_cd = rs.getString("POSITION_CD");
			String org_nm = rs.getString("ORG_NM");
			String position_nm = rs.getString("POSITION_NM");
			
			// ユーザーIDの値がnullの場合
			if (!isCheck(inCBSMsg, user_id, ECC0081A010CBSMsg.USER_ID_ERR))
			{
				return;
			}
			// 組織コードの値がnullの場合
			if (!isCheck(inCBSMsg, org_cd, ECC0081A010CBSMsg.ORG_CD_ERR))
			{
				return;
			}
			// 立場コードの値がnullの場合
			if (!isCheck(inCBSMsg, position_cd, ECC0081A010CBSMsg.POSITION_CD_ERR))
			{
				return;
			}
			
			
			//----------------------------------------------------
			// ワンタイムパスワード管理テーブルの論理削除
			//----------------------------------------------------
			
			// ETMsgを新規に作成
			CAANMsg inETMsg = new CAANMsg("eo.ejb.cbm.entity.CC0081ETMsg");
			
			// 生成したETMsgに以下の値を設定
			// イベントID
			inETMsg.set(CC0081ETMsg.EVENTID, "ICC0081E001");
			// テンプレートID
			inETMsg.set(CC0081ETMsg.TEMPLATEID, inCBSMsg.getString(ECC0081A010CBSMsg.TEMPLATEID));
			// 識別コード
			inETMsg.set(CC0081ETMsg.IDENTIFYCD, inCBSMsg.getString(ECC0081A010CBSMsg.IDENTIFYCD));
			// ステータス
			inETMsg.set(CC0081ETMsg.STATUS, inCBSMsg.getInt(ECC0081A010CBSMsg.STATUS));
			// オペレータID
			inETMsg.set(CC0081ETMsg.OPERATORID, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATORID));
			// 運用日付
			inETMsg.set(CC0081ETMsg.OPERATEDATE, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATEDATE));
			// 運用日時
			inETMsg.set(CC0081ETMsg.OPERATEDATETIME, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATEDATETIME));
			// 権限制御用項目
			inETMsg.set(CC0081ETMsg.AC_GROUP_CD, inCBSMsg.getString(ECC0081A010CBSMsg.AC_GROUP_CD));
			// 機能コード
			inETMsg.set(CC0081ETMsg.FUNC_CODE, inCBSMsg.getString(ECC0081A010CBSMsg.FUNC_CODE));
			// ワンタイムパスワード
			inETMsg.set(CC0081ETMsg.ONET_PWD, inCBSMsg.getString(ECC0081A010CBSMsg.ONE_TIME_PWD));
			// システムコード
			// 2012/02/21 取得した外部システムコードで更新する start
			inETMsg.set(CC0081ETMsg.OUT_SYS_CD, rs.getString("OUT_SYS_CD"));
			// 2012/02/21 取得した外部システムコードで更新する start
			// 更新年月時分秒
			inETMsg.set(CC0081ETMsg.UPD_DTM, sys_dtm);
			// 更新オペレータアカウント
			inETMsg.set(CC0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATORID));
			// 削除年月日時分秒
			inETMsg.set(CC0081ETMsg.DEL_DTM, sys_dtm);
			// 削除オペレータアカウント
			inETMsg.set(CC0081ETMsg.DEL_OPEACNT, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATORID));
			// 無効フラグ
			inETMsg.set(CC0081ETMsg.MK_FLG, "1");
			
			// CC0081LEインスタンスオブジェクト生成
			JSYejbCC0081ETDA updateETMsg = new JSYejbCC0081ETDA();
			// 論理削除の実行
			updateETMsg.invoke(inETMsg, inContext);
			
			
			//----------------------------------------------------
			// 各項目の設定
			//----------------------------------------------------
			
			// inCBSMsgに以下の値を設定
			// 認証状態
			inCBSMsg.set(ECC0081A010CBSMsg.NINSHO_STAT, NINSHO_OK);
			// ユーザーID
			inCBSMsg.set(ECC0081A010CBSMsg.USER_ID, user_id);
			// ユーザー名
			inCBSMsg.set(ECC0081A010CBSMsg.USER_NM, user_nm);
			// 組織コード
			inCBSMsg.set(ECC0081A010CBSMsg.ORG_CD, org_cd);
			// 立場コード
			inCBSMsg.set(ECC0081A010CBSMsg.POSITION_CD, position_cd);
			// 組織名
			inCBSMsg.set(ECC0081A010CBSMsg.ORG_NM, org_nm);
			// 立場名
			inCBSMsg.set(ECC0081A010CBSMsg.POSITION_NM, position_nm);
			// 更新年月日時分秒
			inCBSMsg.set(ECC0081A010CBSMsg.UPD_DTM, sys_dtm);
			// 更新オペレータアカウント
			inCBSMsg.set(ECC0081A010CBSMsg.UPD_OPEACNT, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATORID));
			// 削除年月日時分秒
			inCBSMsg.set(ECC0081A010CBSMsg.DEL_DTM, sys_dtm);
			// 削除オペレータアカウント
			inCBSMsg.set(ECC0081A010CBSMsg.DEL_OPEACNT, inCBSMsg.getString(ECC0081A010CBSMsg.OPERATORID));
		}
		catch (SQLException e)
		{
			throw new JCCFrameworkException(e);
		}
		catch (Exception ex)
		{
			throw new JCCFrameworkException(ex);
		}
		finally
		{
			if (rs != null)
			{
				rs.close();
			}
			if (pstmt != null)
			{
				pstmt.close();
			}
// OM-2017-0000488 2017/05/26 ADD START
			if (con != null)
			{
				CAANConnectionMgr.getInstance().close(con);
			}
// OM-2017-0000488 2017/05/26 ADD END
		}
	}
	
	/**
	 * システムコード値の取得.<BR>
	 * 設定するシステムコードの値を判定する。
	 * 
	 * @param inContext 
	 * @return String型のデータ 
	 */
//	private static String getSysCdDate(AgentDispatchContext inContext)
//	{
//		String sysCd = "";
//		// "callType" を引数にして呼出した値が、"3"の場合
//		if ("3".equals(inContext.getClientHashMapObjectByKey("callType")))
//		{
//			// "INVOKE_GAMEN_ID" を引数にして呼出した値を格納
//			sysCd = inContext.getClientHashMapObjectByKey("INVOKE_GAMEN_ID").toString();
//		}
//		// 上記以外
//		else
//		{
//			// "K999"を格納
//			sysCd = "K999";
//		}
//		return sysCd;
//	}
	
	/**
	 * エラーフラグの設定.<BR>
	 * エラーを返却させたい項目にエラーフラグを設定する。
	 * 
	 * @param inCBSMsg 
	 * @param item エラーフラグを設定する項目
	 */
	private static boolean isCheck(CAANMsg inCBSMsg, String rs_date, String err_item)
	{
		if (rs_date != null)
		{
			return true;
		}
		// inCBSMsgの指定項目に"EA"を設定
		inCBSMsg.set(err_item, "EA");
		// inCBSMsg（ステータス）に「関連チェックでエラー」を設定
		inCBSMsg.set(ECC0081A010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		return false;
	}

}
