/*
* @(#)SearchPaymentProcess.java
*
* Copyright 2009 Instituto Superior Tecnico
* Founding Authors: Luis Cruz, Nuno Ochoa, Paulo Abrantes
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the Expenditure Tracking Module.
*
* The Expenditure Tracking Module is free software: you can
* redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation, either version
* 3 of the License, or (at your option) any later version.
*
* The Expenditure Tracking Module is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Expenditure Tracking Module. If not, see <http://www.gnu.org/licenses/>.
*
*/
package pt.ist.expenditureTrackingSystem.domain.acquisitions.search;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.SavedSearch;
import pt.ist.expenditureTrackingSystem.domain.Search;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.AcquisitionProcessStateType;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.CPVReference;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcess;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.PaymentProcessYear;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.RefundProcessStateType;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.afterthefact.AfterTheFactAcquisitionProcess;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.refund.RefundProcess;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.predicates.DefaultPredicate;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.predicates.RefundProcessPredicate;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.predicates.SearchPredicate;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.search.predicates.SimplifiedAcquisitionPredicate;
import pt.ist.expenditureTrackingSystem.domain.acquisitions.simplified.SimplifiedProcedureProcess;
import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit;
import pt.ist.expenditureTrackingSystem.domain.organization.Person;
import pt.ist.expenditureTrackingSystem.domain.organization.Supplier;
import pt.ist.expenditureTrackingSystem.domain.organization.Unit;
import pt.ist.expenditureTrackingSystem.domain.processes.GenericProcess;
/**
*
* @author Pedro Santos
* @author Shezad Anavarali
* @author Paulo Abrantes
* @author Luis Cruz
*
*/
public class SearchPaymentProcess extends Search<PaymentProcess> {
private SavedSearch savedSearch;
private SearchProcessValues searchProcess;
private String processId;
private String requestDocumentId;
private Person requestingPerson;
private Person taker;
private Person accountManager;
private Unit requestingUnit;
private Unit payingUnit;
private AcquisitionProcessStateType acquisitionProcessStateType;
private RefundProcessStateType refundProcessStateType;
private Supplier supplier;
private String proposalId;
private AccountingUnit accountingUnit;
private Boolean hasAvailableAndAccessibleActivityForUser = Boolean.TRUE;
private Boolean responsibleUnitSetOnly = Boolean.FALSE;
private Boolean showOnlyAcquisitionsExcludedFromSupplierLimit = Boolean.FALSE;
private Boolean showOnlyAcquisitionsWithAdditionalCosts = Boolean.FALSE;
private Boolean showOnlyWithUnreadComments = Boolean.FALSE;
private String refundeeName;
private PaymentProcessYear year;
private Boolean showPriorityOnly = Boolean.FALSE;
private CPVReference cpvReference;
private final static Map<Class<? extends PaymentProcess>, SearchPredicate> predicateMap =
new HashMap<Class<? extends PaymentProcess>, SearchPredicate>();
private final static SearchPredicate defaultPredicate = new DefaultPredicate();
static {
predicateMap.put(SimplifiedProcedureProcess.class, new SimplifiedAcquisitionPredicate());
predicateMap.put(RefundProcess.class, new RefundProcessPredicate());
predicateMap.put(AfterTheFactAcquisitionProcess.class, new AfterTheFactPredicate());
}
public SearchPaymentProcess() {
setRequestingPerson(null);
setRequestingUnit(null);
setPayingUnit(null);
setSupplier(null);
setAccountingUnit(null);
setSavedSearch(null);
setPaymentProcessYear(null);
setTaker(null);
setCpvReference(null);
}
public SearchPaymentProcess(SavedSearch savedSearch) {
setProcessId(savedSearch.getProcessId());
setRequestDocumentId(savedSearch.getRequestDocumentId());
setRequestingPerson(savedSearch.getRequestor());
setRequestingUnit(savedSearch.getUnit());
setPayingUnit(savedSearch.getPayingUnit());
setAcquisitionProcessStateType(savedSearch.getAcquisitionProcessStateType());
setRefundProcessStateType(savedSearch.getRefundProcessStateType());
setSupplier(savedSearch.getSupplier());
setProposalId(savedSearch.getProposalId());
setAccountingUnit(savedSearch.getAccountingUnit());
setHasAvailableAndAccessibleActivityForUser(savedSearch.getPendingOperations());
setResponsibleUnitSetOnly(savedSearch.getShowOnlyResponsabilities());
setShowOnlyAcquisitionsExcludedFromSupplierLimit(savedSearch.getShowOnlyAcquisitionsExcludedFromSupplierLimit());
setShowOnlyAcquisitionsWithAdditionalCosts(savedSearch.getShowOnlyAcquisitionsWithAdditionalCosts());
setSavedSearch(savedSearch);
setPaymentProcessYear(savedSearch.getYear());
setTaker(savedSearch.getTakenBy());
setAccountManager(savedSearch.getAccountManager());
final Boolean showOnlyWithUnreadComments = savedSearch.getShowOnlyWithUnreadComments();
setShowOnlyWithUnreadComments(showOnlyWithUnreadComments == null ? Boolean.FALSE : showOnlyWithUnreadComments);
setShowPriorityOnly(savedSearch.getShowPriorityOnly());
setSearchProcess(savedSearch.getSearchProcessValues());
setCpvReference(savedSearch.getCpvReference());
}
@Override
public Set<PaymentProcess> search() {
try {
return new SearchResult(getProcesses());
} catch (Exception ex) {
ex.printStackTrace();
throw new Error(ex);
}
}
public boolean isSearchObjectAvailable() {
return getSavedSearch() != null;
}
private class SearchResult extends SearchResultSet<PaymentProcess> {
public SearchResult(Collection<? extends PaymentProcess> c) {
super(c);
}
@Override
protected boolean matchesSearchCriteria(PaymentProcess process) {
Class clazz = getSearchClass();
return (clazz == null || process.getClass().equals(getSearchClass()))
&& getPredicateFor(process.getClass()).evaluate(process, SearchPaymentProcess.this);
}
}
private SearchPredicate getPredicateFor(Class<? extends PaymentProcess> clazz) {
SearchPredicate predicate = predicateMap.get(clazz);
return predicate == null ? defaultPredicate : predicate;
}
private Class<? extends PaymentProcess> getProcessClass() {
Class<? extends PaymentProcess> clazz = getSearchClass();
return clazz == null ? PaymentProcess.class : clazz;
}
private Set<? extends PaymentProcess> getProcesses() {
return (responsibleUnitSetOnly && !personBelongsToAcquisitionCentral() ? GenericProcess.getProcessesWithResponsible(
getSearchClass(), Person.getLoggedPerson(), getPaymentProcessYear()) : GenericProcess.getAllProcesses(
getProcessClass(), getPaymentProcessYear()));
}
private boolean personBelongsToAcquisitionCentral() {
return ExpenditureTrackingSystem.isAcquisitionCentralGroupMember()
|| ExpenditureTrackingSystem.isAcquisitionCentralManagerGroupMember();
}
@Override
protected void persist(String name) {
new SavedSearch(name, Person.getLoggedPerson(), this);
}
public SearchProcessValues getSearchProcess() {
return searchProcess;
}
public void setSearchProcess(SearchProcessValues searchProcess) {
this.searchProcess = searchProcess;
}
public String getProcessId() {
return processId;
}
public void setProcessId(String processId) {
this.processId = processId != null ? processId.trim() : processId;
}
public String getRequestDocumentId() {
return requestDocumentId;
}
public void setRequestDocumentId(String requestDocumentId) {
this.requestDocumentId = requestDocumentId;
}
public Person getRequestingPerson() {
return requestingPerson;
}
public void setRequestingPerson(Person requestingPerson) {
this.requestingPerson = requestingPerson;
}
public Unit getRequestingUnit() {
return requestingUnit;
}
public void setRequestingUnit(Unit requestingUnit) {
this.requestingUnit = requestingUnit;
}
public Unit getPayingUnit() {
return payingUnit;
}
public void setPayingUnit(final Unit payingUnit) {
this.payingUnit = payingUnit;
}
public AcquisitionProcessStateType getAcquisitionProcessStateType() {
return acquisitionProcessStateType;
}
public void setAcquisitionProcessStateType(AcquisitionProcessStateType acquisitionProcessStateType) {
this.acquisitionProcessStateType = acquisitionProcessStateType;
}
public RefundProcessStateType getRefundProcessStateType() {
return refundProcessStateType;
}
public void setRefundProcessStateType(RefundProcessStateType refundProcessStateType) {
this.refundProcessStateType = refundProcessStateType;
}
public Supplier getSupplier() {
return supplier;
}
public void setSupplier(Supplier supplier) {
this.supplier = supplier;
}
public String getProposalId() {
return proposalId;
}
public void setProposalId(String proposalId) {
this.proposalId = proposalId;
}
public AccountingUnit getAccountingUnit() {
return accountingUnit;
}
public void setAccountingUnit(AccountingUnit accountingUnit) {
this.accountingUnit = accountingUnit;
}
public Boolean getHasAvailableAndAccessibleActivityForUser() {
return hasAvailableAndAccessibleActivityForUser;
}
public void setHasAvailableAndAccessibleActivityForUser(Boolean hasAvailableAndAccessibleActivityForUser) {
this.hasAvailableAndAccessibleActivityForUser = hasAvailableAndAccessibleActivityForUser;
}
public Boolean getResponsibleUnitSetOnly() {
return responsibleUnitSetOnly;
}
public void setResponsibleUnitSetOnly(Boolean responsibleUnitSetOnly) {
this.responsibleUnitSetOnly = responsibleUnitSetOnly;
}
public Boolean getShowOnlyAcquisitionsExcludedFromSupplierLimit() {
return showOnlyAcquisitionsExcludedFromSupplierLimit;
}
public void setShowOnlyAcquisitionsExcludedFromSupplierLimit(Boolean showOnlyAcquisitionsExcludedFromSupplierLimit) {
this.showOnlyAcquisitionsExcludedFromSupplierLimit = showOnlyAcquisitionsExcludedFromSupplierLimit;
}
public Boolean getShowOnlyAcquisitionsWithAdditionalCosts() {
return showOnlyAcquisitionsWithAdditionalCosts;
}
public void setShowOnlyAcquisitionsWithAdditionalCosts(Boolean showOnlyAcquisitionsWithAdditionalCosts) {
this.showOnlyAcquisitionsWithAdditionalCosts = showOnlyAcquisitionsWithAdditionalCosts;
}
public String getRefundeeName() {
return refundeeName;
}
public void setRefundeeName(String refundeeName) {
this.refundeeName = refundeeName;
}
public Class getSearchClass() {
SearchProcessValues searchProcess = getSearchProcess();
return searchProcess != null ? searchProcess.getSearchClass() : null;
}
public SavedSearch getSavedSearch() {
return savedSearch;
}
public void setSavedSearch(SavedSearch savedSearch) {
this.savedSearch = savedSearch;
}
public void setPaymentProcessYear(PaymentProcessYear year) {
this.year = year;
}
public PaymentProcessYear getPaymentProcessYear() {
return this.year;
}
public void setTaker(Person taker) {
this.taker = taker;
}
public Person getTaker() {
return taker;
}
public void setShowOnlyWithUnreadComments(Boolean showOnlyWithUnreadComments) {
this.showOnlyWithUnreadComments = showOnlyWithUnreadComments;
}
public Boolean getShowOnlyWithUnreadComments() {
return showOnlyWithUnreadComments;
}
public void setShowPriorityOnly(Boolean showPriorityOnly) {
this.showPriorityOnly = showPriorityOnly != null ? showPriorityOnly : Boolean.FALSE;
}
public Boolean getShowPriorityOnly() {
return showPriorityOnly;
}
public Person getAccountManager() {
return accountManager;
}
public void setAccountManager(Person accountManager) {
this.accountManager = accountManager;
}
public CPVReference getCpvReference() {
return cpvReference;
}
public void setCpvReference(CPVReference cpvReference) {
this.cpvReference = cpvReference;
}
public String getSearchProcessTypesToExclude() {
final StringBuilder result = new StringBuilder();
final ExpenditureTrackingSystem instance = ExpenditureTrackingSystem.getInstance();
for (final SearchProcessValues s : SearchProcessValues.values()) {
if (!instance.contains(s)) {
if (result.length() > 0) {
result.append(",");
}
result.append(s.name());
}
}
return result.toString();
}
}