package jp.mosp.payroll.base;

import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.dto.MosPConfDto;
import jp.mosp.common.utils.DateUtil;
import jp.mosp.common.utils.PrefectureUtil;
import jp.mosp.payroll.bonus.dao.PhBounsDao;
import jp.mosp.payroll.bonus.dao.PmDetailBaDao;
import jp.mosp.payroll.bonus.dao.PmDetailBdDao;
import jp.mosp.payroll.bonus.dao.PmDetailBsDao;
import jp.mosp.payroll.bonus.dto.PhBounsDto;
import jp.mosp.payroll.bonus.dto.PmDetailBaDto;
import jp.mosp.payroll.bonus.dto.PmDetailBdDto;
import jp.mosp.payroll.bonus.dto.PmDetailBsDto;
import jp.mosp.payroll.dao.CdSocInsuranceDao;
import jp.mosp.payroll.dao.CmMidwayEnterDao;
import jp.mosp.payroll.dao.CmSocInsuranceDao;
import jp.mosp.payroll.dao.PdPayAllowanceDao;
import jp.mosp.payroll.dao.PdPayDeductionDao;
import jp.mosp.payroll.dao.PdPayTimeDao;
import jp.mosp.payroll.dao.PhPaymentDao;
import jp.mosp.payroll.dao.PmDetailPaDao;
import jp.mosp.payroll.dao.PmDetailPdDao;
import jp.mosp.payroll.dao.PmDetailPsDao;
import jp.mosp.payroll.dao.PmDetailPtDao;
import jp.mosp.payroll.dto.CdSocInsuranceDto;
import jp.mosp.payroll.dto.CmMidwayEnterDto;
import jp.mosp.payroll.dto.CmSocInsuranceDto;
import jp.mosp.payroll.dto.DetailMoneyDto;
import jp.mosp.payroll.dto.DetailPaDto;
import jp.mosp.payroll.dto.DetailPdDto;
import jp.mosp.payroll.dto.DetailTimeDto;
import jp.mosp.payroll.dto.PhPaymentDto;

/**
 * @author koike
 *
 */
public abstract class CalculateAction extends AttendanceTotalAction {
	
//	
//	// フィールド
	// 計算処理実行インスタンス
//	protected UdPaymentDto udPaymentDto;	// 処理対象給与データ
	PdPayAllowanceDao						pdPayAllowanceDao;															// 処理対象給与(明細支給情報)データ
	PdPayDeductionDao						pdPayDeductionDao;															// 処理対象給与(明細控除情報)データ
	// 計算処理実行インスタンス(賞与)
//	protected UdBonusDto udBonusDto;	// 処理対象賞与データ
//	// 個別計算時利用変数
	
	//	private   int taxFree     = 0;	// 非課税額
//	private   int socInsFree  = 0;	// 非社会保険対象額
//	protected int bank1Amount = 0;	// 銀行1振込額
	
	//	protected int bank2Amount = 0;	// 銀行2振込額
//	protected int cashAmount  = 0;	// 現金支給額
	// 明細設定(共通)
	/**
	 * 
	 */
	protected Map<String, DetailPaDto>		mapDetailAllPa;
	/**
	 * 
	 */
	protected Map<String, DetailPdDto>		mapDetailAllPd;
	/**
	 * 
	 */
	protected Map<String, DetailMoneyDto>	mapDetailAllPs;
	/**
	 * 
	 */
	protected Map<String, DetailTimeDto>	mapDetailAllPt;
	
	//	// 計算式設定(共通)
//	protected Map<String, Map<String, CsExpressionDto>> mapExpressAll;
	
	//	// 明細設定(賞与共通)
	/**
	 * 
	 */
	protected Map<String, PmDetailBaDto>	mapDetailAllBa;
	/**
	 * 
	 */
	protected Map<String, PmDetailBdDto>	mapDetailAllBd;
	/**
	 * 
	 */
	protected Map<String, PmDetailBsDto>	mapDetailAllBs;
	
	// 会社情報(共通)
	/**
	 * 
	 */
	protected float							ratioHealthPremium		= 0;												// 健康保険料率 
	/**
	 * 
	 */
	protected float							ratioNursingPremium		= 0;												// 介護保険料率
	/**
	 * 
	 */
	protected float							ratioPensionPremium		= 0;												// 厚生年金料率
	/**
	 * 
	 */
	protected float							ratioFundPremium		= 0;												// 厚生年金基金料率
	/**
	 * 
	 */
	protected float							ratioUnemployPremium	= 0;												// 雇用保険料率
	/**
	 * 
	 */
	protected String						fundParticipation		= "";												// 厚生年金基金加入
																														
	/**
	 * 単価設定(共通)
	 */
	protected Map<String, String>			mapFamilyAllowance;														// 扶養手当単価
																														
	/**
	 * 条件設定(共通)
	 */
	protected int							familyAllowanceLimit	= 0;												// 扶養手当支給上限欠勤日数
//	// 明細設定MAP
//	Map<String, UsDetailDto> mapPaymentDetail;
//	// 給与支給日(UD_PAYMENT用)
//	protected Date payDay;
//	
	protected Date							startDateOfYear;															// 年開始日
	protected Date							lastDateOfYear;															// 年最終日
																														
	protected int							befkotei				= 0;
	protected int							nowkotei				= 0;
	
	protected int							befhikotei				= 0;
	protected int							nowhikotei				= 0;
	
	// 旧給与報酬金額
	protected int							oldPremium				= 0;
	
	// 旧給与健康保険料
	Date									oldHealthDate			= null;
	protected int							oldHealthPremium		= 0;
	
	// 旧給与介護保険料
	Date									oldNursingDate			= null;
	protected int							oldNursingPremium		= 0;
	
	// 旧給与厚生年金保険料
	Date									oldoldPensionDate		= null;
	protected int							oldPensionPremium		= 0;
	
	// 旧給与厚生年金基金保険料
	Date									oldFundDate				= null;
	protected int							oldFundPremium			= 0;
	
	// 旧給与社会保険金額
	Date									oldSocInsDate			= null;
	protected int							oldSocInsPremium		= 0;
	
//	// 賞与対象年月健康保険料(対象日以外)
//	protected int befHealthPremium   = 0;
//	// 賞与対象年月介護保険料(対象日以外)
//	protected int befNursingPremium  = 0;
//	// 賞与対象年月厚生年金保険料(対象日以外)
//	protected int befPensionPremium  = 0;
//	// 賞与対象年月厚生年金基金保険料(対象日以外)
//	protected int befFundPremium     = 0;
//	// 賞与対象年月社会保険金額(対象日以外)
//	protected int befSocInsPremium = 0;
//	
	// 社会保険等級
	protected int[]							arySocInsGrade			= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
		15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
		43, 44, 45, 46, 47											};
	// 標準報酬月額
	protected int[]							aryStandardPayment		= { 58000, 68000, 78000, 88000, 98000, 104000,
		110000, 118000, 126000, 134000, 142000, 150000, 160000, 170000, 180000, 190000, 200000, 220000, 240000, 260000,
		280000, 300000, 320000, 340000, 360000, 380000, 410000, 440000, 470000, 500000, 530000, 560000, 590000, 620000,
		650000, 680000, 710000, 750000, 790000, 830000, 880000, 930000, 980000, 1030000, 1090000, 1150000, 1210000 };
	// 報酬月額配列
	protected int[]							aryPaymentOver			= { 0, 63000, 73000, 83000, 93000, 101000, 107000,
		114000, 122000, 130000, 138000, 146000, 155000, 165000, 175000, 185000, 195000, 210000, 230000, 250000, 270000,
		290000, 310000, 330000, 350000, 370000, 395000, 425000, 455000, 485000, 515000, 545000, 575000, 605000, 635000,
		665000, 695000, 730000, 770000, 810000, 855000, 905000, 955000, 1005000, 1055000, 1115000, 1175000 };
	// 報酬月額配列
	protected int[]							aryPaymentUnder			= { 63000, 73000, 83000, 93000, 101000, 107000,
		114000, 122000, 130000, 138000, 146000, 155000, 165000, 175000, 185000, 195000, 210000, 230000, 250000, 270000,
		290000, 310000, 330000, 350000, 370000, 395000, 425000, 455000, 485000, 515000, 545000, 575000, 605000, 635000,
		665000, 695000, 730000, 770000, 810000, 855000, 905000, 955000, 1005000, 1055000, 1115000, 11750000, 0 };
	
	/**
	 * 
	 */
	protected CdSocInsuranceDao				cdSocInsuranceDao;															// 社会保険計算データ	
	/**
	 * 
	 */
	protected CdSocInsuranceDto				cdSocInsuranceDto;															// 社会保険計算データ
																														
	/**
	 * 
	 */
	protected PhPaymentDto					phSocInsPayment;
	
	static String[][]						aryPrefecture			= PrefectureUtil.getPrefectureArray();
	

//	
//	private String[][] aryRatioOvertime     ;
//	private String[][] aryRatioLateNight    ;
//	private String[][] aryRatioWorkOnHoliday;
//	
//	//　前月の課税対象額取得用年月
//	Date befTargetMonth;
//	
//	
//	/**
//	 * 計算月確認
//	 * @param date 対象年月
//	 * @throws Exception 
//	 */
//	protected void checkCalcCurrent(Date date) throws Exception {
//		if (getCalcCurrent().compareTo(date) != 0) {
//			String errMessage = MospUtility.getMessage(msg, UnicConst.MSG_NOT_CURRENT, "");
//			addErrMessage(errMessage);
//			throw new MospException(UnicConst.EX_NOT_CURRENT, errMessage);
//		}
//	}
//	
//	/**
//	 * 計算月確認(計算年月以降)
//	 * @param date 対象年月
//	 * @throws Exception 
//	 */
//	protected void checkCalcCurrentAfter(Date date) throws Exception {
//		if (getCalcCurrent().compareTo(date) > 0) {
//			String errMessage = MospUtility.getMessage(msg, UnicConst.MSG_NOT_CURRENT, "");
//			addErrMessage(errMessage);
//			throw new MospException(UnicConst.EX_NOT_CURRENT, errMessage);
//		}
//	}
//	
//	/**
//	 * 給与計算(勤怠及び人事情報から取得可能な情報のみ設定)
//	 * @throws Exception
//	 */
//	protected void calcPayment() throws Exception {
//		// 勤怠データ取得
//		getAttendanceList(kCode, targetMonth);
//		// 日集計データ取得
//		getAttendanceDaily();
//		// 日集計データ成果時間設定
//		setEffort();
//		// 日集計データ時間設定
//		setHours();
//		// 日集計データ日付手当設定
//		setDateAllowance();
//		// 月集計
//		attendanceMonthlyDto = totalAttendanceDaily();
//		// 明細設定初期化
//		setDetailData();
//		// アップロードデータ設定(給与データが既に存在する場合)
//		setUploadedData();
//		// 減額金、役職減額設定確認
//		chkCutAmount();
//		// 給与データ設定
//		// (基本給、職能手当、時間外手当、扶養手当、通勤費、単価項目)
//		setPaymentData();
//		// 計算式による計算
//		calcExpression();
//		// 給与支給日設定
//		attendanceMonthlyDto.setPayday(payDay);
//		// ステータス設定(データ作成)
//		attendanceMonthlyDto.setCalcStatus(UnicConst.CALC_STATUS_CRE);
//	}
//
//	/**
//	 * 明細設定取得
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 */
//	protected void setDetailData() throws SQLException, IllegalAccessException, NoSuchFieldException {
//		udPaymentDto = new PhPaymentDto();
//		udPaymentDto.setKCode(attendanceMonthlyDto.getKCode());
//		udPaymentDto.setEmploymentType(attendanceMonthlyDto.getEmploymentType());
//		udPaymentDto.setPositionCode(attendanceMonthlyDto.getPositionCode());
//		mapPaymentDetail = getMapDetail();
//	}
//
//	/**
//	 * 役職減額、基本減額設定
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 */
//	protected void chkCutAmount() {
//		// 皆勤減額設定確認
//		UsDetailDto usDetailDto = mapPaymentDetail.get(UnicConst.DTL_PAY_ALLOWANCE_07);
//		if (usDetailDto == null) {
//			// 皆勤減額を0円に設定
//			attendanceMonthlyDto.setCutForMissing(0);
//		}
//		// 役職減額設定確認
//		usDetailDto = mapPaymentDetail.get(UnicConst.DTL_PAY_ALLOWANCE_08);
//		if (usDetailDto == null) {
//			// 役職減額を0円に設定
//			attendanceMonthlyDto.setCutForShort(0);
//		}
//		// 基本減額設定確認
//		usDetailDto = mapPaymentDetail.get(UnicConst.DTL_PAY_ALLOWANCE_20);
//		// 計算社員に明細設定が存在しない場合
//		if (usDetailDto == null) {
//			// 基本減額を0円に設定
//			attendanceMonthlyDto.setCutFromBasic(0);
//		}
//	}
//	
//	/**
//	 * 法定控除計算(社会保険料及び税金の設定)
//	 * @throws Exception
//	 */
//	protected void calcLegalDeduction() throws Exception {
//		// 明細設定による金額計算(非課税額及び社会保険非対象額)
//		calcFreeAmount();
//		// 社会保険対象額設定
//		udPaymentDto.setAmountToSocIns(
//				udPaymentDto.calcAllowanceTotal() - socInsFree);
//		// 社会保険料設定
//		setSocialInsurance();
//		// 課税対象額設定
//		int taxation = udPaymentDto.calcAllowanceTotal() -
//				udPaymentDto.calcSocialInsurance() -
//				taxFree - udPaymentDto.getCommutationFree();
//		udPaymentDto.setAmountToTaxation(taxation > 0 ? taxation : 0);
//				
//		// 所得税設定
//		setIncomeTax();
//		// 住民税設定
//		setResidenceTax();
//		// 確定項目初期化
//		udPaymentDto.setAllowanceTotal(0);
//		udPaymentDto.setDeductionTotal(0);
//		udPaymentDto.setPaymentTotal  (0);
//		udPaymentDto.setBank1PayAmount(0);
//		udPaymentDto.setBank2PayAmount(0);
//		udPaymentDto.setCashPayAmount (0);
//		// ステータス設定(税金計算済み)
//		udPaymentDto.setCalcStatus(UnicConst.CALC_STATUS_TAX);
//	}
//	
	/**
	 * 確定計算(合計及び銀行振分)
	 * @throws Exception
	 */
	protected void calcTotal(boolean needCalcIncomeTax) throws Exception {
		// 明細設定による金額計算(非課税額及び社会保険非対象額)
//		calcFreeAmount();
		// 課税対象額設定
//		int taxation = udPaymentDto.calcAllowanceTotal() -
//				udPaymentDto.calcSocialInsurance() -
//				taxFree - udPaymentDto.getCommutationFree();
//		udPaymentDto.setAmountToTaxation(taxation > 0 ? taxation : 0);
		// 所得税計算
//		if (needCalcIncomeTax) {
//			setIncomeTax();
//		}
		// 合計計算準備
//		int allowance = 0;	// 総支給額
//		int deduction = 0;	// 総控除額
//		int total     = 0;	// 差引支給額
		// 総支給額取得
//		allowance = udPaymentDto.calcAllowanceTotal();
		// 総控除額取得
//		deduction = udPaymentDto.calcDeductionTotal();
		// 差引支給額計算(総支給額-総控除額)
//		total = allowance - deduction; 
		// 銀行振分
//		divideAmongAccounts(total, UnicConst.ALLOWANCE_TYPE_SALARY);
		// 確定情報設定
//		udPaymentDto.setAllowanceTotal(allowance  );
//		udPaymentDto.setDeductionTotal(deduction  );
//		udPaymentDto.setPaymentTotal  (total      );
		// 差引支給額がマイナスの場合は銀行1、銀行2、現金の値を0に設定する
//		if (total < 0) {
//			udPaymentDto.setBank1PayAmount(0);
//			udPaymentDto.setBank2PayAmount(0);
//			udPaymentDto.setCashPayAmount (total);
//		} else {
//			udPaymentDto.setBank1PayAmount(bank1Amount);
//			udPaymentDto.setBank2PayAmount(bank2Amount);
//			udPaymentDto.setCashPayAmount (cashAmount );
//		}
		// ステータス設定(確定処理済み)
//		udPaymentDto.setCalcStatus(UnicConst.CALC_STATUS_FIX);
	}
	
	/**
	 * 確定計算(合計及び銀行振分)(賞与)
	 * @throws Exception
	 */
	protected void calcBonusTotal() throws Exception {
//		// 所得税設定
//		setBonusIncomeTax();
//		// 確定計算準備
//		int allowance = 0;	// 総支給額
//		int deduction = 0;	// 総控除額
//		int total     = 0;	// 差引支給額
//		// 総支給額取得
//		allowance = udBonusDto.calcBonusAllowanceTotal();
//		// 総控除額取得
//		deduction = udBonusDto.calcBonusDeductionTotal();
//		// 差引支給額計算(総支給額-総控除額)
//		total = allowance - deduction; 
//		// 銀行振分
//		divideAmongAccounts(total, UnicConst.ALLOWANCE_TYPE_BONUS);
//		// 確定情報設定
//		udBonusDto.setAllowanceTotal(allowance  );
//		udBonusDto.setDeductionTotal(deduction  );
//		udBonusDto.setPaymentTotal  (total      );
//		// 差引支給額がマイナスの場合は銀行1、銀行2、現金の値を0に設定する
//		if (total < 0) {
//			udBonusDto.setBank1PayAmount(0);
//			udBonusDto.setBank2PayAmount(0);
//			udBonusDto.setCashPayAmount (total);
//		} else {
//			udBonusDto.setBank1PayAmount(bank1Amount);
//			udBonusDto.setBank2PayAmount(bank2Amount);
//			udBonusDto.setCashPayAmount (cashAmount );
//		}
//		// ステータス設定(確定処理済み)
//		udBonusDto.setCalcStatus(UnicConst.CALC_STATUS_FIX);
	}
	
//	/**
//	 * 支給日(休日考慮)取得
//	 * @param targetMonth 対象年月
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 * @throws MospException 
//	 */
//	public Date getPayDay(
//			Date targetMonth
//	) throws SQLException, IllegalAccessException, NoSuchFieldException, MospException {
//		// 取得準備
//		Date payDay = null;
//		Calendar payCal = Calendar.getInstance();
//		// 対象年月をカレンダーに設定
//		payCal.setTime(targetMonth);
//		// Confから取得した支給日、支給間隔を設定した支給日を取得
//		payDay = setSettingPaymentDate(payCal);
//		// 休日確認
//		while (!chkDateHoliday(payDay).equals("")){
//			// 休日の場合は支給日をマイナス1して再び確認
//			payCal.add(Calendar.DATE, -1);
//			payDay = payCal.getTime();
//		}
//		// 支給日の設定(休日考慮)
//		return payDay;
//	}
//	
//	/**
//	 * 休日確認
//	 * @param targetDate　対象年月
//	 * @return 休日の名称
//	 * @throws MospException
//	 */
//	private String chkDateHoliday(Date targetDate) throws MospException {
//		// 確認準備
//		Calendar targetCal = Calendar.getInstance();
//		String holidayName = "";
//		// 確認のためカレンダーに設定
//		targetCal.setTime(targetDate);
//		// 祝日確認
//		holidayName = chkLegalHoliday(targetDate);
//		if (holidayName.equals("")) {
//			// 対象日が国民の休日
//			holidayName = chkNationHoliday(targetDate);
//			if (holidayName.equals("")) 
//			{
//				// 対象日が振替休日
//				holidayName = chkTransferHoliday(targetDate);
//			} else {
//				return holidayName;
//			}
//		}
//		if (holidayName.equals("")) {
//			if (targetCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
//				// 対象日が土曜日
//				holidayName = "土";
//			}
//			if  (targetCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
//				// 対象日が日曜日
//				holidayName = "日";
//			}
//		} else {
//			return holidayName;
//
//		}
//		return holidayName;
//	}
//	
//	/**
//	 * 祝日確認
//	 * @param targetDate　対象年月
//	 * @return　祝日名称
//	 * @throws MospException
//	 */
//	private String chkNationHoliday(Date targetDate) throws MospException {
//		// 計算準備
//		String holidayName = "";
//		Calendar targetCal = Calendar.getInstance();
//		// 対象日の前日を取得
//		targetCal.setTime(targetDate);
//		targetCal.add(Calendar.DATE, 1);
//		Date befTargetDate = targetCal.getTime();
//		// 対象日の後日を取得
//		targetCal.setTime(targetDate);
//		targetCal.add(Calendar.DATE, -1);
//		Date aftTargetDate = targetCal.getTime();
//		// 前の日が休日でなければ国民の休日ではない
//		if (!chkLegalHoliday(befTargetDate).equals("")) {
//			// 次の日が平日なら国民の休日ではない
//			if (chkLegalHoliday(aftTargetDate).equals("")) {
//				holidayName = "";
//			} else {
//				// 対象日の前日、次の日が休日の場合のみ国民の休日適用
//				holidayName = "国民の休日";
//			}
//		} else {
//			holidayName = "";
//		}
//		return holidayName;
//	}
//
//	/**
//	 * 振替休日確認
//	 * @param targetDate　対象年月
//	 * @return　祝日名称
//	 * @throws MospException
//	 */
//	private String chkTransferHoliday(Date targetDate) throws MospException {
//		// 計算準備
//		String holidayName = "";
//		Calendar targetCal = Calendar.getInstance();
//		targetCal.setTime(targetDate);
//		// 対象週を取得
//		int targetWeek =  targetCal.get(Calendar.DAY_OF_WEEK_IN_MONTH);
//		// 対象週の日曜日が休日か判断
//		targetCal.set(Calendar.DAY_OF_WEEK_IN_MONTH, targetWeek);
//		targetCal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
//		holidayName =  chkLegalHoliday(targetCal.getTime());
//		
//		while (!holidayName.equals("")) {
//			targetCal.add(Calendar.DATE, 1);
//			holidayName = chkLegalHoliday(targetCal.getTime());
//		}
//		
//		if (targetCal.getTime().compareTo(targetDate) == 0) {
//			holidayName = "振替休日";
//		} else {
//			holidayName = "";
//		}
//			
//		
//		return holidayName;
//		
//	}
//	
//	/**
//	 * 祝日確認
//	 * @param targetDate　対象年月
//	 * @return　祝日名称
//	 * @throws MospException
//	 */
//	private String chkLegalHoliday(Date targetDate) throws MospException {
//		String legalHolidayName = "";
//		// 祝日配列取得(指定した年の祝日)
//		LegalHolidayUtility legalHolidayUtility = new LegalHolidayUtility(MospUtility.getYear(targetDate));
//		String [][] aryHoliday = legalHolidayUtility.getArySyuku();
//		// 対象日が祝日
//		for (int i= 0; i < aryHoliday.length; i++) {
//			// 日付確認のためStringからDateに
//			Date holiday = MospUtility.getDate(aryHoliday[i][0]);
//			if (holiday.compareTo(targetDate) == 0) {
//				// 日付が一致したら名称を返す
//				legalHolidayName = aryHoliday[i][1];
//				break;
//			}
//		}
//		
//		return legalHolidayName;
//	}
//	
//	/**
//	 * 設定支給日取得
//	 * @param payCal　対象年月(カレンダー)
//	 * @return　設定支給日
//	 * @throws SQLException
//	 * @throws IllegalAccessException
//	 * @throws NoSuchFieldException
//	 */
//	private Date setSettingPaymentDate(Calendar payCal)  throws SQLException, IllegalAccessException, NoSuchFieldException{
//		// 返還準備
//		Date payDay = null;
//		// CONFテーブルから支給日と支給間隔を取得
//		String[][] aryPayDay      = getConfArray(UnicConst.CONF_ID_PAY_DAY);
//		String[][] aryPayInterval = getConfArray(UnicConst.CONF_ID_PAY_ITBL);
//		
//		payCal.add(Calendar.MONTH, Integer.parseInt(aryPayInterval[0][1]));
//		payCal.set(Calendar.DATE, Integer.parseInt(aryPayDay[0][1]));
//		payDay = payCal.getTime();
//		
//		return payDay;
//		
//		
//		
//	}
//	/**
//	 * 給与データ設定(基本給、職能手当、時間外手当、扶養手当、通勤費、単価項目)
//	 * @throws Exception 
//	 */
//	private void setPaymentData() throws Exception {
//		// DAO準備
//		CmCommutationDao    cmCommutationDao    = new CmCommutationDao   ();
//		CmUnitAmountDao     cmUnitAmountDao     = new CmUnitAmountDao    ();
//		UsAbiliAllowanceDao usAbiliAllowanceDao = new UsAbiliAllowanceDao();
//		cmCommutationDao   .initDao(cfg, cmd, aspUser, user, conn);
//		cmUnitAmountDao    .initDao(cfg, cmd, aspUser, user, conn);
//		usAbiliAllowanceDao.initDao(cfg, cmd, aspUser, user, conn);
//		// 基本給設定
//		setBasicSalary();
//		// 職能手当1設定
//		attendanceMonthlyDto.setAbility1Allowance(uhIndividualDto.getAbilityAllowance());
//		// 職能手当2設定
//		attendanceMonthlyDto.setAbility2Allowance(uhIndividualDto.getAbilityAllowance2());
//		// 単価情報設定
//		List<CmUnitAmountDto> listUnitAmount = cmUnitAmountDao.findForEmployee(kCode);
//		setUnitAmount(listUnitAmount);
//		// 通勤費設定
//		setCmCommutationAmount(cmCommutationDao.findForEmployee(kCode));
//		// 時間外手当設定
//		setOvertimeAllowance(listUnitAmount);
//		// 扶養手当設定
//		setFamilyAllowance();
//	}
//	
//	/**
//	 * 計算単価設定
//	 * @param listUnitAmount 単価情報リスト
//	 */
//	private void setUnitAmount(List<CmUnitAmountDto> listUnitAmount) {
//		for (Iterator<CmUnitAmountDto> it = listUnitAmount.iterator(); it.hasNext();) {
//			CmUnitAmountDto dto = it.next();
//			int ceilAmount  = (int)round(dto.getUnitAmount(), 0, BigDecimal.ROUND_CEILING);
//			int floorAmount = (int)round(dto.getUnitAmount(), 0, BigDecimal.ROUND_FLOOR  );
//			if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_05)) {
//				attendanceMonthlyDto.setAllowance_05(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_06)) {
//				attendanceMonthlyDto.setAllowance_06(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_09)) {
//				attendanceMonthlyDto.setAllowance_09(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_10)) {
//				attendanceMonthlyDto.setAllowance_10(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_11)) {
//				attendanceMonthlyDto.setAllowance_11(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_12)) {
//				attendanceMonthlyDto.setAllowance_12(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_13)) {
//				attendanceMonthlyDto.setAllowance_13(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_15)) {
//				attendanceMonthlyDto.setAllowance_15(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_16)) {
//				attendanceMonthlyDto.setAllowance_16(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_ALLOWANCE_17)) {
//				attendanceMonthlyDto.setAllowance_17(ceilAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_08)) {
//				attendanceMonthlyDto.setDeduction_08(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_09)) {
//				attendanceMonthlyDto.setDeduction_09(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_10)) {
//				attendanceMonthlyDto.setDeduction_10(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_11)) {
//				attendanceMonthlyDto.setDeduction_11(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_12)) {
//				attendanceMonthlyDto.setDeduction_12(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_13)) {
//				attendanceMonthlyDto.setDeduction_13(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_14)) {
//				attendanceMonthlyDto.setDeduction_14(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_15)) {
//				attendanceMonthlyDto.setDeduction_15(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_16)) {
//				attendanceMonthlyDto.setDeduction_16(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_17)) {
//				attendanceMonthlyDto.setDeduction_17(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_18)) {
//				attendanceMonthlyDto.setDeduction_18(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_19)) {
//				attendanceMonthlyDto.setDeduction_19(floorAmount);
//			} else if (needUnitAmount(dto, UnicConst.DTL_PAY_DEDUCTION_20)) {
//				attendanceMonthlyDto.setDeduction_20(floorAmount);
//			}
//		}
//	}
//	
//	private boolean needUnitAmount(CmUnitAmountDto dto, String unitType) {
//		if (dto.getUnitType().equals(unitType) && dto.getUnitAmount() != 0D) {
//			return true;
//		}
//		return false;
//
//	}
//	
//	/**
//	 * 基本給を設定する。<br>
//	 */
//	private void setBasicSalary() {
//		// 基本給取得
//		int basicSalary = uhIndividualDto.getBasicSalary();
//		// 時給者
//		if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_HOUR)) {
//			// 基本 * 出勤時間(2008.10.02 野島 修正)
//			basicSalary = (int)round(basicSalary * attendanceMonthlyDto.getPaymentHours(),0 , BigDecimal.ROUND_HALF_UP);
//		} else if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_DAY)) {
//			// 日給者
//			basicSalary = basicSalary * (attendanceMonthlyDto.getPresence()
//					+ attendanceMonthlyDto.getWorkOnHoliday()
//					+ attendanceMonthlyDto.getParticularHoliday()
//					+ attendanceMonthlyDto.getPaidHoliday());
//		}
//		attendanceMonthlyDto.setBasicSalary(basicSalary);
//	}
//
//	
//	/**
//	 * 時間外割増率取得
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 */
//	private void setOvertimeRatio(
//			) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// 取得済確認
//		if (aryRatioOvertime != null) {
//			return;
//		}
//		// UM_CONFから値を取得
//		aryRatioOvertime      = getConfArray(UnicConst.CONF_ID_RATIO_OT);
//		aryRatioLateNight     = getConfArray(UnicConst.CONF_ID_RATIO_LN);
//		aryRatioWorkOnHoliday = getConfArray(UnicConst.CONF_ID_RATIO_WH);
//	}
//	
//	/**
//	 * アップロード項目設定
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 */
//	private void setUploadedData(
//	) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// DAO準備
//		PhPaymentDao dao = new PhPaymentDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 給与データ取得
//		PhPaymentDto dto = dao.findForKey(kCode, targetMonth);
//		if (dto == null) {
//			return;
//		}
//		// アップロード項目設定
//		attendanceMonthlyDto.setAllowance_05(dto.getAllowance_05());
//		attendanceMonthlyDto.setAllowance_09(dto.getAllowance_09());
//		attendanceMonthlyDto.setAllowance_10(dto.getAllowance_10());
//		attendanceMonthlyDto.setAllowance_11(dto.getAllowance_11());
//		attendanceMonthlyDto.setAllowance_12(dto.getAllowance_12());
//		attendanceMonthlyDto.setAllowance_13(dto.getAllowance_13());
//		attendanceMonthlyDto.setAllowance_15(dto.getAllowance_15());
//		attendanceMonthlyDto.setAllowance_16(dto.getAllowance_16());
//		attendanceMonthlyDto.setAllowance_17(dto.getAllowance_17());
//		attendanceMonthlyDto.setDeduction_08(dto.getDeduction_08());
//		attendanceMonthlyDto.setDeduction_09(dto.getDeduction_09());
//		attendanceMonthlyDto.setDeduction_10(dto.getDeduction_10());
//		attendanceMonthlyDto.setDeduction_12(dto.getDeduction_12());
//		attendanceMonthlyDto.setDeduction_13(dto.getDeduction_13());
//	}
//	
//	/**
//	 * 設定値取得(float)
//	 * @return 設定値(float)
//	 */
//	private float getConfValueFloat(String[][] aryConf, String confId) {
//		float confValue = 0F;
//		if (aryConf == null) {
//			return confValue;
//		}
//		for (int i = 0; i < aryConf.length; i++) {
//			if (aryConf[i][0].equals(confId)) {
//				return Float.parseFloat(aryConf[i][1]);
//			}
//		}
//		return confValue;
//	}
//	
//	/**
//	 * 時間単価取得。<br>
//	 * @return 時間単価
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws Exception 
//	 */
//	protected float getAmountPerHour() throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// 時間単価取得
//		setHoursPerDay();
//		setPrescribedCalendar();
//		float amountPerHour = 0F;
//		if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_MONTH)) {
//			amountPerHour = (
//					uhIndividualDto.getBasicSalary      () +
//					uhIndividualDto.getAbilityAllowance () +
//					uhIndividualDto.getAbilityAllowance2()
//					) / (prescribedDays * hoursPerDay);
//		} else if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_DAY)) {
//			amountPerHour = uhIndividualDto.getBasicSalary() / hoursPerDay;
//		} else if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_HOUR)) {
//			amountPerHour = uhIndividualDto.getBasicSalary();
//		}
//		return amountPerHour;
//	}
//	
//	/**
//	 * 時間外手当計算
//	 * @return 時間外手当
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 */
//	private void setOvertimeAllowance(
//			List<CmUnitAmountDto> listUnitAmount
//	) throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// デフォルト所定労働時間、時間外割増率取得
//		setHoursPerDay();
//		setOvertimeRatio();
//		// 時間単価取得
//		float amountPerHour = getAmountPerHour();
//		// 残業、成果手当
//		double effortAllowance = 0D;
//		// 割増単価取得
//		Float effortUnit = getUnitRatio(listUnitAmount, UnicConst.UNIT_OVERTIME);
//		// 割増単価が存在しない場合
//		if (effortUnit == null) {
//			// 割増単価 = 割増率 * 時間単価
//			effortUnit = new Float(getConfValueFloat(
//					aryRatioOvertime, uhIndividualDto.getPaymentType()) * amountPerHour);
//		}
//		if (attendanceMonthlyDto.getEffortTime() > 0) {
//			// 残業、成果手当 = 残業、成果時間 * 割増単価
//			effortAllowance = attendanceMonthlyDto.getEffortTime() * effortUnit.floatValue();
//		}
//		attendanceMonthlyDto.setEffortUnit(effortUnit.floatValue());
//		attendanceMonthlyDto.setEffortAllowance(
//				(int)round(effortAllowance, 0, BigDecimal.ROUND_CEILING));
//		// 深夜手当
//		double lateNightAllowance = 0D;
//		// 割増単価取得
//		Float lateNightUnit = getUnitRatio(listUnitAmount, UnicConst.UNIT_LATE_NIGHT);
//		// 割増単価が存在しない場合
//		if (lateNightUnit == null) {
//			// 割増単価 = 割増率 * 時間単価
//			lateNightUnit = new Float(getConfValueFloat(
//					aryRatioLateNight, uhIndividualDto.getPaymentType()) * amountPerHour);
//		}
//		if (attendanceMonthlyDto.getLateNight() > 0) {
//			// 深夜手当 = 深夜時間 * 割増単価
//			lateNightAllowance = attendanceMonthlyDto.getLateNight() * lateNightUnit.floatValue();
//		}
//		attendanceMonthlyDto.setLateNightUnit(lateNightUnit.floatValue());
//		attendanceMonthlyDto.setLateNightAllowance(
//				(int)round(lateNightAllowance, 0, BigDecimal.ROUND_CEILING));
//		// 深夜残業手当
//		double overLateAllowance = 0D;
//		if (attendanceMonthlyDto.getOverLate() > 0) {
//			// 深夜手当 = 深夜時間 * 割増単価
//			overLateAllowance = attendanceMonthlyDto.getOverLate() * effortUnit.floatValue();
//		}
//		attendanceMonthlyDto.setOverLateAllowance(
//				(int)round(overLateAllowance, 0, BigDecimal.ROUND_CEILING));
//		// 休日出勤手当
//		double holidayAllowance = 0D;
//		// 割増率取得
//		Float holidayUnit = getUnitRatio(listUnitAmount, UnicConst.UNIT_WORK_ON_HOLIDAY);
//		// 割増単価が存在しない場合
//		if (holidayUnit == null) {
//			// 割増単価 = 割増率 * 時間単価
//			holidayUnit = new Float(getConfValueFloat(
//					aryRatioWorkOnHoliday, uhIndividualDto.getPaymentType()) * amountPerHour);
//		}
//		if (attendanceMonthlyDto.getHolidayTime() > 0) {
//			// 休日手当 = 休日時間 * 割増単価
//			holidayAllowance = attendanceMonthlyDto.getHolidayTime() * holidayUnit.floatValue();
//		}
//		attendanceMonthlyDto.setHolidayUnit(holidayUnit.floatValue());
//		attendanceMonthlyDto.setHolidayAllowance(
//				(int)round(holidayAllowance, 0, BigDecimal.ROUND_CEILING));
//		// 成・深・休
//		attendanceMonthlyDto.setOvertimeAllowance(
//				attendanceMonthlyDto.getEffortAllowance   () +
//				attendanceMonthlyDto.getLateNightAllowance() +
//				attendanceMonthlyDto.getOverLateAllowance () +
//				attendanceMonthlyDto.getHolidayAllowance  ()
//		);
//	}
//	
//	/**
//	 * 単価取得(割増率)
//	 * @return 単価()
//	 * @throws Exception
//	 */
//	private Float getUnitRatio(List<CmUnitAmountDto> listUnitAmount, String unitType) {
//		for (int i = 0; i < listUnitAmount.size(); i++) {
//			CmUnitAmountDto dto = listUnitAmount.get(i);
//			if (dto.getUnitType().equals(unitType)) {
//				return new Float((float)dto.getUnitAmount());
//			}
//		}
//		return null;
//	}
//	
//	/**
//	 * 扶養手当を設定する。<br>
//	 * @throws Exception 
//	 */
//	private void setFamilyAllowance() throws Exception {
//		// 扶養手当初期化
//		attendanceMonthlyDto.setFamilyAllowance(0);
//		// 扶養設定確認
//		UsDetailDto usDetailDto = mapPaymentDetail.get(UnicConst.DTL_PAY_ALLOWANCE_04);
//		if (usDetailDto == null) {
//			// 設定がない社員は0円
//			return;
//		}
//		// 入社日確認
//		if (uhBasisDto.getEntranceDate().compareTo(startDate) > 0) {
//			// 支給無し(入社日が計算月初日より後の場合)
//			return;
//		}
//		// 退社日確認
//		if (uhBasisDto.getRetirementDate() != null) {
//			if (uhBasisDto.getRetirementDate().compareTo(endDate) < 0) {
//				// 支給無し(退社日が計算月最終日より前の場合)
//				return;
//			}
//		}
//		// 扶養手当支給下限出勤日数取得
//		if (familyAllowanceLimit == 0) {
//			familyAllowanceLimit =
//				(int)getConfValueDouble(UnicConst.CONF_ID_FAMILIY_LM, "");
//		}
//		// 扶養手当支給上限欠勤日数確認
//		if (attendanceMonthlyDto.getAbsence() > familyAllowanceLimit) {
//			// 支給無し(出勤日数が扶養手当支給上限欠勤日数より多い場合)
//			return;
//		}
//		// 扶養手当単価設定取得
//		if (mapFamilyAllowance == null) {
//			mapFamilyAllowance = getConfMap(UnicConst.CONF_ID_FAMILIY_AW);
//		}
//		// 家族(保険)情報取得
//		CmFamilyInsureDao dao = new CmFamilyInsureDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		List<CmFamilyInsureDto> list = dao.findForEmployee(kCode);
//		// 扶養手当対象者数取得
//		int cntFamily = 0;
//		for (Iterator<CmFamilyInsureDto> it = list.iterator(); it.hasNext();) {
//			CmFamilyInsureDto dto = it.next();
//			// 健康保険被扶養者資格取得日無しの場合
//			if (dto.getHeaQualifiedDate() == null) {
//				// 扶養手当対象外
//				continue;
//			}
//			// 健康保険被扶養者資格取得日 > 計算月初日
//			if (dto.getHeaQualifiedDate().compareTo(startDate) > 0) {
//				// 扶養手当対象外
//				continue;
//			}
//			// 剥奪日有り 且つ 剥奪日 <= 計算月最終日
//			if (dto.getHeaDisqualifiedDate() != null &&
//					dto.getHeaDisqualifiedDate().compareTo(endDate) <= 0) {
//				// 扶養手当対象外
//				continue;
//			}
//			++cntFamily;
//		}
//		// 扶養手当計算
//		int familyAllowance = 0;
//		for (int i = 0; i < cntFamily; i++) {
//			// 単価取得
//			int unitAmount = 0;
//			String strAmount = mapFamilyAllowance.get(String.valueOf(i + 1));
//			if (strAmount == null) {
//				// 0の単価を用いる(単価設定が存在しない場合)
//				strAmount = mapFamilyAllowance.get(String.valueOf(0));
//			}
//			if (strAmount == null) {
//				unitAmount = 0;
//			} else {
//				unitAmount = Integer.parseInt(strAmount);
//			}
//			// 扶養手当加算
//			familyAllowance += unitAmount;
//		}
//		// 扶養手当設定
//		attendanceMonthlyDto.setFamilyAllowance(familyAllowance);
//	}
//	
//	/**
//	 * 通勤費設定
//	 * @param listCommutation 通勤費情報リスト
//	 */
//	private void setCmCommutationAmount(List<CmCommutationDto> listCommutation) {
//		// 変数宣言
//		int commuteAmount = 0;	// 支給通勤手当
//		int monthlyAmount = 0;	// 当月通勤手当
//		int monthlyTaxed  = 0;	// 当月課税通勤費
//		// 給与情報取得
//		for (Iterator<CmCommutationDto> it = listCommutation.iterator(); it.hasNext();) {
//			// 変数宣言
//			int amount = 0    ;	// 個別当月通勤手当
//			int taxed  = 0    ;	// 個別当月課税通勤費
//			// データ取得
//			CmCommutationDto cmCommutationDto = it.next();
//			// 当月通勤手当取得
//			if (cmCommutationDto.getPaymentInterval().equals("1")) {
//				// 支給間隔：毎月
//				amount = cmCommutationDto.getCommuteAmount();
//				taxed  = cmCommutationDto.getCommuteTaxed ();
//				// 当月通勤手当及び当月課税通勤費加算
//				monthlyAmount += amount;
//				monthlyTaxed  += taxed ;
//				// 支給通勤手当加算
//				commuteAmount += amount;
//			} else if (cmCommutationDto.getPaymentInterval().equals("5")) {
//				// 支給間隔：毎日(通勤費×出勤日数(休出含む))
//				amount = cmCommutationDto.getCommuteAmount() * attendanceMonthlyDto.getPresenceAtt();
//				taxed  = cmCommutationDto.getCommuteTaxed () * attendanceMonthlyDto.getPresenceAtt();
//				// 当月通勤手当及び当月課税通勤費加算
//				monthlyAmount += amount;
//				monthlyTaxed  += taxed ;
//				// 支給通勤手当加算
//				commuteAmount += amount;
//			} else {
//				// 支給間隔：2ヶ月、3ヶ月、6ヶ月
//				int interval     ;	// 支給間隔
//				int payStartMonth;	// 支給開始月
//				int currentMonth ;	// 計算対象月
//				// 支給間隔取得
//				if (cmCommutationDto.getPaymentInterval().equals("2")) {
//					interval = 2;
//				} else if (cmCommutationDto.getPaymentInterval().equals("3")) {
//					interval = 3;
//				} else {
//					interval = 6;
//				}
//				// 支給開始月取得
//				payStartMonth = MospUtility.getMonth(cmCommutationDto.getPayStartMonth());
//				// 計算対象月取得
//				currentMonth  = MospUtility.getMonth(targetMonth);
//				// 個別当月通勤手当設定
//				amount = (int)round(
//						cmCommutationDto.getCommuteAmount() / (double)interval, 0, BigDecimal.ROUND_FLOOR);
//				// 個別当月課税通勤費設定
//				taxed  = (int)round(
//						cmCommutationDto.getCommuteTaxed () / (double)interval, 0, BigDecimal.ROUND_FLOOR);
//				// 通勤手当支給月判断
//				if (isAllowMonth(interval, payStartMonth, currentMonth)) {
//					// 当月通勤手当、当月課税通勤費再設定
//					amount += cmCommutationDto.getCommuteAmount() - amount * interval;
//					taxed  += cmCommutationDto.getCommuteTaxed () - taxed  * interval;
//				}
//				// 当月通勤手当及び当月課税通勤費加算
//				monthlyAmount += amount;
//				monthlyTaxed  += taxed ;
//				// 支給通勤手当加算
//				if (cmCommutationDto.getLumpMonthlyType().equals("1")) {
//					// 一括区分：一括
//					if (isAllowMonth(interval, payStartMonth, currentMonth)) {
//						// 支給月の場合
//						commuteAmount += cmCommutationDto.getCommuteAmount();
//					}
//				} else {
//					// 一括区分：月割
//					commuteAmount += amount;
//				}
//			}
//			// 交通用具利用者の限度額超過による課税通勤費
//			// 課税しない(独自仕様)
//			/*
//			if (cmCommutationDto.getCommuteType().equals(UnicConst.COMMUTE_TYPE_CAR)) {
//				float distance = cmCommutationDto.getCommuteDistance();
//				// 2km未満の場合は2kmとする(独自仕様)
//				distance = distance < 2F ? 2F : distance;
//				// 課税通勤費取得
//				monthlyTaxed += LegalUtility.getTaxationForCarCommute(
//						amount - taxed, distance);
//			}
//			*/
//		}
//		// 通勤手当の限度額超過による課税通勤費
//		monthlyTaxed  += LegalUtility.getTaxationForCommutation(
//				monthlyAmount - monthlyTaxed);
//		// 給与情報設定
//		attendanceMonthlyDto.setCommutation   (commuteAmount);
//		attendanceMonthlyDto.setCommutationTax(monthlyTaxed);
//	}
//	
//	/**
//	 * 支給月判定
//	 * @param paymetInterval 支給間隔
//	 * @param payStartMonth  支給開始月
//	 * @param currentMonth   判定対象月
//	 * @return 支給月判定結果(true：支給月、false：支給月でない)
//	 */
//	private boolean isAllowMonth(
//			int paymetInterval, int payStartMonth, int currentMonth
//	) {
//		int allowMonth = payStartMonth;
//		do {
//			allowMonth += paymetInterval;
//			if (12 < allowMonth) {
//				allowMonth -= 12;
//			}
//			if (currentMonth == allowMonth) {
//				return true;
//			}
//		} while (payStartMonth != allowMonth);
//		return false;
//	}
//	
//	/**
//	 * 社会保険料設定
//	 * @throws NoSuchFieldException 
//	 */
//	private void setSocialInsurance() throws SQLException, IllegalAccessException, NoSuchFieldException {
//		int health   = 0;	// 健康保険料
//		int nursing  = 0;	// 介護保険料
//		int pension  = 0;	// 厚生年金料
//		int fund     = 0;	// 厚生年金基金料
//		int unemploy = 0;	// 雇用保険料
//		// 人事給与情報(保険)取得
//		CmSocInsuranceDao dao = new CmSocInsuranceDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		CmSocInsuranceDto dto = dao.findForEmployee(kCode, targetMonth);
//		// 人事給与情報(保険)確認
//		if (dto == null) {
//			// 社会保険料設定
//			udPaymentDto.setHealthInsurance  (health  );
//			udPaymentDto.setNursingInsurance (nursing );
//			udPaymentDto.setPensionInsurance (pension );
//			udPaymentDto.setPensionFund      (fund    );
//			udPaymentDto.setEmployeeInsurance(unemploy);
//			return;
//		}
//		// 社会保険料計算
//		if (dto.getCalcInsType().equals(LegalConst.CALC_INS)) {
//			// 健康保険、介護保険計算対象確認
//			if (dto.getHealthLostType().equals("")) {
//				// 健康保険料計算
//				health = LegalUtility.calcPremium(dto.getHealthPayment(),
//						ratioHealthPremium, BigDecimal.ROUND_HALF_UP);
//				// 介護保険計算対象確認
//				if(chkCalcNursingInsType(dto.getNursingInsType())) {
//					// 介護保険料計算
//					nursing = LegalUtility.calcPremium(dto.getHealthPayment(),
//							ratioNursingPremium, BigDecimal.ROUND_HALF_UP);
//				}
//			}
//			// 厚生年金、厚生年金基金計算対象確認
//			if (dto.getPensionLostType().equals("")) {
//				// 厚生年金料計算
//				pension = LegalUtility.calcPremium(dto.getPensionPayment(),
//						ratioPensionPremium, BigDecimal.ROUND_HALF_DOWN);
//				// 厚生年金基金料計算(厚生年金基金加入区分が「加入」の場合)
//				if (fundParticipation.equals(LegalConst.FUND_PARTICIPATION_ON)) {
//					fund = LegalUtility.calcPremium(dto.getPensionPayment(),
//							ratioFundPremium, BigDecimal.ROUND_HALF_UP);
//				}
//			}
//		}
//		// 雇用保険料計算(雇用保険区分が「計算する」の場合)
//		if (dto.getCalcUnemployType().equals(LegalConst.CALC_UNEMPLOY)) {
//			// 雇用保険料計算対象確認
//			if (dto.getUnemployLostType().equals("")) {
//				unemploy = LegalUtility.calcPremium(
//						udPaymentDto.getAmountToSocIns(),
//						ratioUnemployPremium / 1000, BigDecimal.ROUND_HALF_DOWN);
//			}
//		}
//		// 社会保険料設定
//		udPaymentDto.setHealthInsurance  (health  );
//		udPaymentDto.setNursingInsurance (nursing );
//		udPaymentDto.setPensionInsurance (pension );
//		udPaymentDto.setPensionFund      (fund    );
//		udPaymentDto.setEmployeeInsurance(unemploy);
//	}
//	
//	/**
//	 * 介護保険計算対象確認
//	 * @param nursingInsType　介護保険区分
//	 * @return　計算対象確認フラグ
//	 * @throws SQLException
//	 * @throws IllegalAccessException
//	 * @throws NoSuchFieldException
//	 */
//	public boolean chkCalcNursingInsType(String nursingInsType) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		boolean isCalc = false;
//		// 介護保険料計算(介護保険区分が「対象(自動)」の場合)
//		if (nursingInsType.equals(LegalConst.NURSING_INS_AUTO)) {
//			// 年齢で計算対象か判断
//			isCalc = chkCalcNusingInsAuto();
//		}
//		// 介護保険料計算(介護保険区分が「対象」の場合)
//		if (nursingInsType.equals(LegalConst.NURSING_INS_MANUAL)) {
//			isCalc = true;
//		}
//		return isCalc;
//	}
//	
//	/**
//	 * 介護保険計算対象確認(区分：計算対象(自動))
//	 * @return 計算対象確認フラグ
//	 * @throws SQLException
//	 * @throws IllegalAccessException
//	 * @throws NoSuchFieldException
//	 */
//	public boolean chkCalcNusingInsAuto() throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// 計算対象確認フラグ
//		boolean isCalc = false;
//		// DAO準備
//		UmExtraDao umExtraDao = new UmExtraDao();
//		umExtraDao.initDao(cfg, cmd, aspUser, user, conn);
//		// 年齢取得準備
//		int age = 0;
//		// 対象年月最終日+1日取得
//		Date targetDate = addDay(getEndDate(targetMonth), 1);
//		// 管理情報取得
//		UmExtraDto umExtraDto = umExtraDao.findForKey(kCode);
//		// 管理データが存在しない社員は対象外
//		if (umExtraDto == null) {
//			isCalc = false;
//			return isCalc;
//		}
//		// 誕生日が設定されていない社員は対象外
//		if (umExtraDto.getBirthDate() == null) {
//			isCalc = false;
//			return isCalc;
//		}
//		// 年齢取得(対象年月最終日+1日で判断)
//		age = getAge(umExtraDto.getBirthDate(), targetDate);
//		// 40歳以上65歳未満は計算対象
//		if (age >= 40) {
//			isCalc = true;
//		}
//		if (age >= 65 ) {
//			isCalc = false;
//		}
//		return isCalc;
//		
//	}
	
	/**
	 * 明細設定による金額計算(非課税額及び社会保険非対象額)
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 */
//	private void calcFreeAmount(
//	) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// 初期化
//		taxFree    = 0;
//		socInsFree = 0;
//		// 明細設定取得
//		Map<String, DetailPaDto > mapDetail = getMapDetail();
//		if (mapDetail == null) {
//			return;
//		}
//		// 明細設定項目毎に確認(KS18(通勤費)はケースにより非課税上限が変わるため設定は無視)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_01), udPaymentDto.getBasicSalary      ());	// 給与・支給01(KS01)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_02), udPaymentDto.getAbility1Allowance());	// 給与・支給02(KS02)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_03), udPaymentDto.getAbility2Allowance());	// 給与・支給03(KS03)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_04), udPaymentDto.getFamilyAllowance  ());	// 給与・支給04(KS04)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_05), udPaymentDto.getAllowance_05     ());	// 給与・支給05(KS05)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_06), udPaymentDto.getAllowance_06     ());	// 給与・支給06(KS06)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_07), udPaymentDto.getCutForMissing    ());	// 給与・支給07(KS07)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_08), udPaymentDto.getCutForShort      ());	// 給与・支給08(KS08)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_09), udPaymentDto.getAllowance_09     ());	// 給与・支給09(KS09)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_10), udPaymentDto.getAllowance_10     ());	// 給与・支給10(KS10)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_11), udPaymentDto.getAllowance_11     ());	// 給与・支給11(KS11)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_12), udPaymentDto.getAllowance_12     ());	// 給与・支給12(KS12)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_13), udPaymentDto.getAllowance_13     ());	// 給与・支給13(KS13)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_14), udPaymentDto.getDateAllowance    ());	// 給与・支給14(KS14)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_15), udPaymentDto.getAllowance_15     ());	// 給与・支給15(KS15)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_16), udPaymentDto.getAllowance_16     ());	// 給与・支給16(KS16)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_17), udPaymentDto.getAllowance_17     ());	// 給与・支給17(KS17)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_19), udPaymentDto.getOvertimeAllowance());	// 給与・支給19(KS20)
//		setFreeAmount(mapDetail.get(UnicConst.DTL_PAY_ALLOWANCE_20), udPaymentDto.getCutFromBasic     ());	// 給与・支給20(KS20)
//	}
	
	/**
	 * 明細設定による金額設定(非課税額及び社会保険非対象額)
	 * @param detail       明細設定DTO
	 * @param targetAmount 対象金額
	 */
//	private void setFreeAmount(DetailPaDto detail, int targetAmount) {
//		// 設定要否確認
//		if (targetAmount == 0 || detail == null) {
//			return;
//		}
//		// 課税対象区分確認
//		if (detail.getTaxObjectType().equals(LegalConst.TAX_OBJECT_FREE)) {
//			if (detail.getTaxFreeUpperLimit() == 0) {
	// 全額非課税
//				taxFree += targetAmount;
//			} else if (targetAmount > detail.getTaxFreeUpperLimit()) {
	// 非課税上限額までは非課税(課税対象の場合)
//				taxFree += detail.getTaxFreeUpperLimit();
//			} else {
	// 上限に達しない場合は全額非課税
//				taxFree += targetAmount;
//			}
//		}
	// 社会保険対象区分確認
//		if (detail.getSocInsObjectType().equals(LegalConst.SOC_INS_OBJECT_FREE)) {
	// 全額非社会保険対象
//			socInsFree += targetAmount;
//		}
//	}
	
//	/**
//	 * 社会保険個人負担料率取得
//	 * @throws SQLException
//	 * @throws IllegalAccessException
//	 * @throws NoSuchFieldException
//	 */
//	public void setSocInsRatio(
//	) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// 初期化
//		ratioHealthPremium   = 0;	// 健康保険料率 
//		ratioNursingPremium  = 0;	// 介護保険料率
//		ratioPensionPremium  = 0;	// 厚生年金料率
//		ratioFundPremium     = 0;	// 厚生年金基金料率
//		ratioUnemployPremium = 0;	// 雇用保険料率
//		fundParticipation    = LegalConst.FUND_PARTICIPATION_OFF;	// 厚生年金基金加入区分
//		// 会社情報取得
//		CmCompanyDao cmCompanyDao = new CmCompanyDao();
//		cmCompanyDao.initDao(cfg, cmd, aspUser, user, conn);
//		CmCompanyDto cmCompanyDto = cmCompanyDao.findAll();
//		if (cmCompanyDto == null) {
//			return;
//		}
//		// 社会保険個人負担料率取得
//		ratioHealthPremium   = cmCompanyDto.getHealthPremiumRate  ();	// 健康保険料率  
//		ratioNursingPremium  = cmCompanyDto.getNursingPremiumRate ();	// 介護保険料率
//		ratioPensionPremium  = cmCompanyDto.getPensionPremiumRate ();	// 厚生年金料率
//		ratioFundPremium     = cmCompanyDto.getFundPremiumRate    ();	// 厚生年金基金料率
//		ratioUnemployPremium = cmCompanyDto.getUnemployPremiumRate();	// 雇用保険料率
//		fundParticipation    = cmCompanyDto.getFundParticipation  ();	// 厚生年金基金加入区分
//	}
//	
//	/**
//	 * 住民税設定
//	 * @throws IllegalAccessException 
//	 * @throws SQLException 
//	 * @throws NoSuchFieldException 
//	 */
//	public void setResidenceTax(
//	) throws SQLException, IllegalAccessException {
//		// 人事給与情報(住民税)取得
//		CmResidenceTaxDao dao = new CmResidenceTaxDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		CmResidenceTaxDto dto = dao.findForEmployeeDate(kCode, targetMonth);
//		if (dto == null) {
//			udPaymentDto.setResidenceTax(0);
//			return;
//		}
//		// 対象月住民税取得(対象月+1)
//		int residenceTax = 0;
//		int month = MospUtility.getMonth(targetMonth) + 1;
//		if (month == 13) {
//			month = 1;
//		}
//		switch (month) {
//			case 6:
//				residenceTax = dto.getJuneAmount    ();
//				break;
//			case 7:
//				residenceTax = dto.getJulyAmount    ();
//				break;
//			case 8:
//				residenceTax = dto.getAugustAmount  ();
//				break;
//			case 9:
//				residenceTax = dto.getSeptemberAmount();
//				break;
//			case 10:
//				residenceTax = dto.getOctoberAmount ();
//				break;
//			case 11:
//				residenceTax = dto.getNovemberAmount();
//				break;
//			case 12:
//				residenceTax = dto.getDecemberAmount();
//				break;
//			case 1:
//				residenceTax = dto.getJanuaryAmount ();
//				break;
//			case 2:
//				residenceTax = dto.getFebruaryAmount();
//				break;
//			case 3:
//				residenceTax = dto.getMarchAmount   ();
//				break;
//			case 4:
//				residenceTax = dto.getAprilAmount   ();
//				break;
//			case 5:
//				residenceTax = dto.getMayAmount     ();
//				break;
//			default:
//				residenceTax = 0;
//		}
//		udPaymentDto.setResidenceTax(residenceTax);
//	}
	
	/**
	 * 所得税設定
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 */
	public void setIncomeTax() throws SQLException, IllegalAccessException {
//		// 人事給与情報(所得税)取得
//		CmIncomeTaxDao cmIncomeTaxDao = new CmIncomeTaxDao();
//		cmIncomeTaxDao.initDao(cfg, cmd, aspUser, user, conn);
//		CmIncomeTaxDto dto = cmIncomeTaxDao.findForEmployeeDate(kCode, targetMonth);
//		// 人事給与情報(所得税)が存在しない場合は0を設定
//		if (dto == null) {
//			// 所得税額計算及び設定
//			udPaymentDto.setIncomeTax(0);
//			// 扶養等の数設定
//			udPaymentDto.setDependentCount(0);
//			return;
//		}
//		// 扶養等の数取得
//		int dependent = dto.getDependentCount();
//		// 課税区分取得
//		String incomeTaxType = dto.getIncomeTaxType();
//		// 社会保険料等控除後の給与等の金額取得
//		int taxation = udPaymentDto.getAmountToTaxation();
//		// 所得税額計算及び設定
//		udPaymentDto.setIncomeTax(
//				LegalUtility.calcIncomeTax(incomeTaxType, taxation, dependent));
//		// 扶養等の数設定
//		udPaymentDto.setDependentCount(dependent);
	}
	
	/**
	 * 所得税設定(賞与)
	 * @throws Exception 
	 */
	public void setBonusIncomeTax() throws Exception {
//		// 人事給与情報(所得税)取得
//		CmIncomeTaxDao cmIncomeTaxDao = new CmIncomeTaxDao();
//		cmIncomeTaxDao.initDao(cfg, cmd, aspUser, user, conn);
//		// 給与情報取得準備
//		PhPaymentDao udPaymentDao = new PhPaymentDao();
//		udPaymentDao.initDao(cfg, cmd, aspUser, user, conn);
//		// 給与支払間隔取得(翌月払いなら1)
//		String interval = getConfValue(UnicConst.CONF_ID_PAY_ITBL, UnicConst.CONF_CD_ADJUST_PAY);
//		// 対象年月の前月の日付を取得
//		befTargetMonth = addMonth(targetMonth, -1 - Integer.parseInt(interval));
//		CmIncomeTaxDto dto = cmIncomeTaxDao.findForEmployeeDate(kCode, befTargetMonth);
//		// 人事給与情報(所得税)が存在しない場合は0を設定
//		if (dto == null) {
//			// 所得税額計算及び設定
//			udBonusDto.setIncomeTax(0);
//			// 扶養等の数設定
//			udBonusDto.setDependentCount(0);
//			return;
//		}
//		// 扶養等の数取得
//		int dependent = dto.getDependentCount();
//		// 課税区分取得
//		String incomeTaxType = dto.getIncomeTaxType();
//		udPaymentDto = udPaymentDao.findForUpdate(kCode, befTargetMonth);
//		// 社会保険料等控除後の給与等の金額取得
//		int payTaxation = udPaymentDto != null ? udPaymentDto.getAllowanceTotal() - udPaymentDto.calcSocialInsurance() : 0;
//		// 課税対象額(賞与)
//		int bonusTaxation = udBonusDto.calcBonusAllowanceTotal() - udBonusDto.calcBonusSocialInsurance();
//		// 税率取得用配列取得
//		double[] aryIncomeTax = LegalUtility.getBonIncomeTaxArray(incomeTaxType, dependent);
//		// 所得税率設定
//		udBonusDto.setIncomeRate((float)LegalUtility.getBonusIncomeRate(aryIncomeTax, payTaxation));
//		
//		// 所得税額計算及び設定
//		udBonusDto.setIncomeTax(
//				LegalUtility.calcBonusIncomeTax(incomeTaxType, payTaxation, bonusTaxation, dependent));
//		// 扶養等の数設定
//		udBonusDto.setDependentCount(dependent);
//		// 前月の給与等の金額設定
//		udBonusDto.setLastMonthTaxation(payTaxation);
	}
	
//	/**
//	 * 銀行振分
//	 * @param total         差引支給額
//	 * @param allowanceType 支給区分(1：給与、2：賞与)
//	 * @throws SQLException
//	 * @throws IllegalAccessException
//	 * @throws NoSuchFieldException
//	 */
//	protected void divideAmongAccounts(
//			int total, String allowanceType
//	) throws SQLException, IllegalAccessException, NoSuchFieldException {
//		// 初期化
//		bank1Amount = 0;
//		bank2Amount = 0;
//		cashAmount  = 0;
//		// DAO準備
//		CmPaymentMeansDao dao = new CmPaymentMeansDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 支給方法情報取得(支給方法連番順)
//		List<CmPaymentMeansDto> list;
//		list = dao.findForEmployeeAllowance(kCode, allowanceType);
//		// 支給情報毎の処理
//		int currentAmount = total;
//		for (Iterator<CmPaymentMeansDto> it = list.iterator(); it.hasNext();) {
//			CmPaymentMeansDto dto = it.next();
//			// 振分金額取得
//			int amount = getdividedAmount(dto, total, currentAmount);
//			// 振分金額設定
//			if (dto.getPaymentMeans().equals(UnicConst.PAYMENT_MEANS_ACCOUNT)) {
//				// 振込の場合
//				if (dto.getMeansSequence() == UnicConst.PAYMENT_MEANS_SEQ_1
//						|| dto.getMeansSequence() == UnicConst.PAYMENT_MEANS_SEQ_3) {
//					bank1Amount += amount;
//				} else {
//					bank2Amount += amount;
//				}
//			} else {
//				// 振込以外(現金)の場合
//				cashAmount += amount;
//			}
//			// 残額計算
//			currentAmount -= amount;
//		}
//		// 残額を現金に設定
//		cashAmount += currentAmount;
//	}
//	
//	/**
//	 * 振分支給額取得
//	 * @param dto           支給方法DTO
//	 * @param totalAmount   振分総額
//	 * @param currentAmount 振分元金額(残額)
//	 */
//	private int getdividedAmount(
//			CmPaymentMeansDto dto, int totalAmount, int currentAmount
//	) {
//		// 支給情報が設定されていない場合
//		if (dto == null) {
//			return 0;
//		}
//		// 全額の場合
//		if (dto.getAmountType().equals(UnicConst.AMOUNT_TYPE_ALL)) {
//			return currentAmount;
//		}
//		// 残額の場合
//		if (dto.getAmountType().equals(UnicConst.AMOUNT_TYPE_REST)) {
//			return currentAmount;
//		}
//		// 振分支給額
//		int dividingAmount = 0;
//		// 金額区分毎の処理
//		if (dto.getAmountType().equals(UnicConst.AMOUNT_TYPE_AMOUNT)) {
//			// 定額の場合
//			dividingAmount = dto.getFixedAmount();
//		} else if (dto.getAmountType().equals(UnicConst.AMOUNT_TYPE_RATIO)) {
//			// 定率の場合
//			// 振分総額 * 振分率 / 100
//			dividingAmount = (int)round(
//					dto.getFixedAmount() / 100 * totalAmount,
//					0, BigDecimal.ROUND_HALF_UP);
//		}
//		// 振分元金額以上の場合
//		if (dividingAmount > currentAmount) {
//			dividingAmount = currentAmount;
//		}
//		return dividingAmount;
//	}
	
	/**
	 * 給与支払部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, DetailPaDto> getMapDetailPa() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		List<DetailPaDto> listDetailAllPa;
		DetailPaDto dto;
		// 明細設定取得
		if (mapDetailAllPa == null) {
			mapDetailAllPa = new HashMap<String, DetailPaDto>();
			PmDetailPaDao pmDetailPaDao = new PmDetailPaDao(cfg, cmd, aspUser, user, conn);
			listDetailAllPa = pmDetailPaDao.findAll();
			for (int i = 0; i < listDetailAllPa.size(); i++) {
				dto = listDetailAllPa.get(i);
				mapDetailAllPa.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllPa;
	}
	
	/**
	 * 給与控除部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, DetailPdDto> getMapDetailPd() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		List<DetailPdDto> listDetailAllPd;
		DetailPdDto dto;
		// 明細設定取得
		if (mapDetailAllPd == null) {
			mapDetailAllPd = new HashMap<String, DetailPdDto>();
			PmDetailPdDao pmDetailPdDao = new PmDetailPdDao(cfg, cmd, aspUser, user, conn);
			listDetailAllPd = pmDetailPdDao.findAll();
			for (int i = 0; i < listDetailAllPd.size(); i++) {
				dto = listDetailAllPd.get(i);
				mapDetailAllPd.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllPd;
	}
	
	/**
	 * 給与合計部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, DetailMoneyDto> getMapDetailPs() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		// 明細設定取得
		if (mapDetailAllPs == null) {
			PmDetailPsDao pmDetailPsDao = new PmDetailPsDao(cfg, cmd, aspUser, user, conn);
			List<DetailMoneyDto> listDetailAllPs = pmDetailPsDao.findAll();
			mapDetailAllPs = new HashMap<String, DetailMoneyDto>();
			for (int i = 0; i < listDetailAllPs.size(); i++) {
				DetailMoneyDto dto = listDetailAllPs.get(i);
				mapDetailAllPs.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllPs;
	}
	
	/**
	 * 給与勤怠部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, DetailTimeDto> getMapDetailPt() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		// 明細設定取得
		if (mapDetailAllPt == null) {
			PmDetailPtDao pmDetailPtDao = new PmDetailPtDao(cfg, cmd, aspUser, user, conn);
			List<DetailTimeDto> listDetailAllPt = pmDetailPtDao.findAll();
			mapDetailAllPt = new HashMap<String, DetailTimeDto>();
			for (int i = 0; i < listDetailAllPt.size(); i++) {
				DetailTimeDto dto = listDetailAllPt.get(i);
				mapDetailAllPt.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllPt;
	}
	
	/**
	 * 賞与支払部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, PmDetailBaDto> getMapDetailBa() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		List<PmDetailBaDto> listDetailAllBa;
		// 明細設定取得
		if (mapDetailAllBa == null) {
			mapDetailAllBa = new HashMap<String, PmDetailBaDto>();
			PmDetailBaDao pmDetailBaDao = new PmDetailBaDao(cfg, cmd, aspUser, user, conn);
			listDetailAllBa = pmDetailBaDao.findAll();
			for (int i = 0; i < listDetailAllBa.size(); i++) {
				PmDetailBaDto dto = listDetailAllBa.get(i);
				mapDetailAllBa.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllBa;
	}
	
	/**
	 * 賞与控除部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, PmDetailBdDto> getMapDetailBd() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		List<PmDetailBdDto> listDetailAllBd;
		// 明細設定取得
		if (mapDetailAllBd == null) {
			mapDetailAllBd = new HashMap<String, PmDetailBdDto>();
			PmDetailBdDao pmDetailBdDao = new PmDetailBdDao(cfg, cmd, aspUser, user, conn);
			listDetailAllBd = pmDetailBdDao.findAll();
			for (int i = 0; i < listDetailAllBd.size(); i++) {
				PmDetailBdDto dto = listDetailAllBd.get(i);
				mapDetailAllBd.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllBd;
	}
	
	/**
	 * 賞与合計部の明細設定を取得する。<br>
	 * @return 明細設定
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 */
	protected Map<String, PmDetailBsDto> getMapDetailBs() throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		List<PmDetailBsDto> listDetailAllBs;
		// 明細設定取得
		if (mapDetailAllBs == null) {
			mapDetailAllBs = new HashMap<String, PmDetailBsDto>();
			PmDetailBsDao pmDetailBsDao = new PmDetailBsDao(cfg, cmd, aspUser, user, conn);
			listDetailAllBs = pmDetailBsDao.findAll();
			for (int i = 0; i < listDetailAllBs.size(); i++) {
				PmDetailBsDto dto = listDetailAllBs.get(i);
				mapDetailAllBs.put(dto.getDetailCode(), dto);
			}
		}
		return mapDetailAllBs;
	}
	
	/**
	 * 給与情報、支払基礎日数取得
	 * @param targetKCode
	 * @param targetMonth
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 * @throws MospException 
	 */
	public void calcPayBasicDate(String targetKCode, Date targetMonth) throws SQLException, IllegalAccessException,
			NoSuchFieldException, MospException {
		cdSocInsuranceDto = new CdSocInsuranceDto();
		
		//取得用旧控除年月を未来日に設定
		Calendar tmpCal = Calendar.getInstance();
		tmpCal.set(2099, 12, 31, 0, 0, 0);
		oldHealthDate = oldNursingDate = oldoldPensionDate = oldFundDate = oldSocInsDate = tmpCal.getTime();
		
		oldHealthPremium = 0; // 旧給与健康保険料
		oldNursingPremium = 0; // 旧給与介護保険料
		oldPensionPremium = 0; // 旧給与厚生年金保険料
		oldFundPremium = 0; // 旧給与厚生年金基金保険料
		oldSocInsPremium = 0; // 旧給与社会保険金額
		
		// 対象年月より以前の日付を取得
		int beforeYear4 = 0; //befor 4 month
		int beforeMonth4 = 0;
		int beforeYear3 = 0; //befor 3 month
		int beforeMonth3 = 0;
		int beforeYear2 = 0; //befor 2 month
		int beforeMonth2 = 0;
		int beforeYear1 = 0; //befor 1 month
		int beforeMonth1 = 0;
		
		//６月
		beforeYear1 = MospUtility.getYear(targetMonth);
		beforeMonth1 = MospUtility.getMonth(targetMonth) - 1;
		if (beforeMonth1 == 0) {
			beforeMonth1 = 12;
			beforeYear1 = MospUtility.getYear(targetMonth) - 1;
		}
		//５月
		beforeYear2 = beforeYear1;
		beforeMonth2 = beforeMonth1 - 1;
		if (beforeMonth2 == 0) {
			beforeMonth2 = 12;
			beforeYear2 = beforeYear1 - 1;
		}
		//４月
		beforeYear3 = beforeYear2;
		beforeMonth3 = beforeMonth2 - 1;
		if (beforeMonth3 == 0) {
			beforeMonth3 = 12;
			beforeYear3 = beforeYear2 - 1;
		}
		//３月
		beforeYear4 = beforeYear3;
		beforeMonth4 = beforeMonth3 - 1;
		if (beforeMonth4 == 0) {
			beforeMonth4 = 12;
			beforeYear4 = beforeYear3 - 1;
		}
		
		// 支払基礎日数(月)設定
		cdSocInsuranceDto.setPayBasicMonth1(beforeMonth1);
		cdSocInsuranceDto.setPayBasicMonth2(beforeMonth2);
		cdSocInsuranceDto.setPayBasicMonth3(beforeMonth3);
		
		// 昇（降）給前月給与情報取得
		oldPremium = getMonthlyPaymentData(targetKCode, beforeYear4, beforeMonth4);
		
		// 固定賃金取得
		getBefFixedWage(targetKCode, beforeYear4, beforeMonth4);
		
		int payment1 = getMonthlyPaymentData(targetKCode, beforeYear1, beforeMonth1);
		// 支払基礎日数取得
		int payBasicDate1 = getPaymentBaiscDay(targetKCode, beforeYear1, beforeMonth1);
		// 支払基礎日数取得
		int payment2 = getMonthlyPaymentData(targetKCode, beforeYear2, beforeMonth2);
		// 支払基礎日数取得
		int payBasicDate2 = getPaymentBaiscDay(targetKCode, beforeYear2, beforeMonth2);
		// 支払基礎日数取得
		int payment3 = getMonthlyPaymentData(targetKCode, beforeYear3, beforeMonth3);
		// 支払基礎日数取得
		int payBasicDate3 = getPaymentBaiscDay(targetKCode, beforeYear3, beforeMonth3);
		// 固定賃金取得
		getNowFixedWage(targetKCode, beforeYear3, beforeMonth3);
		
		// 中途入社
		CmMidwayEnterDao cmMidwayEnterDao = new CmMidwayEnterDao();
		cmMidwayEnterDao.initDao(cfg, cmd, aspUser, user, conn);
		CmMidwayEnterDto cmMidwayEnterDto;
		
		// 計算対象社員確認
		cmMidwayEnterDto = cmMidwayEnterDao.findForKey(targetKCode);
		if (cmMidwayEnterDto != null) {
			// 途中入社は対象としない
			if (cmMidwayEnterDto.getMidwayType().equals("1")) {
				if (MospUtility.getYear(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeYear1
						&& MospUtility.getMonth(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeMonth1) {
					payment1 = 0;
					payBasicDate1 = 0;
				}
				if (MospUtility.getYear(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeYear2
						&& MospUtility.getMonth(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeMonth2) {
					payment2 = 0;
					payBasicDate2 = 0;
				}
				if (MospUtility.getYear(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeYear3
						&& MospUtility.getMonth(DateUtil.convIntegerDateToDate(mKihonDto.getNyDate())) == beforeMonth3) {
					payment2 = 0;
					payBasicDate2 = 0;
				}
			}
		}
		
		// 昇降給情報取得
		if (befkotei != nowkotei) {
			// 固定賃金に差額が生じたら
			cdSocInsuranceDto.setRaiseDownSalaryBasis(befkotei - nowkotei);
			Calendar cal1 = Calendar.getInstance();
			cal1.set(beforeYear4, beforeMonth4 - 1, PayrollConst.TIME_DEFAULT_DAY, 0, 0, 0);
			Date payBasicDate4 = cal1.getTime();
			cdSocInsuranceDto.setRaiseDownSalaryDate(payBasicDate4);
		}
		
		cdSocInsuranceDto.setPayAmount1(payment1);
		cdSocInsuranceDto.setPayBasicDay1(payBasicDate1);
		cdSocInsuranceDto.setPayAmount2(payment2);
		cdSocInsuranceDto.setPayBasicDay2(payBasicDate2);
		cdSocInsuranceDto.setPayAmount3(payment3);
		cdSocInsuranceDto.setPayBasicDay3(payBasicDate3);
		
		cdSocInsuranceDto.setRewardTotal1(payment1); // 報酬合計1
		cdSocInsuranceDto.setRewardTotal2(payment2); // 報酬合計2
		cdSocInsuranceDto.setRewardTotal3(payment3); // 報酬合計3
		
		cdSocInsuranceDto.setHealthBefPremium(oldHealthPremium); // 健保従前保険料
		cdSocInsuranceDto.setPensionBefPremium(oldPensionPremium); // 厚年従前保険料
	}
	
	/**
	 * 比較前月固定賃金取得
	 * @param targetKCode 
	 * @param targetYear 
	 * @param targetMonth 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws SQLException 
	 * @throws SQLException
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public void getBefFixedWage(String targetKCode, int targetYear, int targetMonth) throws SQLException,
			IllegalAccessException, NoSuchFieldException {
		Date paymentDate;
		phSocInsPayment = new PhPaymentDto();
		Calendar cal1 = Calendar.getInstance();
		cal1.set(targetYear, targetMonth - 1, PayrollConst.TIME_DEFAULT_DAY, 0, 0, 0);
		paymentDate = cal1.getTime();
		PhPaymentDao phPaymentDao = new PhPaymentDao(cfg, cmd, aspUser, user, conn);
		phSocInsPayment = phPaymentDao.findForKey(targetKCode, paymentDate);
		pdPayAllowanceDao = new PdPayAllowanceDao(cfg, cmd, aspUser, user, conn);
		
		List<DetailMoneyDto> list = pdPayAllowanceDao.find(targetKCode, paymentDate);
		
		for (int i = 0; i < list.size(); i++) {
			befhikotei += list.get(i).getAmount();
		}
	}
	
	/**
	 * 比較当月固定賃金取得
	 * @param targetKCode 
	 * @param targetYear 
	 * @param targetMonth 
	 */
	public void getNowFixedWage(String targetKCode, int targetYear, int targetMonth) {
		// 明細設定テーブルから取得
//		UsDetailDao dao = new UsDetailDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		List<DetailMoneyDto> list = dao.findForEmployeeAll(mKihonDto.getEmploymentType());
//
//	
//		nowkotei   = phSocInsPayment != null ? phSocInsPayment.getBasicSalary() : 0;
//		nowhikotei = phSocInsPayment != null ? phSocInsPayment.getOvertimeAllowance() : 0;
//		for (int i = 0; i < list.size(); i++) {
//			if (list.get(i).getSocInsObjectType().equals(LegalConst.SOC_INS_OBJECT_TAX) &&
//					list.get(i).getDetailCode().equals(PayrollConst.DTL_PAY_ATTENDANCE_13)) {
//				nowhikotei += phSocInsPayment.getAttendance_13();
//				continue;
//			} else if (list.get(i).getSocInsObjectType().equals(LegalConst.SOC_INS_OBJECT_TAX) &&
//					list.get(i).getDetailCode().equals(PayrollConst.DTL_PAY_ATTENDANCE_14)) {
//				nowhikotei += phSocInsPayment.getAttendance_14();
//				continue;
//			}
//		}
		
	}
	
	/**
	 * 報酬月額取得
	 * @param targetKCode 対象社員
	 * @param targetYear 対象年
	 * @param targetMonth 対象月
	 * @return　報酬月額
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 * @throws MospException
	 */
	
	public int getMonthlyPaymentData(String targetKCode, int targetYear, int targetMonth) throws SQLException,
			IllegalAccessException, NoSuchFieldException, MospException {
		Date paymentDate;
		phSocInsPayment = new PhPaymentDto();
		Calendar cal1 = Calendar.getInstance();
		cal1.set(targetYear, targetMonth - 1, PayrollConst.TIME_DEFAULT_DAY, 0, 0, 0);
		paymentDate = cal1.getTime();
		PhPaymentDao phPaymentDao = new PhPaymentDao(cfg, cmd, aspUser, user, conn);
		phSocInsPayment = phPaymentDao.findForKey(targetKCode, paymentDate);
		pdPayAllowanceDao = new PdPayAllowanceDao(cfg, cmd, aspUser, user, conn);
		pdPayDeductionDao = new PdPayDeductionDao(cfg, cmd, aspUser, user, conn);
		DetailMoneyDto pdPayAllowanceDto = pdPayAllowanceDao.findDetailCode(targetKCode, paymentDate,
				PayrollConst.DTL_COMMUTATION);
		
		int commutation = 0; // 通勤手当
		if (null != pdPayAllowanceDto) {
			commutation = pdPayAllowanceDto.getAmount();
		}
		
		int payment = 0;
		if (phSocInsPayment != null) {
			// 総支給額 - 通勤費
			payment = phSocInsPayment.getAllowanceTotal() - commutation;
		} else {
			// 給与情報取得エラー
			String errMessage = MospUtility.getMessage(msg, "WU1121", targetYear + "," + targetMonth);
			addErrMessage(errMessage);
			throw new MospException(MospConst.EX_PARAMS_INVALID);
			
		}
		
		//旧給与健康保険料
		DetailMoneyDto detailDeductionDto = pdPayDeductionDao.findDetailCode(targetKCode, paymentDate,
				PayrollConst.DTL_HEALTH_INS);
		if (null != detailDeductionDto) {
			if (paymentDate.before(oldHealthDate)) {
				oldHealthDate = paymentDate;
				oldHealthPremium = detailDeductionDto.getAmount();
			}
		}
		
		//旧給与介護保険料
		detailDeductionDto = pdPayDeductionDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_NURSING_INS);
		if (null != detailDeductionDto) {
			if (paymentDate.before(oldNursingDate)) {
				oldNursingDate = paymentDate;
				oldNursingPremium = detailDeductionDto.getAmount();
			}
		}
		
		//旧給与厚生年金保険料
		detailDeductionDto = pdPayDeductionDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PENSION_INS);
		if (null != detailDeductionDto) {
			if (paymentDate.before(oldoldPensionDate)) {
				oldoldPensionDate = paymentDate;
				oldPensionPremium = detailDeductionDto.getAmount();
			}
		}
		
		//旧給与厚生年金基金保険料
		detailDeductionDto = pdPayDeductionDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PENSION_FUND);
		if (null != detailDeductionDto) {
			if (paymentDate.before(oldFundDate)) {
				oldFundDate = paymentDate;
				oldFundPremium = detailDeductionDto.getAmount();
			}
		}
		
		//旧給与社会保険金額
		detailDeductionDto = pdPayDeductionDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PENSION_FUND);
		if (null != detailDeductionDto) {
			if (paymentDate.before(oldSocInsDate)) {
				oldSocInsDate = paymentDate;
				oldSocInsPremium = detailDeductionDto.getAmount();
			}
		}
		return payment;
	}
	
	/**
	 * 支払基礎日数取得
	 * @param targetKCode 
	 * @param year 
	 * @param month 
	 * @return
	 * @throws IllegalAccessException 
	 * @throws NoSuchFieldException 
	 * @throws SQLException 
	 */
	public int getPaymentBaiscDay(String targetKCode, int year, int month) throws SQLException, NoSuchFieldException,
			IllegalAccessException {
		int payBasicDate;
		DetailTimeDto detailTimeDto;
		Date paymentDate;
		Calendar cal1 = Calendar.getInstance();
		cal1.set(year, month, PayrollConst.TIME_DEFAULT_DAY, 0, 0, 0);
		paymentDate = cal1.getTime();
		PdPayTimeDao pdPayTimeDao = new PdPayTimeDao(cfg, cmd, aspUser, user, conn);
		
		//月給者は基礎日数
		if (mKihonDto.getKyKubun().equals(PayrollConst.PAYMENT_MONTH)) {
			detailTimeDto = pdPayTimeDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PAY_TIME_12); // 欠勤日数取得
			float tmpKekkin = 0;
			if (null != detailTimeDto) {
				tmpKekkin = detailTimeDto.getAmount();
			}
			payBasicDate = calPayBasicDate(year, month); //支払基礎日数
			//日給月給は基礎日数−欠勤日数
			payBasicDate -= tmpKekkin;
		} else if (mKihonDto.getKyKubun().equals(PayrollConst.PAYMENT_HOUR)) {
			detailTimeDto = pdPayTimeDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PAY_TIME_01); // 出勤日数取得
			//時給者は出勤日数になる
			payBasicDate = 0;
			if (null != detailTimeDto) {
				payBasicDate = (int)detailTimeDto.getAmount();
			}
		} else {
			detailTimeDto = pdPayTimeDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PAY_TIME_12); // 欠勤日数取得
			int tmpKekkin = 0;
			if (null != detailTimeDto) {
				tmpKekkin = (int)detailTimeDto.getAmount();
			}
			payBasicDate = calPayBasicDate(year, month); //支払基礎日数
			//日給月給は基礎日数−欠勤日数
			payBasicDate -= tmpKekkin;
			
			detailTimeDto = pdPayTimeDao.findDetailCode(targetKCode, paymentDate, PayrollConst.DTL_PAY_TIME_09); // 有休日数取得
			int tmpYukyu = 0;
			if (null != detailTimeDto) {
				tmpYukyu = (int)detailTimeDto.getAmount();
			}
			//日給者は出勤日数＋有給休暇になる
			payBasicDate += tmpYukyu;
		}
		return payBasicDate;
	}
	
	/**
	 * 支払基礎日数取得
	 * @param yy 対象年
	 * @param mm 対象月
	 * @param dd 対象日
	 * @return
	 */
	public int calPayBasicDate(int year, int month) {
		//支払基礎日数
		int retInt = 0;
		Date date = getLastDateOfMonth(String.valueOf(year), String.valueOf(month));
		// 暦の最終日を取得
		retInt = MospUtility.getDay(date);
		return retInt;
	}
	
	/**
	 * 標準報酬月額取得
	 * @param targetKCode 対象社員
	 * @param targetMonth 対象年月
	 * @throws SQLException　
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException 
	 */
	public void getStandardPayment(String targetKCode, Date targetMonth) throws SQLException, IllegalAccessException,
			NoSuchFieldException {
		// 標準報酬月額を取得する
		int wdiv = 0;
		int whosyu = 0;
		int wHealthPayment = 0; //健康保険標準報酬月額
		int sPensionPayment = 0; //厚生年金標準報酬月額
		if (mKihonDto.getPtKubun().equals("1")) { //正社員
			if (cdSocInsuranceDto.getPayBasicDay1() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount1() + cdSocInsuranceDto.getGoodsAmount1());
			}
			if (cdSocInsuranceDto.getPayBasicDay2() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount2() + cdSocInsuranceDto.getGoodsAmount2());
			}
			if (cdSocInsuranceDto.getPayBasicDay3() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount3() + cdSocInsuranceDto.getGoodsAmount3());
			}
			// 全てが17日未満。
			if (cdSocInsuranceDto.getPayBasicDay1() < 17 && cdSocInsuranceDto.getPayBasicDay2() < 17
					&& cdSocInsuranceDto.getPayBasicDay3() < 17) {
				if (cdSocInsuranceDto.getPayBasicDay1() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount1() + cdSocInsuranceDto.getGoodsAmount1());
				}
				if (cdSocInsuranceDto.getPayBasicDay1() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount2() + cdSocInsuranceDto.getGoodsAmount2());
				}
				if (cdSocInsuranceDto.getPayBasicDay3() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount3() + cdSocInsuranceDto.getGoodsAmount3());
				}
			}
		} else { //パート
			//正社員と同じ値を仮設定
			if (cdSocInsuranceDto.getPayBasicDay1() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount1() + cdSocInsuranceDto.getGoodsAmount1());
			}
			if (cdSocInsuranceDto.getPayBasicDay2() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount2() + cdSocInsuranceDto.getGoodsAmount2());
			}
			if (cdSocInsuranceDto.getPayBasicDay3() >= 17) {
				wdiv += 1;
				whosyu += (cdSocInsuranceDto.getPayAmount3() + cdSocInsuranceDto.getGoodsAmount3());
			}
			// 全てが17日未満。
			if (cdSocInsuranceDto.getPayBasicDay1() < 17 && cdSocInsuranceDto.getPayBasicDay2() < 17
					&& cdSocInsuranceDto.getPayBasicDay3() < 17) {
				if (cdSocInsuranceDto.getPayBasicDay1() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount1() + cdSocInsuranceDto.getGoodsAmount1());
				}
				if (cdSocInsuranceDto.getPayBasicDay1() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount2() + cdSocInsuranceDto.getGoodsAmount2());
				}
				if (cdSocInsuranceDto.getPayBasicDay3() >= 15) {
					wdiv += 1;
					whosyu += (cdSocInsuranceDto.getPayAmount3() + cdSocInsuranceDto.getGoodsAmount3());
				}
			}
		}
		
		int average;
		if (wdiv > 0) {
			average = whosyu / wdiv;
		} else {
			average = 0;
		}
		cdSocInsuranceDto.setAverageThreeMonths(average);
		cdSocInsuranceDto.setRewardTotalSum(whosyu);
		
		// 旧標準報酬月額取得
		CmSocInsuranceDao cmSocInsuranceDao = new CmSocInsuranceDao();
		cmSocInsuranceDao.initDao(cfg, cmd, aspUser, user, conn);
		CmSocInsuranceDto cmSocInsuranceDto = cmSocInsuranceDao.findForEmployee(targetKCode);
		if (null != cmSocInsuranceDto) {
			wHealthPayment = cmSocInsuranceDto.getHealthPayment() * 1000; //健康保険標準報酬月額
			sPensionPayment = cmSocInsuranceDto.getPensionPayment() * 1000; //厚生年金標準報酬月額
		}
		
		//旧健保の等級、標準月額報酬取得
		for (int i = 0; i < aryStandardPayment.length; i++) {
			if (wHealthPayment < aryPaymentUnder[i]) {
				cdSocInsuranceDto.setHealthBefGrade(arySocInsGrade[i]);
				cdSocInsuranceDto.setHealthBefPremium(aryStandardPayment[i]);
				break;
			}
		}
		
		//旧厚年の等級、標準月額報酬取得
		for (int i = 0; i < aryStandardPayment.length; i++) {
			if (sPensionPayment < aryPaymentUnder[i]) {
				if (arySocInsGrade[i] - 4 < 0) {
					cdSocInsuranceDto.setPensionBefGrade(arySocInsGrade[i]);
				} else {
					cdSocInsuranceDto.setPensionBefGrade(arySocInsGrade[i] - 4);
				}
				cdSocInsuranceDto.setPensionBefPremium(aryStandardPayment[i]);
				break;
			}
		}
		
		// 新等級、標準報酬月額取得
		for (int i = 0; i < aryPaymentOver.length; i++) {
			if (average < aryPaymentUnder[i]) {
				cdSocInsuranceDto.setHealthDecGrade(arySocInsGrade[i]);
				cdSocInsuranceDto.setHealthDecPremium(aryStandardPayment[i]);
				if (arySocInsGrade[i] - 4 < 0) {
					cdSocInsuranceDto.setPensionDecGrade(arySocInsGrade[i]);
				} else {
					cdSocInsuranceDto.setPensionDecGrade(arySocInsGrade[i] - 4);
				}
				cdSocInsuranceDto.setPensionDecPremium(aryStandardPayment[i]);
				break;
			}
		}
	}
	
	/**
	 * @param targetKCode
	 * @param year
	 * @return
	 * @throws SQLException
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 * @throws MospException
	 */
	public boolean checkBonusCount(String targetKCode, String year) throws SQLException, IllegalAccessException,
			NoSuchFieldException, MospException {
		// 年開始日取得
		startDateOfYear = getStartDateOfYear(Integer.parseInt(year));
		// 年最終日取得
		lastDateOfYear = getLastDateOfYear(Integer.parseInt(year));
		// 社員コード取得
		kCode = targetKCode;
		
		// DAO準備
		PhBounsDao dao = new PhBounsDao(cfg, cmd, aspUser, user, conn);
		// 対象年の賞与データを取得
		List<PhBounsDto> list = dao.findForPaydayOfYear(kCode, startDateOfYear, lastDateOfYear);
		
		// 対象年のデータが4回以上なら賞与登録にはならない
		if (PayrollConst.UPPER_BONUS_REGIST <= list.size()) {
			// データ作成対象外の場合はエラー
			String errMessage = MospUtility.getMessage(msg, PayrollConst.MSG_EXC_REG_BONUS, year
					+ PayrollConst.KEY_SEPARATOR + kCode);
			addErrMessage(errMessage);
			return false;
		}
		return true;
	}
	
	/**
	 * 年開始日取得
	 * @param year 年
	 * @return 年最終日
	 */
	protected Date getStartDateOfYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 年最終日取得
	 * @param year 年
	 * @return 年最終日
	 */
	protected Date getLastDateOfYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year + 1);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 月初日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月初日
	 */
	protected Date getFirstDateOfMonth(String year, String month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(year));
		cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月操作
	 * @param date   操作日付
	 * @param amount 増減月数
	 * @return 操作後日付
	 */
	protected Date addMonth(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.MONTH, amount);
		return cal.getTime();
	}
	
	/**
	 * 年月取得
	 * @param year  年
	 * @param month 月
	 * @return 年月
	 */
	protected Date getYearMonth(String year, String month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Integer.parseInt(year), Integer.parseInt(month) - 1, 1, 0, 0, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 和暦取得
	 * @param list 和暦情報リスト
	 * @param date 日付
	 * @return 日付配列
	 * @throws MospException 
	 */
	public String[] getJpImperialCal(List<MosPConfDto> list, Date date) throws MospException {
		String[] aryJpDate = new String[4];
		if (date == null) {
			return aryJpDate;
		}
		for (MosPConfDto dto : list) {
			Date startDate = getDate(dto.getConfCode());
			Date endDate = getDate(dto.getConfValue());
			if (startDate.compareTo(date) <= 0 && endDate.compareTo(date) >= 0) {
				int year = MospUtility.getYear(date) - MospUtility.getYear(startDate) + 1;
				aryJpDate[0] = dto.getConfId();
				aryJpDate[1] = String.valueOf(year);
				aryJpDate[2] = String.valueOf(MospUtility.getMonth(date));
				aryJpDate[3] = String.valueOf(MospUtility.getDay(date));
				return aryJpDate;
			}
		}
		throw new MospException(MospConst.EX_DATE_INVALID);
	}
	
	/**
	 * 日付取得(/無し文字列用)
	 * @param strDate 日付文字列
	 * @return 日付
	 * @throws MospException 
	 */
	public Date getDate(String strDate) throws MospException {
		if (strDate == null || strDate.length() != 8) {
			throw new MospException(MospConst.EX_DATE_INVALID);
		}
		return MospUtility.getDate(strDate.substring(0, 4) + PayrollConst.SEPARATOR_DATE + strDate.substring(4, 6)
				+ PayrollConst.SEPARATOR_DATE + strDate.substring(6, 8));
	}
	
	/**
	 * システム日付取得
	 * @return システム日付
	 */
	@Override
	protected Date getSystemDate() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月最終日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月最終日
	 */
	protected Date getLastDateOfMonth(String year, String month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(year));
		cal.set(Calendar.MONTH, Integer.parseInt(month));
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 名称取得
	 * @param code  取得対象コード
	 * @return コード名称
	 */
	@Override
	protected String getCodeName(String code, String[][] array) {
		String codeName = code;
		if (array == null) {
			return codeName;
		}
		for (String[] element : array) {
			if (code.equals(element[0])) {
				codeName = element[1];
				break;
			}
		}
		return codeName;
	}
	
	/**
	 * 年齢取得
	 * @param birthDay
	 * @param targetDay
	 * @return 年齢
	 */
	protected int getAge(Date birthDay, Date targetDay) {
		// 取得準備
		int age = 0;
		// 年齢取得
		age = MospUtility.getYear(targetDay) - MospUtility.getYear(birthDay);
		// 対象年月が誕生年よりなら0
		if (age < 0) {
			age = 0;
			return age;
		}
		// 対象月が誕生月以降
		if (MospUtility.getMonth(targetDay) - MospUtility.getMonth(birthDay) > 0) {
			return age;
		} else if (MospUtility.getMonth(targetDay) - MospUtility.getMonth(birthDay) == 0) {
			// 対象日が誕生日以降
			if (MospUtility.getDay(targetDay) - MospUtility.getDay(birthDay) > 0) {
				return age;
			} else if (MospUtility.getDay(targetDay) - MospUtility.getDay(birthDay) == 0) {
				// 対象日が誕生日
				return age;
			} else {
				// 対象日が誕生日以前
				return age - 1;
			}
		} else {
			// 対象月が誕生月以前
			return age - 1;
		}
	}
	
	/**
	 * 健康保険等級を取得
	 * @param intIn 取得対象の報酬金額
	 * @return 等級
	 */
	public int getHealthDecGrade(int intIn) {
		int rtnNum = 0;
		// 新等級、標準報酬月額取得
		for (int i = 0; i < aryPaymentOver.length; i++) {
			if (intIn < aryPaymentUnder[i]) {
				rtnNum = arySocInsGrade[i];
				break;
			}
		}
		return rtnNum;
	}
	
	/**
	 * 厚生年金等級を取得
	 * @param intIn 取得対象の報酬金額
	 * @return 等級
	 */
	public int getPensionDecGrade(int intIn) {
		int rtnNum = 0;
		// 新等級、標準報酬月額取得
		for (int i = 0; i < aryPaymentOver.length; i++) {
			if (intIn < aryPaymentUnder[i]) {
				if (arySocInsGrade[i] - 4 < 0) {
					rtnNum = arySocInsGrade[i];
				} else {
					rtnNum = arySocInsGrade[i] - 4;
				}
				break;
			}
		}
		return rtnNum;
		
	}
	
	/**
	 * 健康保険標準報酬額を取得
	 * @param intIn 取得対象の報酬金額
	 * @return 等級
	 */
	public int getHealthDecPremium(int intIn) {
		int rtnNum = 0;
		// 新等級、標準報酬月額取得
		for (int i = 0; i < aryPaymentOver.length; i++) {
			if (intIn < aryPaymentUnder[i]) {
				rtnNum = aryStandardPayment[i];
				break;
				
			}
		}
		return rtnNum;
	}
	
	/**
	 * 厚生年金標準報酬額を取得
	 * @param intIn 取得対象の報酬金額
	 * @return 等級
	 */
	public int getPensionDecPremium(int intIn) {
		int rtnNum = 0;
		// 新等級、標準報酬月額取得
		for (int i = 0; i < aryPaymentOver.length; i++) {
			if (intIn < aryPaymentUnder[i]) {
				rtnNum = aryStandardPayment[i];
				break;
			}
		}
		return rtnNum;
	}
	
	/**
	 * 件名検索
	 * @param prefecture 住所コード
	 * @return 件名
	 */
	public static String getPrefecture(int prefecture) {
		// 件名分回す
		for (String[] element : aryPrefecture) {
			if (element[0].equals(String.valueOf(prefecture))) {
				return element[1];
			}
		}
		// 一番若いコードを返す
		return aryPrefecture[0][1];
	}
}
