/**
   * рекурсивно поднимаемся по руководителям (employee.manager.manager...) пока не найдем
   * последнего, кому отправлялся запрос согласования. (продолаем рекурсивно подниматься)
   */
  protected VacationApproval getTopLineManagerApprovalRecursive(VacationApproval vacationApproval)
      throws VacationApprovalServiceException {

    int lineManagerDaysToApprove = getControlTimeForLineManager(vacationApproval.getVacation());

    if (vacationApproval.getResult() != null) { // линейный вынес решение об отпуске
      return vacationApproval;
    }

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

    Employee manager = vacationApproval.getManager();

    if (!managerExists(manager)) { // у линейного нет руководителя или он сам себе руководитель
      return vacationApproval;
    }

    Vacation vacation = vacationApproval.getVacation();
    VacationApproval managerOfManagerApproval =
        tryGetManagerApproval(vacation, manager.getManager());
    if (managerOfManagerApproval
        == null) { // письмо линейному руководителю этого линейного еще не посылалось
      return vacationApproval;
    }

    return getTopLineManagerApprovalRecursive(
        managerOfManagerApproval); // проверяем следующего по иерархии линейного руководителя
  }