CostingDocumentRepositoryImpl.java
package com.tradecloud.repository.costingdocument.impl;
import com.tradecloud.domain.base.utils.DateRange;
import com.tradecloud.domain.document.Document;
import com.tradecloud.domain.document.DocumentState;
import com.tradecloud.domain.document.DocumentType;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.dto.invoice.CostingDocumentSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import com.tradecloud.repository.costingdocument.CostingDocumentRepository;
import com.tradecloud.repository.helper.DocumentSearchHelper;
import org.apache.commons.collections.CollectionUtils;
import org.hibernate.Query;
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.*;
@Repository(value = "costingDocumentRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CostingDocumentRepositoryImpl extends RepositoryBaseImpl<Document, CostingDocumentSearch>
implements CostingDocumentRepository {
@Override
public List<Document> search(CostingDocumentSearch search) {
List<Document> documentList = null;
String queryString = null;
Set<OrganisationalUnit> organisationalUnits = getOrganisationalUnits(search);
queryString = DocumentSearchHelper.getQuery(search, false, organisationalUnits);
Query query = getSessionCustom().createQuery(queryString);
setQueryFilter(search, query, organisationalUnits);
initQueryParams(query, search.getSearchMetaParams());
documentList = query.list();
return documentList;
}
@Override
public long count(CostingDocumentSearch search) {
String queryString = null;
Set<OrganisationalUnit> organisationalUnits = getOrganisationalUnits(search);
queryString = DocumentSearchHelper.getQuery(search, true, organisationalUnits);
Query query = getSessionCustom().createQuery(queryString);
setQueryFilter(search, query, organisationalUnits);
Object o = query.uniqueResult();
if (o != null) {
return (long) o;
}
return 0;
}
private Set<OrganisationalUnit> getOrganisationalUnits(CostingDocumentSearch search) {
Set<OrganisationalUnit> organisationalUnits = Collections.EMPTY_SET;
if (search.isFilteredByUserOrg()) {
organisationalUnits = getUserOrganisationalUnits();
} else if (search.getOrganisationalUnit() != null) {
organisationalUnits = Collections.singleton(search.getOrganisationalUnit());
} else if (!CollectionUtils.isEmpty(search.getOrganisationalUnits())) {
organisationalUnits = new HashSet<>(search.getOrganisationalUnits());
}
return organisationalUnits;
}
private void setQueryFilter(CostingDocumentSearch search, Query query, Set<OrganisationalUnit> organisationalUnits) {
if (search.getExportParty() != null &&
(DocumentType.COMMERCIAL_INVOICE.equals(search.getDocumentType()) ||
DocumentType.COMMERCIAL_INVOICE.equals(search.getDocumentType()))) {
query.setParameter("exportParty", search.getExportParty());
}
query.setParameter("imports", search.isImports());
if (search.getCreditors() != null && !search.getCreditors().isEmpty()) {
query.setParameterList("suppliers", search.getCreditors());
}
if (search.getShipmentReference() != null) {
query.setParameter("shipmentReference", "%" + search.getShipmentReference().toLowerCase() + "%");
}
if (search.getShipmentNumber() != null) {
query.setParameter("shipmentNumber", "%" + search.getShipmentNumber().toLowerCase() + "%");
}
if (search.getCurrency() != null) {
query.setParameter("currency", search.getCurrency());
}
DateRange dt = search.getInvoiceDate();
if (!dt.isEmpty()) {
if (dt.getFrom() != null && dt.getTo() != null) {
query.setParameter("invfrom", dt.getFrom());
query.setParameter("invto", dt.getTo());
} else if (dt.getFrom() != null) {
query.setParameter("invfrom", dt.getFrom());
} else if (dt.getTo() != null) {
query.setParameter("invto", dt.getTo());
}
}
DateRange signOffDate = search.getSignOffDateRange();
if (!signOffDate.isEmpty()) {
if (signOffDate.getFrom() != null && signOffDate.getTo() != null) {
query.setParameter("invSignOffFrom", signOffDate.getFrom());
query.setParameter("invSignOffTo", signOffDate.getTo());
} else if (signOffDate.getFrom() != null) {
query.setParameter("invSignOffFrom", signOffDate.getFrom());
} else if (signOffDate.getTo() != null) {
query.setParameter("invSignOffTo", signOffDate.getTo());
}
}
if (search.getDateRange().getFrom() != null) {
query.setParameter("from", search.getDateRange().getFrom());
}
if (search.getReference() != null) {
query.setParameter("reference", "%" + search.getReference().toLowerCase() + "%");
}
if (search.getDateRange().getTo() != null) {
query.setParameter("to", search.getDateRange().getTo());
}
if (search.getStates() != null && !search.getStates().isEmpty()) {
List states = search.getStates();
List<DocumentState> documentStates = new ArrayList<>();
for (Object state : states) {
if (state instanceof DocumentState documentState) {
documentStates.add(documentState);
}
if (state instanceof String documentState) {
documentStates.add(DocumentState.valueOf(documentState));
}
}
query.setParameterList("states", documentStates);
}
if (!organisationalUnits.isEmpty()) {
query.setParameterList("organisationalUnit", organisationalUnits);
}
Optional.ofNullable(search.getInvoiceNumber()).ifPresent(s -> {
query.setParameter("number", "%" + search.getInvoiceNumber().toLowerCase() + "%");
});
DateRange settlementDate = search.getSettlementDate();
if (!settlementDate.isEmpty()) {
if (settlementDate.getFrom() != null) {
query.setParameter("settlementDateFrom", settlementDate.getFrom());
}
if (settlementDate.getTo() != null) {
query.setParameter("settlementDateTo", settlementDate.getTo());
}
}
if (search.getAdditionalReference() != null) {
query.setParameter("additionalReference", "%" + search.getAdditionalReference().toLowerCase() + "%");
}
}
}