/*
* @(#)MissionVersion.java
*
* Copyright 2010 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.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import org.fenixedu.bennu.core.security.Authenticate;
import org.joda.time.DateTime;
/**
*
* @author Luis Cruz
*
*/
public class MissionVersion extends MissionVersion_Base {
public static final Comparator<MissionVersion> COMPARATOR_BY_OLDEST_SINCE = new Comparator<MissionVersion>() {
@Override
public int compare(MissionVersion mv1, MissionVersion mv2) {
return mv1.getSinceDateTime().isBefore(mv2.getSinceDateTime()) ? -1 : 1;
}
};
public MissionVersion(final Mission mission) {
final MissionVersion previous = mission.getMissionVersion();
setSinceDateTime(new DateTime());
setMissionSystem(MissionSystem.getInstance());
setMission(mission);
setIsArchived(Boolean.FALSE);
copyVersionInformation(previous);
}
protected void copyVersionInformation(final MissionVersion previous) {
if (previous != null) {
setDaparture(previous.getDaparture());
setArrival(previous.getArrival());
setChangesAfterArrival(previous.getChangesAfterArrival());
setSentForTermination(previous.getSentForTermination());
setDescriptionOfChangesAfterArrival(previous.getDescriptionOfChangesAfterArrival());
setTerminator(previous.getTerminator());
final Map<MissionFinancer, MissionFinancer> missionFinancerMap = new HashMap<MissionFinancer, MissionFinancer>();
for (final MissionFinancer previousMissionFinancer : previous.getFinancerSet()) {
final MissionFinancer missionFinancer = previousMissionFinancer.createNewVersion(this);
missionFinancerMap.put(previousMissionFinancer, missionFinancer);
}
final Map<MissionItem, MissionItem> missionItemMap = new HashMap<MissionItem, MissionItem>();
for (final MissionItem previousMissionItem : previous.getMissionItemsSet()) {
final MissionItem missionItem = previousMissionItem.createNewVersion(this);
missionItemMap.put(previousMissionItem, missionItem);
}
for (final MissionFinancer previousMissionFinancer : previous.getFinancerSet()) {
final MissionFinancer missionFinancer = missionFinancerMap.get(previousMissionFinancer);
missionFinancer.setCommitmentNumber(previousMissionFinancer.getCommitmentNumber());
for (final MissionItemFinancer previousMissionItemFinancer : previousMissionFinancer.getMissionItemFinancersSet()) {
final MissionItem previousMissionItem = previousMissionItemFinancer.getMissionItem();
final MissionItem missionItem = missionItemMap.get(previousMissionItem);
previousMissionItemFinancer.createNewVersion(missionFinancer, missionItem);
}
}
}
}
public void setDates(final DateTime daparture, final DateTime arrival) {
setDaparture(daparture);
setArrival(arrival);
}
@Override
public void setChangesAfterArrival(final Boolean changesAfterArrival) {
super.setChangesAfterArrival(changesAfterArrival);
if (changesAfterArrival != null) {
setTerminator(Authenticate.getUser().getPerson());
setSentForTermination(new DateTime());
}
}
public boolean isTerminatedWithChanges() {
return getChangesAfterArrival() != null && getChangesAfterArrival().booleanValue();
}
public void autoArchive() {
for (final MissionItem missionItem : getMissionItemsSet()) {
missionItem.autoArchive();
}
}
public void unArchive() {
for (final MissionItem missionItem : getMissionItemsSet()) {
missionItem.unArchive();
}
}
/**
* Use getVehicleItemStream instead
*/
@Deprecated
public List<VehiclItem> getVehicleItems() {
List<VehiclItem> items = new ArrayList<VehiclItem>();
for (MissionItem item : getMissionItems()) {
if (item instanceof VehiclItem) {
items.add((VehiclItem) item);
}
}
return items;
}
public Stream<VehiclItem> getVehicleItemStream() {
return getMissionItemsSet().stream().filter(mi -> mi instanceof VehiclItem).map(mi -> (VehiclItem) mi);
}
public boolean hasAnyVehicleItems() {
return getVehicleItemStream().findAny().orElse(null) != null;
}
public boolean isTerminated() {
return getChangesAfterArrival() != null;
}
public boolean canArchiveMission() {
if (hasAnyMissionItems()) {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem.isAccountantForUnArchivedMissionItemFinancer()) {
return true;
}
}
return !getIsArchived().booleanValue() && areAllItemsArchived() && isAccountantOfProjectAccountant();
}
final Mission mission = getMission();
return mission.isRequestorOrResponsible();
}
public boolean canArchiveMissionDirect() {
if (hasAnyMissionItems()) {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem.isDirectAccountantForUnArchivedMissionItemFinancer()) {
return true;
}
}
return !getIsArchived().booleanValue() && areAllItemsArchived() && isDirectAccountantOfProjectAccountant();
}
final Mission mission = getMission();
return mission.isRequestorOrResponsible();
}
private boolean isAccountantOfProjectAccountant() {
for (final MissionItem missionItem : getMissionItemsSet()) {
for (final MissionItemFinancer missionItemFinancer : missionItem.getMissionItemFinancersSet()) {
final MissionFinancer missionFinancer = missionItemFinancer.getMissionFinancer();
if (missionFinancer.isCurrentUserAccountant() || missionFinancer.isCurrentUserProjectAccountant()) {
return true;
}
}
}
return false;
}
private boolean isDirectAccountantOfProjectAccountant() {
for (final MissionItem missionItem : getMissionItemsSet()) {
for (final MissionItemFinancer missionItemFinancer : missionItem.getMissionItemFinancersSet()) {
final MissionFinancer missionFinancer = missionItemFinancer.getMissionFinancer();
if (missionFinancer.isCurrentUserAccountant() || missionFinancer.isCurrentUserDirectProjectAccountant()) {
return true;
}
}
}
return false;
}
private boolean areAllItemsArchived() {
for (final MissionItem missionItem : getMissionItemsSet()) {
for (final MissionItemFinancer missionItemFinancer : missionItem.getMissionItemFinancersSet()) {
if (!missionItemFinancer.isArchived()) {
return false;
}
}
}
return true;
}
public boolean hasNoItemsAndParticipantesAreAuthorized() {
return !hasAnyMissionItems() && getMission().allParticipantsAreAuthorized();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionItem> getMissionItems() {
return getMissionItemsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionFinancer> getFinancer() {
return getFinancerSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionItemProjectFinancer> getArchivedMissionItemProjectFinancer() {
return getArchivedMissionItemProjectFinancerSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionItemFinancer> getArchivedMissionItemFinancer() {
return getArchivedMissionItemFinancerSet();
}
@Deprecated
public boolean hasAnyMissionItems() {
return !getMissionItemsSet().isEmpty();
}
@Deprecated
public boolean hasAnyFinancer() {
return !getFinancerSet().isEmpty();
}
@Deprecated
public boolean hasAnyArchivedMissionItemProjectFinancer() {
return !getArchivedMissionItemProjectFinancerSet().isEmpty();
}
@Deprecated
public boolean hasAnyArchivedMissionItemFinancer() {
return !getArchivedMissionItemFinancerSet().isEmpty();
}
@Deprecated
public boolean hasSinceDateTime() {
return getSinceDateTime() != null;
}
@Deprecated
public boolean hasDaparture() {
return getDaparture() != null;
}
@Deprecated
public boolean hasArrival() {
return getArrival() != null;
}
@Deprecated
public boolean hasChangesAfterArrival() {
return getChangesAfterArrival() != null;
}
@Deprecated
public boolean hasSentForTermination() {
return getSentForTermination() != null;
}
@Deprecated
public boolean hasDescriptionOfChangesAfterArrival() {
return getDescriptionOfChangesAfterArrival() != null;
}
@Deprecated
public boolean hasIsArchived() {
return getIsArchived() != null;
}
@Deprecated
public boolean hasMission() {
return getMission() != null;
}
@Deprecated
public boolean hasMissionSystem() {
return getMissionSystem() != null;
}
@Deprecated
public boolean hasTerminator() {
return getTerminator() != null;
}
}