//===========================================================================
// package
//===========================================================================
package jp.gr.java_conf.bugslife.user;

//===========================================================================
// import
//===========================================================================
// Java core API
import java.util.*;
import java.text.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

// DB API
import jp.gr.java_conf.bugslife.db.*;

// Util API
import jp.gr.java_conf.bugslife.util.*;
//import jp.gr.java_conf.bugslife.system.*;


/**
 *<PRE>
 * 
 * DispatchListクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class DispatchList implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	ユーザ番号
	 */
	private int m_uno = 0;
	/**
	 *	ディスパッチユーザNo
	 */
	private int m_dispatchUno = 0;
	/**
	 *	表示順
	 */
	private int m_dispNo = 0;
	/**
	 *	ディスパッチユーザの略称
	 */
	private String m_nickname = null;
	/**
	 *	ディスパッチユーザの氏名
	 */
	private String m_name = null;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean m_exclusion = false;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean m_atoIncrement = false;	//あり
	/**
	 * PK 
	 */
	private static final String[] PK = {"uno", "dispatchUno"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"uno","dispatchUno","dispNo",
									"updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public DispatchList()
	{
		
	}
	/**
	 *	コンストラクタ(ユーザ番号）
	 *
	 * @param	uid		String型
	 */
	public DispatchList(int uno, int dispatchUno)
	{
		setUno(uno);
		setDispatchUno(dispatchUno);
		
		load();
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.insert(this);
		load();		//最終更新日がほしいので再ロード
	}
	/**
	 *	update
	 *
	 * @return	処理結果
	 */
	public void update(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.update(this);
		
		load();		//最終更新日がほしいので再ロード
	}
	/**
	 *	delete
	 *
	 * @return	処理結果
	 */
	public void delete(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.delete(this);
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		
		DAO.load(this);
		
	}
	/**
	 *	findAll
	 *
	 * @return	処理結果
	 */
	public static Collection findAll()
	{
		
		return DAO.findAll(new DispatchList());
		
	}
//======================================
// Db Interface
//======================================
	/**
	 * 
	 */
	public String[] getUpdateItemNames() {
		
		return DB_ITEMS;
		
	}
	/**
	 * PK items
	 */
	 public String[] getPKItems() {
		return PK;
	}
	/**
	 * 排他制御ありなし
	 */
	public boolean isExclusion() {
		return true;
	}
	/**
	 * AutoIncrementありなし
	 */
	public boolean isAutoIncrement() {
		return true;
	}
//======================================
// Collection
//======================================
	/**
	 *	ディスパッチ先の取得
	 *
	 * @return	処理結果
	 */
	public static Collection getDispatchList(int uno)
	{
		String sql = 
		    	"SELECT A.uno as uno," +
				"A.dispatchUno as dispatchUno,"+
				"A.dispNo as dispNo," +
				"A.updateUno as updateUno," +
				"A.updateDate as updateDate," +
				"B.nickname as nickname," +
				"B.name as name" +
				" FROM dispatchList AS A" + 
				" LEFT JOIN userinfo AS B ON A.dispatchUno = B.uno" +
				" WHERE A.uno = ?" + 
				" ORDER BY A.dispNo, B.nickname";
		ArrayList params = new ArrayList();
		params.add(new Integer(uno));
		
		return (DAO.find(new DispatchList(), sql, params));
	}
	/**
	 *	ディスパッチ先の取得
	 *
	 * @return	処理結果
	 */
	public static Collection getEnableDispatchList(int uno)
	{
		String sql = 
		    	"SELECT A.uno as uno," +
				"A.dispatchUno as dispatchUno,"+
				"A.dispNo as dispNo," +
				"A.updateUno as updateUno," +
				"A.updateDate as updateDate," +
				"B.nickname as nickname," +
				"B.name as name" +
				" FROM dispatchList AS A" + 
				" LEFT JOIN userinfo AS B ON A.dispatchUno = B.uno" +
				" WHERE A.uno = ?" + 
				" and B.enableDispatch = 1" +
				" and B.enableLogin = 1" +
				" ORDER BY A.dispNo, B.nickname";
		ArrayList params = new ArrayList();
		params.add(new Integer(uno));
		
		return (DAO.find(new DispatchList(), sql, params));
	}
	/**
	 *	ディスパッチ先の存在チェック
	 *
	 * @return	存在:true 存在なし:false
	 */
	public static boolean isExist(int uno, int dispatchUno)
	{
		String sql = 
		    	"SELECT uno" +  
				" FROM dispatchList" + 
				" WHERE uno = ? and dispatchUno = ?"; 
		ArrayList params = new ArrayList();
		params.add(new Integer(uno));
		params.add(new Integer(dispatchUno));
		
		ArrayList list = DAO.find(new DispatchList(), sql, params);
		
		return ((list == null) || (list.size() == 0)) ? false : true;
		 
	}
//======================================
// request param
//======================================
	/**
	 *	request parametorの生成
	 */
	public Map getMapping() {
	
		HashMap map = new HashMap();
		map.put("uno", Integer.toString(getUno()));
		map.put("dispatchUno", Integer.toString(getDispatchUno()));
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * ユーザ番号の取得
	 * 
	 * @return ユーザ番号
	 */
	public int getUno()
	{
		return m_uno;
	}
	/**
	 * ユーザ番号のセット
	 * 
	 * @param uno ユーザ番号
	 */
	public void setUno(int uno)
	{
		m_uno = uno;
	}
	/**
	 * ディスパッチユーザの取得
	 * 
	 * @return ディスパッチユーザ
	 */
	public int getDispatchUno()
	{
		return m_dispatchUno;
	}
	/**
	 * ディスパッチユーザのセット
	 * 
	 * @param uid ユーザＩＤ
	 */
	public void setDispatchUno(int dispatchUno)
	{
		m_dispatchUno = dispatchUno;
	}
	/**
	 * 表示順の取得
	 * 
	 * @return 表示順
	 */
	public int getDispNo()
	{
		return m_dispNo;
	}
	/**
	 * 表示順
	 * 
	 * @param dispNo 表示順
	 */
	public void setDispNo(int dispNo)
	{
		m_dispNo = dispNo;
	}
	/**
	 * 略称の取得
	 * 
	 * @return 略称
	 */
	public String getNickname()
	{
		return m_nickname;
	}
	/**
	 * ディスパッチ先のディスパッチ可不可文字列の取得
	 * 
	 * @return 可/不可
	 */
	public String getEnableDispatchString()
	{
	    String ret = "NG";
        UserInfo dispatch = UserInfo.getUser(m_dispatchUno);
	    if ((dispatch != null) && (dispatch.checkEnableDispatch())){
	        ret = "OK";
	    }
		return ret;
	}
	/**
	 * ユーザの取得
	 * 
	 * @return ユーザ
	 */
	public UserInfo getUser()
	{
	    return  UserInfo.getUser(m_dispatchUno);
	}
	/**
	 * 更新者の取得
	 * 
	 * @return 更新者
	 */
	public int getUpdateUno()
	{
		return m_updateUno;
	}
	/**
	 * 更新者のセット
	 * 
	 * @param updateUno 更新者
	 */
	public void setUpdateUno(int updateUno)
	{
		m_updateUno = updateUno;
	}
	/**
	 *	更新日の取得
	 *
	 * @return	update		更新日文字列
	 */
	public Date getUpdateDate()
	{
		return m_updateDate;
	}
	/**
	 *	更新日のセット
	 *
	 * @return	update		更新日文字列
	 */
	public void setUpdateDate(Date date)
	{
		m_updateDate = date;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [DISPATCH LIST] --- \n");
		sb.append("uno     : " + m_uno + "\n");
		sb.append("dispatch: " + m_dispatchUno + "\n");
		sb.append("dispNo  : " + m_dispNo + "\n");
		sb.append("nickname: " + m_nickname + "\n");
		sb.append("updateUno  : " + m_updateUno + "\n");
		sb.append("updateDate : " + m_updateDate + "\n");
		sb.append("--- [DISPATCH LIST] --- \n");
		return sb.toString();
	}
	/**
	 * debug
	 */
	private static void debug(String s) {
		 
		 System.out.println("[DISPATCH LIST]" + s);
		 
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << dispatchList Test Start >> -----------");
		
/*-------------------------------
		unitTest1();	//新規ユーザ作成テスト
		unitTest2();	//ユーザ更新テスト
		unitTest3();	//ユーザ削除テスト
		unitTest4();	//全件取得テスト
		unitTest5();	//ユーザID検索テスト
		unitTest6();	//ユーザ番号指定コンストラクトテスト
		unitTest7();	//全ユーザ取得テスト
		unitTest8();	//特権ユーザ取得テスト
-------------------------------*/
		
		System.out.println("------- << dispatchList Test End >> -----------");
	}
	
}