/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.kintai.common.part;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.mosp.common.CommonConst;
import jp.mosp.common.dto.HumanBasisDtoInterface;
import jp.mosp.common.part.PartInfo;
import jp.mosp.common.utils.StringUtil;
import jp.mosp.common.utils.VariousUtil;
import jp.mosp.kintai.common.dao.MYakusyokuDao;
import jp.mosp.kintai.common.dto.MYakusyokuDto;

/**
 * 役職に関するPartクラス
 * @author yoshida
 *	@version	0.0.4
 */
public class PositionPart extends KintaiBasePart {
	
	/**
	 * コンストラクタ
	 */
	public PositionPart() {
		super();
	}
	
	/**
	 * コンストラクタ
	 * @param partInfo	Partを利用する際に必要な情報
	 */
	public PositionPart(PartInfo partInfo) {
		super(partInfo);
	}
	

	private MYakusyokuDao	yakusyokuDao;
	

	/**
	 * M_YAKUSYOKUテーブル用のDAO取得
	 * @return	初期化済みMYakusyokuDaoインスタンス
	 * @throws Exception 例外処理が発生した場合
	 */
	public MYakusyokuDao getMYakusyokuDao() throws Exception {
		if (VariousUtil.isNull(yakusyokuDao)) {
			yakusyokuDao = (MYakusyokuDao)getPreparedDao(MYakusyokuDao.class.getCanonicalName());
		}
		return yakusyokuDao;
	}
	
	/**
	 * 役職コード取得(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public String[][] getPositionArrayAll() throws Exception {
		// 情報の取得
		List<MYakusyokuDto> listPosition = getMYakusyokuDao().findAll();
		// 配列の作成
		String[][] aryPosition = new String[listPosition.size()][3];
		for (int i = 0; i < aryPosition.length; i++) {
			aryPosition[i][0] = listPosition.get(i).getYcode();
			aryPosition[i][1] = listPosition.get(i).getYname();
			aryPosition[i][2] = listPosition.get(i).getTokyu();
		}
		return aryPosition;
	}
	
	/**
	 * 役職コード取得(等級有りのみ)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public String[][] getPositionArray() throws Exception {
		// 情報の取得
		List<MYakusyokuDto> listPosition = getMYakusyokuDao().findAvailable();
		// 配列の作成
		String[][] aryPosition = new String[listPosition.size()][3];
		for (int i = 0; i < aryPosition.length; i++) {
			aryPosition[i][0] = listPosition.get(i).getYcode();
			aryPosition[i][1] = listPosition.get(i).getYname();
			aryPosition[i][2] = listPosition.get(i).getTokyu();
		}
		return aryPosition;
	}
	
	/**
	 * 役職コード取得(等級無しのみ)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public String[][] getPositionTitleArray() throws Exception {
		// 情報の取得
		List<MYakusyokuDto> listPosition = getMYakusyokuDao().findForTitle();
		// 配列の作成
		String[][] aryPosition = new String[listPosition.size()][3];
		for (int i = 0; i < aryPosition.length; i++) {
			aryPosition[i][0] = listPosition.get(i).getYcode();
			aryPosition[i][1] = listPosition.get(i).getYname();
		}
		return aryPosition;
	}
	
	/**
	 * 役職コード取得(プルダウン用)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public String[][] getPositionPltArray() throws Exception {
		// 情報の取得
		List<MYakusyokuDto> listPosition = getMYakusyokuDao().findAvailable();
		// 配列の作成
		String[][] aryPosition = new String[listPosition.size()][2];
		for (int i = 0; i < aryPosition.length; i++) {
			aryPosition[i][0] = listPosition.get(i).getYcode() + CommonConst.STR_TIME_SEPARATOR
					+ listPosition.get(i).getTokyu();
			aryPosition[i][1] = listPosition.get(i).getYname();
		}
		return aryPosition;
	}
	
	/**
	 * 役職リスト取得(M_YAKUSYOKU)
	 * @return 役職リスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public Map<String, MYakusyokuDto> getPositionMap() throws Exception {
		// 情報の取得
		List<MYakusyokuDto> listPosition = getMYakusyokuDao().findAll();
		// Mapの作成
		HashMap<String, MYakusyokuDto> map = new HashMap<String, MYakusyokuDto>();
		for (MYakusyokuDto dto : listPosition) {
			map.put(dto.getYcode(), dto);
		}
		return map;
	}
	
	/**
	 * 役職情報取得(M_YAKUSYOKU)
	 * @param kCode		対象社員コード
	 * @return 			対象社員役職情報
	 * @throws Exception  例外処理が発生した場合
	 */
	public MYakusyokuDto getHoldingPositionInfo(String kCode) throws Exception {
		String positionCode = "";
		String grade = "0";
		// 人事基本情報取得
		HumanBasisDtoInterface dto = part().human().getBasisInfo(kCode);
		if (VariousUtil.isNotNull(dto)) {
			// 役職情報取得
			positionCode = dto.getYCode();
			grade = dto.getTokyu();
		}
		return getPositionInfo(positionCode, grade);
	}
	
	/**
	 * 役職名称取得(等級付き)
	 * @param kCode		対象社員コード
	 * @return	対象社員役職名称
	 * @throws Exception  例外処理が発生した場合
	 */
	public String getPositionName(String kCode) throws Exception {
		HumanBasisDtoInterface dto = part().human().getBasisInfo(kCode);
		if (VariousUtil.isNotNull(dto)) {
			StringBuffer position = new StringBuffer();
			position.append(dto.getYCode());
			position.append(CommonConst.STR_TIME_SEPARATOR);
			position.append(dto.getTokyu());
			String name = StringUtil.getCodeName(position.toString(), getPositionPltArray());
			if (!name.equals(CommonConst.STR_TIME_SEPARATOR)) {
				return name;
			}
		}
		return "";
	}
	
	/**
	 * 皆勤手当利用可否
	 * @since	0.0.2
	 * @param kCode		対象社員コード
	 * @return
	 * <p>
	 * 皆勤手当有りの場合true、そうでない場合false
	 * </p>
	 * @throws Exception 例外処理が発生した場合
	 */
	public boolean isApplyAttendanceAllowance(String kCode) throws Exception {
		MYakusyokuDto dto = getHoldingPositionInfo(kCode);
		// 皆勤手当
		return VariousUtil.isNotNull(dto) && StringUtil.isFlagOn(dto.getKaikin());
	}
	
	/**
	 * 役職情報取得
	 * @since	0.0.3
	 * @param positionCode	対象役職コード
	 * @param grade			対象等級コード
	 * @return	役職情報DTO
	 * @throws Exception 例外処理が発生した場合
	 */
	public MYakusyokuDto getPositionInfo(String positionCode, String grade) throws Exception {
		return getMYakusyokuDao().findForKey(positionCode, grade);
	}
	
	/**
	 * 役職名称取得
	 * @since 0.0.4
	 * @param positionCode	対象役職コード
	 * @param grade			対象等級コード
	 * @return 	対象社員役職名称
	 * @throws Exception  例外処理が発生した場合
	 */
	public String getPositionName(String positionCode, String grade) throws Exception {
		MYakusyokuDto dto = getPositionInfo(positionCode, grade);
		if (VariousUtil.isNotNull(dto)) {
			return dto.getYname();
		}
		return "";
	}
	
}
