CreditorBillingTransactionRepositoryImpl.java

package com.tradecloud.repository.creditorbilling.impl;

import com.tradecloud.domain.base.utils.DateUtils;
import com.tradecloud.domain.container.ShipmentContainer;
import com.tradecloud.domain.creditorbilling.rule.CreditorBillingRule;
import com.tradecloud.domain.creditorbilling.transaction.CreditorBillingEffectiveDateConfig;
import com.tradecloud.domain.creditorbilling.transaction.CreditorBillingTransaction;
import com.tradecloud.domain.creditorbilling.transaction.CreditorBillingTransactionState;
import com.tradecloud.domain.shipment.SeaShipment;
import com.tradecloud.dto.creditorbilling.CreditorBillingTransactionSearch;
import com.tradecloud.repository.GeneralRepository;
import com.tradecloud.repository.base.impl.CriteriaOperation;
import com.tradecloud.repository.base.impl.CriteriaValue;
import com.tradecloud.repository.base.impl.CriteriaValueUtils;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import com.tradecloud.repository.creditorbilling.CreditorBillingTransactionRepository;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import org.hibernate.Query;
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;

@Repository(value = "creditorBillingTransactionRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CreditorBillingTransactionRepositoryImpl extends RepositoryBaseImpl<CreditorBillingTransaction, CreditorBillingTransactionSearch>
        implements CreditorBillingTransactionRepository {

    @Autowired
    private GeneralRepository generalRepository;

    private static final String BILL_NUMBER = "billNumber";
    private static final String CONTAINER_REFERENCE = "containerReference";
    private static final String CARRIER = "carrier";
    private static final String FREIGHT_FORWARDER = "shippingInfo.freightForwarder";
    private static final String STATE = "state";
    private static final String TRANSACTION_TYPE = "creditorBillingTransactionType";
    private static final String COUNTERPARTY_ROLE = "creditorBillingRule.counterPartyRole";
    private static final String IS_REVERSAL = "isReversal";
    private static final String BILL_OF_LADING_DATE = "billOfLadingDate";
    private static final String ACTUAL_DATE_DEPARTURE = "actualDateOfDeparture";
    private static final String CREATED_DATE = "created";
    private static final String SIGNED_OFF_DATE = "signedOffDate";
    private static final String SETTLEMENT_DATE = "settlementDate";
    private static final String DELETED_DATE = "deletedDate";
    private static final String SHIPMENT_REFERENCE = "shipmentReference";

    private static final String INCOTERM = "shippingInfo.incoterm";
    private static final String CONTAINER_TYPE = "transactionContainer.containerType";

    @Override
    public List<CreditorBillingEffectiveDateConfig> findCreditorBillDatesConfig() {
        return generalRepository.findAll(CreditorBillingEffectiveDateConfig.class);
    }

    @Override
    public List<CreditorBillingTransaction> findByShipmentContainer(ShipmentContainer shipmentContainer) {
        Query query = getSessionCustom().getNamedQuery("cbtransaction.findByContainer");
        query.setParameter("container", shipmentContainer);
        return (List<CreditorBillingTransaction>)query.list();
    }

    @Override
    public List<CreditorBillingTransaction> findByShipmentContainerIncludeReversal(ShipmentContainer shipmentContainer) {
        Query query = getSessionCustom().getNamedQuery("cbtransactionIncReversal.findByContainer");
        query.setParameter("container", shipmentContainer);
        return (List<CreditorBillingTransaction>)query.list();
    }

    @Override
    public long countByShipmentContainer(ShipmentContainer shipmentContainer) {
        Query query = getSessionCustom().getNamedQuery("cbtransaction.countByContainer");
        query.setParameter("container", shipmentContainer);
        return (Long)query.uniqueResult();
    }

    @Override
    public List<CreditorBillingTransaction> findAllBySeaShipment(SeaShipment seaShipment) {
        Query query = getSessionCustom().getNamedQuery("cbtransaction.findByShipment");
        query.setParameter("shipment", seaShipment);
        return Collections.checkedList(query.list(), CreditorBillingTransaction.class) ;
    }

    @Override
    public List<CreditorBillingTransaction> findAllByState(CreditorBillingTransactionState creditorBillingTransactionState) {
//        String queryString = "from CreditorBillingTransaction b where b.state = :state and b.isReversal = false";
        String queryString = "from CreditorBillingTransaction b where b.state = :state";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("state", creditorBillingTransactionState);
        return (List<CreditorBillingTransaction>)query.list();
    }

    @Override
    public List<CreditorBillingTransaction> search(CreditorBillingTransactionSearch search) {
        Query query = createQuery(search, false, mapFieldsToValues(search));
        return getQueryList(query, search.getSearchMetaParams());
    }

    @Override
    public long count(CreditorBillingTransactionSearch search) {
        Query query = createQuery(search, true, mapFieldsToValues(search));
        return getQueryCount(query);
    }

    @Override
    public CreditorBillingTransaction findByCreditorBillingRule(CreditorBillingRule creditorBillingRule) {
//        String queryString = "from CreditorBillingTransaction b where b.creditorBillingRule.id = :creditorBillingRuleId and b.isReversal = false";
        String queryString = "from CreditorBillingTransaction b where b.creditorBillingRule.id = :creditorBillingRuleId";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("creditorBillingRuleId", creditorBillingRule.getId());
        return (CreditorBillingTransaction)query.uniqueResult();
    }

    @Override
    protected Collection<CriteriaValue> mapFieldsToValues(CreditorBillingTransactionSearch search) {
        Collection<CriteriaValue> fields = new LinkedHashSet<CriteriaValue>();

        if(search.getSearchMetaParams() != null) {
            search.getSearchMetaParams().setOrderBy("date(created) desc, containerreference," + SHIPMENT_REFERENCE);
        }

        fields.add(CriteriaValue.eq(BILL_NUMBER, search.getBillNumber()));
    //    fields.add(CriteriaValue.like("containerReference", search.getContainerReference()));
        fields.add(new CriteriaValue(CriteriaOperation.LIKE, CONTAINER_REFERENCE, search.getContainerReference()));
        fields.add(CriteriaValue.eq(CARRIER, search.getCarrier()));
        fields.add(CriteriaValue.eq(FREIGHT_FORWARDER, search.getFreightForwarder()));

        fields.add(CriteriaValue.eq(INCOTERM, search.getIncoterm()));
        fields.add(CriteriaValue.eq(CONTAINER_TYPE, search.getContainerType()));

        CriteriaValueUtils.addEqActiveStateCriteriaValue(fields, STATE, search.getStatus(), CreditorBillingTransactionState.DELETED);

//        //TTG-1497
//        if (search.getStatus() != null) {
//            if (!search.getStatus().equals(CreditorBillingTransactionState.DELETED)) {
//                fields.add(CriteriaValue.eq(STATE, search.getStatus()));
//           //     fields.add(CriteriaValue.notIn(STATE, new Object[]{CreditorBillingTransactionState.DELETED}));
//            } else {
//                fields.add(CriteriaValue.eq(STATE, search.getStatus()));
//            }
//        } else {
//            fields.add(CriteriaValue.notIn(STATE, new Object[]{CreditorBillingTransactionState.DELETED}));
//        }

        fields.add(CriteriaValue.eq(TRANSACTION_TYPE, search.getTransactionType()));
        fields.add(CriteriaValue.eq(COUNTERPARTY_ROLE, search.getCounterPartyType()));
//        fields.add(CriteriaValue.eq(IS_REVERSAL, false));

        CriteriaValueUtils.addDateRangeCriteriaValue(fields, BILL_OF_LADING_DATE, search.getBillOfLadingDateRange());
        //fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, "billOfLadingDate", search.getBillOfLadingDateRange().getFrom()));
        //fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, "billOfLadingDate", search.getBillOfLadingDateRange().getTo()));

        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, ACTUAL_DATE_DEPARTURE,
                search.getActualDepartureDateRange().getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, ACTUAL_DATE_DEPARTURE,
            formatToDate(search.getActualDepartureDateRange().getTo())));

        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, CREATED_DATE, search.getCreatedDateRange().getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, CREATED_DATE, formatToDate(search.getCreatedDateRange().getTo())));

        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, SIGNED_OFF_DATE, search.getSignedOffDateRange().getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, SIGNED_OFF_DATE, formatToDate(search.getSignedOffDateRange().getTo())));

        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN,SETTLEMENT_DATE, search.getSettledDateRange().getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, SETTLEMENT_DATE, formatToDate(search.getSettledDateRange().getTo())));

        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, DELETED_DATE, search.getDeletedDateRange().getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, DELETED_DATE, formatToDate(search.getDeletedDateRange().getTo())));

        return fields;
    }

    @Override
    public Long countReversalTransactions() {
        String queryString = "SELECT count(cbt) FROM CreditorBillingTransaction cbt WHERE cbt.isReversal = true";
        Query query = getSessionCustom().createQuery(queryString);
        return (Long)query.uniqueResult();
    }

    @Override
    public List<CreditorBillingTransaction> findAllByBillNumber(String billNumber) {
        String queryString = "FROM CreditorBillingTransaction cbt where cbt.billNumber = :billNumber";
        Query query = getSessionCustom().createQuery(queryString);
        query.setParameter("billNumber", billNumber);
        return (List<CreditorBillingTransaction>)query.list();
    }

    @Override
    public List<String> findTransactionComments(CreditorBillingTransaction cbTransaction) {
        String query = "SELECT reason FROM cbtransaction_freetextcomments WHERE cbtransaction_id = :transactionId ORDER BY reason ASC";
        @SuppressWarnings("unchecked")
        List<String> results =
                getSession()
                .createSQLQuery(query).setParameter("transactionId", cbTransaction.getId()).list();
        return results;
    }

    private Date formatToDate(Date date) {
        if(date != null) {
            return DateUtils.addDays(date, 1);
        }

        return date;
    }

}