package pt.ist.expenditureTrackingSystem.ui;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Comparator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import module.mission.domain.MissionSystem;
import module.mission.domain.util.AuthorizationChain;
import module.mission.domain.util.FindUnitMemberPresence;
import module.mission.domain.util.ParticipantAuthorizationChain;
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 org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.security.Authenticate;
import org.fenixedu.bennu.spring.portal.SpringApplication;
import org.fenixedu.bennu.spring.portal.SpringFunctionality;
import org.fenixedu.commons.StringNormalizer;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import pt.ist.expenditureTrackingSystem.domain.ExpenditureTrackingSystem;
import pt.ist.expenditureTrackingSystem.domain.RoleType;
import pt.ist.fenixWebFramework.servlets.filters.contentRewrite.GenericChecksumRewriter;
import pt.ist.fenixframework.DomainObject;
import pt.ist.fenixframework.FenixFramework;
import com.google.common.base.Strings;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@SpringApplication(group = "logged", path = "expenditure-tracking", title = "title.mission.manage.missions",
hint = "expenditure-tracking")
@SpringFunctionality(app = MissionResponsibilityController.class, title = "title.mission.manage.missions")
@RequestMapping("/expenditure-tracking/manageMissions")
public class MissionResponsibilityController {
@RequestMapping
public String search(@RequestParam(required = false) String partyId, final Model model) throws Exception {
model.addAttribute("partyId", partyId);
if ((partyId != null && partyId != "")) {
final DomainObject o = FenixFramework.getDomainObject(partyId);
if (o instanceof User) {
model.addAttribute("selectedUser", o);
model.addAttribute("linha", "");
model.addAttribute("er", true);
return showPerson((User) o, model);
} else if (o instanceof module.organization.domain.Unit) {
model.addAttribute("notActive", false);
model.addAttribute("notAutorize", false);
model.addAttribute("selectedUnit", o);
model.addAttribute("notAutorize", false);
return showUnit((Unit) o, model);
} else if (o instanceof Person) {
User user = ((Person) o).getUser();
model.addAttribute("selectedUser", o);
model.addAttribute("linha", "");
model.addAttribute("er", true);
return showPerson(user, model);
}
}
return "redirect:/mission/missionOrganization";
}
@RequestMapping(value = "/populate/json", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public @ResponseBody String populate(@RequestParam(required = false, value = "term") String term, HttpServletRequest request,
final HttpServletResponse response, final Model model) {
final JsonArray result = new JsonArray();
try {
String trimmedValue = URLDecoder.decode(term, "UTF-8").trim();
final String[] input = StringNormalizer.normalize(trimmedValue).split(" ");
findUnits(result, input);
findPeople(result, input);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
return result.toString();
}
@RequestMapping(value = "/user/json", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public @ResponseBody String user(@RequestParam(required = false, value = "term") String term, final Model model) {
final JsonArray result = new JsonArray();
try {
String trimmedValue = URLDecoder.decode(term, "UTF-8").trim();
final String[] input = StringNormalizer.normalize(trimmedValue).split(" ");
findPeople(result, input);
return result.toString();
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
@RequestMapping(value = "/unit/json", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public @ResponseBody String unit(@RequestParam(required = false, value = "term") String term, final Model model) {
final JsonArray result = new JsonArray();
try {
String trimmedValue = URLDecoder.decode(term, "UTF-8").trim();
final String[] input = StringNormalizer.normalize(trimmedValue).split(" ");
findUnits(result, input);
return result.toString();
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
@RequestMapping(value = "/allUnit/json", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public @ResponseBody String allUnit(@RequestParam(required = false, value = "term") String term, final Model model) {
final JsonArray result = new JsonArray();
try {
String trimmedValue = URLDecoder.decode(term, "UTF-8").trim();
final String[] input = StringNormalizer.normalize(trimmedValue).split(" ");
findAllUnits(result, input);
return result.toString();
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
private void findPeople(JsonArray result, String[] input) {
findPeople(input).forEach(u -> addPersonToJson(result, u));
}
private void addPersonToJson(JsonArray result, User u) {
final JsonObject o = new JsonObject();
o.addProperty("id", u.getExternalId());
o.addProperty("name", u.getProfile().getFullName() + " (" + u.getUsername() + ")");
result.add(o);
}
private void findUnits(JsonArray result, String[] input) {
final OrganizationalModel model = MissionSystem.getInstance().getOrganizationalModel();
final Set<AccountabilityType> typesSet = model.getAccountabilityTypesSet();
model.getPartiesSet().forEach(p -> findUnits(result, input, typesSet, p));
}
private void findUnits(JsonArray result, String[] input, final Set<AccountabilityType> typesSet, Party p) {
if (p.isUnit()) {
final module.organization.domain.Unit unit = (module.organization.domain.Unit) p;
if (hasMatch(input, StringNormalizer.normalize(unit.getPresentationName()).toLowerCase())) {
final JsonObject o = new JsonObject();
o.addProperty("id", unit.getExternalId());
o.addProperty("name", unit.getPresentationName());
result.add(o);
}
unit.getChildAccountabilityStream().filter(a -> a.isActiveNow() && typesSet.contains(a.getAccountabilityType()))
.forEach(a -> findUnits(result, input, typesSet, a.getChild()));
}
}
private void findAllUnits(JsonArray result, String[] input) {
Stream<Party> stream = Bennu.getInstance().getPartiesSet().stream();
Supplier<TreeSet<Party>> s = () -> new TreeSet<Party>(Comparator.comparing(u -> u.getPresentationName()));
stream.filter(p -> p.isUnit() && hasMatch(input, StringNormalizer.normalize(p.getPresentationName()).toLowerCase()))
.collect(Collectors.toCollection(s)).forEach(u -> addToJson(result, u));
}
private void addToJson(JsonArray result, Party p) {
final JsonObject o = new JsonObject();
o.addProperty("id", p.getExternalId());
o.addProperty("name", p.getPresentationName());
result.add(o);
}
private Stream<User> findPeople(String[] input) {
final Stream<User> users = Bennu.getInstance().getUserSet().stream();
return users.filter(u -> match(input, u));
}
private boolean match(String[] values, User u) {
return (values.length == 1 && u.getUsername().equalsIgnoreCase(values[0]))
|| (u.getProfile() != null && hasMatch(values, StringNormalizer.normalize(u.getProfile().getFullName())
.toLowerCase()));
}
private boolean hasMatch(final String[] input, final String unitNameParts) {
for (final String namePart : input) {
if (unitNameParts.indexOf(namePart) == -1) {
return false;
}
}
return true;
}
public String showPerson(final User user, final Model model) throws Exception {
final module.organization.domain.Person person = user.getPerson();
final Collection<Accountability> workingPlaceAccountabilities =
person.getParentAccountabilityStream().filter(MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE)
.collect(Collectors.toSet());
final Collection<Accountability> authorityAccountabilities =
person.getParentAccountabilityStream().filter(MissionSystem.AUTHORIZATION_PREDICATE).collect(Collectors.toSet());
model.addAttribute("workingPlaceAccountabilities", workingPlaceAccountabilities);
model.addAttribute("authorityAccountabilities", authorityAccountabilities);
model.addAttribute("selectedUser", user);
return "expenditure-tracking/showPerson";
}
public String showUnit(final Unit unit, final Model model) {
final Collection<Accountability> authorityAccountabilities =
sortChildStream(unit.getChildAccountabilityStream().filter(MissionSystem.AUTHORIZATION_PREDICATE));
final Collection<Accountability> workerAccountabilities =
sortChildStream(unit.getChildAccountabilityStream().filter(MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE));
model.addAttribute("unit", unit);
model.addAttribute("authorityAccountabilities", authorityAccountabilities);
model.addAttribute("workerAccountabilities", workerAccountabilities);
model.addAttribute("selectedUnit", unit);
return "expenditure-tracking/showUnit";
}
private Set<Accountability> sortChildStream(final Stream<Accountability> accs) {
return accs.filter(a -> a.getChild().getPartyName() != null).sorted(Accountability.COMPARATOR_BY_CHILD_PARTY_NAMES)
.collect(Collectors.toSet());
}
@RequestMapping(value = "/viewPresences", method = RequestMethod.GET)
public String viewPresences(@RequestParam(required = false, value = "unitId") String unitId, Model model) {
final Unit unit;
unit = FenixFramework.getDomainObject(unitId);
if (!hasPermission(unit)) {
model.addAttribute("notAutorize", true);
return showUnit(unit, model);
}
return redirect(unitId, "missionOrganization", "viewPresences", "unitId");
}
@RequestMapping(value = "/loadAuthorizationTypes", method = RequestMethod.GET)
public @ResponseBody Collection<AccountabilityType> loadAuthorizationTypes() throws Exception {
final Collection<AccountabilityType> accountabilityTypes =
MissionSystem.getInstance().getAccountabilityTypesThatAuthorize();
return accountabilityTypes;
}
@RequestMapping(value = "/Presences", method = RequestMethod.POST)
public String Presences(@RequestParam(required = false, value = "unitId") String unitId,
FindUnitMemberPresence searchUnitMemberPresence, Model model) {
final Unit unit;
unit = FenixFramework.getDomainObject(unitId);
searchUnitMemberPresence =
new FindUnitMemberPresence(unit, searchUnitMemberPresence.getDay(),
searchUnitMemberPresence.getAccountabilityTypes(), searchUnitMemberPresence.isIncludeSubUnits(),
searchUnitMemberPresence.isOnMission());
model.addAttribute("selectedUnit", unit);
model.addAttribute("searchUnitMemberPresence", searchUnitMemberPresence);
final Set<Person> people = searchUnitMemberPresence.search();
model.addAttribute("accountabilityTypesList", searchUnitMemberPresence.getAccountabilityTypes());
model.addAttribute("unitId", unitId);
model.addAttribute("people", people);
return "expenditure-tracking/viewPresences";
}
@RequestMapping(value = "/prepareRelationshipType/{accountId}", method = RequestMethod.GET)
public String prepareRelationshipType(@PathVariable String accountId, final Model model) throws Exception {
final MissionSystem mission = MissionSystem.getInstance();
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
final LocalDate local = new LocalDate();
final SortedSet<AccountabilityType> set = new TreeSet<>(AccountabilityType.COMPARATORY_BY_NAME);
final Set<AccountabilityType> workingPlaceAccountabilities = mission.getAccountabilityTypesRequireingAuthorization();
set.addAll(workingPlaceAccountabilities);
final Set<AccountabilityType> authorityAccountabilities = mission.getAccountabilityTypesThatAuthorize();
set.addAll(authorityAccountabilities);
model.addAttribute("accountabilityTypes", set);
model.addAttribute("invalidData", false);
model.addAttribute("notActive", false);
model.addAttribute("iniDate", local.toString(formatter));
if (FenixFramework.getDomainObject(accountId) instanceof User) {
model.addAttribute("user", FenixFramework.getDomainObject(accountId));
} else if (FenixFramework.getDomainObject(accountId) instanceof Unit) {
model.addAttribute("unit", FenixFramework.getDomainObject(accountId));
}
if (ExpenditureTrackingSystem.getInstance().getAcquisitionsUnitManagerGroup().isMember(Authenticate.getUser())) {
model.addAttribute("Allowed", true);
return "expenditure-tracking/addMissionResponsability";
}
return search(accountId, model);
}
@RequestMapping(value = "/prepareAddSubUnit/{partyId}", method = RequestMethod.GET)
public String prepareAddSubUnit(@PathVariable String partyId, final Model model) throws Exception {
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
final LocalDate local = new LocalDate();
model.addAttribute("invalidData", false);
model.addAttribute("iniDate", local.toString(formatter));
model.addAttribute("types", MissionSystem.getInstance().getAccountabilityTypesForUnits());
if (FenixFramework.getDomainObject(partyId) instanceof Unit) {
model.addAttribute("notActive", false);
Unit u = FenixFramework.getDomainObject(partyId);
model.addAttribute("unit", u);
}
if (ExpenditureTrackingSystem.getInstance().getAcquisitionsUnitManagerGroup().isMember(Authenticate.getUser())) {
model.addAttribute("Allowed", true);
return "expenditure-tracking/addSubUnit";
}
return search(partyId, model);
}
@RequestMapping(value = "/prepareDelegateForAuthorization/{accountId}", method = RequestMethod.GET)
public String prepareDelegateForAuthorization(@PathVariable String accountId, final Model model) throws Exception {
final MissionSystem mission = MissionSystem.getInstance();
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
final LocalDate local = new LocalDate();
model.addAttribute("accountabilityTypes", mission.getAccountabilityTypesThatAuthorize());
model.addAttribute("invalidData", false);
model.addAttribute("iniDate", local.toString(formatter));
if (FenixFramework.getDomainObject(accountId) instanceof User) {
model.addAttribute("user", FenixFramework.getDomainObject(accountId));
} else if (FenixFramework.getDomainObject(accountId) instanceof Unit) {
model.addAttribute("unit", FenixFramework.getDomainObject(accountId));
}
if (ExpenditureTrackingSystem.getInstance().getAcquisitionsUnitManagerGroup().isMember(Authenticate.getUser())) {
model.addAttribute("Allowed", true);
return "expenditure-tracking/addMissionResponsability";
}
return search(accountId, model);
}
@RequestMapping(value = "/addUnitWithResumedAuthorizations/{unitId}", method = RequestMethod.GET)
public String addUnitWithResumedAuthorizations(@PathVariable String unitId, final Model model) throws Exception {
final Unit unit = FenixFramework.getDomainObject(unitId);
MissionSystem.getInstance().addUnitWithResumedAuthorizations(unit);
model.addAttribute("notAutorize", false);
return showUnit(unit, model);
}
@RequestMapping(value = "/removeUnitWithResumedAuthorizations/{unitId}", method = RequestMethod.GET)
public String removeUnitWithResumedAuthorizations(@PathVariable String unitId, final Model model) throws Exception {
final Unit unit = FenixFramework.getDomainObject(unitId);
MissionSystem.getInstance().removeUnitWithResumedAuthorizations(unit);
model.addAttribute("notAutorize", false);
return showUnit(unit, model);
}
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(person, unit))) {
return true;
}
if (user.getExpenditurePerson() != null && unit.getExpenditureUnit() != null) {
if (user.getExpenditurePerson().getObservableUnitsSet().contains(unit.getExpenditureUnit())) {
return true;
}
}
}
final Collection<AccountabilityType> types = MissionSystem.getInstance().getAccountabilityTypesForUnits();
return unit.getParentAccountabilityStream().anyMatch(
a -> match(a, types) && 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));
}
@RequestMapping(value = "/searchMission/{personId}", method = RequestMethod.GET)
public String searchMission(@PathVariable String personId, HttpServletRequest request, final HttpServletResponse response,
Model model) throws Exception {
return redirect(personId, "missionOrganization", "searchMission", "personId");
}
private String redirect(final String id, final String action, final String method, final String param) {
final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
final String contextPath = request.getContextPath();
final String path = "/" + action + ".do?method=" + method + "&" + param + "=" + id;
final String safePath =
path + "&" + GenericChecksumRewriter.CHECKSUM_ATTRIBUTE_NAME + "="
+ GenericChecksumRewriter.calculateChecksum(contextPath + path, request.getSession());
return "redirect:" + safePath;
}
@RequestMapping(value = "/showDelegationsForAuthorization/{authorizationId}", method = RequestMethod.GET)
public String showDelegationsForAuthorization(@PathVariable String authorizationId, Model model) {
return redirect(authorizationId, "missionOrganization", "showDelegationsForAuthorization", "authorizationId");
}
@RequestMapping(value = "{userId}/authorizationChain/json", method = RequestMethod.GET,
produces = "application/json; charset=UTF-8")
public @ResponseBody String authorizationChain(@PathVariable String userId, @RequestParam(required = false) String param,
final Model model) {
JsonArray result = new JsonArray();
User user = FenixFramework.getDomainObject(userId);
MissionSystem missionSystem = MissionSystem.getInstance();
if (Strings.isNullOrEmpty(param)) {
Person person = user.getPerson();
final SortedSet<Accountability> set = new TreeSet<>(this::compareAccoutabilities);
person.getParentAccountabilityStream().filter(a -> MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE.test(a))
.forEach(a -> set.add(a));
model.addAttribute("workerAccountabilities", set);
result = generateWorkingsJson(result, person);
return result.toString();
} else {
final Accountability accountability = FenixFramework.getDomainObject(param);
final Set<AccountabilityType> accountabilityTypes =
MissionSystem.getInstance().getAccountabilityTypesForAuthorization(accountability.getAccountabilityType());
final Predicate<Accountability> predicate = new Predicate<Accountability>() {
@Override
public boolean test(Accountability a) {
return accountabilityTypes.contains(a.getAccountabilityType());
}
};
final Collection<AuthorizationChain> participantAuthorizationChain =
ParticipantAuthorizationChain.getParticipantAuthorizationChains(predicate, accountability);
model.addAttribute("participantAuthorizationChain", participantAuthorizationChain);
result = generateAuthorChainJson(result, participantAuthorizationChain, missionSystem);
return result.toString();
}
}
private int compareAccoutabilities(final Accountability a1, final Accountability a2) {
final LocalDate ld1 = a1.getBeginDate();
final LocalDate ld2 = a2.getBeginDate();
return ld1 == null && ld2 == null ? a1.getExternalId().compareTo(a2.getExternalId()) : ld1 == null ? -1 : ld2 == null ? 1 : -ld1
.compareTo(ld2);
}
private JsonArray generateWorkingsJson(JsonArray result, final Person person) {
person.getParentAccountabilityStream().filter(a -> MissionSystem.REQUIRE_AUTHORIZATION_PREDICATE.test(a))
.forEach(new Consumer<Accountability>() {
@Override
public void accept(Accountability ac) {
JsonObject o = new JsonObject();
o.addProperty("id", ac.getExternalId());
o.addProperty("externalId", ac.getParent().getExternalId());
o.addProperty("presentationName", ac.getParent().getPresentationName());
o.addProperty("content", ac.getAccountabilityType().getName().getContent());
o.addProperty("beginDate", ac.getBeginDate().toString());
o.addProperty("endDate", ac.getEndDate() == null ? "" : ac.getEndDate().toString());
o.add("details", new JsonArray());
result.add(o);
}
});
return result;
}
private JsonArray generateAuthorChainJson(JsonArray result,
final Collection<AuthorizationChain> participantAuthorizationChain, final MissionSystem missionSystem) {
int order = 0;
for (final AuthorizationChain participantAuthorization : participantAuthorizationChain) {
for (AuthorizationChain authorizationChain = participantAuthorization; authorizationChain != null; authorizationChain =
authorizationChain.getNext()) {
JsonObject o = new JsonObject();
final Unit unit = authorizationChain.getUnit();
final LocalDate today = new LocalDate();
final Supplier<Stream<Accountability>> ss =
() -> unit.getChildAccountabilityStream().filter(
a -> a.intersects(today, today) && MissionSystem.AUTHORIZATION_PREDICATE.test(a));
o.addProperty("size", String.valueOf(ss.get().count()));
o.addProperty("order", String.valueOf(++order));
o.addProperty("unitId", unit.getExternalId());
o.addProperty("unitName", unit.getPresentationName());
JsonArray aa = new JsonArray();
aa = getPersons(aa, ss.get());
o.add("persons", aa);
result.add(o);
}
}
return result;
}
private JsonArray getPersons(JsonArray aa, final Stream<Accountability> authorities) {
authorities.map(this::toChildJson).forEach(a -> aa.add(a));
return aa;
}
private JsonObject toChildJson(final Accountability a) {
final JsonObject p = new JsonObject();
p.addProperty("personId", a.getChild().getExternalId());
p.addProperty("personName", a.getChild().getPresentationName());
p.addProperty("type", a.getAccountabilityType().getName().getContent());
return p;
}
@RequestMapping(value = "/addMissionResponsability", method = RequestMethod.GET)
public String addDelegationsForAuthorization(@RequestParam(required = true) String id,
@RequestParam(required = true) String userId, @RequestParam(required = true) String unitId, @RequestParam(
required = true) String authorityType, @RequestParam(required = true) String beginDate, final Model model)
throws Exception {
final User user = userId != null || !userId.isEmpty() ? FenixFramework.getDomainObject(userId) : null;
final Unit unit = unitId != null || !unitId.isEmpty() ? FenixFramework.getDomainObject(unitId) : null;
final AccountabilityType accountabilityType =
(authorityType != null || !authorityType.isEmpty() ? FenixFramework.getDomainObject(authorityType) : null);
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
final LocalDate local = formatter.parseLocalDate(beginDate);
model.addAttribute("notActive", false);
model.addAttribute("invalidData", false);
if (unit != null && user != null && accountabilityType != null && local != null) {
unit.addChild(user.getPerson(), accountabilityType, local, null, null);
DomainObject o = FenixFramework.getDomainObject(id);
if (o instanceof Unit) {
model.addAttribute("notAutorize", false);
return showUnit(unit, model);
}
if (o instanceof User) {
model.addAttribute("linha", "");
model.addAttribute("er", true);
return showPerson(user, model);
}
} else {
model.addAttribute("invalidData", true);
}
return "expenditure-tracking/prepareRelationshipType/" + id;
}
@RequestMapping(value = "/removeMissionResponsability", method = RequestMethod.GET)
public String removeMissionResponsability(@RequestParam(required = true) String accountId,
@RequestParam(required = true) String partyId, final Model model) throws Exception {
final DomainObject o = FenixFramework.getDomainObject(accountId);
final User u = FenixFramework.getDomainObject(partyId);
model.addAttribute("er", false);
if (ExpenditureTrackingSystem.getInstance().getAcquisitionsUnitManagerGroup().isMember(Authenticate.getUser())) {
if (o instanceof Accountability) {
final Accountability ac = (Accountability) o;
try {
ac.setEndDate(new LocalDate());
} catch (Exception e) {
model.addAttribute("linha", accountId);
model.addAttribute("er", true);
}
}
}
return showPerson(u, model);
}
@RequestMapping(value = "/removeSubUnit", method = RequestMethod.GET)
public String removeSubUnit(@RequestParam(required = true) String accountId, @RequestParam(required = true) String partyId,
final Model model) throws Exception {
final DomainObject o = FenixFramework.getDomainObject(accountId);
final Unit u = FenixFramework.getDomainObject(partyId);
model.addAttribute("notActive", false);
model.addAttribute("notAutorize", false);
if (ExpenditureTrackingSystem.getInstance().getAcquisitionsUnitManagerGroup().isMember(Authenticate.getUser())) {
if (o instanceof Accountability) {
final Accountability ac = (Accountability) o;
try {
ac.setEndDate(new LocalDate());
} catch (Exception e) {
}
}
}
return showUnit(u, model);
}
@SuppressWarnings("null")
@RequestMapping(value = "/addSubUnit", method = RequestMethod.GET)
public String addSubUnit(@RequestParam(required = true) String id, @RequestParam(required = true) String unitId,
@RequestParam(required = true) String type, @RequestParam(required = true) String beginDate, final Model model)
throws Exception {
final Unit parent = FenixFramework.getDomainObject(id);
final Unit unit = unitId != null || !unitId.isEmpty() ? FenixFramework.getDomainObject(unitId) : null;
final AccountabilityType accountabilityType =
(type != null || !type.isEmpty() ? FenixFramework.getDomainObject(type) : null);
final DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy");
final LocalDate local = formatter.parseLocalDate(beginDate);
model.addAttribute("invalidData", false);
model.addAttribute("notAutorize", false);
model.addAttribute("notActive", false);
if (unit != null && parent != null && local != null && accountabilityType != null) {
try {
parent.addChild(unit, accountabilityType, local, null, null);
} catch (Exception e) {
model.addAttribute("addError", e.getLocalizedMessage());
return prepareAddSubUnit(id, model);
}
}
return showUnit(parent, model);
}
}