/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 MIND Co., Ltd.  http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.payroll.action;

import java.util.List;


import jp.mosp.common.CommonConst;
import jp.mosp.common.MosPAction;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.dto.HumanBasisDtoInterface;

import jp.mosp.kintai.dao.MYukyuDao;
import jp.mosp.kintai.dto.MYukyuDto;

import jp.mosp.payroll.vo.YukyuPersonalCardVo;

public class YukyuPersonalCardAction extends MosPAction {

	// コマンド
	private static final String CMD_YUKYU_PERSONAL_SHOW   	= "P1120";	// 表示
	private static final String CMD_YUKYU_PERSONAL_UPDATE 	= "P1130";	// 更新

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

	/**
	 * アクション
	 */
	public void action() throws Exception {
		// VOの取得
		YukyuPersonalCardVo vo;
		vo = (YukyuPersonalCardVo)getStoredVo(CommonConst.VO_YUKYU_PERSONAL);
		if (vo == null) {
			vo = new YukyuPersonalCardVo();
		}
		vo.initVo(cfg, msg, cmd, aspUser, user);
		vo.clearMessage();
		vo.clearErrField();
		storeVo(CommonConst.VO_YUKYU_PERSONAL, vo);
		// VO及びフォワード先URLの設定
		setVo(vo);
		setUrl(vo.getRetUrl());
		// DBコネクション取得
		getConnection();
		// DTOの取得
		MYukyuDto dto;
		Object obj = session.getAttribute(MospConst.ATT_DTO);
		dto = obj instanceof MYukyuDto ? (MYukyuDto)obj : null;
		vo.setParams(request);
		// コマンド毎の処理
		if (cmd.equals(CMD_YUKYU_PERSONAL_SHOW)) {
			// 対象社員設定
			vo.setSelectKCode(key1);
			// 表示
			dto = show(vo);
			// セッションにDTOをセット
			session.setAttribute(MospConst.ATT_DTO, dto);
		} else if (cmd.equals(CMD_YUKYU_PERSONAL_UPDATE)) {
			// 更新
			dto = update(vo);
			// 対象社員設定
			vo.setSelectKCode(dto.getKCode());
			// 表示
			dto = show(vo);
			// セッションにDTOをセット
			session.setAttribute(MospConst.ATT_DTO, dto);
		} else {
			throw new MospException(MospConst.EX_CMD_INVALID);
		}
	}

	/**
	 * 有休管理情報
	 * @param vo YukyuPersonalCardVoインスタンス
	 * @throws Exception
	 */
	private MYukyuDto show(	YukyuPersonalCardVo vo) throws Exception {
		// DBコネクション取得
		if (conn == null) {
			getConnection();
		}
		vo.setDefaultValues();
		// 人事基本情報の取得
		HumanBasisDtoInterface mKihonDto = getBasisInfo(vo.getSelectKCode());
		// 選択情報の設定
		vo.setSelectKName(mKihonDto.getSimei());
		vo.setSelectSectionName(getSectionName(mKihonDto.getSCode()));
		// DAO準備
		MYukyuDao dao = new MYukyuDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);
		// 対象年月の有給情報を取得
		MYukyuDto currentDto = dao.findForKey(vo.getSelectKCode(), util.convDateToString(getCalcPayment()));
		// 有休情報のチェック
		if(!chkExistDto(currentDto)){
			// 対象年月の前月分を取得
			String formerDate = String.valueOf(util.convDateToInteger(
					util.addMonth(getCalcPayment(), -1)));
			currentDto = dao.findForKey(vo.getSelectKCode(), formerDate);
		}
		// VOに情報を設定
		if (!chkExistDto(currentDto)) {
			vo.setSelectKCode(mKihonDto.getKCode());
			vo.setSelectKName(mKihonDto.getSimei());
			vo.setSelectSectionName(getSectionName(mKihonDto.getSCode()));
			vo.setLblCalcYear(String.valueOf(MospUtility.getYear(getCalcPayment())));
			vo.setLblCalcMonth(String.valueOf(MospUtility.getMonth(getCalcPayment())));
		} else {
			vo.setFields(currentDto);
		}
		// 有休情報リストの取得
		vo.initListInfo();
		List<MYukyuDto> myukyulist = dao.findForList(vo.getSelectKCode(),util.convDateToString(getCalcPayment()));
		vo.setFields(myukyulist);
		// モード設定
		vo.setMode(YukyuPersonalCardVo.MODE_UPDATE);
		return currentDto;
	}

	/**
	 * 更新処理
	 * @param vo 対象VO
	 * @throws Exception
	 */
	private MYukyuDto update(YukyuPersonalCardVo vo) throws Exception {
		// DBコネクション取得
		if (conn == null) {
			getConnection();
		}
		// パラメータの妥当性確認
		vo.validate();
		// 給与計算対象年月取得
		String targetDate = util.convDateToString(getCalcPayment());
		// 登録処理
		// DAO準備
		MYukyuDao dao = new MYukyuDao();
		dao.initDao(cfg, cmd, aspUser, user, conn);	
		// DTOの準備
		MYukyuDto dto = new MYukyuDto();
		// 有休情報取得
		MYukyuDto chkDto = dao.findForUpdate(vo.getSelectKCode(), targetDate);
		// 有休情報の計算
		setPaidHolidayCalc(vo);
		if (!chkExistDto(chkDto)) {
			// 有休情報登録
			vo.setDtoFields(dto, targetDate);
			dao.insert(dto);
		} else {
			// 有休情報更新
			dto = chkDto;
			vo.setDtoFields(dto);
			dao.update(dto);
		}
		// 有休情報取得
		MYukyuDto retDto = dao.findForKey(dto.getKCode(), String.valueOf(dto.getKyuyoYMD()));
		chkUpdate(retDto);
		// コミット
		commit();
		// メッセージ設定
		vo.setMessage(MospUtility.getMessage(msg, MospConst.MSG_UPDATE, ""));
		return retDto;
	}

	/**
	 * 有休情報計算(setDtoFields)
	 * @param vo
	 * @throws Exception
	 */
	private void setPaidHolidayCalc(YukyuPersonalCardVo vo) throws Exception {
		// 対象当月保有数前年（変更後）= 当月保有数前年（変更前） + 付与数（前年）- 廃棄数（前年）
		double targetLY = Double.parseDouble(vo.getHidThisRestLY()) + Double.parseDouble(vo.getTxtThisGetLY()) - Double.parseDouble(vo.getTxtThisDisposeLY());
		// 廃棄数が保有数より上回ったら、0に戻す。
		if (targetLY < 0) {
			double reDisposeLY = Double.parseDouble(vo.getTxtThisDisposeLY()) + targetLY;
			vo.setTxtThisDisposeLY(String.valueOf(reDisposeLY));
			vo.setHidThisRestLY(CommonConst.NAM_COMMON_DOUBLE_INITIAL_VALUE);
		} else {
			vo.setHidThisRestLY(String.valueOf(targetLY));
		}
		// 対象当月保有数当年（変更後）= 当月保有数当年（変更前） + 付与数（前年）- 廃棄数（前年）
		double targetTY = Double.parseDouble(vo.getHidThisRestTY()) + Double.parseDouble(vo.getTxtThisGetTY()) - Double.parseDouble(vo.getTxtThisDisposeTY());
		// 廃棄数が保有数より上回ったら、0に戻す。
		if (targetTY < 0) {
			double reDisposeTY = Double.parseDouble(vo.getTxtThisDisposeTY()) + targetTY;
			vo.setTxtThisDisposeTY(String.valueOf(reDisposeTY));
			vo.setHidThisRestTY(CommonConst.NAM_COMMON_DOUBLE_INITIAL_VALUE);
		} else {
			vo.setHidThisRestTY(String.valueOf(targetTY));
		}
		// 廃棄数 = 廃棄数（当年）+ 廃棄数（前年）
		double dispose = Double.parseDouble(vo.getHidDispose()) + Double.parseDouble(vo.getTxtThisDisposeTY()) + Double.parseDouble(vo.getTxtThisDisposeLY());		
		vo.setHidDispose(String.valueOf(dispose));
		// 取得数 = 取得数（当年）+ 取得数（前年）
		int get = Integer.parseInt(vo.getHidTGet()) + Integer.parseInt(vo.getTxtThisGetTY()) + Integer.parseInt(vo.getTxtThisGetLY());		
		vo.setHidGet(String.valueOf(get));
		return;
	}

}
