/*
* @(#)WorkingCapitalYear.java
*
* Copyright 2010 Instituto Superior Tecnico
* Founding Authors: Luis Cruz
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the Working Capital Module.
*
* The Working Capital 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 Working Capital 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 Working Capital Module. If not, see <http://www.gnu.org/licenses/>.
*
*/
package module.workingCapital.domain;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.security.Authenticate;
import org.joda.time.DateTime;
import module.organization.domain.Party;
import module.organization.domain.Person;
import module.organization.domain.Unit;
import module.workflow.domain.WorkflowProcess;
import pt.ist.expenditureTrackingSystem.domain.authorizations.Authorization;
/**
*
* @author João Neves
* @author Paulo Abrantes
* @author Luis Cruz
*
*/
public class WorkingCapitalYear extends WorkingCapitalYear_Base {
public WorkingCapitalYear() {
super();
setWorkingCapitalSystem(WorkingCapitalSystem.getInstanceForCurrentHost());
}
public WorkingCapitalYear(final Integer year) {
this();
setYear(year);
}
public static WorkingCapitalYear findOrCreate(final Integer year) {
for (final WorkingCapitalYear workingCapitalYear : WorkingCapitalSystem.getInstanceForCurrentHost()
.getWorkingCapitalYearsSet()) {
if (workingCapitalYear.getYear().intValue() == year.intValue()) {
return workingCapitalYear;
}
}
return new WorkingCapitalYear(year);
}
private abstract class WorkingCapitalProcessSearch {
private final SortedSet<WorkingCapitalProcess> result;
abstract boolean shouldAdd(final WorkingCapitalProcess workingCapitalProcess, final User user);
WorkingCapitalProcessSearch() {
result = new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
}
WorkingCapitalProcessSearch(final SortedSet<WorkingCapitalProcess> result) {
this.result = result;
}
SortedSet<WorkingCapitalProcess> search() {
final User user = Authenticate.getUser();
for (final WorkingCapital workingCapital : getWorkingCapitalsSet()) {
final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
if (shouldAdd(workingCapitalProcess, user)) {
result.add(workingCapitalProcess);
}
}
return result;
}
}
private class PendingAprovalSearch extends WorkingCapitalProcessSearch {
PendingAprovalSearch() {
}
PendingAprovalSearch(final SortedSet<WorkingCapitalProcess> result) {
super(result);
}
@Override
boolean shouldAdd(final WorkingCapitalProcess process, final User user) {
final WorkingCapital workingCapital = process.getWorkingCapital();
return !workingCapital.isCanceledOrRejected()
&& (process.getCurrentOwner() == null || process.isTakenByCurrentUser())
&& (process.isPendingDirectAproval(user)
|| workingCapital.hasAcquisitionPendingDirectApproval(user)
|| workingCapital.isPendingAcceptResponsability(user));
}
}
public SortedSet<WorkingCapitalProcess> getPendingAproval() {
return new PendingAprovalSearch().search();
}
public SortedSet<WorkingCapitalProcess> getPendingAproval(final SortedSet<WorkingCapitalProcess> result) {
return new PendingAprovalSearch(result).search();
}
private class PendingVerificationSearch extends WorkingCapitalProcessSearch {
PendingVerificationSearch() {
}
PendingVerificationSearch(final SortedSet<WorkingCapitalProcess> result) {
super(result);
}
@Override
boolean shouldAdd(final WorkingCapitalProcess process, final User user) {
final WorkingCapital workingCapital = process.getWorkingCapital();
return workingCapital.isPendingFundUnAllocation(user)
|| (!workingCapital.isCanceledOrRejected()
&& (process.getCurrentOwner() == null || process.isTakenByCurrentUser())
&& (process.isPendingVerification(user) || workingCapital.isPendingCentralVerification(user)));
}
}
public SortedSet<WorkingCapitalProcess> getPendingVerification() {
return new PendingVerificationSearch().search();
}
public SortedSet<WorkingCapitalProcess> getPendingVerification(final SortedSet<WorkingCapitalProcess> result) {
return new PendingVerificationSearch(result).search();
}
private class PendingProcessingSearch extends WorkingCapitalProcessSearch {
PendingProcessingSearch() {
}
PendingProcessingSearch(final SortedSet<WorkingCapitalProcess> result) {
super(result);
}
@Override
boolean shouldAdd(final WorkingCapitalProcess process, final User user) {
final WorkingCapital workingCapital = process.getWorkingCapital();
return workingCapital
.isPendingFundUnAllocation(
user)
|| (!workingCapital.isCanceledOrRejected()
&& (process.getCurrentOwner() == null || process.isTakenByCurrentUser())
&& (workingCapital.isPendingFundAllocation(user)
|| workingCapital.hasAcquisitionPendingVerification(user)
|| ((workingCapital.isAccountingResponsible(user)
|| workingCapital.isAccountingEmployee(user))
&& workingCapital.canRequestCapitalRefund())));
}
}
public SortedSet<WorkingCapitalProcess> getPendingProcessing() {
return new PendingProcessingSearch().search();
}
public SortedSet<WorkingCapitalProcess> getPendingProcessing(final SortedSet<WorkingCapitalProcess> result) {
return new PendingProcessingSearch(result).search();
}
public SortedSet<WorkingCapitalProcess> getPendingDirectVerification() {
return new WorkingCapitalProcessSearch() {
@Override
boolean shouldAdd(final WorkingCapitalProcess process, final User user) {
final WorkingCapital workingCapital = process.getWorkingCapital();
return !workingCapital.isCanceledOrRejected()
&& (process.getCurrentOwner() == null || process.isTakenByCurrentUser())
&& (process.isPendingVerification(user)
|| workingCapital.isPendingDirectFundAllocation(user)
|| workingCapital.hasAcquisitionPendingDirectVerification(user)
|| ((workingCapital.isAccountingResponsible(user)
|| workingCapital.isDirectAccountingEmployee(user))
&& workingCapital.canRequestCapitalRefund())
|| workingCapital.isPendingCentralVerification(user));
}
}.search();
}
private class PendingAuthorizationSearch extends WorkingCapitalProcessSearch {
PendingAuthorizationSearch() {
}
PendingAuthorizationSearch(final SortedSet<WorkingCapitalProcess> result) {
super(result);
}
@Override
boolean shouldAdd(WorkingCapitalProcess workingCapitalProcess, User user) {
if (workingCapitalProcess.isPendingAuthorization(user)) {
return true;
}
if ((WorkingCapitalSystem.getInstanceForCurrentHost().getManagementAccountability(user) != null)
&& (workingCapitalProcess.getWorkingCapital().hasAnyExceptionalAcquisitionPendingManagementApproval())) {
return true;
}
return false;
}
}
public SortedSet<WorkingCapitalProcess> getPendingAuthorization() {
return new PendingAuthorizationSearch().search();
}
public SortedSet<WorkingCapitalProcess> getPendingAuthorization(final SortedSet<WorkingCapitalProcess> result) {
return new PendingAuthorizationSearch(result).search();
}
private class PendingPaymentSearch extends WorkingCapitalProcessSearch {
PendingPaymentSearch() {
}
PendingPaymentSearch(final SortedSet<WorkingCapitalProcess> result) {
super(result);
}
@Override
boolean shouldAdd(final WorkingCapitalProcess process, final User user) {
final WorkingCapital workingCapital = process.getWorkingCapital();
return !workingCapital.isCanceledOrRejected()
&& (process.getCurrentOwner() == null || process.isTakenByCurrentUser())
&& (/* (workingCapital.isAccountingResponsible(user) && workingCapital.canRequestCapital()) || */
(workingCapital.isTreasuryMember(user)
&& workingCapital.hasWorkingCapitalRequestPendingTreasuryProcessing()));
}
}
public SortedSet<WorkingCapitalProcess> getPendingPayment() {
return new PendingPaymentSearch().search();
}
public SortedSet<WorkingCapitalProcess> getPendingPayment(final SortedSet<WorkingCapitalProcess> result) {
return new PendingPaymentSearch(result).search();
}
public SortedSet<WorkingCapitalProcess> getMyWorkingCapital() {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
final User user = Authenticate.getUser();
final Person person = user.getPerson();
if (person != null) {
for (final WorkingCapital workingCapital : person.getMovementResponsibleWorkingCapitalsSet()) {
if (workingCapital.getWorkingCapitalYear() == this) {
final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
result.add(workingCapitalProcess);
}
}
}
return result;
}
public SortedSet<WorkingCapitalProcess> getRequestedWorkingCapital() {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
final User user = Authenticate.getUser();
final Person person = user.getPerson();
if (person != null) {
for (final WorkingCapitalInitialization workingCapitalInitialization : person
.getRequestedWorkingCapitalInitializationsSet()) {
final WorkingCapital workingCapital = workingCapitalInitialization.getWorkingCapital();
if (workingCapital.getWorkingCapitalYear() == this) {
final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
result.add(workingCapitalProcess);
}
}
}
return result;
}
public SortedSet<WorkingCapitalProcess> getAprovalResponsibleWorkingCapital() {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
final User user = Authenticate.getUser();
if (user.getExpenditurePerson() != null) {
final Set<Authorization> authorizations = getAuthorizations(user);
if (!authorizations.isEmpty()) {
for (final WorkingCapital workingCapital : getWorkingCapitalsSet()) {
final pt.ist.expenditureTrackingSystem.domain.organization.Unit unit = workingCapital.getUnit();
if (isDirectlyResponsibleFor(authorizations, unit)) {
result.add(workingCapital.getWorkingCapitalProcess());
}
}
}
//for (final Authorization authorization : user.getExpenditurePerson().getAuthorizationsSet()) {
// if (authorization.isValid()) {
// final pt.ist.expenditureTrackingSystem.domain.organization.Unit unit = authorization.getUnit();
// for (final WorkingCapital workingCapital : unit.getWorkingCapitalsSet()) {
// if (workingCapital.getWorkingCapitalYear() == this) {
// final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
// result.add(workingCapitalProcess);
// }
// }
// addSubUnitWorkingCapitals(result, unit.getUnit());
// }
//}
}
return result;
}
private boolean isDirectlyResponsibleFor(final Set<Authorization> authorizations,
final pt.ist.expenditureTrackingSystem.domain.organization.Unit unit) {
final Set<Authorization> authorizationsFromUnit = unit.getAuthorizationsSet();
if (intersect(authorizations, authorizationsFromUnit)) {
return true;
}
if (hasValidAuthorization(authorizationsFromUnit)) {
return false;
}
final pt.ist.expenditureTrackingSystem.domain.organization.Unit parentUnit = unit.getParentUnit();
return parentUnit != null && isDirectlyResponsibleFor(authorizations, parentUnit);
}
private boolean hasValidAuthorization(final Set<Authorization> authorizations) {
for (final Authorization authorization : authorizations) {
if (authorization.isValid()) {
return true;
}
}
return false;
}
private boolean intersect(final Set<Authorization> authorizations, final Set<Authorization> authorizationsFromUnit) {
for (final Authorization authorization : authorizationsFromUnit) {
if (authorizations.contains(authorization)) {
return true;
}
}
return false;
}
private Set<Authorization> getAuthorizations(final User user) {
final Set<Authorization> authorizations = new HashSet<Authorization>();
for (final Authorization authorization : user.getExpenditurePerson().getAuthorizationsSet()) {
if (authorization.isValid()) {
authorizations.add(authorization);
}
}
return authorizations;
}
public SortedSet<WorkingCapitalProcess> getForUnit(final Unit unit) {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
if (unit.getExpenditureUnit() != null) {
for (final WorkingCapital workingCapital : unit.getExpenditureUnit().getWorkingCapitalsSet()) {
if (workingCapital.getWorkingCapitalYear() == this /* && workingCapital.isAvailable(user) */) {
final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
if (workingCapitalProcess.isAccessibleToCurrentUser()) {
result.add(workingCapitalProcess);
}
}
}
}
return result;
}
public SortedSet<WorkingCapitalProcess> getForPerson(final Person person) {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
if (person != null) {
for (final WorkingCapital workingCapital : person.getMovementResponsibleWorkingCapitalsSet()) {
if (workingCapital.getWorkingCapitalYear() == this) {
final WorkingCapitalProcess workingCapitalProcess = workingCapital.getWorkingCapitalProcess();
if (workingCapitalProcess.isAccessibleToCurrentUser()) {
result.add(workingCapitalProcess);
}
}
}
}
return result;
}
public SortedSet<WorkingCapitalProcess> getForParty(final Party party) {
return party.isUnit() ? getForUnit((Unit) party) : getForPerson((Person) party);
}
public static WorkingCapitalYear getCurrentYear() {
final int year = new DateTime().getYear();
return findOrCreate(year);
}
public SortedSet<WorkingCapitalProcess> getTaken() {
final SortedSet<WorkingCapitalProcess> result =
new TreeSet<WorkingCapitalProcess>(WorkingCapitalProcess.COMPARATOR_BY_UNIT_NAME);
return getTaken(result);
}
public SortedSet<WorkingCapitalProcess> getTaken(final SortedSet<WorkingCapitalProcess> result) {
final User user = Authenticate.getUser();
for (final WorkflowProcess workflowProcess : user.getUserProcessesSet()) {
if (workflowProcess instanceof WorkingCapitalProcess) {
final WorkingCapitalProcess workingCapitalProcess = (WorkingCapitalProcess) workflowProcess;
if (workingCapitalProcess.getWorkingCapital().getWorkingCapitalYear() == this) {
result.add(workingCapitalProcess);
}
}
}
return result;
}
@Deprecated
public boolean hasYear() {
return getYear() != null;
}
@Deprecated
public boolean hasWorkingCapitalSystem() {
return getWorkingCapitalSystem() != null;
}
@Deprecated
public java.util.Set<module.workingCapital.domain.WorkingCapital> getWorkingCapitals() {
return getWorkingCapitalsSet();
}
@Deprecated
public boolean hasAnyWorkingCapitals() {
return !getWorkingCapitalsSet().isEmpty();
}
}