/*
 * 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 Affero General Public License
 * as published by the Free Software Foundation, either version 3
 * 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 Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package jp.mosp.time.settings.action;

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

import jp.mosp.framework.base.BaseDtoInterface;
import jp.mosp.framework.base.BaseVo;
import jp.mosp.framework.base.MospException;
import jp.mosp.framework.constant.MospConst;
import jp.mosp.framework.property.MospProperties;
import jp.mosp.framework.utils.DateUtility;
import jp.mosp.platform.bean.human.HumanReferenceBeanInterface;
import jp.mosp.platform.bean.system.SectionReferenceBeanInterface;
import jp.mosp.platform.comparator.base.ActivateDateComparator;
import jp.mosp.platform.constant.PlatformConst;
import jp.mosp.platform.constant.PlatformMessageConst;
import jp.mosp.platform.dto.human.EntranceDtoInterface;
import jp.mosp.platform.dto.human.HumanDtoInterface;
import jp.mosp.time.base.TimeAction;
import jp.mosp.time.bean.ApplicationReferenceBeanInterface;
import jp.mosp.time.bean.CutoffReferenceBeanInterface;
import jp.mosp.time.bean.PaidHolidayHistorySearchBeanInterface;
import jp.mosp.time.bean.PaidHolidayTransactionRegistBeanInterface;
import jp.mosp.time.bean.TimeSettingReferenceBeanInterface;
import jp.mosp.time.constant.TimeConst;
import jp.mosp.time.constant.TimeMessageConst;
import jp.mosp.time.dto.settings.ApplicationDtoInterface;
import jp.mosp.time.dto.settings.CutoffDtoInterface;
import jp.mosp.time.dto.settings.PaidHolidayDataDtoInterface;
import jp.mosp.time.dto.settings.PaidHolidayDtoInterface;
import jp.mosp.time.dto.settings.PaidHolidayFirstYearDtoInterface;
import jp.mosp.time.dto.settings.PaidHolidayHistoryListDtoInterface;
import jp.mosp.time.dto.settings.PaidHolidayTransactionDtoInterface;
import jp.mosp.time.dto.settings.StockHolidayDataDtoInterface;
import jp.mosp.time.dto.settings.StockHolidayDtoInterface;
import jp.mosp.time.dto.settings.StockHolidayTransactionDtoInterface;
import jp.mosp.time.dto.settings.TimeSettingDtoInterface;
import jp.mosp.time.settings.base.TimeSettingAction;
import jp.mosp.time.settings.vo.PaidHolidayHistoryVo;

/**
 * 各従業員に対して有給休暇の手動付与を行う。<br>
 * 以下のコマンドを扱う。<br>
 * <ul><li>
 * {@link #CMD_SHOW}
 * </li><li>
 * {@link #CMD_SELECT_SHOW}
 *  * </li><li>
 * {@link #CMD_SEARCH}
 *  * </li><li>
 * {@link #CMD_RE_SHOW}
 * </li><li>
 * {@link #CMD_SORT}
 * </li><li>
 * {@link #CMD_PAGE}
 * </li><li>
 * {@link #CMD_INSERT_MODE}
 * </li><li>
 * {@link #CMD_EDIT_TARGET}
 * </li><li>
 */
public class PaidHolidayHistoryAction extends TimeSettingAction {
	
	/**
	 * 表示コマンド。<br>
	 * <br>
	 * 初期表示を行う。<br>
	 */
	public static final String	CMD_SHOW				= "TM4420";
	
	/**
	 * 選択表示コマンド。<br>
	 * <br>
	 * 有給休暇確認画面で選択したレコードの情報を編集欄に入力した状態の編集モードで表示を行う。<br>
	 */
	public static final String	CMD_SELECT_SHOW			= "TM4421";
	
	/**
	 * 検索コマンド。<br>
	 * <br>
	 * 検索欄に入力した情報を基に人事情報の検索を行う。<br>
	 */
	public static final String	CMD_SEARCH				= "TM4422";
	
	/**
	 * 再表示コマンド。<br>
	 * <br>
	 * 新たに休暇の付与・破棄を行った際に検索結果一覧にそれらが反映されるよう再表示を行う。<br>
	 */
	public static final String	CMD_RE_SHOW				= "TM4423";
	
	/**
	 * 登録コマンド。<br>
	 * <br>
	 * 編集欄に入力した内容を基に従業員別の有給休暇の保有数を管理するテーブルに登録する。<br>
	 * 有効日が入力されていない状態で登録を行おうとした場合は場合はエラーメッセージにて通知し、処理は実行されない。<br>
	 */
	public static final String	CMD_REGIST				= "TM4425";
	
	/**
	 * コマンド。<br>
	 * <br>
	 * <br>
	 * <br>
	 */
	public static final String	CMD_PAIDHOLIDAY_CALC	= "TM4426";
	
	/**
	 * ソートコマンド。<br>
	 * <br>
	 * それぞれのレコードの値を比較して一覧表示欄の各情報毎に並び替えを行う。<br>
	 * これが実行される度に並び替えが昇順・降順と交互に切り替わる。<br>
	 */
	public static final String	CMD_SORT				= "TM4428";
	
	/**
	 * ページ繰りコマンド。<br>
	 * <br>
	 * 検索処理を行った際に検索結果が100件を超えた場合に分割されるページ間の遷移を行う。<br>
	 */
	public static final String	CMD_PAGE				= "TM4429";
	
	/**
	 * 社員コード決定コマンド。<br>
	 * <br>
	 * 入力された社員コードを基に該当の社員情報を検索し、社員名のラベルに氏名を出力する。<br>
	 * 以降、ここで決定した社員の休暇の付与履歴参照や付与・控除といったことを行うことができる。<br>
	 */
	public static final String	CMD_SET_EMPLOYEE_CODE	= "TM4470";
	
	/**
	 * 新規登録モード切替コマンド。<br>
	 * <br>
	 * 編集テーブルの各入力欄に表示されているレコード内容をクリアにする。登録ボタンクリック時のコマンドを登録コマンドに切り替える。<br>
	 * 編集テーブルヘッダに表示されている新規登録モード切替リンクを非表示にする。<br>
	 */
	public static final String	CMD_INSERT_MODE			= "TM4471";
	
	/**
	 * 編集モード切替コマンド。<br>
	 * <br>
	 * 選択したレコードの内容を編集欄に表示させ、編集モードに切り替える。<br>
	 */
	
	public static final String	CMD_EDIT_TARGET			= "TM4472";
	
	/**
	 * 有効日決定コマンド。<br>
	 * <br>
	 * 決定した有効日時点で有効な勤務地、雇用契約、職位、所属の情報を取得し、コードと名称をプルダウンで表示する。<br>
	 */
	public static final String	CMD_SET_ACTIVATE_DATE	= "TM4477";
	

	/**
	 * {@link TimeAction#TimeAction()}を実行する。<br>
	 */
	public PaidHolidayHistoryAction() {
		super();
		// パンくずリスト用コマンド設定
		topicPathCommand = CMD_RE_SHOW;
	}
	
	@Override
	protected BaseVo getSpecificVo() {
		return new PaidHolidayHistoryVo();
	}
	
	@Override
	public void action() throws MospException {
		// コマンド毎の処理
		if (mospParams.getCommand().equals(CMD_SHOW)) {
			// 表示
			prepareVo(false, false);
			show();
		} else if (mospParams.getCommand().equals(CMD_SELECT_SHOW)) {
			// 選択表示
			prepareVo();
			select();
		} else if (mospParams.getCommand().equals(CMD_SEARCH)) {
			// 検索処理
			prepareVo();
			search();
		} else if (mospParams.getCommand().equals(CMD_RE_SHOW)) {
			// 再表示
			prepareVo(true, false);
			search();
		} else if (mospParams.getCommand().equals(CMD_REGIST)) {
			// 登録
			prepareVo();
			regist();
		} else if (mospParams.getCommand().equals(CMD_PAIDHOLIDAY_CALC)) {
			// 付与日数/時間再計算
			prepareVo();
			paidHolydayCalc();
		} else if (mospParams.getCommand().equals(CMD_SORT)) {
			// ソート
			prepareVo();
			sort();
		} else if (mospParams.getCommand().equals(CMD_PAGE)) {
			// ページ繰り
			prepareVo();
			page();
		} else if (mospParams.getCommand().equals(CMD_SET_EMPLOYEE_CODE)) {
			// 社員コード決定
			prepareVo();
			setEmployeeCode();
		} else if (mospParams.getCommand().equals(CMD_INSERT_MODE)) {
			// 新規登録モード切替
			prepareVo();
			insertMode();
		} else if (mospParams.getCommand().equals(CMD_EDIT_TARGET)) {
			// 編集対象決定
			prepareVo();
			editMode();
		} else if (mospParams.getCommand().equals(CMD_SET_ACTIVATE_DATE)) {
			// 有効日決定
			prepareVo();
			setActivationDate();
		}
	}
	
	/**
	 * 初期表示処理を行う。<br>
	 * @throws MospException 例外発生時
	 */
	protected void show() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 初期値設定
		setDefaultValues();
		// ページ繰り設定
		setPageInfo(CMD_PAGE, getListLength());
		// プルダウン設定
		setPulldown();
		// モード設定
		insertMode();
		// ソートキー設定
		vo.setComparatorName(ActivateDateComparator.class.getName());
	}
	
	/**
	 * 選択表示処理を行う。
	 * @throws MospException 例外処理発生時
	 */
	protected void select() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// ページ繰り設定
		setPageInfo(CMD_PAGE, getListLength());
		// 初期化
		setDefaultValues();
		// プルダウン設定
		setPulldown();
		// ソートキー設定
		vo.setComparatorName(ActivateDateComparator.class.getName());
		// 遷移汎用コード及び有効日から履歴編集対象を取得し編集モードを設定
		setEditUpdateMode(getPersonalId(getTransferredCode()), getDate(getTransferredActivateDate()));
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// モード設定
		vo.setModeCardEdit(PlatformConst.MODE_CARD_EDIT_INSERT);
		// 取得した社員コードとシステム日付から個人IDを取得する
		Date date = DateUtility.getDate(getTransferredActivateDate());
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(getTransferredCode(), date);
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		// 社員コードモード設定
		vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
		// 有効日/社員コードを設定
		vo.setTxtEditActivateYear(DateUtility.getStringYear(date));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(date));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(date));
		vo.setTxtEditEmployeeCode(getTransferredCode());
		// 検索した社員名を設定する
		vo.setLblEmployeeName(getLastFirstName(humanDto.getLastName(), humanDto.getFirstName()));
		// 有給休暇の取得/設定
		setPaidHolidayActiveDateEmployeeCode();
	}
	
	/**
	 * @throws MospException 例外処理が発生した場合 
	 */
	protected void search() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 検索クラス取得
		PaidHolidayHistorySearchBeanInterface search = timeReference().paidHolidayHistorySearch();
		// VOの値を検索クラスへ設定
		search.setActivateDate(getSearchActivateDate());
		search.setEmployeeCode(vo.getTxtSearchEmployeeCode());
		search.setEmployeeName(vo.getTxtSearchEmployeeName());
		search.setWorkPlaceCode(vo.getPltSearchWorkPlace());
		search.setEmploymentCode(vo.getPltSearchEmployment());
		search.setSectionCode(vo.getPltSearchSection());
		search.setPositionCode(vo.getPltSearchPosition());
		search.setInactivateFlag(vo.getPltSearchInactivate());
		// 検索条件をもとに検索クラスからマスタリストを取得
		List<PaidHolidayHistoryListDtoInterface> list = search.getSearchList();
		// 検索結果リスト設定
		vo.setList(list);
		// デフォルトソートキー及びソート順設定
		vo.setComparatorName(ActivateDateComparator.class.getName());
		vo.setAscending(false);
		// ソート
		sort();
		// 検索結果確認
		if (list.size() == 0) {
			// 検索結果無しメッセージ設定
			addNoSearchResultMessage();
		}
	}
	
	/**
	 * 登録処理を行う。<br>
	 * @throws MospException インスタンスの取得或いはSQL実行に失敗した場合
	 */
	protected void regist() throws MospException {
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 編集モード確認
		if (vo.getModeCardEdit().equals(PlatformConst.MODE_CARD_EDIT_INSERT)) {
			// 新規登録
			insert();
		} else if (vo.getModeCardEdit().equals(PlatformConst.MODE_CARD_EDIT_EDIT)) {
			// 履歴更新
			update();
		}
	}
	
	/**
	 * 付与日数/時間の再計算処理を行う。<br>
	 * @throws MospException 比較クラスのインスタンス生成に失敗した場合
	 */
	protected void paidHolydayCalc() throws MospException {
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		
		// 変更前合計値取得
		Double beforeFormerDate = Double.valueOf(vo.getLblBeforeFormerDate());
		Double beforeFormerTime = Double.valueOf(vo.getLblBeforeFormerTime());
		Double beforeDate = Double.valueOf(vo.getLblBeforeDate());
		Double beforeTime = Double.valueOf(vo.getLblBeforeTime());
		Double beforeStockDate = Double.valueOf(vo.getLblBeforeStockDate());
		
		// 付与値取得
		Double editFormerDate = 0.0;
		Double editFormerTime = 0.0;
		Double editDate = 0.0;
		Double editTime = 0.0;
		Double editStockDate = 0.0;
		if (vo.getTxtEditFormerGivingDay().isEmpty()) {
			vo.setTxtEditFormerGivingDay("0.0");
		} else {
			editFormerDate = Double.valueOf(vo.getTxtEditFormerGivingDay());
		}
		if (vo.getTxtEditFormerGivingTime().isEmpty()) {
			vo.setTxtEditFormerGivingTime("0");
		} else {
			editFormerTime = Double.valueOf(vo.getTxtEditFormerGivingTime());
		}
		if (vo.getTxtEditGivingDay().isEmpty()) {
			vo.setTxtEditGivingDay("0.0");
		} else {
			editDate = Double.valueOf(vo.getTxtEditGivingDay());
		}
		if (vo.getTxtEditGivingTime().isEmpty()) {
			vo.setTxtEditGivingTime("0");
		} else {
			editTime = Double.valueOf(vo.getTxtEditGivingTime());
		}
		if (vo.getTxtEditGivingStockDay().isEmpty()) {
			vo.setTxtEditGivingStockDay("0.0");
		} else {
			editStockDate = Double.valueOf(vo.getTxtEditGivingStockDay());
		}
		
		// 変更後合計値設定
		Double afterFormerDate = 0.0;
		Double afterFormerTime = 0.0;
		Double afterDate = 0.0;
		Double afterTime = 0.0;
		Double afterStockDate = 0.0;
		// 前年度付与日数設定
		if (vo.getPltEditFormerGivingType().equals("1")) {
			// 付与設定
			afterFormerDate = beforeFormerDate + editFormerDate;
			afterFormerTime = beforeFormerTime + editFormerTime;
		} else {
			// 廃棄設定
			afterFormerDate = beforeFormerDate - editFormerDate;
			afterFormerTime = beforeFormerTime - editFormerTime;
		}
		// 今年度付与日数設定
		if (vo.getPltEditGivingType().equals("1")) {
			// 付与設定
			afterDate = beforeDate + editDate;
			afterTime = beforeTime + editTime;
		} else {
			// 廃棄設定
			afterDate = beforeDate - editDate;
			afterTime = beforeTime - editTime;
		}
		// ストック付与日数設定
		if (vo.getPltEditStockType().equals("1")) {
			// 付与設定
			afterStockDate = beforeStockDate + editStockDate;
		} else {
			// 廃棄設定
			afterStockDate = beforeStockDate - editStockDate;
		}
		vo.setLblAfterFormerDate(String.valueOf(afterFormerDate));
		vo.setLblAfterFormerTime(String.valueOf(afterFormerTime));
		vo.setLblAfterDate(String.valueOf(afterDate));
		vo.setLblAfterTime(String.valueOf(afterTime));
		vo.setLblAfterStockDate(String.valueOf(afterStockDate));
		
		vo.setLblAfterTotalDate(String.valueOf(afterFormerDate + afterDate + afterStockDate));
		vo.setLblAfterTotalTime(String.valueOf(afterFormerTime + afterTime));
		
		vo.setClaAfterTotalDate(setHistoryDateTimeDoubleColor(afterFormerDate + afterDate + afterStockDate));
		vo.setClaAfterTotalTime(setHistoryDateTimeDoubleColor(afterFormerTime + afterTime));
		vo.setClaAfterFormerDate(setHistoryDateTimeDoubleColor(afterFormerDate));
		vo.setClaAfterFormerTime(setHistoryDateTimeDoubleColor(afterFormerTime));
		vo.setClaAfterDate(setHistoryDateTimeDoubleColor(afterDate));
		vo.setClaAfterTime(setHistoryDateTimeDoubleColor(afterTime));
		vo.setClaAfterStockDate(setHistoryDateTimeDoubleColor(afterStockDate));
	}
	
	/**
	 * 一覧のソート処理を行う。<br>
	 * @throws MospException 比較クラスのインスタンス生成に失敗した場合
	 */
	protected void sort() throws MospException {
		setVoList(sortList(getTransferredSortKey()));
	}
	
	/**
	 * 一覧のページ処理を行う。
	 * @throws MospException  比較クラスのインスタンス生成に失敗した場合
	 */
	protected void page() throws MospException {
		setVoList(pageList());
	}
	
	/**
	 * 入力された社員コードから社員名の設定を行う。<br>
	 * @throws MospException 例外処理発生時
	 */
	protected void setEmployeeCode() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 現在の社員コードモードを確認
		if (vo.getJsModeEmployeeCode().equals(PlatformConst.MODE_ACTIVATE_DATE_CHANGING)) {
			Date activateDate = getEditActivateDate();
			// 取得した社員コードとシステム日付から個人IDを取得する
			HumanDtoInterface humanDto = reference().human().getHumanInfoForEmployeeCode(vo.getTxtEditEmployeeCode(),
					activateDate);
			if (humanDto == null) {
				// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
				// 検索結果無しメッセージ設定
				addNotExistEmployeesErrorMessage();
				return;
			}
			String personalId = humanDto.getPersonalId();
			if (!reference().entrance().isEntered(personalId, activateDate)) {
				// 入社していない場合
				// 検索結果無しメッセージ設定
				addNotJoinedEmployeesErrorMessage(activateDate, getEmployeeCode(personalId));
				return;
			}
			if (reference().retirement().isRetired(personalId, activateDate)) {
				// 退職している場合
				// 検索結果無しメッセージ設定
				addNotRetirementEmployeesErrorMessage(activateDate, getEmployeeCode(personalId));
				return;
			}
			ApplicationDtoInterface appDto = timeReference().application().findForPerson(personalId, activateDate);
			timeReference().application().chkExistApplication(appDto, activateDate);
			if (mospParams.hasErrorMessage()) {
				return;
			}
			PaidHolidayDtoInterface paidDto = timeReference().paidHoliday().getPaidHolidayInfo(
					appDto.getPaidHolidayCode(), activateDate);
			if (paidDto == null) {
				mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("PaidVacation"), null);
				return;
			}
			if (paidDto.getTimelyPaidHolidayFlag() == 0) {
				// 時間単位取得が無効
				vo.setJsModeGivingtime("off");
			} else {
				// 時間単位取得が有効
				vo.setJsModeGivingtime("on");
			}
			// 検索した社員名を設定する
			vo.setLblEditEmployeeName(getLastFirstName(humanDto.getLastName(), humanDto.getFirstName()));
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
		} else {
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			// 初期化する
//			vo.setTxtEditEmployeeCode("");
			vo.setLblEditEmployeeName("");
			vo.setLblBeforeTotalDate("0");
			vo.setLblBeforeTotalTime("0");
			vo.setLblBeforeFormerDate("0");
			vo.setLblBeforeFormerTime("0");
			vo.setLblBeforeDate("0");
			vo.setLblBeforeTime("0");
			vo.setLblBeforeStockDate("0");
			vo.setTxtEditFormerGivingDay("0");
			vo.setTxtEditFormerGivingTime("0");
			vo.setTxtEditGivingDay("0");
			vo.setTxtEditGivingTime("0");
			vo.setTxtEditGivingStockDay("0");
			vo.setLblAfterTotalDate("0");
			vo.setLblAfterTotalTime("0");
			vo.setLblAfterFormerDate("0");
			vo.setLblAfterFormerTime("0");
			vo.setLblAfterDate("0");
			vo.setLblAfterTime("0");
			vo.setLblAfterStockDate("0");
			vo.setPltEditFormerGivingType("0");
			vo.setPltEditGivingType("0");
			vo.setPltEditStockType("0");
			vo.setJsModeGivingtime("off");
		}
	}
	
	/**
	 * 新規登録モードに設定する。<br>
	 */
	protected void insertMode() {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 編集モード設定
		vo.setModeCardEdit(PlatformConst.MODE_CARD_EDIT_INSERT);
		// 初期値設定
		setDefaultValues();
	}
	
	/**
	 * 履歴編集モードで画面を表示する。<br>
	 * 履歴編集対象は、遷移汎用コード及び有効日で取得する。<br>
	 * @throws MospException インスタンスの取得或いはSQL実行に失敗した場合
	 */
	protected void editMode() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 遷移汎用コード及び有効日から履歴編集対象を取得し編集モードを設定
		setEditUpdateMode(getPersonalId(getTransferredCode()), getDate(getTransferredActivateDate()));
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		Date date = DateUtility.getDate(getTransferredActivateDate());
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(getTransferredCode(), date);
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			vo.setModeCardEdit(PlatformConst.MODE_CARD_EDIT_INSERT);
			return;
		}
		// モード設定
		vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
		vo.setModeCardEdit(PlatformConst.MODE_CARD_EDIT_EDIT);
		// 有効日/社員コードを設定
		vo.setTxtEditActivateYear(DateUtility.getStringYear(date));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(date));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(date));
		vo.setTxtEditEmployeeCode(getTransferredCode());
		// 検索した社員名を設定する
		vo.setLblEmployeeName(getLastFirstName(humanDto.getLastName(), humanDto.getFirstName()));
	}
	
	/**
	 * 有効日(編集)設定処理を行う。<br>
	 * 保持有効日モードを確認し、モード及びプルダウンの再設定を行う。<br>
	 * @throws MospException プルダウンの取得に失敗した場合
	 */
	protected void setActivationDate() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 現在の有効日モードを確認
		if (vo.getModeActivateDate().equals(PlatformConst.MODE_ACTIVATE_DATE_CHANGING)) {
			// 有効日モード設定
			vo.setModeActivateDate(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
			// プルダウン取得
			setPulldown();
		} else {
			// 有効日モード設定
			vo.setModeActivateDate(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			// プルダウン設定
			vo.setAryPltSearchWorkPlace(getInputActivateDatePulldown());
			vo.setAryPltSearchEmployment(getInputActivateDatePulldown());
			vo.setAryPltSearchSection(getInputActivateDatePulldown());
			vo.setAryPltSearchPosition(getInputActivateDatePulldown());
		}
	}
	
	/**
	 * 新規登録処理を行う。<br>
	 * @throws MospException 例外処理発生時
	 */
	protected void insert() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 登録クラス取得
		PaidHolidayTransactionRegistBeanInterface regist = time().paidHolidayTransactionRegist();
		// 基準日と前月締日の日付チェック
		if (checkCutoffDayRecord() == false) {
			return;
		}
		// 今年度設定
		PaidHolidayDataDtoInterface dataDto = getPaidHolidayDataDto(getEditActivateDate());
		if (dataDto == null) {
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			addSalariedVacationExceptErrorMessage();
			return;
		}
		// DTOの準備
		PaidHolidayTransactionDtoInterface dto = regist.getInitDto();
		// DTOに値を設定
		setDtoFields(dto, dataDto.getAcquisitionDate());
		// 登録処理
		regist.insert(dto);
		// 登録結果確認
		if (mospParams.hasErrorMessage()) {
			// 登録失敗メッセージ設定
			addInsertFailedMessage();
			return;
		}
		
		PaidHolidayDataDtoInterface paidHolidayDataDto = timeReference().paidHolidayData().getPaidHolidayDataInfo(
				dto.getPersonalId(), dto.getActivateDate(), dto.getAcquisitionDate());
		if (paidHolidayDataDto == null) {
			time().paidHolidayDataRegist().insert(dataDto);
		}
		// 前年度設定
		PaidHolidayDataDtoInterface formerDataDto = getPaidHolidayDataDto(DateUtility
			.addYear(getEditActivateDate(), -1));
		if (formerDataDto == null) {
			if (Double.parseDouble(vo.getTxtEditFormerGivingDay()) > 0
					|| Integer.parseInt(vo.getTxtEditFormerGivingTime()) > 0) {
				// 社員コード決定モード設定
				vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
				addSalariedVacationExceptErrorMessage();
				return;
			}
			// DTOの準備
			PaidHolidayTransactionDtoInterface dtoFormer = regist.getInitDto();
			// DTOに値を設定
			setDtoFieldsFormer(dtoFormer, DateUtility.addYear(dataDto.getAcquisitionDate(), -1));
			// 登録処理
			regist.insert(dtoFormer);
			PaidHolidayDataDtoInterface formerPaidHolidayDataDto = timeReference().paidHolidayData()
				.getPaidHolidayDataInfo(dtoFormer.getPersonalId(), dtoFormer.getActivateDate(),
						dtoFormer.getAcquisitionDate());
			if (formerPaidHolidayDataDto == null) {
				formerDataDto = time().paidHolidayDataRegist().getInitDto();
				formerDataDto.setPersonalId(dataDto.getPersonalId());
				formerDataDto.setActivateDate(getEditActivateDate());
				formerDataDto.setAcquisitionDate(DateUtility.addYear(dataDto.getAcquisitionDate(), -1));
				formerDataDto.setLimitDate(DateUtility.addYear(dataDto.getLimitDate(), -1));
				formerDataDto.setTemporaryFlag(1);
				time().paidHolidayDataRegist().insert(formerDataDto);
			}
		} else {
			// DTOの準備
			PaidHolidayTransactionDtoInterface dtoFormer = regist.getInitDto();
			// DTOに値を設定
			setDtoFieldsFormer(dtoFormer, formerDataDto.getAcquisitionDate());
			// 登録処理
			regist.insert(dtoFormer);
			PaidHolidayDataDtoInterface formerPaidHolidayDataDto = timeReference().paidHolidayData()
				.getPaidHolidayDataInfo(dtoFormer.getPersonalId(), dtoFormer.getActivateDate(),
						dtoFormer.getAcquisitionDate());
			if (formerPaidHolidayDataDto == null) {
				time().paidHolidayDataRegist().insert(formerDataDto);
			}
		}
		// ストック設定
		StockHolidayDataDtoInterface stockDataDto = getStockHolidayDataDto(getEditActivateDate());
		if (stockDataDto == null) {
			if (Double.parseDouble(vo.getTxtEditGivingStockDay()) > 0) {
				// 社員コード決定モード設定
				vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
				mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_STOCK_VACATION_GRANT, DateUtility
					.getStringDate(getEditActivateDate()), vo.getTxtEditEmployeeCode());
				return;
			}
			stockDataDto = time().stockHolidayDataRegist().getInitDto();
			setStockHolidayDataDtoFields(stockDataDto, dataDto);
			// DTOの準備
			StockHolidayTransactionDtoInterface dtoStock = time().stockHolidayTransactionRegist().getInitDto();
			// DTOに値を設定
			setDtoFieldsStock(dtoStock, stockDataDto.getAcquisitionDate());
			// 登録処理
			time().stockHolidayTransactionRegist().insert(dtoStock);
			StockHolidayDataDtoInterface stockHolidayDataDto = timeReference().stockHolidayData()
				.getStockHolidayDataInfo(dtoStock.getPersonalId(), dtoStock.getActivateDate(),
						dtoStock.getAcquisitionDate());
			if (stockHolidayDataDto == null) {
				time().stockHolidayDataRegist().insert(stockDataDto);
			}
		} else {
			// DTOの準備
			StockHolidayTransactionDtoInterface dtoStock = time().stockHolidayTransactionRegist().getInitDto();
			// DTOに値を設定
			setDtoFieldsStock(dtoStock, stockDataDto.getAcquisitionDate());
			// 登録処理
			time().stockHolidayTransactionRegist().insert(dtoStock);
			StockHolidayDataDtoInterface stockHolidayDataDto = timeReference().stockHolidayData()
				.getStockHolidayDataInfo(dtoStock.getPersonalId(), dtoStock.getActivateDate(),
						dtoStock.getAcquisitionDate());
			if (stockHolidayDataDto == null) {
				time().stockHolidayDataRegist().insert(stockDataDto);
			}
		}
		// 登録結果確認
		if (mospParams.hasErrorMessage()) {
			// 登録失敗メッセージ設定
			addInsertFailedMessage();
			return;
		}
		// コミット
		commit();
		// 登録成功メッセージ設定
		addInsertNewMessage();
		// 履歴編集モード設定
		setEditUpdateMode(dto.getPersonalId(), dto.getActivateDate());
		// 検索有効日設定(登録有効日を検索条件に設定)
		setSearchActivateDate(getEditActivateDate());
		// 検索
		search();
	}
	
	/**
	 * 履歴編集処理を行う。<br>
	 * @throws MospException 例外処理発生時
	 */
	protected void update() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 登録クラス取得
		PaidHolidayTransactionRegistBeanInterface regist = time().paidHolidayTransactionRegist();
		// 基準日と前月締日の日付チェック
		if (checkCutoffDayRecord() == false) {
			return;
		}
		// 今年度設定
		PaidHolidayDataDtoInterface dataDto = getPaidHolidayDataDto(getEditActivateDate());
		if (dataDto == null) {
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			addNotWithPayVacationGrantErrorMessage();
			return;
		}
		// DTOの準備
		PaidHolidayTransactionDtoInterface dto = null;
		List<PaidHolidayTransactionDtoInterface> list = timeReference().paidHolidayTransaction().findForList(
				getPersonalId(vo.getTxtEditEmployeeCode()), getEditActivateDate());
		for (PaidHolidayTransactionDtoInterface paidHolidayTransactionDto : list) {
			if (paidHolidayTransactionDto.getAcquisitionDate().compareTo(dataDto.getAcquisitionDate()) == 0) {
				dto = paidHolidayTransactionDto;
				break;
			}
		}
		if (dto == null) {
			// 登録失敗メッセージ設定
			addInsertFailedMessage();
			return;
		}
		// DTOに値を設定
		setDtoFields(dto, dataDto.getAcquisitionDate());
		// 履歴編集処理
		regist.update(dto);
		// 前年度設定
		PaidHolidayDataDtoInterface formerDataDto = getPaidHolidayDataDto(DateUtility
			.addYear(getEditActivateDate(), -1));
		if (formerDataDto == null) {
			formerDataDto = timeReference().paidHolidayData().findForKey(dataDto.getPersonalId(),
					getEditActivateDate(), DateUtility.addYear(dataDto.getAcquisitionDate(), -1));
			if (formerDataDto == null) {
				// 社員コード決定モード設定
				vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
				addNotWithPayVacationGrantErrorMessage();
				return;
			}
		}
		// DTOの準備
		PaidHolidayTransactionDtoInterface dtoFormer = null;
		for (PaidHolidayTransactionDtoInterface paidHolidayTransactionDto : list) {
			if (paidHolidayTransactionDto.getAcquisitionDate().compareTo(formerDataDto.getAcquisitionDate()) == 0) {
				dtoFormer = paidHolidayTransactionDto;
				break;
			}
		}
		if (dtoFormer == null) {
			// 登録失敗メッセージ設定
			addInsertFailedMessage();
			return;
		}
		// DTOに値を設定
		setDtoFieldsFormer(dtoFormer, formerDataDto.getAcquisitionDate());
		// 履歴編集処理
		regist.update(dtoFormer);
		// ストック設定
		StockHolidayDataDtoInterface stockDataDto = getStockHolidayDataDto(getEditActivateDate());
		if (stockDataDto == null) {
			Date acquisitionDate = DateUtility.addDay(dataDto.getLimitDate(), 1);
			while (getEditActivateDate().before(acquisitionDate)) {
				acquisitionDate = DateUtility.addYear(acquisitionDate, -1);
			}
			stockDataDto = timeReference().stockHolidayData().findForKey(dataDto.getPersonalId(),
					getEditActivateDate(), acquisitionDate);
			if (stockDataDto == null) {
				// 社員コード決定モード設定
				vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
				mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_STOCK_VACATION_GRANT, DateUtility
					.getStringDate(getEditActivateDate()), vo.getTxtEditEmployeeCode());
				return;
			}
		}
		// DTOの準備
		StockHolidayTransactionDtoInterface dtoStock = timeReference().stockHolidayTransaction().findForKey(
				getPersonalId(vo.getTxtEditEmployeeCode()), getEditActivateDate(), stockDataDto.getAcquisitionDate());
		// DTOに値を設定
		setDtoFieldsStock(dtoStock, stockDataDto.getAcquisitionDate());
		// 履歴編集処理
		time().stockHolidayTransactionRegist().update(dtoStock);
		// 履歴編集結果確認
		if (mospParams.hasErrorMessage()) {
			// 履歴編集失敗メッセージ設定
			addUpdateFailedMessage();
			return;
		}
		// コミット
		commit();
		// 履歴編集成功メッセージ設定
		addUpdateHistoryMessage();
		// 履歴編集モード設定
		setEditUpdateMode(dto.getPersonalId(), dto.getActivateDate());
		// 検索有効日設定(登録有効日を検索条件に設定)
		setSearchActivateDate(getEditActivateDate());
		// 検索
		search();
	}
	
	/**
	 * 初期値を設定する。<br>
	 */
	public void setDefaultValues() {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// システム日付取得
		Date date = DateUtility.getSystemDate();
		// 検索項目設定
		vo.setTxtEditActivateYear(DateUtility.getStringYear(date));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(date));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(date));
		vo.setTxtEditEmployeeCode("");
		if (getTransferredCode() != null) {
			vo.setTxtEditEmployeeCode(getTransferredCode());
		}
		vo.setLblEditEmployeeName("");
		vo.setPltEditInactivate(String.valueOf(MospConst.DELETE_FLAG_OFF));
		vo.setTxtSearchActivateYear(DateUtility.getStringYear(date));
		vo.setTxtSearchActivateMonth(DateUtility.getStringMonth(date));
		vo.setTxtSearchActivateDay(DateUtility.getStringDay(date));
		vo.setTxtSearchEmployeeCode("");
		vo.setTxtSearchEmployeeName("");
		
		vo.setPltSearchWorkPlace("");
		vo.setPltSearchEmployment("");
		vo.setPltSearchSection("");
		vo.setPltSearchPosition("");
		
		vo.setLblBeforeTotalDate("0");
		vo.setLblBeforeTotalTime("0");
		vo.setLblBeforeFormerDate("0");
		vo.setLblBeforeFormerTime("0");
		vo.setLblBeforeDate("0");
		vo.setLblBeforeTime("0");
		vo.setLblBeforeStockDate("0");
		
		vo.setTxtEditFormerGivingDay("0");
		vo.setTxtEditFormerGivingTime("0");
		vo.setTxtEditGivingDay("0");
		vo.setTxtEditGivingTime("0");
		vo.setTxtEditGivingStockDay("0");
		
		vo.setLblAfterTotalDate("0");
		vo.setLblAfterTotalTime("0");
		vo.setLblAfterFormerDate("0");
		vo.setLblAfterFormerTime("0");
		vo.setLblAfterDate("0");
		vo.setLblAfterTime("0");
		vo.setLblAfterStockDate("0");
		
		vo.setTxtUpdateActivateYear(DateUtility.getStringYear(date));
		vo.setTxtUpdateActivateMonth(DateUtility.getStringMonth(date));
		vo.setTxtUpdateActivateDay(DateUtility.getStringDay(date));
		vo.setPltUpdateInactivate("");
		vo.setPltEditFormerGivingType("0");
		vo.setPltEditGivingType("0");
		vo.setPltEditStockType("0");
		vo.setJsModeGivingtime("off");
		vo.setClaAfterTotalDate("");
		vo.setClaAfterTotalTime("");
		vo.setClaAfterFormerDate("");
		vo.setClaAfterFormerTime("");
		vo.setClaAfterDate("");
		vo.setClaAfterTime("");
		vo.setClaAfterStockDate("");
		vo.setClaBeforeTotalDate("");
		vo.setClaBeforeTotalTime("");
		vo.setClaBeforeFormerDate("");
		vo.setClaBeforeFormerTime("");
		vo.setClaBeforeDate("");
		vo.setClaBeforeTime("");
		vo.setClaBeforeStockDate("");
		// 有効日モード設定
		vo.setModeActivateDate(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
		// 社員コードモード設定
		vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
	}
	
	/**
	 * プルダウン設定
	 * @throws MospException 例外発生時
	 */
	private void setPulldown() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// プルダウンの設定
		// 付与区分プルダウン
		MospProperties properties = mospParams.getProperties();
		String[][] aryGivingType = properties.getCodeArray(TimeConst.CODE_GIVING_TYPE, false);
		vo.setAryPltFormerGivingType(aryGivingType);
		vo.setAryPltGivingType(aryGivingType);
		vo.setAryPltStockType(aryGivingType);
		// システム日付取得
		Date date = DateUtility.getSystemDate();
		// 勤務地
		String[][] aryWorkPlace = reference().workPlace().getCodedSelectArray(date, true, null);
		vo.setAryPltSearchWorkPlace(aryWorkPlace);
		// 雇用契約
		String[][] aryEmployment = reference().employmentContract().getCodedSelectArray(date, true, null);
		vo.setAryPltSearchEmployment(aryEmployment);
		// 所属
		String[][] arySection = reference().section().getNameSelectArray(date, true, null);
		vo.setAryPltSearchSection(arySection);
		// 職位
		String[][] aryPosition = reference().position().getCodedSelectArray(date, true, null);
		vo.setAryPltSearchPosition(aryPosition);
	}
	
	/**
	 * 検索結果リストの内容をVOに設定する。<br>
	 * @param list 対象リスト
	 * @throws MospException インスタンスの取得及びSQL実行に失敗した場合
	 */
	protected void setVoList(List<? extends BaseDtoInterface> list) throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// データ配列初期化
		long[] aryCkbRecordId = new long[list.size()];
		String[] aryLblActivateDate = new String[list.size()];
		String[] aryLblEmployeeCode = new String[list.size()];
		String[] aryLblEmployeeName = new String[list.size()];
		String[] aryLblSection = new String[list.size()];
		String[] aryLblFormerDate = new String[list.size()];
		String[] aryLblFormerTime = new String[list.size()];
		String[] aryLblDate = new String[list.size()];
		String[] aryLblTime = new String[list.size()];
		String[] aryLblStockDate = new String[list.size()];
		String[] aryLblInactivate = new String[list.size()];
		String[] aryClaFormerDate = new String[list.size()];
		String[] aryClaFormerTime = new String[list.size()];
		String[] aryClaDate = new String[list.size()];
		String[] aryClaTime = new String[list.size()];
		String[] aryClaStockDate = new String[list.size()];
		
		// データ作成
		for (int i = 0; i < list.size(); i++) {
			// リストから情報を取得
			PaidHolidayHistoryListDtoInterface dto = (PaidHolidayHistoryListDtoInterface)list.get(i);
			SectionReferenceBeanInterface getSection = reference().section();
			Date date = DateUtility.getSystemDate();
			// 配列に情報を設定
			aryCkbRecordId[i] = dto.getTmdPaidHolidayHistoryListId();
			aryLblActivateDate[i] = DateUtility.getStringDate(dto.getActivateDate());
			aryLblEmployeeCode[i] = dto.getEmployeeCode();
			aryLblEmployeeName[i] = getLastFirstName(dto.getLastName(), dto.getFirstName());
			aryLblSection[i] = getSection.getSectionAbbr(dto.getSectionCode(), date);
			aryLblFormerDate[i] = getNumberString(dto.getFormerDate(), 1);
			aryClaFormerDate[i] = setHistoryDateTimeDoubleColor(dto.getFormerDate());
			aryLblFormerTime[i] = String.valueOf(dto.getFormerTime());
			aryClaFormerTime[i] = setHistoryDateTimeColor(dto.getFormerTime());
			aryLblDate[i] = getNumberString(dto.getDate(), 1);
			aryClaDate[i] = setHistoryDateTimeDoubleColor(dto.getDate());
			aryLblTime[i] = String.valueOf(dto.getTime());
			aryClaTime[i] = setHistoryDateTimeColor(dto.getTime());
			aryLblStockDate[i] = getNumberString(dto.getStockDate(), 1);
			aryClaStockDate[i] = setHistoryDateTimeDoubleColor(dto.getStockDate());
			aryLblInactivate[i] = getInactivateFlagName(dto.getInactivateFlag());
		}
		// データをVOに設定
		vo.setAryCkbRecordId(aryCkbRecordId);
		vo.setAryLblActivateDate(aryLblActivateDate);
		vo.setAryLblEmployeeCode(aryLblEmployeeCode);
		vo.setAryLblEmployeeName(aryLblEmployeeName);
		vo.setAryLblSection(aryLblSection);
		vo.setAryLblFormerDate(aryLblFormerDate);
		vo.setAryLblFormerTime(aryLblFormerTime);
		vo.setAryLblDate(aryLblDate);
		vo.setAryLblTime(aryLblTime);
		vo.setAryLblStockDate(aryLblStockDate);
		vo.setAryClaFormerDate(aryClaFormerDate);
		vo.setAryClaFormerTime(aryClaFormerTime);
		vo.setAryClaDate(aryClaDate);
		vo.setAryClaTime(aryClaTime);
		vo.setAryClaStockDate(aryClaStockDate);
		vo.setAryLblInactivate(aryLblInactivate);
	}
	
	/**
	 * VO(編集項目)の値をDTOに設定する。（今年度）<br>
	 * @param dto 対象DTO
	 * @param acquisitionDate 取得日
	 * @throws MospException 例外発生時
	 */
	protected void setDtoFields(PaidHolidayTransactionDtoInterface dto, Date acquisitionDate) throws MospException {
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// VOの値をDTOに設定
		dto.setTmtPaidHolidayId(vo.getTmtPaidHolidayId());
		dto.setActivateDate(getEditActivateDate());
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(vo.getTxtEditEmployeeCode(),
				getEditActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		dto.setPersonalId(humanDto.getPersonalId());
		dto.setInactivateFlag(Integer.valueOf(vo.getPltEditInactivate()));
		if (vo.getPltEditGivingType().equals("1")) {
			// 付与設定
			dto.setGivingDay(dto.getGivingDay() + Double.valueOf(vo.getTxtEditGivingDay()));
			dto.setGivingHour(dto.getGivingHour() + Integer.valueOf(vo.getTxtEditGivingTime()));
		} else {
			// 廃棄設定
			dto.setCancelDay(dto.getCancelDay() + Double.valueOf(vo.getTxtEditGivingDay()));
			dto.setCancelHour(dto.getCancelHour() + Integer.valueOf(vo.getTxtEditGivingTime()));
		}
		dto.setAcquisitionDate(acquisitionDate);
	}
	
	/**
	 * DTOの値をVO(編集項目)に設定する。（今年度）<br>
	 * @param dto 対象DTO
	 * @throws MospException 例外発生時
	 */
	public void setVoFields(PaidHolidayTransactionDtoInterface dto) throws MospException {
		Double date = 0.0;
		int time = 0;
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// DTOの値をVOに設定
		vo.setTmtPaidHolidayId(dto.getTmtPaidHolidayId());
		vo.setTxtEditActivateYear(DateUtility.getStringYear(dto.getActivateDate()));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(dto.getActivateDate()));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(dto.getActivateDate()));
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfo(dto.getPersonalId(), dto.getActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		vo.setTxtEditEmployeeCode(humanDto.getEmployeeCode());
		vo.setPltEditInactivate(String.valueOf(dto.getInactivateFlag()));
		date = dto.getGivingDay() - dto.getCancelDay();
		time = dto.getGivingHour() - dto.getCancelHour();
		vo.setLblBeforeDate(getNumberString(date, 1));
		vo.setLblBeforeTime(String.valueOf(time));
		vo.setPltEditGivingType("1");
		vo.setClaBeforeDate(setHistoryDateTimeDoubleColor(date));
		vo.setClaBeforeTime(setHistoryDateTimeDoubleColor(time));
	}
	
	/**
	 * VO(編集項目)の値をDTOに設定する。（前年度）<br>
	 * @param dto 対象DTO
	 * @param acquisitionDate 取得日
	 * @throws MospException 例外発生時
	 */
	protected void setDtoFieldsFormer(PaidHolidayTransactionDtoInterface dto, Date acquisitionDate)
			throws MospException {
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// VOの値をDTOに設定
		dto.setTmtPaidHolidayId(vo.getTmtPaidHolidayFormerId());
		dto.setActivateDate(getEditActivateDate());
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(vo.getTxtEditEmployeeCode(), dto
			.getActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		dto.setPersonalId(humanDto.getPersonalId());
		dto.setInactivateFlag(Integer.valueOf(vo.getPltEditInactivate()));
		if (vo.getPltEditFormerGivingType().equals("1")) {
			// 付与設定
			Double day = dto.getGivingDay() + Double.valueOf(vo.getTxtEditFormerGivingDay());
			dto.setGivingDay(Double.valueOf(day));
			int hour = dto.getGivingHour() + Integer.valueOf(vo.getTxtEditFormerGivingTime());
			dto.setGivingHour(hour);
		} else {
			// 廃棄設定
			Double day = dto.getCancelDay() + Double.valueOf(vo.getTxtEditFormerGivingDay());
			dto.setCancelDay(Double.valueOf(day));
			int hour = dto.getCancelHour() + Integer.valueOf(vo.getTxtEditFormerGivingTime());
			dto.setCancelHour(hour);
		}
		dto.setAcquisitionDate(acquisitionDate);
	}
	
	/**
	 * DTOの値をVO(編集項目)に設定する。（前年度）<br>
	 * @param dto 対象DTO
	 * @throws MospException 例外発生時
	 */
	public void setVoFieldsFormer(PaidHolidayTransactionDtoInterface dto) throws MospException {
		Double date = 0.0;
		int time = 0;
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// DTOの値をVOに設定
		vo.setTmtPaidHolidayFormerId(dto.getTmtPaidHolidayId());
		vo.setTxtEditActivateYear(DateUtility.getStringYear(dto.getActivateDate()));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(dto.getActivateDate()));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(dto.getActivateDate()));
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfo(dto.getPersonalId(), dto.getActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		vo.setTxtEditEmployeeCode(humanDto.getEmployeeCode());
		vo.setPltEditInactivate(String.valueOf(dto.getInactivateFlag()));
		date = dto.getGivingDay() - dto.getCancelDay();
		time = dto.getGivingHour() - dto.getCancelHour();
		vo.setLblBeforeFormerDate(getNumberString(date, 1));
		vo.setLblBeforeFormerTime(String.valueOf(time));
		vo.setClaBeforeFormerDate(setHistoryDateTimeDoubleColor(date));
		vo.setClaBeforeFormerTime(setHistoryDateTimeDoubleColor(time));
		vo.setPltEditFormerGivingType("1");
	}
	
	/**
	 * VO(編集項目)の値をDTOに設定する。（ストック）<br>
	 * @param dto 対象DTO
	 * @param acquisitionDate 取得日
	 * @throws MospException 例外発生時
	 */
	protected void setDtoFieldsStock(StockHolidayTransactionDtoInterface dto, Date acquisitionDate)
			throws MospException {
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// VOの値をDTOに設定
		dto.setTmtStockHolidayId(vo.getTmtStockHolidayId());
		dto.setActivateDate(getEditActivateDate());
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(vo.getTxtEditEmployeeCode(), dto
			.getActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		dto.setPersonalId(humanDto.getPersonalId());
		dto.setInactivateFlag(Integer.valueOf(vo.getPltEditInactivate()));
		Double givingDay = 0.0;
		if (vo.getPltEditStockType().equals("1")) {
			// 付与設定
			givingDay = dto.getGivingDay() + Double.valueOf(vo.getTxtEditGivingStockDay());
			dto.setGivingDay(givingDay);
		} else {
			// 廃棄設定
			givingDay = dto.getCancelDay() + Double.valueOf(vo.getTxtEditGivingStockDay());
			dto.setCancelDay(givingDay);
		}
		dto.setAcquisitionDate(acquisitionDate);
	}
	
	/**
	 * DTOの値をVO(編集項目)に設定する。（ストック）<br>
	 * @param dto 対象DTO
	 * @throws MospException 例外発生時
	 */
	public void setVoFieldsStock(StockHolidayTransactionDtoInterface dto) throws MospException {
		Double date = 0.0;
		Double totalDate = 0.0;
		int totalTime = 0;
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// DTOの値をVOに設定
		vo.setTmtStockHolidayId(dto.getTmtStockHolidayId());
		vo.setTxtEditActivateYear(DateUtility.getStringYear(dto.getActivateDate()));
		vo.setTxtEditActivateMonth(DateUtility.getStringMonth(dto.getActivateDate()));
		vo.setTxtEditActivateDay(DateUtility.getStringDay(dto.getActivateDate()));
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		// 取得した社員コードとシステム日付から個人IDを取得する
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfo(dto.getPersonalId(), dto.getActivateDate());
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			// 社員コード決定モード設定
			vo.setJsModeEmployeeCode(PlatformConst.MODE_ACTIVATE_DATE_CHANGING);
			return;
		}
		vo.setTxtEditEmployeeCode(humanDto.getEmployeeCode());
		vo.setPltEditInactivate(String.valueOf(dto.getInactivateFlag()));
		date = dto.getGivingDay() - dto.getCancelDay();
		vo.setLblBeforeStockDate(getNumberString(date, 1));
		vo.setClaBeforeStockDate(setHistoryDateTimeDoubleColor(date));
		vo.setPltEditStockType("1");
		// 合計値の計算
		totalDate = Double.valueOf(vo.getLblBeforeFormerDate()) + Double.valueOf(vo.getLblBeforeDate()) + date;
		totalTime = Integer.valueOf(vo.getLblBeforeFormerTime()) + Integer.valueOf(vo.getLblBeforeTime());
		vo.setLblBeforeTotalDate(getNumberString(totalDate, 1));
		vo.setLblBeforeTotalTime(String.valueOf(totalTime));
		vo.setClaBeforeTotalDate(setHistoryDateTimeDoubleColor(totalDate));
		vo.setClaBeforeTotalTime(setHistoryDateTimeDoubleColor(totalTime));
	}
	
	/**
	 * 履歴編集モードを設定する。<br>
	 * 所属コードと有効日で編集対象情報を取得する。<br>
	 * @param personalId 個人ID
	 * @param activateDate 有効日
	 * @throws MospException インスタンスの取得或いはSQL実行に失敗した場合
	 */
	protected void setEditUpdateMode(String personalId, Date activateDate) throws MospException {
		// 履歴編集対象取得
		List<PaidHolidayTransactionDtoInterface> list = timeReference().paidHolidayTransaction().findForInfoList(
				personalId, activateDate, "0");
		PaidHolidayTransactionDtoInterface dto = null;
		// 検索結果がないならエラーとする
		if (list.isEmpty()) {
			// 有給休暇トランザクションテーブルに該当する社員のデータが無い場合は処理終了
//			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			return;
		}
		for (int i = 0; i < list.size(); i++) {
			dto = list.get(i);
			// 存在確認
			checkSelectedDataExist(dto);
			// VOにセット
			if (i == 0) {
				setVoFieldsFormer(dto);
			} else if (i == 1) {
				setVoFields(dto);
			}
		}
		// ストック休暇
		StockHolidayDataDtoInterface stockHolidayDataDto = getStockHolidayDataDto(activateDate);
		if (stockHolidayDataDto == null) {
			stockHolidayDataDto = time().stockHolidayDataRegist().getInitDto();
			PaidHolidayDataDtoInterface paidHolidayDataDto = getPaidHolidayDataDto(activateDate);
			if (paidHolidayDataDto == null) {
				return;
			}
			setStockHolidayDataDtoFields(stockHolidayDataDto, paidHolidayDataDto);
		}
		StockHolidayTransactionDtoInterface dtoStock = timeReference().stockHolidayTransaction()
			.getStockHolidayTransactionInfo(personalId, activateDate, stockHolidayDataDto.getAcquisitionDate());
		if (dtoStock == null) {
			return;
		}
		// 存在確認
		checkSelectedDataExist(dtoStock);
		// VOにセット
		setVoFieldsStock(dtoStock);
		// 編集モード(履歴編集)設定
		setEditUpdateMode(reference().section().getSectionHistory(personalId));
		// 有効日(編集)モード設定
		setModeActivateDate(PlatformConst.MODE_ACTIVATE_DATE_FIXED);
		// プルダウン設定
		setPulldown();
		paidHolydayCalc();
	}
	
	/**
	 * 有効日と社員コードから前年/今年度とストック休暇を取得する。<br>
	 * @throws MospException インスタンスの取得或いはSQL実行に失敗した場合
	 */
	protected void setPaidHolidayActiveDateEmployeeCode() throws MospException {
		Double givingDate = 0.0;
		int givingTime = 0;
		Double totalGivingDate = 0.0;
		int totalGivingTime = 0;
		double givingDay = 0.0;
		double cancelDay = 0.0;
		// VO取得
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// システム日付取得
		Date date = DateUtility.getSystemDate();
		HumanReferenceBeanInterface getHumanInfo = reference().human();
		HumanDtoInterface humanDto = getHumanInfo.getHumanInfoForEmployeeCode(vo.getTxtEditEmployeeCode(), date);
		if (humanDto == null) {
			// 取得したユーザIDに該当する人事マスタのデータがNULLなら処理終了
			mospParams.addErrorMessage(PlatformMessageConst.MSG_NO_ITEM, mospParams.getName("Employee"), null);
			return;
		}
		vo.setLblEditEmployeeName(getLastFirstName(humanDto.getLastName(), humanDto.getFirstName()));
		// 有効日と社員コードから有給休暇情報を取得する
		List<PaidHolidayTransactionDtoInterface> list = timeReference().paidHolidayTransaction().findForList(
				humanDto.getPersonalId(), getEditActivateDate());
		// リストから情報を取得
		if (list.isEmpty()) {
			return;
		}
		PaidHolidayTransactionDtoInterface dto1 = list.get(0);
		PaidHolidayTransactionDtoInterface dto2 = list.get(1);
		if (dto1.getAcquisitionDate().compareTo(dto2.getAcquisitionDate()) < 0) {
			givingDate = dto1.getGivingDay() - dto1.getCancelDay();
			givingTime = dto1.getGivingHour() - dto1.getCancelHour();
			vo.setLblBeforeFormerDate(getNumberString(givingDate, 1));
			vo.setLblBeforeFormerTime(String.valueOf(givingTime));
			vo.setClaBeforeFormerDate(setHistoryDateTimeDoubleColor(givingDate));
			vo.setClaBeforeFormerTime(setHistoryDateTimeColor(givingTime));
			givingDate = dto2.getGivingDay() - dto2.getCancelDay();
			givingTime = dto2.getGivingHour() - dto2.getCancelHour();
			vo.setLblBeforeDate(getNumberString(givingDate, 1));
			vo.setLblBeforeTime(String.valueOf(givingTime));
			vo.setClaBeforeDate(setHistoryDateTimeDoubleColor(givingDate));
			vo.setClaBeforeTime(setHistoryDateTimeColor(givingTime));
			date = dto2.getAcquisitionDate();
		} else {
			givingDate = dto2.getGivingDay() - dto2.getCancelDay();
			givingTime = dto2.getGivingHour() - dto2.getCancelHour();
			vo.setLblBeforeFormerDate(getNumberString(givingDate, 1));
			vo.setLblBeforeFormerTime(String.valueOf(givingTime));
			vo.setClaBeforeFormerDate(setHistoryDateTimeDoubleColor(givingDate));
			vo.setClaBeforeFormerTime(setHistoryDateTimeColor(givingTime));
			givingDate = dto1.getGivingDay() - dto1.getCancelDay();
			givingTime = dto1.getGivingHour() - dto1.getCancelHour();
			vo.setLblBeforeDate(getNumberString(givingDate, 1));
			vo.setLblBeforeTime(String.valueOf(givingTime));
			vo.setClaBeforeDate(setHistoryDateTimeDoubleColor(givingDate));
			vo.setClaBeforeTime(setHistoryDateTimeColor(givingTime));
			date = dto1.getAcquisitionDate();
		}
		StockHolidayTransactionDtoInterface stockDto = null;
		stockDto = timeReference().stockHolidayTransaction().findForKey(getPersonalId(vo.getTxtEditEmployeeCode()),
				getEditActivateDate(), date);
		if (stockDto != null) {
			givingDay = stockDto.getGivingDay();
			cancelDay = stockDto.getCancelDay();
		}
		
		givingDate = givingDay - cancelDay;
		vo.setLblBeforeStockDate(getNumberString(givingDate, 1));
		vo.setClaBeforeStockDate(setHistoryDateTimeDoubleColor(givingDate));
		totalGivingDate = Double.valueOf(vo.getLblBeforeFormerDate()) + Double.valueOf(vo.getLblBeforeDate())
				+ Double.valueOf(vo.getLblBeforeStockDate());
		totalGivingTime = Integer.valueOf(vo.getLblBeforeFormerTime()) + Integer.valueOf(vo.getLblBeforeTime());
		vo.setLblBeforeTotalDate(getNumberString(totalGivingDate, 1));
		vo.setLblBeforeTotalTime(String.valueOf(totalGivingTime));
		vo.setClaBeforeTotalDate(setHistoryDateTimeDoubleColor(totalGivingDate));
		vo.setClaBeforeTotalTime(setHistoryDateTimeColor(totalGivingTime));
		
		vo.setPltEditFormerGivingType("1");
		vo.setPltEditGivingType("1");
		vo.setPltEditStockType("1");
		vo.setLblAfterFormerDate("0");
		vo.setLblAfterFormerTime("0");
		vo.setLblAfterDate("0");
		vo.setLblAfterTime("0");
		vo.setLblAfterStockDate("0");
		totalGivingDate = Double.valueOf(vo.getLblAfterFormerDate()) + Double.valueOf(vo.getLblAfterDate())
				+ Double.valueOf(vo.getLblAfterStockDate());
		totalGivingTime = Integer.valueOf(vo.getLblAfterFormerTime()) + Integer.valueOf(vo.getLblAfterTime());
		vo.setLblAfterTotalDate(getNumberString(Integer.valueOf(vo.getLblAfterFormerDate())
				+ Integer.valueOf(vo.getLblAfterDate()) + Integer.valueOf(vo.getLblAfterStockDate()), 1));
		vo.setLblAfterTotalTime(String.valueOf(Integer.valueOf(vo.getLblAfterFormerTime())
				+ Integer.valueOf(vo.getLblAfterTime())));
		vo.setClaAfterTotalDate(setHistoryDateTimeDoubleColor(totalGivingDate));
		vo.setClaAfterTotalTime(setHistoryDateTimeColor(totalGivingTime));
	}
	
	/**
	 * 前月締日の日付チェック。<br>
	 * @return 結果成否
	 * @throws MospException 例外発生時
	 */
	protected boolean checkCutoffDayRecord() throws MospException {
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		// 参照クラス取得
		ApplicationReferenceBeanInterface application = timeReference().application();
		TimeSettingReferenceBeanInterface timeSetting = timeReference().timeSetting();
		CutoffReferenceBeanInterface cutoff = timeReference().cutoff();
		Date date = DateUtility.getSystemDate();
		ApplicationDtoInterface applicationDto = application.findForPerson(getPersonalId(vo.getTxtEditEmployeeCode()),
				date);
		application.chkExistApplication(applicationDto, date);
		if (mospParams.hasErrorMessage()) {
			// 該当する設定適用が存在しない
			return false;
		}
		TimeSettingDtoInterface timeSettingDto = timeSetting.getTimeSettingInfo(applicationDto.getWorkSettingCode(),
				date);
		timeSetting.chkExistTimeSetting(timeSettingDto, date);
		if (mospParams.hasErrorMessage()) {
			// 該当する勤怠設定が存在しない
			return false;
		}
		CutoffDtoInterface cutoffDto = cutoff.getCutoffInfo(timeSettingDto.getCutoffCode(), date);
		cutoff.chkExistCutoff(cutoffDto, date);
		if (mospParams.hasErrorMessage()) {
			// 該当する締日が存在しない
			return false;
		}
		Date cutoffDateOfLastMonth = DateUtility.getLastDateOfMonth(DateUtility.addMonth(DateUtility
			.getFirstDateOfMonth(date), -1));
		int cutoffDate = cutoffDto.getCutoffDate();
		if (cutoffDate != 0) {
			// 締日が末日でない場合
			cutoffDateOfLastMonth = DateUtility.getDate(DateUtility.getYear(date), DateUtility.getMonth(date),
					cutoffDate);
			while (!cutoffDateOfLastMonth.before(date)) {
				Date firstDateOfLastMonth = DateUtility.addMonth(
						DateUtility.getFirstDateOfMonth(cutoffDateOfLastMonth), -1);
				cutoffDateOfLastMonth = DateUtility.getDate(DateUtility.getYear(firstDateOfLastMonth), DateUtility
					.getMonth(firstDateOfLastMonth), cutoffDate);
			}
		}
		if (!getEditActivateDate().after(cutoffDateOfLastMonth)) {
			// 前月締日以前なのでエラーとする。
			String errorMes = DateUtility.getStringDate(DateUtility.addDay(cutoffDateOfLastMonth, 1));
			mospParams.addErrorMessage(TimeMessageConst.MSG_GRANT_DATE_MORE_PREVIOUS, errorMes, null);
			return false;
		}
		return true;
	}
	
	private void setStockHolidayDataDtoFields(StockHolidayDataDtoInterface dto,
			PaidHolidayDataDtoInterface paidHolidayDataDto) throws MospException {
		String personalId = paidHolidayDataDto.getPersonalId();
		Date activateDate = getEditActivateDate();
		ApplicationDtoInterface applicationDto = timeReference().application().findForPerson(personalId, activateDate);
		timeReference().application().chkExistApplication(applicationDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return;
		}
		PaidHolidayDtoInterface paidHolidayDto = timeReference().paidHoliday().getPaidHolidayInfo(
				applicationDto.getPaidHolidayCode(), getEditActivateDate());
		timeReference().paidHoliday().chkExistPaidHoliday(paidHolidayDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return;
		}
		StockHolidayDtoInterface stockHolidayDto = timeReference().stockHoliday().getStockHolidayInfo(
				paidHolidayDto.getPaidHolidayCode(), paidHolidayDto.getActivateDate());
		if (stockHolidayDto == null) {
			addNotStockVacationGrantErrorMessage();
			return;
		}
		dto.setPersonalId(personalId);
		dto.setActivateDate(activateDate);
		Date acquisitionDate = DateUtility.addDay(paidHolidayDataDto.getLimitDate(), 1);
		while (getEditActivateDate().before(acquisitionDate)) {
			acquisitionDate = DateUtility.addYear(acquisitionDate, -1);
		}
		dto.setAcquisitionDate(acquisitionDate);
		dto.setLimitDate(DateUtility.addDay(DateUtility.addMonth(dto.getAcquisitionDate(), stockHolidayDto
			.getStockLimitDate()), -1));
	}
	
	private PaidHolidayDataDtoInterface getPaidHolidayDataDto(Date activateDate) throws MospException {
		// TODO Beanに移す
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		EntranceDtoInterface entranceDto = reference().entrance().getEntranceInfo(
				getPersonalId(vo.getTxtEditEmployeeCode()));
		if (entranceDto == null) {
			addNotJoinedGrantErrorMessage();
			return null;
		}
		ApplicationDtoInterface applicationDto = timeReference().application().findForPerson(
				getPersonalId(vo.getTxtEditEmployeeCode()), getEditActivateDate());
		timeReference().application().chkExistApplication(applicationDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return null;
		}
		PaidHolidayDtoInterface paidHolidayDto = timeReference().paidHoliday().getPaidHolidayInfo(
				applicationDto.getPaidHolidayCode(), getEditActivateDate());
		timeReference().paidHoliday().chkExistPaidHoliday(paidHolidayDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return null;
		}
		Date entranceDate = entranceDto.getEntranceDate();
		int entranceYear = DateUtility.getYear(entranceDate);
		int entranceMonth = DateUtility.getMonth(entranceDate);
		int paidHolidayType = paidHolidayDto.getPaidHolidayType();
		if (paidHolidayType == 0) {
			// 基準日
			int pointMonth = paidHolidayDto.getPointDateMonth();
			int pointDay = paidHolidayDto.getPointDateDay();
			Date pointDate = DateUtility.getDate(entranceYear, pointMonth, pointDay);
			if (!entranceDate.before(pointDate)) {
				// 入社日が基準日より前でない場合は基準日に1年を加算する
				pointDate = DateUtility.getDate(entranceYear + 1, pointMonth, pointDay);
			}
			PaidHolidayFirstYearDtoInterface paidHolidayFirstYearDto = timeReference().paidHolidayFirstYear()
				.findForKey(paidHolidayDto.getPaidHolidayCode(), paidHolidayDto.getActivateDate(),
						DateUtility.getMonth(entranceDate));
			if (paidHolidayFirstYearDto != null) {
				// 初年度付与マスタが存在する場合
				Date acquisitionDate = DateUtility.addMonth(DateUtility.getDate(entranceYear, entranceMonth, pointDay),
						paidHolidayFirstYearDto.getGivingMonth());
				Date limitDate = DateUtility.addDay(DateUtility.addMonth(acquisitionDate, paidHolidayFirstYearDto
					.getGivingLimit()), -1);
				while (!pointDate.after(acquisitionDate)) {
					// 基準日が初年度付与日より後でない場合は基準日に1年を加算する
					pointDate = DateUtility.getDate(DateUtility.getYear(pointDate) + 1, pointMonth, pointDay);
				}
				if (activateDate.before(acquisitionDate)) {
					// 有効日が初年度付与日より前の場合
					return null;
				} else if (!activateDate.after(limitDate) && activateDate.before(pointDate)) {
					// 有効日が初年度付与日以降で初年度期限日より後でなく
					// 且つ有効日が基準日より前の場合
					PaidHolidayDataDtoInterface dto = time().paidHolidayDataRegist().getInitDto();
					dto.setPersonalId(getPersonalId(vo.getTxtEditEmployeeCode()));
					dto.setActivateDate(activateDate);
					dto.setAcquisitionDate(acquisitionDate);
					dto.setLimitDate(limitDate);
					dto.setTemporaryFlag(1);
					return dto;
				} else if (activateDate.before(pointDate)) {
					// 有効日が初年度期限日より後で且つ
					// 有効日が次の基準日より前の場合
					return null;
				}
			}
			while (pointDate.before(activateDate)) {
				// 基準日が有効日より前の場合
				pointDate = DateUtility.getDate(DateUtility.getYear(pointDate) + 1, pointMonth, pointDay);
			}
			if (pointDate.compareTo(activateDate) != 0) {
				// 基準日と有効日が同じでない場合
				pointDate = DateUtility.getDate(DateUtility.getYear(pointDate) - 1, pointMonth, pointDay);
			}
			PaidHolidayDataDtoInterface dto = time().paidHolidayDataRegist().getInitDto();
			dto.setPersonalId(getPersonalId(vo.getTxtEditEmployeeCode()));
			dto.setActivateDate(activateDate);
			dto.setAcquisitionDate(pointDate);
			if (paidHolidayDto.getMaxCarryOverYear() == MospConst.DELETE_FLAG_OFF) {
				// 有休繰越が有効の場合は期限は2年
				dto.setLimitDate(DateUtility.addDay(DateUtility.addYear(pointDate, 2), -1));
			} else if (paidHolidayDto.getMaxCarryOverYear() == MospConst.DELETE_FLAG_ON) {
				// 有休繰越が無効の場合は期限は1年
				dto.setLimitDate(DateUtility.addDay(DateUtility.addYear(pointDate, 1), -1));
			}
			dto.setTemporaryFlag(1);
			return dto;
		} else if (paidHolidayType == 1) {
			// TODO 未実装 入社月
			return null;
		} else if (paidHolidayType == 2) {
			// TODO 未実装 入社日
			return null;
		} else if (paidHolidayType == 3) {
			// 対象外
			return null;
		}
		return null;
	}
	
	private StockHolidayDataDtoInterface getStockHolidayDataDto(Date activateDate) throws MospException {
		// TODO Beanに移す
		// VO準備
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		EntranceDtoInterface entranceDto = reference().entrance().getEntranceInfo(
				getPersonalId(vo.getTxtEditEmployeeCode()));
		if (entranceDto == null) {
			addNotJoinedGrantErrorMessage();
			return null;
		}
		ApplicationDtoInterface applicationDto = timeReference().application().findForPerson(
				getPersonalId(vo.getTxtEditEmployeeCode()), getEditActivateDate());
		timeReference().application().chkExistApplication(applicationDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return null;
		}
		PaidHolidayDtoInterface paidHolidayDto = timeReference().paidHoliday().getPaidHolidayInfo(
				applicationDto.getPaidHolidayCode(), getEditActivateDate());
		timeReference().paidHoliday().chkExistPaidHoliday(paidHolidayDto, getEditActivateDate());
		if (mospParams.hasErrorMessage()) {
			return null;
		}
		StockHolidayDtoInterface stockHolidayDto = timeReference().stockHoliday().getStockHolidayInfo(
				paidHolidayDto.getPaidHolidayCode(), paidHolidayDto.getActivateDate());
		if (stockHolidayDto == null) {
			addNotStockVacationGrantErrorMessage();
			return null;
		}
		Date entranceDate = entranceDto.getEntranceDate();
		int entranceYear = DateUtility.getYear(entranceDate);
		int entranceMonth = DateUtility.getMonth(entranceDate);
		int paidHolidayType = paidHolidayDto.getPaidHolidayType();
		if (paidHolidayType == 0) {
			// 基準日
			Date paidHolidayLimitDate = null;
			int pointMonth = paidHolidayDto.getPointDateMonth();
			int pointDay = paidHolidayDto.getPointDateDay();
			PaidHolidayFirstYearDtoInterface paidHolidayFirstYearDto = timeReference().paidHolidayFirstYear()
				.findForKey(paidHolidayDto.getPaidHolidayCode(), paidHolidayDto.getActivateDate(),
						DateUtility.getMonth(entranceDate));
			if (paidHolidayFirstYearDto != null) {
				// 初年度付与マスタが存在する場合
				Date acquisitionDate = DateUtility.addMonth(DateUtility.getDate(entranceYear, entranceMonth, pointDay),
						paidHolidayFirstYearDto.getGivingMonth());
				paidHolidayLimitDate = DateUtility.addDay(DateUtility.addMonth(acquisitionDate, paidHolidayFirstYearDto
					.getGivingLimit()), -1);
				if (!activateDate.after(paidHolidayLimitDate)) {
					// 有効日が初年度期限日より後でない場合
					return null;
				}
			}
			Date pointDate = DateUtility.getDate(entranceYear, pointMonth, pointDay);
			if (!entranceDate.before(pointDate)) {
				pointDate = DateUtility.getDate(entranceYear + 1, pointMonth, pointDay);
			}
			Date paidHolidayAfterLimitDate = null;
			while (true) {
				if (paidHolidayDto.getMaxCarryOverYear() == MospConst.DELETE_FLAG_OFF) {
					// 有休繰越が有効の場合は期限は2年
					paidHolidayAfterLimitDate = DateUtility.addDay(DateUtility.addYear(pointDate, 2), -1);
				} else if (paidHolidayDto.getMaxCarryOverYear() == MospConst.DELETE_FLAG_ON) {
					// 有休繰越が無効の場合は期限は1年
					paidHolidayAfterLimitDate = DateUtility.addDay(DateUtility.addYear(pointDate, 1), -1);
				} else {
					return null;
				}
				if (paidHolidayLimitDate != null && activateDate.after(paidHolidayLimitDate)
						&& !activateDate.after(paidHolidayAfterLimitDate)) {
					StockHolidayDataDtoInterface dto = time().stockHolidayDataRegist().getInitDto();
					dto.setPersonalId(getPersonalId(vo.getTxtEditEmployeeCode()));
					dto.setActivateDate(activateDate);
					dto.setAcquisitionDate(DateUtility.addDay(paidHolidayLimitDate, 1));
					dto.setLimitDate(DateUtility.addDay(DateUtility.addMonth(dto.getAcquisitionDate(), stockHolidayDto
						.getStockLimitDate()), -1));
					return dto;
				}
				// 1年を加算
				pointDate = DateUtility.addYear(pointDate, 1);
				paidHolidayLimitDate = paidHolidayAfterLimitDate;
			}
		} else if (paidHolidayType == 1) {
			// TODO 未実装 入社月
			return null;
		} else if (paidHolidayType == 2) {
			// TODO 未実装 入社日
			return null;
		}
		return null;
	}
	
	/**
	 * 有給休暇有効期間以外を登録する場合エラーメッセージ。<br>
	 */
	protected void addSalariedVacationExceptErrorMessage() {
		String mes = mospParams.getName("Salaried") + mospParams.getName("Vacation")
				+ mospParams.getName("Effectiveness") + mospParams.getName("Period") + mospParams.getName("Except");
		mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_REGISTER, mes, null);
	}
	
	/**
	 * 1年目にストック休暇が付与できない場合エラーメッセージ。<br>
	 */
	protected void addNotStockVacationGrantErrorMessage() {
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		String mes1 = DateUtility.getStringDate(getEditActivateDate());
		String mes2 = vo.getTxtEditEmployeeCode();
		mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_STOCK_VACATION_GRANT, mes1, mes2);
	}
	
	/**
	 * 入社していない社員が選択されている場合エラーメッセージ。<br>
	 */
	protected void addNotJoinedGrantErrorMessage() {
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		String mes1 = DateUtility.getStringDate(getEditActivateDate());
		String mes2 = vo.getTxtEditEmployeeCode();
		mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_JOINED_GRANT, mes1, mes2);
	}
	
	/**
	 * 入社1年目であるため前年度の有給休暇を付与する場合エラーメッセージ。<br>
	 */
	protected void addNotWithPayVacationGrantErrorMessage() {
		PaidHolidayHistoryVo vo = (PaidHolidayHistoryVo)mospParams.getVo();
		String mes1 = DateUtility.getStringDate(getEditActivateDate());
		String mes2 = vo.getTxtEditEmployeeCode();
		mospParams.addErrorMessage(TimeMessageConst.MSG_NOT_WITH_PAY_VACATION_GRANT, mes1, mes2);
	}
}
