Procházet zdrojové kódy

Merge branch 'reports-integration' of UV-APPS/UV_SAIC_CORE into master

Pablo Gómez před 1 týdnem
rodič
revize
fffb414b00

+ 16 - 20
src/main/java/es/uv/saic/service/AuthProvider.java

@@ -4,6 +4,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.naming.Context;
 import javax.naming.NamingEnumeration;
@@ -46,28 +47,25 @@ public class AuthProvider implements AuthenticationProvider {
         String password = auth.getCredentials().toString(); 
         
         List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
-    	authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
         
         Usuari u = this.us.findByUsername(username);
         
         if(u != null) {
         	u.setGranted(this.urs.isGrantedUser(u));
             u.setAdmin(this.urs.isAdminUser(u));
-            u.setDataTest(this.urs.isDataTestUser(u));
+            // u.setDataTest(this.urs.isDataTestUser(u));
         	boolean vigent = this.us.hasActiveRol(u);
         	
 	        if(!u.getLdap() && vigent) {
 	            if (u.getUsuari().equals(username) && u.getClau().equals(password)) {
 	            	logger.info("Autenticación LOCAL correcta: "+username);
-	            	if(u.isAdmin()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-	            	}
-	            	if(u.isGranted()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
-	            	}
-	            	if(u.isDataTest()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_TESTER"));
-	            	}
+                    
+                    List<Integer> ids = u.getUsuarisRols().stream().map(ur -> ur.getRol().getIdRol()).collect(Collectors.toList());
+
+                    for (String permission : this.urs.getPermisosRoles(ids)) {
+                        authorities.add(new SimpleGrantedAuthority("ROLE_" + permission.toUpperCase()));
+                    }
+
 	            	UsernamePasswordAuthenticationToken authUser = new UsernamePasswordAuthenticationToken(u, password, authorities);
 	            	authUser.setDetails(u);
 	                return authUser ;
@@ -127,15 +125,13 @@ public class AuthProvider implements AuthenticationProvider {
                     logger.info("Autenticación LDAP correcta: " + u.getUsuari());
                     u.setDataUltim(LocalDateTime.now());
                     this.us.save(u);
-	            	if(u.isAdmin()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
-	            	}
-	            	if(u.isGranted()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_MANAGER"));
-	            	}
-	            	if(u.isDataTest()) {
-	            		authorities.add(new SimpleGrantedAuthority("ROLE_TESTER"));
-	            	}
+
+                    List<Integer> ids = u.getUsuarisRols().stream().map(ur -> ur.getRol().getIdRol()).collect(Collectors.toList());
+
+                    for (String permission : this.urs.getPermisosRoles(ids)) {
+                        authorities.add(new SimpleGrantedAuthority("ROLE_" + permission.toUpperCase()));
+                    }
+
 	            	UsernamePasswordAuthenticationToken authUser = new UsernamePasswordAuthenticationToken(u, password, authorities);
 	            	authUser.setDetails(u);
 	                return authUser ;

+ 6 - 0
src/main/java/es/uv/saic/service/InstanciaService.java

@@ -151,6 +151,12 @@ public class InstanciaService {
 			this.instanciaRepository.activateInstantiatedTask(instancia.getIdInstancia());
 		}
 	}
+
+	// Usado por "SAIC_REPORTS"
+	public Instancia findLatestByRuctPrname(Integer ruct, String prname){
+		Instancia i = this.instanciaRepository.findLatestByRuctPrname(ruct, prname);
+		return i;
+	}
 	
 }
 

+ 11 - 11
src/main/java/es/uv/saic/service/InstanciaTascaService.java

@@ -127,16 +127,6 @@ public class InstanciaTascaService {
 		else if(this.usuarisRolService.hasActiveAmbit(u, "C")) {
 			return this.instanciaTascaRepository.isUserAutorizedByAmbitC(u.getUsuari(), idInstanciaTasca) != null;
 		}
-		else {
-			if((this.usuarisRolService.hasActiveRol(u, "u_uq") && 
-					this.instanciaTascaRepository.getReferenceById(idInstanciaTasca).getTasca().getRol().getNomRol().equals("u_uq"))
-				|| (this.usuarisRolService.hasActiveRol(u, "u_admi") && 
-						this.instanciaTascaRepository.getReferenceById(idInstanciaTasca).getTasca().getRol().getNomRol().equals("u_admi"))
-				|| (this.usuarisRolService.hasActiveRol(u, "adeit") && 
-						this.instanciaTascaRepository.getReferenceById(idInstanciaTasca).getTasca().getRol().getNomRol().equals("adeit"))){
-				return true;
-			}
-		}
 		
 		return false; 
 	}
@@ -573,4 +563,14 @@ public class InstanciaTascaService {
 		this.instanciaTascaRepository.save(i);
 		this.instanciaTascaRepository.flush();
 	}
-}
+
+	// Usado por "SAIC_REPORTS"
+	public InstanciaTasca getReportFromInstancia(BigInteger idInstancia) {
+		InstanciaTasca instancia = this.instanciaTascaRepository.getReportFromInstancia(idInstancia);
+		if(instancia == null) {
+			return null;
+		} else {
+			return instancia;
+		}	
+	}
+}

+ 5 - 0
src/main/java/es/uv/saic/service/OrganService.java

@@ -119,4 +119,9 @@ public class OrganService {
 	public String getAmbitByRuct(Integer ruct) {
 		return this.organRepository.getAmbitByRuct(ruct);
 	}
+
+	public List<OrganDTO> findActiveByTambit(String tambit){
+		return this.organRepository.findActiveByTambit(tambit)
+			.stream().map(OrganDTO::new).collect(Collectors.toList());
+	}
 }

+ 2 - 4
src/main/java/es/uv/saic/service/UsuariService.java

@@ -28,8 +28,6 @@ public class UsuariService {
 	public Usuari findByUsername(String usuari) {
 		usuari = usuari.split(",")[0];
 		Usuari u = this.usuariRepository.findByUsername(usuari);
-		u.setAdmin(this.usuarisRolService.isAdminUser(u));
-		u.setGranted(this.usuarisRolService.isGrantedUser(u));
 		return u;
 	}
 	
@@ -43,7 +41,7 @@ public class UsuariService {
 	
 	public List<BigInteger> getActiveInstancies(Usuari usuari){
 		
-		if(usuari.isGranted() || usuarisRolService.findActiveRols(usuari).stream().anyMatch(r -> "adeit".equals(r.getRol().getNomRol()))) {
+		if(usuarisRolService.isAdminUser(usuari) || usuarisRolService.findActiveRols(usuari).stream().anyMatch(r -> "adeit".equals(r.getRol().getNomRol()))) {
 			return this.usuariRepository.findActiveInstanciesGranted(usuari.getUsuari());
 		}
 		else{
@@ -51,6 +49,7 @@ public class UsuariService {
 		}
 	}
 	
+	// TODO: revisar porque puede que no se use
 	public List<BigInteger> getSupervisableProcessos(List<UsuarisRol> usuarisRols){
 		List<BigInteger> a = new ArrayList<BigInteger>();
 		for(UsuarisRol urol : usuarisRols) {
@@ -104,5 +103,4 @@ public class UsuariService {
 		this.usuariRepository.save(u);
 		this.usuariRepository.flush();
 	}
-	
 }

+ 17 - 23
src/main/java/es/uv/saic/service/UsuarisRolService.java

@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import es.uv.saic.shared.domain.Usuari;
 import es.uv.saic.shared.domain.UsuarisRol;
@@ -14,8 +15,14 @@ import es.uv.saic.shared.domain.UsuarisRolRepository;
 @Service
 public class UsuarisRolService {
 
-	@Autowired
+	private final AcreditacioService acreditacioService;
+    @Autowired
 	private UsuarisRolRepository usuarisRolRepository;
+
+
+    UsuarisRolService(AcreditacioService acreditacioService) {
+        this.acreditacioService = acreditacioService;
+    }
 	
 	
 	public List<UsuarisRol> findAll() {
@@ -60,33 +67,18 @@ public class UsuarisRolService {
 	}
 	
 	public boolean isGrantedUser(Usuari usuari) {
-		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_uq") != null || 
-		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
-			return true;
-		}
-		else {
-			return false;
-		}
+		List<Integer> ids = usuari.getUsuarisRols().stream().map(ur -> ur.getRol().getIdRol()).collect(Collectors.toList());
+		return this.usuarisRolRepository.getPermisosRoles(ids).contains("x");
 	}
 	
 	public boolean isGrantedSupervisor(Usuari usuari) {
-		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "adeit") != null ||
-		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "relint") != null ||
-		   this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_supe") != null) {
-			return true;
-		}
-		else {
-			return false;
-		}
+		List<Integer> ids = usuari.getUsuarisRols().stream().map(ur -> ur.getRol().getIdRol()).collect(Collectors.toList());
+		return this.usuarisRolRepository.getPermisosRoles(ids).stream().allMatch("r"::equals);
 	}
 	
 	public boolean isAdminUser(Usuari usuari) {
-		if(this.usuarisRolRepository.findByUsernameActiveRol(usuari, "u_admi") != null) {
-			return true;
-		}
-		else {
-			return false;
-		}
+		List<Integer> ids = usuari.getUsuarisRols().stream().map(ur -> ur.getRol().getIdRol()).collect(Collectors.toList());
+		return this.usuarisRolRepository.getPermisosRoles(ids).contains("admins");
 	}
 	
 	public boolean isDataTestUser(Usuari usuari) {
@@ -172,5 +164,7 @@ public class UsuarisRolService {
 		this.usuarisRolRepository.delete(ur);
 	}
 	
-	
+	public List<String> getPermisosRoles(List<Integer> idRols) {
+		return this.usuarisRolRepository.getPermisosRoles(idRols);
+	}
 }

+ 5 - 1
src/main/java/es/uv/saic/web/CalendarController.java

@@ -9,6 +9,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
+import org.hibernate.annotations.Any;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,6 +33,7 @@ import es.uv.saic.service.InstanciaTascaService;
 import es.uv.saic.service.OrganService;
 import es.uv.saic.service.ProcesService;
 import es.uv.saic.service.UsuariService;
+import es.uv.saic.service.UsuarisRolService;
 
 @RestController
 @RequestMapping("/calendar")
@@ -50,6 +52,8 @@ public class CalendarController {
 	private InstanciaTascaService its;
 	@Autowired
 	private EmailService es;
+	@Autowired
+	private UsuarisRolService urs;
 	
 	// POST para añadir un evento al calendario
 	@ResponseBody
@@ -140,7 +144,7 @@ public class CalendarController {
 			@RequestParam("titulacions") List<Integer> titulacions, @RequestParam String usuari) throws IOException, ParseException {	
 		
         Usuari u = us.findByUsername(usuari);
-        if(!u.isAdmin()) {
+        if(!urs.isAdminUser(u)) {  
 			return null;
 		}
 		

+ 19 - 70
src/main/java/es/uv/saic/web/DashboardController.java

@@ -2,8 +2,6 @@ package es.uv.saic.web;
 
 import java.io.IOException;
 import java.text.CharacterIterator;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.text.StringCharacterIterator;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -16,7 +14,6 @@ import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -27,7 +24,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.core.io.FileSystemResource;
 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;
@@ -38,6 +34,14 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import es.uv.saic.service.CategoriaService;
+import es.uv.saic.service.GraficaService;
+import es.uv.saic.service.InformeService;
+import es.uv.saic.service.InstanciaService;
+import es.uv.saic.service.LinkService;
+import es.uv.saic.service.OrganService;
+import es.uv.saic.service.UsuariService;
+import es.uv.saic.service.UsuarisRolService;
 import es.uv.saic.shared.domain.Categoria;
 import es.uv.saic.shared.domain.CursoValor;
 import es.uv.saic.shared.domain.Document;
@@ -46,7 +50,6 @@ import es.uv.saic.shared.domain.Indicador;
 import es.uv.saic.shared.domain.Informe;
 import es.uv.saic.shared.domain.InformeProcessos;
 import es.uv.saic.shared.domain.Instancia;
-import es.uv.saic.shared.domain.Link;
 import es.uv.saic.shared.domain.Organ;
 import es.uv.saic.shared.domain.Usuari;
 import es.uv.saic.shared.domain.UsuarisRol;
@@ -57,7 +60,6 @@ import es.uv.saic.shared.dto.CategoriaDocumentDTO;
 import es.uv.saic.shared.dto.DimensioInstanciesDTO;
 import es.uv.saic.shared.dto.DocumentDTO;
 import es.uv.saic.shared.dto.DocumentTmpDTO;
-import es.uv.saic.shared.dto.IndicadorDTO;
 import es.uv.saic.shared.dto.IndicadorDTOimp;
 import es.uv.saic.shared.dto.InstanciaDTO;
 import es.uv.saic.shared.dto.InstanciaGanttDTO;
@@ -70,14 +72,6 @@ import es.uv.saic.shared.dto.TreeDTOOrgan;
 import es.uv.saic.shared.dto.UsuarisRolDTO;
 import es.uv.saic.shared.feign.DocumentClient;
 import es.uv.saic.shared.feign.IndicadorClient;
-import es.uv.saic.service.CategoriaService;
-import es.uv.saic.service.GraficaService;
-import es.uv.saic.service.InformeService;
-import es.uv.saic.service.InstanciaService;
-import es.uv.saic.service.LinkService;
-import es.uv.saic.service.OrganService;
-import es.uv.saic.service.UsuariService;
-import es.uv.saic.service.UsuarisRolService;
 
 @RestController
 @RequestMapping("/dashboard")
@@ -87,7 +81,6 @@ public class DashboardController {
 	private OrganService os;
 	@Autowired
 	private UsuarisRolService urs;
-
 	@Autowired
 	private UsuariService us;
 	@Autowired
@@ -109,9 +102,6 @@ public class DashboardController {
 	@Autowired
 	private IndicadorClient ic;
 
-	@Value("${saic.url.public}")
-	private String publicUrl;
-
 	@Value("${saic.data.templates.fileNotFound}")
 	private String fileNotFound;
 	
@@ -125,16 +115,14 @@ public class DashboardController {
 		Usuari u = us.findByUsername(usuari);
 		boolean showCentres = false;
 		
-		if(urs.isGrantedUser(u)){
+		List<UsuarisRol> rols = this.urs.findActiveRols(u);
+
+		if(rols.stream().anyMatch(r -> r.getOrgan().getId().getTlugar().equals("U"))){
 			Organ o = os.findByID("C", 0);
 			model.put("organ", o.getRuct());
 			return model;
-		}		
-		else if(urs.isGrantedSupervisor(u)) {
-			titulacions = os.getTitulacions().stream().filter(o -> o.getOrgan().getId().getLugar() != 99).collect(Collectors.toList());
 		}
-		else {
-			List<UsuarisRol> rols = this.urs.findActiveRols(u);
+		else {	
 			for(UsuarisRol rol : rols) {
 				if(rol.getOrgan().getId().getTlugar().equals("C")) {
 					titulacions.addAll(this.os.findTitulacionsByCentre(Arrays.asList(rol.getOrgan().getId().getLugar())));
@@ -205,7 +193,7 @@ public class DashboardController {
 		List<Categoria> c = cs.findFirstLevel(o.getId().getTlugar());
 		model.put("organ", new OrganDTO(o));
 		model.put("categories", c);		
-		model.put("editable", (u.isAdmin() || (u.isGranted())));
+		model.put("editable", (urs.isAdminUser(u) || (urs.isGrantedUser(u))));
 		model.put("showCentres", false);
 		if(o.getTambit().equals("C") && o.getId().getTlugar().equals("C") && o.getId().getLugar() == 0) {
 			model.put("showCentres", true);
@@ -379,11 +367,14 @@ public class DashboardController {
 			List<Categoria> catChilds = cs.findByPareTambitAndU(c.getIdCategoria(), o.getTambit());
 			for(Categoria cc : catChilds) {
 				Document doc = findByCategoriaOrgan(cc.getIdCategoria(), o.getId().getLugar(), o.getId().getTlugar());
+				if(doc == null){
+					doc = findByCategoriaOrgan(cc.getIdCategoria(), o.getOrgan().getId().getLugar(), o.getOrgan().getId().getTlugar());
+				}
 				if(doc != null) {
 					DocumentDTO docdto = new DocumentDTO(locale.equals("es") ? cc.getNomCas() : cc.getNomVal(), 
 															doc.getIdDocument().toString(),
-															String.format("%td-%<tm-%<tY", doc.getData()) + "(" + this.getSize(doc.getRuta()) + ")"
-														);
+															String.format("%td-%<tm-%<tY", doc.getData()),
+															this.getSize(doc.getRuta()));
 					cat.getChildren().add(docdto);
 				}
 			}
@@ -431,7 +422,6 @@ public class DashboardController {
 		}
 		data.addAll(instancies);
 		
-		//TODO Esto peta
 		Collections.sort(data, new Comparator<InstanciaGanttDTO>() {  
 			@Override  
 			public int compare(InstanciaGanttDTO a, InstanciaGanttDTO b) {  
@@ -567,47 +557,6 @@ public class DashboardController {
 	public List<Indicador> getGraphDataByRuct(@PathVariable Integer ruct) throws ParserConfigurationException {
 		return getGraphDataByRuctTambit(ruct, null);
 	}
-
-	@GetMapping("/links/{ruct}")
-	@ResponseBody
-	public List<Link> getLinks(@PathVariable Integer ruct) {
-		List<Link> links = this.ls.findByRuct(ruct);
-		for(Link l : links){
-			l.setLink(publicUrl+l.getLink());
-		}
-		return this.ls.findByRuct(ruct);
-	}
-
-	@PostMapping("/links/{ruct}")
-	@ResponseBody
-	public Link createLink(@PathVariable Integer ruct, @RequestParam String dataExp) throws ParseException {
-		
-		String token = UUID.randomUUID().toString();
-		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
-		Date date = formatter.parse(dataExp);
-
-		Link l = new Link();
-		l.setRuct(ruct);
-		l.setData(new Date(System.currentTimeMillis()));
-		l.setDataExp(date);
-		l.setToken(token);
-		l.setLink("/shared/"+token);
-		l.setVisites(0);
-		this.ls.save(l);
-
-		return l;
-	}
-
-	@DeleteMapping("/links/{id}")
-	@ResponseBody
-	public Integer deleteLink(@PathVariable Integer id) {
-		Link l = this.ls.findById(id);
-		if(l != null){
-			this.ls.delete(l);
-			return id;
-		}
-		return 0;
-	}
 	
 	// Función encargada de cargar a los managers a partir del centro y titulación
 	public void loadManagers(Model model, Integer centre, Integer titulacio) {
@@ -664,7 +613,7 @@ public class DashboardController {
 	
 	// Función para comprobar si un usario esta permitido para hacer una acción
 	public boolean isSuitable(Organ o, Usuari u) {
-		if(u.isAdmin() || u.isGranted()) {
+		if(urs.isAdminUser(u) || urs.isGrantedUser(u)) {
 			return true;
 		}
 		else if(this.urs.exists(u.getUsuari(), o.getId().getTlugar(), o.getId().getLugar())) {

+ 30 - 0
src/main/java/es/uv/saic/web/InformeController.java

@@ -0,0 +1,30 @@
+package es.uv.saic.web;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import es.uv.saic.service.InformeService;
+import es.uv.saic.shared.domain.Informe;
+
+@RestController
+@RequestMapping("/informe")
+public class InformeController {
+    
+    @Autowired
+    private InformeService is;
+
+    @GetMapping("/grupWeb/{grupWeb}")
+    public List<Informe> findByGrupWeb(@PathVariable String grupWeb) {
+        return is.findByGrupWeb(grupWeb);
+    }
+
+    @GetMapping("/{id}")
+    public Informe findById(@PathVariable String id) {
+        return is.findById(Integer.parseInt(id));
+    }
+}

+ 93 - 0
src/main/java/es/uv/saic/web/LinkController.java

@@ -0,0 +1,93 @@
+package es.uv.saic.web;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import es.uv.saic.service.CategoriaService;
+import es.uv.saic.service.LinkService;
+import es.uv.saic.shared.domain.Link;
+
+@RestController
+@RequestMapping("/links")
+public class LinkController {
+
+    @Autowired
+    private LinkService ls;
+
+    @Autowired
+    private CategoriaService cs;
+
+    @Value("${saic.url.public}")
+	private String publicUrl;
+
+    @GetMapping("/{ruct}")
+	@ResponseBody
+	public List<Link> getLinks(@PathVariable Integer ruct) {
+		List<Link> links = this.ls.findByRuct(ruct);
+		for(Link l : links){
+			l.setLink(publicUrl+l.getLink());
+		}
+		return this.ls.findByRuct(ruct);
+	}
+
+	@PostMapping("/{ruct}")
+	@ResponseBody
+	public Link createLink(@PathVariable Integer ruct, @RequestParam String dataExp) {
+		Link l;
+        try {
+            String token = UUID.randomUUID().toString();
+            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+            Date date = formatter.parse(dataExp);
+
+            l = new Link();
+            l.setRuct(ruct);
+            l.setData(new Date(System.currentTimeMillis()));
+            l.setDataExp(date);
+            l.setToken(token);
+            l.setLink("/shared/"+token);
+            l.setVisites(0);
+            this.ls.save(l);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return null;
+        }
+		return l;
+	}
+
+	@DeleteMapping("/{id}")
+	@ResponseBody
+	public Integer deleteLink(@PathVariable Integer id) {
+		Link l = this.ls.findById(id);
+		if(l != null){
+			this.ls.delete(l);
+			return id;
+		}
+		return 0;
+	}
+
+    @GetMapping("/increase")
+    public void increase(@RequestBody Link link) {
+        this.ls.increase(link);
+    }
+    
+    @GetMapping("/token/{token}")
+    public Link findByToken(@PathVariable String token) {
+        return this.ls.findByToken(token);
+    }
+    
+}

+ 1 - 1
src/main/java/es/uv/saic/web/ManagersController.java

@@ -59,7 +59,7 @@ public class ManagersController {
 		List<OrganDTO> sup_titulacions = new ArrayList<>();
 		List<Organ> centres;
 		List<Organ> titulacions;
-		if(u.isGranted()){
+		if(urs.isGrantedUser(u)){
 			centres = this.ors.getCentres();
 			titulacions = this.ors.getTitulacions();
 		}

+ 6 - 2
src/main/java/es/uv/saic/web/OrganController.java

@@ -73,7 +73,7 @@ public class OrganController {
     /*
      * Endpoint para getTitulacionsByTypeCentre
      */
-    @GetMapping("/titulacions/{centre}/{lugar}")
+    @GetMapping("/titulacions/{centre}/lugar/{lugar}")
     public List<OrganDTO> getTitulacionsByTypeCentre(@PathVariable Integer centre, @PathVariable Integer lugar) {
         return os.getTitulacionsByTypeCentre(centre, lugar).stream()
 			.map(OrganDTO::new)
@@ -85,7 +85,7 @@ public class OrganController {
         return os.exists(tlugar, idTitulacio);
     }
 
-    @GetMapping("/titulacions/{centre}/{tambit}")
+    @GetMapping("/titulacions/{centre}/tambit/{tambit}")
     public List<OrganDTO> getTitulacionsByCentreTambit(@PathVariable Integer centre, @PathVariable String tambit) {
         return os.findActiveTitulacionsByCentreTambit(centre, tambit).stream()
 			.map(OrganDTO::new)
@@ -481,4 +481,8 @@ public class OrganController {
 		return os.getAmbitByRuct(ruct);
 	}
 
+	@GetMapping("/active/tambit/{tambit}")
+	public List<OrganDTO> findActiveByTambit(@PathVariable String tambit) {
+		return os.findActiveByTambit(tambit);
+	}
 }

+ 4 - 2
src/main/java/es/uv/saic/web/ProceduresController.java

@@ -80,6 +80,7 @@ import es.uv.saic.service.RolService;
 import es.uv.saic.service.TascaService;
 import es.uv.saic.service.TipusService;
 import es.uv.saic.service.UsuariService;
+import es.uv.saic.service.UsuarisRolService;
 
 
 @RestController
@@ -111,7 +112,8 @@ public class ProceduresController {
 	private PamMetadadesService pms;
 	@Autowired
 	private PamDocumentsService pds;
-
+	@Autowired
+	private UsuarisRolService urs;
 	@Autowired
 	private DataClient dc;
 
@@ -242,7 +244,7 @@ public class ProceduresController {
 		final Set<Integer> suitable = Set.of(1, 12, 14);
 		
 		boolean newTask = (suitable.contains(it.getTasca().getTipus().getTipus())) && it.getEstat().equals("E") && 
-						   (u.isAdmin() || u.isGranted());
+						   (urs.isAdminUser(u) || urs.isGrantedUser(u));
 		
 		if(suitable.contains(it.getTasca().getTipus().getTipus())) {   // Evidencia iterable
 			String fileName = "";

+ 1 - 1
src/main/java/es/uv/saic/web/SupervisionController.java

@@ -69,7 +69,7 @@ public class SupervisionController {
 		List<DummyDataTransfer> supervisable_orgs = new ArrayList<DummyDataTransfer>();
 		List<DummyDataTransfer> supervisable_cents = new ArrayList<DummyDataTransfer>();
 		
-		if(u.isGranted()){ // Admin o UQ
+		if(urs.isGrantedUser(u)){ // Admin o UQ
 			List<Instancia> i_list = is.findAll();
 			for(Instancia inst : i_list) {
 				DummyDataTransfer p = new DummyDataTransfer();

+ 31 - 2
src/main/java/es/uv/saic/web/TascaController.java

@@ -15,25 +15,37 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import es.uv.saic.shared.domain.DummyDataTransfer;
+import es.uv.saic.shared.domain.Instancia;
 import es.uv.saic.shared.domain.InstanciaTasca;
 import es.uv.saic.shared.dto.EvidenciaBuscadorDTO;
+import es.uv.saic.shared.dto.InstanciaDTO;
 import es.uv.saic.shared.dto.InstanciaTascaDTO;
 import es.uv.saic.shared.dto.NomProcesOrganDTO;
 import es.uv.saic.shared.dto.ProcesDTO;
 import es.uv.saic.shared.dto.TascaDTO;
 import es.uv.saic.shared.dto.TascaInformeTransferDTO;
+import es.uv.saic.service.InstanciaService;
 import es.uv.saic.service.InstanciaTascaService;
 import es.uv.saic.service.TascaService;
 
 
 @RestController
 public class TascaController {
-    @Autowired
-    TascaService ts;
+    private final InformeController informeController;
 
     @Autowired
+    private TascaService ts;
+    
+    @Autowired
     InstanciaTascaService its;
 
+    @Autowired
+    private InstanciaService is;
+
+    TascaController(InformeController informeController) {
+        this.informeController = informeController;
+    }
+
     @GetMapping("/instanciaTasca/{id}")
     public InstanciaTascaDTO findInstanciaTascaById(@PathVariable("id") BigInteger id) {
         return its.findByIdDTO(id);
@@ -92,4 +104,21 @@ public class TascaController {
         return ts.getEvidencesByProcedure(idProces);
     }
     
+    @GetMapping("/instancia/latest/{ruct}/{prname}")
+    public InstanciaDTO findLatestByRuctPrname(@PathVariable Integer ruct, @PathVariable String prname) {
+        Instancia instancia = is.findLatestByRuctPrname(ruct, prname);
+        if (instancia == null) {
+            return null;
+        }
+        return new InstanciaDTO(instancia);
+    }
+
+    @GetMapping("/instanciaTasca/report/{idInstancia}")
+    public InstanciaTascaDTO getReportFromInstancia(@PathVariable BigInteger idInstancia) {
+        InstanciaTasca it = its.getReportFromInstancia(idInstancia);
+        if (it == null) {
+            return null;
+        }
+        return new InstanciaTascaDTO(it);
+    }
 }