org.cgiar.ccafs.marlo.action.annualReport.MeliaAction.java Source code

Java tutorial

Introduction

Here is the source code for org.cgiar.ccafs.marlo.action.annualReport.MeliaAction.java

Source

/*****************************************************************
 * This file is part of Managing Agricultural Research for Learning &
 * Outcomes Platform (MARLO).
 * MARLO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * at your option) any later version.
 * MARLO 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 General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with MARLO. If not, see <http://www.gnu.org/licenses/>.
 *****************************************************************/

package org.cgiar.ccafs.marlo.action.annualReport;

import org.cgiar.ccafs.marlo.action.BaseAction;
import org.cgiar.ccafs.marlo.config.APConstants;
import org.cgiar.ccafs.marlo.data.manager.AuditLogManager;
import org.cgiar.ccafs.marlo.data.manager.CrpProgramManager;
import org.cgiar.ccafs.marlo.data.manager.GlobalUnitManager;
import org.cgiar.ccafs.marlo.data.manager.LiaisonInstitutionManager;
import org.cgiar.ccafs.marlo.data.manager.PhaseManager;
import org.cgiar.ccafs.marlo.data.manager.ProjectExpectedStudyManager;
import org.cgiar.ccafs.marlo.data.manager.ProjectFocusManager;
import org.cgiar.ccafs.marlo.data.manager.ProjectManager;
import org.cgiar.ccafs.marlo.data.manager.ReportSynthesisManager;
import org.cgiar.ccafs.marlo.data.manager.ReportSynthesisMeliaEvaluationManager;
import org.cgiar.ccafs.marlo.data.manager.ReportSynthesisMeliaManager;
import org.cgiar.ccafs.marlo.data.manager.ReportSynthesisMeliaStudyManager;
import org.cgiar.ccafs.marlo.data.manager.UserManager;
import org.cgiar.ccafs.marlo.data.model.CrpProgram;
import org.cgiar.ccafs.marlo.data.model.GlobalUnit;
import org.cgiar.ccafs.marlo.data.model.LiaisonInstitution;
import org.cgiar.ccafs.marlo.data.model.LiaisonUser;
import org.cgiar.ccafs.marlo.data.model.Phase;
import org.cgiar.ccafs.marlo.data.model.PowbEvidencePlannedStudyDTO;
import org.cgiar.ccafs.marlo.data.model.ProgramType;
import org.cgiar.ccafs.marlo.data.model.Project;
import org.cgiar.ccafs.marlo.data.model.ProjectExpectedStudy;
import org.cgiar.ccafs.marlo.data.model.ProjectExpectedStudyFlagship;
import org.cgiar.ccafs.marlo.data.model.ProjectFocus;
import org.cgiar.ccafs.marlo.data.model.ProjectStatusEnum;
import org.cgiar.ccafs.marlo.data.model.ReportSynthesis;
import org.cgiar.ccafs.marlo.data.model.ReportSynthesisMelia;
import org.cgiar.ccafs.marlo.data.model.ReportSynthesisMeliaEvaluation;
import org.cgiar.ccafs.marlo.data.model.ReportSynthesisMeliaStudy;
import org.cgiar.ccafs.marlo.data.model.User;
import org.cgiar.ccafs.marlo.security.Permission;
import org.cgiar.ccafs.marlo.utils.APConfig;
import org.cgiar.ccafs.marlo.utils.AutoSaveReader;
import org.cgiar.ccafs.marlo.validation.annualreport.MeliaValidator;

import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.inject.Inject;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.apache.commons.lang3.StringUtils;

/**
 * @author Hermes Jimnez - CIAT/CCAFS
 */
public class MeliaAction extends BaseAction {

    private static final long serialVersionUID = -4468796840831686456L;

    // Managers
    private GlobalUnitManager crpManager;

    private LiaisonInstitutionManager liaisonInstitutionManager;

    private ReportSynthesisManager reportSynthesisManager;
    private AuditLogManager auditLogManager;
    private UserManager userManager;
    private CrpProgramManager crpProgramManager;
    private ReportSynthesisMeliaManager reportSynthesisMeliaManager;
    private MeliaValidator validator;
    private ProjectFocusManager projectFocusManager;
    private ProjectManager projectManager;
    private ProjectExpectedStudyManager projectExpectedStudyManager;
    private ReportSynthesisMeliaStudyManager reportSynthesisMeliaStudyManager;
    private ReportSynthesisMeliaEvaluationManager reportSynthesisMeliaEvaluationManager;
    private PhaseManager phaseManager;
    // Variables
    private String transaction;
    private ReportSynthesis reportSynthesis;

    private Long liaisonInstitutionID;
    private Long synthesisID;
    private LiaisonInstitution liaisonInstitution;
    private GlobalUnit loggedCrp;
    private List<LiaisonInstitution> liaisonInstitutions;
    private List<ProjectExpectedStudy> studiesList;
    private List<PowbEvidencePlannedStudyDTO> flagshipPlannedList;
    private List<ReportSynthesisMeliaEvaluation> fpSynthesisTable;
    private List<ReportSynthesisMelia> flagshipMeliaProgress;
    private Map<Integer, String> statuses;

    @Inject
    public MeliaAction(APConfig config, GlobalUnitManager crpManager,
            LiaisonInstitutionManager liaisonInstitutionManager, ReportSynthesisManager reportSynthesisManager,
            AuditLogManager auditLogManager, UserManager userManager, CrpProgramManager crpProgramManager,
            ReportSynthesisMeliaManager reportSynthesisMeliaManager, MeliaValidator validator,
            ProjectFocusManager projectFocusManager, ProjectManager projectManager,
            ProjectExpectedStudyManager projectExpectedStudyManager,
            ReportSynthesisMeliaStudyManager reportSynthesisMeliaStudyManager,
            ReportSynthesisMeliaEvaluationManager reportSynthesisMeliaEvaluationManager,
            PhaseManager phaseManager) {
        super(config);
        this.crpManager = crpManager;
        this.liaisonInstitutionManager = liaisonInstitutionManager;
        this.reportSynthesisManager = reportSynthesisManager;
        this.auditLogManager = auditLogManager;
        this.userManager = userManager;
        this.crpProgramManager = crpProgramManager;
        this.reportSynthesisMeliaManager = reportSynthesisMeliaManager;
        this.validator = validator;
        this.projectFocusManager = projectFocusManager;
        this.projectManager = projectManager;
        this.projectExpectedStudyManager = projectExpectedStudyManager;
        this.reportSynthesisMeliaStudyManager = reportSynthesisMeliaStudyManager;
        this.reportSynthesisMeliaEvaluationManager = reportSynthesisMeliaEvaluationManager;
        this.phaseManager = phaseManager;
    }

    public Long firstFlagship() {
        List<LiaisonInstitution> liaisonInstitutions = new ArrayList<>(loggedCrp.getLiaisonInstitutions().stream()
                .filter(c -> c.getCrpProgram() != null && c.isActive()
                        && c.getCrpProgram().getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue())
                .collect(Collectors.toList()));
        liaisonInstitutions.sort(Comparator.comparing(LiaisonInstitution::getAcronym));
        long liaisonInstitutionId = liaisonInstitutions.get(0).getId();
        return liaisonInstitutionId;
    }

    private Path getAutoSaveFilePath() {
        String composedClassName = reportSynthesis.getClass().getSimpleName();
        String actionFile = this.getActionName().replace("/", "_");
        String autoSaveFile = reportSynthesis.getId() + "_" + composedClassName + "_"
                + this.getActualPhase().getDescription() + "_" + this.getActualPhase().getYear() + "_" + actionFile
                + ".json";
        return Paths.get(config.getAutoSaveFolder() + autoSaveFile);
    }

    public List<ReportSynthesisMelia> getFlagshipMeliaProgress() {
        return flagshipMeliaProgress;
    }

    public List<PowbEvidencePlannedStudyDTO> getFlagshipPlannedList() {
        return flagshipPlannedList;
    }

    public List<ReportSynthesisMeliaEvaluation> getFpSynthesisTable() {
        return fpSynthesisTable;
    }

    public LiaisonInstitution getLiaisonInstitution() {
        return liaisonInstitution;
    }

    public Long getLiaisonInstitutionID() {
        return liaisonInstitutionID;
    }

    public List<LiaisonInstitution> getLiaisonInstitutions() {
        return liaisonInstitutions;
    }

    public GlobalUnit getLoggedCrp() {
        return loggedCrp;
    }

    public PhaseManager getPhaseManager() {
        return phaseManager;
    }

    public ReportSynthesis getReportSynthesis() {
        return reportSynthesis;
    }

    public Map<Integer, String> getStatuses() {
        return statuses;
    }

    public List<ProjectExpectedStudy> getStudiesList() {
        return studiesList;
    }

    public Long getSynthesisID() {
        return synthesisID;
    }

    public String getTransaction() {
        return transaction;
    }

    public boolean isFlagship() {
        boolean isFP = false;
        if (liaisonInstitution != null) {
            if (liaisonInstitution.getCrpProgram() != null) {
                CrpProgram crpProgram = crpProgramManager
                        .getCrpProgramById(liaisonInstitution.getCrpProgram().getId().longValue());
                if (crpProgram.getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) {
                    isFP = true;
                }
            }
        }
        return isFP;
    }

    @Override
    public boolean isPMU() {
        boolean isFP = false;
        if (liaisonInstitution != null) {
            if (liaisonInstitution.getCrpProgram() == null) {
                isFP = true;
            }
        }
        return isFP;

    }

    @Override
    public void prepare() throws Exception {
        // Get current CRP
        loggedCrp = (GlobalUnit) this.getSession().get(APConstants.SESSION_CRP);
        loggedCrp = crpManager.getGlobalUnitById(loggedCrp.getId());
        Phase phase = this.getActualPhase();

        // If there is a history version being loaded
        if (this.getRequest().getParameter(APConstants.TRANSACTION_ID) != null) {
            transaction = StringUtils.trim(this.getRequest().getParameter(APConstants.TRANSACTION_ID));
            ReportSynthesis history = (ReportSynthesis) auditLogManager.getHistory(transaction);
            if (history != null) {
                reportSynthesis = history;
                synthesisID = reportSynthesis.getId();
            } else {
                this.transaction = null;
                this.setTransaction("-1");
            }
        } else {
            // Get Liaison institution ID Parameter
            try {
                liaisonInstitutionID = Long.parseLong(StringUtils
                        .trim(this.getRequest().getParameter(APConstants.LIAISON_INSTITUTION_REQUEST_ID)));
            } catch (NumberFormatException e) {
                User user = userManager.getUser(this.getCurrentUser().getId());
                if (user.getLiasonsUsers() != null || !user.getLiasonsUsers().isEmpty()) {
                    List<LiaisonUser> liaisonUsers = new ArrayList<>(user.getLiasonsUsers().stream()
                            .filter(lu -> lu.isActive() && lu.getLiaisonInstitution().isActive()
                                    && lu.getLiaisonInstitution().getCrp().getId() == loggedCrp.getId()
                                    && lu.getLiaisonInstitution().getInstitution() == null)
                            .collect(Collectors.toList()));
                    if (!liaisonUsers.isEmpty()) {
                        boolean isLeader = false;
                        for (LiaisonUser liaisonUser : liaisonUsers) {
                            LiaisonInstitution institution = liaisonUser.getLiaisonInstitution();
                            if (institution.isActive()) {
                                if (institution.getCrpProgram() != null) {
                                    if (institution.getCrpProgram()
                                            .getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) {
                                        liaisonInstitutionID = institution.getId();
                                        isLeader = true;
                                        break;
                                    }
                                } else {
                                    if (institution.getAcronym().equals("PMU")) {
                                        liaisonInstitutionID = institution.getId();
                                        isLeader = true;
                                        break;
                                    }
                                }
                            }
                        }
                        if (!isLeader) {
                            liaisonInstitutionID = this.firstFlagship();
                        }
                    } else {
                        liaisonInstitutionID = this.firstFlagship();
                    }
                } else {
                    liaisonInstitutionID = this.firstFlagship();
                }
            }

            try {
                synthesisID = Long.parseLong(
                        StringUtils.trim(this.getRequest().getParameter(APConstants.REPORT_SYNTHESIS_ID)));
                reportSynthesis = reportSynthesisManager.getReportSynthesisById(synthesisID);

                if (!reportSynthesis.getPhase().equals(phase)) {
                    reportSynthesis = reportSynthesisManager.findSynthesis(phase.getId(), liaisonInstitutionID);
                    if (reportSynthesis == null) {
                        reportSynthesis = this.createReportSynthesis(phase.getId(), liaisonInstitutionID);
                    }
                    synthesisID = reportSynthesis.getId();
                }
            } catch (Exception e) {
                reportSynthesis = reportSynthesisManager.findSynthesis(phase.getId(), liaisonInstitutionID);
                if (reportSynthesis == null) {
                    reportSynthesis = this.createReportSynthesis(phase.getId(), liaisonInstitutionID);
                }
                synthesisID = reportSynthesis.getId();

            }
        }

        if (reportSynthesis != null) {

            ReportSynthesis reportSynthesisDB = reportSynthesisManager
                    .getReportSynthesisById(reportSynthesis.getId());
            synthesisID = reportSynthesisDB.getId();
            liaisonInstitutionID = reportSynthesisDB.getLiaisonInstitution().getId();
            liaisonInstitution = liaisonInstitutionManager.getLiaisonInstitutionById(liaisonInstitutionID);

            // Fill Flagship Expected Studies
            if (this.isFlagship()) {
                this.studiesList(phase.getId(), liaisonInstitution);
            }

            Path path = this.getAutoSaveFilePath();
            // Verify if there is a Draft file
            if (path.toFile().exists() && this.getCurrentUser().isAutoSave()) {
                BufferedReader reader;
                reader = new BufferedReader(new FileReader(path.toFile()));
                Gson gson = new GsonBuilder().create();
                JsonObject jReader = gson.fromJson(reader, JsonObject.class);
                reader.close();
                AutoSaveReader autoSaveReader = new AutoSaveReader();
                reportSynthesis = (ReportSynthesis) autoSaveReader.readFromJson(jReader);
                synthesisID = reportSynthesis.getId();
                this.setDraft(true);
            } else {

                this.setDraft(false);
                // Check if relation is null -create it
                if (reportSynthesis.getReportSynthesisMelia() == null) {
                    ReportSynthesisMelia melia = new ReportSynthesisMelia();
                    // create one to one relation
                    reportSynthesis.setReportSynthesisMelia(melia);
                    ;
                    melia.setReportSynthesis(reportSynthesis);
                    // save the changes
                    reportSynthesis = reportSynthesisManager.saveReportSynthesis(reportSynthesis);
                }

                if (this.isFlagship()) {
                    // Crp Progress Studies
                    reportSynthesis.getReportSynthesisMelia().setExpectedStudies(new ArrayList<>());
                    if (reportSynthesis.getReportSynthesisMelia().getReportSynthesisMeliaStudies() != null
                            && !reportSynthesis.getReportSynthesisMelia().getReportSynthesisMeliaStudies()
                                    .isEmpty()) {
                        for (ReportSynthesisMeliaStudy plannedStudy : reportSynthesis.getReportSynthesisMelia()
                                .getReportSynthesisMeliaStudies().stream().filter(ro -> ro.isActive())
                                .collect(Collectors.toList())) {
                            reportSynthesis.getReportSynthesisMelia().getExpectedStudies()
                                    .add(plannedStudy.getProjectExpectedStudy());
                        }
                    }

                } else {
                    if (reportSynthesis.getReportSynthesisMelia().getReportSynthesisMeliaEvaluations() != null
                            && !reportSynthesis.getReportSynthesisMelia().getReportSynthesisMeliaEvaluations()
                                    .isEmpty()) {
                        reportSynthesis.getReportSynthesisMelia()
                                .setEvaluations(new ArrayList<>(reportSynthesis.getReportSynthesisMelia()
                                        .getReportSynthesisMeliaEvaluations().stream().filter(e -> e.isActive())
                                        .collect(Collectors.toList())));
                    }
                }
            }
        }

        // Getting The list
        statuses = new HashMap<>();
        List<ProjectStatusEnum> listStatus = Arrays.asList(ProjectStatusEnum.values());
        for (ProjectStatusEnum globalStatusEnum : listStatus) {
            statuses.put(Integer.parseInt(globalStatusEnum.getStatusId()), globalStatusEnum.getStatus());
        }

        // Get the list of liaison institutions Flagships and PMU.
        liaisonInstitutions = loggedCrp.getLiaisonInstitutions().stream()
                .filter(c -> c.getCrpProgram() != null && c.isActive()
                        && c.getCrpProgram().getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue())
                .collect(Collectors.toList());
        liaisonInstitutions.sort(Comparator.comparing(LiaisonInstitution::getAcronym));

        if (this.isPMU()) {
            // Table I-1 PMU Information
            flagshipPlannedList = reportSynthesisMeliaManager.getMeliaPlannedList(liaisonInstitutions,
                    phase.getId(), loggedCrp, this.liaisonInstitution);

            // Table I-2 Evaluations
            fpSynthesisTable = reportSynthesisMeliaManager.flagshipSynthesisEvaluation(liaisonInstitutions,
                    phase.getId());

            // Flagships Synthesis Progress
            flagshipMeliaProgress = reportSynthesisMeliaManager.getFlagshipMelia(liaisonInstitutions,
                    phase.getId());
        }

        // ADD PMU as liasion Institution too
        liaisonInstitutions.addAll(loggedCrp.getLiaisonInstitutions().stream()
                .filter(c -> c.getCrpProgram() == null && c.isActive() && c.getAcronym().equals("PMU"))
                .collect(Collectors.toList()));

        // Base Permission
        String params[] = { loggedCrp.getAcronym(), reportSynthesis.getId() + "" };
        this.setBasePermission(this.getText(Permission.REPORT_SYNTHESIS_MELIA_BASE_PERMISSION, params));

        if (this.isHttpPost()) {
            if (reportSynthesis.getReportSynthesisMelia().getEvaluations() != null) {
                reportSynthesis.getReportSynthesisMelia().getEvaluations().clear();
            }

            if (reportSynthesis.getReportSynthesisMelia().getPlannedStudies() != null) {
                reportSynthesis.getReportSynthesisMelia().getPlannedStudies().clear();
            }

        }
    }

    @Override
    public String save() {
        if (this.hasPermission("canEdit")) {

            ReportSynthesisMelia meliaDB = reportSynthesisManager.getReportSynthesisById(synthesisID)
                    .getReportSynthesisMelia();

            if (this.isFlagship()) {
                if (reportSynthesis.getReportSynthesisMelia().getPlannedStudies() == null) {
                    reportSynthesis.getReportSynthesisMelia().setPlannedStudies(new ArrayList<>());
                }
                this.saveStudies(meliaDB);

            } else {
                this.saveEvaluations(meliaDB);
            }

            meliaDB.setSummary(reportSynthesis.getReportSynthesisMelia().getSummary());

            meliaDB = reportSynthesisMeliaManager.saveReportSynthesisMelia(meliaDB);

            List<String> relationsName = new ArrayList<>();
            reportSynthesis = reportSynthesisManager.getReportSynthesisById(synthesisID);

            /**
             * The following is required because we need to update something on the @ReportSynthesis if we want a row created
             * in the auditlog table.
             */
            this.setModificationJustification(reportSynthesis);

            reportSynthesisManager.save(reportSynthesis, this.getActionName(), relationsName,
                    this.getActualPhase());

            Path path = this.getAutoSaveFilePath();
            if (path.toFile().exists()) {
                path.toFile().delete();
            }

            Collection<String> messages = this.getActionMessages();
            if (!this.getInvalidFields().isEmpty()) {
                this.setActionMessages(null);
                // this.addActionMessage(Map.toString(this.getInvalidFields().toArray()));
                List<String> keys = new ArrayList<String>(this.getInvalidFields().keySet());
                for (String key : keys) {
                    this.addActionMessage(key + ": " + this.getInvalidFields().get(key));
                }

            } else {
                this.addActionMessage("message:" + this.getText("saving.saved"));
            }

            return SUCCESS;
        } else {
            return NOT_AUTHORIZED;
        }
    }

    /**
     * Save Evaluations Information
     * 
     * @param crossCgiarDB
     */
    public void saveEvaluations(ReportSynthesisMelia meliaDB) {

        // Search and deleted form Information
        if (meliaDB.getReportSynthesisMeliaEvaluations() != null
                && meliaDB.getReportSynthesisMeliaEvaluations().size() > 0) {

            List<ReportSynthesisMeliaEvaluation> evaluationPrev = new ArrayList<>(
                    meliaDB.getReportSynthesisMeliaEvaluations().stream().filter(nu -> nu.isActive())
                            .collect(Collectors.toList()));

            for (ReportSynthesisMeliaEvaluation evaluation : evaluationPrev) {
                if (!reportSynthesis.getReportSynthesisMelia().getEvaluations().contains(evaluation)) {
                    reportSynthesisMeliaEvaluationManager.deleteReportSynthesisMeliaEvaluation(evaluation.getId());
                }
            }
        }

        // Save form Information
        if (reportSynthesis.getReportSynthesisMelia().getEvaluations() != null) {
            for (ReportSynthesisMeliaEvaluation evaluation : reportSynthesis.getReportSynthesisMelia()
                    .getEvaluations()) {
                if (evaluation.getId() == null) {
                    ReportSynthesisMeliaEvaluation evaluationSave = new ReportSynthesisMeliaEvaluation();

                    evaluationSave.setReportSynthesisMelia(meliaDB);

                    evaluationSave.setStatus(evaluation.getStatus());
                    evaluationSave.setNameEvaluation(evaluation.getNameEvaluation());
                    evaluationSave.setRecommendation(evaluation.getRecommendation());
                    evaluationSave.setManagementResponse(evaluation.getManagementResponse());
                    evaluationSave.setTextWhom(evaluation.getTextWhom());
                    evaluationSave.setTextWhen(evaluation.getTextWhen());

                    reportSynthesisMeliaEvaluationManager.saveReportSynthesisMeliaEvaluation(evaluationSave);
                } else {

                    ReportSynthesisMeliaEvaluation evaluationPrev = reportSynthesisMeliaEvaluationManager
                            .getReportSynthesisMeliaEvaluationById(evaluation.getId());

                    evaluationPrev.setStatus(evaluation.getStatus());
                    evaluationPrev.setNameEvaluation(evaluation.getNameEvaluation());
                    evaluationPrev.setRecommendation(evaluation.getRecommendation());
                    evaluationPrev.setManagementResponse(evaluation.getManagementResponse());
                    evaluationPrev.setTextWhom(evaluation.getTextWhom());
                    evaluationPrev.setTextWhen(evaluation.getTextWhen());

                    reportSynthesisMeliaEvaluationManager.saveReportSynthesisMeliaEvaluation(evaluationPrev);

                }
            }
        }

    }

    public void saveStudies(ReportSynthesisMelia meliaDB) {

        List<Long> selectedPs = new ArrayList<>();
        List<Long> studiesIds = new ArrayList<>();

        for (ProjectExpectedStudy std : studiesList) {
            studiesIds.add(std.getId());
        }

        if (reportSynthesis.getReportSynthesisMelia().getPlannedStudiesValue() != null
                && reportSynthesis.getReportSynthesisMelia().getPlannedStudiesValue().length() > 0) {
            List<Long> stList = new ArrayList<>();
            for (String string : reportSynthesis.getReportSynthesisMelia().getPlannedStudiesValue().trim()
                    .split(",")) {
                stList.add(Long.parseLong(string.trim()));
            }

            for (Long studyId : studiesIds) {
                int index = stList.indexOf(studyId);
                if (index < 0) {
                    selectedPs.add(studyId);
                }

            }

            for (ReportSynthesisMeliaStudy reportStudy : meliaDB.getReportSynthesisMeliaStudies().stream()
                    .filter(rio -> rio.isActive()).collect(Collectors.toList())) {
                if (!selectedPs.contains(reportStudy.getProjectExpectedStudy().getId())) {
                    reportSynthesisMeliaStudyManager.deleteReportSynthesisMeliaStudy(reportStudy.getId());
                }
            }

            for (Long studyId : selectedPs) {
                ProjectExpectedStudy expectedStudy = projectExpectedStudyManager
                        .getProjectExpectedStudyById(studyId);

                ReportSynthesisMeliaStudy meliaStudyNew = new ReportSynthesisMeliaStudy();
                meliaStudyNew = new ReportSynthesisMeliaStudy();
                meliaStudyNew.setProjectExpectedStudy(expectedStudy);
                meliaStudyNew.setReportSynthesisMelia(meliaDB);

                List<ReportSynthesisMeliaStudy> meliaStudies = meliaDB.getReportSynthesisMeliaStudies().stream()
                        .filter(rio -> rio.isActive()).collect(Collectors.toList());

                if (!meliaStudies.contains(meliaStudyNew)) {
                    meliaStudyNew = reportSynthesisMeliaStudyManager.saveReportSynthesisMeliaStudy(meliaStudyNew);
                }
            }
        } else {

            for (Long studyId : studiesIds) {
                ProjectExpectedStudy expectedStudy = projectExpectedStudyManager
                        .getProjectExpectedStudyById(studyId);

                ReportSynthesisMeliaStudy meliaStudyNew = new ReportSynthesisMeliaStudy();
                meliaStudyNew = new ReportSynthesisMeliaStudy();
                meliaStudyNew.setProjectExpectedStudy(expectedStudy);
                meliaStudyNew.setReportSynthesisMelia(meliaDB);

                List<ReportSynthesisMeliaStudy> meliaStudies = meliaDB.getReportSynthesisMeliaStudies().stream()
                        .filter(rio -> rio.isActive()).collect(Collectors.toList());

                if (!meliaStudies.contains(meliaStudyNew)) {
                    meliaStudyNew = reportSynthesisMeliaStudyManager.saveReportSynthesisMeliaStudy(meliaStudyNew);
                }
            }

        }
    }

    public void setFlagshipMeliaProgress(List<ReportSynthesisMelia> flagshipMeliaProgress) {
        this.flagshipMeliaProgress = flagshipMeliaProgress;
    }

    public void setFlagshipPlannedList(List<PowbEvidencePlannedStudyDTO> flagshipPlannedList) {
        this.flagshipPlannedList = flagshipPlannedList;
    }

    public void setFpSynthesisTable(List<ReportSynthesisMeliaEvaluation> fpSynthesisTable) {
        this.fpSynthesisTable = fpSynthesisTable;
    }

    public void setLiaisonInstitution(LiaisonInstitution liaisonInstitution) {
        this.liaisonInstitution = liaisonInstitution;
    }

    public void setLiaisonInstitutionID(Long liaisonInstitutionID) {
        this.liaisonInstitutionID = liaisonInstitutionID;
    }

    public void setLiaisonInstitutions(List<LiaisonInstitution> liaisonInstitutions) {
        this.liaisonInstitutions = liaisonInstitutions;
    }

    public void setLoggedCrp(GlobalUnit loggedCrp) {
        this.loggedCrp = loggedCrp;
    }

    public void setPhaseManager(PhaseManager phaseManager) {
        this.phaseManager = phaseManager;
    }

    public void setReportSynthesis(ReportSynthesis reportSynthesis) {
        this.reportSynthesis = reportSynthesis;
    }

    public void setStatuses(Map<Integer, String> statuses) {
        this.statuses = statuses;
    }

    public void setStudiesList(List<ProjectExpectedStudy> studiesList) {
        this.studiesList = studiesList;
    }

    public void setSynthesisID(Long synthesisID) {
        this.synthesisID = synthesisID;
    }

    public void setTransaction(String transaction) {
        this.transaction = transaction;
    }

    public void studiesList(long phaseID, LiaisonInstitution liaisonInstitution) {

        studiesList = new ArrayList<>();

        Phase phase = phaseManager.getPhaseById(phaseID);

        if (projectFocusManager.findAll() != null) {

            List<ProjectFocus> projectFocus = new ArrayList<>(projectFocusManager.findAll().stream()
                    .filter(pf -> pf.isActive()
                            && pf.getCrpProgram().getId() == liaisonInstitution.getCrpProgram().getId()
                            && pf.getPhase() != null && pf.getPhase().getId() == phaseID)
                    .collect(Collectors.toList()));

            for (ProjectFocus focus : projectFocus) {
                Project project = projectManager.getProjectById(focus.getProject().getId());
                List<ProjectExpectedStudy> expectedStudies = new ArrayList<>(project.getProjectExpectedStudies()
                        .stream().filter(es -> es.isActive() && es.getYear() == this.getCurrentCycleYear())
                        .collect(Collectors.toList()));
                for (ProjectExpectedStudy projectExpectedStudy : expectedStudies) {
                    if (projectExpectedStudy.getProjectExpectedStudyInfo(phase) != null) {
                        if (projectExpectedStudy.getProjectExpectedStudyInfo(phase).getStudyType() != null
                                && projectExpectedStudy.getProjectExpectedStudyInfo(phase).getStudyType()
                                        .getId() != 1) {
                            studiesList.add(projectExpectedStudy);
                        }
                    }
                }
            }

            List<ProjectExpectedStudy> expectedStudies = new ArrayList<>(
                    projectExpectedStudyManager
                            .findAll().stream().filter(es -> es.isActive()
                                    && es.getYear() == this.getCurrentCycleYear() && es.getProject() == null)
                            .collect(Collectors.toList()));

            for (ProjectExpectedStudy projectExpectedStudy : expectedStudies) {
                if (projectExpectedStudy.getProjectExpectedStudyInfo(phase) != null) {
                    List<ProjectExpectedStudyFlagship> studiesPrograms = new ArrayList<>(
                            projectExpectedStudy.getProjectExpectedStudyFlagships().stream()
                                    .filter(s -> s.isActive() && s.getPhase().getId() == phase.getId())
                                    .collect(Collectors.toList()));
                    for (ProjectExpectedStudyFlagship projectExpectedStudyFlagship : studiesPrograms) {
                        CrpProgram crpProgram = liaisonInstitution.getCrpProgram();
                        if (crpProgram.equals(projectExpectedStudyFlagship.getCrpProgram())) {
                            if (projectExpectedStudy.getProjectExpectedStudyInfo(phase) != null) {
                                if (projectExpectedStudy.getProjectExpectedStudyInfo(phase).getStudyType() != null
                                        && projectExpectedStudy.getProjectExpectedStudyInfo(phase).getStudyType()
                                                .getId() != 1) {
                                    studiesList.add(projectExpectedStudy);
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            for (ProjectExpectedStudy projectExpectedStudy : studiesList) {
                if (projectExpectedStudy.getProjectExpectedStudySubIdos() != null
                        && !projectExpectedStudy.getProjectExpectedStudySubIdos().isEmpty()) {
                    projectExpectedStudy.setSubIdos(new ArrayList<>(projectExpectedStudy
                            .getProjectExpectedStudySubIdos().stream()
                            .filter(s -> s.getPhase().getId() == phase.getId()).collect(Collectors.toList())));
                }
            }

        }
    }

    @Override
    public void validate() {
        if (save) {
            validator.validate(this, reportSynthesis, true);
        }
    }
}