DEV Community

Lucas Valhos
Lucas Valhos

Posted on

1

Salesforce - Apex - Ordernar Lista por Data

E aí pessoal, tudo bem?

Hoje falaremos sobre como ordenar uma lista no Apex por data. Este post foi baseado em uma situação ocorrida em nosso trabalho, onde precisávamos descobrir qual seria o maior intervalo de meses entre as séries de pagamento de um cliente.

O cliente realizava a compra de um imóvel, com o pagamento parcelado de diferentes formas. A tabela abaixo ilustra as séries de pagamento:

Tabela Comparativa das séries de pagamento

Surgiu a necessidade de apurar qual seria o intervalo de meses em que o cliente não realizaria nenhum pagamento. Por exemplo, se a entrada do pagamento é no mês 07/2020 e as parcelas mensais iniciam apenas em 01/2021, temos um intervalo de 5 meses sem pagamento.

Foi criada então uma linha do tempo com todos os meses que possuíam parcelas a serem pagas. Porém, como a geração das parcelas é feita por série de pagamento, os meses não ficavam na ordem sequencial. Surgiu a necessidade de reordenar a lista inteira de forma sequencial.

Foi então utilizado o método Comparable - Ver na documentação do salesforce - que permite sobrescrever o método sort da lista, definindo assim qual seria a ordem que deveria ser obedecida para ordenar os registros.

No código abaixo, criamos uma classe que recebe a lista com as datas para reordenar no método findInterval, que, por sua vez, inicia uma lista da classe PaymentsTimeline que implementa o Comparable.

public class AnyService {

  public static void findInterval(List<Date> paymentDates){

    List<PaymentsTimeline> payments = new List<PaymentsTimeline>();

    for(Date d : paymentDates){
      PaymentsTimeline pt = new PaymentsTimeline();
      pt.paymentDate = d;
      payments.add(pt);
    }

    System.debug(payments);

    payments.sort();

    System.debug(payments);

  }

  public class PaymentsTimeline implements Comparable {
    Date paymentDate;

    public Integer compareTo(Object instance) {
        PaymentsTimeline that = (PaymentsTimeline) instance;
        if (this.paymentDate < that.paymentDate) return -1;
        if (this.paymentDate > that.paymentDate) return 1;
        return 0; 
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Testando

Para testar, foi executado o código abaixo no modo de execução anônima de código do Developer Console, com a opção "Open Log" marcada para visualizar as linhas de depuração que foram configuradas na classe:

List<Date> dates = new List<Date>();

dates.add(Date.newInstance(2022,07,15));
dates.add(Date.newInstance(2021,02,15));
dates.add(Date.newInstance(2020,05,15));
dates.add(Date.newInstance(2016,12,15));
dates.add(Date.newInstance(2024,08,15));
dates.add(Date.newInstance(2022,06,15));

AnyService.findInterval(dates);
Enter fullscreen mode Exit fullscreen mode

Observe que as datas estão totalmente aleatórias e sem nenhuma linearidade em relação ao tempo.

A seguir, apresentamos os resultados do log:

Linha 1 - Antes da ordenação - Datas na ordem que foram enviadas

DEBUG

PaymentsTimeline:[paymentDate=2022-07-15 00:00:00],
PaymentsTimeline:[paymentDate=2021-02-15 00:00:00],
PaymentsTimeline:[paymentDate=2020-05-15 00:00:00],
PaymentsTimeline:[paymentDate=2016-12-15 00:00:00],
PaymentsTimeline:[paymentDate=2024-08-15 00:00:00],
PaymentsTimeline:[paymentDate=2022-06-15 00:00:00]
Enter fullscreen mode Exit fullscreen mode

Linha 2 - Após a ordenação - Datas ordenadas corretamente

DEBUG
PaymentsTimeline:[paymentDate=2016-12-15 00:00:00],
PaymentsTimeline:[paymentDate=2020-05-15 00:00:00],
PaymentsTimeline:[paymentDate=2021-02-15 00:00:00],
PaymentsTimeline:[paymentDate=2022-06-15 00:00:00],
PaymentsTimeline:[paymentDate=2022-07-15 00:00:00],
PaymentsTimeline:[paymentDate=2024-08-15 00:00:00]
Enter fullscreen mode Exit fullscreen mode


`

E é isso, se você ainda não conhecia, agora conhece uma forma interessante de ordenar listas de diferentes maneiras utilizando o Comparable.

Um grande abraço e até a próxima.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay