/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム構築
 *	モジュール名	：JCRejbCR0101SecProc
 *	ソースファイル名：JCRejbCR0101SecProc.java
 *	作成者			：富士通
 *	日付			：2011年06月04日
 *＜機能概要＞
 *	MYBOX副次処理部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

package eo.ejb.common.db;

import java.util.Arrays;

import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateSQLEntity;

import eo.common.constant.JCRStrConst;
import eo.common.util.JCRSortComparator;
import eo.common.util.JCRUtilCommon;
import eo.ejb.cbm.entity.CR0371ETMsg;
import eo.ejb.cbm.entity.CR0371LE;
import eo.ejb.cbm.entity.ZM0051ETMsg;
import eo.ejb.cbm.entity.ZM0051LE;
import eo.ejb.common.JCRModelCommon;
import eo.ejb.common.edit.JCRejbOracleSeqParts;

/**
 * ユーザー別問合せモニタワーク登録副次処理部品<p>
 * <BR>
 * @author 富士通
 */
public class JCRejbCR0371SecProc extends TemplateSQLEntity
{
	/**
	 * コンストラクタです。
	 */
	public JCRejbCR0371SecProc()
	{
		super();
	}

	/**
	 * ユーザー別問合せモニタワーク登録です。<br>
	 * <br>
	 * NGワードが存在した場合、ユーザー別問合せモニタワークにデータを新規登録する。
	 * 登録に失敗した場合、CAANCreateExceptionをthrowする。
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(ユーザー別問合せモニタワーク)
	 * @param inDatasbt データ種別コード
	 * @throws CAANException 
	 */
	public void addUserToiawaseMonitorWork(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inETMsg
			, String inDatasbt) throws CAANException
	{

		// (1) ユーザー名を取得する。
		String userNm = getUserNm(inETMsg.getString(CR0371ETMsg.USER_ID));

		// (2)ユーザー別問合せモニタワークの存在チェックを行う。
		if (isExist(inCBSMsg, inContext, inETMsg, inDatasbt))
		{
			return;
		}

		// (3) ユーザー別問合せモニタワーク登録処理 (1件)
		addEcr0371(inCBSMsg, inContext, inETMsg, inDatasbt, userNm);


	}

	/**
	 * ユーザー名を取得.<br>
	 * 
	 * @param inUserId ユーザID
	 * @return ユーザー名
	 * @throws CAANException CAANException
	 */
	private String getUserNm(String inUserId) throws CAANException
	{

		// ユーザーのETメッセージ
		CAANMsg zm0051ETMsg = new CAANMsg(ZM0051ETMsg.class.getName());
		
		// ユーザーのETメッセージに以下の内容を設定し ユーザーの一覧照会を行う。
		// ユーザーＩＤ
		zm0051ETMsg.set(ZM0051ETMsg.USER_ID, inUserId);
		// 無効フラグ
		zm0051ETMsg.set(ZM0051ETMsg.MK_FLG, "0");

		// ユーザーを検索する
		CAANMsg[] retUserMsg = new ZM0051LE().findByCondition(zm0051ETMsg);
		return retUserMsg[0].getString(ZM0051ETMsg.USER_NM);

	}

	/**
	 * ユーザー別問合せモニタワークの存在チェック.<br>
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(ユーザー別問合せモニタワーク)
	 * @param inDatasbt データ種別コード
	 * @return 存在フラグ（true：処理済みデータ存在、false：処理済みデータ未存在）
	 * @throws CAANException CAANException
	 * @throws CAANCreateException CAANCreateException
	 */
	private boolean isExist(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			CAANMsg inETMsg, String inDatasbt) throws CAANException, CAANCreateException
	{
		
		// 発生年月日
		String hasseiYmd = null;
		
		// ユーザー別問合せモニタワークのETメッセージ
		CAANMsg cr0371ETMsg = new CAANMsg(CR0371ETMsg.class.getName());

		// ユーザー別問合せモニタワークのETメッセージに以下の内容を設定し一覧照会を行う。
		// ユーザーID
		cr0371ETMsg.set(CR0371ETMsg.USER_ID, inETMsg.getString(CR0371ETMsg.USER_ID));
		// 対応記録番号
		cr0371ETMsg.set(CR0371ETMsg.TAIO_KIROK_NO, inETMsg.getString(CR0371ETMsg.TAIO_KIROK_NO));
		// データ種別コード
		cr0371ETMsg.set(CR0371ETMsg.DATA_SBT_CD, inDatasbt);

		// ユーザー別問合せモニタワークを検索する
		// 検索結果
		CAANMsg[] retUserToiawsmntwMsg = new CR0371LE().findByCondition(cr0371ETMsg);

		// 対象データが0件の場合、処理対象とする
		if (retUserToiawsmntwMsg == null || retUserToiawsmntwMsg.length == 0)
		{
			return false;
		}

		// 発生年月日で降順ソート
		Arrays.sort(retUserToiawsmntwMsg, new JCRSortComparator(
				CR0371ETMsg.HASSEI_DTM, JCRSortComparator.SORT_TYPE_DESC));

		// 発生年月日を取得する。
		hasseiYmd = JCRUtilCommon.formatDate(retUserToiawsmntwMsg[0].getString(
				CR0371ETMsg.HASSEI_DTM), JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMD);

		// ・ ユーザー別問合せモニタワークの「発生年月日時分秒」の発生年月日(yyyymmdd)とシステム日時(yyyymmdd)が一致する場合、
		//    同日発生データのため、(3)のユーザー別問合せモニタワーク登録処理を行わず処理を終了する。
		return JCRModelCommon.getSysDate().compareTo(hasseiYmd) == 0;
	}

	/**
	 * ユーザー別問合せモニタワーク登録処理.<br>
	 * ユーザー別問合せモニタワークを登録します。
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(ユーザー別問合せモニタワーク)
	 * @param inDatasbt データ種別コード
	 * @param inUserNm ユーザー名
	 * @throws CAANCreateException 
	 */
	private void addEcr0371(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			CAANMsg inETMsg, String inDatasbt, String inUserNm) throws CAANCreateException
	{
		
		// ユーザー別問合せモニタワークのETメッセージ
		CAANMsg addETMsg = new CAANMsg(CR0371ETMsg.class.getName());

		// 更新値システム日付14桁
		String sysDateTime = JCRModelCommon.getSysDateTime();
		// 更新値システム日付17桁
		String sysDateTimeStamp = JCRModelCommon.getSysDateTimeStamp();

		// ユーザー別問合せモニタワーク番号
		addETMsg.set(CR0371ETMsg.USER_TOIAWSMNTW_NO, JCRejbOracleSeqParts.getSeqNo(
				inCBSMsg, inContext, "SEQ_USER_TOIAWSMNTW_NO", "10", "1"));
		// 業務個別設定組織コード
		addETMsg.set(CR0371ETMsg.WKKBT_ORG_CD, inETMsg.getString(CR0371ETMsg.WKKBT_ORG_CD));
		// ユーザーID
		addETMsg.set(CR0371ETMsg.USER_ID, inETMsg.getString(CR0371ETMsg.USER_ID));
		// ユーザー名
		addETMsg.set(CR0371ETMsg.USER_NM, inUserNm);
		// 発生年月日時分秒
		addETMsg.set(CR0371ETMsg.HASSEI_DTM, sysDateTime);
		// 対応記録番号
		addETMsg.set(CR0371ETMsg.TAIO_KIROK_NO, inETMsg.getString(CR0371ETMsg.TAIO_KIROK_NO));
		// データ種別コード
		addETMsg.set(CR0371ETMsg.DATA_SBT_CD, inDatasbt);
		// データ処理コード
		addETMsg.set(CR0371ETMsg.DATA_TRN_CD, JCRStrConst.DATA_TRN_CD_MISHORI);
		// 登録年月日時分秒
		addETMsg.set(CR0371ETMsg.ADD_DTM, sysDateTimeStamp);
		// 登録オペレータアカウント
		addETMsg.set(CR0371ETMsg.ADD_OPEACNT, inETMsg.getString(CR0371ETMsg.ADD_OPEACNT));
		// 更新年月日時分秒
		addETMsg.set(CR0371ETMsg.UPD_DTM, sysDateTimeStamp);
		// 更新オペレータアカウント
		addETMsg.set(CR0371ETMsg.UPD_OPEACNT, inETMsg.getString(CR0371ETMsg.UPD_OPEACNT));
		// 無効フラグ
		addETMsg.set(CR0371ETMsg.MK_FLG, JCRStrConst.CD_DIV_MK_FLG_YUKO);

		create(addETMsg);

	}

    /**
     * このエンティティのスキーマの内容を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマのContents
     */
	@Override
	protected Object[][] getSchemaContents()
	{
		return CR0371ETMsg.getSchemaContents();
	}

    /**
     * このエンティティのスキーマの名を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマ名
     */
	@Override
	protected String getSchemaName()
	{
		return CR0371ETMsg.class.getName();
	}

    /**
     * このエンティティのスキーマの名を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマ名
     */
	@Override
	protected String getTableName()
	{
		return CR0371ETMsg.getTableName();
	}

}
