@Override
  public boolean executa(
      Tenant tenant, DaoFactory daoFactory, Ligacao ligacao, ResultadoLigacao resultadoLigacao) {
    Cliente cliente = ligacao.getDiscavel().getCliente();
    logger.info("Incrementando tentativa {}", cliente);

    TelefoneDao telefoneDao = daoFactory.getTelefoneDao();
    Telefone telefone = telefoneDao.procura(cliente.getTelefone().getId());
    telefone.incTentativa();
    telefoneDao.atualiza(telefone);
    if (tenant.getConfiguracoes().getLimiteTentativasPorTelefone()) {
      return limitaTentativasPorTelefone(tenant, daoFactory, cliente, telefoneDao);
    }

    return limitaTentativasPorCliente(tenant, daoFactory, cliente, telefoneDao, ligacao);
  }
  private boolean limitaTentativasPorTelefone(
      Tenant tenant, DaoFactory daoFactory, Cliente cliente, TelefoneDao telefoneDao) {
    int limiteTentativas = tenant.getConfiguracoes().getLimiteTentativas();
    int totalTentativas = cliente.getTelefone().getTentativa();
    if (totalTentativas < limiteTentativas) {
      logger.info(
          "Ainda nao estourou tentativas telefone {}: {} de {} {}",
          new Object[] {cliente.getTelefone(), totalTentativas, limiteTentativas, cliente});
      return true;
    }

    logger.info(
        "Finalizando por excesso de tentativas tentativas telefone {}: {} de {} {}",
        new Object[] {cliente.getTelefone(), totalTentativas, limiteTentativas, cliente});
    finalizadorCliente.finalizaPorInutilizacaoSimples(tenant, daoFactory, cliente);
    return true;
  }
  private boolean limitaTentativasPorCliente(
      Tenant tenant,
      DaoFactory daoFactory,
      Cliente cliente,
      TelefoneDao telefoneDao,
      Ligacao ligacao) {
    int limiteTentativas = tenant.getConfiguracoes().getLimiteTentativas();
    int totalTentativas =
        telefoneDao.totalTentativas(tenant.getConfiguracoes().bloqueiaCelular(), cliente);
    if (totalTentativas < limiteTentativas) {
      logger.info(
          "Ainda nao estourou tentativas cliente: {} de {} {}",
          new Object[] {totalTentativas, limiteTentativas, cliente});
      return true;
    }

    logger.info(
        "Finalizando por excesso de tentativas tentativas cliente: {} de {} {}",
        new Object[] {totalTentativas, limiteTentativas, cliente});

    MotivoFinalizacao motivoFinalizacao =
        daoFactory.getMotivoFinalizacaoDao().procura("Excesso tentativas");

    finalizadorCliente.finaliza(tenant, daoFactory, cliente, motivoFinalizacao);
    logger.info("Finalizado {}", cliente);
    notificadorCliente.notificaFinalizacao(
        tenant,
        daoFactory,
        ligacao,
        cliente,
        resultadoLigacao,
        cliente.getTelefone(),
        false,
        cliente.getMailing().getCampanha());
    return true;
  }