/** * Copyright © 2011 Instituto Superior Técnico * * This file is part of FenixEdu Teacher Credits. * * FenixEdu Teacher Credits 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 Teacher Credits 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 Teacher Credits. If not, see <http://www.gnu.org/licenses/>. */ package pt.ist.fenixedu.teacher.ui.struts.action.gep.a3es; import java.io.Serializable; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.Attends; import org.fenixedu.academic.domain.CompetenceCourse; import org.fenixedu.academic.domain.CourseLoad; import org.fenixedu.academic.domain.CurricularCourse; import org.fenixedu.academic.domain.Degree; import org.fenixedu.academic.domain.DegreeCurricularPlan; import org.fenixedu.academic.domain.ExecutionCourse; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Professorship; import org.fenixedu.academic.domain.Teacher; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences; import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReference; import org.fenixedu.academic.domain.degreeStructure.RootCourseGroup; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.phd.InternalPhdParticipant; import org.fenixedu.academic.domain.phd.PhdIndividualProgramProcess; import org.fenixedu.academic.domain.phd.PhdParticipant; import org.fenixedu.academic.domain.phd.PhdProgram; import org.fenixedu.academic.domain.thesis.ThesisEvaluationParticipant; import org.fenixedu.academic.util.Bundle; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import pt.ist.fenixedu.contracts.domain.personnelSection.contracts.PersonProfessionalData; import pt.ist.fenixedu.teacher.domain.teacher.DegreeTeachingService; import pt.ist.fenixedu.teacher.domain.teacher.DegreeTeachingServiceCorrection; import pt.ist.fenixedu.teacher.domain.teacher.OtherService; import pt.ist.fenixedu.teacher.domain.teacher.TeacherService; import pt.ist.fenixedu.teacher.dto.externalServices.TeacherCurricularInformation; import pt.ist.fenixedu.teacher.dto.externalServices.TeacherCurricularInformation.LecturedCurricularUnit; import pt.ist.fenixedu.teacher.dto.externalServices.TeacherCurricularInformation.QualificationBean; import pt.ist.fenixedu.teacher.dto.externalServices.TeacherPublicationsInformation; import pt.utl.ist.fenix.tools.spreadsheet.SheetData; import pt.utl.ist.fenix.tools.spreadsheet.SpreadsheetBuilder; import pt.utl.ist.fenix.tools.util.i18n.MultiLanguageString; public class A3ESDegreeProcess implements Serializable { private static final String BASE_URL = "http://www.a3es.pt/si/iportal.php"; // private static final String BASE_URL = "http://formacao.a3es.pt/iportal.php"; private static final String API_PROCESS = "api_process"; private static final String API_FORM = "api_form"; private static final String API_FOLDER = "api_folder"; private static final String API_ANNEX = "api_annex"; private static Map<String, String> acefIndex = new HashMap<String, String>(); static { // This being hard-coded prevents future executions without our // interference, this should be persisted and managed by UI. acefIndex.put("ACEF/1314/06702", "LEGI"); acefIndex.put("ACEF/1314/06722", "LEAN"); acefIndex.put("ACEF/1314/06727", "LEMat"); acefIndex.put("ACEF/1314/06737", "LMAC"); acefIndex.put("ACEF/1314/06742", "MEAN"); acefIndex.put("ACEF/1314/06747", "MBiotec"); acefIndex.put("ACEF/1314/06757", "MEGI"); acefIndex.put("ACEF/1314/06777", "MMA"); acefIndex.put("ACEF/1314/06787", "MEMat"); acefIndex.put("ACEF/1314/06792", "MBioNano"); acefIndex.put("ACEF/1314/06807", "MQ"); acefIndex.put("ACEF/1314/13727", "MEFarm"); acefIndex.put("ACEF/1314/06812", "MEAer"); acefIndex.put("ACEF/1314/06817", "MEAmbi"); acefIndex.put("ACEF/1314/06822", "MEBiol"); acefIndex.put("ACEF/1314/06842", "MEQ"); acefIndex.put("ACEF/1314/06847", "MEBiom"); acefIndex.put("ACEF/1314/06857", "MEMec"); acefIndex.put("ACEF/1314/06867", "DBiotec"); acefIndex.put("ACEF/1314/06877", "DEGest"); acefIndex.put("ACEF/1314/06892", "DEN"); acefIndex.put("ACEF/1314/06902", "DEAEPP"); acefIndex.put("ACEF/1314/06952", "DEMec"); acefIndex.put("ACEF/1314/06957", "DEPE"); acefIndex.put("ACEF/1314/06982", "DEAer"); acefIndex.put("ACEF/1314/06947", "DEAmb"); acefIndex.put("ACEF/1314/06887", "DEMat"); acefIndex.put("ACEF/1314/06897", "DEQuim"); acefIndex.put("ACEF/1314/06912", "DMat"); acefIndex.put("ACEF/1314/06922", "DQuim"); acefIndex.put("ACEF/1314/06932", "DEBiom"); // acefIndex.put("ACEF/1314/06812", "MEAER"); } protected String user; protected String password; protected String base64Hash; protected String id; protected Degree degree; protected ExecutionSemester executionSemester; protected String formId; public A3ESDegreeProcess() { super(); this.executionSemester = ExecutionSemester.readActualExecutionSemester(); } public void initialize() { base64Hash = new String(Base64.getEncoder().encode((user + ":" + password).getBytes())); JSONArray processes = invoke(webResource().path(API_PROCESS)); JSONObject json = (JSONObject) processes.iterator().next(); id = (String) json.get("id"); String name = (String) json.get("name"); if (acefIndex.containsKey(name)) { degree = Degree.readBySigla(acefIndex.get(name)); JSONArray forms = invoke(webResource().path(API_FORM).queryParam("processId", id)); for (Object object : forms) { JSONObject form = (JSONObject) object; if ("Guião para a auto-avaliação".equals(form.get("name"))) { formId = (String) form.get("id"); } } if (formId == null) { throw new DomainException("Process " + name + " has no auto-evaluation form."); } } else { throw new DomainException("Not recognized ACEF code: " + name); } } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Degree getDegree() { return degree; } public ExecutionSemester getExecutionSemester() { return executionSemester; } public void setExecutionSemester(ExecutionSemester executionSemester) { this.executionSemester = executionSemester; } public List<ExecutionSemester> getAvailableExecutionSemesters() { List<ExecutionSemester> result = new ArrayList<ExecutionSemester>(); ExecutionSemester readActualExecutionSemester = ExecutionSemester.readActualExecutionSemester(); result.add(readActualExecutionSemester); result.add(readActualExecutionSemester.getPreviousExecutionPeriod()); return result; } public List<ExecutionSemester> getSelectedExecutionSemesters() { List<ExecutionSemester> result = new ArrayList<ExecutionSemester>(); if (getExecutionSemester() != null) { result.add(getExecutionSemester()); result.add(getExecutionSemester().getPreviousExecutionPeriod()); } return result; } private Set<ExecutionYear> getSelectedExecutionYears() { Set<ExecutionYear> result = new HashSet<ExecutionYear>(); if (getExecutionSemester() != null) { result.add(getExecutionSemester().getExecutionYear()); result.add(getExecutionSemester().getPreviousExecutionPeriod().getExecutionYear()); } return result; } public List<String> uploadCompetenceCourses() { List<String> output = new ArrayList<String>(); for (Object object : invoke(webResource().path(API_FOLDER).queryParam("formId", formId))) { JSONObject folder = (JSONObject) object; if ("6.2.1. Ficha das unidades curriculares".equals(folder.get("name"))) { String competencesId = (String) folder.get("id"); for (Object annexObj : invoke(webResource().path(API_ANNEX).queryParam("formId", formId) .queryParam("folderId", competencesId))) { JSONObject annex = (JSONObject) annexObj; delete(webResource().path(API_ANNEX).path((String) annex.get("id")).queryParam("formId", formId) .queryParam("folderId", competencesId)); } for (Entry<JSONObject, String> json : buildCompetenceCoursesJson().entrySet()) { Response response = post(webResource().path(API_ANNEX).queryParam("formId", formId).queryParam("folderId", competencesId), json.getKey().toJSONString()); int status = response.getStatus(); if (status == 201) { output.add("201 Created: " + json.getKey().get("q-6.2.1.1") + ": " + json.getValue()); } else { output.add(status + ": " + json.getKey().get("q-6.2.1.1") + ": " + response.getEntity() + " input: " + json.getKey().toJSONString()); } } break; } } return output; } public List<String> uploadTeacherCurriculum() { List<String> output = new ArrayList<String>(); for (Object object : invoke(webResource().path(API_FOLDER).queryParam("formId", formId))) { JSONObject folder = (JSONObject) object; if ("4.1.1. Fichas curriculares".equals(folder.get("name"))) { String teacherCurriculumId = (String) folder.get("id"); for (Object annexObj : invoke(webResource().path(API_ANNEX).queryParam("formId", formId) .queryParam("folderId", teacherCurriculumId))) { JSONObject annex = (JSONObject) annexObj; delete(webResource().path(API_ANNEX).path((String) annex.get("id")).queryParam("formId", formId) .queryParam("folderId", teacherCurriculumId)); } for (Entry<JSONObject, String> json : buildTeacherCurriculumJson().entrySet()) { Response response = post(webResource().path(API_ANNEX).queryParam("formId", formId) .queryParam("folderId", teacherCurriculumId), json.getKey().toJSONString()); int status = response.getStatus(); if (status == 201) { output.add("201 Created: " + json.getKey().get("q-cf-name") + ": " + json.getValue()); } else { output.add(status + ": " + json.getKey().get("q-cf-name") + ": " + response.getEntity() + " input: " + json.getKey().toJSONString()); } } break; } } return output; } protected WebTarget webResource() { Client client = ClientBuilder.newClient(); return client.target(BASE_URL); } protected JSONArray invoke(WebTarget resource) { return (JSONArray) ((JSONObject) JSONValue.parse(resource.request(MediaType.APPLICATION_JSON) .header("Authorization", "Basic " + base64Hash).get(String.class))).get("list"); } protected Response post(WebTarget resource, String arg) { return resource.request(MediaType.APPLICATION_JSON).header("Authorization", "Basic " + base64Hash) .buildPost(Entity.text(arg)).invoke(); } protected Response delete(WebTarget resource) { return resource.request(MediaType.APPLICATION_JSON).header("Authorization", "Basic " + base64Hash).buildDelete().invoke(); } protected Map<JSONObject, String> buildCompetenceCoursesJson() { Map<JSONObject, String> jsons = new HashMap<JSONObject, String>(); RootCourseGroup root = degree.getLastActiveDegreeCurricularPlan().getRoot(); for (CurricularCourse course : root.getAllCurricularCourses(executionSemester)) { CompetenceCourse competence = course.getCompetenceCourse(); if (competence != null) { JSONObject json = new JSONObject(); StringBuilder output = new StringBuilder(); json.put("q-6.2.1.1", competence.getName(executionSemester)); json.put("q-6.2.1.2", cut("Docente responsavel", getTeachersAndTeachingHours(course, true), output, 100)); JSONObject q6213 = new JSONObject(); String teachersAndTeachingHours = getTeachersAndTeachingHours(course, false); json.put("q-6.2.1.3", teachersAndTeachingHours); JSONObject q6214 = new JSONObject(); MultiLanguageString objectives = competence.getObjectivesI18N(executionSemester); q6214.put("en", cut("objectivos em ingles", objectives.getContent(MultiLanguageString.en), output, 1000)); q6214.put("pt", cut("objectivos em portugues", objectives.getContent(MultiLanguageString.pt), output, 1000)); json.put("q-6.2.1.4", q6214); JSONObject q6215 = new JSONObject(); MultiLanguageString program = competence.getProgramI18N(executionSemester); q6215.put("en", cut("programa em ingles", program.getContent(MultiLanguageString.en), output, 1000)); q6215.put("pt", cut("programa em portugues", program.getContent(MultiLanguageString.pt), output, 1000)); json.put("q-6.2.1.5", q6215); JSONObject q6216 = new JSONObject(); q6216.put("en", BundleUtil.getString(Bundle.GEP, Locale.ENGLISH, "label.gep.a3es.q6-2-1-6")); q6216.put("pt", BundleUtil.getString(Bundle.GEP, new Locale("pt"), "label.gep.a3es.q6-2-1-6")); json.put("q-6.2.1.6", q6216); JSONObject q6217 = new JSONObject(); q6217.put("en", cut("avaliação em ingles", competence.getEvaluationMethodEn(executionSemester), output, 1000)); q6217.put("pt", cut("avaliação em portugues", competence.getEvaluationMethod(executionSemester), output, 1000)); json.put("q-6.2.1.7", q6217); JSONObject q6218 = new JSONObject(); q6218.put("en", BundleUtil.getString(Bundle.GEP, Locale.ENGLISH, "label.gep.a3es.q6-2-1-8")); q6218.put("pt", BundleUtil.getString(Bundle.GEP, new Locale("pt"), "label.gep.a3es.q6-2-1-8")); json.put("q-6.2.1.8", q6218); List<String> references = new ArrayList<String>(); final BibliographicReferences bibliographicReferences = competence.getBibliographicReferences(executionSemester); if (bibliographicReferences != null) { for (BibliographicReference reference : bibliographicReferences.getMainBibliographicReferences()) { references.add(extractReference(reference)); } } json.put("q-6.2.1.9", cut("Referências Bibliográficas", StringUtils.join(references, "; "), output, 1000)); jsons.put(json, output.toString()); } } return jsons; } private static String extractReference(BibliographicReference reference) { return StringUtils.join( new String[] { reference.getTitle(), reference.getAuthors(), reference.getYear(), reference.getReference() }, ", "); } private String cut(String field, String content, StringBuilder output, int size) { if (content == null) { output.append(" " + field + " vazio."); } else { int escapedLength = JSONObject.escape(content).getBytes().length; if (escapedLength > size) { output.append(" " + field + " cortado a " + size + " caracteres."); return content.substring(0, size - 4 - (escapedLength - content.length())) + " ..."; } } return content; } private String getTeachersAndTeachingHours(CurricularCourse course, boolean responsibleTeacher) { Map<Teacher, Double> responsiblesMap = new HashMap<Teacher, Double>(); List<ExecutionSemester> executionSemesters = getSelectedExecutionSemesters(); for (final ExecutionCourse executionCourse : course.getAssociatedExecutionCoursesSet()) { if (executionSemesters.contains(executionCourse.getExecutionPeriod())) { for (Professorship professorhip : executionCourse.getProfessorshipsSet()) { if (professorhip.isResponsibleFor() == responsibleTeacher && PersonProfessionalData.isTeacherActiveOrHasAuthorizationForSemester(professorhip.getPerson() .getTeacher(), executionCourse.getExecutionPeriod())) { Double hours = responsiblesMap.get(professorhip.getTeacher()); if (hours == null) { hours = 0.0; } hours = hours + getHours(professorhip); responsiblesMap.put(professorhip.getTeacher(), hours); } } } } int counter = 1000; List<String> responsibles = new ArrayList<String>(); for (Teacher teacher : responsiblesMap.keySet()) { String responsible = (responsibleTeacher ? teacher.getPerson().getFirstAndLastName() : teacher.getPerson().getName()) + " (" + responsiblesMap.get(teacher) + ")"; counter -= JSONObject.escape(responsible + ", ").getBytes().length; responsibles.add(responsible); } if (!responsibleTeacher && course.isDissertation()) { Set<Teacher> teachers = new HashSet<Teacher>(); for (ExecutionCourse executionCourse : course.getAssociatedExecutionCoursesSet()) { if (executionCourse.getExecutionPeriod().getExecutionYear() .equals(executionSemester.getExecutionYear().getPreviousExecutionYear())) { for (Attends attends : executionCourse.getAttendsSet()) { if (attends.getEnrolment() != null && attends.getEnrolment().getThesis() != null) { for (ThesisEvaluationParticipant thesisEvaluationParticipant : attends.getEnrolment().getThesis() .getOrientation()) { if (thesisEvaluationParticipant.getPerson().getTeacher() != null && PersonProfessionalData.isTeacherActiveOrHasAuthorizationForSemester( thesisEvaluationParticipant.getPerson().getTeacher(), executionCourse.getExecutionPeriod())) { teachers.add(thesisEvaluationParticipant.getPerson().getTeacher()); } } } } } } for (Teacher teacher : teachers) { String responsible = (responsibleTeacher ? teacher.getPerson().getFirstAndLastName() : teacher.getPerson().getName()) + " (0.0)"; if (counter - JSONObject.escape(responsible).getBytes().length < 0) { break; } if (!responsiblesMap.containsKey(teacher)) { counter -= JSONObject.escape(responsible + ", ").getBytes().length; responsibles.add(responsible); } } } return StringUtils.join(responsibles, ", "); } private Double getHours(Professorship professorhip) { Teacher teacher = professorhip.getPerson().getTeacher(); TeacherService teacherService = TeacherService .getTeacherServiceByExecutionPeriod(teacher, professorhip.getExecutionCourse().getExecutionPeriod()); Double result = 0.0; if (teacherService != null) { for (DegreeTeachingService degreeTeachingService : teacherService.getDegreeTeachingServices()) { if (degreeTeachingService.getProfessorship().getExecutionCourse().equals(professorhip.getExecutionCourse())) { for (CourseLoad courseLoad : degreeTeachingService.getShift().getCourseLoadsSet()) { result = result + courseLoad.getTotalQuantity().doubleValue() * (degreeTeachingService.getPercentage().doubleValue() / 100); } } } for (OtherService otherService : teacherService.getOtherServices()) { if (otherService instanceof DegreeTeachingServiceCorrection) { DegreeTeachingServiceCorrection degreeTeachingServiceCorrection = (DegreeTeachingServiceCorrection) otherService; if (degreeTeachingServiceCorrection.getProfessorship().getExecutionCourse() .equals(professorhip.getExecutionCourse()) && (!degreeTeachingServiceCorrection.getProfessorship().getExecutionCourse().isDissertation()) && (!degreeTeachingServiceCorrection.getProfessorship().getExecutionCourse() .getProjectTutorialCourse())) { result = result + degreeTeachingServiceCorrection.getCorrection().doubleValue(); } } } } return result; } protected List<TeacherCurricularInformation> getTeacherCurricularInformation() { List<ExecutionSemester> executionSemesters = getSelectedExecutionSemesters(); Set<Teacher> teachers = getTeachers(executionSemesters); Map<Teacher, List<String>> teacherPublicationsInformationsMap = TeacherPublicationsInformation.getTeacherPublicationsInformations(teachers); List<TeacherCurricularInformation> teacherCurricularInformationList = new ArrayList<TeacherCurricularInformation>(); for (Teacher teacher : teachers) { TeacherCurricularInformation teacherCurricularInformation = new TeacherCurricularInformation(teacher, degree, executionSemesters, teacherPublicationsInformationsMap.get(teacher)); teacherCurricularInformationList.add(teacherCurricularInformation); } return teacherCurricularInformationList; } protected Set<Teacher> getTeachers(List<ExecutionSemester> executionSemesters) { Set<Teacher> teachers = new HashSet<Teacher>(); ExecutionYear previousExecutionYear = executionSemester.getExecutionYear().getPreviousExecutionYear(); for (final DegreeCurricularPlan degreeCurricularPlan : degree.getDegreeCurricularPlansSet()) { for (final CurricularCourse course : degreeCurricularPlan.getCurricularCoursesSet()) { for (final ExecutionCourse executionCourse : course.getAssociatedExecutionCoursesSet()) { if (executionSemesters.contains(executionCourse.getExecutionPeriod())) { for (Professorship professorhip : executionCourse.getProfessorshipsSet()) { if (PersonProfessionalData.isTeacherActiveOrHasAuthorizationForSemester(professorhip.getPerson() .getTeacher(), executionCourse.getExecutionPeriod())) { teachers.add(professorhip.getPerson().getTeacher()); } } } if (previousExecutionYear.equals(executionCourse.getExecutionPeriod().getExecutionYear())) { if (executionCourse.isDissertation()) { for (Attends attends : executionCourse.getAttendsSet()) { if (attends.getEnrolment() != null && attends.getEnrolment().getThesis() != null) { for (ThesisEvaluationParticipant thesisEvaluationParticipant : attends.getEnrolment() .getThesis().getOrientation()) { if (thesisEvaluationParticipant.getPerson().getTeacher() != null && PersonProfessionalData.isTeacherActiveOrHasAuthorizationForSemester( thesisEvaluationParticipant.getPerson().getTeacher(), executionCourse.getExecutionPeriod())) { teachers.add(thesisEvaluationParticipant.getPerson().getTeacher()); } } } } } } } } } PhdProgram phdProgram = degree.getPhdProgram(); if (phdProgram != null) { for (PhdIndividualProgramProcess phdIndividualProgramProcess : phdProgram.getIndividualProgramProcessesSet()) { for (ExecutionSemester executionSemester : executionSemesters) { if (phdIndividualProgramProcess.isActive(executionSemester.getAcademicInterval().toInterval())) { for (PhdParticipant phdParticipant : phdIndividualProgramProcess.getParticipantsSet()) { if (phdParticipant instanceof InternalPhdParticipant) { InternalPhdParticipant internalPhdParticipant = (InternalPhdParticipant) phdParticipant; if (internalPhdParticipant.isGuidingOrAssistantGuiding() && internalPhdParticipant.getPerson().getTeacher() != null && PersonProfessionalData.isTeacherActiveOrHasAuthorizationForSemester( internalPhdParticipant.getPerson().getTeacher(), executionSemester)) { teachers.add(internalPhdParticipant.getPerson().getTeacher()); } } } } } } } return teachers; } protected Map<JSONObject, String> buildTeacherCurriculumJson() { Map<JSONObject, String> jsons = new HashMap<JSONObject, String>(); for (TeacherCurricularInformation info : getTeacherCurricularInformation()) { JSONObject toplevel = new JSONObject(); StringBuilder output = new StringBuilder(); toplevel.put("q-cf-name", info.getTeacher().getPerson().getName()); // toplevel.put("q-cf-ies", // Bennu.getInstance().getInstitutionUnit().getName()); // toplevel.put("q-cf-uo", info.getUnitName()); toplevel.put("q-cf-cat", info.getProfessionalCategoryName()); toplevel.put("q-cf-time", info.getProfessionalRegimeTime()); JSONObject file = new JSONObject(); { file.put("name", cut("nome", info.getTeacher().getPerson().getName(), output, 200)); // file.put("ies", cut("ies", // Bennu.getInstance().getInstitutionUnit().getName(), // output, 200)); // file.put("uo", cut("uo", info.getUnitName(), output, 200)); file.put("cat", info.getProfessionalCategoryName()); Iterator<QualificationBean> qualifications = info.getQualifications().iterator(); if (qualifications.hasNext()) { QualificationBean qualification = qualifications.next(); file.put("deg", qualification.getDegree()); if (qualification.getScientificArea() != null) { file.put("degarea", cut("area cientifica", qualification.getScientificArea(), output, 200)); } else { output.append(" Última Qualificação: degarea vazio."); } if (qualification.getYear() != null) { file.put("ano_grau", qualification.getYear()); } else { output.append(" Última Qualificação: ano_grau vazio."); } if (qualification.getInstitution() != null) { file.put("instituicao_conferente", cut("instituição", qualification.getInstitution(), output, 200)); } else { output.append(" Última Qualificação: instituicao_conferente vazio."); } } file.put("regime", info.getProfessionalRegimeTime()); if (qualifications.hasNext()) { JSONArray academicArray = new JSONArray(); int i = 0; while (qualifications.hasNext()) { i++; JSONObject academic = new JSONObject(); QualificationBean qualification = qualifications.next(); if (qualification.getYear() != null) { academic.put("year", qualification.getYear()); } else { output.append(" Qualificações: year vazio."); } if (qualification.getDegree() != null) { academic.put("degree", cut("grau", qualification.getDegree(), output, 30)); } else { output.append(" Qualificações: degree vazio."); } if (qualification.getScientificArea() != null) { academic.put("area", cut("area", qualification.getScientificArea(), output, 100)); } else { output.append(" Qualificações: area vazio."); } if (qualification.getInstitution() != null) { academic.put("ies", cut("ies", qualification.getInstitution(), output, 100)); } else { output.append(" Qualificações: ies vazio."); } if (qualification.getClassification() != null) { academic.put("rank", cut("classificação", qualification.getClassification(), output, 30)); } else { output.append(" Qualificações: rank vazio."); } academicArray.add(academic); } for (int j = i; j < 3; j++) { JSONObject academic = new JSONObject(); academic.put("year", StringUtils.EMPTY); academic.put("degree", StringUtils.EMPTY); academic.put("area", StringUtils.EMPTY); academic.put("ies", StringUtils.EMPTY); academic.put("rank", StringUtils.EMPTY); academicArray.add(academic); } file.put("form-academic", academicArray); } List<String> participations = info.getTop5ResultParticipation(); if (!participations.isEmpty()) { JSONArray researchArray = new JSONArray(); for (String publication : participations) { JSONObject research = new JSONObject(); research.put("investigation", cut("investigação", publication, output, 300)); researchArray.add(research); } file.put("form-investigation", researchArray); } List<String> developmentActivities = info.getTop5ProfessionalDevelomentActivities(); if (!developmentActivities.isEmpty()) { JSONArray researchArray = new JSONArray(); for (String developmentActivity : developmentActivities) { JSONObject activity = new JSONObject(); activity.put("highlevelactivities", cut("actividade", developmentActivity, output, 100)); researchArray.add(activity); } file.put("form-highlevelactivities", researchArray); } List<String> career = info.getTop5ProfessionalCareer(); if (!career.isEmpty()) { JSONArray professionalArray = new JSONArray(); for (String profession : career) { JSONObject pro = new JSONObject(); pro.put("profession", cut("carreira", profession, output, 100)); professionalArray.add(pro); } file.put("form-professional", professionalArray); } JSONArray insideLectures = new JSONArray(); List<LecturedCurricularUnit> lecturedUCs = info.getLecturedUCs(); if (lecturedUCs.size() > 10) { output.append(" UC leccionadas cortadas " + (lecturedUCs.size() - 10) + " entradas."); } for (LecturedCurricularUnit lecturedCurricularUnit : lecturedUCs.subList(0, Math.min(10, lecturedUCs.size()))) { JSONObject lecture = new JSONObject(); lecture.put("curricularUnit", cut("unidade curricular", lecturedCurricularUnit.getName(), output, 100)); lecture.put("studyCycle", cut("ciclo de estudos", lecturedCurricularUnit.getDegree(), output, 200)); lecture.put("type", cut("tipo", lecturedCurricularUnit.getShiftType(), output, 30)); lecture.put("hoursPerWeek", lecturedCurricularUnit.getHours()); insideLectures.add(lecture); } for (int lecturedCurricularUnitIndex = Math.min(10, lecturedUCs.size()); lecturedCurricularUnitIndex < 10; lecturedCurricularUnitIndex++) { JSONObject lecture = new JSONObject(); lecture.put("curricularUnit", StringUtils.EMPTY); lecture.put("studyCycle", StringUtils.EMPTY); lecture.put("type", StringUtils.EMPTY); lecture.put("hoursPerWeek", StringUtils.EMPTY); insideLectures.add(lecture); } file.put("form-unit", insideLectures); } toplevel.put("q-cf-cfile", file); jsons.put(toplevel, output.toString()); } return jsons; } public SpreadsheetBuilder exportTeacherCurriculum() { SheetData<TeacherCurricularInformation> sheet = new SheetData<TeacherCurricularInformation>(getTeacherCurricularInformation()) { @Override protected void makeLine(TeacherCurricularInformation teacherCurricularInformation) { addCell("IstId", teacherCurricularInformation.getTeacher().getPerson().getUsername()); addCell("Nome", teacherCurricularInformation.getTeacher().getPerson().getName()); addCell("Instituição", null); addCell("Unidade Orgânica", null); addCell("Categoria", teacherCurricularInformation.getProfessionalCategoryName()); Iterator<QualificationBean> qualifications = teacherCurricularInformation.getQualifications().iterator(); QualificationBean qualification = qualifications.hasNext() ? qualifications.next() : null; addCell("Grau", qualification != null ? qualification.getDegree() : null); addCell("Área científica", qualification != null ? qualification.getScientificArea() : null); addCell("Ano", qualification != null ? qualification.getYear() : null); addCell("Instituição", qualification != null ? qualification.getInstitution() : null); addCell("Regime", teacherCurricularInformation.getProfessionalRegimeTime()); List<String> otherQualificationStrings = new ArrayList<String>(); while (qualifications.hasNext()) { QualificationBean otherQualification = qualifications.next(); StringBuilder qualificationString = new StringBuilder(); qualificationString.append(otherQualification.getYear()).append(","); qualificationString.append(otherQualification.getDegree()).append(","); qualificationString.append(otherQualification.getScientificArea()).append(","); qualificationString.append(otherQualification.getInstitution()).append(","); qualificationString.append(otherQualification.getClassification()); otherQualificationStrings.add(qualificationString.toString()); } addCell("Outras Qualificações", StringUtils.join(otherQualificationStrings, "\n")); addCell("Publicações", StringUtils.join(teacherCurricularInformation.getTop5ResultParticipation(), "\n")); addCell("Experiência Profissional", StringUtils.join(teacherCurricularInformation.getTop5ProfessionalCareer(), "\n")); List<String> lectured = new ArrayList<String>(); for (LecturedCurricularUnit lecturedCurricularUnit : teacherCurricularInformation.getLecturedUCs()) { StringBuilder lecturedString = new StringBuilder(); lecturedString.append(lecturedCurricularUnit.getName()).append(","); lecturedString.append(lecturedCurricularUnit.getDegree()).append(","); lecturedString.append(lecturedCurricularUnit.getShiftType()).append(","); lecturedString.append(lecturedCurricularUnit.getHours()); lectured.add(lecturedString.toString()); } addCell("UCs", StringUtils.join(lectured, "\n")); } }; return new SpreadsheetBuilder().addSheet(degree.getSigla(), sheet); } }