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:
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.
Top comments (0)