/*
* @(#)MissionSystem.java
*
* Copyright 2011 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 module.mission.domain;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.function.Predicate;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.core.security.Authenticate;
import module.mission.domain.activity.AuthorizeVehicleItemActivity;
import module.mission.domain.activity.ItemActivityInformation;
import module.mission.domain.util.UserAliasProvider;
import module.organization.domain.Accountability;
import module.organization.domain.AccountabilityType;
import module.organization.domain.OrganizationalModel;
import module.organization.domain.Party;
import module.organization.domain.Person;
import module.organization.domain.Unit;
import module.workflow.domain.WorkflowQueue;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.organization.Supplier;
import pt.ist.fenixframework.Atomic;
/**
*
* @author Luis Cruz
*
*/
public class MissionSystem extends MissionSystem_Base {
private static UserAliasProvider userAliasProvider = new UserAliasProvider() {
@Override
public String getUserAliases(final Person person) {
return person.getUser().getUsername();
}
};
public static MissionSystem getInstance() {
final Bennu bennu = Bennu.getInstance();
if (bennu.getMissionSystem() == null) {
initialize(bennu);
}
return bennu.getMissionSystem();
}
@Atomic
public synchronized static void initialize(final Bennu bennu) {
if (bennu.getMissionSystem() == null) {
new MissionSystem(bennu);
}
}
private MissionSystem(final Bennu bennu) {
super();
setBennu(bennu);
}
public static boolean canUserVerifyProcesses(User user) {
WorkflowQueue verificationQueue = getInstance().getVerificationQueue();
return (verificationQueue != null) ? verificationQueue.isUserAbleToAccessQueue(user) : false;
}
public ExpenditureTrackingSystem getExpenditureTrackingSystem() {
return Bennu.getInstance().getExpenditureTrackingSystem();
}
public Set<pt.ist.expenditureTrackingSystem.domain.organization.Unit> getTopLevelUnitsFromExpenditureSystem() {
return getExpenditureTrackingSystem().getTopLevelUnits();
}
public pt.ist.expenditureTrackingSystem.domain.organization.Unit getFirstTopLevelUnitFromExpenditureSystem() {
return getExpenditureTrackingSystem().getTopLevelUnits().iterator().next();
}
/**
* Use AUTHORIZATION_PREDICATE instead
*/
@Deprecated
public Set<AccountabilityType> getAccountabilityTypesThatAuthorize() {
final Set<AccountabilityType> accountabilityTypes = new HashSet<AccountabilityType>();
for (final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType : getMissionAuthorizationAccountabilityTypesSet()) {
accountabilityTypes.addAll(missionAuthorizationAccountabilityType.getAccountabilityTypesSet());
}
return accountabilityTypes;
}
public static final Predicate<Accountability> AUTHORIZATION_PREDICATE = new Predicate<Accountability>() {
@Override
public boolean test(final Accountability a) {
for (final MissionAuthorizationAccountabilityType maat : MissionSystem.getInstance()
.getMissionAuthorizationAccountabilityTypesSet()) {
for (AccountabilityType type : maat.getAccountabilityTypesSet()) {
if (type == a.getAccountabilityType()) {
return true;
}
}
}
return false;
}
};
/**
* Use REQUIRE_AUTHORIZATION_PREDICATE instead
*/
@Deprecated
public Set<AccountabilityType> getAccountabilityTypesRequireingAuthorization() {
final Set<AccountabilityType> accountabilityTypes = new HashSet<AccountabilityType>();
for (final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType : getMissionAuthorizationAccountabilityTypesSet()) {
accountabilityTypes.add(missionAuthorizationAccountabilityType.getAccountabilityType());
}
return accountabilityTypes;
}
public static final Predicate<Accountability> REQUIRE_AUTHORIZATION_PREDICATE = new Predicate<Accountability>() {
@Override
public boolean test(final Accountability a) {
for (final MissionAuthorizationAccountabilityType maat : MissionSystem.getInstance()
.getMissionAuthorizationAccountabilityTypesSet()) {
if (maat.getAccountabilityType() == a.getAccountabilityType()) {
return true;
}
}
return false;
}
};
public Collection<AccountabilityType> getAccountabilityTypesForUnits() {
final Set<AccountabilityType> modelAccountabilityTypes =
hasOrganizationalModel() ? getOrganizationalModel().getAccountabilityTypesSet() : Collections.EMPTY_SET;
final Set<AccountabilityType> accountabilityTypes = new HashSet<AccountabilityType>(modelAccountabilityTypes);
for (final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType : getMissionAuthorizationAccountabilityTypesSet()) {
accountabilityTypes.remove(missionAuthorizationAccountabilityType.getAccountabilityType());
accountabilityTypes.removeAll(missionAuthorizationAccountabilityType.getAccountabilityTypesSet());
}
return accountabilityTypes;
}
public Set<AccountabilityType> getAccountabilityTypesForAuthorization(final AccountabilityType accountabilityType) {
final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType =
MissionAuthorizationAccountabilityType.find(accountabilityType);
return missionAuthorizationAccountabilityType == null ? null : missionAuthorizationAccountabilityType
.getAccountabilityTypesSet();
}
public Collection<DailyPersonelExpenseTable> getCurrentDailyExpenseTables() {
final Map<String, DailyPersonelExpenseTable> dailyExpenseTableMap = new HashMap<String, DailyPersonelExpenseTable>();
for (final DailyPersonelExpenseTable dailyPersonelExpenseTable : getDailyPersonelExpenseTablesSet()) {
final String aplicableToMissionType = dailyPersonelExpenseTable.getAplicableToMissionType();
final DailyPersonelExpenseTable existing = dailyExpenseTableMap.get(aplicableToMissionType);
if (existing == null || existing.getAplicableSince().isBefore(dailyPersonelExpenseTable.getAplicableSince())) {
dailyExpenseTableMap.put(aplicableToMissionType, dailyPersonelExpenseTable);
}
}
return dailyExpenseTableMap.values();
}
@Atomic
@Override
public void setOrganizationalModel(final OrganizationalModel organizationalModel) {
super.setOrganizationalModel(organizationalModel);
}
public boolean isCurrentUserVehicleAuthorizer() {
return getVehicleAuthorizers().contains(Authenticate.getUser());
}
public Collection<VehiclItem> getVehicleItemsPendingAuthorization() {
Collection<VehiclItem> pendingVehicles = new HashSet<VehiclItem>();
for (MissionProcess process : getMissionProcesses()) {
if (!process.canAuthorizeVehicles()) {
continue;
}
for (VehiclItem vehicle : process.getMission().getVehicleItems()) {
if (!vehicle.isAuthorized()) {
pendingVehicles.add(vehicle);
}
}
}
return pendingVehicles;
}
public boolean isAccountabilityTypesThatAuthorize(final AccountabilityType accountabilityType) {
for (final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType : getMissionAuthorizationAccountabilityTypesSet()) {
if (missionAuthorizationAccountabilityType.getAccountabilityTypesSet().contains(accountabilityType)) {
return true;
}
}
return false;
}
@Atomic
public void addUnitWithResumedAuthorizations(final Unit unit) {
addUnitsWithResumedAuthorizations(unit);
}
@Atomic
public void removeUnitWithResumedAuthorizations(final Unit unit) {
removeUnitsWithResumedAuthorizations(unit);
}
public SortedSet<Unit> getOrderedUnitsWithResumedAuthorizations() {
final SortedSet<Unit> result = new TreeSet<Unit>(Unit.COMPARATOR_BY_PRESENTATION_NAME);
result.addAll(getUnitsWithResumedAuthorizationsSet());
return result;
}
public static String getBundle() {
return "resources.MissionResources";
}
public static String getMessage(final String key, String... args) {
return BundleUtil.getString(getBundle(), key, args);
}
public boolean isManagementCouncilMember(final User user) {
final OrganizationalModel model = getOrganizationalModel();
for (final Party party : model.getPartiesSet()) {
if (party.isUnit() && isManagementCouncilMember(user, model, (Unit) party, true)) {
return true;
}
}
return false;
}
private boolean isManagementCouncilMember(final User user, final OrganizationalModel model, final Unit unit,
final boolean recurseOverChildren) {
return unit.getChildAccountabilityStream()
.anyMatch(
a -> model.getAccountabilityTypesSet().contains(a.getAccountabilityType())
&& (isAccountabilityTypesThatAuthorize(a.getAccountabilityType())
&& a.getChild() == user.getPerson())
|| (recurseOverChildren && a.getChild().isUnit()
&& isManagementCouncilMember(user, model, (Unit) a.getChild(), false)));
}
@Atomic
@Override
public void addUsersWhoCanCancelMission(User usersWhoCanCancelMission) {
super.addUsersWhoCanCancelMission(usersWhoCanCancelMission);
}
@Atomic
@Override
public void removeUsersWhoCanCancelMission(User usersWhoCanCancelMission) {
super.removeUsersWhoCanCancelMission(usersWhoCanCancelMission);
}
@Atomic
@Override
public void addVehicleAuthorizers(User vehicleAuthorizers) {
super.addVehicleAuthorizers(vehicleAuthorizers);
}
@Atomic
@Override
public void removeVehicleAuthorizers(User vehicleAuthorizers) {
super.removeVehicleAuthorizers(vehicleAuthorizers);
}
public boolean allowGrantOwnerEquivalence() {
final Boolean b = getAllowGrantOwnerEquivalence();
return b != null && b.booleanValue();
}
@Atomic
public void toggleAllowGrantOwnerEquivalence() {
final Boolean b = getAllowGrantOwnerEquivalence();
setAllowGrantOwnerEquivalence(b == null ? Boolean.TRUE : Boolean.valueOf(!b.booleanValue()));
}
@Atomic
public void togleUseWorkingPlaceAuthorizationChain() {
final Boolean b = getUseWorkingPlaceAuthorizationChain();
setUseWorkingPlaceAuthorizationChain(b == null ? Boolean.TRUE : Boolean.valueOf(!b.booleanValue()));
}
@Atomic
public static Collection<VehiclItem> massAuthorizeVehicles(Collection<VehiclItem> items) {
final Collection<VehiclItem> noLongerActiveItems = new ArrayList<VehiclItem>();
for (final VehiclItem item : items) {
final Mission mission = item.getMission();
final MissionProcess missionProcess = mission.getMissionProcess();
final AuthorizeVehicleItemActivity activity =
(AuthorizeVehicleItemActivity) missionProcess.getActivity(AuthorizeVehicleItemActivity.class);
final ItemActivityInformation activityInfo = activity.getActivityInformation(missionProcess);
activityInfo.setMissionItem(item);
if (activity.isActive(missionProcess)) {
activity.execute(activityInfo);
} else {
noLongerActiveItems.add(item);
}
}
return noLongerActiveItems;
}
@Deprecated
public java.util.Set<module.mission.domain.PersonMissionAuthorization> getPersonMissionAuthorizations() {
return getPersonMissionAuthorizationsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.VehiclItemJustification> getVehiclItemJustification() {
return getVehiclItemJustificationSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionVersion> getMissionVersions() {
return getMissionVersionsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.TemporaryMissionItemEntry> getTemporaryMissionItemEntries() {
return getTemporaryMissionItemEntriesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionAuthorizationAccountabilityType> getMissionAuthorizationAccountabilityTypes() {
return getMissionAuthorizationAccountabilityTypesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.DailyPersonelExpenseTable> getDailyPersonelExpenseTables() {
return getDailyPersonelExpenseTablesSet();
}
@Deprecated
public java.util.Set<org.fenixedu.bennu.core.domain.User> getVehicleAuthorizers() {
return getVehicleAuthorizersSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionFinancer> getFinancer() {
return getFinancerSet();
}
@Deprecated
public java.util.Set<module.mission.domain.Mission> getMissions() {
return getMissionsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.DailyPersonelExpenseCategory> getDailyPersonelExpenseCategories() {
return getDailyPersonelExpenseCategoriesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionYear> getMissionYear() {
return getMissionYearSet();
}
@Deprecated
public java.util.Set<module.organization.domain.Unit> getUnitsWithResumedAuthorizations() {
return getUnitsWithResumedAuthorizationsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.Salary> getSalaries() {
return getSalariesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionProcess> getMissionProcesses() {
return getMissionProcessesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionProcessLateJustification> getMissionProcessLateJustification() {
return getMissionProcessLateJustificationSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionChangeDescription> getMissionChangeDescription() {
return getMissionChangeDescriptionSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionItemFinancer> getMissionItemFinancers() {
return getMissionItemFinancersSet();
}
@Deprecated
public java.util.Set<org.fenixedu.bennu.core.domain.User> getUsersWhoCanCancelMission() {
return getUsersWhoCanCancelMissionSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionItem> getMissionItems() {
return getMissionItemsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.AccountabilityTypeQueue> getAccountabilityTypeQueues() {
return getAccountabilityTypeQueuesSet();
}
@Deprecated
public java.util.Set<module.organization.domain.Person> getGovernmentMembers() {
return getGovernmentMembersSet();
}
@Deprecated
public boolean hasAnyPersonMissionAuthorizations() {
return !getPersonMissionAuthorizationsSet().isEmpty();
}
@Deprecated
public boolean hasAnyVehiclItemJustification() {
return !getVehiclItemJustificationSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionVersions() {
return !getMissionVersionsSet().isEmpty();
}
@Deprecated
public boolean hasAnyTemporaryMissionItemEntries() {
return !getTemporaryMissionItemEntriesSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionAuthorizationAccountabilityTypes() {
return !getMissionAuthorizationAccountabilityTypesSet().isEmpty();
}
@Deprecated
public boolean hasAnyDailyPersonelExpenseTables() {
return !getDailyPersonelExpenseTablesSet().isEmpty();
}
@Deprecated
public boolean hasAnyVehicleAuthorizers() {
return !getVehicleAuthorizersSet().isEmpty();
}
@Deprecated
public boolean hasAnyFinancer() {
return !getFinancerSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissions() {
return !getMissionsSet().isEmpty();
}
@Deprecated
public boolean hasAnyDailyPersonelExpenseCategories() {
return !getDailyPersonelExpenseCategoriesSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionYear() {
return !getMissionYearSet().isEmpty();
}
@Deprecated
public boolean hasAnyUnitsWithResumedAuthorizations() {
return !getUnitsWithResumedAuthorizationsSet().isEmpty();
}
@Deprecated
public boolean hasAnySalaries() {
return !getSalariesSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionProcesses() {
return !getMissionProcessesSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionProcessLateJustification() {
return !getMissionProcessLateJustificationSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionChangeDescription() {
return !getMissionChangeDescriptionSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionItemFinancers() {
return !getMissionItemFinancersSet().isEmpty();
}
@Deprecated
public boolean hasAnyUsersWhoCanCancelMission() {
return !getUsersWhoCanCancelMissionSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionItems() {
return !getMissionItemsSet().isEmpty();
}
@Deprecated
public boolean hasAnyAccountabilityTypeQueues() {
return !getAccountabilityTypeQueuesSet().isEmpty();
}
@Deprecated
public boolean hasAnyGovernmentMembers() {
return !getGovernmentMembersSet().isEmpty();
}
@Deprecated
public boolean hasAllowGrantOwnerEquivalence() {
return getAllowGrantOwnerEquivalence() != null;
}
@Deprecated
public boolean hasOrganizationalModel() {
return getOrganizationalModel() != null;
}
@Deprecated
public boolean hasCountry() {
return getCountry() != null;
}
public static UserAliasProvider getUserAliasProvider() {
return userAliasProvider;
}
public static void setUserAliasProvider(final UserAliasProvider userAliasProvider) {
MissionSystem.userAliasProvider = userAliasProvider;
}
@Atomic
public void addMandatorySupplierService(final Supplier supplier) {
addMandatorySupplier(supplier);
}
@Atomic
public void removeMandatorySupplierService(final Supplier supplier) {
removeMandatorySupplier(supplier);
}
public boolean useWorkingPlaceAuthorizationChain() {
return getUseWorkingPlaceAuthorizationChain() != null && getUseWorkingPlaceAuthorizationChain().booleanValue();
}
}