Browse Source

Merge branch 'indicador-rework' of UV-APPS/UV_SAIC_DATA into master

Mario Martínez Hernández 1 month ago
parent
commit
6085c57804
25 changed files with 1929 additions and 80 deletions
  1. 35 0
      src/main/java/es/uv/saic/domain/CursoValor.java
  2. 36 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquesta.java
  3. 78 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaPK.java
  4. 29 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaRepository.java
  5. 102 0
      src/main/java/es/uv/saic/domain/Indicador.java
  6. 235 0
      src/main/java/es/uv/saic/domain/IndicadorEnquesta.java
  7. 149 0
      src/main/java/es/uv/saic/domain/IndicadorEnquestaRepository.java
  8. 95 0
      src/main/java/es/uv/saic/domain/IndicadorEnquestaTmpRepository.java
  9. 9 0
      src/main/java/es/uv/saic/dto/IndicadorDTO.java
  10. 54 0
      src/main/java/es/uv/saic/dto/IndicadorDTOimp.java
  11. 40 0
      src/main/java/es/uv/saic/dto/IndicadorEnquestaDTO.java
  12. 15 0
      src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTO.java
  13. 136 0
      src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTOImp.java
  14. 16 0
      src/main/java/es/uv/saic/feign/EmailClient.java
  15. 105 0
      src/main/java/es/uv/saic/feign/OrganClient.java
  16. 0 53
      src/main/java/es/uv/saic/feing/CoreClient.java
  17. 21 13
      src/main/java/es/uv/saic/service/DataService.java
  18. 37 0
      src/main/java/es/uv/saic/service/EvidenciaIndicadorEnquestaService.java
  19. 144 0
      src/main/java/es/uv/saic/service/IndicadorEnquestaService.java
  20. 73 0
      src/main/java/es/uv/saic/service/IndicadorEnquestaTmpService.java
  21. 206 0
      src/main/java/es/uv/saic/service/IndicadorService.java
  22. 1 2
      src/main/java/es/uv/saic/web/DataController.java
  23. 301 0
      src/main/java/es/uv/saic/web/IndicadorController.java
  24. 11 11
      src/main/resources/application-local.properties
  25. 1 1
      src/main/resources/messages_es.properties

+ 35 - 0
src/main/java/es/uv/saic/domain/CursoValor.java

@@ -0,0 +1,35 @@
+package es.uv.saic.domain;
+
+public class CursoValor{
+    private String periodo;
+    private String valor;
+    private Integer curso;
+    
+    public CursoValor(){ }
+    
+    public CursoValor(String periodo, String valor) {
+        this.periodo = periodo;
+        this.valor = valor;
+        this.curso = Integer.parseInt(periodo.split("-")[1]);
+    }
+    
+    public String getPeriodo() {
+        return periodo;
+    }
+    public void setPeriodo(String periodo) {
+        this.periodo = periodo;
+    }
+    public Integer getCurso() {
+        return curso;
+    }
+    public void setValor(Integer curso) {
+        this.curso = curso;
+    }
+    public String getValor() {
+        return valor;
+    }
+    public void setValor(String valor) {
+        this.valor = valor;
+    }
+}
+

+ 36 - 0
src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquesta.java

@@ -0,0 +1,36 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="evidencia_indicador_enquesta")
+@NamedQuery(name="EvidenciaIndicadorEnquesta.findAll", query="SELECT n FROM EvidenciaIndicadorEnquesta n")
+public class EvidenciaIndicadorEnquesta {
+	
+	@EmbeddedId
+	private EvidenciaIndicadorEnquestaPK id;
+	
+	private String media;
+	
+	public EvidenciaIndicadorEnquesta(){}
+
+	public EvidenciaIndicadorEnquestaPK getId() {
+		return id;
+	}
+
+	public void setId(EvidenciaIndicadorEnquestaPK id) {
+		this.id = id;
+	}
+
+	public String getMedia() {
+		return media;
+	}
+
+	public void setMedia(String media) {
+		this.media = media;
+	}	
+
+}

+ 78 - 0
src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaPK.java

@@ -0,0 +1,78 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+
+public class EvidenciaIndicadorEnquestaPK  implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	
+	private String proces;
+	private String evidencia;
+	private String enquesta;
+	private String indicador;
+	
+	public EvidenciaIndicadorEnquestaPK() {}
+
+	public String getProces() {
+		return proces;
+	}
+
+	public void setProces(String proces) {
+		this.proces = proces;
+	}
+
+	public String getEvidencia() {
+		return evidencia;
+	}
+
+	public void setEvidencia(String evidencia) {
+		this.evidencia = evidencia;
+	}
+
+	public String getEnquesta() {
+		return enquesta;
+	}
+
+	public void setEnquesta(String enquesta) {
+		this.enquesta = enquesta;
+	}
+
+	public String getIndicador() {
+		return indicador;
+	}
+
+	public void setIndicador(String indicador) {
+		this.indicador = indicador;
+	}
+	
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof EvidenciaIndicadorEnquestaPK)) {
+			return false;
+		}
+		EvidenciaIndicadorEnquestaPK castOther = (EvidenciaIndicadorEnquestaPK)other;
+		return 
+			this.proces.equals(castOther.proces)
+			&& this.evidencia.equals(castOther.evidencia)
+			&& this.enquesta.equals(castOther.enquesta)
+			&& this.indicador.equals(castOther.indicador);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.proces.hashCode();
+		hash = hash * prime + this.evidencia.hashCode();
+		hash = hash * prime + this.enquesta.hashCode();
+		hash = hash * prime + this.indicador.hashCode();
+		
+		return hash;
+	}
+	
+}

+ 29 - 0
src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaRepository.java

@@ -0,0 +1,29 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import jakarta.transaction.Transactional;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface EvidenciaIndicadorEnquestaRepository extends JpaRepository<EvidenciaIndicadorEnquesta, EvidenciaIndicadorEnquestaPK>  {
+
+	@Query("SELECT a FROM EvidenciaIndicadorEnquesta a")
+	List<EvidenciaIndicadorEnquesta> findAll();
+	
+	@Query(value="SELECT * FROM evidencia_indicador_enquesta WHERE proces = ?1 AND evidencia = ?2 AND enquesta = ?3", nativeQuery=true)
+	List<EvidenciaIndicadorEnquesta> getIndicadors(String proces, String evidencia, String enquesta);
+	
+	@Query(value="SELECT * FROM evidencia_indicador_enquesta WHERE proces = ?1 AND evidencia = ?2", nativeQuery=true)
+	List<EvidenciaIndicadorEnquesta> getByProcesEvidencia(String proces, String evidencia);
+	
+	@Modifying
+	@Transactional
+	@Query(value="DELETE FROM evidencia_indicador_enquesta WHERE proces = ?1 AND evidencia = ?2", nativeQuery=true)
+	void removeByProcesEvidencia(String proces, String evidencia);
+
+}

+ 102 - 0
src/main/java/es/uv/saic/domain/Indicador.java

@@ -0,0 +1,102 @@
+package es.uv.saic.domain;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+import es.uv.saic.dto.IndicadorDTO;
+
+public class Indicador {
+	
+	private String dimension;
+	private String indicador;
+	private String valor;
+	private String ambit;
+	private List<CursoValor> valores;
+	
+	public Indicador() {
+		this.valores = new ArrayList<CursoValor>();
+	}
+
+	public Indicador(IndicadorDTO dto) {
+		this.dimension = dto.getDimensio();
+		this.indicador = dto.getIndicador();
+		this.valor = dto.getValor();
+		this.ambit = dto.getAmbit();
+		this.valores = new ArrayList<CursoValor>();
+	}
+	
+	public Indicador(String dimension, String indicador, String valor) {
+		this.dimension = dimension;
+		this.indicador = indicador;
+		this.valor = valor;
+		this.valores = new ArrayList<CursoValor>();
+	}
+
+	public Indicador(String dimension, String indicador, String valor, String ambit, List<CursoValor> cursoValors) {
+		this.dimension = dimension;
+		this.indicador = indicador;
+		this.valor = valor;
+		this.ambit = ambit;
+		this.valores = cursoValors;
+	}
+
+	public String getDimension() {
+		return dimension;
+	}
+	
+	public void setDimension(String dimension) {
+		this.dimension = dimension;
+	}
+	
+	public String getIndicador() {
+		return indicador;
+	}
+
+	public void setIndicador(String indicador) {
+		this.indicador = indicador;
+	}
+
+	public String getValor() {
+		return valor;
+	}
+
+	public void setValor(String valor) {
+		this.valor = valor;
+	}
+	
+	public String getAmbit() {
+		return ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public List<CursoValor> getValores() {
+		return valores;
+	}
+
+	public void setValores(List<CursoValor> valores) {
+		this.valores = valores;
+	}
+	
+	public void addCursoValor(String curso, String valor) {
+		this.valores.add(new CursoValor(curso, valor));
+	}
+	
+	public void obtenerValor() {
+		this.valor = this.maxCursoValor().getValor().toString();
+	}
+	
+	public CursoValor maxCursoValor() {
+		Optional<CursoValor> v = this.valores.stream().max(Comparator.comparing(CursoValor::getCurso));
+		if(v.isPresent()) {
+			return v.get();
+		}
+		else {
+			return null;
+		}
+	}
+}

+ 235 - 0
src/main/java/es/uv/saic/domain/IndicadorEnquesta.java

@@ -0,0 +1,235 @@
+package es.uv.saic.domain;
+
+import java.time.LocalDateTime;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="indicador_enquesta")
+@NamedQuery(name="IndicadorEnquesta.findAll", query="SELECT n FROM IndicadorEnquesta n")
+public class IndicadorEnquesta {
+ 
+	@Id 
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id", updatable = false, nullable = false)
+	private Integer id;
+	private String valor;
+	private String num;
+	private Integer titulacio;
+	private Integer centre;
+	private Integer curs;
+	private String enquesta;
+	private String indicador;
+	private String ambit;
+	private String tipus;
+	private String estudi;
+	private String cursd;
+	private String cursEnquesta;
+	private String centreOrigen;
+	private String titulacioOrigen;
+	private Integer nenq;
+	private Integer ruct;
+	private LocalDateTime data;
+	
+	public IndicadorEnquesta(){}
+	
+	public Integer getId() {
+		return id;
+	}
+	
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	
+	public Integer getTitulacio() {
+		return titulacio;
+	}
+
+	public void setTitulacio(Integer titulacio) {
+		this.titulacio = titulacio;
+	}
+	
+	public Integer getCentre() {
+		return centre;
+	}
+
+	public void setCentre(Integer centre) {
+		this.centre = centre;
+	}
+
+	public Integer getCurs() {
+		return curs;
+	}
+
+	public void setCurs(Integer curs) {
+		this.curs = curs;
+	}
+
+	public String getEnquesta() {
+		return enquesta;
+	}
+
+	public void setEnquesta(String enquesta) {
+		this.enquesta = enquesta;
+	}
+
+	public String getIndicador() {
+		return indicador;
+	}
+
+	public void setIndicador(String indicador) {
+		this.indicador = indicador;
+	}
+	
+	public String getValor() {
+		return valor;
+	}
+	
+	public void setValor(String valor) {
+		this.valor = valor;
+	}
+	
+	public String getNum() {
+		return num;
+	}
+	
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	public String getAmbit() {
+		return ambit;
+	}
+	
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+	
+	public String getTipus() {
+		return tipus;
+	}
+	
+	public void setTipus(String tipus) {
+		this.tipus = tipus;
+	}
+	
+	public String getEstudi() {
+		return estudi;
+	}
+	
+	public void setEstudi(String estudi) {
+		this.estudi = estudi;
+	}
+	
+	public String getCursd() {
+		return cursd;
+	}
+	
+	public void setCursd(String cursd) {
+		this.cursd = cursd;
+	}
+	
+	public String getCursEnquesta() {
+		return cursEnquesta;
+	}
+
+	public void setCursEnquesta(String cursEnquesta) {
+		this.cursEnquesta = cursEnquesta;
+	}
+
+	public String getCentreOrigen() {
+		return centreOrigen;
+	}
+
+	public void setCentreOrigen(String centreOrigen) {
+		this.centreOrigen = centreOrigen;
+	}
+
+	public String getTitulacioOrigen() {
+		return titulacioOrigen;
+	}
+
+	public void setTitulacioOrigen(String titulacioOrigen) {
+		this.titulacioOrigen = titulacioOrigen;
+	}
+
+	public Integer getNenq() {
+		return nenq;
+	}
+
+	public void setNenq(Integer nenq) {
+		this.nenq = nenq;
+	}
+
+	public Integer getRuct() {
+		return ruct;
+	}
+
+	public void setRuct(Integer ruct) {
+		this.ruct = ruct;
+	}
+
+	public LocalDateTime getData() {
+		return data;
+	}
+
+	public void setData(LocalDateTime data) {
+		this.data = data;
+	}
+	
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof IndicadorEnquesta)) {
+			return false;
+		}
+		IndicadorEnquesta castOther = (IndicadorEnquesta)other;
+		return 
+			this.id.equals(castOther.id) &&
+			this.valor.equals(castOther.valor) &&
+			this.num.equals(castOther.num) &&
+			this.centre.equals(castOther.centre) &&
+			this.titulacio.equals(castOther.titulacio) &&
+			this.curs.equals(castOther.curs) &&
+			this.ambit.equals(castOther.ambit) &&
+			this.enquesta.equals(castOther.enquesta) &&
+			this.indicador.equals(castOther.indicador) &&
+			this.cursd.equals(castOther.cursd) &&
+			this.cursEnquesta.equals(castOther.cursEnquesta) &&
+			this.titulacioOrigen.equals(castOther.titulacioOrigen) &&
+			this.centreOrigen.equals(castOther.centreOrigen) &&
+			this.nenq.equals(castOther.nenq) &&
+			this.ruct.equals(castOther.ruct)&&
+			this.data.equals(castOther.data);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.id.hashCode();
+		hash = hash * prime + this.valor.hashCode();
+		hash = hash * prime + this.num.hashCode();
+		hash = hash * prime + this.centre.hashCode();
+		hash = hash * prime + this.titulacio.hashCode();
+		hash = hash * prime + this.curs.hashCode();
+		hash = hash * prime + this.ambit.hashCode();
+		hash = hash * prime + this.enquesta.hashCode();
+		hash = hash * prime + this.indicador.hashCode();
+		hash = hash * prime + this.cursd.hashCode();
+		hash = hash * prime + this.cursEnquesta.hashCode();
+		hash = hash * prime + this.titulacioOrigen.hashCode();
+		hash = hash * prime + this.centreOrigen.hashCode();
+		hash = hash * prime + this.nenq.hashCode();
+		hash = hash * prime + this.ruct.hashCode();
+		hash = hash * prime + this.data.hashCode();
+		
+		return hash;
+	}
+}

+ 149 - 0
src/main/java/es/uv/saic/domain/IndicadorEnquestaRepository.java

@@ -0,0 +1,149 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import es.uv.saic.dto.IndicadorDTO;
+import es.uv.saic.dto.IndicadorEnquestaValorDTO;
+
+@Repository
+public interface IndicadorEnquestaRepository extends JpaRepository<IndicadorEnquesta, Long> {
+	
+	@Query("SELECT i FROM IndicadorEnquesta i")
+	List<IndicadorEnquesta> findAll();
+	
+	@Query(value="SELECT DISTINCT(CONCAT(enquesta, '_', indicador)) FROM indicador_enquesta ORDER BY 1 ASC", nativeQuery=true)
+	List<String> findTypes();
+	
+	@Query(value="SELECT * FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2 AND ambit = ?3 AND estudi = ?4", nativeQuery=true)
+	List<IndicadorEnquesta> findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi);
+	
+	@Query(value="SELECT * FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2 AND ambit = ?3 AND estudi = ?4 "
+			+ "AND centre = ?5 AND (titulacio = ?6 OR titulacio IN(SELECT lugar_eq FROM organs_equivalents WHERE tlugar = 'T' AND lugar = ?6))", nativeQuery=true)
+	List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi,
+																		 Integer centre, Integer titulacio);
+	
+	@Query(value="SELECT * FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2 AND ambit = ?3 AND estudi = ?4 AND centre = ?5", nativeQuery=true)
+	List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi,
+																		 Integer centre);
+
+	@Query(value="""
+			SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, ei.titulacio
+			FROM indicador_enquesta ei
+			WHERE ei.curs = ?3 AND ei.ambit = 'T' AND ei.centre = ?2
+			AND (ei.ruct = ?1 OR ei.ruct IN(SELECT lugar_eq FROM organs_equivalents WHERE tlugar_eq = 'T' AND tlugar = 'T' AND lugar = ?1))
+			UNION
+			SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, 0 AS titulacio
+			FROM indicador_enquesta ei
+			WHERE ei.curs = ?3 AND ei.ambit = 'C' AND ei.centre = ?2
+			UNION
+			SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, 0 AS titulacio
+			FROM indicador_enquesta ei
+			WHERE ei.curs = ?3 AND ei.ambit = 'U'
+			ORDER BY 7 DESC
+			""", nativeQuery=true)
+	List<IndicadorEnquestaValorDTO> getAllInds(Integer ruct, Integer centre, Integer curs);
+	
+	@Query(value="SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, ei.num, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, ei.titulacio "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'T' AND ei.centre = ?2 "
+			+ "AND (ei.ruct = ?1 OR ei.ruct IN(SELECT lugar_eq FROM organs_equivalents WHERE tlugar_eq = 'T' AND tlugar = 'T' AND lugar = ?1)) "
+			+ "UNION "
+			+ "SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, ei.num, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, 0 AS titulacio  "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'C' AND ei.centre = ?2 AND upper(ei.estudi) IN(?4, 'U') "
+			+ "UNION "
+			+ "SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, ei.num, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd, 0 AS titulacio  "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'U' AND upper(ei.estudi) IN(?4, 'U') "
+			+ "ORDER BY 7 DESC ", nativeQuery=true)
+	List<IndicadorEnquestaValorDTO> getAllIndValsByEstudi(Integer ruct, Integer centre, Integer curs, String estudi);
+	
+	@Query(value="SELECT ei.* "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'T' AND ei.centre = ?2 "
+			+ "AND (ei.titulacio = ?1 OR ei.titulacio IN(SELECT lugar_eq FROM organs_equivalents WHERE tlugar_eq = 'T' AND tlugar = 'T' AND lugar = ?1)) "
+			+ "UNION "
+			+ "SELECT ei.*  "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'C' AND ei.centre = ?2 AND upper(ei.estudi) IN(?4, 'U') "
+			+ "UNION "
+			+ "SELECT ei.*  "
+			+ "FROM indicador_enquesta ei "
+			+ "WHERE ei.curs = ?3 AND upper(ei.ambit) = 'U' AND upper(ei.estudi) IN(?4, 'U') "
+			+ "ORDER BY 7 DESC ", nativeQuery=true)
+	List<IndicadorEnquesta> getAllIndsByEstudi(Integer titulacio, Integer centre, Integer curs, String estudi);
+
+	@Query(value="SELECT * FROM indicador_enquesta WHERE ruct = ?1 AND curs = ?2", nativeQuery=true)
+	List<IndicadorEnquesta> getAllIndsByRuct(Integer ruct, Integer curs);
+		
+	@Query(value="SELECT DISTINCT gr.dimensio, gr.estudi, ie.ambit, gr.ordre, ie.indicador, curs, valor FROM indicador_enquesta ie "
+			+ "		INNER JOIN grafiques gr ON ie.indicador = gr.indicador AND ie.enquesta = gr.enquesta AND LOWER(ie.estudi) = LOWER(gr.estudi) "
+			+ "		WHERE UPPER(ie.ambit) = 'T' AND LOWER(ie.estudi) = LOWER(?3) AND titulacio IN (?1) AND centre = ?2 AND curs > ?4 AND tipus = 'avg' "
+			+ "UNION "
+			+ "SELECT DISTINCT gr.dimensio, gr.estudi, ie.ambit, gr.ordre, ie.indicador, curs, valor FROM indicador_enquesta ie "
+			+ "		INNER JOIN grafiques gr ON ie.indicador = gr.indicador AND ie.enquesta = gr.enquesta AND (LOWER(ie.estudi) = LOWER(gr.estudi) OR LOWER(ie.estudi) = 'u') "
+			+ "		WHERE UPPER(ie.ambit) = 'C' AND (LOWER(ie.estudi) = LOWER(?3) OR LOWER(ie.estudi) = 'u') AND centre = ?2 AND curs > ?4 AND tipus = 'avg' "
+			+ "UNION "
+			+ "SELECT DISTINCT gr.dimensio, gr.estudi, ie.ambit, gr.ordre, ie.indicador, curs, valor FROM indicador_enquesta ie "
+			+ "		INNER JOIN grafiques gr ON ie.indicador = gr.indicador AND ie.enquesta = gr.enquesta AND (LOWER(ie.estudi) = LOWER(gr.estudi) OR LOWER(ie.estudi) = 'u') "
+			+ "		WHERE UPPER(ie.ambit) = 'U' AND (LOWER(ie.estudi) = LOWER(?3) OR LOWER(ie.estudi) = 'u') AND curs > ?4 AND tipus = 'avg' "
+			+ "ORDER BY 1, 2, 3, 4, 5, 6 ", nativeQuery=true)
+	List<IndicadorDTO> getGraphData(List<Integer> titulacions, Integer centre, String estudi, Integer cursMax);
+	
+	@Query(value="SELECT DISTINCT gr.dimensio, gr.estudi, ie.ambit, gr.ordre, ie.indicador, curs, valor FROM indicador_enquesta ie "
+			+ "		INNER JOIN grafiques gr ON ie.indicador = gr.indicador AND ie.enquesta = gr.enquesta AND (LOWER(ie.estudi) = LOWER(gr.estudi) OR LOWER(ie.estudi) = 'u') "
+			+ "		WHERE UPPER(ie.ambit) = 'C' AND (LOWER(ie.estudi) = LOWER(?2) OR LOWER(ie.estudi) = 'u') AND centre = ?1 AND curs > ?3 AND tipus = 'avg' "
+			+ "UNION "
+			+ "SELECT DISTINCT gr.dimensio, gr.estudi, ie.ambit, gr.ordre, ie.indicador, curs, valor FROM indicador_enquesta ie "
+			+ "		INNER JOIN grafiques gr ON ie.indicador = gr.indicador AND ie.enquesta = gr.enquesta AND (LOWER(ie.estudi) = LOWER(gr.estudi) OR LOWER(ie.estudi) = 'u') "
+			+ "		WHERE UPPER(ie.ambit) = 'U' AND (LOWER(ie.estudi) = LOWER(?2) OR LOWER(ie.estudi) = 'u') AND curs > ?3 AND tipus = 'avg' "
+			+ "ORDER BY 1, 2, 3, 4, 5, 6 ", nativeQuery=true)
+	List<IndicadorDTO> getGraphData(Integer centre, String estudi, Integer cursMax);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta WHERE centre IN(111, 121, 641, 642) AND ambit = 'C';", nativeQuery=true)
+	int deleteCentroNoAdscrito();
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta WHERE enquesta = ?1", nativeQuery=true)
+	int deleteByEnquesta(String enquesta);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2", nativeQuery=true)
+	int deleteByEnquestaCurs(String enquesta, Integer curs);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2 AND ambit IN('C', 'U'); "
+			+ "INSERT INTO indicador_enquesta (curs, enquesta, indicador, num, titulacio, valor, centre, ambit, tipus, estudi, cursd) "
+			+ "(SELECT ?2 AS curs, enquesta, indicador, num, titulacio, valor, centre, ambit, tipus, estudi, cursd "
+			+ "FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2-1 AND ambit IN('C', 'U')); "
+			+ "INSERT INTO indicador_enquesta (curs, enquesta, indicador, num, titulacio, valor, centre, ambit, tipus, estudi, cursd) "
+			+ "(SELECT ?2 AS curs, enquesta, indicador, num, titulacio, valor, centre, ambit, tipus, estudi, cursd "
+			+ "FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2-1 AND ambit IN('T') "
+			+ "AND titulacio NOT IN(SELECT DISTINCT(titulacio) FROM indicador_enquesta WHERE enquesta = ?1 AND curs = ?2 AND ambit IN('T')));", nativeQuery=true)
+	int fixBiennials(String enquesta, Integer curs);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="INSERT INTO indicador_enquesta (curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd, valor, centre_origen, titulacio_origen, curs_enquesta, nenq, ruct, data) "
+			+ "SELECT curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd, valor, centre_origen, titulacio_origen, curs_enquesta, nenq, ruct, data "
+			+ "FROM indicador_enquesta_tmp "
+			+ "WHERE enquesta = ?1", nativeQuery=true)
+	int consolidateByEnquesta(String enquesta);
+	
+	// Conseguir el ruct a partir de la idtutulacio
+	@Query(value="SELECT ruct FROM organs WHERE lugar = ?1", nativeQuery=true)
+	Integer getRuctTitulacio(Integer titulacio);
+
+}
+

+ 95 - 0
src/main/java/es/uv/saic/domain/IndicadorEnquestaTmpRepository.java

@@ -0,0 +1,95 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import es.uv.saic.dto.IndicadorEnquestaTmpDup;
+
+@Repository
+public interface IndicadorEnquestaTmpRepository extends JpaRepository<IndicadorEnquestaTmp, Long> {
+	
+	@Query("SELECT i FROM IndicadorEnquestaTmp i")
+	List<IndicadorEnquestaTmp> findAll();
+	
+	@Query(value="SELECT * FROM indicador_enquesta_tmp WHERE enquesta = ?1 AND curs = ?2 AND ambit = ?3 AND estudi = ?4", nativeQuery=true)
+	List<IndicadorEnquestaTmp> findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta_tmp WHERE enquesta = ?1", nativeQuery=true)
+	int deleteByEnquesta(String enquesta);
+	
+	@Transactional
+	@Modifying(clearAutomatically=true, flushAutomatically=true)
+	@Query(value="DELETE FROM indicador_enquesta_tmp WHERE enquesta = ?1 AND curs = ?2 AND ambit = ?3 AND estudi = ?4", nativeQuery=true)
+	int deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi);
+	
+	@Query(value="SELECT curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd FROM indicador_enquesta_tmp "
+			+ "WHERE enquesta = ?1 "
+			+ "GROUP BY curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd "
+			+ "HAVING COUNT(*) > 1", nativeQuery=true)
+	List<IndicadorEnquestaTmpDup> checkDupicates(String enquesta);
+	
+	@Query(value="SELECT COUNT(*) FROM indicador_enquesta_tmp WHERE enquesta = ?1", nativeQuery=true)
+	Integer countByEnquesta(String enquesta);
+	
+	@Query(value="SELECT curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd "
+				+ "FROM indicador_enquesta_tmp WHERE enquesta = ?1 "
+				+ "INTERSECT "
+				+ "SELECT curs, enquesta, indicador, titulacio, centre, ambit, tipus, estudi, cursd "
+				+ "FROM indicador_enquesta WHERE enquesta = ?1", nativeQuery=true)
+	List<IndicadorEnquestaTmpDup> checkIntegrity(String enquesta);
+
+	@Query(nativeQuery=true, value="""
+		WITH deleted AS (
+			DELETE FROM indicador_enquesta
+			WHERE (curs, enquesta, indicador, COALESCE(titulacio, -1), COALESCE(centre, -1), ambit, tipus, estudi, COALESCE(cursd, '')) IN(
+				SELECT curs, enquesta, indicador, COALESCE(titulacio, -1) AS titulacio, COALESCE(centre, -1) AS centre, ambit, 
+					   tipus, estudi, COALESCE(cursd, '') AS cursd 
+				FROM indicador_enquesta_tmp WHERE enquesta = ?1
+				INTERSECT 
+				SELECT curs, enquesta, indicador, COALESCE(titulacio, -1) AS titulacio, COALESCE(centre, -1) AS centre, ambit, 
+					   tipus, estudi, COALESCE(cursd, '') AS cursd  
+				FROM indicador_enquesta WHERE enquesta = ?1) 
+			RETURNING *)
+		SELECT COUNT(*) FROM deleted; """)
+	Integer deleteFromCurrent(String enquesta);
+
+	@Query(nativeQuery=true, value="""
+		WITH deleted AS (
+			DELETE FROM indicador_enquesta_tmp
+			WHERE (curs, enquesta, indicador, COALESCE(titulacio, -1), COALESCE(centre, -1), ambit, tipus, estudi, COALESCE(cursd, '')) IN(
+				SELECT curs, enquesta, indicador, COALESCE(titulacio, -1) AS titulacio, COALESCE(centre, -1) AS centre, ambit, 
+					   tipus, estudi, COALESCE(cursd, '') AS cursd 
+				FROM indicador_enquesta_tmp WHERE enquesta = ?1
+				INTERSECT 
+				SELECT curs, enquesta, indicador, COALESCE(titulacio, -1) AS titulacio, COALESCE(centre, -1) AS centre, ambit, 
+					   tipus, estudi, COALESCE(cursd, '') AS cursd  
+				FROM indicador_enquesta WHERE enquesta = ?1) 
+			RETURNING *)
+		SELECT COUNT(*) FROM deleted; """)
+	Integer deleteFromPending(String enquesta);
+
+	@Query(nativeQuery=true, value="""
+		WITH deleted AS (
+			DELETE FROM
+			indicador_enquesta_tmp AS a
+			USING indicador_enquesta_tmp AS b
+			WHERE
+				a.enquesta = ?1 AND b.enquesta = ?1 AND a.id < b.id
+				AND COALESCE(a.curs, -1) = COALESCE(b.curs, -1) AND COALESCE(a.enquesta, '') = COALESCE(b.enquesta, '') 
+				AND COALESCE(a.indicador, '') = COALESCE(b.indicador, '') AND COALESCE(a.titulacio, -1) = COALESCE(b.titulacio, -1) 
+				AND COALESCE(a.centre, -1) = COALESCE(b.centre, -1) AND COALESCE(a.ambit, '') = COALESCE(b.ambit, '') 
+				AND COALESCE(a.tipus, '') = COALESCE(b.tipus, '') AND COALESCE(a.estudi, '') = COALESCE(b.estudi, '') 
+				AND COALESCE(a.cursd, '') = COALESCE(b.cursd, '')
+			RETURNING *)
+		SELECT COUNT(*) FROM deleted; """)
+	Integer deleteDuplicates(String enquesta);
+
+}
+

+ 9 - 0
src/main/java/es/uv/saic/dto/IndicadorDTO.java

@@ -0,0 +1,9 @@
+package es.uv.saic.dto;
+
+public interface IndicadorDTO {
+	String getDimensio();
+	String getIndicador();
+	String getAmbit();
+	String getCurs();
+	String getValor();
+}

+ 54 - 0
src/main/java/es/uv/saic/dto/IndicadorDTOimp.java

@@ -0,0 +1,54 @@
+package es.uv.saic.dto;
+
+public class IndicadorDTOimp implements IndicadorDTO {
+    
+    private String dimensio;
+    private String indicador;
+    private String ambit;
+    private String curs;
+    private String valor;
+
+    public IndicadorDTOimp() {}
+
+    public IndicadorDTOimp(String dimensio, String indicador, String ambit, String curs, String valor) {
+        this.dimensio = dimensio;
+        this.indicador = indicador;
+        this.ambit = ambit;
+        this.curs = curs;
+        this.valor = valor;
+    }
+
+    public IndicadorDTOimp(IndicadorDTO indicador) {
+        this.dimensio = indicador.getDimensio();
+        this.indicador = indicador.getIndicador();
+        this.ambit = indicador.getAmbit();
+        this.curs = indicador.getCurs();
+        this.valor = indicador.getValor();
+    }
+
+    @Override
+    public String getDimensio() {
+        return dimensio;
+    }
+
+    @Override
+    public String getIndicador() {
+        return indicador;
+    }
+
+    @Override
+    public String getAmbit() {
+        return ambit;
+    }
+
+    @Override
+    public String getCurs() {
+        return curs;
+    }
+
+    @Override
+    public String getValor() {
+        return valor;
+    }
+    
+}

+ 40 - 0
src/main/java/es/uv/saic/dto/IndicadorEnquestaDTO.java

@@ -0,0 +1,40 @@
+package es.uv.saic.dto;
+
+public class IndicadorEnquestaDTO {
+    private Integer idTitulacio;
+    private Integer idCentre;
+    private Integer curs;
+
+    public IndicadorEnquestaDTO() {
+    }
+
+    public IndicadorEnquestaDTO(Integer idTitulacio, Integer idCentre, Integer curs) {
+        this.idTitulacio = idTitulacio;
+        this.idCentre = idCentre;
+        this.curs = curs;
+    }
+
+    public Integer getIdTitulacio() {
+        return idTitulacio;
+    }
+
+    public Integer getIdCentre() {
+        return idCentre;
+    }
+
+    public Integer getCurs() {
+        return curs;
+    }
+
+    public void setIdTitulacio(Integer idTitulacio) {
+        this.idTitulacio = idTitulacio;
+    }
+
+    public void setIdCentre(Integer idCentre) {
+        this.idCentre = idCentre;
+    }
+
+    public void setCurs(Integer curs) {
+        this.curs = curs;
+    }
+}

+ 15 - 0
src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTO.java

@@ -0,0 +1,15 @@
+package es.uv.saic.dto;
+
+public interface IndicadorEnquestaValorDTO {
+	String getEnquesta();
+	String getIndicador();
+	String getValor();
+	String getNum();
+	String getAmbit();
+	String getTipus();
+	String getMin();
+	String getMax();
+	Integer getCurs();
+	String getCursd();
+	String getMedia();
+}

+ 136 - 0
src/main/java/es/uv/saic/dto/IndicadorEnquestaValorDTOImp.java

@@ -0,0 +1,136 @@
+package es.uv.saic.dto;
+
+public class IndicadorEnquestaValorDTOImp implements IndicadorEnquestaValorDTO {
+    private String enquesta;
+    private String indicador;
+    private String valor;
+    private String num;
+    private String ambit;
+    private String tipus;
+    private String min;
+    private String max;
+    private Integer curs;
+    private String cursd;
+    private String media;
+
+    public IndicadorEnquestaValorDTOImp() {
+    }
+
+    public IndicadorEnquestaValorDTOImp(String enquesta, String indicador, String valor, String num, String ambit,
+            String tipus, String min, String max, Integer curs, String cursd, String media) {
+        this.enquesta = enquesta;
+        this.indicador = indicador;
+        this.valor = valor;
+        this.num = num;
+        this.ambit = ambit;
+        this.tipus = tipus;
+        this.min = min;
+        this.max = max;
+        this.curs = curs;
+        this.cursd = cursd;
+        this.media = media;
+    }
+
+    public IndicadorEnquestaValorDTOImp(IndicadorEnquestaValorDTO dto) {
+        this.enquesta = dto.getEnquesta();
+        this.indicador = dto.getIndicador();
+        this.valor = dto.getValor();
+        this.num = dto.getNum();
+        this.ambit = dto.getAmbit();
+        this.tipus = dto.getTipus();
+        this.min = dto.getMin();
+        this.max = dto.getMax();
+        this.curs = dto.getCurs();
+        this.cursd = dto.getCursd();
+        this.media = dto.getMedia();
+    }
+
+    public String getEnquesta() {
+        return enquesta;
+    }
+
+    public void setEnquesta(String enquesta) {
+        this.enquesta = enquesta;
+    }
+
+    public String getIndicador() {
+        return indicador;
+    }
+
+    public void setIndicador(String indicador) {
+        this.indicador = indicador;
+    }
+
+    public String getValor() {
+        return valor;
+    }
+
+    public void setValor(String valor) {
+        this.valor = valor;
+    }
+
+    public String getNum() {
+        return num;
+    }
+
+    public void setNum(String num) {
+        this.num = num;
+    }
+
+    public String getAmbit() {
+        return ambit;
+    }
+
+    public void setAmbit(String ambit) {
+        this.ambit = ambit;
+    }
+
+    public String getTipus() {
+        return tipus;
+    }
+
+    public void setTipus(String tipus) {
+        this.tipus = tipus;
+    }
+
+    public String getMin() {
+        return min;
+    }
+
+    public void setMin(String min) {
+        this.min = min;
+    }
+
+    public String getMax() {
+        return max;
+    }
+
+    public void setMax(String max) {
+        this.max = max;
+    }
+
+    public Integer getCurs() {
+        return curs;
+    }
+
+    public void setCurs(Integer curs) {
+        this.curs = curs;
+    }
+
+    public String getCursd() {
+        return cursd;
+    }
+
+    public void setCursd(String cursd) {
+        this.cursd = cursd;
+    }
+
+    public String getMedia() {
+        return media;
+    }
+
+    public void setMedia(String media) {
+        this.media = media;
+    }
+
+}

+ 16 - 0
src/main/java/es/uv/saic/feign/EmailClient.java

@@ -0,0 +1,16 @@
+package es.uv.saic.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import es.uv.saic.dto.EmailDTO;
+
+@FeignClient(name = "saic-core-service", contextId = "email-controller")
+public interface EmailClient {
+    @PostMapping("/email/send")
+	public void sendEmail(@RequestBody EmailDTO email);
+
+    @PostMapping("/email/add")
+    public void addEmail(@RequestBody EmailDTO email);
+}

+ 105 - 0
src/main/java/es/uv/saic/feign/OrganClient.java

@@ -0,0 +1,105 @@
+package es.uv.saic.feign;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+import org.springframework.cloud.openfeign.FeignClient;
+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.RequestParam;
+
+import es.uv.saic.domain.IndicadorEnquesta;
+import es.uv.saic.domain.Usuari;
+import es.uv.saic.dto.OrganDTO;
+
+@FeignClient(name = "saic-core-service", contextId = "organ-controller")
+public interface OrganClient {
+    @GetMapping("/organ")
+    List<OrganDTO> getCentres();
+
+    @GetMapping("/organ/{ruct}")
+    public OrganDTO getOrgByRuct(@PathVariable Integer ruct);
+
+    @GetMapping("/organ/active")
+    List<OrganDTO> getActiveCentres();
+
+    @GetMapping("/organs/exist/{tlugar}/{idTitulacio}")
+    public boolean existsOrg(@PathVariable String tlugar,  @PathVariable Integer idTitulacio);
+
+    @GetMapping("/organ/titulacions")
+    public List<OrganDTO> getTitulacionsWithCentre();
+    
+    @GetMapping("/organ/indicadors/{ruct}/{curs}")
+    public List<IndicadorEnquesta> getAllIndsByRuct(@PathVariable Integer ruct, @PathVariable Integer curs);
+
+    @GetMapping("/organ/find/{tlugar}/{idTitulacio}")
+    public OrganDTO findByID(@PathVariable String tlugar,  @PathVariable Integer idTitulacio);
+
+    @GetMapping("/organ/supervisor")
+    public List<OrganDTO> getTitulacionsSupervisor();
+     
+    @GetMapping("/organ/titulacions/{centre}")
+    public List<OrganDTO> getTitulacionsByCentre(@PathVariable Integer centre);
+
+    @PostMapping("/organ/usuari")
+    public List<OrganDTO> findOrgansByUsuari(@RequestBody Usuari usuari);
+
+    @GetMapping("/organ/findByRuct/{ruct}")
+    public OrganDTO findByRuct(@PathVariable Integer ruct);
+
+    @PostMapping("/organ/titulacions/usuari")
+	public HashMap<String, Object> getTitulationsByCenter(@RequestParam(name="centers[]", required=false) List<Integer> centres,
+        @RequestParam String usuari ) throws IOException;
+
+    @PostMapping("/organ/titulacions/managers")
+	public HashMap<String, Object> getCenterTitulations(@RequestParam("center") Integer centre);
+
+    @PostMapping("/organ/titulacions/calendar")
+	public HashMap<String, Object> getTitulationsByCenters(@RequestParam("centers[]") List<Integer> centres, @RequestParam("procedure") Integer idProces);
+
+    @PostMapping("/organ/titulacions/admin")
+	public HashMap<String, Object> getTitulationsByCenter(@RequestParam("center") Integer centre, @RequestParam("procedure") Integer idProces);
+
+    @PostMapping("/organ/titulacions")
+	public HashMap<String, Object> getAllTitulationsByCenter(@RequestParam("center") Integer centre);
+
+    @PostMapping("/organ/centres")
+	public HashMap<String, Object> getAllCentresByAmbit(@RequestParam("procedure") Integer idProces);
+
+    @PostMapping("/organ/equivalents")
+	public List<Integer> getEquivalents(@RequestParam Integer lugar, @RequestParam String tlugar);
+
+    @PostMapping("/organs/new/centre")
+    public void createNewCentre(@RequestParam("codiCentro") Integer codigo,
+            @RequestParam("nomCasCentro") String nomCas,
+            @RequestParam("nomValCentro") String nomVal,
+            @RequestParam("ructCentro") Integer ruct);
+
+    @PostMapping("/organs/new/titulacion")
+    public void createNewTitulacion(@RequestParam("codiTit") Integer codigo,
+            @RequestParam("centre") Integer idCentro,
+            @RequestParam("nomCasTit") String nomCas,
+            @RequestParam("nomValTit") String nomVal,
+            @RequestParam("ructTit") Integer ruct,
+            @RequestParam("tambit") String ambit);
+    
+    @PostMapping("organs/update/centre")
+	public void updateCentre(@RequestParam("lugar") Integer lugar,
+			@RequestParam("tlugar") String tlugar,
+			@RequestParam("nomCasTit") String nomCas,
+			@RequestParam("nomValTit") String nomVal,
+			@RequestParam("ructTit") Integer ruct);
+
+    @PostMapping("organs/update/titulacion")
+	public void updateTitulacion(@RequestParam("lugar") Integer lugar,
+			@RequestParam("tlugar") String tlugar,
+			@RequestParam("nomCasTit") String nomCas,
+			@RequestParam("nomValTit") String nomVal,
+			@RequestParam("ructTit") Integer ruct,
+		    @RequestParam("centre") Integer idCentro,
+			@RequestParam("tambit") String ambit);  
+}
+

+ 0 - 53
src/main/java/es/uv/saic/feing/CoreClient.java

@@ -1,53 +0,0 @@
-package es.uv.saic.feing;
-
-import java.util.List;
-
-import org.springframework.cloud.openfeign.FeignClient;
-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.RequestParam;
-
-import es.uv.saic.domain.IndicadorEnquestaTmp;
-import es.uv.saic.dto.EmailDTO;
-import es.uv.saic.dto.IndicadorEnquestaTmpDup;
-import es.uv.saic.dto.OrganDTO;
-
-@FeignClient(name = "saic-core-service")
-public interface CoreClient {
-    
-    @GetMapping("/organs/{ruct}")
-    public OrganDTO getOrgByRuct(@PathVariable Integer ruct);
-    
-    @GetMapping("/organs/exist/{tlugar}/{idTitulacio}")
-    public boolean existsOrg(@PathVariable String tlugar,  @PathVariable Integer idTitulacio);
-
-    @DeleteMapping("/indicadorEnquesta/{enquesta}")
-    public Integer deleteByEnquestaC(@PathVariable String enquesta);
-
-    @PostMapping("/save")
-    public void save(@RequestBody IndicadorEnquestaTmp ie);
-
-    @GetMapping("/indicadorEnquesta/checkDuplicates/{enquesta}")
-    public List<IndicadorEnquestaTmpDup> checkDuplicates(@PathVariable String enquesta);
-
-    @DeleteMapping("/indicadorEnquesta/current/{enquesta}")
-    public Integer deleteFromCurrent(@PathVariable String enquesta);
-    
-    @DeleteMapping("/indicadorEnquesta/pending/{enquesta}")
-    public Integer deleteFromPending(@PathVariable String enquesta);
-
-    @GetMapping("/indicadorEnquesta/checkIntegrity/{enquesta}")
-    public List<IndicadorEnquestaTmpDup> checkIntegrity(@PathVariable String enquesta);
-
-    @GetMapping("/indicadorEnquesta/consolidate/{enquesta}")
-    public Integer consolidateByEnquesta(@PathVariable String enquesta);
-
-    @GetMapping("/indicadorEnquesta/count/{enquesta}")
-    public Integer countByEnquesta(@RequestParam String enquesta);
-
-    @PostMapping("/sendEmail")
-    public void sendEmail(@RequestBody EmailDTO email);
-}

+ 21 - 13
src/main/java/es/uv/saic/service/DataService.java

@@ -33,7 +33,8 @@ import es.uv.saic.domain.Usuari;
 import es.uv.saic.dto.EmailDTO;
 import es.uv.saic.dto.IndicadorEnquestaTmpDup;
 import es.uv.saic.dto.OrganDTO;
-import es.uv.saic.feing.CoreClient;
+import es.uv.saic.feign.EmailClient;
+import es.uv.saic.feign.OrganClient;
 import jakarta.mail.MessagingException;
 
 
@@ -44,9 +45,16 @@ public class DataService {
 	private DatasourceService dss;
 	@Autowired
 	private UsuariService us;
+	@Autowired
+	private IndicadorEnquestaService ies;
+	@Autowired
+	private IndicadorEnquestaTmpService iets;
+
+	@Autowired
+	private OrganClient oc;
 
 	@Autowired
-	private CoreClient cc;
+	private EmailClient ec;
 	
 	private HashMap<String, String> titsMap;
 	private HashMap<String, String> centresMap;
@@ -374,7 +382,7 @@ public class DataService {
 			return -1;
 		}
 		else {
-			Integer i = cc.consolidateByEnquesta(enquesta);
+			Integer i = ies.consolidateByEnquesta(enquesta);
 			deleteByEnquesta(enquesta);
 			return i;
 		}
@@ -385,15 +393,15 @@ public class DataService {
 	}
 
 	public List<IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
-		return cc.checkIntegrity(enquesta);
+		return iets.checkIntegrity(enquesta);
 	}
 
 	public Integer deleteFromCurrent(String enquesta){
-		return cc.deleteFromCurrent(enquesta);
+		return iets.deleteFromCurrent(enquesta);
 	}
 
 	public Integer deleteFromPending(String enquesta){
-		return cc.deleteFromPending(enquesta);
+		return iets.deleteFromPending(enquesta);
 	}
 
 	private void setColumnsCod(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
@@ -525,32 +533,32 @@ public class DataService {
 	}
 
 	private OrganDTO findOrgByRuct(Integer ruct) {
-		return cc.getOrgByRuct(ruct);
+		return oc.getOrgByRuct(ruct);
 	}
 
 	private boolean existsOrg(String tlugar, Integer titulacio) {
-		return cc.existsOrg(tlugar, titulacio);
+		return oc.existsOrg(tlugar, titulacio);
 	}
 
 	private void deleteByEnquesta(String enquesta) {
-		cc.deleteByEnquestaC(enquesta);
+		iets.deleteByEnquesta(enquesta);
 	}
 
 	private void save(IndicadorEnquestaTmp ie) {
-		cc.save(ie);
+		iets.save(ie);
 	}
 
 	private List<IndicadorEnquestaTmpDup> checkDuplicatesAux(String enquesta) {
-		return cc.checkDuplicates(enquesta);
+		return iets.checkDuplicates(enquesta);
 	}
 
 
 	private Integer countByEnquestaAux(String enquesta) {
-		return cc.countByEnquesta(enquesta);
+		return iets.countByEnquesta(enquesta);
 	}
 
 	private void sendMail(String string, String string2, String string3) {
 		EmailDTO email = new EmailDTO(string, string2, string3);
-		cc.sendEmail(email);
+		ec.sendEmail(email);
 	}
 }

+ 37 - 0
src/main/java/es/uv/saic/service/EvidenciaIndicadorEnquestaService.java

@@ -0,0 +1,37 @@
+package es.uv.saic.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import es.uv.saic.domain.EvidenciaIndicadorEnquesta;
+import es.uv.saic.domain.EvidenciaIndicadorEnquestaRepository;
+
+@Service
+public class EvidenciaIndicadorEnquestaService {
+
+	@Autowired
+	private EvidenciaIndicadorEnquestaRepository eies;
+	
+	public List<EvidenciaIndicadorEnquesta> getIndicadors(String proces, String evidencia, String enquesta){
+		return this.eies.getIndicadors(proces, evidencia, enquesta);
+	}
+	
+	public List<EvidenciaIndicadorEnquesta> getByProcesEvidencia(String proces, String evidencia){
+		return this.eies.getByProcesEvidencia(proces, evidencia);
+	}
+	
+	public List<EvidenciaIndicadorEnquesta> getAll(){
+		return this.eies.findAll();
+	}
+	
+	public void removeByProcesEvidencia(String proces, String evidencia) {
+		this.eies.removeByProcesEvidencia(proces, evidencia);
+	}
+	
+	public void save(EvidenciaIndicadorEnquesta a) {
+		this.eies.save(a);
+		this.eies.flush();
+	}
+}

+ 144 - 0
src/main/java/es/uv/saic/service/IndicadorEnquestaService.java

@@ -0,0 +1,144 @@
+package es.uv.saic.service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import es.uv.saic.domain.EvidenciaIndicadorEnquesta;
+import es.uv.saic.domain.EvidenciaIndicadorEnquestaRepository;
+import es.uv.saic.domain.IndicadorEnquesta;
+import es.uv.saic.domain.IndicadorEnquestaRepository;
+import es.uv.saic.domain.Organ;
+import es.uv.saic.dto.IndicadorDTO;
+import es.uv.saic.dto.IndicadorEnquestaValorDTO;
+import es.uv.saic.dto.OrganDTO;
+
+@Service
+public class IndicadorEnquestaService {
+
+	@Autowired
+	private IndicadorEnquestaRepository r;
+	@Autowired
+	private EvidenciaIndicadorEnquestaRepository rie;
+	
+	
+	public List<IndicadorEnquesta> findAll() {
+		return this.r.findAll();
+	}
+	
+	public List<String> findTypes(){
+		return this.r.findTypes();
+	}
+	
+	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) {
+		return this.r.findByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
+	}
+	
+	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) {
+		return this.r.findByEnquestaCursAmbitEstudiCentre(enquesta, curs, ambit, estudi, centre);
+	}
+	
+	public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) {
+		return this.r.findByEnquestaCursAmbitEstudiCentreTitulacio(enquesta, curs, ambit, estudi, centre, titulacio);
+	}
+	
+	public List<IndicadorEnquestaValorDTO> getAllInds(Integer titulacio, Integer centre, Integer curs, Integer ruct) {
+		//String estudi = titulacio < 2000 ? "G" : "M";
+		//estudi = titulacio == 2 ? "M" : estudi;
+		
+		String estudi = "G";
+		/*  TODO replace with tambit  */
+		if(titulacio == 1) {
+			estudi = "G";
+		}
+		else if(titulacio == 2) {
+			estudi = "M";
+		}
+		else if(titulacio >= 1000 & titulacio < 2000) {
+			estudi = "G";
+		}
+		else if(titulacio >= 2000 & titulacio < 3000) {
+			estudi = "M";
+		}
+		else if(titulacio >= 3000) {
+			estudi = "D";
+		}	
+
+		if(titulacio == 0) {
+			return  Stream.concat(this.r.getAllIndValsByEstudi(ruct, centre, curs, "G").stream(), 
+					              this.r.getAllIndValsByEstudi(ruct, centre, curs, "M").stream())
+                    .collect(Collectors.toList());
+		}
+		return this.r.getAllIndValsByEstudi(ruct, centre, curs, estudi);
+	}
+	
+	public List<IndicadorEnquesta> getAllInds(Organ o, Integer curs){
+		return this.r.getAllIndsByEstudi(o.getId().getLugar(), o.getOrgan().getId().getLugar(), curs, o.getTambit());
+	}
+
+	public List<IndicadorEnquesta> getAllInds(OrganDTO o, Integer curs){
+		return this.r.getAllIndsByEstudi(o.getLugar(), o.getLugar2(), curs, o.getTambit());
+	}
+
+	public List<IndicadorEnquesta> getAllIndsByRuct(Integer ruct, Integer curs){
+		return this.r.getAllIndsByRuct(ruct, curs);
+	}
+			
+	public List<IndicadorDTO> getGraphData(List<Integer> titulacions, Integer centre, String estudi, Integer cursMax) {
+		return this.r.getGraphData(titulacions, centre, estudi, cursMax);
+	}
+	
+	public List<IndicadorDTO> getGraphData(Integer centre, String estudi, Integer cursMax) {
+		return this.r.getGraphData(centre, estudi, cursMax);
+	}
+		
+	public boolean contains(String evidencia, String proces, String enquesta) {
+		List<EvidenciaIndicadorEnquesta> inds = this.rie.getIndicadors(proces, evidencia, enquesta);
+		if(inds.size() > 0) {
+			return true;
+		}
+		return false;
+	}
+	
+	public int deleteCentroNoAdscrito() {
+		return this.r.deleteCentroNoAdscrito();
+	}
+	
+	public int deleteByEnquesta(String enquesta) {
+		return this.r.deleteByEnquesta(enquesta);
+	}
+	
+	public int deleteByEnquestaCurs(String enquesta, Integer curs) {
+		return this.r.deleteByEnquestaCurs(enquesta, curs);
+	}
+	
+	public int fixBiennials(String enquesta, Integer curs) {
+		return this.r.fixBiennials(enquesta, curs);
+	}
+	
+	public Integer consolidateByEnquesta(String enquesta) {
+		return this.r.consolidateByEnquesta(enquesta);
+	}
+	
+	public void deleteAll() {
+		this.r.deleteAll();
+		this.r.flush();
+	}
+	
+	public void save(IndicadorEnquesta x) {
+		this.r.save(x);
+		this.r.flush();
+	}
+	
+	public void saveAll(List<IndicadorEnquesta> l) {
+		this.r.saveAll(l);
+		this.r.flush();
+	}
+	
+	public Integer getRuctTitulacio(Integer titulacio) {
+		return this.r.getRuctTitulacio(titulacio);
+	}
+}

+ 73 - 0
src/main/java/es/uv/saic/service/IndicadorEnquestaTmpService.java

@@ -0,0 +1,73 @@
+package es.uv.saic.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import es.uv.saic.domain.IndicadorEnquestaTmp;
+import es.uv.saic.domain.IndicadorEnquestaTmpRepository;
+import es.uv.saic.dto.IndicadorEnquestaTmpDup;
+
+@Service
+public class IndicadorEnquestaTmpService {
+
+	@Autowired
+	private IndicadorEnquestaTmpRepository r;
+	
+	public List<IndicadorEnquestaTmp> findAll() {
+		return this.r.findAll();
+	}
+	
+	public List<IndicadorEnquestaTmp> findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) {
+		return this.r.findByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
+	}
+	
+	public int deleteByEnquesta(String enquesta) {
+		return this.r.deleteByEnquesta(enquesta);
+	}
+	
+	public int deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) {
+		return this.r.deleteByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
+	}
+	
+	public List<IndicadorEnquestaTmpDup> checkDuplicates(String enquesta){
+		return this.r.checkDupicates(enquesta);
+	}
+
+	public Integer deleteFromCurrent(String enquesta){
+		return this.r.deleteFromCurrent(enquesta);
+	}
+
+	public Integer deleteFromPending(String enquesta){
+		return this.r.deleteFromPending(enquesta);
+	}
+
+	public Integer deleteDuplicates(String enquesta){
+		return this.r.deleteDuplicates(enquesta);
+	}
+	
+	public Integer countByEnquesta(String enquesta) {
+		return this.r.countByEnquesta(enquesta);
+	}
+	
+	public List<IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
+		return this.r.checkIntegrity(enquesta);
+	}
+	
+	public void deleteAll() {
+		this.r.deleteAll();
+		this.r.flush();
+	}
+	
+	public void save(IndicadorEnquestaTmp x) {
+		this.r.save(x);
+		this.r.flush();
+	}
+	
+	public void saveAll(List<IndicadorEnquestaTmp> l) {
+		this.r.saveAll(l);
+		this.r.flush();
+	}
+	
+}

+ 206 - 0
src/main/java/es/uv/saic/service/IndicadorService.java

@@ -0,0 +1,206 @@
+package es.uv.saic.service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import es.uv.saic.domain.Indicador;
+import es.uv.saic.feign.OrganClient;
+
+@Service
+public class IndicadorService {
+	
+	@Autowired
+	private OrganClient oc;
+	
+	public IndicadorService() {}
+
+	public List<Indicador> getFromTitulacion(Integer tit, Integer curs) throws ParserConfigurationException, MalformedURLException, IOException, SAXException {
+	    DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
+	    f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+	    f.setNamespaceAware(false);
+	    f.setValidating(false);
+	    DocumentBuilder build = f.newDocumentBuilder();
+	    
+	    List<Integer> tits = this.oc.getEquivalents(tit, "T");
+	    tits.add(tit);
+	    //Collections.sort(tits).reverse(); 
+	    	    
+	    String periodo = Integer.toString(curs-1)+"-"+Integer.toString(curs);
+	    String periodoAnt = Integer.toString(curs-2)+"-"+Integer.toString(curs-1);
+	    List<Indicador> indicadores = new ArrayList<Indicador>();
+	    boolean hasCurs = false;
+	    int xtits = 0, xurls = 0;
+	    List<String> urls = Arrays.asList(new String[]{"http://bancuv.uv.es/wwwuv/stuff/web/siga/SGIC", "http://bancuv.uv.es/wwwuv/stuff/web/siga/previo/SGIC"});
+	    //List<String> urls = Arrays.asList(new String[]{"http://bancuv.uv.es/wwwuv/stuff/web/siga/SGIC"});
+	    
+	    while(!hasCurs && xtits < tits.size() && xurls < urls.size()) {
+	    	String url = urls.get(xurls)+tits.get(xtits)+".xml";
+	    	String resText = "";
+	    	try {
+	    		URLConnection urlConnection = new URI(url).toURL().openConnection();
+	    		urlConnection.addRequestProperty("Accept", "application/xml");
+	    		InputStream res = urlConnection.getInputStream();
+	    		resText = new String(res.readAllBytes(), StandardCharsets.UTF_8);
+	    	}
+	    	catch(Exception e){
+	    		resText = "";
+	    	}
+
+		    if(!resText.contains("curso=\""+periodo+"\"")) {  // not contains data from selected year
+		    	xtits+=1;
+		    	if(xtits > tits.size()-1 && xurls < urls.size()-1) {
+		    		xtits=0;
+		    		xurls+=1;
+		    	}
+		    }
+		    else {
+		    	hasCurs = true;
+		    	indicadores = this.extract(build, periodo, periodoAnt, resText);
+		    }
+	    }	
+	    return indicadores;
+	}
+	
+	private List<Indicador> extract(DocumentBuilder build, String periodo, String periodoAnt, String resText) throws SAXException, IOException {
+    	Document doc = build.parse(new InputSource(new StringReader(resText)));
+	    doc.getDocumentElement().normalize();
+	    NodeList nodedim = doc.getElementsByTagName("Dimension");
+	    List<Indicador> indicadores = new ArrayList<Indicador>();
+    
+	    for(int i = 0; i < nodedim.getLength(); i++) { // each dim
+	    	Element a = (Element)nodedim.item(i);
+	    	NodeList nodeind = a.getElementsByTagName("indicador");
+	    	for(int j = 0; j < nodeind.getLength(); j++) { // each ind
+	    		Element b = (Element)nodeind.item(j);
+	    		NodeList nodesub = b.getElementsByTagName("subindicador");
+	    		if(nodesub.getLength() > 0) { // has subind
+	    			for(int k = 0; k < nodesub.getLength(); k++) { // each subind
+	    				Element c = (Element)nodesub.item(k);
+	    				NodeList nodevals = c.getElementsByTagName("cursoAcademico");
+	    				Indicador ind = new Indicador(a.getAttribute("codigo"), c.getAttribute("codigo"), "");
+				    	for(int z = 0; z < nodevals.getLength(); z++) { // each val
+				    		Element d = (Element)nodevals.item(z);
+				    		if(d.getAttribute("curso").equals(periodo)) {
+				    			ind.setValor(d.getAttribute("valor"));
+				    		}
+				    		else if((c.getAttribute("codigo").equals("I_DE7_04") || (c.getAttribute("codigo").equals("I_DE7_06"))) && d.getAttribute("curso").equals(periodoAnt)) {
+				    			ind.setValor(d.getAttribute("valor"));
+				    		}
+				    	}
+				    	indicadores.add(ind);
+	    			}
+	    		}
+	    		else { // not has subind
+			    	NodeList nodevals = b.getElementsByTagName("cursoAcademico");
+			    	Indicador ind = new Indicador(a.getAttribute("codigo"), b.getAttribute("codigo"), "");
+			    	for(int k = 0; k < nodevals.getLength(); k++) { // each val
+			    		Element c = (Element)nodevals.item(k);
+			    		if(c.getAttribute("curso").equals(periodo)) {
+			    			ind.setValor(c.getAttribute("valor"));
+			    		}
+			    		else if((b.getAttribute("codigo").equals("I_DE7_04") || (b.getAttribute("codigo").equals("I_DE7_06"))) && c.getAttribute("curso").equals(periodoAnt)) {
+			    			ind.setValor(c.getAttribute("valor"));
+			    		}
+			    	}
+			    	indicadores.add(ind);
+	    		}	
+	    	}
+	    }
+		return indicadores;
+	}
+	
+	public List<Indicador> getGraphData(Integer tit) {
+		String url = "http://bancuv.uv.es/wwwuv/stuff/web/siga/SGIC"+tit.toString()+".xml";
+	    String fileText;
+		List<Indicador> inds = new ArrayList<Indicador>();
+		DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
+		f.setNamespaceAware(false);
+		f.setValidating(false);
+		DocumentBuilder build;
+
+		try {
+			build = f.newDocumentBuilder();
+			
+			List<Integer> tits = this.oc.getEquivalents(tit, "T");
+			if(tits.size() > 0) {
+				tit = tits.get(tits.size()-1);
+			}
+	    
+    		URLConnection urlConnection = new URI(url).toURL().openConnection();
+    		urlConnection.addRequestProperty("Accept", "application/xml");
+    		InputStream res = urlConnection.getInputStream();
+    		fileText = new String(res.readAllBytes(), StandardCharsets.UTF_8);
+    		inds = this.extractAll(build, fileText);
+			
+		} catch (ParserConfigurationException e) {
+			System.err.println("Error creating DocumentBuilder");
+			e.printStackTrace();
+		}
+    	catch(Exception e){
+    		fileText = "";
+    		return null;
+    	}
+	    
+	    return inds;
+	}
+	
+	private List<Indicador> extractAll(DocumentBuilder build, String fileText) throws SAXException, IOException {
+    	Document doc = build.parse(new InputSource(new StringReader(fileText)));
+	    doc.getDocumentElement().normalize();
+	    NodeList nodedim = doc.getElementsByTagName("Dimension");
+	    List<Indicador> indicadores = new ArrayList<Indicador>();
+    
+	    for(int i = 0; i < nodedim.getLength(); i++) { // each dim
+	    	Element a = (Element)nodedim.item(i);
+	    	NodeList nodeind = a.getElementsByTagName("indicador");
+	    	for(int j = 0; j < nodeind.getLength(); j++) { // each ind
+	    		Element b = (Element)nodeind.item(j);
+	    		NodeList nodesub = b.getElementsByTagName("subindicador");
+	    		if(nodesub.getLength() > 0) { // has subind
+	    			for(int k = 0; k < nodesub.getLength(); k++) { // each subind
+	    				Element c = (Element)nodesub.item(k);
+	    				NodeList nodevals = c.getElementsByTagName("cursoAcademico");
+	    				Indicador ind = new Indicador(a.getAttribute("codigo"), c.getAttribute("codigo"), "");
+				    	for(int z = 0; z < nodevals.getLength(); z++) { // each val
+				    		Element d = (Element)nodevals.item(z);
+				    		ind.addCursoValor(d.getAttribute("curso"), d.getAttribute("valor").replace("%",""));
+				    		//ind.setValor();
+				    	}
+				    	indicadores.add(ind);
+	    			}
+	    		}
+	    		else { // not has subind
+			    	NodeList nodevals = b.getElementsByTagName("cursoAcademico");
+			    	Indicador ind = new Indicador(a.getAttribute("codigo"), b.getAttribute("codigo"), "");
+			    	for(int k = 0; k < nodevals.getLength(); k++) { // each val
+			    		Element c = (Element)nodevals.item(k);
+			    		ind.addCursoValor(c.getAttribute("curso"), c.getAttribute("valor").replace("%",""));
+			    	}
+			    	indicadores.add(ind);
+	    		}	
+	    	}
+	    }
+		return indicadores;
+	}
+	
+}

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

@@ -7,8 +7,6 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
-import jakarta.mail.MessagingException;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.annotation.Secured;
 import org.springframework.security.core.Authentication;
@@ -26,6 +24,7 @@ import es.uv.saic.dto.IndicadorEnquestaTmpDup;
 import es.uv.saic.dto.TablaDTO;
 import es.uv.saic.service.DataService;
 import es.uv.saic.service.DatasourceService;
+import jakarta.mail.MessagingException;
 
 @RestController
 @RequestMapping("/data")

+ 301 - 0
src/main/java/es/uv/saic/web/IndicadorController.java

@@ -0,0 +1,301 @@
+package es.uv.saic.web;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+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.RestController;
+import org.xml.sax.SAXException;
+
+import es.uv.saic.domain.EvidenciaIndicadorEnquesta;
+import es.uv.saic.domain.Indicador;
+import es.uv.saic.domain.IndicadorEnquesta;
+import es.uv.saic.dto.IndicadorDTOimp;
+import es.uv.saic.dto.IndicadorEnquestaDTO;
+import es.uv.saic.dto.IndicadorEnquestaTmpDup;
+import es.uv.saic.dto.IndicadorEnquestaValorDTOImp;
+import es.uv.saic.service.EvidenciaIndicadorEnquestaService;
+import es.uv.saic.service.IndicadorEnquestaService;
+import es.uv.saic.service.IndicadorEnquestaTmpService;
+import es.uv.saic.service.IndicadorService;
+
+@RestController
+@RequestMapping("/indicadorEnquesta")
+public class IndicadorController {
+    @Autowired
+    private IndicadorService is;
+
+    @Autowired
+    private IndicadorEnquestaService ies;
+
+    @Autowired
+    private IndicadorEnquestaTmpService iets;
+
+    @Autowired
+	private EvidenciaIndicadorEnquestaService eies;
+
+    @GetMapping("/{ruct}/{curs}")
+    public List<IndicadorEnquesta> getAllIndsByRuct(@PathVariable Integer ruct, @PathVariable Integer curs) {
+        return ies.getAllIndsByRuct(ruct, curs);
+    }
+
+    /*
+    * Endpoint para la funcion deleteByEnquestaCursAmbitEstudi de iets
+    */
+    @DeleteMapping("/{enquesta}/{curs}/{ambit}/{estudi}")
+    public Integer deleteByEnquestaCursAmbitEstudi(@PathVariable("enquesta") String enquesta, @PathVariable("curs") Integer curs, 
+        @PathVariable("ambit") String ambit, @PathVariable("estudi") String estudi) {
+
+        Integer i = 0;
+        try {
+            i = iets.deleteByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
+
+        } catch(Exception e) {
+            e.printStackTrace();
+        }
+    return i;
+    }
+
+    @DeleteMapping("/{enquesta}")
+    public Integer deleteByEnquesta(@PathVariable("enquesta") String enquesta) {
+        return iets.deleteByEnquesta(enquesta);
+    }
+
+    /*
+    * Endpoint para la funcion deleteFromCurrent de iets, dev
+    */
+    @DeleteMapping("/current/{enquesta}")
+    public Integer deleteFromCurrent(@PathVariable("enquesta") String enquesta) {
+        return iets.deleteFromCurrent(enquesta);
+    }
+
+    /*
+    * Endpoint para la funcion deleteFromPending de iets
+    */
+    @DeleteMapping("/pending/{enquesta}")
+    public Integer deleteFromPending(@PathVariable("enquesta") String enquesta) {
+        return iets.deleteFromPending(enquesta);
+    }
+
+    /*
+    * Endpoint para la funcion deleteDuplicates de iets
+    */
+    @DeleteMapping("/duplicates/{enquesta}")
+    public Integer deleteDuplicates(@PathVariable("enquesta") String enquesta) {
+       return iets.deleteDuplicates(enquesta);
+    }
+
+    /*
+     * Endpoint para la funcion findByEnquestaCursAmbitEstudi de ies
+     */
+    @PostMapping("/{enquesta}/{curs}/{ambit}/{estudi}")
+    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudi(@PathVariable("enquesta") String enquesta, @PathVariable("curs") Integer curs, 
+        @PathVariable("ambit") String ambit, @PathVariable("estudi") String estudi) {
+        return ies.findByEnquestaCursAmbitEstudi(enquesta, curs, ambit, estudi);
+    }
+
+    /*
+     * Endpoing para la función findByEnquestaCursAmbitEstudiCentre
+     */
+    @PostMapping("/{enquesta}/{curs}/{ambit}/{estudi}/{centre}")
+    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentre(@PathVariable("enquesta") String enquesta, @PathVariable("curs") Integer curs, 
+        @PathVariable("ambit") String ambit, @PathVariable("estudi") String estudi, @PathVariable("centre") Integer centre) {
+        return ies.findByEnquestaCursAmbitEstudiCentre(enquesta, curs, ambit, estudi, centre);
+    }
+
+    @PostMapping("/{enquesta}/{curs}/{ambit}/{estudi}/{centre}/{titulacio}")
+    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentreTitulacio(@PathVariable("enquesta") String enquesta, @PathVariable("curs") Integer curs, 
+        @PathVariable("ambit") String ambit, @PathVariable("estudi") String estudi, @PathVariable("centre") Integer centre,
+        @PathVariable("titulacio") Integer titulacio) {
+        return ies.findByEnquestaCursAmbitEstudiCentreTitulacio(enquesta, curs, ambit, estudi, centre, titulacio);
+    }
+
+    /*
+     * Endpoint para la funcion getFromTitulacion de ies
+     */
+    @GetMapping("/getFromTitulacio/{idTitulacio}/{curs}")
+    public List<Indicador> getFromTitulacion(@PathVariable Integer idTitulacio, @PathVariable Integer curs) 
+        throws ParserConfigurationException, MalformedURLException, IOException, SAXException  {
+        
+        return is.getFromTitulacion(idTitulacio, curs);
+    }
+
+    @PostMapping("/save")
+    public void save(@RequestBody EvidenciaIndicadorEnquesta eie) {
+        eies.save(eie);
+    }
+
+    @GetMapping("/count/{enquesta}")
+    public Integer countByEnquesta(@PathVariable String enquesta) {
+        return iets.countByEnquesta(enquesta);
+    }
+    
+    @GetMapping("/checkDuplicates/{enquesta}")
+    public List<IndicadorEnquestaTmpDup> checkDuplicates(@PathVariable String enquesta) {
+        return iets.checkDuplicates(enquesta);
+    }
+    
+    @GetMapping("/checkIntegrity/{enquesta}")
+    public List<IndicadorEnquestaTmpDup> checkIntegrity(@PathVariable String enquesta) {
+        return iets.checkIntegrity(enquesta);
+    }
+
+    @GetMapping("/consolidate/{enquesta}")
+    public Integer consolidateByEnquesta(@PathVariable String enquesta) {
+        return ies.consolidateByEnquesta(enquesta);
+    }
+    
+    @GetMapping
+    public List<String> findTypes() {
+        return ies.findTypes();
+    }
+
+    @GetMapping("/graph/{lugar}")
+    public List<Indicador> getGraphData(@PathVariable Integer lugar) {
+        return is.getGraphData(lugar);
+    }
+
+    @PostMapping("/graph/centre")
+    public List<IndicadorDTOimp> getGraphData(@RequestParam Integer centre, @RequestParam String tambit, @RequestParam Integer year) {
+        return ies.getGraphData(centre, tambit, year).stream().map(ind -> new IndicadorDTOimp(ind)).collect(Collectors.toList());
+    }
+
+    @PostMapping("/graph/titulacions")
+    public List<IndicadorDTOimp> getGraphData(@RequestParam List<Integer> tits, @RequestParam Integer centre, @RequestParam String tambit, @RequestParam Integer year) {
+        return ies.getGraphData(tits, centre, tambit, year).stream().map(ind -> new IndicadorDTOimp(ind)).collect(Collectors.toList());
+    }
+
+    @DeleteMapping("/{proces}/{enquesta}")
+    public void deleteByProcesEnquesta(@PathVariable String proces, @PathVariable String enquesta) {
+        eies.removeByProcesEvidencia(proces, enquesta);
+    }
+    
+    @PostMapping("/templatedata")
+    public void getTemplateData(@RequestParam Integer idTitulacio, @RequestParam Integer idCentre, @RequestParam Integer curs, @RequestParam HashMap<String, Object> context) {
+		
+		/*  Indicadores del data warehouse */
+		try {
+			List<Indicador> indicadores;
+			indicadores = is.getFromTitulacion(idTitulacio, curs);
+			for(Indicador i : indicadores) { 
+				context.put(i.getIndicador(), i.getValor());
+			}
+		} 
+		catch(Exception e) { }
+		
+		/*  Indicadores de encuestas y otros almacenados en BD  */
+		IndicadorEnquestaDTO indicadorEnquestaDTO = new IndicadorEnquestaDTO(idTitulacio, idCentre, curs);
+		List<IndicadorEnquestaValorDTOImp> enquestesT = ies.getAllInds(indicadorEnquestaDTO.getIdTitulacio(), indicadorEnquestaDTO.getIdCentre(), indicadorEnquestaDTO.getCurs(), ies.getRuctTitulacio(idTitulacio))
+                .stream()
+                .map(ind -> new IndicadorEnquestaValorDTOImp(ind))
+                .collect(Collectors.toList());
+				
+		for(IndicadorEnquestaValorDTOImp i : enquestesT) {
+			String indicador = i.getAmbit().toLowerCase().equals("t") ? (i.getEnquesta().toLowerCase()+"_"+i.getIndicador().toLowerCase()) : (i.getEnquesta().toLowerCase()+"_"+i.getIndicador().toLowerCase()+"_"+i.getAmbit().toLowerCase());
+			if(i.getNum() == null) {
+				indicador = i.getTipus().toLowerCase().equals("avg") ? indicador : (indicador += "_"+i.getTipus().toLowerCase());		
+				indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd().toLowerCase());
+				context.put(indicador, formatValue(i.getValor()));
+			}
+			else {
+				context.put(indicador, i.getNum());
+			}
+			
+		}
+	}
+
+
+    @PostMapping("/download/templatedata")
+    public HashMap<String, String> getTemplateData(@RequestParam Integer idTitulacio, @RequestParam Integer idCentre, @RequestParam Integer curs, @RequestParam Integer ruct) {
+		HashMap<String, String> context = new HashMap<String, String>();
+		
+		/*  Indicadores del data warehouse */
+		try {
+			List<Indicador> indicadores;
+			indicadores = is.getFromTitulacion(idTitulacio, curs);
+			for(Indicador i : indicadores) { 
+				context.put(i.getIndicador(), i.getValor());
+			}
+		} 
+		catch(Exception e) { }
+		
+		/*  Indicadores de encuestas  */
+		List<IndicadorEnquestaValorDTOImp> enquestesT;
+		IndicadorEnquestaDTO iEnquestaDTO = new IndicadorEnquestaDTO(idTitulacio, idCentre, curs);
+		enquestesT = ies.getAllInds(iEnquestaDTO.getIdTitulacio(), iEnquestaDTO.getIdCentre(), iEnquestaDTO.getCurs(), ies.getRuctTitulacio(idTitulacio)).stream()
+                .map(ind -> new IndicadorEnquestaValorDTOImp(ind))
+                .collect(Collectors.toList());
+				
+		for(IndicadorEnquestaValorDTOImp i : enquestesT) {
+			String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+			indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());		
+			indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+			context.put(indicador, formatValue(i.getValor()));
+		}
+
+        return context;
+	}
+
+    @PostMapping("/templatedata/array")
+    public HashMap<String, String> getTemplateDataArray(@RequestParam Integer idTitulacio, @RequestParam Integer idCentre, @RequestParam Integer curs) {
+		HashMap<String, String> info = new HashMap<String, String>();
+		
+		/*  Indicadores del data warehouse */
+		try {
+			List<Indicador> indicadores;
+			indicadores = is.getFromTitulacion(idTitulacio, curs);
+			for(Indicador i : indicadores) { 
+				info.put(i.getIndicador(), i.getValor());
+			}
+		} 
+		catch(Exception e) { }
+		
+		/*  Indicadores de encuestas  */
+		List<IndicadorEnquestaValorDTOImp> enquestesT;	
+		IndicadorEnquestaDTO iEnquestaDTO = new IndicadorEnquestaDTO(idTitulacio, idCentre, curs);
+		enquestesT = ies.getAllInds(iEnquestaDTO.getIdTitulacio(), iEnquestaDTO.getIdCentre(), iEnquestaDTO.getCurs(), ies.getRuctTitulacio(idTitulacio)).stream()
+                .map(ind -> new IndicadorEnquestaValorDTOImp(ind))
+                .collect(Collectors.toList());
+				
+		for(IndicadorEnquestaValorDTOImp i : enquestesT) {
+			String indicador = i.getAmbit().equals("t") ? (i.getEnquesta()+"_"+i.getIndicador()) : (i.getEnquesta()+"_"+i.getIndicador()+"_"+i.getAmbit());
+			indicador = i.getTipus().equals("avg") ? indicador : (indicador += "_"+i.getTipus());	
+			indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd());
+			info.put(indicador, formatValue(i.getValor()));
+		}	
+		
+		return info;
+	}
+
+    private String formatValue(String v) {	
+		if(v == null) return ""; 
+		if(v.equals("NP")) return "NP";
+		if(v.isEmpty() | v.isBlank()) {
+			return "";
+		}
+		
+		try{
+	        return String.format("%.2f", Float.parseFloat(v)).replace(",", ".");
+	    } 
+		catch(NumberFormatException e){ }
+		
+		try{
+	        return Integer.toString(Integer.parseInt(v));
+	    } 
+		catch(NumberFormatException e){ }
+		
+		return v;
+	}
+}

+ 11 - 11
src/main/resources/application-local.properties

@@ -11,17 +11,17 @@ spring.datasource.url=jdbc:postgresql://saicd.uv.es:5432/saic_v2
 spring.datasource.password=docent1ia2.l6
 
 # Files and log config
-saic.data.filePath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/files/
-saic.data.tmpPath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/tmp/
-saic.data.docsPath=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/documents/
-saic.data.templates.filePath = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/templates/
-saic.data.templates.logoPath = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/templates/logos/
-saic.data.templates.fileNotFound = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/utils/filenotfound.pdf
-saic.data.master = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/MasterOficial/
-saic.data.doctorado = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/doctorat/
-saic.data.evdocente = /home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/databases/ev_docente/latest/
-logging.file.path=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/logs
-logging.file.name=/home/dagarcos/DATA_SYNC/UV_APPS/SAIC/DATA/saic-data/logsd/saic.log
+saic.data.filePath=/home/mariomh/Documentos/SAIC/docs/files/
+saic.data.tmpPath=/home/mariomh/Documentos/SAIC/docs/tmp/
+saic.data.docsPath=/home/mariomh/Documentos/SAIC/docs/documents/
+saic.data.templates.filePath = /home/mariomh/Documentos/SAIC/docs/templates/
+saic.data.templates.logoPath = /home/mariomh/Documentos/SAIC/docs/templates/logos/
+saic.data.templates.fileNotFound = /home/mariomh/Documentos/SAIC/docs/filenotfound.pdf
+saic.data.master = /home/mariomh/Documentos/SAIC/docs/databases/MasterOficial/
+saic.data.doctorado = /home/mariomh/Documentos/SAIC/docs/databases/doctorat/
+saic.data.evdocente = /home/mariomh/Documentos/SAIC/docs/databases/ev_docente/latest/
+logging.file.path=/home/mariomh/Documentos/SAIC/docs/logs
+logging.file.name=/home/mariomh/Documentos/SAIC/docs/logs/saic.log
 
 # Scheduler
 saic.scheduler.expired.enabled=false

+ 1 - 1
src/main/resources/messages_es.properties

@@ -164,7 +164,7 @@ managers.titulations = Titulación(es)
 managers.search = Buscar
 managers.search.title = Resultados de la búsqueda
 managers.noResults = No se ha encontrado ningun responsable con los criterios seleccionados
-managers.since = desde del
+managers.since = desde el
 
 ##########################################
 #	ADMIN PAGE LOCALES