/*
* @(#)Mission.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.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.function.Consumer;
import java.util.stream.Stream;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.domain.UserProfile;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.core.security.Authenticate;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Days;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
import module.finance.util.Money;
import module.geography.domain.Country;
import module.mission.domain.activity.DistributeItemCostsActivityInformation;
import module.mission.domain.activity.DistributeItemCostsActivityInformation.MissionItemFinancerBean;
import module.mission.domain.activity.DistributeItemCostsActivityInformation.MissionItemFinancerBeanCollection;
import module.mission.domain.activity.ItemActivityInformation;
import module.mission.domain.activity.UpdateMissionDetailsActivityInformation;
import module.mission.domain.util.AuthorizationChain;
import module.mission.domain.util.ParticipantAuthorizationChain;
import module.organization.domain.Accountability;
import module.organization.domain.AccountabilityType;
import module.organization.domain.Party;
import module.organization.domain.Person;
import module.workflow.domain.WorkflowLog;
import module.workflow.domain.WorkflowQueue;
import pt.ist.expenditureTrackingSystem._development.Bundle;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.authorizations.Authorization;
import pt.ist.expenditureTrackingSystem.domain.organization.AccountingUnit;
import pt.ist.expenditureTrackingSystem.domain.organization.Unit;
import pt.ist.expenditureTrackingSystem.domain.util.DomainException;
/**
*
* @author Luis Cruz
*
*/
public abstract class Mission extends Mission_Base {
public static final Comparator<Mission> COMPARATOR_BY_PROCESS_IDENTIFICATION = new Comparator<Mission>() {
@Override
public int compare(Mission o1, Mission o2) {
final MissionProcess p1 = o1.getMissionProcess();
final MissionProcess p2 = o2.getMissionProcess();
return MissionProcess.COMPARATOR_BY_PROCESS_NUMBER.compare(p1, p2);
}
};
public Mission() {
super();
setMissionSystem(MissionSystem.getInstance());
setIsApprovedByMissionResponsible(Boolean.FALSE);
final User user = Authenticate.getUser();
final Person person = user == null ? null : user.getPerson();
setRequestingPerson(person);
new MissionVersion(this);
setIsPersonalInformationProcessed(false);
setIsVerified(false);
}
protected void setMissionInformation(final String location, final DateTime daparture, final DateTime arrival,
final String objective, final Boolean isCurrentUserAParticipant, final Boolean grantOwnerEquivalence) {
final User user = Authenticate.getUser();
final Person person = user == null ? null : user.getPerson();
setMissionInformation(location, daparture, arrival, objective);
if (isCurrentUserAParticipant != null && isCurrentUserAParticipant.booleanValue()) {
if (person != null) {
addParticipantes(person);
}
}
setGrantOwnerEquivalence(grantOwnerEquivalence);
}
protected void setMissionInformation(final String location, final DateTime daparture, final DateTime arrival,
final String objective) {
setLocation(location);
if (daparture == null || arrival == null || arrival.isBefore(daparture)) {
throw new DomainException(Bundle.MISSION, "label.mission.process.invalid.dates");
}
final MissionVersion missionVersion = getMissionVersion();
missionVersion.setDates(daparture, arrival);
setObjective(objective);
}
public Set<MissionFinancer> getFinancer() {
return getMissionVersion().getFinancer();
}
public void fill(final UpdateMissionDetailsActivityInformation updateMissionDetailsActivityInformation) {
updateMissionDetailsActivityInformation.setLocation(getLocation());
updateMissionDetailsActivityInformation.setDaparture(getDaparture());
updateMissionDetailsActivityInformation.setArrival(getArrival());
updateMissionDetailsActivityInformation.setObjective(getObjective());
}
@Override
public DateTime getDaparture() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getDaparture();
}
@Override
public DateTime getArrival() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getArrival();
}
public void updateDetails(final UpdateMissionDetailsActivityInformation updateMissionDetailsActivityInformation) {
setMissionInformation(updateMissionDetailsActivityInformation.getLocation(),
updateMissionDetailsActivityInformation.getDaparture(), updateMissionDetailsActivityInformation.getArrival(),
updateMissionDetailsActivityInformation.getObjective());
}
public void add(final ItemActivityInformation itemActivityInformation) {
final MissionItem missionItem = itemActivityInformation.getMissionItem();
missionItem.setMissionVersion(getMissionVersion());
final Collection<Person> people = itemActivityInformation.getPeople();
final Set<Person> participants = missionItem.getPeopleSet();
participants.addAll(people);
participants.retainAll(people);
if (getParticipantesSet().size() == 1) {
participants.addAll(getParticipantesSet());
}
// final MissionItemFinancerBeanCollection missionItemFinancerBeanCollection = itemActivityInformation.getMissionItemFinancerBeans();
// distributeCosts(missionItem, missionItemFinancerBeanCollection);
}
public void distributeCosts(final DistributeItemCostsActivityInformation distributeItemCostsActivityInformation) {
final MissionItem missionItem = distributeItemCostsActivityInformation.getMissionItem();
final MissionItemFinancerBeanCollection missionItemFinancerBeanCollection =
distributeItemCostsActivityInformation.getMissionItemFinancerBeans();
distributeCosts(missionItem, missionItemFinancerBeanCollection);
}
public void distributeCosts(final MissionItem missionItem,
final MissionItemFinancerBeanCollection missionItemFinancerBeanCollection) {
if (missionItemFinancerBeanCollection.size() == 1) {
final MissionItemFinancerBean missionItemFinancerBean = missionItemFinancerBeanCollection.iterator().next();
missionItemFinancerBean.setAmount(missionItem.getValue());
}
missionItem.setMissionItemFinancers(missionItemFinancerBeanCollection);
}
public void addFinancer(final Unit unit) {
new MissionFinancer(this, unit);
}
public boolean hasAnyAproval() {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.getApproval() != null) {
return true;
}
}
return false;
}
public boolean isPendingApproval() {
return getApprovalForMissionWithNoFinancers() == null
&& (getIsApprovedByMissionResponsible() == null || !getIsApprovedByMissionResponsible().booleanValue());
}
public boolean isPendingApprovalBy(final User user) {
return isPendingApproval() && isMissionResponsible(user);
}
private boolean isMissionResponsible(final User user) {
final Party missionResponsible = getMissionResponsible();
return (missionResponsible != null && missionResponsible.isPerson() && missionResponsible == user.getPerson())
|| (missionResponsible != null && missionResponsible.isUnit()
&& getExpenditureUnit((module.organization.domain.Unit) missionResponsible)
.isResponsible(user.getExpenditurePerson()));
}
private Unit getExpenditureUnit(final module.organization.domain.Unit unit) {
return unit.getExpenditureUnit() != null ? unit.getExpenditureUnit() : getExpenditureUnit(
unit.getParentAccountabilityStream().filter(a -> a.getParent().isUnit())
.map(a -> (module.organization.domain.Unit) a.getParent()).findAny().orElse(null));
}
public boolean isPendingAuthorizationBy(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.isPendingAuthorizationBy(user)) {
return true;
}
}
return false;
}
public boolean hasBeenCheckedByUnderlings() {
for (final MissionFinancer financer : getFinancerSet()) {
if (!financer.hasBeenCheckedByUnderlings()) {
return false;
}
}
return true;
}
public boolean isPendingDirectAuthorizationBy(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.isPendingDirectAuthorizationBy(user)) {
return true;
}
}
return false;
}
public boolean isPendingCheckByUnderlings(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.isPendingCheckByUnderlings(user)) {
return true;
}
}
return false;
}
public void approve(final User user) {
final Party missionResponsible = getMissionResponsible();
if (missionResponsible.isPerson()) {
setIsApprovedByMissionResponsible(Boolean.TRUE);
} else if (missionResponsible.isUnit()) {
final Unit unit = getExpenditureUnit((module.organization.domain.Unit) missionResponsible);
final Authorization authorization = unit.findClosestAuthorization(user.getExpenditurePerson(), Money.ZERO);
if (authorization != null) {
setApprovalForMissionWithNoFinancers(authorization);
}
}
setServiceGaranteePerson(user.getPerson());
setServiceGaranteeInstante(new DateTime());
}
public void authorize(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.authorize(user);
}
}
public void preAuthorize(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.preAuthorize(user);
}
}
public boolean canRemoveApproval(final User user) {
if (getFinancerCount() == 0 && getMissionItemsCount() == 0) {
final Party missionResponsible = getMissionResponsible();
if (missionResponsible == null) {
return false;
}
if (missionResponsible.isPerson()) {
return getIsApprovedByMissionResponsible() != null && getIsApprovedByMissionResponsible().booleanValue()
&& missionResponsible == user.getPerson();
} else if (missionResponsible.isUnit()) {
final Unit unit = getExpenditureUnit((module.organization.domain.Unit) missionResponsible);
return getApprovalForMissionWithNoFinancers() != null && unit.isResponsible(user.getExpenditurePerson());
}
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.canRemoveApproval(user)) {
return true;
}
}
return false;
}
public boolean canRemoveAuthorization(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.canRemoveAuthorization(user)) {
return true;
}
}
return false;
}
public boolean canRemovePreAuthorization(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.canRemovePreAuthorization(user)) {
return true;
}
}
return false;
}
public void unapprove(final User user) {
if (getFinancerCount() == 0 && getMissionItemsCount() == 0) {
final Party missionResponsible = getMissionResponsible();
if (missionResponsible.isPerson()) {
setIsApprovedByMissionResponsible(Boolean.FALSE);
} else if (missionResponsible.isUnit()) {
final Unit unit = getExpenditureUnit((module.organization.domain.Unit) missionResponsible);
if (unit.isResponsible(user.getExpenditurePerson())) {
setApprovalForMissionWithNoFinancers(null);
}
}
} else {
for (final MissionFinancer financer : getFinancerSet()) {
financer.unapprove(user);
}
}
}
public void unauthorize(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.unauthorize(user);
}
}
public void unPreAuthorize(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.unPreAuthorize(user);
}
}
public boolean isApprovedByResponsible() {
return getIsApprovedByMissionResponsible() != null && getIsApprovedByMissionResponsible();
}
public boolean isApproved() {
return isApprovedByResponsible() && isVerified() && (areAllVehicleItemsAuthorized() || !isVehicleAuthorizationNeeded());
}
public boolean isVerified() {
return getIsVerified();
}
protected boolean isVehicleAuthorizationNeeded() {
return !areAllParticipantsAuthorized();
}
public boolean isPersonalInformationProcessed() {
return getIsPersonalInformationProcessed();
}
public boolean areAllVehicleItemsAuthorized() {
for (VehiclItem item : getVehicleItems()) {
if (!item.isAuthorized()) {
return false;
}
}
return true;
}
/**
* Use getVehicleItemStream instead
*
* @return
*/
@Deprecated
public List<VehiclItem> getVehicleItems() {
return getMissionVersion().getVehicleItems();
}
public Stream<VehiclItem> getVehicleItemStream() {
return getMissionVersion().getVehicleItemStream();
}
public boolean hasAllAllocatedFunds() {
if (!hasAnyFinancer()) {
return false;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (!financer.hasAllAllocatedFunds()) {
return false;
}
}
return true;
}
public boolean hasAllAllocatedProjectFunds() {
if (!hasAnyProjectFinancer()) {
return false;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.isProjectFinancer() && !financer.hasAllAllocatedProjectFunds()) {
return false;
}
}
return true;
}
public boolean hasAnyProjectFinancer() {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
for (final MissionItemFinancer missionItemFinancer : missionFinancer.getMissionItemFinancersSet()) {
if (missionItemFinancer instanceof MissionItemProjectFinancer) {
return true;
}
}
}
return false;
}
public boolean hasAnyAllocatedFunds() {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.hasAnyAllocatedFunds()) {
return true;
}
}
return false;
}
public boolean hasAnyAllocatedProjectFunds() {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.hasAnyAllocatedProjectFunds()) {
return true;
}
}
return false;
}
public void unAllocateFunds(Person person) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.unAllocateFunds(person);
}
}
public boolean hasAnyAuthorization() {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.getAuthorization() != null) {
return true;
}
}
return false;
}
protected Set<MissionItem> getItemsByType(final Class clazz) {
final Set<MissionItem> missionItems = new TreeSet<MissionItem>(MissionItem.COMPARATOR_BY_OID);
for (final MissionItem missionItem : getMissionItemsSet()) {
if (clazz.isAssignableFrom(missionItem.getClass())) {
missionItems.add(missionItem);
}
}
return missionItems;
}
public Set<MissionItem> getTransportationItems() {
return getItemsByType(TransportationItem.class);
}
public Set<MissionItem> getOtherItems() {
return getItemsByType(OtherMissionItem.class);
}
public Set<MissionItem> getPersonelExpenseItems() {
return getItemsByType(PersonelExpenseItem.class);
}
public Set<MissionItem> getAccommodationItems() {
return getItemsByType(AccommodationItem.class);
}
public SortedSet<Person> getOrderedParticipants() {
final SortedSet<Person> people = new TreeSet<Person>(PERSON_COMPARATOR_BY_NAME);
people.addAll(getParticipantesSet());
return people;
}
@Override
public void removeParticipantes(final Person participante) {
super.removeParticipantes(participante);
for (final MissionItem missionItem : getMissionItemsSet()) {
missionItem.removePeople(participante);
}
if (getMissionResponsible() == participante) {
if (!getParticipantesSet().isEmpty()) {
setMissionResponsible(getParticipantesSet().iterator().next());
} else {
setMissionResponsible(null);
}
}
if (getParticipantesSet().size() == 1) {
final Person person = (Person) getMissionResponsible();
for (final MissionItem missionItem : getMissionItemsSet()) {
missionItem.addPeople(person);
}
}
}
public static Comparator<UserProfile> PROFILE_COMPARATOR_BY_NAME = Comparator.nullsLast((up1, up2) -> {
final String n1 = up1.getFamilyNames();
final String n2 = up2.getFamilyNames();
return n1 != null && n2 != null ? n1.compareTo(n2) : n1 == null && n2 == null ? 0 : n1 == null ? 1 : -1;
});
public static Comparator<Person> PERSON_COMPARATOR_BY_NAME = Comparator.nullsLast((p1, p2) -> {
final User u1 = p1 == null ? null : p1.getUser();
final User u2 = p2 == null ? null : p2.getUser();
final UserProfile up1 = u1 == null ? null : u1.getProfile();
final UserProfile up2 = u2 == null ? null : u2.getProfile();
return PROFILE_COMPARATOR_BY_NAME.compare(up1, up2);
});
public SortedMap<Person, PersonMissionAuthorization> getParticipantAuthorizations() {
final SortedMap<Person, PersonMissionAuthorization> participantAuthorizations =
new TreeMap<Person, PersonMissionAuthorization>(PERSON_COMPARATOR_BY_NAME);
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.getPrevious() == null) {
participantAuthorizations.put(personMissionAuthorization.getSubject(), personMissionAuthorization);
}
}
for (final Person person : getParticipantesSet()) {
if (!participantAuthorizations.containsKey(person)) {
participantAuthorizations.put(person, null);
}
}
return participantAuthorizations;
}
public SortedMap<Person, Collection<ParticipantAuthorizationChain>> getPossibleParticipantAuthorizationChains() {
final SortedMap<Person, Collection<ParticipantAuthorizationChain>> participantAuthorizationChainss =
new TreeMap<Person, Collection<ParticipantAuthorizationChain>>(PERSON_COMPARATOR_BY_NAME);
for (final Person person : getParticipantesSet()) {
final Collection<ParticipantAuthorizationChain> participantAuthorizationChain =
ParticipantAuthorizationChain.getParticipantAuthorizationChains(person);
participantAuthorizationChainss.put(person, participantAuthorizationChain);
}
return participantAuthorizationChainss;
}
abstract public Country getCountry();
@Override
public void addParticipantes(final Person person) {
super.addParticipantes(person);
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.getSubject() == person) {
return;
}
}
final ParticipantAuthorizationChain participantAuthorizationChain =
ParticipantAuthorizationChain.getMostLikelyParticipantAuthorizationChain(person);
if (participantAuthorizationChain != null) {
final AuthorizationChain authorizationChain = participantAuthorizationChain.getAuthorizationChain();
new PersonMissionAuthorization(this, person, authorizationChain);
}
if (!hasMissionResponsible()) {
setMissionResponsible(person);
}
}
public boolean areAllPrevisionaryCostsAreDistributed() {
final int numberFinancers = getFinancerCount();
final Money missionCosts = calculatePrevisionaryCosts();
final Money distributedCosts = calculateDistributedCosts();
return (numberFinancers == 0 && missionCosts.isZero())
|| (!missionCosts.isZero() && missionCosts.equals(distributedCosts));
}
private Money calculatePrevisionaryCosts() {
Money result = Money.ZERO;
for (final MissionItem missionItem : getMissionItemsSet()) {
result = result.add(missionItem.getPrevisionaryCosts());
}
return result;
}
private Money calculateDistributedCosts() {
Money result = Money.ZERO;
for (final MissionFinancer missionFinancer : getFinancerSet()) {
result = result.add(missionFinancer.getAmount());
}
return result;
}
public boolean areAllParticipantAuthorizationChainsDefined() {
if (getParticipantesSet().isEmpty()) {
return false;
}
for (final Person person : getParticipantesSet()) {
final PersonMissionAuthorization personMissionAuthorization = getPersonMissionAuthorization(person);
if (personMissionAuthorization == null) {
return false;
}
}
return true;
}
protected PersonMissionAuthorization getPersonMissionAuthorization(final Person person) {
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.getSubject() == person) {
return personMissionAuthorization;
}
}
return null;
}
public boolean canAuthoriseParticipantActivity() {
final User currentUser = Authenticate.getUser();
if (currentUser == null || currentUser.getPerson() == null) {
return false;
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.canAuthoriseParticipantActivity(currentUser.getPerson())) {
return true;
}
}
return false;
}
public boolean canUnAuthoriseParticipantActivity() {
final User currentUser = Authenticate.getUser();
if (currentUser == null || currentUser.getPerson() == null) {
return false;
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.canUnAuthoriseParticipantActivity(currentUser.getPerson())) {
return true;
}
}
return false;
}
public boolean canUnAuthoriseSomeParticipantActivity() {
final User currentUser = Authenticate.getUser();
if (currentUser == null || currentUser.getPerson() == null) {
return false;
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.canUnAuthoriseSomeParticipantActivity(currentUser.getPerson())) {
return true;
}
}
return false;
}
public boolean canAllocateFund() {
if (!hasAnyFinancer()) {
return false;
}
final User user = Authenticate.getUser();
if (user == null) {
return false;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.canAllocateFunds(user.getPerson())) {
return true;
}
}
return false;
}
public boolean canAllocateProjectFund() {
if (!hasAnyProjectFinancer()) {
return false;
}
final User user = Authenticate.getUser();
if (user == null) {
return false;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.hasAnyMissionItemProjectFinancers() && financer.canAllocateProjectFunds(user.getPerson())) {
return true;
}
}
return false;
}
public boolean isDirectResponsibleForPendingProjectFundAllocation() {
if (!hasAnyProjectFinancer()) {
return false;
}
final User user = Authenticate.getUser();
if (user == null) {
return false;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.hasAnyMissionItemProjectFinancers()
&& financer.isDirectResponsibleForPendingProjectFundAllocation(user.getPerson())) {
return true;
}
}
return false;
}
public boolean getHasVehicleItem() {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem.isVehicleItem()) {
return true;
}
}
return false;
}
public Money getValue() {
Money result = Money.ZERO;
for (final MissionItem missionItem : getMissionItemsSet()) {
result = result.add(missionItem.getValue());
}
return result;
}
public boolean hasAnyAuthorizedParticipants() {
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.hasAnyAuthorization()) {
return true;
}
}
return false;
}
public Collection<DailyPersonelExpenseCategory> getPossibleDailyPersonalExpenseCategories() {
final DailyPersonelExpenseTable dailyPersonelExpenseTable = getDailyPersonelExpenseTable();
return dailyPersonelExpenseTable == null ? Collections.EMPTY_SET : dailyPersonelExpenseTable
.getSortedDailyPersonelExpenseCategories();
}
public double getFirstDayPersonelDayExpensePercentage(final PersonelExpenseItem personelExpenseItem) {
return 1;
}
public double getMiddleDayPersonelDayExpensePercentage(final PersonelExpenseItem personelExpenseItem) {
return 1;
}
public double getLastDayPersonelDayExpensePercentage(final PersonelExpenseItem personelExpenseItem) {
return 1;
}
public void unAllocateProjectFunds(Person person) {
for (final MissionFinancer financer : getFinancerSet()) {
financer.unAllocateProjectFunds(person);
}
}
public boolean isConsistent() {
if (!hasMissionResponsible()) {
return false;
}
// Check mission items individually
for (final MissionItem missionItem : getMissionItemsSet()) {
if (!missionItem.isConsistent()) {
return false;
}
}
final int numberOfMissionDays = calculateNumberOfNights() + 1;
// Cross-check personel expenses
for (final Person person : getParticipantesSet()) {
final int numberOfPersonelExpenseDays = PersonelExpenseItem.calculateNumberOfFullPersonelExpenseDays(this, person);
if (numberOfMissionDays < numberOfPersonelExpenseDays) {
return false;
}
}
// Cross-check accomodations and personel expenses
for (final Person person : getParticipantesSet()) {
final int numberOfFullPersonelExpenseDays =
FullPersonelExpenseItem.calculateNumberOfFullPersonelExpenseDays(this, person);
final int numberOfAccomodatedNights = AccommodationItem.calculateNumberOfAccomodatedNights(this, person);
if (numberOfMissionDays < numberOfFullPersonelExpenseDays + numberOfAccomodatedNights) {
return false;
}
}
// Check all financers have an accounting unit and some value attributed
for (final MissionFinancer missionFinancer : getFinancerSet()) {
if (missionFinancer.getUnit() == null || missionFinancer.getAccountingUnit() == null
|| missionFinancer.getAmount().isZero()) {
return false;
}
}
// Other basic checks
return !getParticipantesSet().isEmpty() && areAllParticipantAuthorizationChainsDefined()
&& areAllPrevisionaryCostsAreDistributed();
}
public Collection<String> getConsistencyMessages() {
final Collection<String> result = new TreeSet<String>();
if (getParticipantesSet().isEmpty()) {
// !getParticipantesSet().isEmpty()
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.participants.empty"));
} else {
// areAllParticipantAuthorizationChainsDefined()
for (final Person person : getParticipantesSet()) {
final PersonMissionAuthorization personMissionAuthorization = getPersonMissionAuthorization(person);
if (personMissionAuthorization == null) {
result.add(BundleUtil.getString("resources/MissionResources",
"message.mission.participant.authorization.chain.not.defined",
person.getUser().getProfile().getFullName()));
}
if (!hasAnyCurrentRelationToInstitution(person) && hasAnyPersonelExpenseItems(person)) {
result.add(BundleUtil.getString("resources/MissionResources",
"message.mission.participant.with.no.relation.to.institution.has.personel.expense.items",
person.getUser().getProfile().getFullName()));
}
}
}
// areAllPrevisionaryCostsAreDistributed()
final int numberFinancers = getFinancerCount();
final Money missionCosts = calculatePrevisionaryCosts();
final Money distributedCosts = calculateDistributedCosts();
if (numberFinancers > 0 && missionCosts.isZero()) {
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.with.financers.and.no.costs"));
} else if (!missionCosts.isZero() && !missionCosts.equals(distributedCosts)) {
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.costs.not.distributed"));
}
// Check mission items individually
for (final MissionItem missionItem : getMissionItemsSet()) {
if (!missionItem.isConsistent()) {
if (missionItem instanceof OtherPersonelExpenseItem
&& !((OtherPersonelExpenseItem) missionItem).doesNotExceedMaximumPossiblePersonelExpenseValue()) {
result.add(BundleUtil.getString("resources/MissionResources",
"message.mission.item.other.personel.expense.exceeds.max.value", missionItem.getLocalizedName()));
} else {
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.item.not.consistent",
missionItem.getLocalizedName()));
}
}
}
// Cross-check personel expenses
final int numberOfMissionDays = calculateNumberOfNights() + 1;
for (final Person person : getParticipantesSet()) {
final int numberOfPersonelExpenseDays = PersonelExpenseItem.calculateNumberOfFullPersonelExpenseDays(this, person);
if (numberOfMissionDays < numberOfPersonelExpenseDays) {
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.personel.expense.days.not.match",
person.getUser().getProfile().getFullName(), Integer.toString(numberOfMissionDays),
Integer.toString(numberOfPersonelExpenseDays)));
} else {
// Cross-check accomodations and personel expenses
final int numberOfFullPersonelExpenseDays =
FullPersonelExpenseItem.calculateNumberOfFullPersonelExpenseDays(this, person);
final int numberOfAccomodatedNights = AccommodationItem.calculateNumberOfAccomodatedNights(this, person);
if (numberOfMissionDays < numberOfFullPersonelExpenseDays + numberOfAccomodatedNights) {
result.add(BundleUtil.getString("resources/MissionResources",
"message.mission.full.personel.expense.days.not.match", person.getUser().getProfile().getFullName()));
}
}
}
// Check all financers have an accounting unit
for (final MissionFinancer missionFinancer : getFinancerSet()) {
if (missionFinancer.getUnit() == null || missionFinancer.getAccountingUnit() == null) {
final String unitName = missionFinancer.getUnit() != null ? missionFinancer.getUnit().getPresentationName() : "";
result.add(BundleUtil.getString("resources/MissionResources", "message.mission.financer.with.no.accounting.unit",
unitName));
}
}
return result;
}
private boolean hasAnyPersonelExpenseItems(final Person person) {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem instanceof PersonelExpenseItem && !(missionItem instanceof NoPersonelExpenseItem)) {
if (missionItem.getPeopleSet().contains(person)) {
return true;
}
}
}
return false;
}
public int calculateNumberOfNights() {
final LocalDate startDate = getDaparture().toLocalDate();
final LocalDate endDate = getArrival().toLocalDate();
return Days.daysBetween(startDate, endDate).getDays();
}
public boolean allParticipantsAreAuthorized() {
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (!personMissionAuthorization.isAuthorized()) {
return false;
}
}
return true;
}
public boolean isOnTime() {
return getDaparture().minusDays(15).isAfterNow();
}
public Integer getNunberOfLunchesToDiscount(final Person person) {
return getNunberOfLunchesToDiscount();
/* int result = 0;
if (hasAnyMissionItems()) {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem.isPersonelExpenseItem()) {
final PersonelExpenseItem personelExpenseItem = (PersonelExpenseItem) missionItem;
result += personelExpenseItem.getNunberOfLunchesToDiscount(person);
}
}
} else {
result = getNunberOfLunchesToDiscount();
}
return Integer.valueOf(result);
*/
}
private int getNunberOfLunchesToDiscount() {
int result = 0;
for (DateTime dateTime = getDaparture(); !dateTime.toDateMidnight().isAfter(getArrival().toDateMidnight()); dateTime =
dateTime.plusDays(1)) {
if (discountLunchDay(dateTime)) {
result++;
}
}
return result;
}
protected boolean discountLunchDay(final DateTime dateTime) {
final int dayOfWeek = dateTime.getDayOfWeek();
return dayOfWeek != DateTimeConstants.SATURDAY && dayOfWeek != DateTimeConstants.SUNDAY && !isHoliday(dateTime);
}
private boolean isHoliday(final DateTime dateTime) {
// TODO Possibly refactor this and place data in the repository...
// also this does not yet account for mobile holidays and local
// holidays depending on the persons working place.
final int year = dateTime.getYear();
final int monthOfYear = dateTime.getMonthOfYear();
final int dayOfMonth = dateTime.getDayOfMonth();
return (monthOfYear == 1 && dayOfMonth == 1) || (monthOfYear == 4 && dayOfMonth == 25)
|| (monthOfYear == 5 && dayOfMonth == 1) || (monthOfYear == 6 && dayOfMonth == 10)
|| (monthOfYear == 8 && dayOfMonth == 15) || (monthOfYear == 10 && dayOfMonth == 5)
|| (monthOfYear == 11 && dayOfMonth == 1) || (monthOfYear == 12 && dayOfMonth == 1)
|| (monthOfYear == 12 && dayOfMonth == 8) || (monthOfYear == 12 && dayOfMonth == 25)
|| (year == 2011 && monthOfYear == 4 && dayOfMonth == 22)
|| (year == 2011 && monthOfYear == 6 && dayOfMonth == 13)
|| (year == 2011 && monthOfYear == 6 && dayOfMonth == 23);
}
public int getNunberOfLunchesToDiscountOnFirstPersonelExpenseDay(final PersonelExpenseItem personelExpenseItem) {
return 1;
}
public int getNunberOfLunchesToDiscountOnLastPersonelExpenseDay(final PersonelExpenseItem personelExpenseItem) {
return 1;
}
public DailyPersonelExpenseTable getDailyPersonelExpenseTable() {
return DailyPersonelExpenseTable.findDailyPersonelExpenseTableFor(getClass(), new LocalDate());
}
public boolean getWithSalary(final Person participant) {
return !getParticipantesWithoutSalarySet().contains(participant);
}
public boolean areAllParticipantsAuthorized() {
if (getPersonMissionAuthorizationsSet().size() == 0) {
return false;
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (!personMissionAuthorization.isAuthorized()) {
return false;
}
}
return true;
}
public boolean areAllParticipantsAuthorizedForPhaseOne() {
if (getPersonMissionAuthorizationsSet().size() == 0) {
return false;
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (!personMissionAuthorization.isPreAuthorized()) {
return false;
}
}
return true;
}
public int getPersonAuthorizationChainSize(final Person person) {
final PersonMissionAuthorization personMissionAuthorization = getPersonMissionAuthorization(person);
return personMissionAuthorization == null ? 0 : personMissionAuthorization.getChainSize();
}
public boolean isExpenditureAuthorized() {
if (!hasAnyFinancer()) {
return false;
}
for (final MissionFinancer missionFinancer : getFinancerSet()) {
if (!missionFinancer.isAuthorized()) {
return false;
}
}
return true;
}
public String getMissionResponsibleName() {
return hasMissionResponsible() ? getMissionResponsible().getPartyName().getContent() : null;
}
public Money getTotalCost() {
Money result = Money.ZERO;
for (final MissionItem missionItem : getMissionItemsSet()) {
result = result.add(missionItem.getValue());
}
return result;
}
public Money getTotalPrevisionaryCost() {
Money result = Money.ZERO;
for (final MissionItem missionItem : getMissionItemsSet()) {
result = result.add(missionItem.getPrevisionaryCosts());
}
return result;
}
public int getDurationInDays() {
return Days.daysBetween(getDaparture(), getArrival()).getDays();
}
public boolean isPendingParticipantAuthorisationBy(final User user) {
final Person person = user.getPerson();
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (isPendingParticipantAuthorisationBy(person, personMissionAuthorization)) {
return true;
}
}
return false;
}
private boolean isPendingParticipantAuthorisationBy(Person person, PersonMissionAuthorization personMissionAuthorization) {
final AccountabilityType workingAccountabilityType = personMissionAuthorization.getWorkingAccountabilityType();
final LocalDate now = new LocalDate();
for (PersonMissionAuthorization p = personMissionAuthorization; p != null; p = p.getNext()) {
if (p.isAvailableForAuthorization() && p.getAuthority() == null && p.getDelegatedAuthority() == null) {
final module.organization.domain.Unit unit = p.getUnit();
return unit.getChildAccountabilityStream().anyMatch(a -> a.isActive(now) && a.getChild() == person
&& isResponsibleAccountabilityType(a.getAccountabilityType(), workingAccountabilityType));
}
}
return false;
}
private boolean isResponsibleAccountabilityType(final AccountabilityType accountabilityType,
final AccountabilityType workingAccountabilityType) {
final MissionSystem missionSystem = MissionSystem.getInstance();
for (final MissionAuthorizationAccountabilityType missionAuthorizationAccountabilityType : missionSystem
.getMissionAuthorizationAccountabilityTypesSet()) {
if ((missionAuthorizationAccountabilityType.getAccountabilityType() == workingAccountabilityType
|| workingAccountabilityType == null)
&& missionAuthorizationAccountabilityType.getAccountabilityTypesSet().contains(accountabilityType)) {
return true;
}
}
return false;
}
public boolean isAuthorized() {
if (!hasAnyMissionItems()) {
return false;
}
for (final MissionFinancer missionFinancer : getFinancerSet()) {
if (!missionFinancer.isAuthorized()) {
return false;
}
}
return true;
}
public String getDestinationDescription() {
return getLocation();
}
public boolean isAccountingEmployee(final pt.ist.expenditureTrackingSystem.domain.organization.Person expenditurePerson) {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
final AccountingUnit accountingUnit = missionFinancer.getAccountingUnit();
if (accountingUnit != null && accountingUnit.getPeopleSet().contains(expenditurePerson)) {
return true;
}
}
return false;
}
public boolean isProjectAccountingEmployee(
final pt.ist.expenditureTrackingSystem.domain.organization.Person expenditurePerson) {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
if (missionFinancer.isProjectFinancer()) {
final AccountingUnit accountingUnit = missionFinancer.getAccountingUnit();
if (accountingUnit.getProjectAccountantsSet().contains(expenditurePerson)) {
return true;
}
}
}
return false;
}
public boolean isDirectProjectAccountingEmployee(
final pt.ist.expenditureTrackingSystem.domain.organization.Person expenditurePerson) {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
final Person person = expenditurePerson.getUser() != null ? expenditurePerson.getUser().getPerson() : null;
if (missionFinancer.isProjectFinancer() && missionFinancer.isAccountManager(person)) {
final AccountingUnit accountingUnit = missionFinancer.getAccountingUnit();
if (accountingUnit.getProjectAccountantsSet().contains(expenditurePerson)) {
return true;
}
}
}
return false;
}
public boolean isParticipantResponsible(final Person person) {
if (person != null) {
final LocalDate now = new LocalDate();
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (isResponsibleFor(now, person, personMissionAuthorization)) {
return true;
}
}
}
return false;
}
private boolean isResponsibleFor(final LocalDate now, final Person person,
final PersonMissionAuthorization personMissionAuthorization) {
final module.organization.domain.Unit unit = personMissionAuthorization.getUnit();
if (person.getParentAccountabilityStream().anyMatch(a -> a.isActive(now) && a.getParent() == unit
&& getMissionSystem().isAccountabilityTypesThatAuthorize(a.getAccountabilityType()))) {
return true;
}
return personMissionAuthorization.getNext() != null ? isResponsibleFor(now, person,
personMissionAuthorization.getNext()) : false;
}
public boolean isFinancerAccountant(final pt.ist.expenditureTrackingSystem.domain.organization.Person person) {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
final AccountingUnit accountingUnit = missionFinancer.getAccountingUnit();
if (accountingUnit != null) {
if (accountingUnit.getPeopleSet().contains(person) || accountingUnit.getProjectAccountantsSet().contains(person)
|| accountingUnit.getTreasuryMembersSet().contains(person)
|| accountingUnit.getResponsiblePeopleSet().contains(person)
|| accountingUnit.getResponsibleProjectAccountantsSet().contains(person)) {
return true;
}
}
}
return false;
}
public boolean isFinancerResponsible(final pt.ist.expenditureTrackingSystem.domain.organization.Person expenditurePerson) {
for (final MissionFinancer missionFinancer : getFinancerSet()) {
final Unit unit = missionFinancer.getUnit();
if (unit != null && unit.isResponsible(expenditurePerson)) {
return true;
}
}
return false;
}
public static boolean isPersonelSectionMember(final User user) {
for (final AccountabilityTypeQueue accountabilityTypeQueue : MissionSystem.getInstance()
.getAccountabilityTypeQueuesSet()) {
final WorkflowQueue workflowQueue = accountabilityTypeQueue.getWorkflowQueue();
if (workflowQueue.isUserAbleToAccessQueue(user)) {
return true;
}
}
return false;
}
public SortedSet<MissionChangeDescription> getSortedMissionChangeDescriptions() {
final SortedSet<MissionChangeDescription> result =
new TreeSet<MissionChangeDescription>(MissionChangeDescription.COMPARATOR_BY_WHEN);
result.addAll(getMissionChangeDescriptionSet());
return result;
}
public Set<String> getAllFundAllocations() {
final Set<String> result = new TreeSet<String>();
final String fundAllocationLog = getFundAllocationLog();
if (fundAllocationLog != null && !fundAllocationLog.isEmpty()) {
final String[] fundAllocations = fundAllocationLog.split(";");
for (final String fundAllocation : fundAllocations) {
result.add(fundAllocation);
}
}
return result;
}
public void registerFundAllocation(final String newFundAllocation) {
final Set<String> fundAllocations = getAllFundAllocations();
fundAllocations.add(newFundAllocation);
registerFundAllocation(fundAllocations);
}
protected void registerFundAllocation(final Set<String> fundAllocations) {
final StringBuilder stringBuilder = new StringBuilder();
for (final String fundAllocation : fundAllocations) {
if (stringBuilder.length() > 0) {
stringBuilder.append(';');
}
stringBuilder.append(fundAllocation);
}
setFundAllocationLog(stringBuilder.toString());
}
public MissionVersion getMissionVersion() {
MissionVersion result = null;
MissionVersion last = null;
for (final MissionVersion missionVersion : getMissionVersionsSet()) {
final DateTime since = missionVersion.getSinceDateTime();
if (!since.isAfterNow()) {
if (result == null || result.getSinceDateTime().isBefore(since)) {
result = missionVersion;
}
}
if (last == null || last.getSinceDateTime().isAfter(since)) {
last = missionVersion;
}
}
return result == null ? last : result;
}
public void migrate() {
if (getMissionVersionsSet().size() == 0) {
final MissionVersion missionVersion = new MissionVersion(this);
final DateTime firstOperation = findFirstOperations();
missionVersion.setSinceDateTime(firstOperation);
missionVersion.setDates(super.getDaparture(), super.getArrival());
//missionVersion.getMissionItemsSet().addAll(super.getMissionItemsSet());
//missionVersion.getFinancerSet().addAll(super.getFinancerSet());
}
for (final MissionVersion missionVersion : getMissionVersionsSet()) {
if (missionVersion.getIsArchived() == null) {
missionVersion.setIsArchived(Boolean.FALSE);
}
}
}
private DateTime findFirstOperations() {
return getMissionProcess().getExecutionLogStream().min(WorkflowLog.COMPARATOR_BY_WHEN)
.map(l -> l.getWhenOperationWasRan()).orElseGet(() -> new DateTime());
}
public int getFinancerCount() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getFinancerSet().size();
}
public boolean hasAnyFinancer() {
final MissionVersion missionVersion = getMissionVersion();
return !missionVersion.getFinancerSet().isEmpty();
}
public Set<MissionFinancer> getFinancerSet() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getFinancerSet();
}
public int getMissionItemsCount() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getMissionItemsSet().size();
}
public boolean hasAnyMissionItems() {
final MissionVersion missionVersion = getMissionVersion();
return !missionVersion.getMissionItemsSet().isEmpty();
}
public boolean hasAnyVehicleItems() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.hasAnyVehicleItems();
}
public Set<MissionItem> getMissionItemsSet() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getMissionItemsSet();
}
public boolean isReadyForMissionTermination() {
return getArrival().isBeforeNow() && !sentForTermination() && areAllParticipantsAuthorized()
&& (!hasAnyFinancer() || areAllFundsAuthorized());
}
private boolean areAllFundsAuthorized() {
return isAuthorized();
}
private boolean sentForTermination() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getChangesAfterArrival() != null;
}
public void sendForProcessTermination(final String descriptionOfChangesAfterArrival) {
final MissionVersion missionVersion;
if (descriptionOfChangesAfterArrival == null || descriptionOfChangesAfterArrival.isEmpty()) {
missionVersion = getMissionVersion();
missionVersion.setChangesAfterArrival(Boolean.FALSE);
} else {
missionVersion = new MissionVersion(this);
missionVersion.setChangesAfterArrival(Boolean.TRUE);
missionVersion.setDescriptionOfChangesAfterArrival(descriptionOfChangesAfterArrival);
}
missionVersion.autoArchive();
}
public boolean isTerminatedWithChanges() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.isTerminatedWithChanges();
}
public boolean isArchived() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.getIsArchived().booleanValue();
}
public boolean isTerminated() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.isTerminated();
}
public boolean canArchiveMission() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.canArchiveMission();
}
public boolean canArchiveMissionDirect() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.canArchiveMissionDirect();
}
public boolean isRequestorOrResponsible() {
final User user = Authenticate.getUser();
final Person person = user == null ? null : user.getPerson();
return person == getRequestingPerson() || person == getMissionResponsible();
}
public boolean hasNoItemsAndParticipantesAreAuthorized() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion.hasNoItemsAndParticipantesAreAuthorized();
}
public boolean isReadyToHaveAssociatedPaymentProcesses() {
return isAuthorized() && hasAnyNonPersonalExpenseMissionItems() && areAllParticipantsAuthorized();
}
private boolean hasAnyNonPersonalExpenseMissionItems() {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (!missionItem.isPersonelExpenseItem()) {
return true;
}
}
return false;
}
public void revertProcessTermination() {
final MissionVersion missionVersion = getMissionVersion();
final String descriptionOfChangesAfterArrival = missionVersion.getDescriptionOfChangesAfterArrival();
if (descriptionOfChangesAfterArrival == null || descriptionOfChangesAfterArrival.isEmpty()) {
missionVersion.setChangesAfterArrival(null);
} else {
final MissionVersion newMissionVersion = new MissionVersion(this);
newMissionVersion.setChangesAfterArrival(null);
newMissionVersion.setDescriptionOfChangesAfterArrival(null);
}
missionVersion.unArchive();
}
public boolean isUnitObserver(final User user) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.isUnitObserver(user)) {
return true;
}
}
for (final PersonMissionAuthorization personMissionAuthorization : getPersonMissionAuthorizationsSet()) {
if (personMissionAuthorization.isUnitObserver(user)) {
return true;
}
}
return false;
}
public boolean containsAccountManager(final Person accountManager) {
if (accountManager != null) {
final User user = accountManager.getUser();
if (user != null) {
final pt.ist.expenditureTrackingSystem.domain.organization.Person person = user.getExpenditurePerson();
if (person != null) {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.getAccountManager() == accountManager.getUser().getExpenditurePerson()) {
return true;
}
}
}
}
}
return false;
}
public boolean getAreAccomodationItemsAvailable() {
return !getGrantOwnerEquivalence().booleanValue() && this instanceof ForeignMission;
}
public boolean getPersonelExpenseItemsAvailable() {
return !getGrantOwnerEquivalence().booleanValue();
}
public boolean canTogleMissionNature() {
return (getGrantOwnerEquivalence().booleanValue())
|| (MissionSystem.getInstance().allowGrantOwnerEquivalence() && !hasAnyPersonalExpenseOrAccomodationItemns());
}
private boolean hasAnyPersonalExpenseOrAccomodationItemns() {
for (final MissionItem missionItem : getMissionItemsSet()) {
if (missionItem instanceof AccommodationItem) {
return true;
}
if (missionItem instanceof PersonelExpenseItem && !(missionItem instanceof NoPersonelExpenseItem)) {
return true;
}
}
return false;
}
public int getNumberOfDays() {
int result = 1;
for (DateTime d = getDaparture(); d.isBefore(getArrival()); d = d.plusDays(1)) {
result++;
}
return result;
}
public void checkForAnyOverlappingParticipations() {
for (final Person person : getParticipantesSet()) {
for (final Mission mission : person.getMissionsSet()) {
final MissionProcess process = mission.getMissionProcess();
if (mission != this && !process.isCanceled() && overlaps(mission)) {
throw new DomainException(Bundle.EXPENDITURE,
BundleUtil.getString("resources/MissionResources", "error.mission.overlaps.participation",
person.getPresentationName(), process.getProcessIdentification(),
ExpenditureTrackingSystem.getInstance().getInstitutionManagementEmail()));
}
}
}
}
public Interval getInterval() {
final DateTime departure = getDaparture();
final DateTime arrival = getArrival();
return new Interval(departure, arrival);
}
public boolean overlaps(final Mission mission) {
final Interval interval = mission.getInterval();
return getInterval().overlaps(interval);
}
public boolean hasAnyCurrentRelationToInstitution(final Person person) {
final LocalDate arrivalDate = getArrival().toLocalDate();
return person.getParentAccountabilityStream()
.anyMatch(a -> a.isActive(arrivalDate) && a.isValid() && MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE.test(a));
}
public String getCurrentRelationToInstitution(final Person person) {
final LocalDate arrivalDate = getArrival().toLocalDate();
final StringBuilder builder = new StringBuilder();
person.getParentAccountabilityStream()
.filter(a -> a.isActive(arrivalDate) && a.isValid() && MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE.test(a))
.forEach(new Consumer<Accountability>() {
@Override
public void accept(Accountability a) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append(a.getAccountabilityType().getName().getContent());
}
});
return builder.length() == 0 ? BundleUtil.getString("resources/MissionResources",
"label.participant.no.relation.to.institution") : builder.toString();
}
public boolean hasCommitmentNumber() {
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.getCommitmentNumber() != null && !financer.getCommitmentNumber().isEmpty()) {
return true;
}
}
return false;
}
public boolean hasAllCommitmentNumbers() {
final Boolean requireCommitmentNumber = ExpenditureTrackingSystem.getInstance().getRequireCommitmentNumber();
if (requireCommitmentNumber != null && !requireCommitmentNumber.booleanValue()) {
return true;
}
for (final MissionFinancer financer : getFinancerSet()) {
if (financer.getCommitmentNumber() == null || financer.getCommitmentNumber().isEmpty()) {
return false;
}
}
return true;
}
public String getAccountingUnitsAsString() {
final StringBuilder builder = new StringBuilder();
for (final MissionFinancer financer : getFinancerSet()) {
final AccountingUnit accountingUnit = financer.getAccountingUnit();
if (accountingUnit != null) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append(accountingUnit.getName());
}
}
return builder.toString();
}
public Set<MissionItem> getMissionItems() {
final MissionVersion missionVersion = getMissionVersion();
return missionVersion == null ? Collections.<MissionItem> emptySet() : missionVersion.getMissionItemsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionVersion> getMissionVersions() {
return getMissionVersionsSet();
}
@Deprecated
public java.util.Set<module.mission.domain.PersonMissionAuthorization> getPersonMissionAuthorizations() {
return getPersonMissionAuthorizationsSet();
}
@Deprecated
public java.util.Set<module.organization.domain.Person> getParticipantes() {
return getParticipantesSet();
}
@Deprecated
public java.util.Set<module.mission.domain.MissionChangeDescription> getMissionChangeDescription() {
return getMissionChangeDescriptionSet();
}
@Deprecated
public java.util.Set<module.organization.domain.Person> getParticipantesWithoutSalary() {
return getParticipantesWithoutSalarySet();
}
@Deprecated
public boolean hasAnyMissionVersions() {
return !getMissionVersionsSet().isEmpty();
}
@Deprecated
public boolean hasAnyPersonMissionAuthorizations() {
return !getPersonMissionAuthorizationsSet().isEmpty();
}
@Deprecated
public boolean hasAnyParticipantes() {
return !getParticipantesSet().isEmpty();
}
@Deprecated
public boolean hasAnyMissionChangeDescription() {
return !getMissionChangeDescriptionSet().isEmpty();
}
@Deprecated
public boolean hasAnyParticipantesWithoutSalary() {
return !getParticipantesWithoutSalarySet().isEmpty();
}
@Deprecated
public boolean hasLocation() {
return getLocation() != null;
}
@Deprecated
public boolean hasObjective() {
return getObjective() != null;
}
@Deprecated
public boolean hasGrantOwnerEquivalence() {
return getGrantOwnerEquivalence() != null;
}
@Deprecated
public boolean hasIsApprovedByMissionResponsible() {
return getIsApprovedByMissionResponsible() != null;
}
@Deprecated
public boolean hasFundAllocationLog() {
return getFundAllocationLog() != null;
}
@Deprecated
public boolean hasServiceGaranteeInstante() {
return getServiceGaranteeInstante() != null;
}
@Deprecated
public boolean hasDaparture() {
return getDaparture() != null;
}
@Deprecated
public boolean hasArrival() {
return getArrival() != null;
}
@Deprecated
public boolean hasRequestingUnit() {
return getRequestingUnit() != null;
}
@Deprecated
public boolean hasMissionResponsible() {
return getMissionResponsible() != null;
}
@Deprecated
public boolean hasRequestingPerson() {
return getRequestingPerson() != null;
}
@Deprecated
public boolean hasMissionSystem() {
return getMissionSystem() != null;
}
@Deprecated
public boolean hasApprovalForMissionWithNoFinancers() {
return getApprovalForMissionWithNoFinancers() != null;
}
@Deprecated
public boolean hasServiceGaranteePerson() {
return getServiceGaranteePerson() != null;
}
@Deprecated
public boolean hasMissionProcess() {
return getMissionProcess() != null;
}
public boolean participantsBelongToInstitution() {
for (final Person person : getParticipantesSet()) {
if (hasAnyCurrentRelationToInstitution(person)) {
return true;
}
}
return false;
}
public Money getMaxDailyAccomodationValue() {
return null;
}
}