SalesOrderRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.dto.base.SearchBase;
import com.tradecloud.domain.model.ordermanagement.Consignment;
import com.tradecloud.domain.model.ordermanagement.SalesOrder;
import com.tradecloud.dto.order.OrderConfirmationSearchResult;
import com.tradecloud.dto.order.SalesOrderSearch;
import com.tradecloud.repository.SalesOrderRepository;
import com.tradecloud.repository.base.impl.CriteriaOperation;
import com.tradecloud.repository.base.impl.CriteriaValue;
import org.apache.commons.lang3.ObjectUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityGraph;
import java.util.Collection;
import java.util.List;

/**
 * Sales Order specific repository.
 * <p>
 * This is an empty implementation.  It's used so Spring can differentiate
 * between Purchase and Sales Order repository beans.
 */
@Repository(value = "salesOrderRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class SalesOrderRepositoryImpl extends OrderRepositoryImpl<SalesOrder, SalesOrderSearch> implements SalesOrderRepository {

    @Override
    protected Collection<CriteriaValue> mapFieldsToValues(SalesOrderSearch search) {
        String tableName = ((SearchBase) search).getTableName();
        String alias = tableName.toLowerCase() + ".";
        Collection<CriteriaValue> fields = super.mapFieldsToValues(search);

        if (search.getCustomerReference() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, alias + "customerReference", search.getCustomerReference()));
        if (search.getExportParty() != null)
            fields.add(new CriteriaValue(CriteriaOperation.EQUALS, alias + "exportParty", search.getExportParty()));
        if (search.getShippingReference() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, SALES_SHIPPING_REFERENCE, search.getShippingReference()));
        if (search.getStyleReference() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, alias + "li.stylereference", search.getStyleReference()));
        if (search.getStyleDescription() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, alias + "li.styledescription", search.getStyleDescription()));
        if (search.getItemReference() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, "li.code", search.getItemReference()));
        if (search.getItemDescription() != null)
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, "li.description", search.getItemDescription()));

        return fields;
    }

    @Override
    protected void addJoins(SalesOrderSearch search, StringBuilder sb, String alias) {
        if (ObjectUtils.anyNotNull(search.getItemDescription(), search.getItemReference(), search.getStyleDescription(), search.getStyleReference())) {
            sb.append(" join " + alias + ".lineItems li ");
        }
    }

    @Override
    public List<OrderConfirmationSearchResult> confirmationSearchTransformed(SalesOrderSearch orderSearch) {
        return null;
    }

    @Override
    public List<SalesOrder> findOrdersForLiteConsignment(Consignment consignment) {
        return null;
    }

    @Override
    protected void setOrderPlannedSettlementSpecificfields(SalesOrderSearch search, DetachedCriteria criteria) {

    }

    @Override
    protected String getEntityName() {
        return SalesOrder.class.getSimpleName();
    }

    @Override
    public SalesOrder retrieveWithConsignment(long id) {
        EntityGraph<?> graph = getCurrentSession().getEntityGraph("graph.SalesOrderConsignment");
        return (SalesOrder) getCurrentSession()
                .createQuery("SELECT o FROM SalesOrder o where o.id=:id", getPersistentClass())
                .setParameter("id", id)
                .setHint("HINT_SPEC_FETCH_GRAPH", graph)
                .setParameter("id", id)
                .uniqueResult();
    }
}