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

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

import jp.mosp.common.common.MospException;
import jp.mosp.human.dto.MKihonDto;
import jp.mosp.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 人事基本情報
	 */
	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;
		this.kCode = kihon.getKCode();
	}
	
	public String getKCode() {
		return kCode;
	}
	
	public String getKName() {
		return kihon.getSimei();
	}

	public String getSectionCode() {
		return kihon.getSCode();
	}

	public String getSectionName() {
		return sectionName;
	}

	public void setSectionName(String sectionName) {
		this.sectionName = sectionName;
	}
	
	/**
	 * 伝票コードを取得する。
	 * @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 int getHealthPayment() {
		if (socInsurance == null) {
			return 0;
		}
		return socInsurance.getHealthPayment();
	}
	
	/**
	 * 雇用保険区分を取得する。
	 * @return 雇用保険区分
	 */
	public String getCalcUnemployType() {
		if (socInsurance == null) {
			return "";
		}
		return socInsurance.getCalcUnemployType();
	}
	
	/**
	 * 厚生年金標準報酬月額を取得する。
	 * @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 
	 */
	public Date getBirthDate() throws MospException {
		if (kojin == null) {
			return null;
		}
		return PayrollUtility.getDate(String.valueOf(kojin.getSeinenbi()));
	}
	
	/**
	 * 年齢を取得する。
	 * @param toDate 年齢起算日
	 * @return 年齢
	 * @throws MospException 
	 */
	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);
	}
	
}
