/*
このファイルの中身は、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) ______________________________________.
*/

//
//	Assignments 管理 アサイン有効・無効判定クラス
//			変更履歴
//				2004.01.08	二條智文  新規作成
//
package jp.co.ntt.lms.xmo.Assignments;

import java.io.Serializable;
import java.util.Date;

/**
 * アサイン１レコード分の有効・無効を判定します。<BR>
 * @author T.Nijou
 */
public final class AssignUsable implements Serializable, Cloneable {

	/** チェック対象ユーザID */
	private String userID;
	/** チェック対象グループID */
	private String groupID;
	/** チェック対象LOID */
	private String loID;
	/** 実アサインLO　親ID */
	private String assignLoParentID;
	/** 実アサインLO　子ID */
	private String assignLoChildID;
	/** チェック実行日時 */	
	private Date checkDate;
	/** 期限開始日時 */
	private Date openingDate;
	/** 期限終了日時 */
	private Date closingDate;
	/** 学習制限回数 */
	private int studyLimitCnt;
	/** 学習回数 */
	private int studyCnt;
	/** コンポーネントID*/
	private String componentId;

	/** 学習アサイン */
	private String learnAuthority;
	/** 管理アサイン */
	private String managementAuthority;

	/**
	 * コンストラクタ
	 */
	public AssignUsable() {
		
	}


//----------------- アクセサ -------------------------------------->>


	/**
	 * Returns the assignLoChildID.
	 * @return String
	 */
	public String getAssignLoChildID() {
		return assignLoChildID;
	}

	/**
	 * Returns the assignLoParentID.
	 * @return String
	 */
	public String getAssignLoParentID() {
		return assignLoParentID;
	}

	/**
	 * Returns the checkDate.
	 * @return Date
	 */
	public Date getCheckDate() {
		return checkDate;
	}

	/**
	 * Returns the closingDate.
	 * @return Date
	 */
	public Date getClosingDate() {
		return closingDate;
	}

	/**
	 * Returns the groupID.
	 * @return String
	 */
	public String getGroupID() {
		return groupID;
	}

	/**
	 * Returns the loID.
	 * @return String
	 */
	public String getLoID() {
		return loID;
	}

	/**
	 * Returns the openingDate.
	 * @return Date
	 */
	public Date getOpeningDate() {
		return openingDate;
	}

	/**
	 * Returns the studyCnt.
	 * @return int
	 */
	public int getStudyCnt() {
		return studyCnt;
	}

	/**
	 * Returns the studyLimitCnt.
	 * @return int
	 */
	public int getStudyLimitCnt() {
		return studyLimitCnt;
	}

	/**
	 * Returns the userID.
	 * @return String
	 */
	public String getUserID() {
		return userID;
	}

	/**
	 * コンポーネントＩＤの取得(親ＩＤ子ＩＤ）がつながった文字列.
	 * @return String
	 */
	public String getComponentId() {
		return componentId;
	}

	/**
	 * 学習アサイン
	 * 
	 * @return learnAuthority
	 */
	public String getLearnAuthority() {
		return learnAuthority;
	}

	/**
	 * 管理アサイン
	 * 
	 * @return managementAuthority
	 */
	public String getManagementAuthority() {
		return managementAuthority;
	}

	/**
	 * Sets the assignLoChildID.
	 * @param assignLoChildID The assignLoChildID to set
	 */
	public void setAssignLoChildID(String assignLoChildID) {
		this.assignLoChildID = assignLoChildID;
	}

	/**
	 * Sets the assignLoParentID.
	 * @param assignLoParentID The assignLoParentID to set
	 */
	public void setAssignLoParentID(String assignLoParentID) {
		this.assignLoParentID = assignLoParentID;
	}

	/**
	 * Sets the checkDate.
	 * @param checkDate The checkDate to set
	 */
	public void setCheckDate(Date checkDate) {
		this.checkDate = checkDate;
	}

	/**
	 * Sets the closingDate.
	 * @param closingDate The closingDate to set
	 */
	public void setClosingDate(Date closingDate) {
		this.closingDate = closingDate;
	}

	/**
	 * Sets the groupID.
	 * @param groupID The groupID to set
	 */
	public void setGroupID(String groupID) {
		this.groupID = groupID;
	}

	/**
	 * Sets the loID.
	 * @param loID The loID to set
	 */
	public void setLoID(String loID) {
		this.loID = loID;
	}

	/**
	 * Sets the openingDate.
	 * @param openingDate The openingDate to set
	 */
	public void setOpeningDate(Date openingDate) {
		this.openingDate = openingDate;
	}

	/**
	 * Sets the studyCnt.
	 * @param studyCnt The studyCnt to set
	 */
	public void setStudyCnt(int studyCnt) {
		this.studyCnt = studyCnt;
	}

	/**
	 * Sets the studyLimitCnt.
	 * @param studyLimitCnt The studyLimitCnt to set
	 */
	public void setStudyLimitCnt(int studyLimitCnt) {
		this.studyLimitCnt = studyLimitCnt;
	}

	/**
	 * Sets the userID.
	 * @param userID The userID to set
	 */
	public void setUserID(String userID) {
		this.userID = userID;
	}

	/**
	 * コンポーネントＩＤの設定(親ＩＤ子ＩＤ）がつながった文字列.
	 * @param componentId The componentId to set
	 */
	public void setComponentId(String componentId) {
		this.componentId = componentId;
	}

	/**
	 * 学習アサイン
	 * 
	 * @param learnAuthority
	 */
	public void setLearnAuthority( String learnAuthority ) {
		this.learnAuthority = learnAuthority;
	}

	/**
	 * 管理アサイン
	 * 
	 * @param managementAuthority
	 */
	public void setManagementAuthority( String managementAuthority ) {
		this.managementAuthority = managementAuthority;
	}

//----------------- アクセサ --------------------------------------<<

	/**
	 * アサイン有効・無効の判定メソッド。<BR>
	 * 以下の条件で判定を行う。<BR>
	 * <PRE>
	 * 期間From：チェック日付より前または制限なし有効
	 * 期間To：チェック日付より後または制限なしで有効
	 * 回数: 学習回数未満または制限無(=0)で有効
	 * 上記3種のAND値
	 * </PRE>
	 * @return boolean true: 有効 false: 無効
	 */
	public boolean isUsable() {

		// 内部状態のチェック
		// すべてが無制限の場合は有効とする。
		if( openingDate == null &&
			closingDate == null &&
			studyLimitCnt == 0 )
		{
			return true;
		}

		// 期限開始有効・無効
		boolean blFrom = false;
		// 期限終了有効・無効
		boolean blTo = false;
		// 回数有効・無効
		boolean blCnt = false;

		// 期限開始チェック
		// 無制限(=null) または
		// チェック日付より後(after) または
		// チェック日付と同じ(equals) の場合は有効
		if( openingDate == null ||
			checkDate.after( openingDate ) ||
			checkDate.equals( openingDate ) )
		{
			blTo = true;
		}

		// 期限終了チェック
		// 無制限(=null) または
		// チェック日付より後(before) または
		// チェック日付と同じ(equals) の場合は有効
		if( closingDate == null ||
			checkDate.before( closingDate ) ||
			checkDate.equals( closingDate ) )
		{
			blFrom = true;
		}

		// 学習回数チェック
		// 無制限( = 0 ) または
		// 学習回数 < 制限回数
		// の場合は有効
		if( studyLimitCnt == 0 ||
			studyCnt < studyLimitCnt )
		{
			blCnt = true;
		}

		// すべてがtrueなら、有効となる。
		// 1つでもfalse があったら無効となる。
		return ( blFrom && blTo && blCnt );
	}
	
	/**
	 * アサイン有効・無効の判定メソッド。<BR>
	 * 以下の条件で判定を行う。<BR>
	 * <PRE>
	 * 期間From：チェック日付より前または制限なし有効
	 * 期間To：チェック日付より後または制限なしで有効
	 * 回数: 学習回数の残り回数0以下は無効(学習回数はみていない)
	 * 上記3種のAND値
	 * </PRE>
	 * @return boolean true: 有効 false: 無効
	 */
	public boolean isUsableAssain() {

		// 内部状態のチェック
		// すべてが無制限の場合は有効とする。
		if( openingDate == null &&
			closingDate == null &&
			studyLimitCnt == 0 )
		{
			return true;
		}

		// 期限開始有効・無効
		boolean blFrom = false;
		// 期限終了有効・無効
		boolean blTo = false;
		// 回数有効・無効
		boolean blCnt = false;

		// 期限開始チェック
		// 無制限(=null) または
		// チェック日付より後(after) または
		// チェック日付と同じ(equals) の場合は有効
		if( openingDate == null ||
			checkDate.after( openingDate ) ||
			checkDate.equals( openingDate ) )
		{
			blTo = true;
		}

		// 期限終了チェック
		// 無制限(=null) または
		// チェック日付より前(before) または
		// チェック日付と同じ(equals) の場合は有効
		if( closingDate == null ||
			checkDate.before( closingDate ) ||
			checkDate.equals( closingDate ) )
		{
			blFrom = true;
		}

		// 学習回数チェック
		// 無制限( = 0 ) または
		// 学習回数 < 制限回数
		// の場合は有効
		if( studyLimitCnt == 0 ||
			studyCnt < studyLimitCnt )
		{
			blCnt = true;
		}


		// すべてがtrueなら、有効となる。
		// 1つでもfalse があったら無効となる。
		return ( blFrom && blTo && blCnt );
	}

	
	/**
	 * Method getCopy.
	 * @return Object
	 */
	public AssignUsable getCopy() {
		AssignUsable clone = null;
		try {
			clone = (AssignUsable)clone();
		}
		catch(CloneNotSupportedException ex) {
			ex.printStackTrace();
		}
		
		return clone;
	}

	/**
	 * デバック用、文字列表記
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append( "{" );
		sb.append( "対象ユーザID= " + userID );
		sb.append( ",対象グループID:: " + groupID );
		sb.append( ",対象LOID:: " + loID );
		sb.append( ",実アサインLO　親ID:: " + assignLoParentID );
		sb.append( ",実アサインLO　子ID:: " + assignLoChildID );
		sb.append( ",チェック実行日時:: " + checkDate );
		sb.append( ",期限開始日時:: " + openingDate );
		sb.append( ",期限終了日時:: " + closingDate );
		sb.append( ",学習制限回数:: " + studyLimitCnt );
		sb.append( ",学習回数:: " + studyCnt );
		
		sb.append( "}" );
		
		return sb.toString();	
	}
}
