/*
 * 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 jp.mosp.common.CommonConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.dao.MosPUserDao;
import jp.mosp.common.dto.CmUserDto;
import jp.mosp.common.utils.DateUtil;
import jp.mosp.common.utils.StringUtil;
import jp.mosp.kintai.common.dao.MKihonDao;
import jp.mosp.kintai.common.dto.MKihonDto;
import jp.mosp.kintai.human.action.HumanKihonCardAction;
import jp.mosp.kintai.human.action.HumanPersonalCardAction;
import jp.mosp.kintai.human.dao.MEmergencyDao;
import jp.mosp.kintai.human.dao.MKojinDao;
import jp.mosp.kintai.human.dto.MEmergencyDto;
import jp.mosp.kintai.human.dto.MKojinDto;
import jp.mosp.kintai.human.vo.HumanCardVo;
import jp.mosp.kintai.human.vo.HumanKihonCardVo;

/**
 * @author yoshida
 *
 */
public abstract class MosPHumanAction extends KintaiCommonAction {
	
	// フィールド
	/**
	 * 
	 */
	protected MKihonDto		mKihonDto;
	/**
	 * 
	 */
	protected MKihonDto		storedmKihonDto;
	/**
	 * 
	 */
	protected MKojinDto		mKojinDto;
	/**
	 * 
	 */
	protected MEmergencyDto	mEmergencyDto;
	

	/**
	 * 人事基本情報用DAO取得
	 * @return	MKihonDao
	 * @throws Exception	例外処理が発生した場合
	 */
	protected MKihonDao humanBasisDao() throws Exception {
		return part().human().getMKihonDao();
	}
	
	/**
	 * 個人情報用DAO取得
	 * @return	MKojinDao
	 * @throws Exception	例外処理が発生した場合
	 */
	protected MKojinDao humanParsonalDao() throws Exception {
		return part().human().getMKojinDao();
	}
	
	/**
	 * 緊急情報用DAO取得
	 * @return	MEmergencyDao
	 * @throws Exception 例外処理が発生した場合
	 */
	protected MEmergencyDao emergencyDao() throws Exception {
		return part().human().getMEmergencyDao();
	}
	
	/**
	 * 人事基本情報取得
	 * @param kCode       社員コード
	 * @param isForUpdate アップデート用フラグ
	 * @throws Exception 	例外処理が発生した場合
	 */
	protected void findHumanBasisInfo(String kCode, boolean isForUpdate) throws Exception {
		// 現在の情報を取得
		if (isForUpdate) {
			mKihonDto = humanBasisDao().findForUpdate(kCode);
		} else {
			mKihonDto = humanBasisDao().findForKey(kCode);
		}
	}
	
	/**
	 * 個人情報取得
	 * @param kCode       社員コード
	 * @param isForUpdate アップデート用フラグ
	 * @throws Exception 	例外処理が発生した場合
	 */
	protected void findHumanPersonnelInfo(String kCode, boolean isForUpdate) throws Exception {
		// 現在の情報を取得
		if (isForUpdate) {
			mKojinDto = humanParsonalDao().findForUpdate(kCode);
		} else {
			mKojinDto = humanParsonalDao().findForKey(kCode);
		}
	}
	
	/**
	 * 緊急連絡先情報取得
	 * @param kCode       社員コード
	 * @param isForUpdate アップデート用フラグ
	 * @throws Exception 	例外処理が発生した場合
	 */
	protected void findHumanEmergencyInfo(String kCode, boolean isForUpdate) throws Exception {
		mEmergencyDto = new MEmergencyDto();
		String maxEno = emergencyDao().findForMax(kCode);
		// 現在の情報を取得
		if (isForUpdate) {
			mEmergencyDto = emergencyDao().findForConditionUp(maxEno, kCode);
		} else {
			mEmergencyDto = emergencyDao().findForCondition(maxEno, kCode);
		}
	}
	
	/**
	 * 変更内容取得
	 * @param kCode 社員コード
	 * @return 変更内容文字列
	 * @throws Exception 	例外処理が発生した場合
	 */
	protected String getChanging(String kCode) throws Exception {
		// 人事基本情報取得
		findHumanBasisInfo(kCode, false);
		// 変更内容取得
		StringBuffer sb = new StringBuffer();
		if (mKihonDto == null) {
			sb.append(CommonConst.NAM_MAKE_NEW_DATA);
		} else {
			if (sb.length() > 0) {
				return sb.substring(0, sb.length() - 1);
			}
		}
		return sb.toString();
	}
	
	/**
	 * ユーザ情報適用
	 * @param kCode        社員コード
	 * @param isBatchApply 一括適用フラグ(true：一括適用、false：個別適用)
	 * @return 処理件数
	 * @throws Exception	例外処理が発生した場合
	 */
	protected int applyHistory(String kCode, boolean isBatchApply) throws Exception {
		// 人事基本情報取得
		findHumanBasisInfo(kCode, false);
		// 排他確認
		if (!isBatchApply && storedmKihonDto != null) {
			chkExclusive(storedmKihonDto, mKihonDto);
		} else {
			// 人事基本情報取得
			storedmKihonDto = humanBasisDao().findForKey(kCode);
		}
		// ユーザー情報取得
		MosPUserDao mospuserDao = part().mospuser().getMosPUserDao();
		CmUserDto cmUserDto = mospuserDao.findForUpdate(kCode);
		// ユーザ処理
		if (cmUserDto == null) {
			// ユーザーの作成
			cmUserDto = new CmUserDto();
			cmUserDto.setUserId(kCode);
			cmUserDto.setPassword(MospUtility.getDigest(MospUtility.getDigest(kCode)));
			cmUserDto.setKCode(kCode);
			cmUserDto.setUserName(mKihonDto.getSimei());
			cmUserDto.setAuthority(CommonConst.AUTH_DEFAULT_USER);
			cmUserDto.setChangePass(DateUtil.getNowDate());
			cmUserDto.setDataLevel(CommonConst.DATA_DEFAULT_LEVEL);
			cmUserDto.setDeleteFlag(mKihonDto.getTsDate() == 0 ? CommonConst.DEFAULT_FLAG_OFF
					: CommonConst.DEFAULT_FLAG_ON);
			mospuserDao.insert(cmUserDto);
		} else {
			// ユーザの更新
			cmUserDto.setUserName(mKihonDto.getSimei());
			cmUserDto.setDeleteFlag(mKihonDto.getTsDate() == 0 ? CommonConst.DEFAULT_FLAG_OFF
					: CommonConst.DEFAULT_FLAG_ON);
			mospuserDao.update(cmUserDto, true);
		}
		return 1;
	}
	
	/**
	 * 選択社員人事基本情報取得
	 * @throws Exception 	例外処理が発生した場合
	 */
	protected void getSelectedEmployeeBasis() throws Exception {
		HumanCardVo vo = (HumanCardVo)getVo();
		// 選択社員コード取得
		String kCode = "";
		if (StringUtil.isNotNull(vo.getTxtChangeKCode())) {
			kCode = vo.getTxtChangeKCode();
		} else if (StringUtil.isNotNull(key1)) {
			kCode = key1;
		} else {
			HumanKihonCardVo kihonVo = (HumanKihonCardVo)getStoredVo(HumanKihonCardVo.class.getName());
			if (kihonVo == null) {
				// 基本情報画面へ戻る(基本情報が無い場合)
				throwNoBasisException();
			} else {
				kCode = kihonVo.getTxtKCode() == null ? "" : kihonVo.getTxtKCode();
			}
		}
		// 人事基本情報取得
		findHumanBasisInfo(kCode, false);
		if (mKihonDto == null) {
			// 基本情報画面へ戻る(基本情報が無い場合)
			throwNoBasisException();
		}
		// 社員氏名取得
		if (mKihonDto != null) {
			vo.setLblKCode(mKihonDto.getKCode());
			vo.setLblKName(mKihonDto.getSimei());
			vo.setLblKKana(mKihonDto.getFurigana());
		}
	}
	
	/**
	 * 人事基本情報取得不能時処理
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	protected void throwNoBasisException() throws MospException {
		String errMessage = getMessage(CommonConst.MSG_NO_HUMAN_DATA, "");
		addErrMessage(errMessage);
		setNextCmd(HumanKihonCardAction.CMD_HUMAN_BASIS_SHOW);
		throw new MospException(CommonConst.EX_NO_BASIS, errMessage);
	}
	
	/**
	 * セッション保持DTO取得
	 */
	protected void getStoredDto() {
		storedmKihonDto = (MKihonDto)session.getAttribute(MKihonDto.class.getName());
	}
	
	/**
	 * セッション保持DTO設定
	 */
	protected void setStoredDto() {
		session.setAttribute(MKihonDto.class.getName(), storedmKihonDto);
	}
	
	/**
	 * ボタン表示設定
	 */
	protected void setListButton() {
		HumanCardVo vo = (HumanCardVo)getVo();
		vo.setCmdListButton1("H1012");
		vo.setNamListButton1(CommonConst.NAM_TO_HUMAN_LIST);
	}
	
	/**
	 * 機能ボタン設定
	 * @param isNewData 新規登録フラグ 
	 */
	protected void setFunctionButton(boolean isNewData) {
		HumanCardVo vo = (HumanCardVo)getVo();
		vo.setAryFunction(getFunctionArray(isNewData));
	}
	
	/**
	 * 機能ボタン配列取得
	 * @param isNewData 新規登録フラグ
	 * @return 機能ボタン配列
	 */
	protected String[][] getFunctionArray(boolean isNewData) {
		if (isNewData) {
			return new String[][]{ { "btnNewData", HumanKihonCardAction.CMD_HUMAN_BASIS_SHOW,
				CommonConst.NAM_MAKE_NEW_DATA }, };
		} else {
			return new String[][]{
				{ "btnBasic", HumanKihonCardAction.CMD_HUMAN_BASIS_SELECT, CommonConst.NAM_EDIT_HUMAN_BASIC },
				{ "btnKojin", HumanPersonalCardAction.CMD_HUMAN_PERSONAL_SELECT, CommonConst.NAM_EDIT_HUMAN_KOJIN }, };
		}
	}
	
}
