ForecastRepositoryImpl.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tradecloud.repository.impl;

import com.tradecloud.domain.base.utils.DateRange;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.model.Forecast;
import com.tradecloud.domain.model.ForexGroup;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.dto.treasury.DefaultDTO;
import com.tradecloud.dto.treasury.ForecastSearchDTO;
import com.tradecloud.repository.ForecastRepository;
import com.tradecloud.repository.GeneralRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.log4j.Logger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.List;

@Repository(value = "forecastRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class ForecastRepositoryImpl extends RepositoryBaseImpl<Forecast, Object> implements ForecastRepository {

    private static Logger log = Logger.getLogger(ForecastRepositoryImpl.class);
    @Autowired
    private GeneralRepository generalRepository;

    @Override
    public List<Forecast>
            findAllByFields(Date date, Currency currency, OrganisationalUnit organisationalUnit, String supplier, ForexGroup forexGroup) {
        DetachedCriteria criteria = DetachedCriteria.forClass(Forecast.class);
        log.debug("Finding forecasts with date '" + date + "', currency '" + currency + "', organisationalUnit '" + organisationalUnit
                + "', supplier '" + supplier + "'.");

        if (date != null) {
            criteria.add(Restrictions.eq("forecastDate", date));
        }
        if (currency != null) {
            criteria.add(Restrictions.eq("amount.currency", currency));
        }
        if (organisationalUnit != null) {
            criteria.add(Restrictions.eq("organisationalUnit", organisationalUnit));
        }
        if (forexGroup != null) {
            criteria.add(Restrictions.eq("forexGroup", forexGroup));
        }

        log.debug("Finding forecasts with criteria '" + criteria + "'.");
        return (List<Forecast>) findByCriteria(criteria);
    }

    @Override
    public List<Forecast> findMatching(List<OrganisationalUnit> organisationalUnits, Currency currency,  DateRange dateRange,
            ForexGroup forexGroup) {
        DetachedCriteria criteria = pageSearchCriteria(organisationalUnits, currency, dateRange.getFrom(), dateRange.getTo(), forexGroup);
        log.debug("Finding forecasts with criteria '" + criteria + "'.");
        return (List<Forecast>) findByCriteria(criteria);
    }

    private DetachedCriteria pageSearchCriteria(List<OrganisationalUnit> organisationalUnits, Currency currency, Date forecastDateFrom,
            Date forecastDateTo, ForexGroup forexGroup) {
        DetachedCriteria criteria = DetachedCriteria.forClass(Forecast.class);

        if (organisationalUnits != null && !organisationalUnits.isEmpty()) {
            criteria.add(Restrictions.in("organisationalUnit", organisationalUnits));
        }
        if (forexGroup != null) {
            criteria.add(Restrictions.eq("forexGroup", forexGroup));
        }
        if (currency != null) {
            criteria.add(Restrictions.eq("amount.currency", currency));
        }
        if (forecastDateFrom != null || forecastDateTo != null) {
            CriteriaBuilder.addDateRangeCriteria(criteria, "forecastDate", forecastDateFrom, forecastDateTo);
        }
        return criteria;
    }

    public void store(Forecast forecast) {
        saveOrUpdate(forecast);
        flush();
    }

    @Override
    public long count(ForecastSearchDTO search) {
        DetachedCriteria criteria = getDetachedCriteria(search);
        return getExecutableCriteriaCount(criteria);
    }

    @Override
    public List<Forecast> search(ForecastSearchDTO search) {
        DetachedCriteria criteria = getDetachedCriteria(search);
        return getExecutableCriteriaList(criteria, search.getSearchMetaParams());
    }

    private DetachedCriteria getDetachedCriteria(ForecastSearchDTO search) {
        DefaultDTO organisationalUnit1 = search.getOrganisationalUnit();
        List<OrganisationalUnit> organisationalUnit = organisationalUnit1 != null ?
                Collections.singletonList(generalRepository.retrieve(OrganisationalUnit.class, organisationalUnit1.getId())) : null;
        DefaultDTO forexGroup1 = search.getForexGroup();
        ForexGroup forexGroup = forexGroup1 != null ? generalRepository.retrieve(ForexGroup.class, forexGroup1.getId()) : null;
        Currency currency = search.getCurrency() != null ? Currency.getInstance(search.getCurrency().getCode()) : null;
        DateRange forecastMaturityDate = search.getForecastMaturityDate();
        return pageSearchCriteria(organisationalUnit, currency, forecastMaturityDate.getFrom(), forecastMaturityDate.getTo(),
                forexGroup);
    }
}