DemurrageGeneralRepositoryImpl.java

package com.tradecloud.repository.demurrage;

import com.tradecloud.domain.base.utils.DateRange;
import com.tradecloud.domain.container.ContainerType;
import com.tradecloud.domain.container.ShipmentContainer;
import com.tradecloud.domain.demurrage.OverstayAndStorageFreePeriod;
import com.tradecloud.domain.demurrage.OverstayAndStorageTransaction;
import com.tradecloud.domain.demurrage.TurnInFreePeriod;
import com.tradecloud.domain.demurrage.TurnInTransaction;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.place.Depot;
import com.tradecloud.domain.place.PlaceOfDischarge;
import com.tradecloud.dto.demurrage.DemurrageTransactionSearch;
import com.tradecloud.repository.impl.GeneralRepositoryImpl;
import org.hibernate.Query;
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 java.util.List;

@Repository(value = "demurrageGeneralRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class DemurrageGeneralRepositoryImpl extends GeneralRepositoryImpl implements DemurrageGeneralRepository {

    private static final String EFFECTIVE_DATE = "effectiveDate";
    private static final String CONTAINER_TYPE = "containerType";
    private static final String PLACE_OF_DISCHARGE = "placeOfDischarge";
    private static final String TURN_IN_DEPOT = "turnInDepot";
    private static final String CARRIER = "carrier";

    @Override
    public List<OverstayAndStorageFreePeriod> searchOverstayAndStorageFreePeriod(DateRange dateRange, ContainerType containerType,
                                                                                 PlaceOfDischarge placeOfDischarge) {

        DetachedCriteria criteria = DetachedCriteria.forClass(OverstayAndStorageFreePeriod.class);
        if (dateRange != null) {
            CriteriaBuilder.addDateRangeCriteria(criteria, EFFECTIVE_DATE, dateRange);
        }
        if (containerType != null) {
            CriteriaBuilder.addEqRestriction(criteria, CONTAINER_TYPE, containerType);
        }
        if (placeOfDischarge != null) {
            CriteriaBuilder.addEqRestriction(criteria, PLACE_OF_DISCHARGE, placeOfDischarge);
        }

        return getExecutableCriteriaList(criteria, OverstayAndStorageFreePeriod.class);
    }

    @Override
    public List<TurnInFreePeriod> searchTurnInFreePeriod(DateRange dateRange, ContainerType containerType, Depot turnInDepot,
                                                         ServiceProvider carrier) {

        DetachedCriteria criteria = DetachedCriteria.forClass(TurnInFreePeriod.class);
        CriteriaBuilder.addDateRangeCriteria(criteria, EFFECTIVE_DATE, dateRange);
        CriteriaBuilder.addEqRestriction(criteria, CONTAINER_TYPE, containerType);
        CriteriaBuilder.addEqRestriction(criteria, TURN_IN_DEPOT, turnInDepot);
        CriteriaBuilder.addEqRestriction(criteria, CARRIER, carrier);

        return getExecutableCriteriaList(criteria, TurnInFreePeriod.class);
    }

    @Override
    public List<OverstayAndStorageTransaction> searchOverstayAndStorageTransaction(DemurrageTransactionSearch search) {
        String queryString = "from OverstayAndStorageTransaction where active = :activeStatus";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("activeStatus", true);
        return (List<OverstayAndStorageTransaction>) query.list();
    }

    @Override
    public List<TurnInTransaction> searchTurnInTransaction(DemurrageTransactionSearch search) {
        String queryString = "from TurnInTransaction where active = :activeStatus";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("activeStatus", true);
        return (List<TurnInTransaction>) query.list();
    }

    @Override
    public OverstayAndStorageTransaction findOverstayAndStorageTransaction(ShipmentContainer container) {
        String queryString = "from OverstayAndStorageTransaction where shipmentContainer.id = :containerId";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("containerId", container.getId());
        return (OverstayAndStorageTransaction) query.uniqueResult();
    }

    @Override
    public TurnInTransaction findTurnInTransaction(ShipmentContainer container) {
        String queryString = "from TurnInTransaction where shipmentContainer.id = :containerId";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("containerId", container.getId());
        return (TurnInTransaction) query.uniqueResult();
    }
}