/**
   * проверяем, согласовал ли РП заявление на отпуск. Возвращаем его решение. если письмо
   * руководителю проекта не посылалось, то выбрасывается VacationApprovalServiceException
   */
  private Boolean getProjectManagerApproveResult(
      List<VacationApproval> projectManagerApprovals, Project project)
      throws VacationApprovalServiceException {
    if (project != null) {
      if (project.getManager() != null) {
        Integer projectManagerId = project.getManager().getId();
        for (VacationApproval approval : projectManagerApprovals) {
          Integer managerId = approval.getManager().getId();
          if (managerId.equals(projectManagerId)) {
            return approval.getResult();
          }
        }

        Integer vacationId = projectManagerApprovals.get(0).getVacation().getId();
        throw new VacationApprovalServiceException(
            String.format(
                "В БД не найдены данные о письме руководителю проекта %s для подтверждения отпуска №%s!",
                project.getName(), vacationId));
      } else {
        throw new VacationApprovalServiceException(
            String.format("В БД не найдены данные о руководителе проекта %s", project.getName()));
      }
    } else {
      throw new VacationApprovalServiceException("В БД не найдены данные о проекте");
    }
  }
  public void createOrUpdateProject(NamedNodeMap nodeMap, ProjectDAO dao) {
    Project project = new Project(); // проект из БД

    // поля синхронизации
    String name = nodeMap.getNamedItem("name").getNodeValue().trim(); // название проекта
    String idProject = nodeMap.getNamedItem("id").getNodeValue(); // id проекта
    String status = nodeMap.getNamedItem("status").getNodeValue(); // статус проекта
    String pmLdap = nodeMap.getNamedItem("pm").getNodeValue(); // руководитель проекта
    String hcLdap = nodeMap.getNamedItem("hc").getNodeValue(); // hc

    // ищем в БД запись о проекте
    Project findingProject = dao.findByProjectId(idProject);
    if (findingProject == null) { // если проекта еще нет в БД
      project.setActive(newStatus.contains(status)); // установим ему новый статус
    } else {
      // если проект уже существовал - статус менять не будем
      // см. //APLANATS-408
      project.setActive(findingProject.isActive());
    }

    project.setName(name);
    project.setProjectId(idProject);

    if (project.isActive()) {
      if (!setPM(project, pmLdap)) {
        return; // если не указан РП или его нет в БД, то проект не сохраняем, переходим к
                // следующему
      }
      setDivision(project, hcLdap); // установим подразделение пользователя
    }
    dao.store(project); // запишем в БД
  }
 private void setDivision(Project project, String hcLdap) {
   Employee employee = this.employeeDAO.findByLdapName(hcLdap.split("/")[0]);
   if (employee != null) {
     Set<Division> divisions = new TreeSet<Division>();
     divisions.add(employee.getDivision());
     project.setDivisions(divisions);
   }
 }
  private boolean setPM(Project project, String pmLdap) {
    // APLANATS-429
    if ((pmLdap == null) || (pmLdap.equals(""))) {
      trace
          .append("Проект ")
          .append(project.getName())
          .append(" пропущен, т.к. не указан руководитель проекта \n");
      return false;
    }

    Employee projectLeader = this.employeeDAO.findByLdapName(pmLdap.split("/")[0]);
    if (projectLeader == null) {
      trace
          .append("Проект ")
          .append(project.getName())
          .append(" проигнорирован, " + "т.к. руководитель проекта ")
          .append(pmLdap)
          .append(" не найден в базе ldap\n");
      return false;
    }

    project.setManager(projectLeader);
    return true;
  }