package jp.mosp.payroll.base;

import java.math.BigDecimal;
import java.util.Date;

import jp.mosp.common.common.MospUtility;
import jp.mosp.human.dto.MKihonDto;
import jp.mosp.payroll.dto.CmSocInsuranceDto;

public abstract class AttendanceTotalAction extends PayrollAction {
	
	// フィールド
	protected String kCode          ;
	protected int    year           ;
	protected int    month          ;
	protected Date   targetMonth    ;
	protected Date   startDate      ;
	protected Date   endDate        ;
//	protected Date   lateNightStart  = null;
//	protected Date   lateNightEnd    = null;
//	protected float  hoursPerDay     = 0F  ;
//	protected int    prescribedDays  = 0   ;
//	protected int    prescribedHours = 0   ;
//	protected int    missingLimit    = 0   ;
//	protected int    missingAmount   = 0   ;
//	protected int    holidayNotLegal = 0   ;

	protected MKihonDto mKihonDto;	
//	protected UhIndividualDto uhIndividualDto;
	protected CmSocInsuranceDto cmSocInsuranceDto;
	
//	protected AttendanceMonthlyDto attendanceMonthlyDto;
//	protected List<UtAttendanceDto>    attendanceList ;
//	protected List<KintaiCompileDto> listKintaiCompileDto;
//	protected List<AttendanceMonthlyDto> attendanceMonthly;
//	protected Map<String, AttendanceMonthlyDto> mapAttendanceMonthly;
	
	// 対象者リスト
//	protected String[] aryKCode;
//	protected String[] aryFlesh;
//	protected String[] aryRetire;
	
	// リスト
//	protected Map<String, UmAttendanceTypeDto> attendanceTypeMap;
//	protected Map<String, UmWorkTypeDto      > workTypeMap      ;
//	protected Map<String, UmStationDto       > stationMap       ;
//	protected Map<String, UmTrainingDto      > trainingMap      ;
//	protected String[][] aryTimeType      ;
//	protected String[][] aryTraining      ;
//	protected String[][] aryBusiness      ;
	protected String[][] aryPosition      ;
//	protected String[][] aryEmploymentType;
	
	// 日集計データ
//	protected String[][] aryAttendance;
	
	/**
	 * 勤怠データ取得
	 * @param kCode       対象社員コード
	 * @param targetMonth 対象月
	 * @throws Exception
	 */
//	protected void getAttendanceList(String kCode, Date targetMonth) throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// パラメータ設定
//		this.kCode = kCode;
//		setTargetMonth(targetMonth);
//		// 人事情報取得(対象集計月最終日で履歴を検索)
//		mKihonDto      = getBasisHistory     (kCode, endDate);
//		uhIndividualDto = getIndividualHistory(kCode, endDate);
//		// 検索
//		UtAttendanceDao utAttendanceDao = new UtAttendanceDao();
//		utAttendanceDao.initDao(cfg, cmd, aspUser, user, conn);
//		attendanceList    = utAttendanceDao.findForCondition(kCode, startDate, endDate);
//		listKintaiCompileDto   = null;
//	}
	
//	/**
//	 * 勤怠データ取得(支援考慮)
//	 * @param kCode       対象社員コード
//	 * @param stationCode 対象所属コード
//	 * @param targetMonth 対象月
//	 * @throws Exception
//	 */
//	protected void getAttendanceListForReport(String kCode, String stationCode, Date targetMonth) throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// パラメータ設定
//		this.kCode       = kCode;
//		setTargetMonth(targetMonth);
//		// 人事情報取得(対象集計月最終日で履歴を検索)
//		mKihonDto      = getBasisHistory     (kCode, endDate);
//		uhIndividualDto = getIndividualHistory(kCode, endDate);
//		// 検索
//		UtAttendanceDao utAttendanceDao = new UtAttendanceDao();
//		utAttendanceDao.initDao(cfg, cmd, aspUser, user, conn);
//		attendanceList    = utAttendanceDao.findForCondition(kCode, startDate, endDate);
//		listKintaiCompileDto   = null;
//		// 支援情報取得準備
//		UtSupportDao utSupportDao = new UtSupportDao();
//		utSupportDao.initDao(cfg, cmd, aspUser, user, conn);
//		List<UtSupportDto> supportList = null;
//		List<Date> supportDateList = null;
//		// 所属営業所確認
//		if (getBelonged(mKihonDto.getStationCode()).equals(stationCode)) {
//			// 支援期間取得(対象所属コードの営業所以外に支援)
//			supportList = utSupportDao.findForTermDuplicate(kCode, startDate, endDate);
//			// 支援日リスト作成
//			supportDateList = getDateList(supportList);
//			// 支援期間除去
//			Iterator<Date> itDate = supportDateList.iterator();
//			while (itDate.hasNext()) {
//				Date supportDate = itDate.next();
//				for (int i = attendanceList.size() - 1; i >= 0; i--) {
//					UtAttendanceDto utAttendanceDto = attendanceList.get(i);
//					if (supportDate.compareTo(utAttendanceDto.getAttendanceDate()) == 0) {
//						attendanceList.remove(i);
//						break;
//					}
//				}
//			}
//		} else {
//			// 支援期間取得(対象所属コードの営業所に支援)
//			supportList = utSupportDao.findForStation(kCode, stationCode, startDate, endDate);
//			// 支援日リスト作成
//			supportDateList = getDateList(supportList);
//			// 支援期間外除去
//			ArrayList<UtAttendanceDto> abstractList = new ArrayList<UtAttendanceDto>();
//			Iterator<Date> itDate = supportDateList.iterator();
//			while (itDate.hasNext()) {
//				Date supportDate = itDate.next();
//				for (int i = 0; i < attendanceList.size(); i++) {
//					UtAttendanceDto utAttendanceDto = attendanceList.get(i);
//					if (supportDate.compareTo(utAttendanceDto.getAttendanceDate()) == 0) {
//						abstractList.add(utAttendanceDto);
//						break;
//					}
//				}
//			}
//			attendanceList = abstractList;
//		}
//	}
//	
//	/**
//	 * 支援日リスト作成
//	 * @param supportList 支援リスト
//	 */
//	private List<Date> getDateList(List<UtSupportDto> supportList) {
//		ArrayList<Date> supportDateList = new ArrayList<Date>();
//		Iterator<UtSupportDto> it = supportList.iterator();
//		while (it.hasNext()) {
//			UtSupportDto utSupportDto = it.next();
//			Date supportDate = utSupportDto.getStartDate();
//			Date supportEnd  = utSupportDto.getEndDate();
//			while (supportEnd.compareTo(supportDate) >= 0) {
//				supportDateList.add(supportDate);
//				supportDate = addDay(supportDate, 1);
//			}
//		}
//		return supportDateList;
//	}
//	
//	/**
//	 * 日集計データ取得
//	 */
//	protected void getlistKintaiCompileDto() {
//		listKintaiCompileDto = new ArrayList<KintaiCompileDto>();
//		Iterator<UtAttendanceDto> it = attendanceList.iterator();
//		while (it.hasNext()) {
//			// 勤怠データ取得
//			KintaiCompileDto dto = new KintaiCompileDto(it.next());
//			// 日集計データ設定
//			listKintaiCompileDto.add(dto);
//		}
//	}
//	
//	/**
//	 * 日集計データ名称設定
//	 * @throws Exception 
//	 */
//	protected void setDailyNames() throws Exception {
//		// マスタ取得
//		setAttendanceTypeMap();
//		setWorkTypeMap();
//		if (aryTimeType == null) {
//			aryTimeType = getTimeTypeArray();
//		}
//		if (aryTraining == null) {
//			aryTraining = getTrainingArrayAll();
//		}
//		// 日集計データ取得
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		while (it.hasNext()) {
//			// 勤怠データ取得
//			KintaiCompileDto dto = it.next();
//			// 勤怠名設定
//			UmAttendanceTypeDto umAttendanceTypeDto = attendanceTypeMap.get(dto.getAttendanceType());
//			dto.setAttendanceName(umAttendanceTypeDto == null ? dto.getAttendanceType() : umAttendanceTypeDto.getAttendanceName());
//			// 形態名設定
//			UmWorkTypeDto umWorkTypeDto = workTypeMap.get(dto.getWorkType());
//			dto.setWorkName(umWorkTypeDto == null ? dto.getWorkType() : umWorkTypeDto.getWorkName());
//			// 職務名設定
//			if (dto.getTimeType() != null && !dto.getTimeType().equals("")) {
//				dto.setTimeName(getCodeName(dto.getTimeType(), aryTimeType));
//			}
//			// 同乗先社員名
//			if (dto.getTrained() != null && !dto.getTrained().equals("")) {
//				UmBasisDto umBasisDto = getBasisInfo(dto.getTrained());
//				dto.setTrainedName(umBasisDto == null ? dto.getTrained() : umBasisDto.getKName());
//			}
//			// 同乗者1社員名
//			if (dto.getFellow1() != null && !dto.getFellow1().equals("")) {
//				UmBasisDto umBasisDto = getBasisInfo(dto.getFellow1());
//				dto.setFellow1Name(umBasisDto == null ? dto.getFellow1() : umBasisDto.getKName());
//			}
//			// 同乗者2社員名
//			if (dto.getFellow2() != null && !dto.getFellow2().equals("")) {
//				UmBasisDto umBasisDto = getBasisInfo(dto.getFellow2());
//				dto.setFellow2Name(umBasisDto == null ? dto.getFellow2() : umBasisDto.getKName());
//			}
//			// 研修名設定
//			if (dto.getTraining() != null && !dto.getTraining().equals("")) {
//				dto.setTrainingName(getCodeName(dto.getTraining(), aryTraining));
//			}
//		}
//	}
//	
//	/**
//	 * 日集計データ成果時間設定
//	 * @throws Exception 
//	 */
//	protected void setEffort() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// マスタ取得
//		setAttendanceTypeMap();
//		setTrainingMap();
//		// 成果率取得
//		float effortRatio = getEffortRatio();
//		// 日集計データ取得
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		while (it.hasNext()) {
//			KintaiCompileDto dto = it.next();
//			// 集計区分取得
//			UmAttendanceTypeDto umAttendanceTypeDto = attendanceTypeMap.get(dto.getAttendanceType());
//			if (umAttendanceTypeDto == null) {
//				dto.setEffort(0);
//				continue;
//			}
//			String totalType = umAttendanceTypeDto.getTotalType();
//			// 成果フラグ取得
//			UmTrainingDto umTrainingDto = trainingMap.get(dto.getTraining());
//			int effortFlag = UnicConst.EFFORT_FLAG_ON;
//			if (umTrainingDto != null) {
//				effortFlag = umTrainingDto.getEffortFlag();
//			}
//			// 成果時間設定
//			if (totalType != null && totalType.equals(UnicConst.TOTAL_PRESENCE) && effortFlag == UnicConst.EFFORT_FLAG_ON) {
//				if (dto.getSuspensionFlag() == UnicConst.CHECKBOX_ON) {
//					// 免停時成果半分
//					dto.setEffort(effortRatio / 2);
//				} else {
//					dto.setEffort(effortRatio);
//				}
//			} else {
//				dto.setEffort(0);
//			}
//		}
//	}
//	
//	/**
//	 * 日集計データ時間設定
//	 * @throws Exception 
//	 */
//	protected void setHours() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 労働時間設定
//		setHoursPerDay();
//		// 日集計データ取得
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		while (it.hasNext()) {
//			KintaiCompileDto dto = it.next();
//			// 勤怠マスタ参照
//			String totalType = attendanceTypeMap.get(dto.getAttendanceType()).getTotalType();
//			// 時間設定
//			if (totalType.equals(UnicConst.TOTAL_PRESENCE)) {
//				// 稼動時間
//				float workingHours = getInterval(dto.getStartTime(), dto.getQuitTime(), dto.getIntervalTime());
//				dto.setWorkingHours(workingHours);
//				// 時給時間
//				//float paymentHours = getInterval(dto.getStartTime(), dto.getQuitTime(), 0);
//				float paymentHours = getInterval(dto.getStartTime(), dto.getQuitTime(), dto.getIntervalTime());
//				dto.setPaymentHours(paymentHours);
//				// 残業時間
//				float overTime = workingHours - hoursPerDay;
//				dto.setOvertime(overTime > 0 ? overTime : 0);
//				// 深夜時間
//				calcLateNightTime(dto);
//			} else {
//				dto.setWorkingHours(0);
//				dto.setPaymentHours(0);
//				dto.setOvertime(0);
//				dto.setLateNight(0);
//			}
//		}
//	}
//	
//	/**
//	 * 日集計データ日付手当設定
//	 * @throws Exception 
//	 */
//	protected void setDateAllowance() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 日付手当取得
//		UtDateAllowanceDao dao = new UtDateAllowanceDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		List<UtDateAllowanceDto> list = dao.findForCondition(getBelonged(mKihonDto.getStationCode()), mKihonDto.getPositionCode(), startDate, endDate);
//		// 日集計データ取得
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		while (it.hasNext()) {
//			KintaiCompileDto dto = it.next();
//			// 勤怠マスタ参照
//			String totalType = attendanceTypeMap.get(dto.getAttendanceType()).getTotalType();
//			// 日付手当設定
//			int dateAlloeance = 0;
//			if (totalType.equals(UnicConst.TOTAL_PRESENCE)) {
//				Iterator<UtDateAllowanceDto> itDateAllowance = list.iterator();
//				while (itDateAllowance.hasNext()) {
//					UtDateAllowanceDto utDateAllowanceDto = itDateAllowance.next();
//					if (dto.getAttendanceDate().compareTo(utDateAllowanceDto.getAllowanceDate()) == 0) {
//						dateAlloeance = utDateAllowanceDto.getAllowanceAmount();
//						break;
//					}
//				}
//			}
//			dto.setDateAllowance(dateAlloeance);
//		}
//	}
//	
//	/**
//	 * 月集計(名称設定)
//	 * @return 月集計データ(AttendanceMonthlyDto)
//	 * @throws Exception 
//	 */
//	protected AttendanceMonthlyDto setMonthlyNames() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// マスタ取得
//		if (stationMap == null) {
//			stationMap = getStationMap();
//		}
//		if (aryBusiness == null) {
//			aryBusiness = getCodeArray(UnicConst.TID_BUSINESS_TYPE);
//		}
//		if (aryPosition == null) {
//			aryPosition = getPositionArrayAll();
//		}
//		if (aryEmploymentType == null) {
//			aryEmploymentType = getEmploymentTypeArrayAll();
//		}
//		
//		// 月集計データ作成
//		AttendanceMonthlyDto dto = new AttendanceMonthlyDto();
//		dto.setKCode(kCode);
//		dto.setCalcDate(targetMonth);
//		dto.setKName(mKihonDto.getKName());
//		dto.setStationCode(mKihonDto.getStationCode());
//		dto.setStationName(stationMap.get(getBelonged(mKihonDto.getStationCode())).getStationName());
//		dto.setStationBusinessType(stationMap.get(dto.getStationCode()).getBusinessType());
//		dto.setBusinessType(uhIndividualDto.getBusinessType());
//		dto.setBusinessName(getCodeName(uhIndividualDto.getBusinessType(), aryBusiness));
//		dto.setPositionCode(mKihonDto.getPositionCode());
//		dto.setPositionName(getCodeName(mKihonDto.getPositionCode(), aryPosition));
//		dto.setEmploymentType(mKihonDto.getEmploymentType());
//		dto.setEmploymentName(getCodeName(mKihonDto.getEmploymentType(), aryEmploymentType));
//		return dto;
//	}
//
//	/**
//	 * 月集計
//	 * @return 月集計データ(AttendanceMonthlyDto)
//	 * @throws Exception 
//	 */
//	protected AttendanceMonthlyDto totallistKintaiCompileDto() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// マスタ取得
//		setAttendanceTypeMap();
//		setWorkTypeMap();
//		setPrescribedCalendar();
//		setMissingValue();
//		// 変数宣言
//		int   presenceAtt          = 0 ;	// 出勤日数(AttendanceTypeで判断)
//		int   paidHolidayAtt       = 0 ;	// 有給休暇日数(AttendanceTypeで判断)
//		int   marriage             = 0 ;	// 結婚休暇日数
//		int   maternity            = 0 ;	// 出産立会休暇日数
//		int   maternityTerm        = 0 ;	// 産前産後休暇日数
//		int   family               = 0 ;	// 忌引休暇日数
//		int   workmens             = 0 ;	// 労災休暇日数
//		int   sick                 = 0 ;	// 傷病休暇日数
//		int   childCare            = 0 ;	// 育児休暇日数
//		int   other                = 0 ;	// その他
//		int   legal                = 0 ;	// 公休日数
//		int   withoutNotice        = 0 ;	// 無断欠勤日数
//		int   noticeAbsence        = 0 ;	// 有断欠勤日数
//		int   leaveEraly           = 0 ;	// 早退回数
//		int   working              = 0 ;	// 稼働日数
//		int   workingHours         = 0 ;	// 稼働時間
//		float effort               = 0F;	// 成果時間
//		float overtime             = 0F;	// 残業時間
//		int   presence             = 0 ;	// 通常出勤日数
//		int   workOnHoliday        = 0 ;	// 休日出勤日数
//		int   institutionalAbsence = 0 ;	// 制度欠勤日数
//		int   otherAttendance      = 0 ;	// その他勤怠日数
//		
//		int   particularHoliday    = 0 ;	// 特別休暇日数
//		int   paidHoliday          = 0 ;	// 有給休暇日数
//		int   absence              = 0 ;	// 欠勤日数
//		float paymentHours         = 0 ;	// 時給時間
//		int   arriveLate           = 0 ;	// 遅刻回数
//		float lateNight            = 0 ;	// 深夜時間
//		float overLate             = 0 ;	// 深夜残業時間
//		float holidayTime          = 0 ;	// 休日時間
//		int   dateAllowance        = 0 ;	// 日付手当
//		int   cutForMissing        = 0 ;	// 皆勤減額
//		int   cutForShort          = 0 ;	// 役職減額経験
//		int   cutFromBasic         = 0 ;	// 減額金
//		
//		float holidayHoursNotLegal = 0F;	// 法定外休日時間
//		
//		// 日集計データ取得
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		// 集計開始
//		while (it.hasNext()) {
//			KintaiCompileDto dailyDto = it.next();
//			// 勤怠区分取得
//			String attendanceType = dailyDto.getAttendanceType();
//			// 集計区分取得
//			UmAttendanceTypeDto umAttendanceTypeDto = attendanceTypeMap.get(attendanceType);
//			String totalType = umAttendanceTypeDto.getTotalType();
//			// 稼動フラグ取得
//			int workFlag = UnicConst.WORK_FLAG_OFF;
//			UmWorkTypeDto umWorkTypeDto = workTypeMap.get(dailyDto.getWorkType());
//			if (umWorkTypeDto != null) {
//				workFlag = umWorkTypeDto.getWorkFlag();
//			}
//			// 勤怠区分による集計
//			if (attendanceType.equals(UnicConst.ATTENDANCE_LEGAL_HOLIDAY)) {
//				legal++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_PRESENCE)) {
//				presenceAtt++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_WITHOUT_NOTICE)) {
//				withoutNotice++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_NOTICED)) {
//				noticeAbsence++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_PAID_HOLIDAY)) {
//				paidHolidayAtt++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_WORKMENS)) {
//				workmens++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_MATERNITY_TERM)) {
//				maternityTerm++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_SICK)) {
//				sick++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_CHILD_CARE)) {
//				childCare++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_MARRIAGE)) {
//				marriage++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_MATERNITY)) {
//				maternity++;
//			} else if (attendanceType.equals(UnicConst.ATTENDANCE_FAMILY)) {
//				family++;
//			} else {
//				other++;
//			}
//			// 集計区分による集計
//			if (totalType.equals(UnicConst.TOTAL_PRESENCE)) {
//				presence++;
//			} else if (totalType.equals(UnicConst.TOTAL_PAID_HOLIDAY)) {
//				paidHoliday++;
//			} else if (totalType.equals(UnicConst.TOTAL_INSTITUTIONAL_ABSENCE)) {
//				institutionalAbsence++;
//			} else if (totalType.equals(UnicConst.TOTAL_WORKMENS)) {
//				institutionalAbsence++;
//			} else if (totalType.equals(UnicConst.TOTAL_PARTICULAR_HOLIDAY)) {
//				particularHoliday++;
//			} else if (totalType.equals(UnicConst.TOTAL_ABSENCE)) {
//				absence++;
//			} else if (totalType.equals(UnicConst.TOTAL_OTHER)) {
//				otherAttendance++;
//			}
//			// 遅刻回数
//			if (dailyDto.getArriveLate() != 0) {
//				arriveLate++;
//			}
//			// 早退回数
//			if (dailyDto.getLeaveEarly() != 0) {
//				leaveEraly++;
//			}
//			// 稼動日数
//			if (workFlag == UnicConst.WORK_FLAG_ON) {
//				working++;
//			}
//			// その他
//			workingHours  += dailyDto.getWorkingHours ();	// 稼動時間
//			effort        += dailyDto.getEffort       ();	// 成果時間
//			overtime      += dailyDto.getOvertime     ();	// 残業時間
//			paymentHours  += dailyDto.getPaymentHours ();	// 時給時間
//			lateNight     += dailyDto.getLateNight    ();	// 深夜時間
//			overLate      += dailyDto.getOverLate     ();	// 深夜残業時間
//			dateAllowance += dailyDto.getDateAllowance();	// 日付手当
//			// 休日出勤日数、休日出勤時間
//			if (totalType.equals(UnicConst.TOTAL_PRESENCE) ||
//					totalType.equals(UnicConst.TOTAL_PAID_HOLIDAY) ||
//					totalType.equals(UnicConst.TOTAL_PARTICULAR_HOLIDAY)) {
//				if (presence + paidHoliday + particularHoliday - prescribedDays > 0 && presence > 0) {
//					// 出勤日数調整
//					if (presence > prescribedDays) {
//						--presence;
//					}
//					// 休日出勤日数加算
//					++workOnHoliday;
//					// 休日出勤時間加算
//					if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_MONTH) ||
//							uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_DAY)) {
//						// 月給、日給者の場合
//						holidayTime += hoursPerDay;
//					} else {
//						// 時給者の場合
//						if (holidayNotLegal > 0) {
//							holidayHoursNotLegal += dailyDto.getPaymentHours();
//							--holidayNotLegal;
//						} else {
//							holidayTime += dailyDto.getPaymentHours();
//						}
//					}
//				}
//			}
//		}
//		// みなし出勤日数
//		int consideredPresence = presence + workOnHoliday + particularHoliday + paidHoliday;
//		// 欠勤日数再計算
//		absence = prescribedDays - consideredPresence < 0 ? 0 : prescribedDays - consideredPresence;
//		// 皆勤減額
//		if (consideredPresence > 0) {
//			if (arriveLate >= missingLimit || withoutNotice > 0 || noticeAbsence > 0) {
//				cutForMissing = missingAmount;
//			}
//		}
//		// 役職減額経験および減額金
//		if (consideredPresence > 0 ||
//				(consideredPresence == 0 &&
//				uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_MONTH))) {
//			double ratio  = consideredPresence / (double)prescribedDays;
//			if (ratio < 1) {
//				int abilityAllowance = uhIndividualDto.getAbilityAllowance() + uhIndividualDto.getAbilityAllowance2();
//				int basicSalary      = uhIndividualDto.getBasicSalary     ();
//				cutForShort  = (int)round(abilityAllowance * ratio - abilityAllowance, 0, BigDecimal.ROUND_DOWN);
//				cutFromBasic = (int)round(basicSalary      * ratio - basicSalary     , 0, BigDecimal.ROUND_DOWN);
//			}
//		}
//		// 有給時間加算(時給者の場合)
//		if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_HOUR)) {
//			if (paidHoliday > 0 && presence > 0) {
//				// 1日当たりの平均時給時間 * 有休日数
//				paymentHours += roundTime(paymentHours / presence) * paidHoliday;
//			}
//		}
//		// 月集計データ作成
//		AttendanceMonthlyDto dto = setMonthlyNames();
//		dto.setPresenceAtt         (presenceAtt         );	// 出勤日数(AttendanceTypeで判断)
//		dto.setPaidHolidayAtt      (paidHolidayAtt      );	// 有給休暇日数(AttendanceTypeで判断)
//		dto.setMarriage            (marriage            );	// 結婚休暇日数
//		dto.setMaternity           (maternity           );	// 出産立会休暇日数
//		dto.setMaternityTerm       (maternityTerm       );	// 産前産後休暇日数
//		dto.setFamily              (family              );	// 忌引休暇日数
//		dto.setWorkmens            (workmens            );	// 労災休暇日数
//		dto.setSick                (sick                );	// 傷病休暇日数
//		dto.setChildCare           (childCare           );	// 育児休暇日数
//		dto.setOther               (other               );	// その他
//		dto.setLegal               (legal               );	// 公休日数
//		dto.setWithoutNotice       (withoutNotice       );	// 無断欠勤日数
//		dto.setNoticeAbsence       (noticeAbsence       );	// 有断欠勤日数
//		dto.setLeaveEraly          (leaveEraly          );	// 早退回数
//		dto.setWorking             (working             );	// 稼働日数
//		dto.setMayWorkDays         (prescribedDays      );	// 要出勤日数
//		dto.setMayWorkHours        (prescribedHours     );	// 要出勤時間
//		dto.setPresence            (presence            ); 	// 出勤日数
//		dto.setWorkOnHoliday       (workOnHoliday       ); 	// 休日出勤日数
//		dto.setInstitutionalAbs    (institutionalAbsence); 	// 制度欠勤日数
//		dto.setOtherAttendance     (otherAttendance     );	// その他勤怠日数
//		dto.setParticularHoliday   (particularHoliday   ); 	// 特別休暇日数
//		dto.setPaidHoliday         (paidHoliday         ); 	// 有給休暇日数
//		dto.setAbsence             (absence             ); 	// 欠勤日数
//		dto.setWorkingHours        (workingHours        ); 	// 稼動時間
//		dto.setArriveLate          (arriveLate          ); 	// 遅刻回数
//		dto.setLateNight           (lateNight           ); 	// 深夜時間
//		dto.setOverLate            (overLate            ); 	// 深夜残業時間
//		dto.setHolidayTime         (holidayTime         ); 	// 休日時間
//		dto.setDateAllowance       (dateAllowance       ); 	// 日付手当
//		
//		// 有給残
//		dto.setPaidHolidayRest(getPaidHolidayRest(paidHoliday));
//		// 支払区分確認
//		if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_MONTH)) {
//			dto.setCutForMissing(cutForMissing);	// 皆勤減額
//			dto.setCutForShort  (cutForShort  );	// 役職減額経験
//			dto.setCutFromBasic (cutFromBasic );	// 減額金
//			dto.setPaymentHours (0            );	// 時給時間
//		} else if (uhIndividualDto.getPaymentType().equals(UnicConst.PAYMENT_PER_DAY)) {
//			dto.setCutForMissing(0            );	// 皆勤減額
//			dto.setCutForShort  (0            );	// 役職減額経験
//			dto.setCutFromBasic (0            );	// 減額金
//			dto.setPaymentHours (0            );	// 時給時間
//		} else {
//			dto.setCutForMissing(0            );	// 皆勤減額
//			dto.setCutForShort  (0            );	// 役職減額経験
//			dto.setCutFromBasic (0            );	// 減額金
//			dto.setPaymentHours (paymentHours );	// 時給時間
//		}
//		// 残業区分確認
//		if (uhIndividualDto.getOvertimeType().equals(UnicConst.OVERTIME_IS_EFFORT)) {
//			dto.setOvertime     (0                              );	// 残業時間
//			dto.setEffort       (effort   + holidayHoursNotLegal);	// 成果時間
//			dto.setEffortTime   (effort   + holidayHoursNotLegal);	// 成果、残業時間
//		} else if (uhIndividualDto.getOvertimeType().equals(UnicConst.OVERTIME_IS_TIME)) {
//			dto.setOvertime     (overtime + holidayHoursNotLegal);	// 残業時間
//			dto.setEffort       (0                              );	// 成果時間
//			dto.setEffortTime   (overtime + holidayHoursNotLegal);	// 成果、残業時間
//			dto.setOverLate     (0                              );	// 深夜残業時間
//		} else {
//			dto.setOvertime     (holidayHoursNotLegal           );	// 残業時間
//			dto.setEffort       (0                              );	// 成果時間
//			dto.setEffortTime   (holidayHoursNotLegal           );	// 成果、残業時間
//			dto.setHolidayTime  (0                              ); 	// 休日時間
//		}
//		return dto;
//	}
//	
//	/**
//	 * 日集計データ配列作成
//	 * @throws Exception
//	 */
//	protected void makeAttendanceArray() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// データ数取得
//		Calendar cal = Calendar.getInstance();
//		cal.setTime(startDate);
//		int count = 0;
//		while (endDate.compareTo(cal.getTime()) >= 0) {
//			cal.add(Calendar.DAY_OF_MONTH, 1);
//			count++;
//		}
//		// 配列初期化
//		aryAttendance = new String[count][40];
//		for (int i = 0; i < aryAttendance.length; i++) {
//			for (int j = 0; j < aryAttendance[i].length; j++) {
//				aryAttendance[i][j] = "";
//			}
//		}
//		// 日付設定
//		cal.setTime(startDate);
//		for (int i = 0; i < aryAttendance.length; i++) {
//			aryAttendance[i][0] = MospUtility.getDateString(cal.getTime(), UnicConst.FORMAT_DATE);
//			aryAttendance[i][1] = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
//			aryAttendance[i][2] = getDayOfWeek(cal.get(Calendar.DAY_OF_WEEK));
//			cal.add(Calendar.DAY_OF_MONTH, 1);
//		}
//		// データの設定
//		Iterator<KintaiCompileDto> it = listKintaiCompileDto.iterator();
//		while (it.hasNext()) {
//			cal.setTime(startDate);
//			KintaiCompileDto dto = it.next();
//			Date attendanceDate = dto.getAttendanceDate();
//			for (int i = 0; i < aryAttendance.length; i++) {
//				if (attendanceDate.compareTo(cal.getTime()) == 0) {
//					// 勤怠マスタ参照
//					String totalType = attendanceTypeMap.get(dto.getAttendanceType()).getTotalType();
//					// 勤怠及び備考設定
//					aryAttendance[i][3] = dto.getAttendanceType();
//					aryAttendance[i][4] = dto.getAttendanceName();
//					aryAttendance[i][5] = dto.getRemarks().length() <= 9 ? dto.getRemarks() : dto.getRemarks().substring(0, 7) + UnicConst.STR_ABBREVIATION;
//					aryAttendance[i][6] = dto.getRemarks();
//					if (totalType.equals(UnicConst.TOTAL_PRESENCE)) {
//						aryAttendance[i][7 ] = dto.getWorkType();
//						aryAttendance[i][8 ] = dto.getWorkName();
//						aryAttendance[i][9 ] = dto.getTimeType();
//						aryAttendance[i][10] = dto.getTimeName();
//						aryAttendance[i][11] = MospUtility.getDateString(dto.getStartTime() , UnicConst.FORMAT_TIME);
//						aryAttendance[i][12] = MospUtility.getDateString(dto.getDepartTime(), UnicConst.FORMAT_TIME);
//						aryAttendance[i][13] = MospUtility.getDateString(dto.getReturnTime(), UnicConst.FORMAT_TIME);
//						aryAttendance[i][14] = MospUtility.getDateString(dto.getQuitTime()  , UnicConst.FORMAT_TIME);
//						aryAttendance[i][15] = MospUtility.getDateString(getTimeAsDate(dto.getIntervalTime()), UnicConst.FORMAT_TIME);
//						aryAttendance[i][16] = dto.getArriveLate() == 0 ? "" : MospUtility.getDateString(getTimeAsDate(dto.getArriveLate()), UnicConst.FORMAT_TIME);
//						aryAttendance[i][17] = dto.getLeaveEarly() == 0 ? "" : MospUtility.getDateString(getTimeAsDate(dto.getLeaveEarly()), UnicConst.FORMAT_TIME);
//						aryAttendance[i][18] = dto.getTrainedName();
//						aryAttendance[i][19] = dto.getTrainingName();
//						aryAttendance[i][20] = dto.getSuspensionFlag() == UnicConst.CHECKBOX_OFF ? "" : UnicConst.STR_CHECK_MARK;
//						aryAttendance[i][21] = dto.getRoute1();
//						aryAttendance[i][22] = dto.getRoute2();
//						if (dto.getCount() != 0) {
//							aryAttendance[i][23] = String.valueOf(dto.getCount());
//						}
//						if (dto.getDistance() != 0) {
//							aryAttendance[i][24] = String.valueOf(dto.getDistance());
//						}
//						String paymentType  = uhIndividualDto.getPaymentType ();
//						String overtimeType = uhIndividualDto.getOvertimeType();
//						aryAttendance[i][25] = getHourString(dto.getWorkingHours());
//						if (paymentType.equals(UnicConst.PAYMENT_PER_HOUR)) {
//							aryAttendance[i][26] = getHourString(dto.getPaymentHours());
//						}
//						if (overtimeType.equals(UnicConst.OVERTIME_IS_TIME)) {
//							aryAttendance[i][27] = getHourString(dto.getOvertime());
//						} else if (overtimeType.equals(UnicConst.OVERTIME_IS_EFFORT)) {
//							aryAttendance[i][28] = getHourString(dto.getEffort());
//						}
//						aryAttendance[i][29] = getHourString(dto.getLateNight());
//						aryAttendance[i][30] = String.valueOf(dto.getAccident());
//						aryAttendance[i][31] = String.valueOf(dto.getDateAllowance());
//						aryAttendance[i][32] = dto.getTrained();
//						aryAttendance[i][33] = dto.getTraining();
//						aryAttendance[i][34] = String.valueOf(dto.getTrip());
//						aryAttendance[i][35] = dto.getFleshFlag() == UnicConst.CHECKBOX_OFF ? "" : UnicConst.STR_CHECK_MARK;
//						aryAttendance[i][36] = dto.getFellow1();
//						aryAttendance[i][37] = dto.getFellow1Name();
//						aryAttendance[i][38] = dto.getFellow2();
//						aryAttendance[i][39] = dto.getFellow2Name();
//						
//					}
//					break;
//				}
//				cal.add(Calendar.DAY_OF_MONTH, 1);
//			}
//		}
//	}
//	
//	/**
//	 * 有給休暇計算
//	 * @param needDelete 翌月有休データ削除要否(true：削除要、false：削除不要)
//	 * @throws Exception 
//	 */
//	protected void calcPaidHoliday(boolean needDelete) throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 計算月翌月取得
//		Date nextMonth = addMonth(targetMonth, 1);
//		// データ操作準備
//		// DAOの準備
//		UtPaidHolidayDao dao = new UtPaidHolidayDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 翌月有給休暇データ削除
//		if (needDelete) {
//			dao.deleteForCalcDate(nextMonth);
//		}
//		// 有給休暇発生間隔取得
//		String[][] aryConf = getConfArray(UnicConst.CONF_ID_HOLIDAY_INV);
//		int first    = Integer.parseInt(aryConf[0][0]);
//		int interval = Integer.parseInt(aryConf[0][1]);
//		// 勤怠データ取得
//		mapAttendanceMonthly = new HashMap<String, AttendanceMonthlyDto>();
//		for (int i = 0; i < aryKCode.length; i++) {
//			// 勤怠データ取得
//			getAttendanceList(aryKCode[i], targetMonth);
//			// 日集計データ取得
//			getlistKintaiCompileDto();
//			// 月集計
//			mapAttendanceMonthly.put(aryKCode[i], totallistKintaiCompileDto());
//		}
//		// 有給休暇計算開始
//		// 社員毎に計算(UtPaidHolidayDto作成)
//		for (int i = 0; i < aryKCode.length; i++) {
//			// 有給休暇区分取得
//			String paidHolidayType = getIndividualHistory(aryKCode[i], endDate).getPaidHolidayType();
//			// 有給休暇区分確認
//			if (paidHolidayType.equals(UnicConst.PAID_HOLIDAY_NONE)) {
//				// 計算翌月データ削除
//				UtPaidHolidayDto deleteDto = dao.findForUpdate(aryKCode[i], nextMonth);
//				if (deleteDto != null) {
//					dao.delete(deleteDto);
//				}
//				continue;
//			}
//			// 計算月データ取得
//			UtPaidHolidayDto dto = dao.findForKey(aryKCode[i], targetMonth);
//			int takeAmount = mapAttendanceMonthly.get(aryKCode[i]).getPaidHoliday();
//			
//			if (dto == null) {
//				// 有給休暇データ新規作成(有給休暇データが存在しない場合)
//				dto = new UtPaidHolidayDto();
//				dto.setKCode(aryKCode[i]);
//				dto.setCalcDate(targetMonth);
//				dto.setLastYearRest(0);
//				dto.setThisYearRest(0 - takeAmount);
//				dto.setTakeAmount(takeAmount);
//				dto.setGetAmount(0);
//				dto.setDisposeAmount(0);
//				dao.insert(dto);
//			} else {
//				// 有給休暇データ更新(有給休暇データが存在する場合)
//				int originalAmount = dto.getTakeAmount();
//				dto.setTakeAmount(takeAmount);
//				if (dto.getLastYearRest() < takeAmount - originalAmount) {
//					dto.setThisYearRest(dto.getThisYearRest() + dto.getLastYearRest() - takeAmount + originalAmount);
//					dto.setLastYearRest(0);
//				} else {
//					dto.setLastYearRest(dto.getLastYearRest() - takeAmount + originalAmount);
//				}
//				dao.update(dto, false);
//			}
//			// 当月退職者確認
//			boolean isRetire = false;
//			for (int j = 0; j < aryRetire.length; j++) {
//				if (aryRetire[j].equals(aryKCode[i])) {
//					// 当月退職者の場合は翌月有給休暇データを作成しない
//					isRetire = true;
//					break;
//				}
//			}
//			if (isRetire) {
//				continue;
//			}
//			// 翌月有給休暇データ作成
//			UtPaidHolidayDto nextDto = new UtPaidHolidayDto();
//			nextDto.setKCode(aryKCode[i]);
//			nextDto.setCalcDate(nextMonth);
//			nextDto.setTakeAmount(0);
//			// 発生月確認
//			int holidayCount = getHolidayCount(aryKCode[i], nextMonth, first, interval);
//			if (holidayCount > 0) {
//				// 有給休暇発生出勤率取得
//				float workRatio = 0F;
//				aryConf = getConfArray(UnicConst.CONF_ID_WORK_RATIO);
//				for (int j = 0; j < aryConf.length; j++) {
//					if (aryConf[j][0].equals(paidHolidayType)) {
//						workRatio = Float.parseFloat(aryConf[j][1]);
//						break;
//					}
//				}
//				// 過去一年間の出勤率確認
//				int holidayAmount = 0;
//				if (getWorkRatio(aryKCode[i], nextMonth) >= workRatio) {
//					// 発生日数取得
//					holidayAmount = getHolidayAmount(aryKCode[i], holidayCount);
//				}
//				int lastYearRest  = 0;
//				int thisYearRest  = 0;
//				int disposeAmount = 0;
//				if (dto.getLastYearRest() < 0) {
//					thisYearRest = dto.getLastYearRest();
//				} else {
//					disposeAmount = dto.getLastYearRest();
//				}
//				if (dto.getThisYearRest() < 0) {
//					lastYearRest = 0;
//					thisYearRest += dto.getThisYearRest();
//				} else {
//					lastYearRest = dto.getThisYearRest();
//				}
//				thisYearRest += holidayAmount;
//				nextDto.setLastYearRest(lastYearRest);
//				nextDto.setThisYearRest(thisYearRest);
//				nextDto.setGetAmount(holidayAmount);
//				nextDto.setDisposeAmount(disposeAmount);
//			} else {
//				// 発生月でない
//				nextDto.setLastYearRest(dto.getLastYearRest());
//				nextDto.setThisYearRest(dto.getThisYearRest());
//				nextDto.setGetAmount(0);
//				nextDto.setDisposeAmount(0);
//			}
//			// 翌月有給休暇データ作成
//			if (dao.findForKey(nextDto.getKCode(), nextDto.getCalcDate()) == null) {
//				dao.insert(nextDto, false);
//			} else {
//				dao.update(nextDto, false);
//			}
//		}
//	}
//	
//	/**
//	 * 有給休暇発生月確認
//	 * @param kCode       確認対象社員コード
//	 * @param targetMonth 確認対象年月
//	 * @param first       初回発生間隔
//	 * @param interval    発生間隔
//	 * @return 有給休暇発生回数(0：発生月でない、それ以外：今回発生回数)
//	 * @throws Exception
//	 */
//	private int getHolidayCount(
//			String kCode,
//			Date   targetMonth,
//			int    first,
//			int    interval
//	) throws Exception {
//		// 有給休暇起算月からの月数取得
//		int passage = getMonthRemainder(targetMonth, getHolidayStartMonth(kCode));
//		// 発生月取得
//		int count        = 0;
//		int holidayMonth = 0;
//		for (holidayMonth = first; holidayMonth <= passage; holidayMonth += interval) {
//			count++;
//			if (holidayMonth == passage) {
//				break;
//			}
//		}
//		if (holidayMonth != passage) {
//			count = 0;
//		}
//		return count;
//	}
//	
//	/**
//	 * 有給休暇発生日数取得
//	 * @param kCode        対象社員コード
//	 * @param holidayCount 対象発生回数
//	 * @return 有給休暇発生日数
//	 * @throws Exception
//	 */
//	private int getHolidayAmount(String kCode, int holidayCount) throws Exception {
//		// 人事マスター(個別設定部)取得
//		UhIndividualDto uhIndividualDto = getIndividualHistory(kCode, endDate);
//		// 有給休暇設定取得
//		UsPaidHolidayDao dao = new UsPaidHolidayDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		UsPaidHolidayDto dto = dao.findForAmount(uhIndividualDto.getPaidHolidayType(), holidayCount);
//		if (dto == null) {
//			return 0;
//		}
//		return dto.getHolidayAmount();
//	}
//
//	/**
//	 * 出勤率取得
//	 * @param kCode       対象社員コード
//	 * @param targetMonth 対象年月
//	 * @return 有給休暇発生日数
//	 * @throws Exception
//	 */
//	private float getWorkRatio(String kCode, Date targetMonth) throws Exception {
//		// 所定労働日数及び出勤日数用変数宣言
//		float mayWorkDay = 0F;
//		float workDay    = 0F;
//		// 人事マスター取得
//		MKihonDto      mKihonDto      = getBasisHistory     (kCode, endDate);
//		UhIndividualDto uhIndividualDto = getIndividualHistory(kCode, endDate);
//		// UT_CALENDARデータ取得準備
//		UtCalendarDao utCalendarDao = new UtCalendarDao();
//		utCalendarDao.initDao(cfg, cmd, aspUser, user, conn);
//		// UT_PAYMENTデータ取得
//		UdPaymentDao udPaymentDao = new UdPaymentDao();
//		udPaymentDao.initDao(cfg, cmd, aspUser, user, conn);
//		// 入社日取得
//		Date enter = mKihonDto.getEntranceDate();
//		for (int i = 0; i < 12; i++) {
//			Date month = addMonth(targetMonth, -1 - i);
//			UdPaymentDto udPaymentDto = udPaymentDao.findForKey(kCode, month);
//			// 給与データ確認
//			if (udPaymentDto == null) {
//				// 計算月確認
//				if (i == 0) {
//					// 勤怠集計
//					getAttendanceList(kCode, month);
//					getlistKintaiCompileDto();
//					udPaymentDto = totallistKintaiCompileDto();
//				} else {
//					continue;
//				}
//			}
//			// 出勤日数+特別休暇日数+有給休暇日数+制度欠勤日数+その他勤怠日数
//			workDay += 
//				udPaymentDto.getPresence         () +
//				udPaymentDto.getParticularHoliday() +
//				udPaymentDto.getPaidHoliday      () +
//				udPaymentDto.getInstitutionalAbs () + 
//				udPaymentDto.getOtherAttendance  ();
//			// 所定労働日数取得
//			UtCalendarDto utCalendarDto = utCalendarDao.findForKey(uhIndividualDto.getCalendarType(), MospUtility.getYear(month), MospUtility.getMonth(month));
//			// 所定労働日数確認
//			if (utCalendarDto == null) {
//				continue;
//			}
//			// 対象月初日、最終日取得
//			Date start = getStartDate(month);
//			Date end   = getEndDate  (month);
//			// 入社日確認
//			if (enter.compareTo(start) >= 0 && enter.compareTo(end) <= 0) {
//				// 対象月内に入社した場合
//				// 入社日から対象月最終日までの日数
//				long enterToEnd = getDateRemainder(end, enter);
//				// 対象月日数
//				long startToEnd = getDateRemainder(end, start);
//				// 概算所定労働日数設定
//				mayWorkDay += round(
//						enterToEnd * utCalendarDto.getWorkingDay() / (double)startToEnd,
//						0, BigDecimal.ROUND_HALF_UP);
//			} else {
//				mayWorkDay += utCalendarDto.getWorkingDay();
//			}
//		}
//		return workDay * 100 / mayWorkDay;
//	}
//	
//	/**
//	 * 有給残取得
//	 * @param paidHolidayTake 対象月有給発生数
//	 * @return 有給残
//	 * @throws Exception 
//	 */
//	private int getPaidHolidayRest(int paidHolidayTake) throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// DAOの準備(UT_PAID_HOLIDAY)
//		UtPaidHolidayDao dao = new UtPaidHolidayDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 対象DTO取得
//		UtPaidHolidayDto dto = null;
//		List<UtPaidHolidayDto> list = dao.findForCondition(kCode, targetMonth);
//		if (list != null && list.size() != 0) {
//			dto = list.get(list.size() - 1);
//		}
//		// 対象月初有給残数取得
//		int paidHolidayRest = 0;
//		if (dto != null) {
//			paidHolidayRest = dto.getLastYearRest() + dto.getThisYearRest() + dto.getTakeAmount();
//		}
//		// 対象月取得分を引く
//		paidHolidayRest -= paidHolidayTake;
//		return paidHolidayRest;
//	}
//	
//	/**
//	 * 深夜時間計算
//	 * @param dto 計算対象DTO
//	 * @throws Exception 
//	 */
//	private void calcLateNightTime(KintaiCompileDto dto) throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 深夜時間設定
//		setLateNightTime();
//		// 深夜時間取得
//		long nightStart = lateNightStart.getTime();
//		long nightEnd   = lateNightEnd.getTime();
//		if (nightStart - nightEnd > 0) {
//			nightEnd += 24 * 3600000;
//		}
//		// 勤務時間取得
//		long workStart = dto.getStartTime().getTime();
//		long workEnd   = dto.getQuitTime ().getTime();
//		if (workStart - workEnd > 0) {
//			workEnd += 24 * 3600000;
//		}
//		// 深夜終了時間取得(これを1日の開始基準とする)
//		long gap = lateNightEnd.getTime();
//		// 1日の開始基準から深夜開始までの時間
//		long nightStartFromBase = 24 * 3600000 - (nightEnd - nightStart);
//		// 勤務時間を1日の開始基準に合わせる
//		long workStartFromBase = workStart - gap;
//		long workEndFromBase   = workEnd   - gap;
//		if (workStartFromBase < 0) {
//			workStartFromBase += 24 * 3600000;
//			workEndFromBase   += 24 * 3600000;
//		}
//		// 実深夜時間の取得
//		long substantialStart = workStartFromBase > nightStartFromBase ? workStartFromBase : nightStartFromBase;
//		long substantialEnd   = workEndFromBase > nightStartFromBase ? workEndFromBase : nightStartFromBase;
//		substantialEnd = substantialEnd > 24 * 3600000 ? 24 * 3600000 : substantialEnd;
//		// 深夜時間計算
//		float lateNight = substantialEnd - substantialStart;
//		if (workEndFromBase > 24 * 3600000 + nightStartFromBase) {
//			lateNight += workEndFromBase - (24 * 3600000 + nightStartFromBase);
//		}
//		lateNight = lateNight / 3600000;
//		// DTOに設定
//		dto.setLateNight(lateNight > dto.getPaymentHours() ? dto.getPaymentHours() : lateNight);
//		// 残業開始、終了時間取得
//		float overStartFromBase = workStartFromBase + (hoursPerDay) * 3600000 + dto.getIntervalTime() * 60000;
//		float overEndFromBase   = overStartFromBase + dto.getOvertime() * 3600000;
//		// 残業区分確認
//		if (uhIndividualDto.getOvertimeType().equals(UnicConst.OVERTIME_IS_EFFORT)) {
//			// 成果分を加算
//			overStartFromBase += dto.getEffort() * 3600000;
//		}
//		// 深夜残業時間の取得
//		float overLateStart = overStartFromBase > nightStartFromBase ? overStartFromBase : nightStartFromBase;
//		float overLateEnd   = overEndFromBase   > nightStartFromBase ? overEndFromBase   : nightStartFromBase;
//		overLateEnd = overLateEnd > 24 * 3600000 ? 24 * 3600000 : overLateEnd;
//		// 深夜残業時間計算
//		float overLate = (overLateEnd - overLateStart) / 3600000;
//		overLate = overLate > 0 ? overLate : 0; 
//		// DTOに設定
//		dto.setOverLate(overLate > lateNight ? lateNight : overLate);
//	}
//	
//	/**
//	 * 時間フォーマット
//	 * @param hour 時間
//	 * @return 時間(文字列)
//	 */
//	private String getHourString(double hour) {
//	    NumberFormat nf = NumberFormat.getNumberInstance();
//	    nf.setMaximumFractionDigits(2);
//	    nf.setMinimumFractionDigits(2);
//	    return nf.format(hour);
//	}
//	
//	/**
//	 * 時間取得
//	 * @param minute 分
//	 * @return 日付
//	 */
//	private Date getTimeAsDate(int minute) {
//		Calendar cal = Calendar.getInstance();
//		cal.set(Calendar.YEAR, UnicConst.TIME_DEFAULT_YEAR);
//		cal.set(Calendar.MONTH, UnicConst.TIME_DEFAULT_MONTH);
//		cal.set(Calendar.DAY_OF_MONTH, UnicConst.TIME_DEFAULT_YEAR);
//		cal.set(Calendar.HOUR_OF_DAY, minute / 60);
//		cal.set(Calendar.MINUTE, minute % 60);
//		cal.set(Calendar.SECOND, 0);
//		cal.set(Calendar.MILLISECOND, 0);
//		return cal.getTime();
//	}
//	
//	/**
//	 * 時間取得
//	 * @param time 時間
//	 * @return 日付
//	 * @throws ParseException 
//	 */
//	private Date getTimeAsDate(String time) throws ParseException {
//		Date date = DateFormat.getTimeInstance(DateFormat.SHORT).parse(time);
//		Calendar cal = Calendar.getInstance();
//		cal.setTime(date);
//		cal.set(Calendar.YEAR, UnicConst.TIME_DEFAULT_YEAR);
//		cal.set(Calendar.MONTH, UnicConst.TIME_DEFAULT_MONTH);
//		cal.set(Calendar.DAY_OF_MONTH, UnicConst.TIME_DEFAULT_DAY);
//		cal.set(Calendar.SECOND, 0);
//		cal.set(Calendar.MILLISECOND, 0);
//		return cal.getTime();
//	}
//	
//	/**
//	 * 曜日設定
//	 * @param dayOfWeek 曜日
//	 * @return 曜日名
//	 */
//	private String getDayOfWeek(int dayOfWeek) {
//		return UnicVo.getDayOfWeek(dayOfWeek);
//	}
//
//	/**
//	 * 集計月更新
//	 * @param vo     対象VO
//	 * @param dto    対象DTO
//	 * @param amount 更新月数
//	 * @return データ挿入対象DTO
//	 * @throws Exception
//	 */
//	protected UtCurrentDto addCurrent(VoInterface vo, UtCurrentDto dto, int amount) throws Exception {
//		// コネクションの取得及びDAOの準備
//		if (conn == null) {
//			getConnection();
//		}
//		UtCurrentDao dao = new UtCurrentDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 排他確認
//		chkExclusive(dto, dao.findForUpdate(dto.getStationCode()), vo);
//		// データの設定
//		dto.setCurrent(addMonth(dto.getCurrent(), amount));
//		// データの更新
//		dao.update(dto);
//		// DTOの再取得
//		UtCurrentDto retDto = dao.findForKey(dto.getStationCode());
//		// コミットせずにリターン
//		return retDto;
//	}
//	
//	/**
//	 * 勤怠マスタ設定
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 */
//	private void setAttendanceTypeMap() throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (attendanceTypeMap != null) {
//			return;
//		}
//		// DAOの準備(UM_ATTENDANCE_TYPE)
//		UmAttendanceTypeDao dao = new UmAttendanceTypeDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 情報の取得
//		List<UmAttendanceTypeDto> list = dao.findAll();
//		// Mapの作成
//		attendanceTypeMap = new HashMap<String, UmAttendanceTypeDto>();
//		UmAttendanceTypeDto dto;
//		for (int i = 0; i < list.size(); i++) {
//			dto = list.get(i);
//			attendanceTypeMap.put(dto.getAttendanceType(), dto);
//		}
//	}
//	
//	/**
//	 * 形態マスタ設定
//	 * @return 勤怠マスタ(Map)
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 */
//	private void setWorkTypeMap() throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (workTypeMap != null) {
//			return;
//		}
//		// DAOの準備(UM_ATTENDANCE_TYPE)
//		UmWorkTypeDao dao = new UmWorkTypeDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 情報の取得
//		List<UmWorkTypeDto> list = dao.findAll();
//		// Mapの作成
//		workTypeMap = new HashMap<String, UmWorkTypeDto>();
//		UmWorkTypeDto dto;
//		for (int i = 0; i < list.size(); i++) {
//			dto = list.get(i);
//			workTypeMap.put(dto.getWorkType(), dto);
//		}
//	}
//
//	/**
//	 * 勤怠マスタ設定
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 */
//	private void setTrainingMap() throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (trainingMap != null) {
//			return;
//		}
//		// DAOの準備(UM_TRAINING)
//		UmTrainingDao dao = new UmTrainingDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		// 情報の取得
//		List<UmTrainingDto> list = dao.findAll();
//		// Mapの作成
//		trainingMap = new HashMap<String, UmTrainingDto>();
//		UmTrainingDto dto;
//		for (int i = 0; i < list.size(); i++) {
//			dto = list.get(i);
//			trainingMap.put(dto.getTrainingCode(), dto);
//		}
//	}
//	
//	/**
//	 * 時間範囲取得
//	 * @param from   開始時間(出社時間等)
//	 * @param to     終了時間(退社時間等)
//	 * @param minute マイナス分(休憩時間等)
//	 * @return 時間範囲(時間)
//	 */
//	private float getInterval(Date from, Date to, int minute) {
//		float interval = 0F;
//		if (to.compareTo(from) <= 0) {
//			interval = to.getTime() - from.getTime() + 24 * 3600000 - minute * 60000;
//		} else {
//			interval = to.getTime() - from.getTime() - minute * 60000;
//		}
//		return interval / 3600000;
//	}
//	
//	/**
//	 * 1日所定労働時間取得
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 */
//	protected void setHoursPerDay(
//			) throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (hoursPerDay != 0) {
//			return;
//		}
//		// UM_CONFから値を取得
//		String[][] aryConf = getConfArray(UnicConst.CONF_ID_WORK_HOUR);
//		// 値の設定
//		hoursPerDay = Float.parseFloat(aryConf[0][0]);
//	}
//	
//	/**
//	 * 深夜時間取得
//	 * @throws Exception 
//	 */
//	private void setLateNightTime() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (lateNightStart != null) {
//			return;
//		}
//		// UM_CONFから値を取得
//		String[][] aryConf = getConfArray(UnicConst.CONF_ID_LATE_NIGHT);
//		// 値の設定
//		lateNightStart = getTimeAsDate(aryConf[0][0]);
//		lateNightEnd   = getTimeAsDate(aryConf[0][1]);
//	}
//	
//	/**
//	 * 皆勤減額情報取得
//	 * @throws Exception 
//	 */
//	private void setMissingValue() throws Exception {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// 取得済確認
//		if (missingLimit != 0) {
//			return;
//		}
//		// UM_CONFから値を取得
//		String[][] aryConf = getConfArray(UnicConst.CONF_ID_MISSING_LMT);
//		// 値の設定
//		missingLimit  = Integer.parseInt(aryConf[0][0]);
//		missingAmount = Integer.parseInt(aryConf[0][1]);
//	}
//	
//	/**
//	 * カレンダー取得
//	 * @throws SQLException 
//	 * @throws ClassNotFoundException 
//	 * @throws NoSuchFieldException 
//	 * @throws IllegalAccessException 
//	 * @throws Exception 
//	 */
//	protected void setPrescribedCalendar() throws ClassNotFoundException, SQLException, IllegalAccessException, NoSuchFieldException {
//		// DBコネクション取得
//		if (conn == null) {
//			getConnection();
//		}
//		// UT_CALENDARから値を取得
//		UtCalendarDao dao = new UtCalendarDao();
//		dao.initDao(cfg, cmd, aspUser, user, conn);
//		UtCalendarDto dto = dao.findForKey(uhIndividualDto.getCalendarType(), year, month);
//		if (dto != null) {
//			prescribedDays  = dto.getWorkingDay  ();
//			prescribedHours = dto.getWorkingHours();
//		}
//		// 法定外休日数設定
//		holidayNotLegal = (int)round((getDateRemainder(endDate, startDate) - prescribedDays) / 2D, 0, BigDecimal.ROUND_DOWN);
//		
//	}
//	
//	/**
//	 * 成果率取得
//	 * @return 成果率
//	 * @throws Exception
//	 */
//	protected float getEffortRatio() throws Exception {
//		float effortRatio = 0;
//		// 成果率取得
//		UtEffortDao utEffortDao = new UtEffortDao();
//		utEffortDao.initDao(cfg, cmd, aspUser, user, conn);
//		UtEffortDto utEffortDto = utEffortDao.findForKey(uhIndividualDto.getEffortType(), mKihonDto.getPositionCode(), year, month);
//		if (utEffortDto != null) {
//			effortRatio = utEffortDto.getEffortRatio();
//		}
//		return effortRatio;
//	}
//	
	/**
	 * 対象年月設定。<br>
	 * @param targetMonth 設定対象
	 * @throws Exception 
	 */
	protected void setTargetMonth(Date targetMonth) throws Exception {
		this.targetMonth = targetMonth;
		this.year        = MospUtility.getYear (targetMonth);
		this.month       = MospUtility.getMonth(targetMonth);
		this.startDate   = getStartDate(targetMonth);
		this.endDate     = getEndDate  (targetMonth);
	}
	
	/**
	 * 丸め処理を行う。<br>
	 * 時間を15分単位で切り上げる。<br>
	 * @param value 対象値(時間)
	 * @throws Exception 
	 */
	protected float roundTime(float value) {
		// 時間を整数部と小数点部に分割
		int   integer = (int)round(value, 0, BigDecimal.ROUND_DOWN);
		float decimal = value - integer;
		// 小数点部切り上げ
		float roundup = 0F;
		if (decimal == 0) {
			roundup = 0F;
		} else if (decimal <= 0.25) {
			roundup = 0.25F;
		} else if (decimal <= 0.50) {
			roundup = 0.50F;
		} else if (decimal <= 0.75) {
			roundup = 0.75F;
		} else {
			roundup = 1;
		}
		// 整数部+小数点切り上げ
		return integer + roundup;
	}

	/**
	 * 丸め処理(四捨五入等)
	 * @param value 対象値
	 * @param scale 対象位置(少数点以下：0で整数)
	 * @param mode  方法
	 * @throws Exception 
	 */
	protected double round(double value, int scale, int mode) {
		BigDecimal bd;
		if (scale >= 0) {
			bd = new BigDecimal(value);
			return bd.setScale(scale, mode).doubleValue();
		}
		int    minusScale = scale * -1;
		double dividing   = 1         ;
		for (int i = 0; i < minusScale; i++) {
			dividing *= 10;
		}
		bd = new BigDecimal(value / dividing);
		return bd.setScale(0, mode).doubleValue() * dividing;
	}
	
}
