EvaluationRateService.java

package com.tdmconsult.ete.evaluation;

import com.tdmconsult.ete.masterdata.EvaluationRate;
import com.tdmconsult.ete.masterdata.EvaluationRateRepository;
import com.tdmconsult.ete.masterdata.Security;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
@Slf4j
public class EvaluationRateService {

    private final EvaluationRateRepository evaluationRateRepository;

    public List<EvaluationRate> getMostRecent() {

        final var securityFiscalYearGroup = evaluationRateRepository.getSecurityFiscalYearGrouping();
        return securityFiscalYearGroup.stream().map(group ->
                findMostRecentRate(group.getSecurity(), group.getFiscalYear()))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .toList();
    }

    public List<EvaluationRate> getMostRecent(final Security security) {

        final var securityFiscalYearGroup = evaluationRateRepository.getSecurityFiscalYearGrouping(security);
        return securityFiscalYearGroup.stream().map(group ->
                        findMostRecentRate(group.getSecurity(), group.getFiscalYear()))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .toList();
    }

    public Optional<EvaluationRate> findEoyRate(final Security security, final int fiscalYear) {

        return evaluationRateRepository.findBySecurityAndFiscalYear(security, fiscalYear)
                .stream().filter(r -> r.getRateType() == EvaluationRate.RateType.EOY)
                .findFirst();
    }

    public Optional<EvaluationRate> findMostRecentRate(final Security security, final int fiscalYear) {

        final var rates = evaluationRateRepository.findBySecurityAndFiscalYear(security, fiscalYear);
        final var sorted = rates.stream().min(Comparator
                .comparing(EvaluationRate::getRateType)
                .thenComparing(Comparator.comparing((EvaluationRate r) -> r.getCreatedAt()).reversed()));
        return sorted;
    }
}