Tenho esse cenário que vejo a necessidade de melhorar o código, fiquei na dúvida de qual padrão resolveria o problema, os que achei mais prováveis são o Chain... e State, Qual poderia ser aplicado para resolver esses problemas de if`s, se tiver o caminho das pedras é ainda melhor?
private void atualizaStatusFatura(List<Fatura> faturas) {
for (Fatura fatura : faturas) {
// se paga ou vencida não pode atualizar o status
if (fatura.getStatus() != StatusFatura.PAGA && fatura.getStatus() != StatusFatura.VENCIDA) {
// se estar aberta, só pode ir para fechada ou futura
if (fatura.getStatus() == StatusFatura.ABERTA) {
if (jaFechou(fatura.getFechamento(), fatura.getVencimento())) {
fatura.setStatus(StatusFatura.FECHADA);
faturaRepository.save(fatura);
return;
}
if (ehFutura(fatura.getAbertura())) {
fatura.setStatus(StatusFatura.FUTURA);
faturaRepository.save(fatura);
return;
}
if (jaVenceu(fatura.getVencimento())) {
fatura.setStatus(StatusFatura.VENCIDA);
faturaRepository.save(fatura);
return;
}
}
// se é fechada só pode ir para vencida
if (fatura.getStatus() == StatusFatura.FECHADA) {
if (jaVenceu(fatura.getVencimento())) {
fatura.setStatus(StatusFatura.VENCIDA);
faturaRepository.save(fatura);
return;
}
}
// se é futura só pode ir para aberta
if (fatura.getStatus() == StatusFatura.FUTURA) {
if (jaAbriu(fatura.getAbertura(), fatura.getFechamento())) {
fatura.setStatus(StatusFatura.ABERTA);
faturaRepository.save(fatura);
return;
}
}
}
}
}
private boolean ehFutura(LocalDate abertura) {
return abertura.isAfter(LocalDate.now());
}
private boolean jaAbriu(LocalDate abertura, LocalDate fechamento) {
return LocalDate.now().isAfter(abertura.minusDays(1)) && LocalDate.now().isBefore(fechamento.plusDays(1));
}
private boolean jaVenceu(LocalDate vencimento) {
return vencimento.isBefore(LocalDate.now());
}
private boolean jaFechou(LocalDate fechamento, LocalDate vencimento) {
return LocalDate.now().isAfter(fechamento.minusDays(1)) && LocalDate.now().isBefore(vencimento.plusDays(1));
}