BaseRateRepository.java
package com.tradecloud.repository.rate.impl;
import com.tradecloud.domain.costing.CostingType;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.rate.RateUnit;
import com.tradecloud.dto.rate.RateSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class BaseRateRepository<T, S> extends RepositoryBaseImpl<T, S> {
protected List<OrganisationalUnit> findApplicableOrgs(RateSearch search) {
return findApplicableOrgs(search.getOrganisationalUnit());
}
protected List<OrganisationalUnit> findApplicableOrgs(OrganisationalUnit organisationalUnit) {
List<OrganisationalUnit> toReturn = new ArrayList<OrganisationalUnit>();
if (organisationalUnit != null) {
organisationalUnit.getAllOrgUnitsUp(toReturn);
}
return toReturn;
}
protected DetachedCriteria findOrgTierCriteria(RateSearch search, DetachedCriteria rateCriteria) {
DetachedCriteria tierCriteria = null;
if (search.getOrganisationalUnit() != null) {
DetachedCriteria orgCriteria = rateCriteria.createCriteria("organisationalUnit", CriteriaSpecification.LEFT_JOIN);
tierCriteria = orgCriteria.createCriteria("tier", CriteriaSpecification.LEFT_JOIN);
}
return tierCriteria;
}
protected void setRateUnitAndCurrency(RateSearch search, DetachedCriteria criteria) {
if(search.getCostingType()== CostingType.CLC) {
RateUnit rateUnit = Optional.ofNullable(search.getRateUnit())
.orElseThrow(() -> new IllegalArgumentException(search.getCostLine() + " rateUnit is required"));
CriteriaBuilder.addDisjunction(criteria, "rateUnit", rateUnit);
if (search.getCurrency() != null) {
CriteriaBuilder.addDisjunction(criteria, "currency", search.getCurrency());
if (search.getRateUnit() != RateUnit.CURRENCY) {
throw new IllegalArgumentException(search.getCostLine() + " " + search.getRateUnit() + " is not currency based");
}
}
}
}
protected ProjectionList costingProjectionsCommon() {
return Projections.projectionList()
.add(Projections.property("id"), "id")
.add(Projections.property("costLine"), "costLine")
.add(Projections.property("currency"), "currency")
.add(Projections.property("effectiveDate"), "effectiveDate")
.add(Projections.property("rate"), "rate")
.add(Projections.property("rateUnit"), "rateUnit")
.add(Projections.property("costingType"), "costingType");
}
}