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

import jp.mosp.common.CommonConst;
import jp.mosp.common.action.MosPAction;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;

import jp.mosp.system.dao.MCodeDao;
import jp.mosp.system.dto.MCodeDto;
import jp.mosp.system.vo.KintaiSystemDefinitionCardVo;

public class KintaiSystemDefinitionCardAction extends MosPAction {

	// コマンド
	private static final String CMD_KINTAI_SYSTEM_DEFINITION_CARD_SHOW   = "S2500";	// 表示
	private static final String CMD_KINTAI_SYSTEM_DEFINITION_CARD_UPDATE = "S2508";	// 更新

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

	/**
	 * アクション
	 */
	public void action() throws Exception {
		// DBコネクション取得
		getConnection();
		// PAYROLL権限確認
		confirmSystemAuth();
		// VOの取得
		KintaiSystemDefinitionCardVo vo = getInitVo();
		init(vo);
		// コマンド毎の処理
		if (cmd.equals(CMD_KINTAI_SYSTEM_DEFINITION_CARD_SHOW)) {
			// 表示
			show(vo);
			// モード設定
			vo.setMode(KintaiSystemDefinitionCardVo.MODE_UPDATE);
		} else if (cmd.equals(CMD_KINTAI_SYSTEM_DEFINITION_CARD_UPDATE)) {
			// 項目入力値取得
			vo.setParams(request);
			// 項目更新
			regist(vo);
			// 表示
			show(vo);
		} else {
			throw new MospException(MospConst.EX_CMD_INVALID);
		}
	}

	/**
	 * 初期VOインスタンス取得
	 * @return	初期VO
	 */
	protected KintaiSystemDefinitionCardVo getInitVo() {
		return new KintaiSystemDefinitionCardVo();
	}

	/**
	 * Action初期処理
	 * @param vo			対象VO
	 * @throws Exception
	 */
	protected void init(KintaiSystemDefinitionCardVo vo) throws Exception {
		vo.initVo(cfg, msg, cmd, aspUser, user);
		// VO及びフォワード先URLの設定
		setVo(vo);
		setUrl(vo.getRetUrl());
		// プルダウンの設定
		vo.aryPltCalcMonth 		= setPltCalcMonth();
		vo.aryPltProvidedMonth 	= setPltProvidedMonth();
	}

	/**
	 * 設定項目検索
	 * @param vo Voインスタンス
	 * @throws Exception
	 */
	protected void show(KintaiSystemDefinitionCardVo vo) throws Exception {
		// DAOの準備
		MCodeDao dao = new MCodeDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		// 一日法定労働時間、週間法定労働時間
		vo.setFieldStatutoryHours(dao.findForCondition(CommonConst.TID_STATUTORY));
		// 月間法定労働時間、月間法定労働日数
		vo.setFieldStatutoryMonth(dao.findForCondition(CommonConst.TID_STATUTORY_MONTH));
		// 勤怠締月、勤怠締日
		vo.setFieldCalc(dao.findForCondition(CommonConst.TID_CALCULATION));
		// 給与支給月、給与支給日
		vo.setFieldProvided(dao.findForCondition(CommonConst.TID_PROVIDED_DATE));
		// 入力単位
		vo.setFieldInputUnit(dao.findForKey(CommonConst.TID_INPUT_UNIT_TIMES, CommonConst.TCD_MINUTES));
		// 自動計算、全休、半休、深夜開始時刻、深夜時間
		vo.setFieldWorkSystem(dao.findForCondition(CommonConst.TID_WORK_SYSTEM));
		// パスワード有効期限
		vo.setFieldPasswordTerm(String.valueOf(getPasswordTerm()));
	}

	/**
	 * データ更新
	 * @param vo 対象VO
	 * @throws Exception
	 */
	protected void regist(KintaiSystemDefinitionCardVo vo) throws Exception {
		// DAOの準備
		MCodeDao dao = new MCodeDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		// パラメータの妥当性確認
		vo.validate();
		// DTOの準備
		MCodeDto dto = new MCodeDto();
		// 一日法定労働時間
		vo.setDtoFieldStatutoryHours(dto);
		// データの更新		
		update(dto, dao, vo);
		// 週間法定労働時間		
		vo.setDtoFieldStatutoryWeek(dto);
		// データの更新		
		update(dto, dao, vo);
		// 月間法定労働時間		
		vo.setDtoFieldStatutoryMonthHours(dto);
		// データの更新		
		update(dto, dao, vo);
		// 月間法定労働日数		
		vo.setDtoFieldStatutoryMonthDays(dto);
		// データの更新		
		update(dto, dao, vo);
		// 勤怠締月
		vo.setDtoFieldCalcMonth(dto);
		// データの更新		
		update(dto, dao, vo);
		// 勤怠締日
		vo.setDtoFieldCalcDays(dto);
		// データの更新		
		update(dto, dao, vo);
		// 給与支給月
		vo.setDtoFieldProvidedMonth(dto);
		// データの更新		
		update(dto, dao, vo);
		// 給与支給日
		vo.setDtoFieldProvidedDays(dto);
		// データの更新		
		update(dto, dao, vo);
		// 入力単位	
		vo.setDtoFieldInputUnit(dto);
		// 排他確認
		// データの更新		
		update(dto, dao, vo);
		// 自動計算	
		vo.setDtoFieldAutoCalc(dto);
		// データの更新		
		update(dto, dao, vo);
		// 全休、半休	
		vo.setDtoFieldHoliday(dto);
		// データの更新		
		update(dto, dao, vo);
		// 深夜開始時刻、深夜時間	
		vo.setDtoFieldLateNight(dto);
		// データの更新		
		update(dto, dao, vo);		
		// パスワード有効期限
		vo.setDtoFieldPasswordTerm(dto);
		// データの更新		
		update(dto, dao, vo);
		// コミット
		commit();
		// モード設定
		vo.setMode(KintaiSystemDefinitionCardVo.MODE_UPDATE);
		// メッセージ設定
		vo.setMessage(MospUtility.getMessage(msg, MospConst.MSG_UPDATE, ""));
	}

	/**
	 * 締め月用プルダウン
	 * @return	aryPltCalcMonth
	 * @throws Exception
	 */
	protected String[][] setPltCalcMonth() throws Exception {
		String[][] aryPltCalcMonth = new String[2][2];
		aryPltCalcMonth[0][0] = CommonConst.NUM_CUT_OFF_MONTH_THIS;
		aryPltCalcMonth[0][1] = CommonConst.NAM_CUT_OFF_MONTH_THIS;
		aryPltCalcMonth[1][0] = CommonConst.NUM_CUT_OFF_MONTH_FORMER;
		aryPltCalcMonth[1][1] = CommonConst.NAM_CUT_OFF_MONTH_FORMER;
		return aryPltCalcMonth;
	}

	/**
	 * 給与支給月用プルダウン
	 * @return	aryPltCalcMonth
	 * @throws Exception
	 */
	protected String[][] setPltProvidedMonth() throws Exception {
		String[][] aryPltCalcMonth = new String[2][2];
		aryPltCalcMonth[0][0] = CommonConst.NUM_PROVIDED_MONTH_THIS;
		aryPltCalcMonth[0][1] = CommonConst.NAM_PROVIDED_MONTH_THIS;
		aryPltCalcMonth[1][0] = CommonConst.NUM_PROVIDED_MONTH_FUTURE;
		aryPltCalcMonth[1][1] = CommonConst.NAM_PROVIDED_MONTH_FUTURE;
		return aryPltCalcMonth;
	}

	/**
	 * 更新処理
	 * @param dto
	 * @param dao
	 * @param vo
	 * @throws Exception
	 */
	protected void update(MCodeDto dto, MCodeDao dao, KintaiSystemDefinitionCardVo vo) throws Exception {
		// DTOの再取得
		MCodeDto retDto;
		if (chkExistDto(dao.findForUpdate(dto.getTId(), dto.getTCode()))) {
			// 排他確認
			chkExclusive(dao.findForKey(dto.getTId(), dto.getTCode()), dao.findForUpdate(dto.getTId(), dto.getTCode()), vo);
			// データの更新		
			dao.update(dto);
		} else {
			// 重複確認
			chkDuplicate(dao.findForKey(dto.getTId(), dto.getTCode()), vo);
			// データの登録		
			dao.insert(dto);
		}
		// アップデートのチェック
		retDto = dao.findForKey(dto.getTId(), dto.getTCode());
		chkUpdate(retDto);
	}

}
