/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// 期限回数つきアサイン登録アクションクラス。
// 
//
//	変更履歴
//	2004/01/08  新規作成	T.Nishiki
//
package jp.co.ntt.lms.xms.assign;

import java.util.Date;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.util.XMODate;
import jp.co.ntt.lms.xms.framework.XmsBusinessAction;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;
import jp.co.ntt.lms.xms.common.mail.InputFrameErrorBean;
import jp.co.ntt.lms.xms.common.mail.MailTemplateConstant;
import jp.co.ntt.lms.xms.common.mail.SendUser;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.common.util.CommonUtil;
import jp.co.ntt.lms.xms.common.util.DateUtil;
import jp.co.ntt.lms.xms.common.util.StringUtil;
//	ADD 2005/03/28 START Kentaro Ishizaki [メソッド管理追加]
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
//	ADD 2005/03/28 END Kentaro Ishizaki [メソッド管理追加]

/**
 * 期限回数つきアサイン登録アクションクラス。<br>
 * @author T.Nishiki
 */
public class CustomAssignRegistBusinessAction extends XmsBusinessAction {

	/**
	 * リクエスト処理初期化処理メソッド。<br>
	 * @param xmsRequest リクエスト・パラメータ。
	 */
	protected void initProcessRequest(XmsRequest xmsRequest)
		throws XmsException {

	}

	/**
	 * リクエスト処理処理メソッド。<br>
	 * @param xmsRequest リクエスト・パラメータ。
	 * @param xmsResponse レスポンス・パラメータ。
	 */
	protected void processRequest(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {
		// 入力情報
		CustomAssignInputBean inputBean = null;
		// このアクションのデータクラス
		CustomAssignRegistBusinessBean businessBean = null;
		// ログインユーザ・ユーザオブジェクト
		User user = null;
		// アサインしたユーザID
		Vector assignUserIDs = null;

		try {
			businessBean = new CustomAssignRegistBusinessBean();
			xmsResponse.setBusinessBean(businessBean);
			////////////////////////////////////////////////////////////////////
			// リクエストパラメータの取得
			inputBean = getInputBean(xmsRequest);
			businessBean.setInputBean(inputBean);
			////////////////////////////////////////////////////////////////////
			// ユーザオブジェクトを取得
			user = CommonUtil.getLoginUser(xmsRequest);
			if (user == null) {
				throw new XmsWarningException("");
			}
			////////////////////////////////////////////////////////////////////
			// リクエストパラメータのチェック
			checkInputBean(xmsRequest, xmsResponse, inputBean);

			////////////////////////////////////////////////////////////////////
			// アサイン処理
			// =================================================================
			// 新規作成
			if (inputBean.getOperation()
				== CustomAssignConstant.OPERATION_NEW) {
				assignUserIDs = insert(inputBean, user);
			}
			// =================================================================
			// 更新
			else {
				assignUserIDs = update(inputBean, user);
			}
			// ＬＯアサイン対象グループ／人ＩＤ
			String personnelID = null;
			personnelID = inputBean.getPersonnelId();
			// ＬＯアサイン対象が人ならば、assignUserIDsを上書き
			if ( CommonUtil.isUserID(personnelID) == true ) {
				assignUserIDs = new Vector();
				assignUserIDs.add(personnelID);
			}
			////////////////////////////////////////////////////////////////////
			// セッションから不要となった入力情報を削除
			CommonUtil.removeSessionData(xmsRequest,
				CustomAssignConstant.KEY_INPUT_BEAN);
			////////////////////////////////////////////////////////////////////
			// メール送信処理
			// =================================================================
			if (inputBean.isSubmitMail() == false) {
				// メール送信しない場合、メール送信なしの終了処理へ。
				xmsResponse.setBusinessStatus(
					CustomAssignConstant.STATUS_NO_MAIL);
			} else if (assignUserIDs == null || assignUserIDs.size() == 0) {
				// 送信対象者が存在しない場合、メール送信なしの終了処理へ。
				xmsResponse.setBusinessStatus(
					CustomAssignConstant.STATUS_NO_MAIL);
			} else {
				// アサインしたLOID
				String assignLoID = inputBean.getLoId();
				// 送信対象者が存在する場合、情報をセッションに登録。
				setUserInformationToSession(xmsRequest, assignUserIDs, assignLoID);
			}
		} catch (XmsException e) {
			setErrorInformation(
				xmsRequest,
				xmsResponse,
				inputBean,
				e.getMessage());
		} catch (Exception e) {
			DebugLog.write(
				CustomAssignRegistBusinessAction.class,
				"Exception occured at processRequest:" + e,
				DebugLog.HIGHT);
			throw new XmsInnerException(e);
		}
	}

	/**
	 * 送信されてきた情報から、CustomAssignInputBeanを生成する。<br>
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @return 生成したCustomAssignInputBeanオブジェクト。
	 */
	private CustomAssignInputBean getInputBean(XmsRequest xmsRequest)
		throws XmsException {
		// このメソッドの戻り値。
		CustomAssignInputBean inputBean = null;
		// リクエスト・パラメータ取得用。
		HttpServletRequest request = null;
		try {
			inputBean = new CustomAssignInputBean();
			request = xmsRequest.getRequest();
			// =================================================================
			// 新規／更新区別
			String operation = null;
			int intOperation = 0;
			operation = request.getParameter(CustomAssignConstant.NAME_OPERATE);
			intOperation =
				StringUtil.parseInt(
					operation,
					CustomAssignConstant.OPERATION_NEW);
			inputBean.setOperation(intOperation);
			// =================================================================
			// 親ＬＯＩＤ
			String parentLoId = null;
			parentLoId =
				request.getParameter(CustomAssignConstant.PARENT_LO_ID);
			inputBean.setParentLoId(parentLoId);
			// =================================================================
			// ＬＯＩＤ
			String loId = null;
			loId = request.getParameter(CustomAssignConstant.LO_ID);
			inputBean.setLoId(loId);
			// =================================================================
			// 親グループＩＤ
			String parentGroupId = null;
			parentGroupId =
				request.getParameter(CustomAssignConstant.PARENT_GROUP_ID);
			inputBean.setParentGroupId(parentGroupId);
			// =================================================================
			// グループ／人ＩＤ
			String personnelId = null;
			personnelId =
				request.getParameter(CustomAssignConstant.PERSONNEL_ID);
			inputBean.setPersonnelId(personnelId);
			// =================================================================
			// アサイン種別。初期値はなし
			String assort = null;
			int intAssort = 0;
			assort = request.getParameter(CustomAssignConstant.NAME_ASSORT);
			intAssort =
				StringUtil.parseInt(
					assort,
					CustomAssignConstant.ASSORT_TYPE_LEARN);
			inputBean.setAssortType(intAssort);
			// =================================================================
			// 開始日時（制限有無）。初期値は制限なし
			String startLimit = null;
			int intStartLimit = 0;
			startLimit =
				request.getParameter(CustomAssignConstant.NAME_START_LIMIT);
			intStartLimit =
				StringUtil.parseInt(
					startLimit,
					CustomAssignConstant.PERIOD_START_NO_LIMITED);
			inputBean.setPeriodStartLimited(
				intStartLimit == CustomAssignConstant.PERIOD_START_LIMITED);
			// =================================================================
			// 開始日時（年）
			String startYear = null;
			int intStartYear = 0;
			startYear =
				request.getParameter(CustomAssignConstant.NAME_START_YEAR);
			intStartYear = StringUtil.parseInt(startYear, 0);
			inputBean.setPeriodStartYear(intStartYear);
			// =================================================================
			// 開始日時（月）
			String startMonth = null;
			int intStartMonth = 0;
			startMonth =
				request.getParameter(CustomAssignConstant.NAME_START_MONTH);
			intStartMonth = StringUtil.parseInt(startMonth, 0);
			inputBean.setPeriodStartMonth(intStartMonth);
			// =================================================================
			// 開始日時（日）
			String startDay = null;
			int intStartDay = 0;
			startDay =
				request.getParameter(CustomAssignConstant.NAME_START_DAY);
			intStartDay = StringUtil.parseInt(startDay, 0);
			inputBean.setPeriodStartDay(intStartDay);
			// =================================================================
			// 開始日時（時）
			String startHour = null;
			int intStartHour = 0;
			startHour =
				request.getParameter(CustomAssignConstant.NAME_START_HOUR);
			intStartHour = StringUtil.parseInt(startHour, 0);
			inputBean.setPeriodStartHour(intStartHour);
			// =================================================================
			// 開始日時（分）
			String startMinute = null;
			int intStartMinute = 0;
			startMinute =
				request.getParameter(CustomAssignConstant.NAME_START_MINUTE);
			intStartMinute = StringUtil.parseInt(startMinute, 0);
			inputBean.setPeriodStartMinute(intStartMinute);
			// =================================================================
			// 終了日時（制限有無）。初期値は制限なし
			String endLimit = null;
			int intEndLimit = 0;
			endLimit =
				request.getParameter(CustomAssignConstant.NAME_END_LIMIT);
			intEndLimit =
				StringUtil.parseInt(
					endLimit,
					CustomAssignConstant.PERIOD_END_NO_LIMITED);
			inputBean.setPeriodEndLimited(
				intEndLimit == CustomAssignConstant.PERIOD_END_LIMITED);
			// =================================================================
			// 終了日時（年）
			String endYear = null;
			int intEndYear = 0;
			endYear = request.getParameter(CustomAssignConstant.NAME_END_YEAR);
			intEndYear = StringUtil.parseInt(endYear, 0);
			inputBean.setPeriodEndYear(intEndYear);
			// =================================================================
			// 終了日時（月）
			String endMonth = null;
			int intEndMonth = 0;
			endMonth =
				request.getParameter(CustomAssignConstant.NAME_END_MONTH);
			intEndMonth = StringUtil.parseInt(endMonth, 0);
			inputBean.setPeriodEndMonth(intEndMonth);
			// =================================================================
			// 終了日時（日）
			String endDay = null;
			int intEndDay = 0;
			endDay = request.getParameter(CustomAssignConstant.NAME_END_DAY);
			intEndDay = StringUtil.parseInt(endDay, 0);
			inputBean.setPeriodEndDay(intEndDay);
			// =================================================================
			// 終了日時（時）
			String endHour = null;
			int intEndHour = 0;
			endHour = request.getParameter(CustomAssignConstant.NAME_END_HOUR);
			intEndHour = StringUtil.parseInt(endHour, 0);
			inputBean.setPeriodEndHour(intEndHour);
			// =================================================================
			// 終了日時（分）
			String endMinute = null;
			int intEndMinute = 0;
			endMinute =
				request.getParameter(CustomAssignConstant.NAME_END_MINUTE);
			intEndMinute = StringUtil.parseInt(endMinute, 0);
			inputBean.setPeriodEndMinute(intEndMinute);
			// =================================================================
			// 学習回数制限。初期値は制限なし
			String countLimit = null;
			int intCountLimit = 0;
			countLimit =
				request.getParameter(CustomAssignConstant.NAME_COUNT_LIMIT);
			intCountLimit =
				StringUtil.parseInt(
					countLimit,
					CustomAssignConstant.COUNT_NO_LIMITED);
			inputBean.setCountLimited(
				intCountLimit == CustomAssignConstant.COUNT_LIMITED);
			// =================================================================
			// 学習回数
			String studyCount = null;
			studyCount = request.getParameter(CustomAssignConstant.NAME_COUNT);
			inputBean.setStudyCount(studyCount);
			// =================================================================
			// メール送信
			String submitMail = null;
			int intSubmitMail = 0;
			submitMail =
				request.getParameter(CustomAssignConstant.NAME_SUBMIT_MAIL);
			intSubmitMail =
				StringUtil.parseInt(
					submitMail,
					CustomAssignConstant.SUBMIT_NO_MAIL);
			inputBean.setSubmitMail(
				intSubmitMail == CustomAssignConstant.SUBMIT_MAIL);
		} catch (Exception e) {
			DebugLog.write(
				CustomAssignRegistBusinessAction.class,
				"Exception occured at getInputBean:" + e,
				DebugLog.HIGHT);
			throw new XmsInnerException(e);
		}
		return inputBean;
	}

	/**
	 * 送信された入力データの妥当性を確認します。<br>
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param bean チェックする入力データ。
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	private void checkInputBean(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		CustomAssignInputBean bean)
		throws XmsException {

		try {
			////////////////////////////////////////////////////////////////////
			// 対象データ
			if (bean.getPersonnelId() == null
				|| bean.getParentGroupId() == null
				|| bean.getParentLoId() == null
				|| bean.getLoId() == null) {
				throw new XmsWarningException(
					CustomAssignConstant.KEY_MESSAGE_INVALID_PARAMETER);
			}
			////////////////////////////////////////////////////////////////////
			// 開始日時チェック
			int startYear = 0;
			int startMonth = 0;
			int startDay = 0;
			int startHour = 0;
			int startMinute = 0;
			Date startDate = null;
			if (bean.isPeriodStartLimited() == true) {
				startYear = bean.getPeriodStartYear();
				startMonth = bean.getPeriodStartMonth();
				startDay = bean.getPeriodStartDay();
				startHour = bean.getPeriodStartHour();
				startMinute = bean.getPeriodStartMinute();
				startDate =
					DateUtil.isDate(
						startYear,
						startMonth,
						startDay,
						startHour,
						startMinute,
						0);
				if (startDate == null) {
					throw new XmsWarningException(
						CustomAssignConstant.KEY_MESSAGE_INVALID_START_DATE);
				}
			}
			////////////////////////////////////////////////////////////////////
			// 終了日付
			int endYear = 0;
			int endMonth = 0;
			int endDay = 0;
			int endHour = 0;
			int endMinute = 0;
			Date endDate = null;
			if (bean.isPeriodEndLimited() == true) {
				endYear = bean.getPeriodEndYear();
				endMonth = bean.getPeriodEndMonth();
				endDay = bean.getPeriodEndDay();
				endHour = bean.getPeriodEndHour();
				endMinute = bean.getPeriodEndMinute();
				endDate =
					DateUtil.isDate(
						endYear,
						endMonth,
						endDay,
						endHour,
						endMinute,
						0);
				if (endDate == null) {
					throw new XmsWarningException(
						CustomAssignConstant.KEY_MESSAGE_INVALID_END_DATE);
				}
			}
			////////////////////////////////////////////////////////////////////
			// 開始終了の順序
			if (startDate != null && endDate != null) {
				if (startDate.compareTo(endDate) > 0) {
					// 開始日時が終了日時より未来
					throw new XmsWarningException(
						CustomAssignConstant.KEY_MESSAGE_INVALID_DATE_ORDER);
				}
			}
			////////////////////////////////////////////////////////////////////
			// 回数
			if (bean.isCountLimited() == true) {
				String studyCount = null;
				int intStudyCount = 0;
				studyCount = bean.getStudyCount();
				try {
					intStudyCount = Integer.parseInt(studyCount);
				} catch (Exception e) {
					throw new XmsWarningException(
						CustomAssignConstant.KEY_MESSAGE_INVALID_COUNT);
				}
				if (intStudyCount < CustomAssignConstant.COUNT_MIN
					|| CustomAssignConstant.COUNT_MAX < intStudyCount) {
					throw new XmsWarningException(
						CustomAssignConstant.KEY_MESSAGE_INVALID_COUNT);
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
	}

	/**
	 * エラー情報を設定する。<br>
	 * エラー情報クラスを生成し、セッションに格納し、
	 * 同じく入力情報をセッションに格納する。
	 * 合わせて、業務ステータスをCustomAssignConstant.STATUS_WARNINGに変更する。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param bean 入力情報。
	 * @param errorMessage メッセージ文字列。
	 * @see InputFrameErrorInformation 
	 * @see CustomAssignConstant#STATUS_WARNING
	 */
	private void setErrorInformation(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		CustomAssignInputBean bean,
		String errorMessage) {

		// セッションに格納するエラー情報。
		InputFrameErrorBean info = null;
		// セッション
		HttpSession session = null;
		// セッション取得用
		HttpServletRequest request = null;
		////////////////////////////////////////////////////////////////////////
		// エラー情報の生成・値設定
		info = new InputFrameErrorBean();
		// エラーメッセージ
		info.setErrorMessage(errorMessage);
		// タイトル画像
		info.setHeadImagePath(CustomAssignConstant.HEAD_IMAGE_PATH);
		// ウィンドウタイトル
		info.setWindowTitle(CustomAssignConstant.WINDOW_TITLE);
		// 戻るボタンのアクションID
		info.setActionId(CustomAssignConstant.ACTION_ID_REGIST_ERROR_COMEBACK);
		// その他のパラメータ
		info.addParameter(
			CustomAssignConstant.PARENT_GROUP_ID,
			bean.getParentGroupId());
		info.addParameter(
			CustomAssignConstant.PARENT_LO_ID,
			bean.getParentLoId());
		info.addParameter(
			CustomAssignConstant.PERSONNEL_ID,
			bean.getPersonnelId());
		info.addParameter(CustomAssignConstant.LO_ID, bean.getLoId());
		////////////////////////////////////////////////////////////////////////
		// エラー情報、入力情報のセッションに格納。
		request = xmsRequest.getRequest();
		session = request.getSession(false);
		if (session != null) {
			session.setAttribute(MailTemplateConstant.KEY_ERROR_INFO, info);
			session.setAttribute(CustomAssignConstant.KEY_INPUT_BEAN, bean);
		}
		// 業務ステータスをwarnに変更
		xmsResponse.setBusinessStatus(CustomAssignConstant.STATUS_WARNING);

	}

	/**
	 * 入力情報に基づき、Assimentsテーブルにレコードを挿入する。<br>
	 * @param bean 入力情報。
	 * @param user ログインユーザを表すオブジェクト。
	 * @return アサインしたユーザのID（String）を要素とするVector。
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	private Vector insert(CustomAssignInputBean bean, User user)
		throws XmsException {
		// データアクセス用
		AssignmentsClient client = null;
		// メンバーシップID
		String strMemberShipID = null;
		// マテリアルID
		String strMaterialID = null;
		// データ挿入結果
		boolean insertResult = false;

		// このメソッドの戻り値
		Vector assignedUser = null;
		try {
			////////////////////////////////////////////////////////////////////
			// メンバーシップID
			strMemberShipID = bean.getParentGroupId() + bean.getPersonnelId();
			// マテリアルID
			strMaterialID = bean.getParentLoId() + bean.getLoId();
			////////////////////////////////////////////////////////////////////
			// データ挿入準備
			client = new AssignmentsClient();
			// メンバーシップID
			client.setMemberShipID(strMemberShipID);
			// マテリアルID
			client.setMaterialID(strMaterialID);
			//	ADD 2005/03/28 START Kentaro Ishizaki [メソッド管理追加]
			if (isMethod(bean.getLoId())) {
				client.setValue(AssignmentsClient.METHOD_FLAG, "1");
			}
			//	ADD 2005/03/28 END Kentaro Ishizaki [メソッド管理追加]
			// その他のデータ
			setColumnData(client, bean, user);
			////////////////////////////////////////////////////////////////////
			// 挿入実行
			insertResult = client.insert();
			// 失敗
			if (insertResult == false) {
				String strMessage = client.getMessage();
				DebugLog.write(
					this.getClass(),
					"fail to insert record"
						+ "membershipid["
						+ strMemberShipID
						+ "]"
						+ "materialid["
						+ strMaterialID
						+ "]",
					DebugLog.HIGHT);

				throw new XmsSystemException(strMessage);
			}
			////////////////////////////////////////////////////////////////////
			// アサインしたユーザ取得
			if (client.next()) {
				assignedUser = client.getAssignUserList();
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
		if (assignedUser == null) {
			assignedUser = new Vector();
		}
		return assignedUser;
	}

	//	ADD 2005/03/28 START Kentaro Ishizaki [メソッド管理追加]
	/**
	 * 指定されたLOがメソッドかどうかを返す。<br>
	 * @param loId LOID。
	 * @return メソッドならtrue、そうでなければfalse。
	 * @throws Exception 処理中に例外が発生した場合。
	 */
	private boolean isMethod(String loId) throws Exception
	{
		LoClient client = new LoClient();
		client.setWhereLoID(loId);
		
		if (!client.select())
			return false;
		if (!client.next())
			return false;
		
		LoData data = client.getLoData();
		if (data.getLoType().equals("21"))
			return true;
		
		return false;
	}
	//	ADD 2005/03/28 END Kentaro Ishizaki [メソッド管理追加]

	/**
	 * 入力情報に基づき、Assimentsテーブルのレコードを更新する。<br>
	 * @param bean 入力情報。
	 * @param user ログインユーザを表すオブジェクト。
	 * @return アサインしたユーザのID（String）を要素とするVector。
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	private Vector update(CustomAssignInputBean bean, User user)
		throws XmsException {

		// データアクセス用
		AssignmentsClient client = null;

		// メンバーシップID
		String strMemberShipID = null;
		// マテリアルID
		String strMaterialID = null;
		// データ挿入結果
		boolean updateResult = false;
		// このメソッドの戻り値
		Vector assignedUser = null;

		try {
			////////////////////////////////////////////////////////////////////
			// 登録するデータを選定
			// =================================================================
			// メンバーシップID
			strMemberShipID = bean.getParentGroupId() + bean.getPersonnelId();
			// マテリアルID
			strMaterialID = bean.getParentLoId() + bean.getLoId();
			////////////////////////////////////////////////////////////////////
			// データ挿入準備
			client = new AssignmentsClient();
			// メンバーシップID
			client.setWhereMemberShipID(strMemberShipID);
			// マテリアルID
			client.setWhereMaterialID(strMaterialID);
			// その他のデータ
			setColumnData(client, bean, user);
			////////////////////////////////////////////////////////////////////
			// 更新実行
			updateResult = client.update();
			// 失敗
			if (updateResult == false) {
				String strMessage = client.getMessage();
				DebugLog.write(
					this.getClass(),
					"fail to update record"
						+ "membershipid["
						+ strMemberShipID
						+ "]"
						+ "materialid["
						+ strMaterialID
						+ "]",
					DebugLog.HIGHT);

				throw new XmsSystemException(strMessage);
			}
			////////////////////////////////////////////////////////////////////
			// アサインしたユーザ取得
			// 対象がグループではなくユーザの場合だけ、そのユーザをVectorに含める。
			assignedUser = new Vector();
			String personnelId = bean.getPersonnelId();
			if (CommonUtil.isUserID(personnelId) == true) {
				assignedUser.add(personnelId);
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
		return assignedUser;
	}

	/**
	 * AssignmentsClientに挿入／更新するカラムデータを設定する。
	 * @param client データアクセスクラス。
	 * @param bean 入力データクラス。
	 * @param user ログインユーザ情報。
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	private void setColumnData(
		AssignmentsClient client,
		CustomAssignInputBean bean,
		User user)
		throws XmsException {

		// 学習開始日
		String strStartDate = null;
		// 学習終了日
		String strEndDate = null;
		// アサイン実施者
		String strUserID = null;
		// 学習アサイン
		String strLearnAuthority = null;
		//  管理アサイン
		String strManagementAuthority = null;

		// 学習開始日時制限
		Date openingDate = null;
		String strOpeningDate = null;
		// 学習終了日時制限
		Date closingDate = null;
		String strClosingDate = null;
		// 学習回数制限
		String strStudyLimitCount = null;
		// アサイン種別
		int assortType = 0;

		try {
			////////////////////////////////////////////////////////////////////
			// 登録するデータを選定
			// =================================================================
			// アサイン種別
			assortType = bean.getAssortType();
			// 学習開始日
			strStartDate = XMODate.parseTime(new Date());
			// 学習終了日
			strEndDate = strStartDate;
			// アサイン実施者
			strUserID = user.getUserID();
			// 学習アサイン
			if (assortType == CustomAssignConstant.ASSORT_TYPE_LEARN
				|| assortType == CustomAssignConstant.ASSORT_TYPE_LEARN_MANAGE) {
				strLearnAuthority = CustomAssignConstant.CULUMN_VALUE_AUTH;
			} else {
				strLearnAuthority = CustomAssignConstant.CULUMN_VALUE_NO_AUTH;
			}
			// 管理アサイン
			if (assortType == CustomAssignConstant.ASSORT_TYPE_MANAGE
				|| assortType == CustomAssignConstant.ASSORT_TYPE_LEARN_MANAGE) {
				strManagementAuthority = CustomAssignConstant.CULUMN_VALUE_AUTH;
			} else {
				strManagementAuthority =
					CustomAssignConstant.CULUMN_VALUE_NO_AUTH;
			}
			// 学習開始日時制限
			// 制限がない場合はnull
			if (bean.isPeriodStartLimited() == false) {
				strOpeningDate = null;
			} else {
				// 制限がある場合は入力（選択）した開始日時を取得
				openingDate =
					DateUtil.isDate(
						bean.getPeriodStartYear(),
						bean.getPeriodStartMonth(),
						bean.getPeriodStartDay(),
						bean.getPeriodStartHour(),
						bean.getPeriodStartMinute(),
						0);
				if (openingDate != null) {
					strOpeningDate = XMODate.parseTime(openingDate);
				}
			}
			// 学習終了日時制限
			// 制限がない場合はnull
			if (bean.isPeriodEndLimited() == false) {
				strClosingDate = null;
			} else {
				// 制限がある場合は入力（選択）した開始日時を取得
				closingDate =
					DateUtil.isDate(
						bean.getPeriodEndYear(),
						bean.getPeriodEndMonth(),
						bean.getPeriodEndDay(),
						bean.getPeriodEndHour(),
						bean.getPeriodEndMinute(),
						59);
				if (closingDate != null) {
					strClosingDate = XMODate.parseTime(closingDate);
				}
			}
			// 学習回数制限
			// 制限がない場合null
			if (bean.isCountLimited() == false) {
				strStudyLimitCount = null;
			} else {
				strStudyLimitCount = bean.getStudyCount();
			}
			////////////////////////////////////////////////////////////////////
			// データ登録／更新設定準備
			//==================================================================
			// 学習開始日
			client.setStudyStartDate(strStartDate);
			// 学習終了日
			client.setEndDate(strEndDate);
			// アサイン実施者
			client.setAssigner(strUserID);
			// 学習アサイン
			client.setLearnAuthority(strLearnAuthority);
			// 管理アサイン
			client.setManagementAuthority(strManagementAuthority);
			// 学習開始日時制限
			client.setOpeningDate(strOpeningDate);
			// 学習終了日時制限
			client.setClosingDate(strClosingDate);
			// 学習回数制限
			client.setStudyLimitCount(strStudyLimitCount);
			// メール送信フラグ（ここでは送信しない）
			client.setSendMailFlag("0");
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
	}

	/**
	 * 送信ユーザ情報をセッションに登録する。<br>
	 * @param xmsRequest リクエストオブジェクト。
	 * @param assignUserIDs 設定するユーザのIDリスト。
	 */
	private void setUserInformationToSession(
		XmsRequest xmsRequest,
		Vector assignUserIDs,
		String LoID)
		throws XmsException {

		// 送信ユーザ情報
		SendUser sendUser = null;
		// HTTPリクエスト
		HttpServletRequest request = null;
		// HTTPセッション
		HttpSession session = null;
		// 送信件数取得用
		AssignmentsClient client = null;
		// 送信件数
		int sendMailCount = 0;
		try {
			// 送信件数の取得
			client = new AssignmentsClient();
			sendMailCount = client.getSendMailCount();
			////////////////////////////////////////////////////////////////////
			// 送信ユーザ情報の生成、値設定
			//==================================================================
			sendUser = new SendUser();
			// メール種別（アサイン）
			sendUser.setMailType(CustomAssignConstant.MAIL_TYPE_ASSIGNMENT_INT);
			// 一回あたりの送信件数
			sendUser.setSendCountMax(sendMailCount);
			
			// 送信対象ユーザIDとLOID
			sendUser.setUserAndLo(assignUserIDs, LoID);
			// 送信結果画面「閉じるボタン」のアクションID
			sendUser.setCloseActionID(CustomAssignConstant.ACTION_ID_CLOSE);
			// 送信ユーザ情報の格納
			request = xmsRequest.getRequest();
			session = request.getSession(false);
			if (session != null) {
				session.setAttribute(
					CustomAssignConstant.KEY_SEND_USER,
					sendUser);
			}
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}

	}

}
