/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic 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. * * FenixEdu Academic 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 FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.ui.struts.action.manager; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.fenixedu.academic.domain.Department; import org.fenixedu.academic.domain.EmptyDegree; import org.fenixedu.academic.domain.EmptyDegreeCurricularPlan; import org.fenixedu.academic.domain.accounting.serviceAgreementTemplates.AdministrativeOfficeServiceAgreementTemplate; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOffice; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOfficeType; import org.fenixedu.academic.domain.degree.DegreeType; import org.fenixedu.academic.domain.degreeStructure.CycleType; import org.fenixedu.academic.domain.organizationalStructure.AccountabilityType; import org.fenixedu.academic.domain.organizationalStructure.AccountabilityTypeEnum; import org.fenixedu.academic.domain.organizationalStructure.AggregateUnit; import org.fenixedu.academic.domain.organizationalStructure.CompetenceCourseGroupUnit; import org.fenixedu.academic.domain.organizationalStructure.DepartmentUnit; import org.fenixedu.academic.domain.organizationalStructure.ScientificAreaUnit; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.organizationalStructure.UnitClassification; import org.fenixedu.academic.domain.person.RoleType; import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction; import org.fenixedu.academic.ui.struts.action.manager.ManagerApplications.ManagerSystemManagementApp; import org.fenixedu.academic.util.MultiLanguageString; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.struts.annotations.Forward; import org.fenixedu.bennu.struts.annotations.Forwards; import org.fenixedu.bennu.struts.annotations.Mapping; import org.fenixedu.bennu.struts.portal.EntryPoint; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.fenixedu.commons.i18n.LocalizedString; import org.fenixedu.spaces.domain.Space; import org.joda.time.YearMonthDay; import pt.ist.fenixframework.Atomic; import pt.ist.fenixframework.Atomic.TxMode; import pt.ist.fenixframework.FenixFramework; @StrutsFunctionality(app = ManagerSystemManagementApp.class, path = "manage-associated-objects", titleKey = "title.manage.associated.objects") @Mapping(path = "/manageAssociatedObjects", module = "manager") @Forwards({ @Forward(name = "show", path = "/manager/listAssociatedObjects.jsp"), @Forward(name = "list", path = "/manager/listAssociatedObjects.jsp"), @Forward(name = "createDepartment", path = "/manager/createDepartment.jsp"), @Forward(name = "createEmptyDegree", path = "/manager/createEmptyDegree.jsp"), @Forward(name = "createScientificArea", path = "/manager/createScientificArea.jsp"), @Forward(name = "editDepartment", path = "/manager/editDepartment.jsp"), @Forward(name = "createCompetenceCourseGroup", path = "/manager/createCompetenceCourseGroup.jsp"), @Forward(name = "associatePersonUnit", path = "/manager/associatePersonUnit.jsp"), @Forward(name = "createAcademicOffice", path = "/manager/createAcademicOffice.jsp"), @Forward(name = "createDegreeType", path = "/manager/createDegreeType.jsp") }) public class ManageAssociatedObjects extends FenixDispatchAction { public static class AssociatedObjectsBean implements Serializable { private boolean active; private String code; private String name; private String realName; private String realNameEn; private YearMonthDay start; private AccountabilityTypeEnum accTypeEnum; private AdministrativeOfficeType type; private AdministrativeOffice office; private List<Unit> units = new ArrayList<>(); private Unit unit; private String username; private LocalizedString nameLS; private boolean teacher; private Space building; private List<Space> buildings; public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } private Department department; public List<Department> getDepartments() { return departments; } public void setDepartments(List<Department> departments) { this.departments = departments; } private List<Department> departments; private final List<AdministrativeOffice> offices = new ArrayList<>(); public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public String getRealNameEn() { return realNameEn; } public void setRealNameEn(String realNameEn) { this.realNameEn = realNameEn; } public AdministrativeOfficeType getType() { return type; } public void setType(AdministrativeOfficeType type) { this.type = type; } public Unit getUnit() { return unit; } public void setUnit(Unit unit) { this.unit = unit; } public List<Unit> getUnits() { return units; } public void setUnits(List<Unit> units) { this.units = units; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public YearMonthDay getStart() { return start; } public void setStart(YearMonthDay start) { this.start = start; } public AccountabilityTypeEnum getAccTypeEnum() { return accTypeEnum; } public void setAccTypeEnum(AccountabilityTypeEnum accTypeEnum) { this.accTypeEnum = accTypeEnum; } public boolean isTeacher() { return teacher; } public void setTeacher(boolean teacher) { this.teacher = teacher; } public AdministrativeOffice getOffice() { return office; } public void setOffice(AdministrativeOffice office) { this.office = office; } public List<AdministrativeOffice> getOffices() { return offices; } public void setOffices(Set<AdministrativeOffice> officesSet) { this.offices.addAll(officesSet); } public LocalizedString getNameLS() { return nameLS; } public void setNameLS(LocalizedString nameLS) { this.nameLS = nameLS; } public Space getBuilding() { return building; } public void setBuilding(Space building) { this.building = building; } public List<Space> getBuildings() { return buildings; } public void setBuildings(List<Space> buildings) { this.buildings = buildings; } public ScientificAreaUnit getScientificAreaUnit() { return scientificAreaUnit; } public void setScientificAreaUnit(ScientificAreaUnit scientificAreaUnit) { this.scientificAreaUnit = scientificAreaUnit; } public ScientificAreaUnit scientificAreaUnit; } public static class DegreeTypeBean implements Serializable { private static final long serialVersionUID = 387599179531038042L; private LocalizedString name; private DegreeType selected; private boolean empty; private boolean bolonha = true; private boolean degree; private boolean masterDegree; private boolean dea; private boolean dfa; private List<CycleType> cycleTypes; private List<CycleType> cyclesToEnrol; public DegreeTypeBean() { } public DegreeTypeBean(DegreeType type) { this.selected = type; this.name = type.getName(); this.empty = type.getEmpty(); this.bolonha = type.getBolonha(); this.degree = type.getDegreeType(); this.masterDegree = type.getMasterDegree(); this.dea = type.getDea(); this.dfa = type.getDfa(); this.cycleTypes = new ArrayList<>(type.getCycleTypes()); this.cyclesToEnrol = new ArrayList<>(type.getSupportedCyclesToEnrol()); } public LocalizedString getName() { return name; } public void setName(LocalizedString name) { this.name = name; } public DegreeType getSelected() { return selected; } public void setSelected(DegreeType selected) { this.selected = selected; } public boolean isEmpty() { return empty; } public void setEmpty(boolean empty) { this.empty = empty; } public boolean isBolonha() { return bolonha; } public void setBolonha(boolean bolonha) { this.bolonha = bolonha; } public boolean isDegree() { return degree; } public void setDegree(boolean degree) { this.degree = degree; } public boolean isMasterDegree() { return masterDegree; } public void setMasterDegree(boolean masterDegree) { this.masterDegree = masterDegree; } public boolean isDea() { return dea; } public void setDea(boolean dea) { this.dea = dea; } public boolean isDfa() { return dfa; } public void setDfa(boolean dfa) { this.dfa = dfa; } public List<CycleType> getCycleTypes() { return cycleTypes; } public void setCycleTypes(List<CycleType> cycleTypes) { this.cycleTypes = cycleTypes; } public List<CycleType> getCyclesToEnrol() { return cyclesToEnrol; } public void setCyclesToEnrol(List<CycleType> cyclesToEnrol) { this.cyclesToEnrol = cyclesToEnrol; } public Collection<CycleType> getPossibleCycleTypes() { return Arrays.asList(CycleType.values()); } } @EntryPoint public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Set<Department> departments = Bennu.getInstance().getDepartmentsSet(); Set<AdministrativeOffice> offices = Bennu.getInstance().getAdministrativeOfficesSet(); request.setAttribute("departments", departments); request.setAttribute("offices", offices); request.setAttribute("emptyDegree", EmptyDegree.getInstance()); request.setAttribute("degreeTypes", Bennu.getInstance().getDegreeTypeSet()); return mapping.findForward("list"); } public ActionForward prepareCreateDegreeType(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DegreeType currentType = getDomainObject(request, "degreeTypeId"); request.setAttribute("bean", currentType == null ? new DegreeTypeBean() : new DegreeTypeBean(currentType)); return mapping.findForward("createDegreeType"); } public ActionForward createDegreeType(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DegreeTypeBean bean = getRenderedObject("bean"); if (bean != null) { atomic(() -> { DegreeType type = bean.getSelected() == null ? new DegreeType(bean.getName()) : bean.getSelected(); type.setName(bean.getName()); type.setEmpty(bean.isEmpty()); type.setBolonha(bean.isBolonha()); type.setDegreeType(bean.isDegree()); type.setMasterDegree(bean.isMasterDegree()); type.setDea(bean.isDea()); type.setDfa(bean.isDfa()); type.setCycleTypes(bean.getCycleTypes()); type.setCycleTypesToEnrol(bean.getCyclesToEnrol()); }); } return list(mapping, form, request, response); } public ActionForward prepareCreateDepartment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute("bean", new AssociatedObjectsBean()); return mapping.findForward("createDepartment"); } public ActionForward createDepartment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject("department"); createDepartment(bean); return list(mapping, form, request, response); } @Atomic private void createDepartment(AssociatedObjectsBean bean) { Department department = new Department(); department.setCompetenceCourseMembersGroup(Group.managers()); department.setActive(bean.isActive()); department.setCode(bean.getCode()); department.setName(bean.getName()); department.setRealName(bean.getRealName()); department.setName(bean.getName()); department.setRealNameEn(bean.getRealNameEn()); department.setRootDomainObject(Bennu.getInstance()); Unit departmentParent = Bennu.getInstance().getInstitutionUnit().getSubUnits().stream() .filter(x -> x instanceof AggregateUnit) .filter(x -> ((AggregateUnit) x).getName().equals("Departments")).findAny() .orElse(Bennu.getInstance().getInstitutionUnit()); DepartmentUnit.createNewInternalDepartmentUnit(department.getNameI18n(), null, null, department.getCode(), new YearMonthDay(), null, departmentParent, AccountabilityType.readByType(AccountabilityTypeEnum.ACADEMIC_STRUCTURE), null, department, null, false, null); } public ActionForward prepareAcademicOffice(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = new AssociatedObjectsBean(); bean.setBuildings(Space.getAllSpaces().sorted().collect(Collectors.toList())); request.setAttribute("bean", bean); return mapping.findForward("createAcademicOffice"); } public ActionForward createAcademicOffice(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject("office"); createAcademicOffice(bean); return list(mapping, form, request, response); } @Atomic private void createAcademicOffice(AssociatedObjectsBean bean) { AdministrativeOffice office = new AdministrativeOffice(); office.setAdministrativeOfficeType(bean.getType()); new AdministrativeOfficeServiceAgreementTemplate(office); office.setCampus(bean.getBuilding()); office.setName(bean.getNameLS()); office.setCoordinator(User.findByUsername(bean.getUsername())); office.setRootDomainObject(Bennu.getInstance()); Unit servicesParent = Bennu.getInstance().getInstitutionUnit().getSubUnits().stream().filter(x -> x.getName().equals("Services")) .findAny().orElse(Bennu.getInstance().getInstitutionUnit()); Unit.createNewUnit(MultiLanguageString.fromLocalizedString(office.getName()), null, null, null, new YearMonthDay(), null, servicesParent, AccountabilityType.readByType(AccountabilityTypeEnum.ADMINISTRATIVE_STRUCTURE), null, UnitClassification.CENTRAL_ORG, office, false, bean.getBuilding()); } public ActionForward prepareEmptyDegree(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean associatedObjectsBean = new AssociatedObjectsBean(); associatedObjectsBean.setOffices(Bennu.getInstance().getAdministrativeOfficesSet()); request.setAttribute("bean", associatedObjectsBean); return mapping.findForward("createEmptyDegree"); } public ActionForward createEmptyDegree(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject("admOffice"); createEmptyDegree(bean); return list(mapping, form, request, response); } @Atomic(mode = TxMode.WRITE) private void createEmptyDegree(AssociatedObjectsBean bean) { AdministrativeOffice adminOffice = bean.getOffice(); EmptyDegree emptyDegree = EmptyDegree.getInstance(); if (emptyDegree == null) { EmptyDegree.init(); } EmptyDegree.getInstance().setAdministrativeOffice(adminOffice); EmptyDegreeCurricularPlan emptyDCP = EmptyDegreeCurricularPlan.getInstance(); if (emptyDCP == null) { EmptyDegreeCurricularPlan.init(); } } public ActionForward prepareAssociatePersonUnit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean associatedObjectsBean = new AssociatedObjectsBean(); associatedObjectsBean.setUnits(Unit.readAllUnits()); request.setAttribute("bean", associatedObjectsBean); return mapping.findForward("associatePersonUnit"); } // // public ActionForward associatePersonUnit(ActionMapping mapping, ActionForm form, HttpServletRequest request, // HttpServletResponse response) throws Exception { // AssociatedObjectsBean bean = getRenderedObject("office"); // // createAssociationToUnit(bean); // // return list(mapping, form, request, response); // } // // @Atomic(mode = TxMode.WRITE) // private void createAssociationToUnit(AssociatedObjectsBean bean) { // Person person = Person.readPersonByUsername(bean.getUsername()); // EmployeeContract ec = // new EmployeeContract(person, bean.getStart(), null, bean.getUnit(), bean.getAccTypeEnum(), bean.isTeacher()); // // person.getEmployee().getCurrentDepartmentWorkingPlace(); // } public ActionForward prepareCreateScientificArea(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean associatedObjectsBean = new AssociatedObjectsBean(); request.setAttribute("bean", associatedObjectsBean); associatedObjectsBean.setDepartments(Department.readActiveDepartments().stream() .filter(x -> x.getDepartmentUnit() != null).collect(Collectors.toList())); return mapping.findForward("createScientificArea"); } public ActionForward createScientificArea(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject("admOffice"); createScientificArea(bean); return list(mapping, form, request, response); } @Atomic(mode = TxMode.WRITE) private void createScientificArea(AssociatedObjectsBean bean) { ScientificAreaUnit.createNewInternalScientificArea(MultiLanguageString.fromLocalizedString(bean.getNameLS()), null, null, bean.getCode(), new YearMonthDay(), null, bean.getDepartment().getDepartmentUnit(), AccountabilityType.readByType(AccountabilityTypeEnum.ORGANIZATIONAL_STRUCTURE), null, null, false, null); } public ActionForward prepareCreateCompetenceCourseGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean associatedObjectsBean = new AssociatedObjectsBean(); associatedObjectsBean.setScientificAreaUnit(FenixFramework.getDomainObject(request.getParameter("oid"))); request.setAttribute("bean", associatedObjectsBean); return mapping.findForward("createCompetenceCourseGroup"); } public ActionForward createCompetenceCourseGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject("admOffice"); createCompetenceCourseGroup(bean); return list(mapping, form, request, response); } @Atomic(mode = TxMode.WRITE) private void createCompetenceCourseGroup(AssociatedObjectsBean bean) { CompetenceCourseGroupUnit.createNewInternalCompetenceCourseGroupUnit( MultiLanguageString.fromLocalizedString(bean.getNameLS()), null, null, bean.getCode(), new YearMonthDay(), null, bean.getScientificAreaUnit(), AccountabilityType.readByType(AccountabilityTypeEnum.ORGANIZATIONAL_STRUCTURE), null, null, false, null); } public ActionForward prepareEditDepartment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean associatedObjectsBean = new AssociatedObjectsBean(); Department d = FenixFramework.getDomainObject(request.getParameter("oid")); associatedObjectsBean.setDepartment(d); associatedObjectsBean.setCode(d.getCode()); associatedObjectsBean.setName(d.getName()); associatedObjectsBean.setRealName(d.getRealName()); associatedObjectsBean.setRealNameEn(d.getRealNameEn()); associatedObjectsBean.setUsername(d.getCompetenceCourseMembersGroup().getExpression()); request.setAttribute("bean", associatedObjectsBean); return mapping.findForward("editDepartment"); } public ActionForward editDepartment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { AssociatedObjectsBean bean = getRenderedObject(); atomic(() -> { Department d = bean.getDepartment(); d.setCode(bean.getCode()); d.setName(bean.getName()); d.setRealName(bean.getRealName()); d.setRealNameEn(bean.getRealNameEn()); d.setCompetenceCourseMembersGroup(User.findByUsername(bean.getUsername()).groupOf()); }); return list(mapping, form, request, response); } }