Salesforce - Apex - Ordernar Lista por Data
Tags: salesforce, apex, comparable, lwc
Published: 2023-02-27 13:59:07

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tw0oehd6bzznnkb8ruer.png)

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; 
    }
  }
}
```

**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);
```

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]
```

**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]
````

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.