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;
}
}