ALCHistoricalCostItemRepositoryImpl.java

package com.tradecloud.repository.hfc;

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.tradecloud.domain.common.Incoterm;
import com.tradecloud.domain.model.hfcmanagement.ALCHistoricalCostItem;
import com.tradecloud.domain.model.hfcmanagement.ProductGroup;
import com.tradecloud.domain.model.shipment.ShippingMode;
import com.tradecloud.domain.place.Country;
import com.tradecloud.domain.place.PlaceOfDischarge;
import com.tradecloud.domain.place.PlaceOfLoading;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;

@Repository(value = "alcHistoricalCostItemRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class ALCHistoricalCostItemRepositoryImpl extends RepositoryBaseImpl<ALCHistoricalCostItem, Object>
    implements ALCHistoricalCostItemRepository {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public ALCHistoricalCostItem findAlcALCHistoricalCostItem(String shipmentReference, String orderReference, String productItemReference) {
        Criteria searchCriteria = getSessionCustom().createCriteria(getPersistentClass());
        searchCriteria.add(Restrictions.eq("shipmentReference", shipmentReference));
        searchCriteria.add(Restrictions.eq("orderReference", orderReference));
        Criteria productCriteria = searchCriteria.createCriteria("product");
        productCriteria.add(Restrictions.eq("code", productItemReference));
        return (ALCHistoricalCostItem) searchCriteria.uniqueResult();
    }

    /**
     * Search for ALCHistoricalCostItems using elements that narrows down the
     * list for the purpose of calculating the historical factor.
     * 
     * 
     * @param productGroup
     * @param incoterm
     * @param shippingMode
     * @param placeOfLoading
     * @param placeOfDischarge
     * @param countryOfOrigin
     * @return
     */
    @Override
    public List<ALCHistoricalCostItem> search(ProductGroup productGroup, Incoterm incoterm, ShippingMode shippingMode, PlaceOfLoading placeOfLoading,
            PlaceOfDischarge placeOfDischarge, Country countryOfOrigin) {

        productGroup = (ProductGroup) getSessionCustom().merge(productGroup);

        Criteria criteria = getSessionCustom().createCriteria(getPersistentClass());
        criteria.add(Restrictions.eq("productGroup", productGroup));
        criteria.add(Restrictions.eq("incoterm", incoterm));
        criteria.add(Restrictions.eq("shippingMode", shippingMode));
        criteria.add(Restrictions.eq("placeOfLoading", placeOfLoading));
        criteria.add(Restrictions.eq("placeOfDischarge", placeOfDischarge));
        if (countryOfOrigin != null) {
            Criteria productCriteria = criteria.createCriteria("product");
            productCriteria.add(Restrictions.eq("countryOfOrigin", countryOfOrigin));
        }

        return criteria.list();
    }
}