/*
* @(#)MissionOrganizationAction.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.presentationTier.action;
import java.util.Collection;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections.ComparatorUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.core.security.Authenticate;
import org.fenixedu.bennu.struts.annotations.Mapping;
import org.fenixedu.bennu.struts.portal.EntryPoint;
import org.fenixedu.bennu.struts.portal.StrutsFunctionality;
import org.joda.time.LocalDate;
import jvstm.cps.ConsistencyException;
import module.mission.domain.MissionSystem;
import module.mission.domain.util.FunctionDelegationBean;
import module.mission.domain.util.SearchUnitMemberPresence;
import module.mission.presentationTier.dto.SearchMissionsDTO;
import module.organization.domain.Accountability;
import module.organization.domain.AccountabilityType;
import module.organization.domain.FunctionDelegation;
import module.organization.domain.OrganizationalModel;
import module.organization.domain.Party;
import module.organization.domain.Person;
import module.organization.domain.Unit;
import pt.ist.expenditureTrackingSystem.domain.RoleType;
import pt.ist.expenditureTrackingSystem.domain.util.DomainException;
import pt.ist.expenditureTrackingSystem.presentationTier.actions.BaseAction;
@StrutsFunctionality(app = MissionProcessAction.class, path = "missionOrganization", titleKey = "link.sideBar.organization")
@Mapping(path = "/missionOrganization")
/**
*
* @author João Neves
* @author Luis Cruz
*
*/
public class MissionOrganizationAction extends BaseAction {
@Override
public ActionForward execute(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) throws Exception {
final ActionForward forward = super.execute(mapping, form, request, response);
// OrganizationModelAction.addHeadToLayoutContext(request);
return forward;
}
@EntryPoint
public ActionForward showPerson(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final User currentUser = Authenticate.getUser();
final Person person = currentUser.getPerson();
return showPerson(person, request);
}
public ActionForward showPersonById(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final Person person = getDomainObject(request, "personId");
return showPerson(person, request);
}
public ActionForward showPerson(final Person person, final HttpServletRequest request) {
return new ActionForward("/expenditure-tracking/manageMissions?partyId=" + person.getExternalId(), true);
}
public ActionForward showUnitById(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final Unit unit = getDomainObject(request, "unitId");
return showUnit(unit, request);
}
public ActionForward showUnit(final Unit unit, final HttpServletRequest request) {
return new ActionForward("/expenditure-tracking/manageMissions?partyId=" + unit.getExternalId(), true);
}
public ActionForward addUnitWithResumedAuthorizations(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final Unit unit = getDomainObject(request, "unitId");
MissionSystem.getInstance().addUnitWithResumedAuthorizations(unit);
return showUnit(unit, request);
}
public ActionForward removeUnitWithResumedAuthorizations(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final Unit unit = getDomainObject(request, "unitId");
MissionSystem.getInstance().removeUnitWithResumedAuthorizations(unit);
return showUnit(unit, request);
}
public ActionForward showDelegationsForAuthorization(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final Accountability accountability = getDomainObject(request, "authorizationId");
return showDelegationsForAuthorization(request, accountability);
}
public ActionForward showDelegationsForAuthorization(final HttpServletRequest request, final Accountability accountability) {
String sortBy = request.getParameter("sortBy");
String order = request.getParameter("order");
request.setAttribute("sortBy", (sortBy == null) ? "parentUnitName" : sortBy);
request.setAttribute("order", (order == null) ? "asc" : order);
request.setAttribute("accountability", accountability);
Comparator<FunctionDelegation> comparator;
if (StringUtils.equals(sortBy, "childPartyName")) {
comparator = FunctionDelegation.COMPARATOR_BY_DELEGATEE_CHILD_PARTY_NAME;
} else {
comparator = FunctionDelegation.COMPARATOR_BY_DELEGATEE_PARENT_UNIT_NAME;
}
if (StringUtils.equals(order, "desc")) {
comparator = ComparatorUtils.reversedComparator(comparator);
}
TreeSet<FunctionDelegation> functionDelegationDelegated = new TreeSet<FunctionDelegation>(comparator);
functionDelegationDelegated.addAll(accountability.getFunctionDelegationDelegatedSet());
request.setAttribute("functionDelegationDelegated", functionDelegationDelegated);
return forward("/mission/showDelegationForAuthorization.jsp");
}
public ActionForward prepareAddDelegationsForAuthorization(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final Accountability accountability = getDomainObject(request, "authorizationId");
final FunctionDelegationBean functionDelegationBean = new FunctionDelegationBean(accountability);
request.setAttribute("functionDelegationBean", functionDelegationBean);
return forward("/mission/addDelegationForAuthorization.jsp");
}
public ActionForward addDelegationsForAuthorization(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final FunctionDelegationBean functionDelegationBean = getRenderedObject();
final Accountability accountability = functionDelegationBean.getAccountability();
final Unit unit = functionDelegationBean.getUnit();
final Person person = functionDelegationBean.getPerson();
final LocalDate beginDate = functionDelegationBean.getBeginDate();
final LocalDate endDate = functionDelegationBean.getEndDate();
try {
FunctionDelegation.create(accountability, unit, person, beginDate, endDate);
} catch (DomainException ex) {
addLocalizedMessage(request, ex.getLocalizedMessage());
request.setAttribute("authorizationId", accountability.getExternalId());
return prepareAddDelegationsForAuthorization(mapping, form, request, response);
} catch (ConsistencyException exc) {
displayConsistencyException(exc, request);
request.setAttribute("authorizationId", accountability.getExternalId());
return prepareAddDelegationsForAuthorization(mapping, form, request, response);
}
return showDelegationsForAuthorization(request, accountability);
}
public ActionForward prepareEditDelegation(final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response) {
final FunctionDelegation functionDelegation = getDomainObject(request, "functionDelegationId");
final FunctionDelegationBean functionDelegationBean = new FunctionDelegationBean(functionDelegation);
request.setAttribute("functionDelegationBean", functionDelegationBean);
return forward("/mission/editDelegation.jsp");
}
public ActionForward editDelegation(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final FunctionDelegationBean functionDelegationBean = getRenderedObject("functionDelegationBean");
final FunctionDelegation functionDelegation = functionDelegationBean.getFunctionDelegation();
final LocalDate beginDate = functionDelegationBean.getBeginDate();
final LocalDate endDate = functionDelegationBean.getEndDate();
try {
functionDelegation.edit(beginDate, endDate);
} catch (DomainException ex) {
addLocalizedMessage(request, ex.getLocalizedMessage());
request.setAttribute("functionDelegationId", functionDelegation.getExternalId());
return prepareEditDelegation(mapping, form, request, response);
} catch (ConsistencyException exc) {
displayConsistencyException(exc, request);
request.setAttribute("functionDelegationId", functionDelegation.getExternalId());
return prepareEditDelegation(mapping, form, request, response);
}
return showDelegationsForAuthorization(request, functionDelegationBean.getAccountability());
}
public ActionForward removeDelegation(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final FunctionDelegation functionDelegation = getDomainObject(request, "functionDelegationId");
Accountability accountabilityDelegator = functionDelegation.getAccountabilityDelegator();
functionDelegation.delete();
return showDelegationsForAuthorization(request, accountabilityDelegator);
}
public ActionForward viewPresences(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
SearchUnitMemberPresence searchUnitMemberPresence = getRenderedObject();
final Unit unit;
final boolean doSearch;
if (searchUnitMemberPresence == null) {
unit = getDomainObject(request, "unitId");
searchUnitMemberPresence = new SearchUnitMemberPresence(unit);
doSearch = false;
} else {
unit = searchUnitMemberPresence.getUnit();
doSearch = true;
}
if (!hasPermission(unit)) {
addLocalizedMessage(request, BundleUtil.getString("resources/MissionResources", "label.not.authorized"));
return showUnit(unit, request);
}
request.setAttribute("searchUnitMemberPresence", searchUnitMemberPresence);
if (doSearch) {
final Set<Person> people = searchUnitMemberPresence.search();
request.setAttribute("people", people);
}
return forward("/mission/viewPresences.jsp");
}
public static boolean hasPermission(final Unit unit) {
final User user = Authenticate.getUser();
if (user == null) {
return false;
}
if (RoleType.MANAGER.group().isMember(user)) {
return true;
}
final Person person = user == null ? null : user.getPerson();
if (person != null) {
if (person.getParentAccountabilityStream().filter(MissionSystem.AUTHORIZATION_PREDICATE).map(a -> a.getParent())
.anyMatch(p -> hasPermissionForParents(p, unit))) {
return true;
}
if (user.getExpenditurePerson() != null && unit.getExpenditureUnit() != null) {
if (user.getExpenditurePerson().getObservableUnitsSet().contains(unit.getExpenditureUnit())) {
return true;
}
}
}
return unit.getParentAccountabilityStream()
.anyMatch(a -> match(a, MissionSystem.getInstance().getAccountabilityTypesForUnits()) && a.getParent().isUnit()
&& hasPermission((Unit) a.getParent()));
}
private static boolean match(final Accountability a, final Collection<AccountabilityType> types) {
return types.isEmpty() || types.contains(a.getAccountabilityType());
}
private static boolean hasPermissionForParents(final Party authorization, final Unit unit) {
if (authorization == unit) {
return true;
}
final OrganizationalModel organizationalModel = MissionSystem.getInstance().getOrganizationalModel();
return unit.getParentAccountabilityStream()
.filter(a -> organizationalModel.getAccountabilityTypesSet().contains(a.getAccountabilityType()))
.map(a -> a.getParent()).anyMatch(p -> p.isUnit() && hasPermissionForParents(authorization, (Unit) p));
}
public ActionForward searchMission(final ActionMapping mapping, final ActionForm form, final HttpServletRequest request,
final HttpServletResponse response) {
final Person person = getDomainObject(request, "personId");
SearchMissionsDTO searchMissions = new SearchMissionsDTO();
searchMissions.setParticipant(person);
searchMissions.setProcessNumber("");
return new SearchMissionsAction().search(searchMissions, request);
}
}