/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 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.common.part;

import java.util.Date;
import java.util.List;

import jp.mosp.common.CommonConst;
import jp.mosp.human.dao.MKihonDao;
import jp.mosp.human.dto.MKihonDto;

/**
 * 人事に関するPartクラス
 * @author yoshida
 *	@version	0.0.2
 */
public class HumanPart extends BasePart {

	/**
	 * コンストラクタ
	 */
	public HumanPart() {
		super();
	}

	/**
	 * コンストラクタ
	 * @param partInfo
	 */
	public HumanPart(PartInfo partInfo) {
		super(partInfo);
	}

	/**
	 * M_KIHONテーブル用のDAO取得
	 * @return	初期化済みMKihonDaoインスタンス
	 * @throws Exception
	 */
	public MKihonDao getMKihonDao() throws Exception {
		return (MKihonDao)getPreparedDao(MKihonDao.class.getCanonicalName());
	}

	/**
	 * 人事基本情報取得(M_KIHON)
	 * @param kCode 情報取得対象社員コード
	 * @return 人事基本情報(UmBasisDto)
	 * @throws Exception 
	 */
	public MKihonDto getBasisInfo(
			String kCode
	) throws Exception {
		// 情報の取得
		return getMKihonDao().findForKey(kCode);
	}

	/**
	 * 社員氏名取得(M_KIHON)
	 * @param kCode 情報取得対象社員コード
	 * @return 社員氏名
	 * @throws Exception 
	 */
	public String getKName(
			String kCode
	) throws Exception {
		MKihonDto dto = getBasisInfo(kCode);
		if (dto == null) {
			return kCode;
		}
		return dto.getSimei();
	}

	/**
	 * 社員コード取得(M_KIHON)(現所属)
	 * @param sectionCode 検索所属コード
	 * @return 社員コードリスト
	 * @throws Exception 
	 */
	public String[] getBasisArray(
			String sectionCode
	) throws Exception {
		Date todayDate = DatePart.getSystemDate();
		// 情報の取得
		List<MKihonDto> listKihon = getMKihonDao().findForSection(
				sectionCode,
				DatePart.convDateToInteger(todayDate),
				DatePart.convDateToInteger(calculate().getEndDate(todayDate))
		);
		// 配列の作成
		String[] aryKihon = new String[listKihon.size()];
		for (int i = 0; i < listKihon.size(); i++) {
			aryKihon[i] = listKihon.get(i).getKCode();
		}
		return aryKihon;
	}

	/**
	 * 社員コード取得(M_KIHON)
	 * @return 社員コードリスト
	 * @throws Exception 
	 */
	public String[][] getBasisArrayAll() throws Exception {
		// 情報の取得
		List<MKihonDto> listKihon = getMKihonDao().findAll();
		// 配列の作成
		String[][] aryKihon = new String[listKihon.size()][2];
		for (int i = 0; i < listKihon.size(); i++) {
			aryKihon[i][0] = listKihon.get(i).getKCode();
			aryKihon[i][1] = listKihon.get(i).getSimei();
		}
		return aryKihon;
	}

	/**
	 * 社員コード取得(M_KIHON)
	 * @return 社員コードリスト
	 * @throws Exception 
	 */
	public String[][] getBasisArrayForApproval() throws Exception {
		// 情報の取得
		List<MKihonDto> listKihon = getMKihonDao().findForAuth(
				CommonConst.AUTHORITY_MANAGER,
				CommonConst.AUTHORITY_SENIORS,
				DatePart.convDateToInteger(DatePart.getSystemDate())
		);
		// 配列の作成
		String[][] aryKihon = new String[listKihon.size()][2];
		for (int i = 0; i < listKihon.size(); i++) {
			aryKihon[i][0] = listKihon.get(i).getKCode();
			aryKihon[i][1] = listKihon.get(i).getSimei();
		}
		return aryKihon;
	}

	/**
	 * 社員コード、所属コード取得(M_KIHON)
	 * @return 社員コードリスト
	 * @throws Exception 
	 */
	public String[][] getBasisArrayAllWithSectionCode() throws Exception {
		// 情報の取得
		List<MKihonDto> listKihon = getMKihonDao().findAll();
		// 配列の作成
		String[][] aryKihon = new String[listKihon.size()][2];
		for (int i = 0; i < listKihon.size(); i++) {
			aryKihon[i][0] = listKihon.get(i).getKCode();
			aryKihon[i][1] = section().getBelongSectionCode(listKihon.get(i).getKCode());
		}
		return aryKihon;
	}

	/**
	 * 社員コード、所属コード取得(M_KIHON)
	 * @since	0.0.2
	 * @return 社員コードリスト
	 * @throws Exception 
	 */
	public String[][] getBasisArrayAllWithOfficeCode() throws Exception {
		// 情報の取得
		List<MKihonDto> listKihon = getMKihonDao().findAll();
		// 配列の作成
		String[][] aryKihon = new String[listKihon.size()][2];
		for (int i = 0; i < listKihon.size(); i++) {
			aryKihon[i][0] = listKihon.get(i).getKCode();
			aryKihon[i][1] = office().getBelongOfficeCode(listKihon.get(i).getKCode());
		}
		return aryKihon;
	}

	/**
	 * 選択社員所属社員コード一覧取得(M_KIHON)
	 * @param kCode		対象社員コード
	 * @return	社員コードリスト
	 * @throws Exception
	 */
	public String[][] getBasisArrayForBelongSection(String kCode) throws Exception {
		// 検索
		List<MKihonDto> listMKihon = getMKihonDao().findForCondition(
				section().getBelongSectionCode(kCode),
				getBasisInfo(kCode).getJCode(),
				getBasisInfo(kCode).getKCode(),
				mospuser().getUserInfoForKCode(kCode).getDataLevel(),
				DatePart.convDateToInteger(DatePart.getSystemDate())
		);
		String[][] aryBasis = new String[listMKihon.size()][2];
		for (int i = 0; i < aryBasis.length; i++) {
			aryBasis[i][0] = listMKihon.get(i).getKCode();
			aryBasis[i][1] = listMKihon.get(i).getSimei();
		}
		return aryBasis;
	}

	/**
	 * 勤続年数（月数）取得
	 * @param kCode
	 * @return y.m<br>月はそのまま
	 * 				[例] 26月→2.02年
	 * @throws Exception 
	 */
	public double getYearsOfService(
			String kCode
	) throws Exception {
		MKihonDto dto = getBasisInfo(kCode);
		int difference = 0;
		if (dto != null) {
			difference = DatePart.getMonthRemainder(
					DatePart.getSystemDate(),
					DatePart.convIntegerDateToDate(dto.getNyDate())
			);			
		}
		double yearsOfService = difference /12 + difference %12 /100;
		return yearsOfService;
	}

	/**
	 * 退職判断
	 * @param kCode		対象社員コード
	 * @return
	 * <p>
	 * 退職の場合。true、そうでない場合false。
	 * </p>
	 * @throws Exception
	 */
	public boolean isRetiredEmployee (String kCode) throws Exception {
		MKihonDto dto = getBasisInfo(kCode);
		if (VariousPart.chkExistDto(dto)) {
			// 退職区分が退職且つ、退職日付が本日より前の場合。
			if (dto.getKnKubun().equals(String.valueOf(CommonConst.RETIREMENT_FLAG_ON))
					&& (dto.getTsDate() > 0
							&& dto.getTsDate() < DatePart.convDateToInteger(DatePart.getSystemDate())
					)
			) {
				return true;
			}
		} else {
			return true;
		}
		return false;
	}

	/**
	 * 在職社員情報取得
	 * @param kCode		対象社員コード
	 * @return			在職社員情報
	 * @throws Exception
	 */
	public MKihonDto getAvailableUserInfo(String kCode) throws Exception {
		MKihonDto dto = getBasisInfo(kCode);
		if (VariousPart.chkExistDto(dto)) {
			// 退職区分が退職の場合。
			if (isRetiredEmployee(kCode)) {
				return null;
			}
			// 退職区分が休職の場合。
			if (dto.getKnKubun().equals(String.valueOf(CommonConst.RETIREMENT_FLAG_LEAVE))) {
				return null;
			}
		}
		return dto;
	}

	/**
	 * ログイン社員基本情報取得
	 * @return	ログイン社員基本情報
	 * @throws Exception
	 */
	public MKihonDto getBasisInfoOfUser() throws Exception {
		return getBasisInfo(user.getKCode());
	}

}
