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