package jp.mosp.common.part;

import jp.mosp.common.CommonConst;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.dto.KintaiCommonDtoInterface;
import jp.mosp.kintai.dao.MScheduleDao;
import jp.mosp.kintai.dao.MSyukkinboDao;
import jp.mosp.kintai.dto.MScheduleDto;
import jp.mosp.kintai.dto.MSyukkinboDto;

/**
 * 勤怠に関するPartクラス
 * @author yoshida
 * 	@version	0.0.2
 */
public class KintaiCommonPart extends BasePart {

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

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

	/**
	 * 初期化済み予定簿用DAO取得
	 * @return	初期化済みMScheduleDaoインスタンス
	 * @throws Exception
	 */
	public MScheduleDao getMScheduleDao() throws Exception {
		return (MScheduleDao) getPreparedDao(MScheduleDao.class.getCanonicalName());
	}

	/**
	 * 初期化済み出勤簿用DAO取得
	 * @return	初期化済みMSyukkinboDaoインスタンス
	 * @throws Exception
	 */
	public MSyukkinboDao getMSyukkinboDao() throws Exception {
		return (MSyukkinboDao) getPreparedDao(MSyukkinboDao.class.getCanonicalName());
	}

	/**
	 * 休出判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param code		対象申請種類
	 * @return
	 * <p>
	 * 休日勤務ならtrue、そうでない場合false
	 * </p>
	 */
	public static boolean isWorkOnHoliday(String code) {
		return CommonConst.NUM_WORK_ON_HOLIDAY_FLAG_ON.equals(code);
	}

	/**
	 * 前半休判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param code		対象申請種類
	 * @return
	 * <p>
	 * 休日勤務ならtrue、そうでない場合false
	 * </p>
	 */
	public static boolean isStartHalfHoliday(String code) {
		return CommonConst.NUM_START_HALF_HOLIDAY_FLAG_ON.equals(code);
	}

	/**
	 * 後半休判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param code		対象申請種類
	 * @return
	 * <p>
	 * 休日勤務ならtrue、そうでない場合false
	 * </p>
	 */
	public static boolean isQuitHalfHoliday(String code) {
		return CommonConst.NUM_QUIT_HALF_HOLIDAY_FLAG_ON.equals(code);
	}

	/**
	 * 休暇、有休判断フラグ
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param kinmu			対象勤務形態コード
	 * @return
	 * <p>
	 * 休暇、有休だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isHoliday(String kinmu) {
		return CommonConst.ATTENDANCE_TYPE_HOLIDAY.equals(kinmu);
	}

	/**
	 * 週休判断フラグ
	 * <p>	2009/06/24	m.yoshida	追加	</p>
	 * @param kinmu			対象勤務形態コード
	 * @return
	 * <p>
	 * 週休だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isWeekHoliday(String kinmu) {
		return CommonConst.ATTENDANCE_TYPE_WEEK_HOLIDAY.equals(kinmu);
	}

	/**
	 * 休出判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param dto		対象DTO
	 * @return
	 * <p>
	 * 休日出勤ならtrue、そうでない場合false
	 * </p>
	 * @throws Exception
	 */
	public static boolean isWorkOnHoliday(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return isWorkOnHoliday(dto.getKyusyuKb());
		}
		return false;
	}

	/**
	 * 前半休判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param dto		対象DTO
	 * @return
	 * <p>
	 * 前半休ならtrue、そうでない場合false
	 * </p>
	 * @throws Exception
	 */
	public static boolean isStartHalfHoliday(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return isStartHalfHoliday(dto.getSHankyuKb());
		}
		return false;
	}

	/**
	 * 後半休判断
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param dto		対象DTO
	 * @return
	 * <p>
	 * 後半休ならtrue、そうでない場合false
	 * </p>
	 * @throws Exception
	 */
	public static boolean isQuitHalfHoliday(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return isQuitHalfHoliday(dto.getTHankyuKb());
		}
		return false;
	}

	/**
	 * 休暇、有休判断フラグ
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param dto		対象DTO
	 * @return
	 * <p>
	 * 出勤・予定簿が休暇、有休だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isHoliday(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return isHoliday(dto.getKinmu());
		}
		return false;
	}

	/**
	 * 週休判断フラグ
	 * <p>	2009/06/24	m.yoshida	追加		</p>
	 * @param dto		対象DTO
	 * @return
	 * <p>
	 * 出勤・予定簿が週休だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isWeekHoliday(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return isWeekHoliday(dto.getKinmu());
		}
		return false;
	}

	/**
	 * 勤務可能判断フラグ
	 * <p>	2009/04/21	m.yoshida	追加	</p>
	 * @param dto			対象DTO
	 * @return
	 * <p>
	 * 勤務可能な勤務形態の場合true、そうでない場合false
	 * </p>
	 * @throws Exception
	 */
	public static boolean isAvailableWorkType(KintaiCommonDtoInterface dto) {
		if (VariousPart.chkExistObject(dto)) {
			return !isHoliday(dto) 	&& !isWeekHoliday(dto);
		}
		return false;
	}

	/**
	 * 深夜時間開始時刻
	 * @return	深夜時間開始時刻（分）
	 * @throws MospException
	 * @throws Exception
	 */
	public int getLateNightStart() throws MospException, Exception {
		// M_CODEから値を取得
		String conf = mospcode().findTchange(
				CommonConst.TID_WORK_SYSTEM,
				CommonConst.TCD_LATE_NIGHT
		);
		return TimePart.convStringTimeToIntegerTime(conf.split(CommonConst.STR_SLASH_SEPARATOR)[0]);
	}

	/**
	 * 深夜時間終了時刻
	 * @return	深夜時間終了時刻（分）
	 * @throws MospException
	 * @throws Exception
	 */
	public int getLateNightEnd() throws MospException, Exception {
		// M_CODEから値を取得
		String conf = mospcode().findTchange(
				CommonConst.TID_WORK_SYSTEM,
				CommonConst.TCD_LATE_NIGHT
		);
		return TimePart.convStringTimeToIntegerTime(conf.split(CommonConst.STR_SLASH_SEPARATOR)[1]);
	}

	/**
	 * 一日休暇時間取得
	 * @return	一日休暇時間（分）
	 * @throws MospException
	 * @throws Exception
	 */
	public int getAllHolidayTimes() throws MospException, Exception {
		String conf = mospcode().findTchange(
				CommonConst.TID_WORK_SYSTEM,
				CommonConst.TCD_HOLIDAY_HOURS
		);
		return TimePart.convStringTimeToIntegerTime(conf.split(CommonConst.STR_SLASH_SEPARATOR)[0]);
	}

	/**
	 * 半日休暇時間取得
	 * @return	半日休暇時間（分）
	 * @throws MospException
	 * @throws Exception
	 */
	public int getHalfHolidayTimes() throws MospException, Exception {
		String conf = mospcode().findTchange(
				CommonConst.TID_WORK_SYSTEM,
				CommonConst.TCD_HOLIDAY_HOURS
		);
		return TimePart.convStringTimeToIntegerTime(conf.split(CommonConst.STR_SLASH_SEPARATOR)[1]);
	}

	/**
	 * 登録単位時間取得
	 * @return	登録単位時間（分）
	 * @throws MospException
	 * @throws Exception
	 */
	public int getInputUnitTimes() throws MospException, Exception {
		return NumberPart.getIntParam(mospcode().findTchange(
				CommonConst.TID_INPUT_UNIT_TIMES,
				CommonConst.TCD_MINUTES)
		);
	}

	/**
	 * 自動計算フラグ取得
	 * @return	自動計算フラグ
	 * @throws MospException
	 * @throws Exception
	 */
	public boolean isAutoCalc() throws MospException, Exception {
		String autoCalc = mospcode().findTchange(
				CommonConst.TID_WORK_SYSTEM,
				CommonConst.TCD_AUTOMATIC_CALCULATION
		);
		if (String.valueOf(MospConst.DELETE_FLAG_OFF).equals(autoCalc)) {
			return true;
		}
		return false;
	}

	/**
	 * 月間所定労働日数
	 * @return	月間所定労働日数
	 * @throws MospException
	 * @throws Exception
	 */
	public double getPrescribedDays() throws MospException, Exception {
		return NumberPart.getDoubleParam(mospcode().findTchange(
				CommonConst.TID_STATUTORY_MONTH,
				CommonConst.TCD_STATUTORY_DAYS)
		);
	}

	/**
	 * 月間所定労働時間
	 * @return	月間所定労働時間
	 * @throws MospException
	 * @throws Exception
	 */
	public double getPrescribedHours() throws MospException, Exception {
		return NumberPart.getDoubleParam(mospcode().findTchange(
				CommonConst.TID_STATUTORY_MONTH,
				CommonConst.TCD_STATUTORY_HOUR)
		);
	}

	/**
	 * 一日所定労働時間
	 * @return	一日所定労働時間
	 * @throws MospException
	 * @throws Exception
	 */
	public double getPrescribedHoursPerDay() throws MospException, Exception {
		return NumberPart.getDoubleParam(mospcode().findTchange(
				CommonConst.TID_STATUTORY,
				CommonConst.TCD_STATUTORY_HOUR)
		);
	}

	/**
	 * 代替休日判断フラグ
	 * @since	0.0.2
	 * @param kinmu				対象勤務形態コード
	 * @param kkRiyuu			対象休暇理由コード
	 * @param aryHolidayReason	休暇理由配列
	 * @return
	 * <p>
	 * 勤務形態コードと休暇理由コードが代替休日だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isSubstituteHoliday(
			String kinmu,
			String kkRiyuu,
			String[][] aryHolidayReason
	) {
		if (isHoliday(kinmu) && aryHolidayReason[4][0].equals(kkRiyuu)) {
			return true;
		}
		return false;
	}

	/**
	 * 代替休日判断フラグ
	 * @since	0.0.2
	 * @param dto				対象DTO
	 * @param aryHolidayReason	休暇理由配列
	 * @return
	 * <p>
	 * 勤務形態コードと休暇理由コードが代替休日だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isSubstituteHoliday(
			KintaiCommonDtoInterface dto,
			String[][] aryHolidayReason
	) {
		if (VariousPart.chkExistObject(dto)) {
			return isSubstituteHoliday(dto.getKinmu(), dto.getKKRiyuu(), aryHolidayReason);
		}
		return false;
	}

	/**
	 * 有休判断フラグ
	 * @since	0.0.2
	 * @param kinmu					対象勤務形態コード
	 * @param kkRiyuu				対象休暇理由コード
	 * @param aryHolidayReason		休暇理由配列
	 * @return
	 * <p>
	 * 勤務形態コードと休暇理由コードが有休休暇だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isAllHoliday(
			String kinmu,
			String kkRiyuu,
			String[][] aryHolidayReason
	) {
		if (isHoliday(kinmu) && aryHolidayReason[0][0].equals(kkRiyuu)) {
			return true;
		}
		return false;
	}

	/**
	 * 有休判断フラグ
	 * @since	0.0.2
	 * @param dto				対象DTO
	 * @param aryHolidayReason	休暇理由配列
	 * @return
	 * <p>
	 * 勤務形態コードと休暇理由コードが有休休暇だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isAllHoliday(
			KintaiCommonDtoInterface dto,
			String[][] aryHolidayReason
	) {
		if (VariousPart.chkExistObject(dto)) {
			return isAllHoliday(dto.getKinmu(), dto.getKKRiyuu(), aryHolidayReason);
		}
		return false;
	}

	/**
	 * 出勤簿用情報設定
	 * <p>	2009/07/01	m.yoshida	追加	</p>
	 * @since	0.0.2
	 * @param dto MScheduleDto
	 * @return mSyukkinboDto MSyukkinboDto
	 * @throws Exception
	 */
	public static MSyukkinboDto copyScheduleToSyukkinbo(MScheduleDto dto) throws Exception {
		MSyukkinboDto mSyukkinboDto = new MSyukkinboDto();
		mSyukkinboDto.setKCode		(dto.getKCode()		);
		mSyukkinboDto.setHizuke		(dto.getHizuke()	);
		mSyukkinboDto.setNen		(dto.getNen()		);
		mSyukkinboDto.setTuki		(dto.getTuki()		);
		mSyukkinboDto.setHi			(dto.getHi()		);
		mSyukkinboDto.setSyozoku	(dto.getSyozoku()	);
		mSyukkinboDto.setNinsyo		(dto.getNinsyo()	);
		mSyukkinboDto.setSyJikoku	(dto.getSyJikoku()	);
		mSyukkinboDto.setKinmu		(dto.getKinmu()		);
		mSyukkinboDto.setSHankyuKb	(dto.getSHankyuKb()	);
		mSyukkinboDto.setKyusyuKb	(dto.getKyusyuKb()	);
		mSyukkinboDto.setTiRiyuu	(dto.getTiRiyuu()	);
		mSyukkinboDto.setTiComent	(dto.getTiComent()	);
		mSyukkinboDto.setTiSyoumei	(dto.getTiSyoumei()	);
		mSyukkinboDto.setTiJikan	(dto.getTiJikan()	);
		mSyukkinboDto.setSyTimes	(dto.getSyTimes()	);
		mSyukkinboDto.setTaJikoku	(dto.getTaJikoku()	);
		mSyukkinboDto.setKinmuJi	(dto.getKinmuJi()	);
		mSyukkinboDto.setKyukeiJi	(dto.getKyukeiJi()	);
		mSyukkinboDto.setTHankyuKb	(dto.getTHankyuKb()	);
		mSyukkinboDto.setSoRiyuu	(dto.getSoRiyuu()	);
		mSyukkinboDto.setSoComent	(dto.getSoComent()	);
		mSyukkinboDto.setSoSyoumei	(dto.getSoSyoumei()	);
		mSyukkinboDto.setSoJikan	(dto.getSoJikan()	);
		mSyukkinboDto.setZaJikan	(dto.getZaJikan()	);
		mSyukkinboDto.setKsJikan	(dto.getKsJikan()	);
		mSyukkinboDto.setSnJikan	(dto.getSnJikan()	);
		mSyukkinboDto.setSyokuji	(dto.getSyokuji()	);
		mSyukkinboDto.setCyoku1		(dto.getCyoku1()	);
		mSyukkinboDto.setCyoku2		(dto.getCyoku2()	);
		mSyukkinboDto.setCyoku3		(dto.getCyoku3()	);
		mSyukkinboDto.setHoka1		(dto.getHoka1()		);
		mSyukkinboDto.setHoka2		(dto.getHoka2()		);
		mSyukkinboDto.setHoka3		(dto.getHoka3()		);
		mSyukkinboDto.setHoka4		(dto.getHoka4()		);
		mSyukkinboDto.setHoka5		(dto.getHoka5()		);
		mSyukkinboDto.setTaTimes	(dto.getTaTimes()	);
		mSyukkinboDto.setKKRiyuu	(dto.getKKRiyuu()	);
		mSyukkinboDto.setDaiKyuJyu	(dto.getDaiKyuJyu()	);
		mSyukkinboDto.setKKComent	(dto.getKKComent()	);
		mSyukkinboDto.setKKSyoumei	(dto.getKKSyoumei()	);
		mSyukkinboDto.setKKJikan	(dto.getKKJikan()	);
		mSyukkinboDto.setKKTimes	(dto.getKKTimes()	);
		mSyukkinboDto.setSnRiyuu	(dto.getSnRiyuu()	);
		mSyukkinboDto.setSnComent	(dto.getSnComent()	);
		mSyukkinboDto.setSnTimes	(dto.getSnTimes()	);
		mSyukkinboDto.setUpdtTimes	(dto.getUpdtTimes()	);
		mSyukkinboDto.setNijiKyu	(dto.getNijiKyu()	);
		mSyukkinboDto.setWarimasi1	(dto.getWarimasi1()	);
		mSyukkinboDto.setZKinmu		(dto.getZKinmu()	);
		return mSyukkinboDto;
	}

}
