/*
 * 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.action;

import java.sql.SQLException;
import java.util.Date;

import jp.mosp.common.MosPAction;
import jp.mosp.common.MosPVo;
import jp.mosp.common.common.BaseDao;
import jp.mosp.common.common.MospException;
import jp.mosp.common.dto.HumanBasisDtoInterface;
import jp.mosp.common.utils.TableLockUtil;
import jp.mosp.common.utils.VariousUtil;
import jp.mosp.kintai.common.dto.MKihonDto;
import jp.mosp.kintai.common.part.KintaiPartStore;
import jp.mosp.mospcommon.system.AgreementBaseInfo;

/**
 * MosP勤怠管理の共通Actionクラス
 * @author yoshida
 *	@version 0.1
 */
public abstract class KintaiCommonAction extends MosPAction {
	
	/**
	 * コンストラクタ
	 */
	public KintaiCommonAction() {
		super();
	}
	
	/**
	 * KintaiPartStoreインスタンス取得
	 * @return	KintaiPartStoreインスタンス
	 * @throws SQLException   SQL例外が発生した場合
	 * @throws ClassNotFoundException  クラスが見つからなかった場合
	 * @throws MospException  MosP例外処理が発生した場合
	 */
	@Override
	protected KintaiPartStore part() throws MospException, ClassNotFoundException, SQLException {
		return (KintaiPartStore)getBaseStore(KintaiPartStore.class);
	}
	
	/* 勤怠計算関連 */

	/**
	 * 勤怠締日取得
	 * @return	Date	対象年月日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getCalcMonth() throws Exception {
		return part().calculate().getCalcMonth();
	}
	
	/**
	 * 勤怠計算月取得
	 * @return yyyymm 計算年月
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getCalcAttendance() throws Exception {
		return part().calculate().getCalcAttendance();
	}
	
	/**
	 * 集計開始日取得
	 * @param targetMonth 対象月
	 * @return 集計開始日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getStartDate(Date targetMonth) throws Exception {
		return part().calculate().getStartDate(targetMonth);
	}
	
	/**
	 * 集計終了日取得
	 * @param targetMonth 対象月
	 * @return 集計終了日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getEndDate(Date targetMonth) throws Exception {
		return part().calculate().getEndDate(targetMonth);
	}
	
	/**
	 * 集計月取得
	 * @param targetDate 対象日
	 * @return 集計月
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getCalcAttendanceMonth(Date targetDate) throws Exception {
		return part().calculate().getCalcAttendanceMonth(targetDate);
	}
	
	/**
	 * 給与支給対象年月日取得
	 * @param targetDate 対象日
	 * @return	（勤怠集計月）月（給与支給日）日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getCalcPayment(Date targetDate) throws Exception {
		return part().calculate().getCalcPayment(targetDate);
	}
	
	/**
	 * 給与支給日取得
	 * @return	Date	対象年月日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getCalcPayment() throws Exception {
		return part().calculate().getCalcPayment();
	}
	
	/**
	 * 表示用開始年月日
	 * <p>2009/01/20	m.yoshida	追加</p>
	 * @param targetDate	対象年月日	
	 * @return 表示用開始年月日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getStartDateForList(Date targetDate) throws Exception {
		return part().calculate().getStartDateForList(targetDate);
	}
	
	/**
	 * 表示用終了年月日
	 * <p>2009/01/20	m.yoshida	追加</p>
	 * @param targetDate	対象年月日
	 * @return 表示用開始年月日
	 * @throws Exception 例外処理が発生した場合
	 */
	protected Date getEndDateForList(Date targetDate) throws Exception {
		return part().calculate().getEndDateForList(targetDate);
	}
	
	/* 事業所関連 */

	/**
	 * 事業所コード取得(M_KAISYA)
	 * @return 事業所コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getOfficeArrayAll() throws Exception {
		return part().office().getOfficeArrayAll();
	}
	
	/**
	 * 事業所コード取得(利用可能所属のみ)(M_KAISYA)
	 * @return 事業所コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getOfficeArray() throws Exception {
		return part().office().getOfficeArray();
	}
	
	/**
	 * 事業所コード取得（所属のみ）(M_KAISYA)
	 * @param kCode 取得対象社員コード
	 * @return 事業所コード
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String getBelongOfficeCode(String kCode) throws Exception {
		return part().office().getBelongOfficeCode(kCode);
	}
	
	/* 所属関連 */

	/**
	 * 所属情報取得(M_SYOZOKU)
	 * @param sCode 情報取得対象所属コード
	 * @return 所属名称
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String getSectionName(String sCode) throws Exception {
		return part().section().getSectionName(sCode);
	}
	
	/**
	 * 所属コード取得
	 * @param kCode 取得対象社員コード
	 * @return 所属コード
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String getBelongSectionCode(String kCode) throws Exception {
		return part().section().getBelongSectionCode(kCode);
	}
	
	/**
	 * 所属コード取得(M_SYOZOKU)
	 * @return 所属コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getSectionArrayAll() throws Exception {
		return part().section().getSectionArrayAll();
	}
	
	/**
	 * 所属コード取得(利用可能…所属のみ)(M_SYOZOKU)
	 * @return 所属コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getSectionArrayForManager() throws Exception {
		return part().section().getSectionArrayForManager();
	}
	
	/**
	 * 所属コード取得(利用可能…権限により変化)(M_SYOZOKU)
	 * @return 所属コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getSectionArrayForHuman() throws Exception {
		return part().section().getSectionArrayForHuman();
	}
	
	/**
	 * 所属コード取得(所属範囲により変化)(M_SYOZOKU)
	 * @return 所属コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getSectionScopeArrayForPayroll() throws Exception {
		return part().section().getSectionScopeArrayForPayroll();
	}
	
	/* 役職関連 */

	/**
	 * 役職コード取得(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getPositionArrayAll() throws Exception {
		return part().position().getPositionArrayAll();
	}
	
	/**
	 * 役職コード取得(等級有りのみ)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getPositionArray() throws Exception {
		return part().position().getPositionArray();
	}
	
	/**
	 * 役職コード取得(等級無しのみ)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getPositionTitleArray() throws Exception {
		return part().position().getPositionTitleArray();
	}
	
	/**
	 * 役職コード取得(プルダウン用)(M_YAKUSYOKU)
	 * @return 役職コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getPositionPltArray() throws Exception {
		return part().position().getPositionPltArray();
	}
	
	/**
	 * 役職名称取得(等級付き)
	 * @param kCode		対象社員コード
	 * @return	対象社員役職名称
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String getPositionName(String kCode) throws Exception {
		return part().position().getPositionName(kCode);
	}
	
	/* 人事関連 */

	/**
	 * ユーザー情報取得
	 * @param userId 対象ユーザーID
	 * @throws Exception 例外処理が発生した場合
	 */
	protected void getInfo(String userId) throws Exception {
		userBasis = getBasisInfo(part().mospuser().getUserKCode(userId));
	}
	
	/**
	 * @param kCode 対象社員コード
	 * @return 対象社員基本情報
	 * @throws Exception 例外処理が発生した場合
	 */
	protected MKihonDto getBasisInfo(String kCode) throws Exception {
		return part().human().getBasisInfo(kCode);
	}
	
	/**
	 * 社員氏名取得(M_KIHON)
	 * @param kCode 情報取得対象社員コード
	 * @return 社員氏名
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String getKName(String kCode) throws Exception {
		return part().human().getKName(kCode);
	}
	
	/**
	 * 基本情報表示設定
	 * @param dto		対象DTO
	 * @throws Exception 例外処理が発生した場合
	 */
	protected void setLabelBasisInfo(HumanBasisDtoInterface dto) throws Exception {
		MosPVo vo = (MosPVo)getVo();
		if (VariousUtil.isNotNull(dto)) {
			vo.setLblKCode(dto.getKCode());
			vo.setLblKName(dto.getSimei());
			vo.setLblSectionName(getSectionName(dto.getSCode()));
		} else {
			vo.setLblKCode("");
			vo.setLblKName("");
			vo.setLblSectionName("");
		}
	}
	
	/**
	 * 基本情報表示設定
	 * @param kCode 対象社員コード
	 * @throws Exception 例外処理が発生した場合
	 */
	protected void setLabelBasisInfo(String kCode) throws Exception {
		setLabelBasisInfo(getBasisInfo(kCode));
	}
	
	/* 勤務形態関連 */

	/**
	 * 勤務形態コード取得(CM_WORKTYPE)
	 * @return 勤務形態コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getWorkTypeArrayNotDeleted() throws Exception {
		return part().worktype().getWorkTypeArrayNotDeleted();
	}
	
	/**
	 * 勤務形態コード取得(CM_WORKTYPE)（週休付）
	 * @return 勤務形態コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getWorkTypeArrayWithWeekHoliday() throws Exception {
		return part().worktype().getWorkTypeArrayWithWeekHoliday();
	}
	
	/**
	 * 勤務形態コード取得(CM_WORKTYPE)
	 * @return 勤務形態コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getWorkTypeArrayAll() throws Exception {
		return part().worktype().getWorkTypeArrayAll();
	}
	
	/**
	 * 勤務形態情報取得(CM_WORKTYPE)
	 * @return 勤務形態コードリスト
	 * @throws Exception 例外処理が発生した場合
	 */
	protected String[][] getWorkTypeDataArray() throws Exception {
		return part().worktype().getWorkTypeDataArray();
	}
	

	/**
	 * 労使協定情報
	 */
	protected AgreementBaseInfo	agreement;
	

	/**
	 * 対象社員労使協定情報取得
	 * @param kCode 対象社員コード
	 * @param targetDate 対象年月日
	 * @throws Exception 　例外処理が発生した場合
	 */
	protected void setLaborAgreementInfo(String kCode, Date targetDate) throws Exception {
		agreement = part().laborAgreement().getUserLaborAgreement(kCode, targetDate);
		/*
		if (VariousUtil.isNull(agreement)) {
			// エラーメッセージ
			addErrMessage(getKName(kCode) + "さんの労使協定情報がありません。");
		}
		*/
	}
	
	/**
	 * 勤怠入力丸め処理判断
	 * @return
	 * <p>
	 * 丸め処理を勤怠入力時に行う場合true、そうでない場合false
	 * </p>
	 * @throws Exception　例外処理が発生した場合
	 */
	protected boolean isRoundNumberDaily() throws Exception {
		return part().kintai().isRoundNumberDaily();
	}
	
	/**
	 * 勤怠集計丸め処理判断
	 * @return
	 * <p>
	 * 丸め処理を勤怠集計時に行う場合true、そうでない場合false
	 * </p>
	 * @throws Exception　例外処理が発生した場合
	 */
	protected boolean isRoundNumberMonthly() throws Exception {
		return part().kintai().isRoundNumberMonthly();
	}
	

	/*テーブルロック*/

	/**
	 * テーブルロック用ユーティリティ
	 */
	private TableLockUtil	tableLock	= null;
	

	/**
	 * テーブルロック開始
	 * @throws Exception	例外処理が発生した場合
	 */
	protected void prepareTableLock() throws Exception {
		tableLock = new TableLockUtil(cfg, cmd, aspUser, user, conn);
	}
	
	/**
	 * テーブルロック対象DAO追加
	 * @param dao		対象テーブルDAO
	 * @param isWrite	WRITEの場合true、READの場合false
	 */
	protected void addTargetTable(BaseDao dao, boolean isWrite) {
		tableLock.addTargetTable(dao, isWrite);
	}
	
	/**
	 * テーブルロック対象DAO追加
	 * @param tablename		対象テーブル名称
	 * @param isWrite	WRITEの場合true、READの場合false
	 */
	protected void addTargetTable(String tablename, boolean isWrite) {
		tableLock.addTargetTable(tablename, isWrite);
	}
	
	/**
	 * テーブルロック
	 * @throws Exception	例外処理が発生した場合
	 */
	protected void lockTables() throws Exception {
		tableLock.lockTables();
	}
	
	/**
	 * テーブルロック解除
	 * @throws Exception	例外処理が発生した場合
	 */
	protected void unLockTables() throws Exception {
		tableLock.unLockTables();
	}
	
}
