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

import java.util.Date;
import java.util.List;

import jp.mosp.common.common.MospException;
import jp.mosp.kintai.common.dto.MKihonDto;
import jp.mosp.kintai.human.dto.MKojinDto;
import jp.mosp.legal.LegalConst;
import jp.mosp.payroll.dto.CmCommutationDto;
import jp.mosp.payroll.dto.CmIncomeTaxDto;
import jp.mosp.payroll.dto.CmPaymentMeansDto;
import jp.mosp.payroll.dto.CmResidenceTaxDto;
import jp.mosp.payroll.dto.CmSocInsuranceDto;
import jp.mosp.payroll.dto.CmUnitAmountDto;

/**
 * 社員クラス。<br><br>
 */
public class Employee {
	
	/**
	 * 社員コード。<br>
	 * {@link Employee}を判別するキーとなる項目。
	 */
	private String					kCode;
	
	/**
	 * 対象年月日。<br>
	 * 履歴から情報を取得する際に用いた情報を、格納する。
	 */
	//private Date targetDate;
	
	/**
	 * 社員名。<br>
	 * {@link #targetDate}以前で最新の履歴から情報を取得し、格納する。
	 */
	//private String kName;
	
	/**
	 * 所属名。<br>
	 */
	private String					sectionName;
	
	/**
	 * 人事基本履歴情報。<br>
	 * {@link #kCode}の人事基本履歴情報を、適用年月日の降順で並べて格納する。
	 */
	//private List<ChBasisDto> listBasis;
	
	private MKihonDto				kihon;
	private MKojinDto				kojin;
	private CmSocInsuranceDto		socInsurance;
	private CmIncomeTaxDto			incomeTax;
	private CmResidenceTaxDto		residenceTax;
	private List<CmCommutationDto>	commutation;
	private List<CmUnitAmountDto>	unitAmount;
	private List<CmPaymentMeansDto>	paymentMeans;
	

	/**
	 * インスタンスを生成し、フィールドを設定する。<br>
	 * @param kihon 人事基本情報
	 * @param socInsurance 
	 * @param incomeTax 
	 * @param residenceTax 
	 * @param commutation 
	 * @param unitAmount 
	 * @param paymentMeans 
	 */
	public Employee(MKihonDto kihon, CmSocInsuranceDto socInsurance, CmIncomeTaxDto incomeTax,
			CmResidenceTaxDto residenceTax, List<CmCommutationDto> commutation, List<CmUnitAmountDto> unitAmount,
			List<CmPaymentMeansDto> paymentMeans) {
		this.kihon = kihon;
		this.socInsurance = socInsurance;
		this.incomeTax = incomeTax;
		this.residenceTax = residenceTax;
		this.commutation = commutation;
		this.unitAmount = unitAmount;
		this.paymentMeans = paymentMeans;
		kCode = kihon.getKCode();
	}
	
	/**
	 * @return
	 */
	public String getKCode() {
		return kCode;
	}
	
	/**
	 * @return
	 */
	public String getKName() {
		return kihon.getSimei();
	}
	
	/**
	 * @return
	 */
	public String getSectionCode() {
		return kihon.getSCode();
	}
	
	/**
	 * @return
	 */
	public String getSectionName() {
		return sectionName;
	}
	
	/**
	 * @param sectionName
	 */
	public void setSectionName(String sectionName) {
		this.sectionName = sectionName;
	}
	
	/**
	 * @param kojinDto
	 */
	public void setMKojinDto(MKojinDto kojinDto) {
		kojin = kojinDto;
	}
	
	/**
	 * 伝票コードを取得する。
	 * @return 伝票コード
	 */
	public String getSlipCode() {
		return PayrollConst.SLIP_ALL;
	}
	
	/**
	 * 通勤手当情報を取得する。
	 * @return 通勤手当情報
	 */
	public List<CmCommutationDto> getCommutation() {
		return commutation;
	}
	
	/**
	 * 単価情報を取得する。
	 * @return 単価情報
	 */
	public List<CmUnitAmountDto> getUnitAmount() {
		return unitAmount;
	}
	
	/**
	 * 支払方法情報を取得する。
	 * @return 支払方法情報
	 */
	public List<CmPaymentMeansDto> getPaymentMeans() {
		return paymentMeans;
	}
	
	/**
	 * 社会保険区分を取得する。
	 * @return 社会保険区分
	 */
	public String getCalcInsType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getCalcInsType();
	}
	
	/**
	 * 健康保険標準報酬月額を取得する。
	 * @return 健康保険標準報酬月額
	 */
	public int getHealthPayment() {
		if (socInsurance == null) {
			return 0;
		}
		return socInsurance.getHealthPayment();
	}
	
	/**
	 * 健康保険資格取得日を取得する。
	 * @return 健康保険資格取得日
	 */
	public Date getHealthGetDate() {
		if (socInsurance == null) {
			return null;
		}
		return socInsurance.getHealthGetDate();
	}
	
	/**
	 * 健康保険資格喪失日を取得する。
	 * @return 健康保険資格喪失日
	 */
	public Date getHealthLostDate() {
		if (socInsurance == null) {
			return null;
		}
		return socInsurance.getHealthLostDate();
	}
	
	/**
	 * 雇用保険区分を取得する。
	 * @return 雇用保険区分
	 */
	public String getCalcUnemployType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getCalcUnemployType();
	}
	
	/**
	 * 健康保険賞与区分を取得する。
	 * @return 健康保険賞与区分
	 */
	public String getBonusHealthType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getBonusHealthType();
	}
	
	/**
	 * 厚生年金賞与区分を取得する。
	 * @return 厚生年金賞与区分
	 */
	public String getBonusPensionType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getBonusPensionType();
	}
	
	/**
	 * 厚生年金標準報酬月額を取得する。
	 * @return 厚生年金標準報酬月額
	 */
	public int getPensionPayment() {
		if (socInsurance == null) {
			return 0;
		}
		return socInsurance.getPensionPayment();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getJuneAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getJuneAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getJulyAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getJulyAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getAugustAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getAugustAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getSeptemberAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getSeptemberAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getOctoberAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getOctoberAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getNovemberAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getNovemberAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getDecemberAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getDecemberAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getJanuaryAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getJanuaryAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getFebruaryAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getFebruaryAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getMarchAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getMarchAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getAprilAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getAprilAmount();
	}
	
	/**
	 * 住民税を取得する。<br>
	 * @return 住民税
	 */
	public int getMayAmount() {
		if (residenceTax == null) {
			return 0;
		}
		return residenceTax.getMayAmount();
	}
	
	/**
	 * 扶養等の数を取得する。
	 * @return 扶養等の数
	 */
	public byte getDependent() {
		if (incomeTax == null) {
			return 0;
		}
		return (byte)incomeTax.getDependentCount();
	}
	
	/**
	 * 給与区分を取得する。
	 * @return 給与区分
	 */
	public byte getPaymentType() {
		if (kihon != null && !kihon.getKyKubun().equals("")) {
			return Byte.parseByte(kihon.getKyKubun());
		}
		return PayrollConst.PAYMENT_MONTH;
	}
	
	/**
	 * 課税区分を取得する。
	 * @return 課税区分
	 */
	public String getIncomeTaxType() {
		if (incomeTax != null && !incomeTax.getIncomeTaxType().equals("")) {
			return incomeTax.getIncomeTaxType();
		}
		if (kihon != null && !kihon.getTxKubun().equals("")) {
			return kihon.getTxKubun();
		}
		return LegalConst.INCOME_TAX_NOT;
	}
	
	/**
	 * 介護保険区分を取得する。
	 * @return 介護保険区分
	 */
	public String getNursingInsType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getNursingInsType();
	}
	
	/**
	 * 性別を取得する。
	 * @return 性別コード
	 * @throws MospException MosP例外処理が発生した場合
	 */
	public String getGender() throws MospException {
		if (kojin == null) {
			return "1";
		}
		return kojin.getSeibetu();
	}
	
	/**
	 * 生年月日を取得する。
	 * @return 生年月日
	 * @throws MospException MosP例外処理が発生した場合
	 */
	public Date getBirthDate() throws MospException {
		if (kojin == null) {
			return null;
		}
		return PayrollUtility.getDate(String.valueOf(kojin.getSeinenbi()));
	}
	
	/**
	 * 年齢を取得する。
	 * @param toDate 年齢起算日
	 * @return 年齢
	 * @throws MospException MosP例外処理が発生した場合 
	 */
	public int getAge(Date toDate) throws MospException {
		if (toDate == null) {
			return 0;
		}
		Date birthDate = getBirthDate();
		if (birthDate == null) {
			return 0;
		}
		return PayrollUtility.getAge(birthDate, toDate);
	}
	
	/**
	 * 健康保険番号を取得する。
	 * @return 健康保険番号
	 */
	public String getKenpoNo() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getHealthNo();
	}
	
	/**
	 * 厚生年金番号を取得する。
	 * @return 厚生年金番号
	 */
	public String getKohoNo() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getPensionNo();
		
	}
}
