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() + "%");
        }
    }
}