/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JECC0071C010TPMA
*	ソースファイル名：JECC0071C010TPMA.java
*	作成者			：富士通
*	日付			：2011年06月20日
*＜機能概要＞
*	ログイン時間更新サービスインターフェイスCBS主処理部品
*	キーとしてユーザーIDを受け取り、ログイン年月日時分秒と
*	ログイン状態を更新します。
*	ログイン管理テーブルにユーザーIDが登録されていない場合、
*	レコードを新規作成します。
*	
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/20	富士通		新規作成
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;
import com.fujitsu.futurity.model.ejb.common.ComPatternsCheck;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;

import eo.ejb.cbs.cbsmsg.ECC0071C010CBSMsg;
import eo.ejb.cbm.entity.CC0071ETMsg;
import eo.ejb.cbm.entity.CC0071SQLEntity;
import eo.ejb.cbm.entity.JSYejbCC0071ETDA;
import eo.ejb.common.EventIDList;
import eo.ejb.common.JSYejbSysDate;
import eo.ejb.domain.JSYejbBaseDomain;
import eo.common.util.JCCFrameworkException;

public class JECC0071C010TPMA implements TemplateMainHandler {
	/**
	 * レコード挿入処理成功
	 */
	private static final int  RET_INSERT_SUCCESS=0;
	/**
	 * レコード挿入処理失敗（一意制約違反）
	 */
	private static final int  RET_INSERT_DUPLICATION=1;
	/**
	 * リサルトコード（一意制約違反）
	 */
	private static final String RESULTCODE_DUPLICATION="MSG00110";
	/**
	 * コンストラクタです。
	 */
	public JECC0071C010TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * ユーザーIDごとのログイン年月日時分秒およびログインフラグを更新します。<br>
	 * ログイン管理テーブルに該当ユーザーIDが存在しない場合、レコードを挿入します。<br>
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String	sFuncCode;					// 機能コード
		String	sBefLoginFlg;				// 遷移前ログインフラグ
		String	sAftLoginFlg;				// 遷移後ログインフラグ
		String	sBefLoginDtm;				// 更新前ログイン年月日時分秒（String）
		String	sTblLoginDtm;				// DB上のログイン年月日時分秒（String）
		String	sMkFlg;						// 無効フラグ
		int	iResultInsert;					// レコード挿入の結果
		JCCFrameworkException fe;			// 例外通知クラス
		CC0071SQLEntity			sqlET;		// SQLエンティティ
		CAANMsg					inETMsg;	// エンティティメッセージ（検索条件）
		CAANMsg					outETMsg;	// エンティティメッセージ（検索結果）
		
		//---------------------------------------
		// (1) パラメータチェック処理
		//---------------------------------------
		//チェック対象項目の配列
		final String[][] tmckArgs = {
			//{項目,項目エラー,必須ErrFlg,ドメインErrFlg,桁ErrFlg,リファErrFlg,必須CHK区分,ドメインID,桁CHK区分,桁From,桁to,リファ型,リファレンス値}
			{ECC0071C010CBSMsg.USER_ID,   ECC0071C010CBSMsg.USER_ID_ERR,   "E1", "E2", "E3", "",   "1", "C0000197", "1", "", "", "0", "" },
			{ECC0071C010CBSMsg.LOGIN_FLG, ECC0071C010CBSMsg.LOGIN_FLG_ERR, "E1", "E2", "E3", "",   "1", "C0000022", "1", "", "", "0", "" },
			{ECC0071C010CBSMsg.LOGIN_DTM_BF, ECC0071C010CBSMsg.LOGIN_DTM_BF_ERR, "E1", "E2", "E3", "",   "1", "C0000004", "1", "", "", "0", "" }
		};
		final String[][] strArMsg = createTMCKArgs(tmckArgs);
		
		// (1)-1 単項目チェック相当のチェックを行う
		ComPatternsCheck.check(inContext, inCBSMsg, strArMsg, ECC0071C010CBSMsg.STATUS);
		// (1)-2 ユーザーIDが不正の場合、システムエラーを通知する。
		if ( inCBSMsg.getString(ECC0071C010CBSMsg.USER_ID_ERR) != null )
		{
			// システムエラーを通知する。
			fe = new JCCFrameworkException("サービスインターフェイスパラメータ["
						+ ECC0071C010CBSMsg.USER_ID + "]で指定された["
						+ inCBSMsg.getString(ECC0071C010CBSMsg.USER_ID)
						+ "]は、ユーザーIDとして無効な値です。");
			throw new CAANRuntimeException(fe);
		}
		// (1)-3 遷移後のログインフラグ（ログインフラグ）が不正
		//       （"0","1"以外）の場合
		if (  inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_FLG_ERR) != null   )
		{
			// システムエラーを通知する。
			fe = new JCCFrameworkException("サービスインターフェイスパラメータ["
					+ ECC0071C010CBSMsg.LOGIN_FLG + "]で指定された["
					+ inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_FLG)
					+ "]は、ログインフラグとして無効な値です。");
			throw new CAANRuntimeException(fe);
		}
		
		// (1)-4 前回ログイン時間が不正の場合
		if( inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_DTM_BF_ERR) != null )
		{
			// システムエラーを通知する。
			fe = new JCCFrameworkException("サービスインターフェイスパラメータ["
					+ ECC0071C010CBSMsg.LOGIN_DTM_BF + "]で指定された["
					+ inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_DTM_BF)
					+ "]は、ログイン年月日時分秒として無効な値です。");
			throw new CAANRuntimeException(fe);
		}
		
		sFuncCode = inCBSMsg.getString(ECC0071C010CBSMsg.FUNC_CODE);
//		try
//		{
			//---------------------------------------
			// (2) 該当レコード抽出およびロック処理
			//---------------------------------------
			inETMsg = new CAANMsg(CC0071ETMsg.class.getName());
			inETMsg.set(CC0071ETMsg.USER_ID, inCBSMsg.getString(ECC0071C010CBSMsg.USER_ID));
			sqlET = new CC0071SQLEntity();
			outETMsg = sqlET.findByKeyForUpdate(inETMsg);
			
			//---------------------------------------
			// (3) 抽出件数が1件の場合
			//---------------------------------------
			if ( outETMsg != null )
			{
				//---------------------------------------
				// (3)-1 ログイン状態チェック処理
				//---------------------------------------
				// (3)-1-1 検索結果から以下を取得する。
				//           ・遷移前のログインフラグ
				//           ・DB上のログイン年月日時分秒
				//           ・無効フラグ
				sBefLoginFlg = outETMsg.getString(CC0071ETMsg.LOGIN_FLG);
				sTblLoginDtm = outETMsg.getString(CC0071ETMsg.LOGIN_DTM);
				sMkFlg       = outETMsg.getString(CC0071ETMsg.MK_FLG);
				
				// (3)-1-2 CBSメッセージから以下を取得する。
				//           ・遷移後のログインフラグ
				//           ・前回ログイン年月日時分秒
				sAftLoginFlg = inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_FLG);
				sBefLoginDtm = inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_DTM_BF);
				// (3)-1-3 SQL抽出結果から取得した無効フラグが"1"（無効）の場合
				if ( "1".equals(sMkFlg)    )
				{
					// 以下のエラーを設定して復帰する。
					//      設定項目：ユーザーID
					//      設定値  ："EB"（ユーザーIDが無効）
					// ※ SELECTの時点で無効フラグ"0"を条件に指定すると、
					//    無効フラグ"1"の場合にレコードを追加してしまうため
					//    ここで検出する。
					// 関連チェックエラー
					inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					inCBSMsg.set(ECC0071C010CBSMsg.USER_ID_ERR, "EB");
					return;
				}
				// (3)-1-4 ログインフラグの状態遷移が以下である場合
				//           ・遷移前"1"（ログイン中）
				//           ・遷移後"1"（ログイン中）
				else if ( "1".equals(sBefLoginFlg) &&
				           "1".equals(sAftLoginFlg) )
				{
					// 機能コードが"2"（チェックのみ）の場合
					if( "2".equals(sFuncCode) )
					{
						// 以下のエラーを設定して復帰する。
						//      設定項目：ログインフラグ
						//      設定値  ："EC"（別クライアントからログイン済み）
						// 状態遷移チェックエラー
						inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
						inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG_ERR, "EC");
						return;
					}
				}
				// (3)-1-5 ログインフラグの状態遷移が以下である場合
				//           ・遷移前"0"（ログアウト中）
				//           ・遷移後"0"（ログアウト中）
				else if ("0".equals(sBefLoginFlg) &&
				          "0".equals(sAftLoginFlg) )
				{
					// 以下のエラーを設定して復帰する。
					//      設定項目：ログインフラグ
					//      設定値  ："EA"（未ログイン状態でログアウトが行われた）
					// 状態遷移チェックエラー
					inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
					inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG_ERR, "EA");
					return;
				}
				// (3)-1-6 ログインフラグの状態遷移が以下である場合
				//           ・遷移前"1"（ログイン中）
				//           ・遷移後"0"（ログアウト中）
				else if ( "1".equals(sBefLoginFlg) &&
				           "0".equals(sAftLoginFlg) )
				{
					// 機能コードが"2"（チェックのみ）、かつ
					// 前回ログイン年月日時分秒がテーブル上のログイン年月日時分秒と一致しない場合
					if ( "2".equals(sFuncCode) &&
					     ! sTblLoginDtm.equals(sBefLoginDtm) )
					{
						// 以下のエラーを設定して復帰する。
						//      設定項目：ログインフラグ
						//      設定値  ："EC"（別クライアントからログイン済み）
						// 状態遷移チェックエラー
						inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
						inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG_ERR, "EC");
						return;
					}
				}
				// (3)-1-7 ログインフラグの状態遷移が以下ではない場合
				//           ・遷移前"0"（ログアウト中）
				//           ・遷移後"1"（ログイン中）
				else if ( ! "0".equals(sBefLoginFlg) ||
				           ! "1".equals(sAftLoginFlg) )
				{
					// 以下のエラーを設定して復帰する。
					//      設定項目：ログインフラグ
					//      設定値  ："EB"（無効な状態遷移）
					// 状態遷移チェックエラー
					inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
					inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG_ERR, "EB");
					return;
				}
				//---------------------------------------
				// (3)-2 レコード更新処理
				//---------------------------------------
				// 機能コードが"1"（チェック&更新）の場合
				// 該当ユーザーIDのレコードを更新する。
				if ( "1".equals(sFuncCode))
				{
					updateLoginKanri(inContext, inCBSMsg, outETMsg);
				}
			}
			//---------------------------------------
			// (4) 抽出件数が0件の場合
			//---------------------------------------
			else
			{
				//---------------------------------------
				// (4)-1 ログイン状態チェック処理
				//---------------------------------------
				// (4)-1-1 CBSメッセージから以下を取得する。
				//           ・機能コード
				//           ・遷移後のログインフラグ
				sFuncCode = inCBSMsg.getString(ECC0071C010CBSMsg.FUNC_CODE);
				sAftLoginFlg = inCBSMsg.getString(ECC0071C010CBSMsg.LOGIN_FLG);
				// (4)-1-2 遷移後のログインフラグが"0"（ログアウト）の場合、
				//       システムエラーを通知する。
				if       ( "0".equals(sAftLoginFlg) )
				{
					fe = new JCCFrameworkException(
							"ログイン管理テーブルに存在しないユーザー["
							+ inCBSMsg.getString(ECC0071C010CBSMsg.USER_ID)
							+ "]からのログアウト要求を受けました。");
					throw new CAANRuntimeException(fe);
				}
				// (4)-1-3 遷移後のログインフラグが"1"（ログイン）以外の場合
				else if ( ! "1".equals(sAftLoginFlg) )
				{
					// 以下のエラーを設定して復帰する。
					//      設定項目：ログインフラグ
					//      設定値  ："EB"（無効な状態遷移）
					// 状態遷移チェックエラー
					inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.STATUSTRANS_ERR);
					inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG_ERR, "EB");
				}
				//---------------------------------------
				// (4)-2 レコード挿入処理
				//---------------------------------------
				// 機能コードが"1"（チェック&更新）の場合
				if       ( "1".equals(sFuncCode) )
				{
					// (4)-2-1 該当ユーザーIDのレコードを挿入する。
					iResultInsert = insertLoginKanri(inContext, inCBSMsg);
					// (4)-2-2 一意制約違反が発生した場合
					if ( iResultInsert == RET_INSERT_DUPLICATION )
					{
						// 以下のエラーを設定して復帰する。
						//      設定項目：ユーザーID
						//      設定値  ："EA"（別クライアントからログイン中）
						// 関連チェックエラー
						inCBSMsg.set(ECC0071C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
						inCBSMsg.set(ECC0071C010CBSMsg.USER_ID_ERR, "EA");
						return;
					}
				}
			}
//		}
//		// 例外を検出した場合
//		catch (Exception e)
//		{
//			// システムエラーを通知する。
//			throw new CAANRuntimeException(e);
//		}
	}
	
	/*
	 * <p>
	 * ログイン管理テーブルのレコードを更新します。<br>
	 * 更新したレコードの内容は、CBSメッセージに格納します。<br>
	 *     <table><caption>更新条件</caption>
	 *     <tr><th>カラム</th><th>比較値</th><th>比較方法</th></tr>
	 *     <tr><td>ユーザーID</td><td>サービスインターフェイスパラメータの値</td>
	 *         <td>完全一致</td></tr></table>
	 *     <br>
	 *     <table><caption>更新値</caption>
	 *     <tr><th>カラム</th>              <th>設定値</th></tr>
	 *     <tr><td>ログイン年月日時分秒</td><td>サービスインターフェイスパラメータの値</td></tr>
	 *     <tr><td>ログインフラグ</td>      <td>サービスインターフェイスパラメータの値</td></tr>
	 *     <tr><td>更新年月日時分秒</td>    <td>システム日時</td></tr>
	 *     <tr><td>更新オペレータID</td>    <td>オペレータID</td></tr></table>
	 * </p>
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inCBSMsg CBSメッセージ
	 * @param selectETMsg 更新対象レコードをSELECTした時のエンティティメッセージ
	 * @author FST）伊藤
	 */
	private void updateLoginKanri(AgentDispatchContext inContext, CAANMsg inCBSMsg, CAANMsg selectETMsg)
	{
		CAANMsg					inETMsg;		// エンティティメッセージ
		JSYejbCC0071ETDA		dbaCC0071;		// DBアクセス部品

		//-----------------------------------------
		// (1) 更新レコード内容設定処理
		//-----------------------------------------
		inETMsg = new CAANMsg(CC0071ETMsg.class.getName());
		
		// イベントID
		inETMsg.set(CC0071ETMsg.EVENTID, EventIDList.ICC0071C001);
		// テンプレート項目
		inETMsg.set(CC0071ETMsg.TEMPLATEID, inCBSMsg.getObject(ECC0071C010CBSMsg.TEMPLATEID));
		inETMsg.set(CC0071ETMsg.IDENTIFYCD, inCBSMsg.getObject(ECC0071C010CBSMsg.IDENTIFYCD));
		inETMsg.set(CC0071ETMsg.STATUS, inCBSMsg.getObject(ECC0071C010CBSMsg.STATUS));
		inETMsg.set(CC0071ETMsg.OPERATORID, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATORID));
		inETMsg.set(CC0071ETMsg.OPERATEDATE, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATEDATE));
		inETMsg.set(CC0071ETMsg.OPERATEDATETIME, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATEDATETIME));
		inETMsg.set(CC0071ETMsg.AC_GROUP_CD, inCBSMsg.getObject(ECC0071C010CBSMsg.AC_GROUP_CD));
		inETMsg.set(CC0071ETMsg.FUNC_CODE, inCBSMsg.getObject(ECC0071C010CBSMsg.FUNC_CODE));

		// 個別項目
		inETMsg.set(CC0071ETMsg.USER_ID,inCBSMsg.getObject(ECC0071C010CBSMsg.USER_ID));
		inETMsg.set(CC0071ETMsg.LOGIN_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsg.set(CC0071ETMsg.LOGIN_FLG,inCBSMsg.getObject(ECC0071C010CBSMsg.LOGIN_FLG));
		inETMsg.set(CC0071ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsg.set(CC0071ETMsg.UPD_OPEACNT,inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATORID));

		//-----------------------------------------
		// (2) レコード更新処理
		//-----------------------------------------
		dbaCC0071 = new JSYejbCC0071ETDA();
		dbaCC0071.invoke( inETMsg, inContext );
		
		//-----------------------------------------
		// (3) 返却レコード設定処理
		//-----------------------------------------
		// (3)-1 検索結果からの転記
		inCBSMsg.set(ECC0071C010CBSMsg.USER_ID, selectETMsg.getString(CC0071ETMsg.USER_ID));
		inCBSMsg.set(ECC0071C010CBSMsg.ADD_DTM, selectETMsg.getString(CC0071ETMsg.ADD_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.ADD_OPEACNT, selectETMsg.getString(CC0071ETMsg.ADD_OPEACNT));
		inCBSMsg.set(ECC0071C010CBSMsg.DEL_DTM, selectETMsg.getString(CC0071ETMsg.DEL_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.DEL_OPEACNT, selectETMsg.getString(CC0071ETMsg.DEL_OPEACNT));
		inCBSMsg.set(ECC0071C010CBSMsg.MK_FLG, selectETMsg.getString(CC0071ETMsg.MK_FLG));

		// (3)-2 更新内容からの転記
		inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_DTM, inETMsg.getString(CC0071ETMsg.LOGIN_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG, inETMsg.getString(CC0071ETMsg.LOGIN_FLG));
		inCBSMsg.set(ECC0071C010CBSMsg.UPD_DTM, inETMsg.getString(CC0071ETMsg.UPD_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.UPD_OPEACNT, inETMsg.getString(CC0071ETMsg.UPD_OPEACNT));
	}
	
	/*
	 * <p>
	 * ログイン管理テーブルに、以下のレコードを挿入します。<br>
	 * 挿入したレコードの内容は、CBSメッセージに格納します。<br>
	 *     <table><caption>レコード初期値</caption>
	 *     <tr><th>カラム</th>              <th>設定値</th></tr>
	 *     <tr><td>ユーザーID</td>          <td>サービスインターフェイスパラメータの値</td></tr>
	 *     <tr><td>ログイン年月日時分秒</td><td>サービスインターフェイスパラメータの値</td></tr>
	 *     <tr><td>ログインフラグ</td>      <td>サービスインターフェイスパラメータの値</td></tr>
	 *     <tr><td>登録年月日時分秒</td>    <td>システム日時</td></tr>
	 *     <tr><td>登録オペレータID</td>    <td>オペレータID</td></tr>
	 *     <tr><td>更新年月日時分秒</td>    <td>システム日時</td></tr>
	 *     <tr><td>更新オペレータID</td>    <td>オペレータID</td></tr>
	 *     <tr><td>無効フラグ</td>          <td>'0'（有効）</td></tr></table>
	 * </p>
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inCBSMsg CBSメッセージ
	 * @return <DL>
	 *           <DT>RET_INSERT_SUCCESS</DT> <DD>成功</DD>
	 *           <DT>RET_INSERT_PK_ERROR</DT><DD>一意制約違反を検出</DD>
	 *         </DL>
	 * @author FST）伊藤
	 */
	private int insertLoginKanri( AgentDispatchContext inContext, CAANMsg inCBSMsg)
	{
		CAANMsg					inETMsg;		// エンティティメッセージ
		JSYejbCC0071ETDA		dbaCC0071;		// DBアクセス部品

		//-----------------------------------------
		// (1) 更新レコード内容設定処理
		//-----------------------------------------
		// (1)-1 エンティティメッセージを作成する。メッセージの内容は以下の通り。
		//       イベントID          ：ICC0071C001（ログイン管理テーブル更新）
		//       テンプレート項目    ：CBSメッセージから転記
		//       ユーザーID          ：CBSメッセージから転記
		//       ログイン年月日時分秒：システム日付から取得
		//       ログインフラグ      ：CBSメッセージから転記
		//       更新年月日時分秒    ：システム日付から取得
		//       更新オペレータアカウント：CBSメッセージのオペレータアカウント
		inETMsg = new CAANMsg(CC0071ETMsg.class.getName());

		// イベントID
		inETMsg.set(CC0071ETMsg.EVENTID, EventIDList.ICC0071D001);
		// テンプレート項目
		inETMsg.set(CC0071ETMsg.TEMPLATEID,  inCBSMsg.getObject(ECC0071C010CBSMsg.TEMPLATEID));
		inETMsg.set(CC0071ETMsg.IDENTIFYCD,  inCBSMsg.getObject(ECC0071C010CBSMsg.IDENTIFYCD));
		inETMsg.set(CC0071ETMsg.STATUS,      inCBSMsg.getObject(ECC0071C010CBSMsg.STATUS));
		inETMsg.set(CC0071ETMsg.OPERATORID,  inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATORID));
		inETMsg.set(CC0071ETMsg.OPERATEDATE, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATEDATE));
		inETMsg.set(CC0071ETMsg.OPERATEDATETIME, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATEDATETIME));
		inETMsg.set(CC0071ETMsg.AC_GROUP_CD, inCBSMsg.getObject(ECC0071C010CBSMsg.AC_GROUP_CD));
		inETMsg.set(CC0071ETMsg.FUNC_CODE,   inCBSMsg.getObject(ECC0071C010CBSMsg.FUNC_CODE));
		// 個別項目
		inETMsg.set(CC0071ETMsg.USER_ID,     inCBSMsg.getObject(ECC0071C010CBSMsg.USER_ID));
		inETMsg.set(CC0071ETMsg.LOGIN_DTM,   JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsg.set(CC0071ETMsg.LOGIN_FLG,   inCBSMsg.getObject(ECC0071C010CBSMsg.LOGIN_FLG));
		inETMsg.set(CC0071ETMsg.ADD_DTM,     JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsg.set(CC0071ETMsg.ADD_OPEACNT, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATORID));
		inETMsg.set(CC0071ETMsg.UPD_DTM,     JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		inETMsg.set(CC0071ETMsg.UPD_OPEACNT, inCBSMsg.getObject(ECC0071C010CBSMsg.OPERATORID));
		inETMsg.set(CC0071ETMsg.MK_FLG,"0");

		//-----------------------------------------
		// (2) レコード挿入処理
		//-----------------------------------------
		dbaCC0071 = new JSYejbCC0071ETDA();
		try
		{
			dbaCC0071.invoke(inETMsg, inContext);
		}
		//-----------------------------------------
		// (3) 挿入結果確認処理
		//-----------------------------------------
		catch(CAANRuntimeException cre)
		{
			// 一意制約違反を検出した場合、復帰値で通知する。
			Exception cause = cre.getCausedByException();
			if ( cause instanceof CAANCreateException)
			{
				if ( RESULTCODE_DUPLICATION.equals( ((CAANCreateException)cause).getResult() ) )
				{
					return RET_INSERT_DUPLICATION;
				}
			}
			// その他の例外を検出した場合、システムエラーを通知する。
			throw cre;
		}
			
		//-----------------------------------------
		// (4) 返却レコード設定処理
		//-----------------------------------------
		inCBSMsg.set(ECC0071C010CBSMsg.USER_ID, inETMsg.getString(CC0071ETMsg.USER_ID));
		inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_DTM, inETMsg.getString(CC0071ETMsg.LOGIN_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.LOGIN_FLG, inETMsg.getString(CC0071ETMsg.LOGIN_FLG));
		inCBSMsg.set(ECC0071C010CBSMsg.ADD_DTM, inETMsg.getString(CC0071ETMsg.ADD_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.ADD_OPEACNT, inETMsg.getString(CC0071ETMsg.ADD_OPEACNT));
		inCBSMsg.set(ECC0071C010CBSMsg.UPD_DTM, inETMsg.getString(CC0071ETMsg.UPD_DTM));
		inCBSMsg.set(ECC0071C010CBSMsg.UPD_OPEACNT, inETMsg.getString(CC0071ETMsg.UPD_OPEACNT));
		inCBSMsg.set(ECC0071C010CBSMsg.MK_FLG, inETMsg.getString(CC0071ETMsg.MK_FLG));

		//-----------------------------------------
		// (5) 復帰処理
		//-----------------------------------------
		// 復帰値で更新成功を通知する。
		return RET_INSERT_SUCCESS;
	}
	/**
	 * 単項目制約定義とドメイン定義から、単項目チェック定義を生成<br>
	 * ※ 本メソッドは自動生成された単項目チェック部品の内部メソッドのコピーです。
	 * @param args 単項目制約定義情報
	 * @return	単項目制約情報（単項目チェック部品へ引き渡すチェック用パラメタ配列）
	 *
	 */
	private String[][] createTMCKArgs(String[][] args) {
		
		ArrayList tmckList = new ArrayList();
		for ( int i=0; i< args.length; i++ ) {
			ArrayList tmckRec = new ArrayList();
			String[] komokuDef = args[i];
			String domainID = komokuDef[7];
			String domainCls = "eo.ejb.domain.JSYejb" + domainID + "Domain";
			try {
				JSYejbBaseDomain domain =
					(JSYejbBaseDomain) Class.forName(domainCls).newInstance();
				tmckRec = domain.getTmckDefine(komokuDef);
				for (int p=0;p<tmckRec.size();p++) {
					tmckList.add(tmckRec.get(p));
				}
			} catch (Exception e) {
			}
		}
	
		return (String[][])tmckList.toArray(new String[tmckList.size()][0]);
	
	}
}