package es.uv.saic.web; import java.io.IOException; import java.math.BigInteger; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Year; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import static java.util.Comparator.comparing; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import jakarta.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import es.uv.saic.domain.Calendari; import es.uv.saic.domain.DummyDataTransfer; import es.uv.saic.domain.Email; import es.uv.saic.domain.EvidenciaIndicadorEnquesta; import es.uv.saic.domain.InstanciaTasca; import es.uv.saic.domain.Organ; import es.uv.saic.domain.Plantilla; import es.uv.saic.domain.Proces; import es.uv.saic.domain.Rol; import es.uv.saic.domain.Tipus; import es.uv.saic.domain.Usuari; import es.uv.saic.dto.EvidenciaBuscadorDTO; import es.uv.saic.feign.PlantillaClient; import es.uv.saic.service.CalendariService; import es.uv.saic.service.EmailService; import es.uv.saic.service.EvidenciaIndicadorEnquestaService; import es.uv.saic.service.InstanciaService; import es.uv.saic.service.InstanciaTascaService; import es.uv.saic.service.OrganService; import es.uv.saic.service.ProcesService; import es.uv.saic.service.RolService; import es.uv.saic.service.TascaService; import es.uv.saic.service.TipusService; import es.uv.saic.service.UsuariService; @Controller public class AjaxController { @Autowired private OrganService os; @Autowired private UsuariService us; @Autowired private ProcesService ps; @Autowired private TascaService tas; @Autowired private TipusService tps; @Autowired private RolService rs; @Autowired private EvidenciaIndicadorEnquestaService eies; @Autowired private CalendariService cs; @Autowired private InstanciaService is; @Autowired private InstanciaTascaService its; @Autowired private EmailService es; @Autowired private PlantillaClient plc; @PostMapping("/ajax/active/centres") public String getActiveCentres(Model model, Authentication auth) throws IOException { List org_list = this.os.getActiveCentres(); List centres = new ArrayList(); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); centres.add(c); } System.out.println(centres); model.addAttribute("sup_centers", centres); return "components/selector_centres"; } @PostMapping("/ajax/active/titulacions") public String getActiveTitulationsByCenter(Model model, Authentication auth, @RequestParam("centre") Integer centre) throws IOException { List org_list = this.os.getTitulacionsByCentre(centre); List titulacions = new ArrayList(); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getRuct()); titulacions.add(c); } model.addAttribute("sup_orgs", titulacions); return "components/selector_titulacions"; } // POST que buscar titulaciones que se encuentren asociadas a uno o varios centros @PostMapping("/ajax/search/titulations") public String getTitulationsByCenter(Model model, Authentication auth, @RequestParam(name="centers[]", required=false) List centres) throws IOException { if(centres == null) { centres = us.getSupervisableCentres((Usuari) auth.getPrincipal()); } List org_list = this.os.findTitulacionsByCentre(centres); List supervisable_cents = new ArrayList(); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); supervisable_cents.add(c); } DummyDataTransfer o = new DummyDataTransfer(); o = new DummyDataTransfer(); Organ org = os.findByID("T", 1); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(1); supervisable_cents.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 2); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(2); supervisable_cents.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 0); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(0); supervisable_cents.add(o); model.addAttribute("sup_orgs", supervisable_cents); return "components/selector_titulacions"; } // POST que se utiliza para conseguir los cursos a partir de la titulación @PostMapping("/ajax/search/years") public String getYearsByCenterTitulation(Model model, Authentication auth, @RequestParam(name="centers[]", required=false) List centres, @RequestParam("titulations[]") List titulacions) throws IOException { List supervisable_years = new ArrayList(); if(centres == null) { centres = us.getSupervisableCentres((Usuari) auth.getPrincipal()); } for(Integer c : ps.getSupervisableCursos(centres, titulacions)) { DummyDataTransfer d = new DummyDataTransfer(); d.setValue(c); d.setText(Integer.toString(c-1) + " - " + Integer.toString(c)); supervisable_years.add(d); } model.addAttribute("sup_years", supervisable_years); return "components/selector_cursos"; } // POST que se utiliza para conseguir los procedimiento que se han llevado a cabo por cursos y por titulación @PostMapping("/ajax/search/procedures") public String getProceduresByCenterTitulationYear(Model model, Authentication auth, @RequestParam(name="centers[]", required=false) List centres, @RequestParam("years[]") List cursos, @RequestParam("titulations[]") List titulacions) throws IOException { List supervisable_procedures = new ArrayList(); if(centres == null) { centres = us.getSupervisableCentres((Usuari) auth.getPrincipal()); } for(Integer p_id : ps.getSupervisableProcedures((Usuari) auth.getPrincipal(), cursos, centres, titulacions)) { DummyDataTransfer d = new DummyDataTransfer(); Proces p = ps.findByID(p_id); d.setText(p.getNomProces()); d.setText2(p.getNomProces() + " " + p.getTitolCas()); d.setText3(p.getNomProces() + " " + p.getTitolVal()); supervisable_procedures.add(d); } Set set = new HashSet<>(supervisable_procedures.size()); supervisable_procedures.removeIf(p -> !set.add(p.getText())); Collections.sort(supervisable_procedures, comparing(DummyDataTransfer::getText)); model.addAttribute("sup_procs", supervisable_procedures); return "components/selector_processos"; } // POST para buscar pas evidencias a partir del año, centro y titulación @PostMapping("/ajax/search/evidences") public String getEvidencesByCenterTitulationYear(Model model, Authentication auth, @RequestParam(name="centers[]", required=false) List centres, @RequestParam("years[]") List cursos, @RequestParam("titulations[]") List titulacions) throws IOException { List supervisable_evs = new ArrayList(); List evs_list = tas.getEvidenciesByCentreTitulacioCurs(centres, titulacions, cursos); for(EvidenciaBuscadorDTO e : evs_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(e.getCodiEvidencia()); c.setText2(e.getNomEvidenciaCas()); c.setText3(e.getNomEvidenciaVal()); supervisable_evs.add(c); } model.addAttribute("sup_evs", supervisable_evs); return "components/selector_evidencies"; } // POST que recoge toda las titulaciones que contiene un centro para el manager @PostMapping("/ajax/search/managers/titulations") public String getCenterTitulations(Model model, Authentication auth, @RequestParam("center") Integer centre, HttpSession session) { List sup_titulacions; sup_titulacions = this.os.getTitulacionsByCentre(centre); model.addAttribute("resp_titulacions", sup_titulacions); return "components/selector_titulacions_managers"; } @PostMapping("/ajax/find/titulations2") public String getTitulationsByCenters(Model model, Authentication auth, @RequestParam("centers[]") List centres, @RequestParam("procedure") Integer idProces) throws IOException { List titulations = new ArrayList(); DummyDataTransfer o = new DummyDataTransfer(); if(idProces > 0) { Proces p = ps.findByID(idProces); if(p.getAmbit().equals("U")) { o = new DummyDataTransfer(); Organ org = os.findByID("T", 0); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); titulations.add(o); } else if(p.getAmbit().equals("C")) { o = new DummyDataTransfer(); Organ org = os.findByID("T", 1); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(1); titulations.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 2); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(2); titulations.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 0); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(0); titulations.add(o); } else if(p.getAmbit().equals("T")) { for(Integer centre : centres) { List org_list = this.os.getTitulacionsByCentre(centre); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); titulations.add(c); } } Collections.sort(titulations, (o1, o2) -> Integer.valueOf(o1.getValue()).compareTo(Integer.valueOf(o2.getValue()))); } } else { for(Integer centre : centres) { List org_list = this.os.getTitulacionsByCentre(centre); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); titulations.add(c); } } Collections.sort(titulations, (o1, o2) -> Integer.valueOf(o1.getValue()).compareTo(Integer.valueOf(o2.getValue()))); } model.addAttribute("sup_orgs", titulations); return "components/selector_titulacions"; } @PostMapping("/ajax/find/titulations") public String getTitulationsByCenter(Model model, Authentication auth, @RequestParam("center") Integer centre, @RequestParam("procedure") Integer idProces) throws IOException { Proces p = ps.findByID(idProces); List titulations = new ArrayList(); DummyDataTransfer o = new DummyDataTransfer(); if(p.getAmbit().equals("U")) { o = new DummyDataTransfer(); Organ org = os.findByID("T", 0); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); titulations.add(o); } else if(p.getAmbit().equals("C")) { o = new DummyDataTransfer(); Organ org = os.findByID("T", 1); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(1); titulations.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 2); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(2); titulations.add(o); o = new DummyDataTransfer(); org = os.findByID("T", 0); o.setText(org.getNomCas()); o.setText2(org.getNomVal()); o.setValue(0); titulations.add(o); } else if(p.getAmbit().equals("T")) { o = new DummyDataTransfer(); o.setText("Todos los grados"); o.setText2("Tots els graus"); o.setValue(1); titulations.add(o); o = new DummyDataTransfer(); o.setText("Todos los másters"); o.setText2("Tots els màsters"); o.setValue(2); titulations.add(o); o = new DummyDataTransfer(); o.setText("Todas las titulaciones"); o.setText2("Totes les titulacions"); o.setValue(0); titulations.add(o); List org_list = this.os.getTitulacionsByCentre(centre); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); titulations.add(c); } } model.addAttribute("sup_orgs", titulations); return "components/selector_titulacions"; } @PostMapping("/ajax/get/titulations") public String getAllTitulationsByCenter(Model model, Authentication auth, @RequestParam("center") Integer centre) throws IOException { List titulations = new ArrayList(); DummyDataTransfer o = new DummyDataTransfer(); o = new DummyDataTransfer(); o.setText("Todos los grados"); o.setText2("Tots els graus"); o.setValue(1); titulations.add(o); o = new DummyDataTransfer(); o.setText("Todos los másters"); o.setText2("Tots els màsters"); o.setValue(2); titulations.add(o); o = new DummyDataTransfer(); o.setText("Todas las titulaciones"); o.setText2("Totes les titulacions"); o.setValue(0); titulations.add(o); List org_list = this.os.getTitulacionsByCentre(centre); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); titulations.add(c); } model.addAttribute("sup_orgs", titulations); return "components/selector_titulacions"; } // POST para encontrar el centro a partir de los procedimientos @PostMapping("/ajax/find/centers") public String getAllCentresByAmbit(Model model, Authentication auth, @RequestParam("procedure") Integer idProces) throws IOException { List centres = new ArrayList(); if(idProces > 0) { Proces p = ps.findByID(idProces); if(p.getAmbit().equals("C")) { DummyDataTransfer o = new DummyDataTransfer(); o.setText("Todos los centros"); o.setText2("Tots els centres"); o.setValue(0); centres.add(o); } } List org_list = this.os.getActiveCentres(); for(Organ or : org_list) { DummyDataTransfer c = new DummyDataTransfer(); c.setText(or.getNomCas()); c.setText2(or.getNomVal()); c.setValue(or.getId().getLugar()); centres.add(c); } model.addAttribute("sup_centers", centres); return "components/selector_centres"; } // POST para encontrar un procedimiento concreto @PostMapping("/ajax/find/procedure") public String findProcedure(Model model, Authentication auth, @RequestParam("procedure") Integer idProces, @RequestParam("action") String action) throws IOException { Proces p = new Proces(); model.addAttribute("action", action); List tipus = tps.findAll(); List templates = plc.findAll(); model.addAttribute("tipus", tipus); model.addAttribute("templates", templates); if(idProces != 0 && (action.equals("duplicate") || action.equals("edit"))) { p = ps.findByID(idProces); if(action.equals("duplicate")) { p.setVersio(Integer.toString(Integer.parseInt(p.getVersio())+1)); p.setIdProces(p.getIdProces()+1); p.setCursActivacio(Year.now().getValue()); p.setCursAvaluat(null); } model.addAttribute("tasks", this.tas.findByProces(idProces)); model.addAttribute("procedure", p); List roles = rs.findAssignables(); model.addAttribute("roles", roles); return "components/form_procedure"; } else if(idProces != 0 && action.equals("remove")) { p = ps.findByID(idProces); model.addAttribute("procedure", p); return "components/form_procedure_remove_confirm"; } else { model.addAttribute("procedure", p); List roles = rs.findAssignables(); model.addAttribute("roles", roles); return "components/form_procedure"; } } // POST para encontar las plantillas concretas para cierta titulación, centro o procedimiento //NO se usa @PostMapping("/ajax/find/templates") public String findTemplates(Model model, Authentication auth, @RequestParam("procedure") Integer idProces, @RequestParam("center") String idCentre, @RequestParam("titulation") String idTitulacio) throws IOException { model.addAttribute("evs", this.tas.getEvidencesByProcedure(idProces)); model.addAttribute("idCentre", idCentre); model.addAttribute("idTitulacio", idTitulacio); model.addAttribute("idProces", idProces); return "components/templates"; } //NO se usa @PostMapping("/ajax/find/template/inds") public String findTemplatesInds(Model model, Authentication auth, @RequestParam("procedure") Integer idProces, @RequestParam("center") String idCentre, @RequestParam("titulation") String idTitulacio, @RequestParam("ev") String evidencia) throws IOException { Proces p = this.ps.findByID(idProces); List inds = this.eies.getByProcesEvidencia(p.getNomProces(), evidencia); model.addAttribute("inds", inds); model.addAttribute("proces", p.getNomProces()); model.addAttribute("idCentre", idCentre); model.addAttribute("idTitulacio", idTitulacio); model.addAttribute("evidencia", evidencia); return "components/form_templates_indicators"; } // GET para renderizar el formulario de cración de nueva tarea @GetMapping("/ajax/newTask/{i}") public String newTaskForm(Model model, Authentication auth, @PathVariable Integer i) throws IOException { List roles = rs.findAssignables(); List tipus = tps.findAll(); List templates = plc.findAll(); model.addAttribute("tipus", tipus); model.addAttribute("roles", roles); model.addAttribute("i", i); model.addAttribute("templates", templates); return "components/form_procedure_task"; } @GetMapping("/ajax/newUserrole") public String newUserRoleForm(Model model, Authentication auth) throws IOException { List users = us.findAll(); List roles = rs.findAll(); model.addAttribute("users", users); model.addAttribute("roles", roles); return "components/form_new_manager"; } @ResponseBody @PostMapping("/ajax/find/template") public String findTemplate(Model model, Authentication auth, @RequestParam("id") Integer idPlantilla) throws IOException { Plantilla p = plc.findByID(idPlantilla); return p.getText(); } // GET para comprobar si una plantilla esta siendo usada @ResponseBody @GetMapping("/ajax/template/used/{idPlantilla}") public int isTemplateUsed(Model model, Authentication auth, @PathVariable("idPlantilla") Integer idPlantilla) throws IOException { Boolean u = plc.isUsed(idPlantilla); return u ? 1 : 0; } // POST para crear el form de creación de plantilla @PostMapping("/ajax/template/form") public String formTemplate(Model model, Authentication auth, @RequestParam("id") Integer idPlantilla, @RequestParam("action") String action) throws IOException { if(action.equals("new")) { Plantilla p = new Plantilla(); model.addAttribute("editable", true); model.addAttribute("template", p); return "components/form_template"; } else if(action.equals("edit")) { Plantilla p = plc.findByID(idPlantilla); model.addAttribute("editable", false); model.addAttribute("template", p); return "components/form_template"; } else if(action.equals("duplicate")) { Plantilla p = plc.findByID(idPlantilla); p.setVersio(p.getVersio()+1); model.addAttribute("editable", true); model.addAttribute("template", p); return "components/form_template"; } return ""; } // DELETE para eliminar una plantilla concreta @DeleteMapping("/ajax/template/form") @ResponseBody public String formTemplateRemove(Model model, Authentication auth, @RequestParam("id") Integer idPlantilla) throws IOException { if(plc.isUsed(idPlantilla)){ return "0"; } else { Plantilla p = plc.findByID(idPlantilla); plc.delete(p); return "1"; } } // POST para guadar una de las plantillas @ResponseBody @PostMapping("/ajax/template/save") public String templateSave(Model model, Authentication auth, @RequestParam("id") Integer idPlantilla, @RequestParam("action") String action, @RequestParam("text") String text, @RequestParam("codi") String codi, @RequestParam("versio") Integer versio, @RequestParam("nomCas") String nomCas, @RequestParam("nomVal") String nomVal, @RequestParam("ambit") String ambit) throws IOException { if(action.equals("edit")) { Plantilla p = plc.findByID(idPlantilla); p.setNomCas(nomCas); p.setNomVal(nomVal); p.setText(text); p.setAmbit(ambit); plc.save(p); return "1"; } else if(action.equals("duplicate") || action.equals("new")) { Plantilla p = new Plantilla(); Plantilla p2 = plc.findByVersioCodiAmbit(versio, codi, ambit); if(p2 != null) { return "0"; } p.setCodi(codi); p.setVersio(versio); p.setNomCas(nomCas); p.setNomVal(nomVal); p.setText(text); p.setAmbit(ambit); plc.save(p); return "1"; } return "0"; } @ResponseBody @PostMapping("/ajax/draft/save/{id}") public String saveTemplate(Model model, Authentication auth, @PathVariable("id") Integer idPlantilla, @RequestParam("text") String text) throws IOException { Plantilla p = plc.findByID(idPlantilla); p.setText(text); plc.save(p); return "1"; } // POST para añadir un evento al calendario @ResponseBody @PostMapping("/ajax/calendar") public Calendari calendarAddEvent(Model model, Authentication auth, @RequestParam("idProces") Integer idProces, @RequestParam("titulacions") List titulacions, @RequestParam("centres") List centres, @RequestParam("data") String data, @RequestParam("instancia") Optional instancia) throws IOException, ParseException { Date d = new SimpleDateFormat("dd/MM/yyyy").parse(data); String dstr = new SimpleDateFormat("yyyy-MM-dd").format(d); Proces p = this.ps.findByID(idProces); Calendari c = new Calendari(); c.setIdProces(p.getIdProces()); c.setData(d); c.setDataStr(dstr); c.setTitolCas(p.getNomProces() + " " + p.getTitolCas()); c.setTitolVal(p.getNomProces() + " " + p.getTitolVal()); c.setAmbit(p.getAmbit()); c.setTipus(1); c.setColor(p.getAmbit().equals("C") ? "aquamarine" : "dodgerblue"); c.setStatus("P"); if(instancia.isPresent()) { Calendari cold = cs.findById(instancia.get()); c.setCentres(cold.getCentres()); c.setTitulacions(cold.getTitulacions()); } else { c.setCentres(centres.toString()); c.setTitulacions(titulacions.toString()); } c = cs.save(c); return c; } // POST que actualiza el evento ddel calendario @ResponseBody @PostMapping("/ajax/calendar/{id}") public Calendari calendarAddEvent(Model model, Authentication auth, @PathVariable("id") Integer id, @RequestParam("idProces") Integer idProces, @RequestParam("titulacions") List titulacions, @RequestParam("centres") List centres, @RequestParam("data") String data) throws IOException, ParseException { Calendari c = cs.findById(id); Date d = new SimpleDateFormat("dd/MM/yyyy").parse(data); String dstr = new SimpleDateFormat("yyyy-MM-dd").format(d); Proces p = this.ps.findByID(idProces); c.setIdProces(p.getIdProces()); c.setData(d); c.setDataStr(dstr); c.setCentres(centres.toString()); c.setTitulacions(titulacions.toString()); c.setTitolCas(p.getNomProces() + " " + p.getTitolCas()); c.setTitolVal(p.getNomProces() + " " + p.getTitolVal()); c.setAmbit(p.getAmbit()); c.setColor(p.getAmbit().equals("C") ? "aquamarine" : "dodgerblue"); c.setStatus("P"); c = cs.save(c); return c; } // GET que recoge todos los eventos del calendario @ResponseBody @GetMapping("/ajax/calendar") public List calendarGetEvents(Model model, Authentication auth) throws IOException, ParseException { return cs.getAll(); } // DELETE que elimina un evento del calendario @ResponseBody @DeleteMapping("/ajax/calendar") public Integer calendarDeleteEvent(Model model, Authentication auth, @RequestParam("id") Integer id) throws IOException, ParseException { Calendari c = this.cs.findById(id); this.cs.delete(c); return id; } // POST para instanciar un proceso desde el calendario @ResponseBody @PostMapping("/ajax/instantiate") public List instantiate(Model model, Authentication auth, @RequestParam("id") Integer id, @RequestParam("idProces") Integer idProces, @RequestParam("centres") List centres, @RequestParam("titulacions") List titulacions) throws IOException, ParseException { if(!((Usuari)auth.getPrincipal()).isAdmin()) { return null; } Calendari cal = cs.findById(id); if(!cal.getIdProces().equals(idProces) || !cal.getCentres().equals(centres.toString()) || !cal.getTitulacions().equals(titulacions.toString())) { cal.setCentres(centres.toString()); cal.setTitulacions(titulacions.toString()); cal.setIdProces(idProces); cs.save(cal); } List log = new ArrayList(); boolean hasErrors = false; Proces pr = ps.findByID(idProces); if(pr.getAmbit().equals("U")) { // ambit == universitat (U) for(Integer idTitulacio : titulacions) { BigInteger idInstancia = is.instantiateU(idProces, idTitulacio); if(!idInstancia.equals(new BigInteger("0"))) { log.add("[OK] "+idInstancia.toString()+" - "+groupedTitToText(idTitulacio)); InstanciaTasca activa = its.findActiveByInstancia(idInstancia); for(Usuari u : us.getInstanceAsignedUsers(idInstancia)) { Email email = new Email(); email.setUsusari(u); email.setInstanciaTasca(activa); es.addEmail(email); } } else { log.add("[ERROR] "+groupedTitToText(idTitulacio)); hasErrors = true; } } } else if(pr.getAmbit().equals("C")) { // ambit == centre (C) for(Integer idCentre : centres) { Organ c = os.findByID("C", idCentre); for(Integer idTitulacio : titulacions) { BigInteger idInstancia = is.instantiateC(idProces, c.getId().getLugar(), idTitulacio); if(!idInstancia.equals(new BigInteger("0"))) { log.add("[OK] "+idInstancia.toString()+" - "+c.getNomCas() + " -> " + groupedTitToText(idTitulacio)); InstanciaTasca activa = its.findActiveByInstancia(idInstancia); for(Usuari u : us.getInstanceAsignedUsers(idInstancia)) { Email email = new Email(); email.setUsusari(u); email.setInstanciaTasca(activa); es.addEmail(email); } } else { hasErrors = true; log.add("[ERROR] "+c.getNomCas() + " -> " + groupedTitToText(idTitulacio)); } } } } else if(pr.getAmbit().equals("T")) { // ambit == titulacio (T) for(Integer idTitulacio : titulacions) { Organ t = os.findByID("T", idTitulacio); BigInteger idInstancia = is.instantiateT(idProces, t.getId().getLugar()); if(!idInstancia.equals(new BigInteger("0"))) { log.add("[OK] "+idInstancia.toString()+" - "+t.getNomCas()); InstanciaTasca activa = its.findActiveByInstancia(idInstancia); for(Usuari u : us.getInstanceAsignedUsers(idInstancia)) { Email email = new Email(); email.setUsusari(u); email.setInstanciaTasca(activa); es.addEmail(email); } } else { hasErrors = true; log.add("[ERROR] "+idInstancia.toString()+" - "+t.getNomCas()); } } } if(hasErrors) { cal.setStatus("E"); cal.setColor("indianred"); cal.setData(new Date(System.currentTimeMillis())); cs.save(cal); } else { cal.setStatus("F"); cal.setColor("lightgreen"); cal.setData(new Date(System.currentTimeMillis())); cs.save(cal); } return log; } private String groupedTitToText(Integer t) { if(t == 1) { return "Grados"; } else if(t == 2) { return "Masters"; } else if(t == 3) { return "Doctorados"; } else { return "Todas Titulaciones"; } } }