예제 #1
0
  @Transactional
  public String deleteVacation(Integer vacationId) {
    final JsonArrayNodeBuilder builder = anArrayBuilder();
    String message = null;
    final Vacation vacation = tryFindVacation(vacationId);

    if (vacation == null) { // если вдруг удалил автор, а не сотрудник
      throw new DeleteVacationException("Запись не найдена");
    }

    final Employee employee = securityService.getSecurityPrincipal().getEmployee();

    if (isVacationDeletePermission(vacation, employee)) {
      /* для планируемых отпусков другая удалялка */
      if (vacation.getType().getId() == VacationTypesEnum.PLANNED.getId()) {
        sendMailService.performPlannedVacationDeletedMailing(vacation);
      } else {
        sendMailService.performVacationDeletedMailing(
            vacation); // todo переделать, чтобы рассылка все-таки была после удаления?
      }
      delete(vacation);
    } else {
      message =
          "Нельзя удалить заявление на отпуск. Для удаления данного заявления необходимо написать на [email protected]";
    }

    builder.withElement(
        anObjectBuilder()
            .withField("status", aNumberBuilder(message == null ? "0" : "-1"))
            .withField("message", aStringBuilder(message == null ? "" : message)));

    return JsonUtil.format(builder);
  }
예제 #2
0
  @Transactional
  public String approveVacation(Integer vacationId) {
    Vacation vacation = findVacation(vacationId);
    Set<VacationApproval> vacationApprovals = vacation.getVacationApprovals();

    Date responseDate = new Date();

    vacation.setStatus(dictionaryItemService.find(VacationStatusEnum.APPROVED.getId()));
    store(vacation);

    vacationApprovalProcessService.sendBackDateVacationApproved(vacation);

    if (!vacationApprovals.isEmpty()) {
      for (VacationApproval vacationApproval : vacationApprovals) {
        vacationApproval.setResult(true);
        vacationApproval.setResponseDate(responseDate);
        StringBuilder comment = new StringBuilder("Согласовано ");
        if (isVacationApprovePermission(vacation)) {
          comment.append("РЦК");
        } else if (request.isUserInRole(ROLE_ADMIN)) {
          comment.append("Администратором");
        }
        vacationApproval.setComment(comment.toString());
        vacationApprovalService.store(vacationApproval);
      }
    }

    return JsonUtil.format(
        anObjectBuilder().withField("isApproved", JsonNodeBuilders.aTrueBuilder()));
  }
예제 #3
0
 public Map<Vacation, Integer> getCalDays(List<Vacation> vacations) {
   Map<Vacation, Integer> calDays = new HashMap<Vacation, Integer>(vacations.size());
   for (Vacation vacation : vacations) {
     Integer diffInDays =
         DateTimeUtil.getDiffInDays(vacation.getBeginDate(), vacation.getEndDate());
     calDays.put(vacation, diffInDays);
   }
   return calDays;
 }
  /** проверяем, согласован ли отпуск с линейным руководителем */
  protected Boolean vacationIsApprovedByLineManager(Vacation vacation)
      throws VacationApprovalServiceException {
    if (vacation.getStatus() != null
        && approvedByLineManager.contains(
            vacation.getStatus().getId())) { // проверка уже утвержденного отпуска
      return true;
    }

    if (!managerExists(
        vacation
            .getEmployee())) { // если линейных нет или сам себе линейный - утверждаем без проверок
      setFinalStatusForVacationAndSendVacationApprovedMessages(vacation, true);
      return true;
    }

    /* APLANATS-865
     Boolean manager2Result = getManager2Result(vacation);       //если второй линейный отказал - сразу возвращаем отказ
    if (BooleanUtils.isFalse(manager2Result)) {
        return manager2Result;
    }*/

    int lineManagerDaysToApprove = getControlTimeForLineManager(vacation);
    VacationApproval lineManagerApproval = getTopLineManagerApproval(vacation);

    if (lineManagerApproval.getResult() != null) { // нашли результат у одного из линейных
      setFinalStatusForVacationAndSendVacationApprovedMessages(
          vacation, lineManagerApproval.getResult());
      return lineManagerApproval.getResult();
    }

    if (lineManagerHasTimeToApproveVacation(
        lineManagerDaysToApprove, lineManagerApproval)) { // у линейного еще есть время подумать
      return lineManagerApproval.getResult();
    }

    /*if (manager2Result != null) {       //после проверки всех линейных, если они не отвечают и если второй линейный вынес решение - возвращаем его
        return manager2Result;
    }*/

    VacationApproval approvalResult =
        prepareApproveLetterForLineManagerOfEmployee(vacation, lineManagerApproval.getManager());
    if (approvalResult != null) {
      sendMailService.performVacationApproveRequestSender(
          approvalResult); // посылаем письмо с уведомлением следующему в иерархии линейному
      // руководителю
    } else {
      if (!employeeService.isLineManager(
          vacation.getEmployee())) { // проверяем, что сотрудник - не чей-то линейный
        setFinalStatusForVacationAndSendVacationApprovedMessages(vacation, true);
        return true;
      }
    }

    return false;
  }
 /**
  * получаем максимальное количество дней, за которое руководители проекта должны согласовать
  * заявление на отпуск
  */
 private Integer getControlTimeForProjectManager(Vacation vacation)
     throws VacationApprovalServiceException {
   Long daysForApprove =
       DateTimeUtil.getAllDaysCount(vacation.getCreationDate(), vacation.getBeginDate());
   Integer vacationTreshold = getVacationTreshold();
   if (daysForApprove >= vacationTreshold) {
     return getVacationProjectManagerOverrideThreshold();
   } else {
     return getVacationUrgentProjectManagerOverrideThreshold();
   }
 }
예제 #6
0
 // возвращает количество дней в списке отпусков (в зависимости от того какой список был передан)
 private int getSummaryDaysCount(Map<Vacation, Integer> days) {
   int summaryDays = 0;
   for (Map.Entry<Vacation, Integer> entry : days.entrySet()) {
     Vacation vacation = entry.getKey();
     Integer daysInVacation = entry.getValue();
     if (VacationStatusEnum.APPROVED.getId() == vacation.getStatus().getId()
         || VacationTypesEnum.PLANNED.getId() == vacation.getType().getId()) {
       summaryDays += daysInVacation;
     }
   }
   return summaryDays;
 }
예제 #7
0
  // возвращает список отпусков за год определенного типа с указанием количества календарных или
  // рабочих дней
  // в зависимости от того, какой список был передан
  private Map<Vacation, Integer> getDaysForYearByType(
      Map<Vacation, Integer> days, int year, DictionaryItem type) {
    Map<Vacation, Integer> daysForYearByType = new HashMap<Vacation, Integer>();
    for (Map.Entry<Vacation, Integer> entry : days.entrySet()) {
      Vacation vacation = entry.getKey();
      Integer calDaysInVacation = entry.getValue();

      if (vacationStatusInThisYear(vacation, year)
          && type.getId().equals(vacation.getType().getId())) {
        daysForYearByType.put(vacation, calDaysInVacation);
      }
    }
    return daysForYearByType;
  }
예제 #8
0
  public Map<Vacation, Integer> getWorkDays(
      Map<Vacation, Integer> calDays, List<Holiday> holidays) {
    Map<Vacation, Integer> workDays = new HashMap<Vacation, Integer>(calDays.size());

    for (Map.Entry<Vacation, Integer> entry : calDays.entrySet()) {
      Vacation vacation = entry.getKey();
      Integer calDaysInVacation = entry.getValue();
      Region emplRegion = vacation.getEmployee().getRegion();
      final int holidaysCount =
          getHolidaysCount(holidays, emplRegion, vacation.getBeginDate(), vacation.getEndDate());
      final int workDaysCount = calDaysInVacation - holidaysCount;
      workDays.put(vacation, workDaysCount);
    }

    return workDays;
  }
 /** проверяет, закончилось ли у руководителей проекта время для согласования отпуска */
 private boolean checkTimeIsOverForProjectManagers(Vacation vacation)
     throws VacationApprovalServiceException {
   Integer controlTimeForProjectManager = getControlTimeForProjectManager(vacation);
   Date date = new Date();
   return (date.after(
       DateUtils.addDays(vacation.getCreationDate(), controlTimeForProjectManager)));
 }
예제 #10
0
 /**
  * Определяет является ли отпуск учитываемым в трудозатратах
  *
  * @param vacation
  * @return
  */
 public Boolean isConsiderVacation(Vacation vacation) {
   if (vacation == null) {
     return false;
   }
   return VacationTypesEnum.getConsiderVacationTypes()
       .contains(VacationTypesEnum.getById(vacation.getType().getId()));
 }
예제 #11
0
 public List<DictionaryItem> getVacationTypes(List<Vacation> vacations) {
   List<DictionaryItem> result = new ArrayList<DictionaryItem>();
   for (Vacation vacation : vacations) {
     if (!result.contains(vacation.getType())) {
       result.add(vacation.getType());
     }
   }
   // отсортируем
   Collections.sort(
       result,
       new Comparator() {
         @Override
         public int compare(Object type1, Object type2) {
           Integer typeId1 = ((DictionaryItem) type1).getId();
           Integer typeId2 = ((DictionaryItem) type2).getId();
           return typeId1.compareTo(typeId2);
         }
       });
   return result;
 }
예제 #12
0
 public String getVacationListByRegionJSON(
     Date dateFrom, Date dateTo, List<Vacation> vacationList) {
   List<Region> regionList = regionService.getRegions();
   List<Employee> employeeList = new ArrayList<Employee>();
   for (Vacation vacation : vacationList) {
     Employee employee = vacation.getEmployee();
     if (!(employeeList.contains(employee))) {
       employeeList.add(employee);
     }
   }
   final JsonArrayNodeBuilder result = anArrayBuilder();
   // для каждого проекта смотрим сотрудников у которых есть отпуск
   for (Region region : regionList) {
     JsonArrayNodeBuilder employeeNode = anArrayBuilder();
     boolean hasEmployees = false;
     for (Employee employee : employeeList) {
       if (employee.getRegion().getId().equals(region.getId())) {
         JsonArrayNodeBuilder vacationNode = createVacationsNode(employee, vacationList);
         hasEmployees = true;
         employeeNode.withElement(
             anObjectBuilder()
                 .withField("employee", aStringBuilder(employee.getName()))
                 .withField("vacations", vacationNode));
       }
     }
     if (hasEmployees) {
       result.withElement(
           anObjectBuilder()
               .withField("region_id", aStringBuilder(region.getId().toString()))
               .withField("region_name", aStringBuilder(region.getName()))
               .withField("employeeList", employeeNode)
               .withField("holidays", getHolidayInRegion(dateFrom, dateTo, region)));
     }
   }
   return JsonUtil.format(result);
 }
예제 #13
0
 public JsonArrayNodeBuilder createVacationsNode(Employee employee, List<Vacation> vacationList) {
   JsonArrayNodeBuilder vacationNode = anArrayBuilder();
   for (Vacation vacation : vacationList) {
     if (vacation.getEmployee().equals(employee)) {
       vacationNode.withElement(
           anObjectBuilder()
               .withField(
                   "beginDate",
                   aStringBuilder(dateToString(vacation.getBeginDate(), VIEW_DATE_PATTERN)))
               .withField(
                   "endDate",
                   aStringBuilder(dateToString(vacation.getEndDate(), VIEW_DATE_PATTERN)))
               .withField("status", aStringBuilder(vacation.getStatus().getValue()))
               .withField("type", aStringBuilder(vacation.getType().getId().toString()))
               .withField("typeName", aStringBuilder(vacation.getType().getValue())));
     }
   }
   return vacationNode;
 }
예제 #14
0
 /* функция возвращает можно ли удалить планируемый отпуск в таблице заявлений на отпуск */
 public Boolean isVacationDeletePermission(Vacation vacation, Employee employee) {
   if (employee != null && vacation != null) {
     /* проверим Админ ли текущий пользователь */
     if (employeeService.isEmployeeAdmin(employee.getId())) {
       return Boolean.TRUE;
     } else {
       /* для запланированных отпусков проверяем что это либо создатель отпуска либо сам отпускник
        * либо является лин. рук. отпускника */
       if (vacation.getType().getId() == VacationTypesEnum.PLANNED.getId()
           && (vacation.getEmployee().equals(employee)
               || vacation.getAuthor().equals(employee)
               || employeeService.getLinearEmployees(vacation.getEmployee()).contains(employee))) {
         return Boolean.TRUE;
       }
       /* пользователь создатель или отпускник и статус не отклонено и не утверждено */
       if ((vacation.getEmployee().equals(employee) || vacation.getAuthor().equals(employee))
           && vacation.getStatus().getId() != VacationStatusEnum.REJECTED.getId()
           && vacation.getStatus().getId() != VacationStatusEnum.APPROVED.getId()) {
         return Boolean.TRUE;
       }
     }
   }
   return Boolean.FALSE;
 }
예제 #15
0
 /**
  * Проверка на РЦК
  *
  * @param vacation
  * @return
  */
 public Boolean isVacationApprovePermission(Vacation vacation) {
   TimeSheetUser securityUser = securityService.getSecurityPrincipal();
   Employee manager = vacation.getEmployee().getDivision().getLeaderId();
   return securityUser.getEmployee().getId().equals(manager.getId());
 }
예제 #16
0
 /* определяет по дате началу отпуска принадлежность году */
 private Boolean vacationStatusInThisYear(Vacation vacation, int year) {
   Calendar cal = Calendar.getInstance();
   cal.setTime(vacation.getBeginDate());
   return cal.get(Calendar.YEAR) == year;
 }
예제 #17
0
  public void createAndMailVacation(
      CreateVacationForm createVacationForm,
      Employee employee,
      Employee curEmployee,
      boolean isApprovedVacation)
      throws VacationApprovalServiceException {

    final Vacation vacation = new Vacation();

    vacation.setCreationDate(new Date());
    vacation.setBeginDate(DateTimeUtil.stringToTimestamp(createVacationForm.getCalFromDate()));
    vacation.setEndDate(DateTimeUtil.stringToTimestamp(createVacationForm.getCalToDate()));
    vacation.setComment(createVacationForm.getComment().trim());
    vacation.setType(dictionaryItemService.find(createVacationForm.getVacationType()));
    vacation.setAuthor(curEmployee);
    vacation.setEmployee(employee);
    vacation.setRemind(false);

    vacation.setStatus(
        dictionaryItemService.find(
            isApprovedVacation
                ? VacationStatusEnum.APPROVED.getId()
                : VacationStatusEnum.APPROVEMENT_WITH_PM.getId()));

    TransactionStatus transactionStatus = null;

    try {
      transactionStatus = getNewTransaction();

      store(vacation);

      boolean isPlannedVacation =
          vacation.getType().getId().equals(VacationTypesEnum.PLANNED.getId());

      if (isPlannedVacation) {
        vacationApprovalProcessService.sendNoticeForPlannedVacaton(vacation);
      } else {
        List<Vacation> plannedVacations =
            vacationDAO.getPlannedVacationsByBeginAndEndDates(
                employee, vacation.getBeginDate(), vacation.getEndDate());
        for (Vacation plannedVacation : plannedVacations) {
          delete(plannedVacation);
        }
        if (needsToBeApproved(vacation)) {
          vacationApprovalProcessService.sendVacationApproveRequestMessages(
              vacation); // рассылаем письма о согласовании отпуска
        } else {
          vacationApprovalProcessService.sendBackDateVacationApproved(vacation);
        }
      }
      commit(transactionStatus);
    } catch (VacationApprovalServiceException e) {
      if (transactionStatus != null) {
        rollback(transactionStatus);
        logger.error("Transaction rollbacked. Error saving vacation: {} ", e);
      } else {
        logger.error("TransactionStatus is null.");
      }
    }
    sendMailService.performVacationCreateMailing(vacation);
  }
예제 #18
0
 public Boolean isVacationNotApproved(Vacation vacation) {
   return !vacation
       .getStatus()
       .getId()
       .equals(dictionaryItemService.find(VacationStatusEnum.APPROVED.getId()).getId());
 }
예제 #19
0
 private boolean needsToBeApproved(Vacation vacation) {
   return !vacation.getStatus().getId().equals(VacationStatusEnum.APPROVED.getId());
 }