/*
 * 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.payroll.bonus.vo;

import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.payroll.base.Bonus;
import jp.mosp.payroll.base.Employee;
import jp.mosp.payroll.base.PayrollConst;
import jp.mosp.payroll.base.PayrollVo;
import jp.mosp.payroll.bonus.BonusConst;

public class BonusCardVo extends PayrollVo {
	
	private static final long	serialVersionUID		= 3281945937471826907L;
	
	// URL、CSS
	private static final String	RETURN_URL				= "/jsp/payroll/bonus/bonusCard.jsp";
	private static final String	EXTRA_JS				= "/pub/payroll/bonus/js/bonusCard.js";
	private static final String	EXTRA_CSS				= "/pub/payroll/bonus/css/bonusCard.css";
	
	// 画面サブタイトル
	public final String			SUB_TITLE				= BonusConst.TTL_BONUS_CARD;
	
	public static final String	PRM_PLT_YEAR			= "pltYear";
	public static final String	PRM_PLT_MONTH			= "pltMonth";
	public static final String	PRM_PLT_DAY				= "pltDay";
	
	public static final String	PRM_HID_K_CODE			= "hidKCode";
	public static final String	PRM_HID_TARGET_YEAR		= "hidTargetYear";
	public static final String	PRM_HID_TARGET_MONTH	= "hidTargetMonth";
	public static final String	PRM_HID_TARGET_DAY		= "hidTargetDay";
	public static final String	PRM_HID_CALC_STATUS		= "hidCalcStatus";
	public static final String	PRM_HID_SELECT_LIST_CMD	= "hidSelectListCmd";
	public static final String	PRM_TXT_CHANGE_K_CODE	= "txtChangeKCode";
	
	// プルダウンリスト
	public String[][]			aryPltYear;
	public String[][]			aryPltMonth;
	public String[][]			aryPltDay;
	
	// 事業所名称取得用配列
	public String[][]			aryStation;
	public String[][]			aryPltCalcStatus;
	public Date					payDay;
	
	private String				pltYear					= "";
	private String				pltMonth				= "";
	private String				pltDay					= "";
	
	public Date					targetMonth;
	
	private String				hidTargetYear			= "";
	private String				hidTargetMonth			= "";
	private String				hidTargetDay			= "";
	
	private String				txtChangeKCode			= "";
	private String				lblCalcStatus			= "";
	private String				lblStationCode			= "";
	private String				hidKCode				= "";
	
	/****************  Mosp ***************************/
	// フィールド
	private String				lblKName				= "";
	private String				lblSection				= "";
	private String				lblCalcMonth			= "";
	private String				kCode					= "";
	private Date				calcMonth;
	
	// 画面モード
	private int					mode;
	
	private String[][]			aryTime;
	public String[][]			aryAllowance			= { { "BA001", " ", "0" }, { "BA002", " ", "0" },
		{ "BA003", " ", "0" }, { "BA004", " ", "0" }, { "BA005", " ", "0" }, { "BA006", " ", "0" },
		{ "BA007", " ", "0" }, { "BA008", " ", "0" }, { "BA009", " ", "0" }, { "BA010", " ", "0" },
		{ "BA011", " ", "0" }, { "BA012", " ", "0" }, { "BA013", " ", "0" }, { "BA014", " ", "0" },
		{ "BA015", " ", "0" }, { "BA016", " ", "0" }, { "BA017", " ", "0" }, { "BA018", " ", "0" },
		{ "BA019", " ", "0" }, { "BA020", " ", "0" }	};
	
	public String[][]			aryDeduction			= { { "BD001", " ", "0" }, { "BD002", " ", "0" },
		{ "BD003", " ", "0" }, { "BD004", " ", "0" }, { "BD005", " ", "0" }, { "BD006", " ", "0" },
		{ "BD007", " ", "0" }, { "BD008", " ", "0" }, { "BD009", " ", "0" }, { "BD010", " ", "0" },
		{ "BD011", " ", "0" }, { "BD012", " ", "0" }, { "BD013", " ", "0" }, { "BD014", " ", "0" },
		{ "BD015", " ", "0" }, { "BD016", " ", "0" }, { "BD017", " ", "0" }, { "BD018", " ", "0" },
		{ "BD019", " ", "0" }, { "BD020", " ", "0" }	};
	
	public String[][]			aryBreakdown			= { { "PB001", " ", "" } };
	
	public String[][]			arySum					= { { "BS001", " ", "0" }, { "BS002", " ", "0" },
		{ "BS003", " ", "0" }, { "BS011", " ", "0" }, { "BS012", " ", "0" }, { "BS013", " ", "0" } };
	
	// 文字列長
	public static final int		LEN_MONEY				= PayrollConst.LEN_MONEY;
	public static final int		LEN_TIME_INT			= PayrollConst.LEN_TIME_INT;
	public static final int		LEN_TIME_DEC			= PayrollConst.LEN_TIME_DEC;
	

	/**
	 * {@link PayrollVo#PayrollVo()}を実行する。
	 */
	public BonusCardVo() {
		super();
		setRetUrl(RETURN_URL);
		setExtraJs(EXTRA_JS);
		setExtraCss(EXTRA_CSS);
	}
	
	/**
	 * リクエストからパラメータを取得、設定する。
	 * @param request リクエスト
	 */
	public void setParams(HttpServletRequest request) {
		txtChangeKCode = request.getParameter(PRM_TXT_CHANGE_K_CODE);
		hidKCode = request.getParameter(PRM_HID_K_CODE);
		hidTargetYear = request.getParameter(PRM_PLT_YEAR);
		hidTargetMonth = request.getParameter(PRM_PLT_MONTH);
		hidTargetDay = request.getParameter(PRM_PLT_DAY);
		
		for (Enumeration<?> en = request.getParameterNames(); en.hasMoreElements();) {
			String detailCode = (String)en.nextElement();
			setDetailAmount(detailCode, request.getParameter(detailCode));
		}
	}
	
	/**
	 * フィールドを設定する。
	 * @param employee 社員
	 * @param payment  賞与明細
	 */
	public void setFields(Employee employee, Bonus bonus) {
		// 人事情報設定
		lblKName = employee.getKName();
		lblSection = employee.getSectionName();
		kCode = employee.getKCode();
		if (bonus != null) {
			lblCalcMonth = bonus.getCalcMonthStr();
			calcMonth = bonus.getCalcMonth();
			// 賞与情報設定
			aryAllowance = bonus.getAllowanceArray(false);
			aryDeduction = bonus.getDeductionArray(false);
			arySum = bonus.getSumArray(false);
		} else {
			clearPayData();
		}
		
	}
	
	/**
	 * フィールドの妥当性確認
	 * @throws MospException
	 */
	public void validate() throws MospException {
		// 妥当性確認開始時処理
		startValidation();
		// 妥当性確認終了時処理
		endValidation();
	}
	
	/**
	 * フィールドを設定する(DTOに対するVO情報のセット)。
	 * @param payment 賞与明細
	 */
	public void setDtoFields(Bonus bonus) {
		bonus.setDetails(aryTime, aryAllowance, aryDeduction, aryBreakdown, arySum);
	}
	
	/**
	 * フィールドを設定する(DTOに対するVO情報のセット)。
	 * @param payment 賞与明細
	 */
	public void setDtoFields2(Employee employee, Bonus bonus, Date targetMonth) {
		bonus.setDetails2(aryTime, aryAllowance, aryDeduction, aryBreakdown, arySum, employee, targetMonth);
	}
	
	/* (non-Javadoc)
	 * @see jp.mosp.payroll.base.PayrollVo#getDirectJs(Class)
	 */
	@Override
	public String getDirectJs(Class<?> cls) throws IllegalAccessException {
		StringBuffer sb = new StringBuffer();
		sb.append(super.getDirectJs(cls));
		sb.append("var MODE = " + mode + ";");
		
		// 支給項目パラメータリスト作成
		sb.append("var ARY_ALLOWANCE = new Array(");
		for (String[] element : aryAllowance) {
			sb.append("\"" + element[0] + "\", ");
		}
		if (aryAllowance.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 控除項目パラメータリスト作成
		sb.append("var ARY_DEDUCTION = new Array(");
		for (String[] element : aryDeduction) {
			sb.append("\"" + element[0] + "\", ");
		}
		if (aryDeduction.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 内訳項目パラメータリスト作成
		sb.append("var ARY_BREAKDOWN = new Array(");
		for (String[] element : aryBreakdown) {
			sb.append("\"" + element[0] + "\", ");
		}
		if (aryBreakdown.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		// 合計項目パラメータリスト作成
		sb.append("var ARY_SUM = new Array(");
		for (String[] element : arySum) {
			sb.append("\"" + element[0] + "\", ");
		}
		if (arySum.length > 0) {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		return sb.toString();
	}
	
	/**
	 * 支給明細件数を取得する。<br>
	 * @return 支給明細値
	 */
	public int getAllowanceCount() {
		return aryAllowance.length;
	}
	
	/**
	 * 控除明細件数を取得する。<br>
	 * @return 控除明細値
	 */
	public int getDeductionCount() {
		return aryDeduction.length;
	}
	
	/**
	 * 内訳明細件数を取得する。<br>
	 * @return 内訳明細値
	 */
	public int getBreakdownCount() {
		return aryBreakdown.length;
	}
	
	/**
	 * 合計明細件数を取得する。<br>
	 * @return 合計明細値
	 */
	public int getSumCount() {
		return arySum.length;
	}
	
	/**
	 * 支給明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細値
	 */
	public String getAllowanceAmount(int idx) {
		return aryAllowance[idx][2];
	}
	
	/**
	 * 控除明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細値
	 */
	public String getDeductionAmount(int idx) {
		return aryDeduction[idx][2];
	}
	
	/**
	 * 内訳明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細値
	 */
	public String getBreakdownAmount(int idx) {
		return aryBreakdown[idx][2];
	}
	
	/**
	 * 控除明細値を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細値
	 */
	public String getSumAmount(int idx) {
		return arySum[idx][2];
	}
	
	/**
	 * 支給明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細コード
	 */
	public String getAllowanceCode(int idx) {
		return aryAllowance[idx][0];
	}
	
	/**
	 * 控除明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細コード
	 */
	public String getDeductionCode(int idx) {
		return aryDeduction[idx][0];
	}
	
	/**
	 * 内訳明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細コード
	 */
	public String getBreakdownCode(int idx) {
		return aryBreakdown[idx][0];
	}
	
	/**
	 * 合計明細コードを取得する。<br>
	 * @param idx インデックス
	 * @return 合計明細コード
	 */
	public String getSumCode(int idx) {
		return arySum[idx][0];
	}
	
	/**
	 * 支給明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 支給明細名称
	 */
	public String getAllowanceName(int idx) {
		return escapeHTML(aryAllowance[idx][1]);
	}
	
	/**
	 * 控除明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 控除明細名称
	 */
	public String getDeductionName(int idx) {
		return escapeHTML(aryDeduction[idx][1]);
	}
	
	/**
	 * 内訳明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 内訳明細名称
	 */
	public String getBreakdownName(int idx) {
		return escapeHTML(aryBreakdown[idx][1]);
	}
	
	/**
	 * 合計明細名称を取得する。<br>
	 * @param idx インデックス
	 * @return 合計明細名称
	 */
	public String getSumName(int idx) {
		return escapeHTML(arySum[idx][1]);
	}
	
	/**
	 * 計算年月を取得する。
	 * @return 計算年月
	 */
	public Date getCalcMonth() {
		return getDateField(calcMonth);
	}
	
	/**
	 * 計算年月を設定する。
	 * @param calcMonth 設定する計算年月
	 */
	public void setCalcMonth(Date calcMonth) {
		this.calcMonth = getDateField(calcMonth);
	}
	
	/**
	 * 計算年月を取得する。
	 * @return 計算年月
	 */
	public String getEscLblCalcMonth() {
		return escapeHTML(lblCalcMonth);
	}
	
	/**
	 * 計算年月を設定する。
	 * @param lblCalcMonth 設定する計算年月
	 */
	public void setLblCalcMonth(String lblCalcMonth) {
		this.lblCalcMonth = lblCalcMonth;
	}
	
	/**
	 * 社員コードを取得する。
	 * @return 社員コード
	 */
	public String getKCode() {
		return kCode;
	}
	
	/**
	 * 社員コードを取得する。
	 * @return 社員コード
	 */
	public String getEscKCode() {
		return escapeHTML(kCode);
	}
	
	/**
	 * 社員コードを設定する。
	 * @param lblKCode 設定する社員コード
	 */
	public void setKCode(String lblKCode) {
		kCode = lblKCode;
	}
	
	/**
	 * 社員名を取得する。
	 * @return 社員名
	 */
	public String getLblKName() {
		return lblKName;
	}
	
	/**
	 * 社員名を取得する。
	 * @return 社員名
	 */
	public String getEscLblKName() {
		return escapeHTML(lblKName);
	}
	
	/**
	 * 社員名を設定する。
	 * @param lblKName 設定する社員名
	 */
	public void setLblKName(String lblKName) {
		this.lblKName = lblKName;
	}
	
	/**
	 * 所属を取得する。
	 * @return 所属
	 */
	public String getEscLblSection() {
		return escapeHTML(lblSection);
	}
	
	/**
	 * 所属を設定する。
	 * @param lblSection 設定する所属
	 */
	public void setLblSection(String lblSection) {
		this.lblSection = lblSection;
	}
	
	/**
	 * 明細値を設定する。<br>
	 * @param aryDetail  明細配列
	 * @param detailCode 明細コード
	 * @param amount     明細値
	 */
	private void setDetailAmount(String detailCode, String amount) {
		for (int i = 0; i < aryAllowance.length; i++) {
			if (aryAllowance[i][0].equals(detailCode)) {
				aryAllowance[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < aryDeduction.length; i++) {
			if (aryDeduction[i][0].equals(detailCode)) {
				aryDeduction[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < aryBreakdown.length; i++) {
			if (aryBreakdown[i][0].equals(detailCode)) {
				aryBreakdown[i][2] = amount;
				return;
			}
		}
		for (int i = 0; i < arySum.length; i++) {
			if (arySum[i][0].equals(detailCode)) {
				arySum[i][2] = amount;
				return;
			}
		}
	}
	
	/**
	 * 画面モードを設定する。<br><br>
	 * 0:登録可、1：登録不可
	 * @param mode 設定する画面モード
	 */
	public void setMode(int mode) {
		this.mode = mode;
	}
	
	/*******************************  Unic **************************************/
	// アクセサメソッド
	public void setHidKCode(String hidKCode) {
		this.hidKCode = hidKCode;
	}
	
	public void setPltYear(String pltYear) {
		this.pltYear = pltYear;
	}
	
	public void setPltMonth(String pltMonth) {
		this.pltMonth = pltMonth;
	}
	
	public void setPltDay(String pltDay) {
		this.pltDay = pltDay;
	}
	
	public void setTxtChangeKCode(String txtChangeKCode) {
		this.txtChangeKCode = txtChangeKCode;
	}
	
	public String getEscHidTargetYear() {
		return escapeHTML(hidTargetYear);
	}
	
	public String getEscHidTargetMonth() {
		return escapeHTML(hidTargetMonth);
	}
	
	public String getEscHidTargetDay() {
		return escapeHTML(hidTargetDay);
	}
	
	public String getEscTxtChangeKCode() {
		return escapeHTML(txtChangeKCode);
	}
	
	public String getEscLblCalcStatus() {
		return escapeHTML(lblCalcStatus);
	}
	
	public String getEscLblStationCode() {
		return escapeHTML(lblStationCode);
	}
	
	public String getEscLblStationName() {
		return escapeHTML(lblSection);
	}
	
	public String getEscLblKCode() {
		return escapeHTML(kCode);
	}
	
	public String getEscHidKCode() {
		return escapeHTML(hidKCode);
	}
	
	public String getHidKCode() {
		return kCode;
	}
	
	public String getHidTargetYear() {
		return hidTargetYear;
	}
	
	public String getHidTargetMonth() {
		return hidTargetMonth;
	}
	
	public String getHidTargetDay() {
		return hidTargetDay;
	}
	
	public String getPltYear() {
		return pltYear;
	}
	
	public String getPltMonth() {
		return pltMonth;
	}
	
	public String getPltDay() {
		return pltDay;
	}
	
	public String getTxtChangeKCode() {
		return txtChangeKCode;
	}
	
	/**
	 * サブタイトル取得
	 * @param subTitle サブタイトル
	 * @param cmdMenu  メニューコマンド
	 * @return サブタイトルHTML文字列
	 */
	public String getSubTitle(String subTitle, String cmdMenu) {
		StringBuffer sb = new StringBuffer();
		sb.append("<div class=\"Header\">");
		sb.append("<div class=\"MenuButtonBar\">");
		sb.append("<button type=\"button\" ");
		sb.append("onclick=\"doSubmit(document.form, '");
		sb.append(cmdMenu);
		sb.append("')\">メニューへ</button>");
		sb.append("<button type=\"button\" id=\"btnLogout\" ");
		sb.append("onclick=\"doSubmit(document.form, '");
		sb.append(MospConst.CMD_LOGOUT);
		sb.append("')\">ログアウト</button>");
		sb.append("</div>");
		sb.append("<div class=\"SubTitleBar\">");
		sb.append(subTitle);
		sb.append("</div>");
		sb.append("</div>");
		return sb.toString();
	}
	
	/**
	 * 賞与支給日設定
	 * @param year
	 * @param month
	 * @param day
	 * @throws MospException
	 */
	public void setPayDay(String year, String month, String day) throws MospException {
		payDay = getDate(year, month, day);
	}
	
	/**
	 * 対象年月設定
	 * @param year
	 * @param month
	 * @throws MospException
	 */
	public void setTargetMonth(String year, String month) throws MospException {
		targetMonth = getDate(year, month, String.valueOf(BonusConst.TIME_DEFAULT_DAY));
	}
	
	/**
	 * 表示項目の初期化
	 */
	public void clearPayData() {
		// 支払項目名の設定
		for (int i = 0; i < aryAllowance.length; i++) {
			aryAllowance[i][2] = "0";
		}
		// 控除項目名の設定
		for (int i = 0; i < aryDeduction.length; i++) {
			aryDeduction[i][2] = "0";
		}
		
		// 支払総額項目名の設定
		for (int i = 0; i < arySum.length; i++) {
			arySum[i][2] = "0";
		}
	}
	
}
