public String getLancamento() {
      if (lancamento == null) {
        return "[null]";
      }

      String s = "#" + lancamento.getId() + " " + lancamento.toString();

      if (s.length() > 85) {
        s = s.substring(0, 82) + "...";
      }

      return s;
    }
 public Integer getLancamentoID() {
   if (lancamento == null) {
     return null;
   } else {
     return lancamento.getId();
   }
 }
  private boolean extratoLineMatch(
      Lancamento lancto,
      ExtratoLancamentoTransaction line,
      Conta contaOrigemEsperada,
      Conta contaDestinoEsperada) {
    Calendar dataEsperada = line.getData();

    Comparator<Calendar> comparator = new TimeIgnoringComparator();

    boolean dataOk = comparator.compare(lancto.getData(), dataEsperada) == 0;

    boolean origemOk = lancto.getContaOrigem().equals(contaOrigemEsperada);
    boolean destinoOk = lancto.getContaDestino().equals(contaDestinoEsperada);
    boolean valorOk = lancto.getValor().equals(Math.abs(line.getValor()));

    return dataOk && origemOk && destinoOk && valorOk;
  }
  private void addLancamentosNaoResolvidos(
      Calendar dataAtual,
      Calendar dataProximo,
      List<Lancamento> lancamentoOrfaoList,
      List<ExtratoLineAnalyseResult> statuses) {
    TimeIgnoringComparator comparator = new TimeIgnoringComparator();

    for (Lancamento lancamento : lancamentoOrfaoList) {
      boolean isPosteriorAtual = comparator.compare(lancamento.getData(), dataAtual) >= 0;
      boolean anteriorProximo = comparator.compare(lancamento.getData(), dataProximo) < 0;
      boolean isOrfao = lancamento.getExtrato() == null;

      if (isPosteriorAtual && anteriorProximo && isOrfao) {
        ExtratoLineAnalyseResult r = new ExtratoLineAnalyseResult();

        r.setLinhaStatus(StatusLinha.DONT_APPLY);
        r.setLancamentoStatus(LancamentoStatus.DELETE);
        r.setLancamento(lancamento);

        statuses.add(r);
      }
    }
  }
  private ExtratoLineAnalyseResult syncTransactionLine(
      List<Lancamento> lancamentoSemExtratoList,
      ContaDAO contaDAO,
      ExtratoLancamentoTransaction line,
      ExtratoAnalyseSwitches switches) {
    ExtratoLineAnalyseResult result = new ExtratoLineAnalyseResult();
    result.setLinhaStatus(StatusLinha.TRANSACTION);

    Conta contaExtrato = resolveReference(contaDAO, line.getReferencia());

    if (contaExtrato == null) {
      result.setLancamentoStatus(LancamentoStatus.CONTA_NOT_FOUND);
      return result;
    }

    TimeIgnoringComparator comparator = new TimeIgnoringComparator();

    for (Lancamento lancamentoSemExtrato : lancamentoSemExtratoList) {
      // Ignora as linhas anteriores ao lancamento sem extrato
      int comparision = comparator.compare(lancamentoSemExtrato.getData(), line.getData());

      if (comparision < 0) {
        continue;
      } else if (comparision > 0) {
        // Se passou da data, sai do loop, não há correspondência
        break;
      }

      Conta contaOrigemEsperada;
      Conta contaDestinoEsperada;

      if (line.getValor() < 0) {
        // Dinheiro saiu da conta
        contaOrigemEsperada = banco;
        contaDestinoEsperada = contaExtrato;
      } else {
        // Dinheiro entrou na conta
        contaOrigemEsperada = contaExtrato;
        contaDestinoEsperada = banco;
      }

      if ((lancamentoSemExtrato.getExtrato() == null)
          && (extratoLineMatch(
              lancamentoSemExtrato, line, contaOrigemEsperada, contaDestinoEsperada))) {
        result.setLancamentoStatus(LancamentoStatus.UPDATE);

        lancamentoSemExtrato.setExtrato(line.getOrigem());

        if (switches.getRealize()) {
          lancamentoDAO.alterar(lancamentoSemExtrato);
        }

        result.setLancamento(lancamentoSemExtrato);

        return result;
      }
    }

    // Nenhum lançamento correspondente encontrado
    result.setLancamentoStatus(LancamentoStatus.NEW);

    Lancamento novoLancamento = new Lancamento();

    result.setLancamento(novoLancamento);

    novoLancamento.setData(line.getData());

    int n = (switches.getRealize() ? lancamentoDAO.getNextN(line.getData()) : -1);
    novoLancamento.setN(n);

    Conta contaOrigemEsperada;
    Conta contaDestinoEsperada;

    if (line.getValor() > 0) {
      // Dinheiro entrou da conta
      contaOrigemEsperada = contaExtrato;
      contaDestinoEsperada = banco;
    } else {
      // Dinheiro saiu na conta
      contaOrigemEsperada = banco;
      contaDestinoEsperada = contaExtrato;
    }

    novoLancamento.setContaOrigem(contaOrigemEsperada);
    novoLancamento.setContaDestino(contaDestinoEsperada);

    novoLancamento.setValor(Math.abs(line.getValor()));

    novoLancamento.setExtrato(line.getOrigem());

    if (switches.getRealize()) {
      lancamentoDAO.inserir(novoLancamento);
    }

    return result;
  }