private Integer getVacationDaysCountForPeriod( String beginDateString, Integer employeeId, Integer vacationTypeId) { Employee employee = employeeService.find(employeeId); final Timestamp beginDate = DateTimeUtil.stringToTimestamp(beginDateString, CreateVacationForm.DATE_FORMAT); Calendar calendar = Calendar.getInstance(); calendar.setTime(employee.getStartDate()); Integer beginDay = calendar.get(Calendar.DAY_OF_MONTH); calendar.setTime(beginDate); Integer vacDay = calendar.get(Calendar.DAY_OF_MONTH); Integer month = calendar.get(Calendar.MONTH); Integer year = calendar.get(Calendar.YEAR); // Если день начала отпуска меньше даты устройства на работу // то оставляем месяц без изменений т.к. calendar.get(Calendar.MONTH) дает -1 один месяц if (vacDay > beginDay) { ++month; } Integer count = null; if (vacationTypeId.equals(VacationTypesEnum.WITH_PAY.getId())) { count = getFactVacationDaysCount(employee, year, month); } else { count = getPlanVacationDaysCount(employee, year, month); } return count; }
public String checkVacationCountDaysJSON( String beginDateString, String endDateString, Integer employeeId, Integer vacationTypeId) { Employee employee = employeeService.find(employeeId); final Timestamp beginDate = DateTimeUtil.stringToTimestamp(beginDateString, CreateVacationForm.DATE_FORMAT); final Timestamp endDate = DateTimeUtil.stringToTimestamp(endDateString, CreateVacationForm.DATE_FORMAT); Integer factCount = getVacationDaysCountForPeriod( beginDateString, employeeId, VacationTypesEnum.WITH_PAY.getId()); Integer planCount = getVacationDaysCountForPeriod( beginDateString, employeeId, VacationTypesEnum.PLANNED.getId()); // Получаем кол-во дней в отпуске за исключением неучитываемых праздников Integer vacationDayCountExCons = calendarService.getCountDaysForPeriodForRegionExConsiderHolidays( beginDate, endDate, employee.getRegion()); boolean factError = factCount - vacationDayCountExCons < 0 && vacationTypeId.equals(VacationTypesEnum.WITH_PAY.getId()); boolean planError = planCount - vacationDayCountExCons < 0; JsonObjectNodeBuilder builder = anObjectBuilder() .withField( "error", factError ? JsonUtil.aNumberBuilder(-1) : planError ? JsonUtil.aNumberBuilder(1) : JsonUtil.aNumberBuilder(0)) .withField( "message", aStringBuilder( factError ? String.format( "Внимание! Вы не можете запланировать отпуск на количество дней, больше %s дней", factCount.toString()) : planError ? "Внимание! Создаваемый отпуск превышает допустимое количество дней. Продолжить?" : "")); return JsonUtil.format(builder); }
public String getExitToWorkAndCountVacationDayJson( String beginDateString, String endDateString, Integer employeeId, Integer vacationTypeId) { final JsonObjectNodeBuilder builder = anObjectBuilder(); try { Employee employee = employeeService.find(employeeId); final Timestamp beginDate = DateTimeUtil.stringToTimestamp(beginDateString, CreateVacationForm.DATE_FORMAT); final Timestamp endDate = DateTimeUtil.stringToTimestamp(endDateString, CreateVacationForm.DATE_FORMAT); // Получаем день выхода на работу com.aplana.timesheet.dao.entity.Calendar endDateCalendar = calendarService.find(endDate); com.aplana.timesheet.dao.entity.Calendar nextWorkDay = calendarService.getNextWorkDay(endDateCalendar, employee.getRegion()); String format = DateFormatUtils.format(nextWorkDay.getCalDate(), CreateVacationForm.DATE_FORMAT); builder.withField("exitDate", aStringBuilder(format)); // Получаем кол-во дней в отпуске за исключением неучитываемых праздников Integer vacationDayCountExCons = calendarService.getCountDaysForPeriodForRegionExConsiderHolidays( beginDate, endDate, employee.getRegion()); // Получаем кол-во рабочих дней в отпуске Integer vacationWorkCount = calendarService.getCountWorkDaysForPeriodForRegion( beginDate, endDate, employee.getRegion()); builder.withField("vacationWorkDayCount", aStringBuilder(vacationWorkCount.toString())); builder.withField( "vacationDayCount", aStringBuilder((vacationDayCountExCons <= 0) ? "0" : vacationDayCountExCons.toString())); /* проверка на необходимость вывода информ сообщения о необходимости оформления отпуска по вск для отпуска с сохранением содержания */ Calendar calendar = java.util.Calendar.getInstance(); calendar.setTime(beginDate); int beginWeekYear = calendar.get(Calendar.WEEK_OF_YEAR); calendar.setTime(endDate); int endWeekYear = calendar.get(Calendar.WEEK_OF_YEAR); calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek()); Date beginWeekDate = calendar.getTime(); int endDay = calendar.get(Calendar.DAY_OF_WEEK); int leftDays = Calendar.SATURDAY - endDay; calendar.add(Calendar.DATE, ++leftDays); Date sunday = calendar.getTime(); // Количество рабочих дней в отпуске, если конец отпуска приходится // на следующую неделю то считается с понедельника след недели по дату конца отпуска Integer countWorkDaysVacationPeriod = calendarService.getCountWorkDaysForPeriodForRegion( beginWeekYear != endWeekYear ? beginWeekDate : beginDate, endDate, employee.getRegion()); // Количество рабочих дней в неделе приходящихся на конец отпуска Integer countWorkDaysWeek = calendarService.getCountWorkDaysForPeriodForRegion( beginWeekDate, DateUtils.addDays(beginWeekDate, 6), employee.getRegion()); // Количество учитываемых дней в период с понедельника последней недели отпуска по конец // отпуска Integer countVacConsiderDaysOnEndWeek = calendarService.getCountDaysForPeriodForRegionExConsiderHolidays( beginWeekYear != endWeekYear ? beginWeekDate : beginDate, endDate, employee.getRegion()); // Количество учитываемых дней в неделе Integer countConsiderDaysOnEndWeek = calendarService.getCountDaysForPeriodForRegionExConsiderHolidays( beginWeekYear != endWeekYear ? beginWeekDate : beginDate, sunday, employee.getRegion()); if (vacationTypeId != null && vacationTypeId == VacationTypesEnum.WITH_PAY.getId() && // проверка что в отпуск попала не вся учитываемая неделя !countVacConsiderDaysOnEndWeek.equals(countConsiderDaysOnEndWeek) && // и в этот период попадают все рабочие дни countWorkDaysVacationPeriod.equals(countWorkDaysWeek)) { builder.withField("vacationFridayInform", aStringBuilder("true")); } return JsonUtil.format(builder); } catch (Exception th) { logger.error(CANT_GET_EXIT_TO_WORK_EXCEPTION_MESSAGE, th); return CANT_GET_EXIT_TO_WORK_EXCEPTION_MESSAGE; } }