/**
   * Metodo de Autenticacao de Usuario
   *
   * @param login
   * @param senha
   * @return
   */
  public Usuario autentica(String login, String senha) throws Erro {
    log("Autenticando " + getNomeEntidade());
    Usuario u = new Usuario();
    u.setLogin(login);
    Usuario usuarioRecuperadoDoBD = new Usuario();
    usuarioRecuperadoDoBD = getFinder().findByLogin(u.getLogin());

    // Primeiro verificamos se o usuario existe.
    if (existe(usuarioRecuperadoDoBD)) {
      // Verificamos se usuario e senha informado batem com o banco.
      boolean usuarioConfere =
          (login.equals(usuarioRecuperadoDoBD.getLogin())
              && senha.equals(usuarioRecuperadoDoBD.getSenha()));
      boolean usuarioEstaBloqueado =
          !(usuarioRecuperadoDoBD.getStatus() == null
              || !usuarioRecuperadoDoBD
                  .getStatus()
                  .equals(EnumUsuarioAutenticado.USUARIO_BLOQUEADO));
      boolean ehFinalDeSemana = UtilsData.ehFinalDeSemana();
      boolean ehHorarioComercial = UtilsData.ehHorarioComercial();
      boolean ehAdm = ehAdm(usuarioRecuperadoDoBD);

      boolean usuarioPodeAcessar =
          usuarioConfere
              && ((!usuarioEstaBloqueado && !ehFinalDeSemana && ehHorarioComercial) || ehAdm);

      if (usuarioPodeAcessar) {
        log(getNomeEntidade() + " autenticado com sucesso");
      } else if (!usuarioConfere) {
        log(getNomeEntidade() + " informado com senha inválida...");
        usuarioRecuperadoDoBD.setContadorSenhaInvalida(
            usuarioRecuperadoDoBD.getContadorSenhaInvalida() + 1);
        boolean avisaUsuarioBloqueioNoProximoErro =
            (3 - usuarioRecuperadoDoBD.getContadorSenhaInvalida()) == 1;
        trataSenhaInvalidaDoUsuario(usuarioRecuperadoDoBD);

        if (avisaUsuarioBloqueioNoProximoErro) {
          throw new ErroNegocio(
              EnumUsuarioAutenticado.SENHA_INVALIDA_ULTIMA_TENTATIVA.getMensagem());
        } else {
          throw new ErroNegocio(EnumUsuarioAutenticado.SENHA_INVALIDA.getMensagem());
        }
      } else if (usuarioEstaBloqueado) {
        throw new ErroNegocio(EnumUsuarioAutenticado.USUARIO_BLOQUEADO.getMensagem());
      } else if (ehFinalDeSemana) {
        throw new ErroNegocio(EnumUsuarioAutenticado.FINAL_DE_SEMANA.getMensagem());
      } else if (!ehHorarioComercial) {
        throw new ErroNegocio(EnumUsuarioAutenticado.FORA_DO_HORARIO_COMERCIAL.getMensagem());
      }
    } else {
      log(EnumUsuarioAutenticado.USUARIO_INEXISTENTE.getMensagem());
      throw new ErroNegocio(EnumUsuarioAutenticado.USUARIO_INEXISTENTE.getMensagem());
    }
    return usuarioRecuperadoDoBD;
  }