Drowsito 5 ay önce
işleme
983300d8cf
100 değiştirilmiş dosya ile 13285 ekleme ve 0 silme
  1. 5 0
      .gitignore
  2. 14 0
      .vscode/launch.json
  3. 17 0
      .vscode/settings.json
  4. 286 0
      mvnw
  5. 161 0
      mvnw.cmd
  6. 135 0
      notas.md
  7. 201 0
      pom.xml
  8. 109 0
      reporte_config.md
  9. 1796 0
      reporte_domain.md
  10. 143 0
      reporte_general.md
  11. 1420 0
      reporte_service.md
  12. 1650 0
      reporte_web.md
  13. 162 0
      src/main/java/META-INF/additional-spring-configuration-metadata.json
  14. 17 0
      src/main/java/es/uv/saic/SaicApplication.java
  15. 55 0
      src/main/java/es/uv/saic/config/ApplicationLocaleResolver.java
  16. 26 0
      src/main/java/es/uv/saic/config/AuthSuccessHandler.java
  17. 43 0
      src/main/java/es/uv/saic/config/Globals.java
  18. 22 0
      src/main/java/es/uv/saic/config/SchedulerConfig.java
  19. 150 0
      src/main/java/es/uv/saic/config/SecurityConfig.java
  20. 49 0
      src/main/java/es/uv/saic/config/WebConfig.java
  21. 147 0
      src/main/java/es/uv/saic/domain/Acreditacio.java
  22. 52 0
      src/main/java/es/uv/saic/domain/AcreditacioPK.java
  23. 44 0
      src/main/java/es/uv/saic/domain/AcreditacioRepository.java
  24. 190 0
      src/main/java/es/uv/saic/domain/AcreditacioTransfer.java
  25. 191 0
      src/main/java/es/uv/saic/domain/Calendari.java
  26. 15 0
      src/main/java/es/uv/saic/domain/CalendariRepository.java
  27. 78 0
      src/main/java/es/uv/saic/domain/Categoria.java
  28. 30 0
      src/main/java/es/uv/saic/domain/CategoriaRepository.java
  29. 65 0
      src/main/java/es/uv/saic/domain/Datasource.java
  30. 10 0
      src/main/java/es/uv/saic/domain/DatasourceRepository.java
  31. 140 0
      src/main/java/es/uv/saic/domain/Dimension.java
  32. 93 0
      src/main/java/es/uv/saic/domain/Document.java
  33. 31 0
      src/main/java/es/uv/saic/domain/DocumentRepository.java
  34. 34 0
      src/main/java/es/uv/saic/domain/DocumentTemplate.java
  35. 71 0
      src/main/java/es/uv/saic/domain/DummyDataTransfer.java
  36. 45 0
      src/main/java/es/uv/saic/domain/Email.java
  37. 36 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquesta.java
  38. 78 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaPK.java
  39. 29 0
      src/main/java/es/uv/saic/domain/EvidenciaIndicadorEnquestaRepository.java
  40. 64 0
      src/main/java/es/uv/saic/domain/EvidenciaTransfer.java
  41. 129 0
      src/main/java/es/uv/saic/domain/Grafica.java
  42. 60 0
      src/main/java/es/uv/saic/domain/GraficaPK.java
  43. 18 0
      src/main/java/es/uv/saic/domain/GraficaRepository.java
  44. 119 0
      src/main/java/es/uv/saic/domain/Indicador.java
  45. 240 0
      src/main/java/es/uv/saic/domain/IndicadorEnquesta.java
  46. 158 0
      src/main/java/es/uv/saic/domain/IndicadorEnquestaRepository.java
  47. 248 0
      src/main/java/es/uv/saic/domain/IndicadorEnquestaTmp.java
  48. 95 0
      src/main/java/es/uv/saic/domain/IndicadorEnquestaTmpRepository.java
  49. 143 0
      src/main/java/es/uv/saic/domain/Informe.java
  50. 60 0
      src/main/java/es/uv/saic/domain/InformeProcesPK.java
  51. 47 0
      src/main/java/es/uv/saic/domain/InformeProcessos.java
  52. 22 0
      src/main/java/es/uv/saic/domain/InformeRepository.java
  53. 133 0
      src/main/java/es/uv/saic/domain/Instancia.java
  54. 161 0
      src/main/java/es/uv/saic/domain/InstanciaRepository.java
  55. 149 0
      src/main/java/es/uv/saic/domain/InstanciaTasca.java
  56. 160 0
      src/main/java/es/uv/saic/domain/InstanciaTascaRepository.java
  57. 214 0
      src/main/java/es/uv/saic/domain/InstanciaTascaTransfer.java
  58. 77 0
      src/main/java/es/uv/saic/domain/InstanciaTascaVer.java
  59. 36 0
      src/main/java/es/uv/saic/domain/InstanciaTascaVerPK.java
  60. 28 0
      src/main/java/es/uv/saic/domain/InstanciaTascaVerRepository.java
  61. 68 0
      src/main/java/es/uv/saic/domain/InstanciaTascaVersioTransfer.java
  62. 178 0
      src/main/java/es/uv/saic/domain/InstanciaTransfer.java
  63. 99 0
      src/main/java/es/uv/saic/domain/Link.java
  64. 18 0
      src/main/java/es/uv/saic/domain/LinkRepository.java
  65. 85 0
      src/main/java/es/uv/saic/domain/Noticia.java
  66. 16 0
      src/main/java/es/uv/saic/domain/NoticiaRepository.java
  67. 212 0
      src/main/java/es/uv/saic/domain/Organ.java
  68. 64 0
      src/main/java/es/uv/saic/domain/OrganEquivalent.java
  69. 61 0
      src/main/java/es/uv/saic/domain/OrganEquivalentPK.java
  70. 51 0
      src/main/java/es/uv/saic/domain/OrganPK.java
  71. 97 0
      src/main/java/es/uv/saic/domain/OrganRepository.java
  72. 126 0
      src/main/java/es/uv/saic/domain/Plantilla.java
  73. 62 0
      src/main/java/es/uv/saic/domain/PlantillaComentario.java
  74. 66 0
      src/main/java/es/uv/saic/domain/PlantillaConversation.java
  75. 24 0
      src/main/java/es/uv/saic/domain/PlantillaRepository.java
  76. 198 0
      src/main/java/es/uv/saic/domain/Proces.java
  77. 75 0
      src/main/java/es/uv/saic/domain/ProcesRepository.java
  78. 124 0
      src/main/java/es/uv/saic/domain/Rol.java
  79. 17 0
      src/main/java/es/uv/saic/domain/RolRepository.java
  80. 101 0
      src/main/java/es/uv/saic/domain/ScheduledTasks.java
  81. 64 0
      src/main/java/es/uv/saic/domain/SupervisionSearchParams.java
  82. 81 0
      src/main/java/es/uv/saic/domain/SysStatus.java
  83. 15 0
      src/main/java/es/uv/saic/domain/SysStatusRepository.java
  84. 256 0
      src/main/java/es/uv/saic/domain/Tasca.java
  85. 48 0
      src/main/java/es/uv/saic/domain/TascaRepository.java
  86. 76 0
      src/main/java/es/uv/saic/domain/TascaVersioTransfer.java
  87. 42 0
      src/main/java/es/uv/saic/domain/Tipus.java
  88. 11 0
      src/main/java/es/uv/saic/domain/TipusRepository.java
  89. 210 0
      src/main/java/es/uv/saic/domain/Usuari.java
  90. 90 0
      src/main/java/es/uv/saic/domain/UsuariRepository.java
  91. 127 0
      src/main/java/es/uv/saic/domain/UsuarisRol.java
  92. 64 0
      src/main/java/es/uv/saic/domain/UsuarisRolRepository.java
  93. 63 0
      src/main/java/es/uv/saic/domain/Wiki.java
  94. 11 0
      src/main/java/es/uv/saic/domain/WikiRepository.java
  95. 31 0
      src/main/java/es/uv/saic/dto/AnyDimensioDTO.java
  96. 25 0
      src/main/java/es/uv/saic/dto/ArchiveOrganDTO.java
  97. 27 0
      src/main/java/es/uv/saic/dto/CategoriaDTO.java
  98. 34 0
      src/main/java/es/uv/saic/dto/CategoriaDocumentDTO.java
  99. 34 0
      src/main/java/es/uv/saic/dto/CategoriaPareDTO.java
  100. 33 0
      src/main/java/es/uv/saic/dto/DimensioInstanciesDTO.java

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/target/**
+.deployables
+.settings
+markdonwGen.py
+/target/

+ 14 - 0
.vscode/launch.json

@@ -0,0 +1,14 @@
+{
+    "configurations": [
+        {
+            "type": "java",
+            "name": "Spring Boot-SaicApplication<saic>",
+            "request": "launch",
+            "cwd": "${workspaceFolder}",
+            "mainClass": "es.uv.saic.SaicApplication",
+            "projectName": "saic",
+            "envFile": "${workspaceFolder}/.env",
+            "args": "--spring.profiles.active=local"
+        }
+    ]
+}

+ 17 - 0
.vscode/settings.json

@@ -0,0 +1,17 @@
+{
+    "sqltools.connections": [
+        {
+            "server": "coddono.uv.es",
+            "port": 9042,
+            "previewLimit": 50,
+            "driver": "Cassandra",
+            "name": "coddono",
+            "database": "acd425",
+            "username": "acd425",
+            "password": "acd425"
+        }
+    ],
+    "java.configuration.updateBuildConfiguration": "interactive",
+    "java.compile.nullAnalysis.mode": "automatic",
+    "java.dependency.syncWithFolderExplorer": false
+}

+ 286 - 0
mvnw

@@ -0,0 +1,286 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        wget "$jarUrl" -O "$wrapperJarPath"
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        curl -o "$wrapperJarPath" "$jarUrl"
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 161 - 0
mvnw.cmd

@@ -0,0 +1,161 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+	IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    echo Found %WRAPPER_JAR%
+) else (
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+    powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 135 - 0
notas.md

@@ -0,0 +1,135 @@
+# Notas
+## DataController -> SAIC_DATA
+ - DataService -> SAIC_DATA
+ - OrganService -> SAIC_CORE
+ - IndicadorEnquestaTmpService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - DataSourceService -> SAIC_DATA
+ ### Llamadas a OrganService a convertir - ✅
+    - ln 114 getActiveCentres() GET - ✅
+    - ln 115 getTitulations() GET - ✅
+    - ln 201 findByRuct(Integer ruct) POST - ✅
+
+ ### Llamadas a IndicadorEnquestaTmpService a convertir - ✅
+    - ln 95 deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) DELETE - ✅
+    - ln 106 findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST - ✅
+    - ln 150 deleteFromCurrent(String enquesta) DELETE - ✅
+    - ln 153 deleteFromPending(String enquesta) DELETE - ✅
+    - ln 163 deleteDuplicates(String enquesta) DELETE  - ✅
+
+ ### Llamadas a IndicadorEnquestaService a convertir - ¿No se usa? - ✅
+    - ln 215 findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST - ✅
+    - ln 218 findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) POST - ✅
+    - ln 221 findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) POST - ✅
+
+## DashboardController -> SAIC_CORE
+ - OrganService -> SAIC_CORE
+ - UsuarisRolService -> SAIC_CORE
+ - InformeService -> SAIC_CORE
+ - InstanciaService -> SAIC_CORE
+ - CategoriaService -> SAIC_CORE
+ - DocumentService -> SAIC_DOCS
+ - IndicadorService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - GraficaService -> SAIC_CORE
+ - LinkService -> SAIC_CORE
+
+ ### Llamadas a DocumentService a convertir - ✅
+    - ln 335 findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST - ✅
+    - ln 425 findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST - ✅
+    - ln 435 save(Document doc) POST - ✅
+    - ln 436 upload(Integer idDocument, Integer idCategoria, Integer lugar, String tlugar, MultipartFile file) POST - ✅
+    - ln 438 save(Document doc) POST - ✅
+    - ln ??? archive(Document doc) POST - ✅
+## DownloadController -> SAIC_DOCS
+ - InstanciaTascaService -> SAIC_CORE
+ - IndicadorEnquestaService -> SAIC_CORE
+ - TascaService -> SAIC_CORE
+ - IndicadorService -> SAIC_CORE
+ - ProcesService -> SAIC_CORE
+ - PlantillaService -> SAIC_CORE
+ - OrganService -> SAIC_CORE
+ - DocumentService -> SAIC_DOCS
+
+ ### Llamadas a InstanciaTascaService a convertir - ✅
+    - ln 110 findById(Integer idInstanciaTasca) POST - ✅
+    - ln 169 getLastByProcName(String nomProces, Integer lugar, Integer lugarOrgan, String organAmbit) POST - ✅
+    - ln 196 findById(Integer idInstanciaTasca) POST - ✅
+    - ln 534 findById(Integer idInstanciaTasca) POST - ✅
+
+ ### Llamadas a IndicadorEnquestaService a convertir - ✅
+    - ln 290 getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST - ✅
+    - ln 348 getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST - ✅
+
+ ### Llamadas a TascaService a convertir - ✅
+    - ln 378 getByProcesTascap(Integer idProces, Integer idTascap) POST - ✅
+
+ ### Llamadas a IndicadorService a convertir - ✅
+    - ln 281 getFromTitulacion(String idTitulacio.toString(), Integer curs) POST - ✅
+    - ln 339 getFromTitulacion(String idTitulacio.toString(), Integer curs) POST - ✅
+ 
+ ### Llamadas a ProcesService a convertir - ✅
+    - ln 379 findByID(Integer idProces) POST - ✅
+    
+ ### Llamadas a PlantillaService a convertir
+    - ln 538 toPdf(String instanciaTasca.getText(),Optional<BigInteger> Optional.of(idTascai)) POST
+    - ln 554 toPDF(String content, Optional<BigInteger> idtascai) POST
+
+ ### Llamadas a OrganService a convertir - ✅
+    - ln 167 findById(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 247 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+    - ln 380 findByID(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 381 findByID(String tlugar, Integer idTutulacio) POST - ✅
+    - ln 420 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+    - ln 460 findByID(String tlugar, Integer idTitulacio) POST - ✅
+    - ln 461 findByID(String tlugar, Integer idTutulacio) POST - ✅
+    - ln 503 getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST - ✅
+ ### Llamadas a DocumentService a convertir  - ✅
+   -
+   -
+   -
+   
+# Servicios que necesitan un nuevo controlador: 
+## IndicadorController -> ASIC_CORE
+ ### IndicadorEnquestaTmpService endpoints:
+    - deleteByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) DELETE
+    - deleteFromCurrent(String enquesta) DELETE
+    - deleteFromPending(String enquesta) DELETE
+    - deleteDuplicates(String enquesta) DELETE
+ ### IndicadorEnquestaService endpoints:
+    - getAllInds(Organ o, Integer curs) POST
+    - getAllInds(Integer idTitulacio, Integer idCentre, IntegerCurs) POST 
+    - findByEnquestaCursAmbitEstudi(String enquesta, Integer curs, String ambit, String estudi) POST
+    - findByEnquestaCursAmbitEstudiCentre(String enquesta, Integer curs, String ambit, String estudi, Integer centre) POST
+    - findByEnquestaCursAmbitEstudiCentreTitulacio(String enquesta, Integer curs, String ambit, String estudi, Integer centre, Integer titulacio) POST
+ ### IndicadorService endpoints:
+    - getFromTitulacion(String idTitulacio.toString(), Integer curs) POST
+
+## OrganController -> ASIC_CORE
+ ### OrganService endpoints:
+    - getActiveCentres() GET
+    - getTitulations() GET
+    - findByRuct(Integer ruct) POST  -> AHORA ES "getAllIndsByRuct"
+    - findById(String tlugar, Integer idTitulacio) POST
+    - getTitulacionsByTypeCentre(Integer lugar, Integer ambit) POST
+
+## TascaController -> ASIC_CORE
+ ### InstanciaTascaService endpoints:
+    - findById(Integer idInstanciaTasca) POST
+    - getLastByProcName(String nomProces, Integer lugar, Integer lugarOrgan, String organAmbit) POST
+ ### TascaService endpoints:
+    - getByProcesTascap(Integer idProces, Integer idTascap) POST
+
+## ProcesController -> ASIC_CORE
+ ### ProcesService
+    - findByID(Integer idProces) POST
+
+## DocumenController -> ASIC_DOCS
+ ### DocumentService endpoints:
+    - save(Document doc) POST
+    - findByCategoriaOrgan(Integer idCategoria, Integer lugar, String tlugar) POST 
+    - upload(Integer idDocument, Integer idCategoria, Integer lugar, String tlugar, MultipartFile file) POST
+
+## PlantillaController -> ASIC_DOCS
+ ### PlantillaService
+    - toPdf(String instanciaTasca.getText(),Optional<BigInteger> Optional.of(idTascai)) POST

+ 201 - 0
pom.xml

@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>3.3.0</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>es.uv.saic</groupId>
+	<artifactId>saic</artifactId>
+	<version>3.0.0</version>
+	<name>saic</name>
+	<description>saic</description>
+
+	<properties>
+		<java.version>17</java.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<spring-cloud.version>2023.0.3</spring-cloud.version>
+	</properties>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.springframework.cloud</groupId>
+				<artifactId>spring-cloud-dependencies</artifactId>
+				<version>${spring-cloud.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-actuator</artifactId>
+		</dependency>
+		<dependency>
+	        <groupId>de.codecentric</groupId>
+	        <artifactId>spring-boot-admin-starter-client</artifactId>
+	        <version>3.3.0</version>
+    	</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-properties-migrator</artifactId>
+		    <scope>runtime</scope>
+		</dependency>
+		<dependency>
+		    <groupId>nz.net.ultraq.thymeleaf</groupId>
+		    <artifactId>thymeleaf-layout-dialect</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.thymeleaf.extras</groupId>
+		    <artifactId>thymeleaf-extras-springsecurity6</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.springframework.security</groupId>
+		    <artifactId>spring-security-ldap</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.postgresql</groupId>
+			<artifactId>postgresql</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+			
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
+		
+		<dependency>
+		  <groupId>junit</groupId>
+		  <artifactId>junit</artifactId>
+		  <scope>test</scope>
+		</dependency>
+		
+		<dependency>
+		  <groupId>fr.opensagres.xdocreport</groupId>
+		  <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
+		  <version>2.0.0</version>
+		</dependency>
+				
+		<dependency>
+		  <groupId>fr.opensagres.xdocreport</groupId>
+		  <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
+		  <version>2.0.0</version>
+		</dependency>	
+		
+		<dependency>
+		    <groupId>com.mysql</groupId>
+		    <artifactId>mysql-connector-j</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.jsoup</groupId>
+			<artifactId>jsoup</artifactId>
+			<version>1.15.3</version>
+		</dependency>
+				
+		<dependency>
+		    <groupId>org.apache.commons</groupId>
+		    <artifactId>commons-csv</artifactId>
+		    <version>1.11.0</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>org.apache.commons</groupId>
+		    <artifactId>commons-io</artifactId>
+		    <version>1.3.2</version>
+		</dependency>
+		
+		<dependency>
+		    <groupId>commons-io</groupId>
+		    <artifactId>commons-io</artifactId>
+		    <version>2.16.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-openfeign</artifactId>
+		</dependency>
+		<!-- 
+		<dependency>
+		    <groupId>org.jacoco</groupId> 
+		    <artifactId>jacoco-maven-plugin</artifactId>
+		    <version>0.8.12</version>
+		</dependency>
+	  	 -->
+	</dependencies>
+	
+
+	<build>
+		<finalName>uv_saic</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<parameters>true</parameters>
+				</configuration>
+			</plugin>
+			<!-- 
+			<plugin>
+			    <groupId>org.jacoco</groupId>
+			    <artifactId>jacoco-maven-plugin</artifactId>
+			    <version>0.8.12</version>
+			    <executions>
+			        <execution>
+			            <id>jacoco-initialize</id>
+			            <goals>
+			                <goal>prepare-agent</goal>
+			            </goals>
+			        </execution>
+			        <execution>
+			            <id>jacoco-site</id>
+			            <phase>package</phase>
+			            <goals>
+			                <goal>report</goal>
+			            </goals>
+			        </execution>
+			    </executions>
+			</plugin>
+			-->
+		</plugins>
+	</build>
+
+
+</project>

+ 109 - 0
reporte_config.md

@@ -0,0 +1,109 @@
+# 📁 Reporte de carpeta: `config`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `ApplicationLocaleResolver` <a name='applicationlocaleresolver'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\ApplicationLocaleResolver.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `resolveLocale()` — ⚪ Interno
+- `setLocale()` — ⚪ Interno
+- `determineDefaultLocale()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AuthSuccessHandler` <a name='authsuccesshandler'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\AuthSuccessHandler.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `onAuthenticationSuccess()` — ⚪ Interno
+```
+//360
+```
+- `if()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Globals` <a name='globals'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\Globals.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+//private String filePath = "/DATA/saic-data/files/";
+```
+- `getFilePath()` — ⚪ Interno
+- `getFileName()` — ⚪ Interno
+- `getCurrentYear()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SchedulerConfig` <a name='schedulerconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\SchedulerConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `configureTasks()` — ⚪ Interno
+- `ThreadPoolTaskScheduler()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SecurityConfig` <a name='securityconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\SecurityConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `filterChain()` — ⚪ Interno
+- `AuthSuccessHandler()` — ⚪ Interno
+- `hasIpAddress()` — ⚪ Interno
+- `IpAddressMatcher()` — ⚪ Interno
+- `AuthorizationDecision()` — ⚪ Interno
+- `authenticationManager()` — ⚪ Interno
+- `sessionRegistry()` — ⚪ Interno
+- `SessionRegistryImpl()` — ⚪ Interno
+- `contextSource()` — ⚪ Interno
+- `DefaultSpringSecurityContextSource()` — ⚪ Interno
+- `passwordEncoder()` — ⚪ Interno
+- `BCryptPasswordEncoder()` — ⚪ Interno
+- `httpSessionEventPublisher()` — ⚪ Interno
+- `HttpSessionEventPublisher()` — ⚪ Interno
+- `concurrentSession()` — ⚪ Interno
+- `ConcurrentSessionControlAuthenticationStrategy()` — ⚪ Interno
+- `SessionFixationProtectionStrategy()` — ⚪ Interno
+- `RegisterSessionAuthenticationStrategy()` — ⚪ Interno
+- `CompositeSessionAuthenticationStrategy()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `WebConfig` <a name='webconfig'></a>
+**Ubicación:** `src\main\java\es\uv\saic\config\WebConfig.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `localeResolver()` — ⚪ Interno
+- `ApplicationLocaleResolver()` — ⚪ Interno
+- `localeChangeInterceptor()` — ⚪ Interno
+- `LocaleChangeInterceptor()` — ⚪ Interno
+- `addInterceptors()` — ⚪ Interno
+- `forwardedHeaderFilter()` — ⚪ Interno
+- `ForwardedHeaderFilter()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 6
+- Total de métodos: 37
+- Total de comentarios: 2
+
+✅ **Fin del reporte de carpeta.**

+ 1796 - 0
reporte_domain.md

@@ -0,0 +1,1796 @@
+# 📁 Reporte de carpeta: `domain`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `Acreditacio` <a name='acreditacio'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Acreditacio.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Acreditacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getCursImpla()` — ⚪ Interno
+- `setCursImpla()` — ⚪ Interno
+- `getDataVerif()` — ⚪ Interno
+- `setDataVerif()` — ⚪ Interno
+- `getDataRenov()` — ⚪ Interno
+- `setDataRenov()` — ⚪ Interno
+- `getDataAcred()` — ⚪ Interno
+- `setDataAcred()` — ⚪ Interno
+- `getDataSegui()` — ⚪ Interno
+- `setDataSegui()` — ⚪ Interno
+- `getGrup()` — ⚪ Interno
+- `setGrup()` — ⚪ Interno
+- `getGrupCurs()` — ⚪ Interno
+- `setGrupCurs()` — ⚪ Interno
+- `getInter()` — ⚪ Interno
+- `setInter()` — ⚪ Interno
+- `getGrupNum()` — ⚪ Interno
+- `setGrupNum()` — ⚪ Interno
+- `getRecom()` — ⚪ Interno
+- `setRecom()` — ⚪ Interno
+- `getSegui()` — ⚪ Interno
+- `setSegui()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AcreditacioPK` <a name='acreditaciopk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AcreditacioPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AcreditacioPK()` — ⚪ Interno
+- `AcreditacioPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AcreditacioTransfer` <a name='acreditaciotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AcreditacioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `getIdAcreditacio()` — ⚪ Interno
+- `setIdAcreditacio()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getGrup()` — ⚪ Interno
+- `setGrup()` — ⚪ Interno
+- `getGrupNum()` — ⚪ Interno
+- `setGrupNum()` — ⚪ Interno
+- `getGrupCurs()` — ⚪ Interno
+- `setGrupCurs()` — ⚪ Interno
+- `getInter()` — ⚪ Interno
+- `setInter()` — ⚪ Interno
+- `getDataVerif()` — ⚪ Interno
+- `setDataVerif()` — ⚪ Interno
+- `getDataRenov()` — ⚪ Interno
+- `setDataRenov()` — ⚪ Interno
+- `getDataSegui()` — ⚪ Interno
+- `setDataSegui()` — ⚪ Interno
+- `getDataAcred()` — ⚪ Interno
+- `setDataAcred()` — ⚪ Interno
+- `getCursImpla()` — ⚪ Interno
+- `setCursImpla()` — ⚪ Interno
+- `getDataVerifStr()` — ⚪ Interno
+- `setDataVerifStr()` — ⚪ Interno
+- `getDataRenovStr()` — ⚪ Interno
+- `setDataRenovStr()` — ⚪ Interno
+- `getDataSeguiStr()` — ⚪ Interno
+- `setDataSeguiStr()` — ⚪ Interno
+- `getDataAcredStr()` — ⚪ Interno
+- `setDataAcredStr()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getLugarCentre()` — ⚪ Interno
+- `setLugarCentre()` — ⚪ Interno
+- `getNomCentreCas()` — ⚪ Interno
+- `setNomCentreCas()` — ⚪ Interno
+- `getNomCentreVal()` — ⚪ Interno
+- `setNomCentreVal()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AnyDimensioDTO` <a name='anydimensiodto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\AnyDimensioDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `AnyDimensioDTO()` — ⚪ Interno
+- `AnyDimensioDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Calendari` <a name='calendari'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Calendari.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Calendari()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `getIdCalendari()` — ⚪ Interno
+- `setIdCalendari()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `getDataStr()` — ⚪ Interno
+- `setDataStr()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `setTitulacions()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `setCentres()` — ⚪ Interno
+- `getColor()` — ⚪ Interno
+- `setColor()` — ⚪ Interno
+- `getStatus()` — ⚪ Interno
+- `setStatus()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Categoria` <a name='categoria'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Categoria.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Categoria()` — ⚪ Interno
+- `Categoria()` — ⚪ Interno
+- `getIdCategoria()` — ⚪ Interno
+- `setIdCategoria()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getPare()` — ⚪ Interno
+- `setPare()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaDocumentDTO` <a name='categoriadocumentdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\CategoriaDocumentDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaPareDTO` <a name='categoriaparedto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\CategoriaPareDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `CategoriaPareDTO()` — ⚪ Interno
+- `CategoriaPareDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Datasource` <a name='datasource'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Datasource.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Datasource()` — ⚪ Interno
+- `Datasource()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getDriver()` — ⚪ Interno
+- `setDriver()` — ⚪ Interno
+- `getConn()` — ⚪ Interno
+- `setConn()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DimensioInstanciesDTO` <a name='dimensioinstanciesdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DimensioInstanciesDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DimensioInstanciesDTO()` — ⚪ Interno
+- `DimensioInstanciesDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Indicador` <a name='indicador'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CursoValor` <a name='cursovalor'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Dimension` <a name='dimension'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Dimension.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Dimension()` — ⚪ Interno
+- `Dimension()` — ⚪ Interno
+- `getTitulacion()` — ⚪ Interno
+- `setTitulacion()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicadores()` — ⚪ Interno
+- `setIndicadores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `set()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `newIndicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `isEmpty()` — ⚪ Interno
+- `size()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `addSubindicador()` — ⚪ Interno
+- `getSubindicadores()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setCurso()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Document` <a name='document'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Document.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdDocument()` — ⚪ Interno
+- `setIdDocument()` — ⚪ Interno
+- `getCategoria()` — ⚪ Interno
+- `setCategoria()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getRuta()` — ⚪ Interno
+- `setRuta()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `isVisible()` — ⚪ Interno
+- `setVisible()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentDTO` <a name='documentdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DocumentDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getRuta()` — ⚪ Interno
+- `setRuta()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentTemplate` <a name='documenttemplate'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DocumentTemplate.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DocumentTemplate()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `getLogo()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DummyDataTransfer` <a name='dummydatatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\DummyDataTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getValue()` — ⚪ Interno
+- `setValue()` — ⚪ Interno
+- `getText2()` — ⚪ Interno
+- `setText2()` — ⚪ Interno
+- `getValue2()` — ⚪ Interno
+- `setValue2()` — ⚪ Interno
+- `getText3()` — ⚪ Interno
+- `setText3()` — ⚪ Interno
+- `getValue3()` — ⚪ Interno
+- `setValue3()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Email` <a name='email'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Email.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getUsusari()` — ⚪ Interno
+- `setUsusari()` — ⚪ Interno
+- `getInstanciaTasca()` — ⚪ Interno
+- `setInstanciaTasca()` — ⚪ Interno
+- `getTo()` — ⚪ Interno
+- `setTo()` — ⚪ Interno
+- `getSubject()` — ⚪ Interno
+- `setSubject()` — ⚪ Interno
+- `getBody()` — ⚪ Interno
+- `setBody()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquesta` <a name='evidenciaindicadorenquesta'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaIndicadorEnquesta.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EvidenciaIndicadorEnquesta()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getMedia()` — ⚪ Interno
+- `setMedia()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquestaPK` <a name='evidenciaindicadorenquestapk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaIndicadorEnquestaPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EvidenciaIndicadorEnquestaPK()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaTransfer` <a name='evidenciatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\EvidenciaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getIdTascai()` — ⚪ Interno
+- `setIdTascai()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Grafica` <a name='grafica'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Grafica.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Grafica()` — ⚪ Interno
+- `getIdGrafica()` — ⚪ Interno
+- `setIdGrafica()` — ⚪ Interno
+- `getDimensio()` — ⚪ Interno
+- `setDimensio()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getG()` — ⚪ Interno
+- `setG()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getUnitats()` — ⚪ Interno
+- `setUnitats()` — ⚪ Interno
+- `isNegar()` — ⚪ Interno
+- `setNegar()` — ⚪ Interno
+- `isLikert()` — ⚪ Interno
+- `setLikert()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `GraficaPK` <a name='graficapk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\GraficaPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `GraficaPK()` — ⚪ Interno
+- `getIdGrafica()` — ⚪ Interno
+- `setIdGrafica()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Indicador` <a name='indicador'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Indicador.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `setValores()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `obtenerValor()` — ⚪ Interno
+- `maxCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getPeriodo()` — ⚪ Interno
+- `setPeriodo()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CursoValor` <a name='cursovalor'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Indicador.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `getDimension()` — ⚪ Interno
+- `setDimension()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getValores()` — ⚪ Interno
+- `setValores()` — ⚪ Interno
+- `addCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `obtenerValor()` — ⚪ Interno
+- `maxCursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getPeriodo()` — ⚪ Interno
+- `setPeriodo()` — ⚪ Interno
+- `getCurso()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquesta` <a name='indicadorenquesta'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\IndicadorEnquesta.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorEnquesta()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getCursd()` — ⚪ Interno
+- `setCursd()` — ⚪ Interno
+- `getCursEnquesta()` — ⚪ Interno
+- `setCursEnquesta()` — ⚪ Interno
+- `getCentreOrigen()` — ⚪ Interno
+- `setCentreOrigen()` — ⚪ Interno
+- `getTitulacioOrigen()` — ⚪ Interno
+- `setTitulacioOrigen()` — ⚪ Interno
+- `getNenq()` — ⚪ Interno
+- `setNenq()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaTmp` <a name='indicadorenquestatmp'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\IndicadorEnquestaTmp.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorEnquestaTmp()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getCurs()` — ⚪ Interno
+- `setCurs()` — ⚪ Interno
+- `getEnquesta()` — ⚪ Interno
+- `setEnquesta()` — ⚪ Interno
+- `getIndicador()` — ⚪ Interno
+- `setIndicador()` — ⚪ Interno
+- `getValor()` — ⚪ Interno
+- `setValor()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEstudi()` — ⚪ Interno
+- `setEstudi()` — ⚪ Interno
+- `getCursd()` — ⚪ Interno
+- `setCursd()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getCursEnquesta()` — ⚪ Interno
+- `setCursEnquesta()` — ⚪ Interno
+- `getCentreOrigen()` — ⚪ Interno
+- `setCentreOrigen()` — ⚪ Interno
+- `getTitulacioOrigen()` — ⚪ Interno
+- `setTitulacioOrigen()` — ⚪ Interno
+- `getNenq()` — ⚪ Interno
+- `setNenq()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Informe` <a name='informe'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Informe.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Informe()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `isCombinat()` — ⚪ Interno
+- `setCombinat()` — ⚪ Interno
+- `getGrupWeb()` — ⚪ Interno
+- `setGrupWeb()` — ⚪ Interno
+- `getProcessos()` — ⚪ Interno
+- `setProcessos()` — ⚪ Interno
+- `getOrdre()` — ⚪ Interno
+- `setOrdre()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeProcesPK` <a name='informeprocespk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InformeProcesPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InformeProcesPK()` — ⚪ Interno
+- `InformeProcesPK()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeProcessos` <a name='informeprocessos'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InformeProcessos.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InformeProcessos()` — ⚪ Interno
+- `getIdInforme()` — ⚪ Interno
+- `setIdInforme()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Instancia` <a name='instancia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Instancia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Instancia()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getInstanciaTasca()` — ⚪ Interno
+- `setInstanciaTasca()` — ⚪ Interno
+- `addInstanciaTasca()` — ⚪ Interno
+- `removeInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaDTO` <a name='instanciadto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaDTO()` — ⚪ Interno
+- `InstanciaDTO()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getDescVal()` — ⚪ Interno
+- `setDescVal()` — ⚪ Interno
+- `getDescCas()` — ⚪ Interno
+- `setDescCas()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaGanttDTO` <a name='instanciaganttdto'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaGanttDTO.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaGanttDTO()` — ⚪ Interno
+- `InstanciaGanttDTO()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getName()` — ⚪ Interno
+- `setName()` — ⚪ Interno
+- `getStart()` — ⚪ Interno
+- `setStart()` — ⚪ Interno
+- `getEnd()` — ⚪ Interno
+- `setEnd()` — ⚪ Interno
+- `getProgress()` — ⚪ Interno
+- `setProgress()` — ⚪ Interno
+- `getCustom_class()` — ⚪ Interno
+- `setCustom_class()` — ⚪ Interno
+- `getDependencies()` — ⚪ Interno
+- `setDependencies()` — ⚪ Interno
+- `getType()` — ⚪ Interno
+- `setType()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `FROM` <a name='from'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaRepository.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAllIds()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findOlders()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findOlders()` — ⚪ Interno
+- `findByIdProces()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findByOrganCursNom()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `findByCentreCursNom()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `MAX()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `MAX()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `EXTRACT()` — ⚪ Interno
+- `EXTRACT()` — ⚪ Interno
+- `findByOrganBetweenCurs()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `filterSupervisables()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `filterSupervisable()` — ⚪ Interno
+- `FROM()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `filterSupervisablesByEvidencies()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateT()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateC()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `instantiateU()` — ⚪ Interno
+- `AS()` — ⚪ Interno
+- `tasquesi()` — ⚪ Interno
+- `instantiateTasks()` — ⚪ Interno
+- `IN()` — ⚪ Interno
+- `activateInstantiatedTask()` — ⚪ Interno
+- `deleteInstance()` — ⚪ Interno
+- `clearInstance()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getName()` — ⚪ Interno
+- `getTitCas()` — ⚪ Interno
+- `getTitVal()` — ⚪ Interno
+- `getStart()` — ⚪ Interno
+- `getEnd()` — ⚪ Interno
+- `getProgress()` — ⚪ Interno
+- `getCustom_class()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTasca` <a name='instanciatasca'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTasca.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTasca()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+- `getVersion()` — ⚪ Interno
+- `setVersion()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getInstancia()` — ⚪ Interno
+- `setInstancia()` — ⚪ Interno
+- `getTasca()` — ⚪ Interno
+- `setTasca()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaTransfer` <a name='instanciatascatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getIdTascap()` — ⚪ Interno
+- `setIdTascap()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getDataLim()` — ⚪ Interno
+- `setDataLim()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getIsAssignedToUser()` — ⚪ Interno
+- `setAssignedToUser()` — ⚪ Interno
+- `getIsExpired()` — ⚪ Interno
+- `setIsExpired()` — ⚪ Interno
+- `getIdTasca()` — ⚪ Interno
+- `setIdTasca()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getEvidencia()` — ⚪ Interno
+- `setEvidencia()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getOldEvidences()` — ⚪ Interno
+- `setOldEvidences()` — ⚪ Interno
+- `getDescripcioRolCas()` — ⚪ Interno
+- `setDescripcioRolCas()` — ⚪ Interno
+- `getDescripcioRolVal()` — ⚪ Interno
+- `setDescripcioRolVal()` — ⚪ Interno
+- `getVersions()` — ⚪ Interno
+- `setVersions()` — ⚪ Interno
+- `getEstatInstancia()` — ⚪ Interno
+- `setEstatInstancia()` — ⚪ Interno
+- `getOpcions()` — ⚪ Interno
+- `setOpcions()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVer` <a name='instanciatascaver'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTascaVer()` — ⚪ Interno
+- `InstanciaTascaVer()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVerPK` <a name='instanciatascaverpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVerPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `InstanciaTascaVerPK()` — ⚪ Interno
+- `InstanciaTascaVerPK()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getdataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVersioTransfer` <a name='instanciatascaversiotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTascaVersioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTransfer` <a name='instanciatransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\InstanciaTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getCentreCas()` — ⚪ Interno
+- `setCentreCas()` — ⚪ Interno
+- `getCentreVal()` — ⚪ Interno
+- `setCentreVal()` — ⚪ Interno
+- `getTitulacioCas()` — ⚪ Interno
+- `setTitulacioCas()` — ⚪ Interno
+- `getTitulacioVal()` — ⚪ Interno
+- `setTitulacioVal()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getCursAvaluat()` — ⚪ Interno
+- `setCursAvaluat()` — ⚪ Interno
+- `getCursActivacio()` — ⚪ Interno
+- `setCursActivacio()` — ⚪ Interno
+- `getNomTascaActivaCas()` — ⚪ Interno
+- `setNomTascaActivaCas()` — ⚪ Interno
+- `getDataTascaActiva()` — ⚪ Interno
+- `setDataTascaActiva()` — ⚪ Interno
+- `getDataLimTascaActiva()` — ⚪ Interno
+- `setDataLimTascaActiva()` — ⚪ Interno
+- `getNomTascaActivaVal()` — ⚪ Interno
+- `setNomTascaActivaVal()` — ⚪ Interno
+- `getDescTascaActivaCas()` — ⚪ Interno
+- `setDescTascaActivaCas()` — ⚪ Interno
+- `getDescTascaActivaVal()` — ⚪ Interno
+- `setDescTascaActivaVal()` — ⚪ Interno
+- `getIdTascapActiva()` — ⚪ Interno
+- `setIdTascapActiva()` — ⚪ Interno
+- `getTascaActivaExpired()` — ⚪ Interno
+- `setTascaActivaExpired()` — ⚪ Interno
+- `getTascaActivaAssignedToUser()` — ⚪ Interno
+- `setTascaActivaAssignedToUser()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Link` <a name='link'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Link.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Link()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getToken()` — ⚪ Interno
+- `setToken()` — ⚪ Interno
+- `getLink()` — ⚪ Interno
+- `setLink()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataExp()` — ⚪ Interno
+- `setDataExp()` — ⚪ Interno
+- `getVisites()` — ⚪ Interno
+- `setVisites()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Noticia` <a name='noticia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Noticia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Noticia()` — ⚪ Interno
+- `getIdNoticia()` — ⚪ Interno
+- `setIdNoticia()` — ⚪ Interno
+- `getTextoC()` — ⚪ Interno
+- `setTextoC()` — ⚪ Interno
+- `getTextoV()` — ⚪ Interno
+- `setTextoV()` — ⚪ Interno
+- `getTituloC()` — ⚪ Interno
+- `setTituloC()` — ⚪ Interno
+- `getTituloV()` — ⚪ Interno
+- `setTituloV()` — ⚪ Interno
+- `getVisible()` — ⚪ Interno
+- `setVisible()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Organ` <a name='organ'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Organ.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Organ()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `setId()` — ⚪ Interno
+- `getActiu()` — ⚪ Interno
+- `setActiu()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getRuct()` — ⚪ Interno
+- `setRuct()` — ⚪ Interno
+- `getTambit()` — ⚪ Interno
+- `setTambit()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getOrgansFill()` — ⚪ Interno
+- `addOrganFill()` — ⚪ Interno
+- `removeOrganFill()` — ⚪ Interno
+- `setOrgansFill()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuarisRols()` — ⚪ Interno
+- `addUsuarisRol()` — ⚪ Interno
+- `removeUsuarisRol()` — ⚪ Interno
+- `getAcreditacio()` — ⚪ Interno
+- `setAcreditacio()` — ⚪ Interno
+- `getCodis()` — ⚪ Interno
+- `setCodis()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganEquivalent` <a name='organequivalent'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganEquivalent.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganEquivalent()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getTlugarEq()` — ⚪ Interno
+- `setTlugarEq()` — ⚪ Interno
+- `getLugarEq()` — ⚪ Interno
+- `setLugarEq()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganEquivalentPK` <a name='organequivalentpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganEquivalentPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganEquivalentPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getTlugarEq()` — ⚪ Interno
+- `setTlugarEq()` — ⚪ Interno
+- `getLugarEq()` — ⚪ Interno
+- `setLugarEq()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganPK` <a name='organpk'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\OrganPK.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `OrganPK()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Plantilla` <a name='plantilla'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Plantilla.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdPlantilla()` — ⚪ Interno
+- `setIdPlantilla()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getCodi()` — ⚪ Interno
+- `setCodi()` — ⚪ Interno
+- `getNomCas()` — ⚪ Interno
+- `setNomCas()` — ⚪ Interno
+- `getNomVal()` — ⚪ Interno
+- `setNomVal()` — ⚪ Interno
+- `getData_creacio()` — ⚪ Interno
+- `setData_creacio()` — ⚪ Interno
+- `getData_mod()` — ⚪ Interno
+- `setData_mod()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getSerialversionuid()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaComentario` <a name='plantillacomentario'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\PlantillaComentario.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `PlantillaComentario()` — ⚪ Interno
+- `PlantillaComentario()` — ⚪ Interno
+- `getUid()` — ⚪ Interno
+- `setUid()` — ⚪ Interno
+- `getAuthor()` — ⚪ Interno
+- `setAuthor()` — ⚪ Interno
+- `getAuthorName()` — ⚪ Interno
+- `setAuthorName()` — ⚪ Interno
+- `getContent()` — ⚪ Interno
+- `setContent()` — ⚪ Interno
+- `getCreatedAt()` — ⚪ Interno
+- `setCreatedAt()` — ⚪ Interno
+- `getModifiedAt()` — ⚪ Interno
+- `setModifiedAt()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaConversation` <a name='plantillaconversation'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\PlantillaConversation.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `PlantillaConversation()` — ⚪ Interno
+- `PlantillaConversation()` — ⚪ Interno
+- `getUid()` — ⚪ Interno
+- `setUid()` — ⚪ Interno
+- `getComments()` — ⚪ Interno
+- `setComments()` — ⚪ Interno
+- `add()` — ⚪ Interno
+- `addAll()` — ⚪ Interno
+- `addAll()` — ⚪ Interno
+- `clear()` — ⚪ Interno
+- `contains()` — ⚪ Interno
+- `get()` — ⚪ Interno
+- `remove()` — ⚪ Interno
+- `size()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Proces` <a name='proces'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Proces.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Proces()` — ⚪ Interno
+- `getIdProces()` — ⚪ Interno
+- `setIdProces()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getCursActivacio()` — ⚪ Interno
+- `setCursActivacio()` — ⚪ Interno
+- `getCursAvaluat()` — ⚪ Interno
+- `setCursAvaluat()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getComentaris()` — ⚪ Interno
+- `setComentaris()` — ⚪ Interno
+- `getVersio()` — ⚪ Interno
+- `setVersio()` — ⚪ Interno
+- `getSubTitol()` — ⚪ Interno
+- `setSubTitol()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `getTasques()` — ⚪ Interno
+- `setTasques()` — ⚪ Interno
+- `addTasca()` — ⚪ Interno
+- `removeTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Rol` <a name='rol'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Rol.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Rol()` — ⚪ Interno
+- `getIdRol()` — ⚪ Interno
+- `setIdRol()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getNomRol()` — ⚪ Interno
+- `setNomRol()` — ⚪ Interno
+- `getTasques()` — ⚪ Interno
+- `setTasques()` — ⚪ Interno
+- `addTasque()` — ⚪ Interno
+- `removeTasque()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuarisRols()` — ⚪ Interno
+- `addUsuarisRol()` — ⚪ Interno
+- `removeUsuarisRol()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ScheduledTasks` <a name='scheduledtasks'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\ScheduledTasks.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `sendInstanceMails()` — ⚪ Interno
+- `sendReminderMails()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `sendCalendarMails()` — ⚪ Interno
+- `closeExpiredTasks()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SupervisionSearchParams` <a name='supervisionsearchparams'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\SupervisionSearchParams.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `SupervisionSearchParams()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `setCentres()` — ⚪ Interno
+- `getCursos()` — ⚪ Interno
+- `setCursos()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `setTitulacions()` — ⚪ Interno
+- `getProcediments()` — ⚪ Interno
+- `setProcediments()` — ⚪ Interno
+- `getEvidencies()` — ⚪ Interno
+- `setEvidencies()` — ⚪ Interno
+- `getSearchType()` — ⚪ Interno
+- `setSearchType()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SysStatus` <a name='sysstatus'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\SysStatus.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIdStatus()` — ⚪ Interno
+- `setIdStatus()` — ⚪ Interno
+- `getTimestamp()` — ⚪ Interno
+- `setTimestamp()` — ⚪ Interno
+- `getType()` — ⚪ Interno
+- `setType()` — ⚪ Interno
+- `getMsg()` — ⚪ Interno
+- `setMsg()` — ⚪ Interno
+- `getErr()` — ⚪ Interno
+- `setErr()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Tasca` <a name='tasca'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Tasca.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Tasca()` — ⚪ Interno
+- `getIdTasca()` — ⚪ Interno
+- `setIdTasca()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getDataLim()` — ⚪ Interno
+- `setDataLim()` — ⚪ Interno
+- `getDescripcioCas()` — ⚪ Interno
+- `setDescripcioCas()` — ⚪ Interno
+- `getDescripcioVal()` — ⚪ Interno
+- `setDescripcioVal()` — ⚪ Interno
+- `getIdTascaSeg()` — ⚪ Interno
+- `setIdTascaSeg()` — ⚪ Interno
+- `getIdTascaSeg2()` — ⚪ Interno
+- `setIdTascaSeg2()` — ⚪ Interno
+- `getIdTascap()` — ⚪ Interno
+- `setIdTascap()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getTitolCas()` — ⚪ Interno
+- `setTitolCas()` — ⚪ Interno
+- `getTitolVal()` — ⚪ Interno
+- `setTitolVal()` — ⚪ Interno
+- `getProces()` — ⚪ Interno
+- `setProces()` — ⚪ Interno
+- `getRol()` — ⚪ Interno
+- `setRol()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getInstancies()` — ⚪ Interno
+- `setInstancies()` — ⚪ Interno
+- `addInstancia()` — ⚪ Interno
+- `removeInstancia()` — ⚪ Interno
+- `isExpired()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `setOpcions()` — ⚪ Interno
+- `getOpcions()` — ⚪ Interno
+- `setInforme()` — ⚪ Interno
+- `getInforme()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TascaVersioTransfer` <a name='tascaversiotransfer'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TascaVersioTransfer.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TascaVersioTransfer()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+- `getUsuariFet()` — ⚪ Interno
+- `setUsuariFet()` — ⚪ Interno
+- `getDataFet()` — ⚪ Interno
+- `setDataFet()` — ⚪ Interno
+- `getVersion()` — ⚪ Interno
+- `setVersion()` — ⚪ Interno
+- `getNomEvidenciaVal()` — ⚪ Interno
+- `setNomEvidenciaVal()` — ⚪ Interno
+- `getNomEvidenciaCas()` — ⚪ Interno
+- `setNomEvidenciaCas()` — ⚪ Interno
+- `getCodiEvidencia()` — ⚪ Interno
+- `setCodiEvidencia()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Tipus` <a name='tipus'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Tipus.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Tipus()` — ⚪ Interno
+- `getTipus()` — ⚪ Interno
+- `setTipus()` — ⚪ Interno
+- `getDescripcio()` — ⚪ Interno
+- `setDescripcio()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOAny` <a name='treedtoany'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOAny.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOAny()` — ⚪ Interno
+- `TreeDTOAny()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTODimensio` <a name='treedtodimensio'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTODimensio.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTODimensio()` — ⚪ Interno
+- `TreeDTODimensio()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOInstancia` <a name='treedtoinstancia'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOInstancia.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOInstancia()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getIdInstancia()` — ⚪ Interno
+- `setIdInstancia()` — ⚪ Interno
+- `getCentre()` — ⚪ Interno
+- `setCentre()` — ⚪ Interno
+- `getEstat()` — ⚪ Interno
+- `setEstat()` — ⚪ Interno
+- `getTitulacio()` — ⚪ Interno
+- `setTitulacio()` — ⚪ Interno
+- `getTlugar()` — ⚪ Interno
+- `setTlugar()` — ⚪ Interno
+- `getLugar()` — ⚪ Interno
+- `setLugar()` — ⚪ Interno
+- `getNomProces()` — ⚪ Interno
+- `setNomProces()` — ⚪ Interno
+- `getDescVal()` — ⚪ Interno
+- `setDescVal()` — ⚪ Interno
+- `getDescCas()` — ⚪ Interno
+- `setDescCas()` — ⚪ Interno
+- `getAmbit()` — ⚪ Interno
+- `setAmbit()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getIdInstanciaTasca()` — ⚪ Interno
+- `setIdInstanciaTasca()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TreeDTOOrgan` <a name='treedtoorgan'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\TreeDTOOrgan.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getChildren()` — ⚪ Interno
+- `setChildren()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Usuari` <a name='usuari'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Usuari.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Usuari()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+- `getClau()` — ⚪ Interno
+- `setClau()` — ⚪ Interno
+- `getCognoms()` — ⚪ Interno
+- `setCognoms()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getLdap()` — ⚪ Interno
+- `setLdap()` — ⚪ Interno
+- `getNom()` — ⚪ Interno
+- `setNom()` — ⚪ Interno
+- `getDataUltim()` — ⚪ Interno
+- `setDataUltim()` — ⚪ Interno
+- `getLocale()` — ⚪ Interno
+- `setLocale()` — ⚪ Interno
+- `getInstanciesTasques()` — ⚪ Interno
+- `setInstanciesTasques()` — ⚪ Interno
+- `addInstanciaTasca()` — ⚪ Interno
+- `removeInstanciaTasca()` — ⚪ Interno
+- `getUsuarisRols()` — ⚪ Interno
+- `setUsuariRols()` — ⚪ Interno
+- `addRol()` — ⚪ Interno
+- `removeRol()` — ⚪ Interno
+- `isGranted()` — ⚪ Interno
+- `setGranted()` — ⚪ Interno
+- `isAdmin()` — ⚪ Interno
+- `setAdmin()` — ⚪ Interno
+- `isDataTest()` — ⚪ Interno
+- `setDataTest()` — ⚪ Interno
+- `equals()` — ⚪ Interno
+- `hashCode()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuarisRol` <a name='usuarisrol'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\UsuarisRol.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `UsuarisRol()` — ⚪ Interno
+- `getIdUsuariRol()` — ⚪ Interno
+- `setIdUsuariRol()` — ⚪ Interno
+- `getFin()` — ⚪ Interno
+- `setFin()` — ⚪ Interno
+- `getInici()` — ⚪ Interno
+- `setInici()` — ⚪ Interno
+- `getNum()` — ⚪ Interno
+- `setNum()` — ⚪ Interno
+- `getSupervisor()` — ⚪ Interno
+- `setSupervisor()` — ⚪ Interno
+- `getVigent()` — ⚪ Interno
+- `setVigent()` — ⚪ Interno
+- `getOrgan()` — ⚪ Interno
+- `setOrgan()` — ⚪ Interno
+- `getRol()` — ⚪ Interno
+- `setRol()` — ⚪ Interno
+- `getUsuari()` — ⚪ Interno
+- `setUsuari()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `Wiki` <a name='wiki'></a>
+**Ubicación:** `src\main\java\es\uv\saic\domain\Wiki.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `Wiki()` — ⚪ Interno
+- `getIdWiki()` — ⚪ Interno
+- `setIdWiki()` — ⚪ Interno
+- `getData()` — ⚪ Interno
+- `setData()` — ⚪ Interno
+- `getDataMod()` — ⚪ Interno
+- `setDataMod()` — ⚪ Interno
+- `getText()` — ⚪ Interno
+- `setText()` — ⚪ Interno
+- `getCategoria()` — ⚪ Interno
+- `setCategoria()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 64
+- Total de métodos: 1118
+- Total de comentarios: 0
+
+✅ **Fin del reporte de carpeta.**

+ 143 - 0
reporte_general.md

@@ -0,0 +1,143 @@
+# 🧾 Reporte General de Clases Java
+
+> Control de revisión y estructura por carpetas
+
+
+## 📂 Carpeta: `config`
+
+- [`ApplicationLocaleResolver`](reporte_config.md#-clase-applicationlocaleresolver-) — ⚠️ *Pendiente*
+- [`AuthSuccessHandler`](reporte_config.md#-clase-authsuccesshandler-) — ⚠️ *Pendiente*
+- [`Globals`](reporte_config.md#-clase-globals-) — ⚠️ *Pendiente*
+- [`SchedulerConfig`](reporte_config.md#-clase-schedulerconfig-) — ⚠️ *Pendiente*
+- [`SecurityConfig`](reporte_config.md#-clase-securityconfig-) — ⚠️ *Pendiente*
+- [`WebConfig`](reporte_config.md#-clase-webconfig-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `domain`
+
+- [`Acreditacio`](reporte_domain.md#-clase-acreditacio-) — ⚠️ *Pendiente*
+- [`AcreditacioPK`](reporte_domain.md#-clase-acreditaciopk-) — ⚠️ *Pendiente*
+- [`AcreditacioTransfer`](reporte_domain.md#-clase-acreditaciotransfer-) — ⚠️ *Pendiente*
+- [`AnyDimensioDTO`](reporte_domain.md#-clase-anydimensiodto-) — ⚠️ *Pendiente*
+- [`Calendari`](reporte_domain.md#-clase-calendari-) — ⚠️ *Pendiente*
+- [`Categoria`](reporte_domain.md#-clase-categoria-) — ⚠️ *Pendiente*
+- [`CategoriaDocumentDTO`](reporte_domain.md#-clase-categoriadocumentdto-) — ⚠️ *Pendiente*
+- [`CategoriaPareDTO`](reporte_domain.md#-clase-categoriaparedto-) — ⚠️ *Pendiente*
+- [`Datasource`](reporte_domain.md#-clase-datasource-) — ⚠️ *Pendiente*
+- [`DimensioInstanciesDTO`](reporte_domain.md#-clase-dimensioinstanciesdto-) — ⚠️ *Pendiente*
+- [`Indicador`](reporte_domain.md#-clase-indicador-) — ⚠️ *Pendiente*
+- [`CursoValor`](reporte_domain.md#-clase-cursovalor-) — ⚠️ *Pendiente*
+- [`Dimension`](reporte_domain.md#-clase-dimension-) — ⚠️ *Pendiente*
+- [`Document`](reporte_domain.md#-clase-document-) — ⚠️ *Pendiente*
+- [`DocumentDTO`](reporte_domain.md#-clase-documentdto-) — ⚠️ *Pendiente*
+- [`DocumentTemplate`](reporte_domain.md#-clase-documenttemplate-) — ⚠️ *Pendiente*
+- [`DummyDataTransfer`](reporte_domain.md#-clase-dummydatatransfer-) — ⚠️ *Pendiente*
+- [`Email`](reporte_domain.md#-clase-email-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquesta`](reporte_domain.md#-clase-evidenciaindicadorenquesta-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquestaPK`](reporte_domain.md#-clase-evidenciaindicadorenquestapk-) — ⚠️ *Pendiente*
+- [`EvidenciaTransfer`](reporte_domain.md#-clase-evidenciatransfer-) — ⚠️ *Pendiente*
+- [`Grafica`](reporte_domain.md#-clase-grafica-) — ⚠️ *Pendiente*
+- [`GraficaPK`](reporte_domain.md#-clase-graficapk-) — ⚠️ *Pendiente*
+- [`Indicador`](reporte_domain.md#-clase-indicador-) — ⚠️ *Pendiente*
+- [`CursoValor`](reporte_domain.md#-clase-cursovalor-) — ⚠️ *Pendiente*
+- [`IndicadorEnquesta`](reporte_domain.md#-clase-indicadorenquesta-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaTmp`](reporte_domain.md#-clase-indicadorenquestatmp-) — ⚠️ *Pendiente*
+- [`Informe`](reporte_domain.md#-clase-informe-) — ⚠️ *Pendiente*
+- [`InformeProcesPK`](reporte_domain.md#-clase-informeprocespk-) — ⚠️ *Pendiente*
+- [`InformeProcessos`](reporte_domain.md#-clase-informeprocessos-) — ⚠️ *Pendiente*
+- [`Instancia`](reporte_domain.md#-clase-instancia-) — ⚠️ *Pendiente*
+- [`InstanciaDTO`](reporte_domain.md#-clase-instanciadto-) — ⚠️ *Pendiente*
+- [`InstanciaGanttDTO`](reporte_domain.md#-clase-instanciaganttdto-) — ⚠️ *Pendiente*
+- [`FROM`](reporte_domain.md#-clase-from-) — ⚠️ *Pendiente*
+- [`InstanciaTasca`](reporte_domain.md#-clase-instanciatasca-) — ⚠️ *Pendiente*
+- [`InstanciaTascaTransfer`](reporte_domain.md#-clase-instanciatascatransfer-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVer`](reporte_domain.md#-clase-instanciatascaver-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVerPK`](reporte_domain.md#-clase-instanciatascaverpk-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVersioTransfer`](reporte_domain.md#-clase-instanciatascaversiotransfer-) — ⚠️ *Pendiente*
+- [`InstanciaTransfer`](reporte_domain.md#-clase-instanciatransfer-) — ⚠️ *Pendiente*
+- [`Link`](reporte_domain.md#-clase-link-) — ⚠️ *Pendiente*
+- [`Noticia`](reporte_domain.md#-clase-noticia-) — ⚠️ *Pendiente*
+- [`Organ`](reporte_domain.md#-clase-organ-) — ⚠️ *Pendiente*
+- [`OrganEquivalent`](reporte_domain.md#-clase-organequivalent-) — ⚠️ *Pendiente*
+- [`OrganEquivalentPK`](reporte_domain.md#-clase-organequivalentpk-) — ⚠️ *Pendiente*
+- [`OrganPK`](reporte_domain.md#-clase-organpk-) — ⚠️ *Pendiente*
+- [`Plantilla`](reporte_domain.md#-clase-plantilla-) — ⚠️ *Pendiente*
+- [`PlantillaComentario`](reporte_domain.md#-clase-plantillacomentario-) — ⚠️ *Pendiente*
+- [`PlantillaConversation`](reporte_domain.md#-clase-plantillaconversation-) — ⚠️ *Pendiente*
+- [`Proces`](reporte_domain.md#-clase-proces-) — ⚠️ *Pendiente*
+- [`Rol`](reporte_domain.md#-clase-rol-) — ⚠️ *Pendiente*
+- [`ScheduledTasks`](reporte_domain.md#-clase-scheduledtasks-) — ⚠️ *Pendiente*
+- [`SupervisionSearchParams`](reporte_domain.md#-clase-supervisionsearchparams-) — ⚠️ *Pendiente*
+- [`SysStatus`](reporte_domain.md#-clase-sysstatus-) — ⚠️ *Pendiente*
+- [`Tasca`](reporte_domain.md#-clase-tasca-) — ⚠️ *Pendiente*
+- [`TascaVersioTransfer`](reporte_domain.md#-clase-tascaversiotransfer-) — ⚠️ *Pendiente*
+- [`Tipus`](reporte_domain.md#-clase-tipus-) — ⚠️ *Pendiente*
+- [`TreeDTOAny`](reporte_domain.md#-clase-treedtoany-) — ⚠️ *Pendiente*
+- [`TreeDTODimensio`](reporte_domain.md#-clase-treedtodimensio-) — ⚠️ *Pendiente*
+- [`TreeDTOInstancia`](reporte_domain.md#-clase-treedtoinstancia-) — ⚠️ *Pendiente*
+- [`TreeDTOOrgan`](reporte_domain.md#-clase-treedtoorgan-) — ⚠️ *Pendiente*
+- [`Usuari`](reporte_domain.md#-clase-usuari-) — ⚠️ *Pendiente*
+- [`UsuarisRol`](reporte_domain.md#-clase-usuarisrol-) — ⚠️ *Pendiente*
+- [`Wiki`](reporte_domain.md#-clase-wiki-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `service`
+
+- [`AcreditacioService`](reporte_service.md#-clase-acreditacioservice-) — ⚠️ *Pendiente*
+- [`AuthProvider`](reporte_service.md#-clase-authprovider-) — ⚠️ *Pendiente*
+- [`CalendariService`](reporte_service.md#-clase-calendariservice-) — ⚠️ *Pendiente*
+- [`CategoriaService`](reporte_service.md#-clase-categoriaservice-) — ⚠️ *Pendiente*
+- [`DataService`](reporte_service.md#-clase-dataservice-) — ⚠️ *Pendiente*
+- [`DatasourceService`](reporte_service.md#-clase-datasourceservice-) — ⚠️ *Pendiente*
+- [`DocumentService`](reporte_service.md#-clase-documentservice-) — ⚠️ *Pendiente*
+- [`EmailService`](reporte_service.md#-clase-emailservice-) — ⚠️ *Pendiente*
+- [`EvidenciaIndicadorEnquestaService`](reporte_service.md#-clase-evidenciaindicadorenquestaservice-) — ⚠️ *Pendiente*
+- [`GraficaService`](reporte_service.md#-clase-graficaservice-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaService`](reporte_service.md#-clase-indicadorenquestaservice-) — ⚠️ *Pendiente*
+- [`IndicadorEnquestaTmpService`](reporte_service.md#-clase-indicadorenquestatmpservice-) — ⚠️ *Pendiente*
+- [`IndicadorService`](reporte_service.md#-clase-indicadorservice-) — ⚠️ *Pendiente*
+- [`InformeService`](reporte_service.md#-clase-informeservice-) — ⚠️ *Pendiente*
+- [`InstanciaService`](reporte_service.md#-clase-instanciaservice-) — ⚠️ *Pendiente*
+- [`InstanciaTascaService`](reporte_service.md#-clase-instanciatascaservice-) — ⚠️ *Pendiente*
+- [`InstanciaTascaVerService`](reporte_service.md#-clase-instanciatascaverservice-) — ⚠️ *Pendiente*
+- [`LinkService`](reporte_service.md#-clase-linkservice-) — ⚠️ *Pendiente*
+- [`NoticiaService`](reporte_service.md#-clase-noticiaservice-) — ⚠️ *Pendiente*
+- [`OrganService`](reporte_service.md#-clase-organservice-) — ⚠️ *Pendiente*
+- [`ParserService`](reporte_service.md#-clase-parserservice-) — ⚠️ *Pendiente*
+- [`PlantillaService`](reporte_service.md#-clase-plantillaservice-) — ⚠️ *Pendiente*
+- [`ProcesService`](reporte_service.md#-clase-processervice-) — ⚠️ *Pendiente*
+- [`RolService`](reporte_service.md#-clase-rolservice-) — ⚠️ *Pendiente*
+- [`SysStatusService`](reporte_service.md#-clase-sysstatusservice-) — ⚠️ *Pendiente*
+- [`TascaService`](reporte_service.md#-clase-tascaservice-) — ⚠️ *Pendiente*
+- [`TipusService`](reporte_service.md#-clase-tipusservice-) — ⚠️ *Pendiente*
+- [`UsuariService`](reporte_service.md#-clase-usuariservice-) — ⚠️ *Pendiente*
+- [`UsuarisRolService`](reporte_service.md#-clase-usuarisrolservice-) — ⚠️ *Pendiente*
+- [`WikiService`](reporte_service.md#-clase-wikiservice-) — ⚠️ *Pendiente*
+
+## 📂 Carpeta: `web`
+
+- [`AdminController`](reporte_web.md#-clase-admincontroller-) — ⚠️ *Pendiente*
+- [`AjaxController`](reporte_web.md#-clase-ajaxcontroller-) — ⚠️ *Pendiente*
+- [`DashboardController`](reporte_web.md#-clase-dashboardcontroller-) — ⚠️ *Pendiente*
+- [`DataController`](reporte_web.md#-clase-datacontroller-) — ⚠️ *Pendiente*
+- [`DownloadController`](reporte_web.md#-clase-downloadcontroller-) — ⚠️ *Pendiente*
+- [`ExportController`](reporte_web.md#-clase-exportcontroller-) — ⚠️ *Pendiente*
+- [`IndexController`](reporte_web.md#-clase-indexcontroller-) — ⚠️ *Pendiente*
+- [`KeepAliveController`](reporte_web.md#-clase-keepalivecontroller-) — ⚠️ *Pendiente*
+- [`LoginController`](reporte_web.md#-clase-logincontroller-) — ⚠️ *Pendiente*
+- [`ManagersController`](reporte_web.md#-clase-managerscontroller-) — ⚠️ *Pendiente*
+- [`ParseController`](reporte_web.md#-clase-parsecontroller-) — ⚠️ *Pendiente*
+- [`ProceduresController`](reporte_web.md#-clase-procedurescontroller-) — ⚠️ *Pendiente*
+- [`ActiveSession`](reporte_web.md#-clase-activesession-) — ⚠️ *Pendiente*
+- [`PendingEmail`](reporte_web.md#-clase-pendingemail-) — ⚠️ *Pendiente*
+- [`StatsController`](reporte_web.md#-clase-statscontroller-) — ⚠️ *Pendiente*
+- [`SupervisionController`](reporte_web.md#-clase-supervisioncontroller-) — ⚠️ *Pendiente*
+- [`TestController`](reporte_web.md#-clase-testcontroller-) — ⚠️ *Pendiente*
+- [`WikiController`](reporte_web.md#-clase-wikicontroller-) — ⚠️ *Pendiente*
+
+# 📊 Resumen General
+
+- `config`: 6 clases, 37 métodos, 2 comentarios
+- `domain`: 64 clases, 1118 métodos, 0 comentarios
+- `service`: 30 clases, 438 métodos, 8 comentarios
+- `web`: 18 clases, 347 métodos, 112 comentarios
+
+**Total general:** 118 clases | 1940 métodos | 122 comentarios detectados**

+ 1420 - 0
reporte_service.md

@@ -0,0 +1,1420 @@
+# 📁 Reporte de carpeta: `service`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `AcreditacioService` <a name='acreditacioservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\AcreditacioService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getById()` — ⚪ Interno
+- `AcreditacioPK()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `getNextsCurrentYear()` — ⚪ Interno
+- `getByCursGrup()` — ⚪ Interno
+- `getByCursGrupTambit()` — ⚪ Interno
+- `getByCurs()` — ⚪ Interno
+- `getByOrgan()` — ⚪ Interno
+- `getByCentre()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AuthProvider` <a name='authprovider'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\AuthProvider.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `authenticate()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `UsernamePasswordAuthenticationToken()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `InitialDirContext()` — ⚪ Interno
+- `SearchControls()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `SimpleGrantedAuthority()` — ⚪ Interno
+- `UsernamePasswordAuthenticationToken()` — ⚪ Interno
+- `AuthenticationServiceException()` — ⚪ Interno
+- `BadCredentialsException()` — ⚪ Interno
+- `supports()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CalendariService` <a name='calendariservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\CalendariService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `getNextEvents()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `CategoriaService` <a name='categoriaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\CategoriaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findFirstLevel()` — ⚪ Interno
+- `findFirstLevelAndU()` — ⚪ Interno
+- `findByTipusTambit()` — ⚪ Interno
+- `findByTipusTambitAndU()` — ⚪ Interno
+- `findByPareTambit()` — ⚪ Interno
+- `findByPareTambitAndU()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DataService` <a name='dataservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DataService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DataService()` — ⚪ Interno
+- `doImport()` — ⚪ Interno
+- `StringBuilder()` — ⚪ Interno
+```
+/*  1) Comprobar columnas obligatorias  */
+List<String> mandatoryColumns = new ArrayList<String>();
+List<String> knownColumns = new ArrayList<String>();
+if(clau.equals("ruct")) {
+this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
+}
+else {
+this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
+}
+
+if(!this.checkColumns(header, mandatoryColumns, errors, locale)) {
+return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre.")).append("<br>").toString();
+}
+
+/*  2) Eliminar las columnas obligatorias, conocidas e ignoradas. El resto se consideran indicadores a importar */
+knownColumns.addAll(mandatoryColumns);
+knownColumns.addAll(ignoredColumns);
+for(String c : knownColumns) {
+headerInds.removeIf(v->v.equalsIgnoreCase(c));
+}
+
+/*  3) Comprobar valores y tipos  */
+if(!this.checkValues(records, ambit, clau, errors, locale)) {
+return errors.append(("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores en el fichero proporcionado. No se ha importado ningún registro. " : "S'han trobat errors al fitxer proporcionat. No s'ha importat cap registre."))).append("<br>").toString();
+}
+
+/*  4) Importar datos  */
+Integer numRecords = 0;
+Integer numTuples = 0;
+for (CSVRecord record : records) {
+Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
+recordMap.putAll(record.toMap());
+String c = ambit.equals("T") || ambit.equals("C") ? translateCentre(recordMap.get("centre")) : null;
+String t = ambit.equals("T") ? translateTitulacio(recordMap.get("titulacio")) : null;  
+String type = recordMap.get("tipus");
+Integer curs = Integer.parseInt(recordMap.get("curs").replaceAll("\\D+",""));
+
+String cursEnquesta = recordMap.containsKey("curs_enquesta") ? recordMap.get("curs_enquesta") : null;
+    String titulacioOrigen = recordMap.containsKey("titulacio_origen") ? recordMap.get("titulacio_origen") : null;
+    String centreOrigen = recordMap.containsKey("centre_origen") ? recordMap.get("centre_origen") : null;
+    Integer nenq = recordMap.containsKey("nenq") ? Integer.parseInt(recordMap.get("nenq").replaceAll("\\D+","")) : null;
+    String ructStr = recordMap.containsKey("ruct") ? recordMap.get("ruct").replaceAll("\\D+","") : null;
+String cursd = recordMap.containsKey("cursd") ? recordMap.get("cursd") : null;
+    Integer ruct = null;
+    
+    if(ructStr != null) {
+    if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
+    ruct = Integer.parseInt(ructStr);
+}
+    }
+
+Integer centre;
+    Integer titulacio;
+if(clau.equals("ruct") && ambit.equals("T") && ruct != null) {
+Organ o = this.orgs.findByRuct(ruct);
+if(o == null) {
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
+continue;
+}
+titulacio = o.getId().getLugar();
+centre = o.getOrgan().getId().getLugar();
+}
+else{
+centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
+    titulacio = ambit.equals("T") ? Integer.parseInt(t) : null;
+if(!this.orgs.exists("T", titulacio)){
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado la titulación con código "+titulacio+" pero se importa igualmente." : "No s'ha trobat la titulació amb codi "+titulacio+" però s'importa igualment")).append("<br>").toString();
+}
+}
+    
+    if(header.contains("cursd")) {
+    cursd = recordMap.get("cursd").replaceAll("\\D+","");
+    }
+for(String r : headerInds) {
+IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
+        ie.setEnquesta(enquesta);
+    ie.setTitulacio(titulacio);
+    ie.setCentre(centre);
+    ie.setCurs(curs);
+    ie.setAmbit(ambit); 
+    ie.setEstudi(estudi);
+        ie.setIndicador(r.replace("_min", "").replace("_max", "").toLowerCase());
+        ie.setNum(null);
+        ie.setCursd(cursd);
+        ie.setTipus(type);
+        ie.setUsuari(usuari.getUsuari());
+        ie.setData(new Timestamp(System.currentTimeMillis()));
+        ie.setCursEnquesta(cursEnquesta);
+        ie.setTitulacioOrigen(titulacioOrigen);
+        ie.setCentreOrigen(centreOrigen);
+        ie.setNenq(nenq);
+        ie.setRuct(ruct);
+        
+        try {
+        ie.setValor(record.get(r).replace(",", "."));
+        }
+        catch(Exception ex) {
+        ie.setValor(null);
+        }
+        
+        iets.save(ie);
+        numRecords++;
+}
+numTuples++;
+}
+
+/*  5) Notificar administradores y usuario implicado  */
+this.sendNotificacion(usuari, enquesta, ambit, estudi);
+if(!usuari.isAdmin()){
+this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
+}
+
+errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
+return errors.toString();
+}
+
+public String doDbImport(Integer dbOrigen, String vista, Integer srcCurs, Integer dstCurs, Usuari usuari, String enquesta, String ambit, 
+ String estudi, String locale, String clau, List<String> ignoredColumns) throws SQLException, ClassNotFoundException {
+
+StringBuilder errors = new StringBuilder();
+Datasource source = this.dss.findById(dbOrigen);
+if(source == null){
+return errors.append("[ERROR] " + (locale.equals("es") ? "No se ha proporcionado un origen de datos válido." : "No s'ha proporcionat un origen de dades vàlid.")).append("<br>").toString();
+}
+String query = "SELECT * FROM "+vista+ " WHERE curs = "+srcCurs;
+Class.forName(source.getDriver());
+Integer numRecords = 0;
+Integer numTuples = 0;
+try (Connection connection = DriverManager.getConnection(source.getConn())) {
+
+/*  1) Ejecutar consulta  */
+Statement statement = connection.createStatement();
+ResultSet resultset = statement.executeQuery(query);
+
+ResultSetMetaData resultMetadata = resultset.getMetaData();
+int columns = resultMetadata.getColumnCount();
+
+/*  2) Obtener resultados para procesar online y cerrar conexión  */
+RowSetFactory factory = RowSetProvider.newFactory();
+CachedRowSet result = factory.createCachedRowSet();
+result.populate(resultset);
+connection.close();
+
+/*  3) Comprobar columnas obligatorias  */
+List<String> mandatoryColumns = new ArrayList<String>();
+List<String> knownColumns = new ArrayList<String>();
+if(clau.equals("ruct")) {
+this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
+}
+else {
+this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
+}
+
+List<String> allColNames = new ArrayList<String>();
+for(int i = 1; i <= columns; i++){
+allColNames.add(resultMetadata.getColumnLabel(i).toLowerCase());
+}
+List<String> colnames = new ArrayList<String>(allColNames);
+
+if(!this.checkColumns(colnames, mandatoryColumns, errors, locale)) {
+return errors.append("[ERROR] " + (locale.equals("es") ? "Se han encontrado errores al procesar la vista seleccionada. No se ha importado ningún registro. " : "S'han trobat errors al processar la vista seleccionada. No s'ha importat cap registre.")).append("<br>").toString();
+}
+
+knownColumns.addAll(mandatoryColumns);
+knownColumns.addAll(ignoredColumns);
+for(String c : knownColumns) {
+colnames.removeIf(v->v.equalsIgnoreCase(c));
+}
+
+if(ambit.equals("T") && !clau.equals("ruct")){
+return errors.append("[ERROR] " + (locale.equals("es") ? "Los datos de titulación deben de importarse por código RUCT" : "Les dades de titulació s'han d'importar per códi RUCT.")).append("<br>").toString();
+}
+
+/*  4) Importar datos  */
+while(result.next()) {
+Integer ruct = null;
+Integer titulacio = null;
+Integer centre = null;
+String c = ambit.equals("C") ? translateCentre(result.getString("centre")) : null;
+boolean isValid = true; 
+
+if(ambit.equals("T")) {
+String ructStr = result.getString("ruct");
+if(ructStr != null) {
+if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
+ruct = Integer.parseInt(ructStr);
+}
+else{
+isValid = false;
+}
+}
+else{
+isValid = false;
+}
+Organ o = this.orgs.findByRuct(ruct);
+if(o == null) {
+errors.append("[WARNING] " + (locale.equals("es") ? "No se ha encontrado el RUCT "+ructStr+", se omiten los registros de esta entrada." : "No s'ha trobat el RUCT "+ructStr+", s'ometen els registres d'aquesta entrada.")).append("<br>").toString();
+continue;
+}
+titulacio = o.getId().getLugar();
+centre = o.getOrgan().getId().getLugar();
+}
+else if(ambit.equals("C")) {
+centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
+if(centre == null){
+isValid = false;
+}
+}
+
+if(isValid) {
+Integer curs = dstCurs == null ? result.getInt("curs") : dstCurs;
+String tipus = allColNames.contains("tipus") ? result.getString("tipus") : "avg";
+String cursEnquesta = allColNames.contains("curs_enquesta") ? result.getString("curs_enquesta") : null;
+String titulacioOrigen = allColNames.contains("titulacio_origen") ? result.getString("titulacio_origen") : null;
+String centreOrigen = allColNames.contains("centre_origen") ? result.getString("centre_origen") : null;
+Integer nenq = allColNames.contains("nenq") ? result.getInt("nenq") : null;
+String cursd = allColNames.contains("cursd") ? result.getString("cursd") : null;
+for(String colName : colnames) {
+IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
+
+ie.setEnquesta(enquesta);
+ie.setTitulacio(titulacio);
+ie.setCentre(centre);
+ie.setCurs(curs);
+ie.setAmbit(ambit); 
+ie.setEstudi(estudi);
+ie.setIndicador(colName.replace("_min", "").replace("_max", "").toLowerCase());
+ie.setNum(null);
+ie.setCursd(cursd);
+ie.setTipus(tipus);
+ie.setUsuari(usuari.getUsuari());
+ie.setData(new Timestamp(System.currentTimeMillis()));
+ie.setCursEnquesta(cursEnquesta);
+ie.setTitulacioOrigen(titulacioOrigen);
+ie.setCentreOrigen(centreOrigen);
+ie.setNenq(nenq);
+ie.setRuct(ruct);
+
+try {
+ie.setValor(result.getString(colName).replace(",", "."));
+}
+catch(Exception ex) {
+ie.setValor(null);
+}
+
+iets.save(ie);
+numRecords++;
+} 
+numTuples++;  
+}
+}
+}
+
+/*  5) Notificar administradores y usuario implicado  */
+this.sendNotificacion(usuari, enquesta, ambit, estudi);
+if(!usuari.isAdmin()){
+this.sendConfirmation(usuari.getUsuari(), enquesta, ambit, estudi);
+}
+errors.append("[INFO] " + (locale.equals("es") ? ("Se han importado "+numRecords.toString()+" nuevos registros para un total de "+numTuples.toString()+" titulaciones") : ("[INFO] S'han importat "+numRecords.toString()+" nous registres per a un total de "+numTuples.toString()+" titulacions")));
+return errors.toString();
+}
+
+public List<String> listTableColumns(Integer dbOrigen, String vista, String locale) throws SQLException, ClassNotFoundException {
+
+Datasource source = this.dss.findById(dbOrigen);
+String query = "SELECT * FROM "+vista+" LIMIT 1;";
+Class.forName(source.getDriver());
+List<String> colNames = new ArrayList<String>();
+try (Connection connection = DriverManager.getConnection(source.getConn())) {
+
+Statement statement = connection.createStatement();
+ResultSet resultset = statement.executeQuery(query);
+
+ResultSetMetaData resultMetadata = resultset.getMetaData();
+int columns = resultMetadata.getColumnCount();
+
+for(int i = 1; i <= columns; i++){
+colNames.add(resultMetadata.getColumnLabel(i));
+}
+
+}
+
+return colNames;
+}
+
+public List<IndicadorEnquestaTmpRepository.IndicadorEnquestaTmpDup> checkDuplicates(String enquesta) {
+return this.iets.checkDuplicates(enquesta);
+}
+
+public Integer consolidateByEnquesta(String enquesta) {
+if(this.iets.checkDuplicates(enquesta).size() > 0) {
+return -1;
+}
+else {
+Integer i = this.ies.consolidateByEnquesta(enquesta);
+this.iets.deleteByEnquesta(enquesta);
+return i;
+}
+}
+
+public Integer countByEnquesta(String enquesta) {
+return this.iets.countByEnquesta(enquesta);
+}
+
+public List<IndicadorEnquestaTmpRepository.IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
+return this.iets.checkIntegrity(enquesta);
+}
+
+public Integer deleteFromCurrent(String enquesta){
+return this.iets.deleteFromCurrent(enquesta);
+}
+
+public Integer deleteFromPending(String enquesta){
+return this.iets.deleteFromPending(enquesta);
+}
+
+private void setColumnsCod(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
+knownColumns.addAll(Arrays.asList("ruct", "curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
+if(ambit.equals("U")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
+}
+else if(ambit.equals("C")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "centre", "tipus"));
+}
+else {
+mandatoryColumns.addAll(Arrays.asList("curs", "titulacio", "centre", "tipus"));
+}
+}
+
+private void setColumnsRuct(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
+knownColumns.addAll(Arrays.asList("curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
+if(ambit.equals("U")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
+}
+else if(ambit.equals("C")) {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
+knownColumns.add("centre");
+}
+else {
+mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
+knownColumns.addAll(Arrays.asList("centre", "titulacio"));
+}
+}
+
+private boolean checkColumns(List<String> header, List<String> mandatoryColumns, StringBuilder errors, String locale) {
+boolean isvalid = true;
+for(String c : mandatoryColumns) {
+if(!header.stream().anyMatch(c::equalsIgnoreCase)) {
+isvalid = false;
+    errors.append((locale.equals("es") ? "[ERROR] No se ha encontrado la columna " : "[ERROR] No s'ha trobat la columna ") +c).append("<br>");
+    }
+}
+return isvalid;
+}
+
+private boolean checkValues(List<CSVRecord> records, String ambit, String clau, StringBuilder errors, String locale) {
+boolean isvalid = true;
+Integer numRecords = 0;
+for (CSVRecord record : records) {
+Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
+recordMap.putAll(record.toMap());
+
+String type = recordMap.get("tipus");
+numRecords++;
+
+if((ambit.equals("T") || ambit.equals("C")) && !clau.equals("ruct")) {
+String c = recordMap.get("centre");
+c = translateCentre(c);
+if(!StringUtils.isNumeric(c.replace("C", ""))) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? c+" no es un valor válido para la columna centre." : c+" no es un valor vàlid per la columna centre.")).append("<br>");
+} 
+}
+
+if(ambit.equals("T")) {
+String t = recordMap.get("titulacio");
+if(!clau.equals("ruct")) {
+t = translateTitulacio(t);
+if(!StringUtils.isNumeric(t)) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? t+" no es un valor válido para la columna titulacio." : t+" no es un valor vàlid per la columna titulacio.")).append("<br>");
+}
+}
+else {
+String ructStr = recordMap.get("ruct");
+if(!ructStr.isBlank() && ructStr.isEmpty() && ructStr.equals("NULL") && ructStr.equals("null") && !StringUtils.isNumeric(t)) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? ructStr+" no es un valor válido para la columna ruct." : ructStr+" no es un valor vàlid per la columna ruct.")).append("<br>");
+}
+}
+}
+
+if(!type.equals("avg") && !type.equals("min") && !type.equals("max")) {
+isvalid = false;
+errors.append("[ERROR] " + (locale.equals("es") ? "En la linea " : "A la línia ") + numRecords.toString() + ": " + (locale.equals("es") ? type+" no es un valor válido para la columna tipus." : type+" no es un valor vàlid per la columna tipus.")).append("<br>");
+}
+}
+return isvalid;
+}
+
+private void sendNotificacion(Usuari usuari, String enquesta, String ambit, String estudi) {
+try {
+this.ems.sendMail("saic@uv.es", "[SYS] Datos pendientes de consolidar", "Estimado/a administrador: \n"
++ "\n"
++ "El usuario "+usuari.getUsuari()+" ha importado nuevos datos referentes a: \n"
++ "Origen: "+enquesta+"\n"
++ "Ámbito: "+ambit+"\n"
++ "Tipo titulación: "+estudi+"\n"
++ "\n"
++ "Acceda a https://saic.uv.es y realice las acciones pertinentes para consolidar los datos. ");
+} catch (MessagingException e) {
+e.printStackTrace();
+}
+}
+
+private void sendConfirmation(String to, String enquesta, String ambit, String estudi) {
+try {
+this.ems.sendMail(to, "[SYS] Nuevos datos importados", "Estimado/a usuario: \n"
++ "\n"
++ "Se han importado correctamente nuevos datos referentes a: \n"
++ "Origen: "+enquesta+"\n"
++ "Ámbito: "+ambit+"\n"
++ "Tipo titulación: "+estudi+"\n"
++ "\n"
++ "Los datos se quedarán en estado pendiente de consolidar hasta que un administrador inicie el proceso de consolidación.");
+} catch (MessagingException e) {
+e.printStackTrace();
+}
+}
+
+/* Exepciones en el código de titulación que hay que traducir a código SAIC */
+```
+- `translateTitulacio()` — ⚪ Interno
+```
+/* Exepciones en el código de centro que hay que traducir a código SAIC */
+```
+- `translateCentre()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DatasourceService` <a name='datasourceservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DatasourceService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DocumentService` <a name='documentservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\DocumentService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findAllByCategoriaOrgan()` — ⚪ Interno
+- `findByCategoriaOrgan()` — ⚪ Interno
+- `findByCategoriaNom()` — ⚪ Interno
+- `findByCategoriaTipus()` — ⚪ Interno
+- `archive()` — ⚪ Interno
+- `archiveByOrgan()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `upload()` — ⚪ Interno
+- `File()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EmailService` <a name='emailservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\EmailService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `EmailService()` — ⚪ Interno
+- `sendActiveTaskNext()` — ⚪ Interno
+- `addEmail()` — ⚪ Interno
+- `getNextEmail()` — ⚪ Interno
+- `getPendingQueue()` — ⚪ Interno
+- `pendingQueueIsEmpty()` — ⚪ Interno
+- `sendMail()` — ⚪ Interno
+- `SimpleMailMessage()` — ⚪ Interno
+- `sendNewTaskMail()` — ⚪ Interno
+- `Qualitat()` — ⚪ Interno
+```
+//saic.uv.es per a accedir al Sistema d'Assegurament Intern de l
+```
+- `Qualitat()` — ⚪ Interno
+- `Calidad()` — ⚪ Interno
+```
+//saic.uv.es para acceder al Sistema de Aseguramiento Interno de l
+```
+- `Calidad()` — ⚪ Interno
+- `sendCalendarMail()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `EvidenciaIndicadorEnquestaService` <a name='evidenciaindicadorenquestaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\EvidenciaIndicadorEnquestaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getIndicadors()` — ⚪ Interno
+- `getByProcesEvidencia()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `removeByProcesEvidencia()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `GraficaService` <a name='graficaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\GraficaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findLikeAmbit()` — ⚪ Interno
+- `findLikeAmbitAndEstudi()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaService` <a name='indicadorenquestaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorEnquestaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findTypes()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudiCentre()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudiCentreTitulacio()` — ⚪ Interno
+- `getAssociatedInds()` — ⚪ Interno
+- `getAllInds()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getAllInds()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `contains()` — ⚪ Interno
+- `deleteCentroNoAdscrito()` — ⚪ Interno
+- `deleteByEnquesta()` — ⚪ Interno
+- `deleteByEnquestaCurs()` — ⚪ Interno
+- `fixBiennials()` — ⚪ Interno
+- `consolidateByEnquesta()` — ⚪ Interno
+- `deleteAll()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `saveAll()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorEnquestaTmpService` <a name='indicadorenquestatmpservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorEnquestaTmpService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `deleteByEnquesta()` — ⚪ Interno
+- `deleteByEnquestaCursAmbitEstudi()` — ⚪ Interno
+- `checkDuplicates()` — ⚪ Interno
+- `deleteFromCurrent()` — ⚪ Interno
+- `deleteFromPending()` — ⚪ Interno
+- `deleteDuplicates()` — ⚪ Interno
+- `countByEnquesta()` — ⚪ Interno
+- `checkIntegrity()` — ⚪ Interno
+- `deleteAll()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `saveAll()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndicadorService` <a name='indicadorservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\IndicadorService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `IndicadorService()` — ⚪ Interno
+- `getFromTitulacion()` — ⚪ Interno
+- `URL()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `extract()` — ⚪ Interno
+- `InputSource()` — ⚪ Interno
+```
+// has subin
+```
+- `for()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getGraphData()` — ⚪ Interno
+- `URL()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `extractAll()` — ⚪ Interno
+- `InputSource()` — ⚪ Interno
+```
+// has subin
+```
+- `for()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InformeService` <a name='informeservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InformeService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByGrupWeb()` — ⚪ Interno
+- `findByGrupWebTambit()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaService` <a name='instanciaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `getReportFromInstancia()` — ⚪ Interno
+- `filterSupervisables()` — ⚪ Interno
+- `filterSupervisable()` — ⚪ Interno
+- `filterSupervisablesByEvidencies()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findAllIds()` — ⚪ Interno
+- `findByOrganCursNom()` — ⚪ Interno
+- `findByCentreCursNom()` — ⚪ Interno
+- `findByIdProces()` — ⚪ Interno
+- `findByOrganBetweenCurs()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `instantiateT()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `instantiateC()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `instantiateU()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `deleteInstance()` — ⚪ Interno
+- `clearInstance()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaService` <a name='instanciatascaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaTascaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByInstancia()` — ⚪ Interno
+- `findByInstanciaTascap()` — ⚪ Interno
+- `findOlderVersions()` — ⚪ Interno
+- `TascaVersioTransfer()` — ⚪ Interno
+- `findActiveByInstancia()` — ⚪ Interno
+- `findActivesByType()` — ⚪ Interno
+- `isUserAuthorized()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `getReportFromProcesOrgan()` — ⚪ Interno
+- `getReportFromNomProcesOrgan()` — ⚪ Interno
+- `system()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `saveChanges()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `InstanciaTasca()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `findOlderByProces()` — ⚪ Interno
+- `EvidenciaTransfer()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `getPastTasks()` — ⚪ Interno
+- `getNext()` — ⚪ Interno
+- `getUsers()` — ⚪ Interno
+- `getLastByProcName()` — ⚪ Interno
+- `deactivateAll()` — ⚪ Interno
+- `remove()` — ⚪ Interno
+- `removeAllVersions()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `InstanciaTascaVerService` <a name='instanciatascaverservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\InstanciaTascaVerService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findById()` — ⚪ Interno
+- `findByIdInstanciaTasca()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `deleteByIdInstancia()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `LinkService` <a name='linkservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\LinkService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findById()` — ⚪ Interno
+- `findByToken()` — ⚪ Interno
+- `findByRuct()` — ⚪ Interno
+- `increase()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `NoticiaService` <a name='noticiaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\NoticiaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findVisibles()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `OrganService` <a name='organservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\OrganService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `findByRuct()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findCurrentCentres()` — ⚪ Interno
+- `findTitulacionsByCentre()` — ⚪ Interno
+- `getTitulacions()` — ⚪ Interno
+- `getCentres()` — ⚪ Interno
+- `getActiveCentres()` — ⚪ Interno
+- `getTitulacionsByCentre()` — ⚪ Interno
+- `getUsuariTitulacions()` — ⚪ Interno
+- `getUsuariCentres()` — ⚪ Interno
+- `getTitulacionsByCentres()` — ⚪ Interno
+- `getTitulacionsByTypeCentre()` — ⚪ Interno
+- `findActiveTitulacionsByCentreTambit()` — ⚪ Interno
+- `getEquivalents()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ParserService` <a name='parserservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\ParserService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `ParserService()` — ⚪ Interno
+- `doParse()` — ⚪ Interno
+- `parseOtros()` — ⚪ Interno
+- `parsePas()` — ⚪ Interno
+- `parseEvalProf()` — ⚪ Interno
+- `parseGrauFromUqServer()` — ⚪ Interno
+- `parseMasterFromUqServer()` — ⚪ Interno
+- `parseDoctorado()` — ⚪ Interno
+- `execute()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `IndicadorEnquesta()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `executeRows()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `IndicadorEnquesta()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `translate()` — ⚪ Interno
+- `parseGrauDades1er()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauDades3er()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauDadesGraduats()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseGrauProfes()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDadesPas()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseMasterData()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+```
+/*+ "AND a.TIT NOT IN(SELECT DISTINCT(TIT) FROM MDB_master.Mitjanes_final_codigeneric) "
++ "UNION "
++ "SELECT 'data' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, "
++ "IT13 AS it13, IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, "
++ "IT19 AS it19, IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, "
++ "IT26 AS it26, IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, "
++ "IT31 AS it31, IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, "
++ "G_QProf AS g_qprof, G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util, gcovidm AS gcovid "
++ "FROM MDB_master.Mitjanes_final_codigeneric a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre "
++ "WHERE Total >= 3 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",*/
+
+"SELECT 'data' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, IT13 AS it13, "
++ "IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, IT19 AS it19, "
++ "IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, IT26 AS it26, "
++ "IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, IT31 AS it31, "
++ "IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, G_QProf AS g_qprof, "
++ "G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util "
++ "FROM MDB_master.Mitjanes_final_xcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'data' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi, "
++ "IT01 AS it01, IT02 AS it02, IT03 AS it03, IT04 AS it04, IT05 AS it05, IT06 AS it06, "
++ "IT07 AS it07, IT08 AS it08, IT09 AS it09, IT10 AS it10, IT11 AS it11, IT12 AS it12, IT13 AS it13, "
++ "IT14 AS it14, IT15 AS it15, IT16 AS it16, IT17 AS it17, IT18 AS it18, IT19 AS it19, "
++ "IT21 AS it21, IT22 AS it22, IT23 AS it23, IT24 AS it24, IT25 AS it25, IT26 AS it26, "
++ "IT27 AS it27, IT28 AS it28, IT29 AS it29, IT30 AS it30, IT30 AS it30, IT31 AS it31, "
++ "IT32 AS it32, IT33 AS it33, G_satis AS g_satis, G_RelQP AS g_relqp, G_QProf AS g_qprof, "
++ "G_Postg AS g_postg, G_Interes AS g_interes, G_Util AS g_util "
++ "FROM MDB_master.Mitjanes_final_global "
++ "WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'data' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_it13m AS it13_max, min_it13m AS it13_min, max_it14m AS it14_max, min_it14m AS it14_min, "
++ "max_it15m AS it15_max, min_it15m AS it15_min, max_it16m AS it16_max, min_it16m AS it16_min, "
++ "max_it17m AS it17_max, min_it17m AS it17_min "
++ "FROM MDB_master.MinMax_final_xcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";"};
+
+return this.execute(statement, queries);
+}
+
+private int parseMasterDataG(Connection connection, String year) throws SQLException {
+
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'data_g' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxtitcursf a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxcentrecursf a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi, "
++ "IT01m_pf AS it01_pf, IT02m_pf AS it02_pf, IT03m_pf AS it03_pf, IT04m_comp AS it04_comp, "
++ "IT04m_comp AS it05_comp, IT06m_comp AS it06_comp, IT07m_comp AS it07_comp, "
++ "IT08m_comp AS it08_comp, IT09m_comp AS it09_comp, IT10m_comp AS it10_comp, "
++ "IT11m_de AS it11_de, IT12m_de AS it12_de, IT13m_de AS it13_de, IT14m_de AS it14_de, "
++ "IT15m_de AS it15_de, IT16m_de AS it16_de, (IT17_pe_S/(IT17_pe_S+IT17_pe_N))*100 AS it17_pe, "
++ "IT18m_pe AS it18_pe, IT19m_pe AS it19_pe, IT20m_pe AS it20_pe, IT21m_pe AS it21_pe, "
++ "IT22m_pe AS it22_pe, IT23m_pe AS it23_pe, (IT24_mob_S/(IT24_mob_S+IT24_mob_N))*100 AS it24_mob, "
++ "IT25_mob1 AS it25_mob1, IT25_mob2 AS it25_mob2, IT25_mob3 AS it25_mob3, IT25_mob4 AS it25_mob4, "
++ "IT26m_mob AS it26_mob, IT27m_mob AS it27_mob, IT28m_mob AS it28_mob, IT29m_mob AS it29_mob, "
++ "IT30m_mob AS it30_mob, IT26m_mob AS it26_mob, IT31m_mob AS it31_mob, IT32m_mob AS it32_mob, "
++ "IT33m_mob AS it33_mob, IT34m_tfm AS it34_tfm, IT35m_tfm AS it35_tfm, IT36m_tfm AS it36_tfm, "
++ "IT37m_tfm AS it37_tfm, IT38m_tfm AS it38_tfm, IT40m_treb AS it40_treb, IT41m_treb AS it41_treb, "
++ "IT41m_treb AS it41_treb, IT42m_treb AS it42_treb, IT43m_treb AS it43_treb, gm_Qprof AS g_qprof, "
++ "gm_instal AS g_instal, gm_exp AS g_exp, gm_recomana AS g_recomana "
++ "FROM MDB_master.Mitjanes_Gxcursf WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";",
+
+"SELECT 'data_g' AS enquesta, NULL AS tit, b.cmostrar AS centre, CONCAT('20', RIGHT(cursf, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_IT26m_mob AS it26_mob_max, min_IT26m_mob AS it26_mob_min, "
++ "max_IT27m_mob AS it27_mob_max, min_IT27m_mob AS it27_mob_min, "
++ "max_IT28m_mob AS it28_mob_max, min_IT28m_mob AS it28_mob_min, "
++ "max_IT29m_mob AS it29_mob_max, min_IT29m_mob AS it29_mob_min, "
++ "max_IT30m_mob AS it30_mob_max, min_IT30m_mob AS it30_mob_min, "
++ "max_IT31m_mob AS it31_mob_max, min_IT31m_mob AS it31_mob_min, "
++ "max_IT32m_mob AS it32_mob_max, min_IT32m_mob AS it32_mob_min, "
++ "max_IT33m_mob AS it33_mob_max, min_IT33m_mob AS it33_mob_min, "
++ "max_gm_instal AS g_instal_max, min_gm_instal AS g_instal_min "
++ "FROM MDB_master.MinMax_Gxcursfcentre a "
++ "LEFT JOIN MDB_master.Centre b ON a.centre = b.centre WHERE CONCAT('20', RIGHT(cursf, 2)) >= "+year+";"
+};
+
+return this.execute(statement, queries);
+}
+
+private int parseMasterProfes(Connection connection, String year) throws SQLException {
+
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'profes_tancades' AS enquesta, b.tit AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'T' AS ambit, 'm' AS estudi, "
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesXtit a "
++ "LEFT JOIN MDB_master.ESTUDIS b ON a.tit = b.tit "
++ "LEFT JOIN MDB_master.Centre c ON b.centre = c.centre WHERE CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesxCurscentre a "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "LEFT JOIN MDB_master.Centre c ON a.centre = c.centre WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'U' AS ambit, 'm' AS estudi,"
++ "A1 AS a1, A2 AS a2, A3 AS a3, A4 AS a4, A5 AS a5, A6 AS a6, A7 AS a7, A8 AS a8, A9 AS a9, A10 AS a10, "
++ "A11 AS a11, A12 as a12, A13 AS a13, A14 AS a14, A15_1 AS a15_1, A15_2 AS a15_2, A15_3 AS a15_3, "
++ "A15_4 AS a15_4, A15_5 AS a15_5, A16 AS a16, A17 AS a17, A18 AS a18, A19 AS a19, A20 AS a20, "
++ "A21 AS a21, A26 AS a26, A27 AS a27, A28 AS a28, A29 AS a29, A30 AS a30, A31 AS a31, A32 AS a32 "
++ "FROM MDB_master.Mitjanes_profesxCurs a"
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";",
+
+"SELECT 'profes_tancades' AS enquesta, NULL AS tit, c.cmostrar AS centre, CONCAT('20', RIGHT(ACURS, 2)) AS curs, null AS cursd, 'C' AS ambit, 'm' AS estudi, "
++ "max_A16m AS a16_max, min_A16m AS a16_min, max_A17m AS a17_max, min_A17m AS a17_min, "
++ "max_A19m AS a19_max, min_A19m AS a19_min "
++ "FROM MDB_master.MinMax_profesxCurscentre a "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', RIGHT(ACURS, 2)) "
++ "LEFT JOIN MDB_master.Centre c ON a.centre = c.centre WHERE p.ProfesComplet = 1 AND CONCAT('20', RIGHT(ACURS, 2)) >= "+year+";"};
+
+return this.execute(statement, queries);
+}
+
+
+private int parseEvalProfBD(Connection connection, String year) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'evalprof' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'T' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasTitulacion m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.estudio = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '' AND num_encues >= 3 AND CONCAT('20', anyo) >= "+year+"; ",
+
+"SELECT 'evalprof' AS enquesta, NULL AS tit, c.cod_actual AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'C' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasCentro m "
++ "LEFT JOIN MDB_evalProf.Centros c ON m.centre = c.cod_centro "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', anyo) "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '' AND CONCAT('20', anyo) >= "+year+"; ",
+
+"SELECT 'evalprof' AS enquesta, NULL AS tit, NULL AS centre, CONCAT('20', anyo) AS curs, null AS cursd, 'U' AS ambit, tipus AS estudi, "
++ "it01, it02, it03, it04, it05, it06, it07, it08, it09, it10, it11, it12, it13, it14, b1, b2, b3, b4, b5, b6, global "
++ "FROM MDB_evalProf.MediasUniversidad "
++ "LEFT JOIN MDB_master.periodesCurs p ON p.curs = CONCAT('20', anyo) "
++ "WHERE CONCAT('20', anyo) >= "+year+"; "};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosProfes(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'otros' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, curs, null AS cursd, ambit, estudi, "
++ "I_RH2_06, I_RH2_07, I_RH2_08, I_RH2_profcursos, I_RH2_totpdi "
++ "FROM MDB_otros.profesorado m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.titulacion = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '';"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosEncuestas(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'enquestes' AS enquesta, titulacio AS tit, centre, curs, null AS cursd, ambit, estudi, "
++ "1er_modul_cod, 1er_modul_nom, 1er_modul_obs, 3er_modul_cod, 3er_modul_nom, 3er_modul_obs "
++ "FROM MDB_otros.asignaturas_encuestas;"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosTasas(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT 'otros' AS enquesta, t.cod_titula AS tit, c.cod_actual AS centre, curs, null AS cursd, ambit, estudi, "
++ "i_oe1_nb_nuevos, i_oe1_nb_plazas, i_oe1_tasa_mat, i_oe1_tasa_ofedem "
++ "FROM MDB_otros.tasas m "
++ "LEFT JOIN MDB_evalProf.Titulaciones t ON m.titulacion = t.estudio "
++ "LEFT JOIN MDB_evalProf.Centros c ON t.cod_centro = c.cod_centro "
++ "WHERE c.cod_actual IS NOT NULL AND c.cod_actual <> '';"};
+
+return this.execute(statement, queries);
+
+}
+
+private int parseOtrosDocentia(Connection connection) throws SQLException {
+ 
+Statement statement = connection.createStatement();
+String[] queries = {
+"SELECT *  "
++ "FROM MDB_otros.docentia_evaluacion "
++ "WHERE centre IS NOT NULL;"};
+
+return this.execute(statement, queries);
+
+}
+
+/* ToDo */
+```
+- `parseDocEstud()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocEtesi()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocProf()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `CONCAT()` — ⚪ Interno
+- `parseDocTasas()` — ⚪ Interno
+- `parseDocInds()` — ⚪ Interno
+- `parseDocRecom()` — ⚪ Interno
+- `LOWER()` — ⚪ Interno
+- `doAction()` — ⚪ Interno
+- `precargaEvalProf()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `CAST()` — ⚪ Interno
+- `precargaMaster()` — ⚪ Interno
+- `precargaDoctorado()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PlantillaService` <a name='plantillaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\PlantillaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `DecimalFormat()` — ⚪ Interno
+- `findAll()` — ⚪ Interno
+- `findByID()` — ⚪ Interno
+- `findByVersioCodiAmbit()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `isUsed()` — ⚪ Interno
+- `addTemplateData()` — ⚪ Interno
+- `data()` — ⚪ Interno
+- `addTemplateData()` — ⚪ Interno
+- `data()` — ⚪ Interno
+- `addHeaderData()` — ⚪ Interno
+- `ClassPathResource()` — ⚪ Interno
+- `ClassPathResource()` — ⚪ Interno
+- `iterateLoopAttr()` — ⚪ Interno
+- `iterateLoopTag()` — ⚪ Interno
+- `replaceValues()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Element()` — ⚪ Interno
+- `getTemplateData()` — ⚪ Interno
+- `replaceValuesLoop()` — ⚪ Interno
+- `formatValue()` — ⚪ Interno
+- `savePDF()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `PrintWriter()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `toPDF()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `PrintWriter()` — ⚪ Interno
+- `ProcessBuilder()` — ⚪ Interno
+- `parseComments()` — ⚪ Interno
+- `String()` — ⚪ Interno
+- `ObjectMapper()` — ⚪ Interno
+- `replaceSection()` — ⚪ Interno
+- `extractTemplateAnchor()` — ⚪ Interno
+- `clear()` — ⚪ Interno
+- `asString()` — ⚪ Interno
+- `InputStreamReader()` — ⚪ Interno
+- `UncheckedIOException()` — ⚪ Interno
+- `readFileToString()` — ⚪ Interno
+- `DefaultResourceLoader()` — ⚪ Interno
+- `asString()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ProcesService` <a name='processervice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\ProcesService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByID()` — ⚪ Interno
+- `findByName()` — ⚪ Interno
+- `findByNameCurs()` — ⚪ Interno
+- `getAll()` — ⚪ Interno
+- `getSupervisableCursos()` — ⚪ Interno
+- `getSupervisableProcedures()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `deleteById()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+- `getFlowDiagram()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `RolService` <a name='rolservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\RolService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findOne()` — ⚪ Interno
+- `findAssignables()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SysStatusService` <a name='sysstatusservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\SysStatusService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByType()` — ⚪ Interno
+- `log()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `err()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `warn()` — ⚪ Interno
+- `SysStatus()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TascaService` <a name='tascaservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\TascaService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByProces()` — ⚪ Interno
+- `getByID()` — ⚪ Interno
+- `getByProcesTascap()` — ⚪ Interno
+- `getAllEvidencies()` — ⚪ Interno
+- `getEvidenciesByCentreTitulacioCurs()` — ⚪ Interno
+- `getEvidencesByProcedure()` — ⚪ Interno
+- `getAllAvailableEvidences()` — ⚪ Interno
+- `create()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `deleteById()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TipusService` <a name='tipusservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\TipusService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findOne()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuariService` <a name='usuariservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\UsuariService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `findByUsername()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `getActiveInstanciaTasques()` — ⚪ Interno
+- `getActiveInstancies()` — ⚪ Interno
+- `getSupervisableProcessos()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Role
+```
+- `especiales()` — ⚪ Interno
+- `getSupervisableCentres()` — ⚪ Interno
+- `getInstanceAsignedUsers()` — ⚪ Interno
+- `findByRolCentre()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `UsuarisRolService` <a name='usuarisrolservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\UsuarisRolService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findAll()` — ⚪ Interno
+- `exists()` — ⚪ Interno
+- `find()` — ⚪ Interno
+- `findActive()` — ⚪ Interno
+- `findLast()` — ⚪ Interno
+- `findLastNum()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `findActiveRols()` — ⚪ Interno
+- `isGrantedUser()` — ⚪ Interno
+- `isGrantedSupervisor()` — ⚪ Interno
+- `isAdminUser()` — ⚪ Interno
+- `isDataTestUser()` — ⚪ Interno
+- `hasActiveRol()` — ⚪ Interno
+- `hasActiveRoles()` — ⚪ Interno
+- `hasActiveAmbit()` — ⚪ Interno
+- `hasAssociatedProcs()` — ⚪ Interno
+- `findAssociatedProcs()` — ⚪ Interno
+- `findManagerByCentre()` — ⚪ Interno
+- `findManagerByTitulacio()` — ⚪ Interno
+- `findManagerByCentres()` — ⚪ Interno
+- `findManagerByTitulacions()` — ⚪ Interno
+- `getSpecialRoles()` — ⚪ Interno
+- `save()` — ⚪ Interno
+- `delete()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `WikiService` <a name='wikiservice'></a>
+**Ubicación:** `src\main\java\es\uv\saic\service\WikiService.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `findByCategoria()` — ⚪ Interno
+- `save()` — ⚪ Interno
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 30
+- Total de métodos: 438
+- Total de comentarios: 8
+
+✅ **Fin del reporte de carpeta.**

+ 1650 - 0
reporte_web.md

@@ -0,0 +1,1650 @@
+# 📁 Reporte de carpeta: `web`
+
+> Detalle de clases, métodos y comentarios extraídos automáticamente
+
+
+### 🧩 Clase: `AdminController` <a name='admincontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\AdminController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET para conseguir todas las instancias del sistema en ese momento.
+```
+- `getInstances()` — 🟢 Endpoint
+```
+// Función utilizada para conseguir las instancias que tiene todo el sistema
+```
+- `loadInstanceData()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que recoge los campos introducidos en los inputs (Proceso, centro y titulación) y busca las instancias relacionadas
+```
+- `instantiate()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Type T procedure for one whole categor
+```
+- `place()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Type C procedure for all active place
+```
+- `for()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// GET que recoge todos los procedimientos del sistema
+```
+- `getProcedures()` — 🟢 Endpoint
+```
+// Función utilizada en el GET que recoge todos los procedimientos
+```
+- `loadProceduresData()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que elimina una instancia concreta
+```
+- `deleteInstance()` — 🟢 Endpoint
+```
+// POST que reinicia una instancia por completo
+```
+- `clearInstance()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+```
+// POST que establece que una instancia ha sido cerrada, cambiandole su estado
+```
+- `closeInstance()` — 🟢 Endpoint
+```
+// POST que se encarga de eliminar una tarea concreta de una instancia
+```
+- `removeTask()` — 🟢 Endpoint
+```
+// POST que se encarga de reiniciar por completo una tarea de una instancia
+```
+- `clearTask()` — 🟢 Endpoint
+```
+// POST que reinicia una tarea del procedimiento, eliminando datos anteriores y creando una nueva vesión de esta
+```
+- `reloadTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// POST que tiene como objetivo reactivar una tarea
+```
+- `activateTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+```
+// POST que edita la información de una tarea ya existente
+```
+- `editTask()` — 🟢 Endpoint
+- `InstanciaTasca()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `getMailing()` — 🟢 Endpoint
+- `sendMails()` — 🟢 Endpoint
+- `Email()` — ⚪ Interno
+```
+// POST para la creación de un procedimiento nuevo
+```
+- `newProcedure()` — 🟢 Endpoint
+- `Proces()` — ⚪ Interno
+- `Tasca()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// POST para editar un procedimiento ya existente
+```
+- `editProcedure()` — 🟢 Endpoint
+- `Tasca()` — ⚪ Interno
+- `Tasca()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// POST que elimina un procedimiento
+```
+- `removeProcedure()` — 🟢 Endpoint
+```
+// POST que le eliminar un usuario concreto del sitema
+```
+- `removeUserrole()` — 🟢 Endpoint
+```
+// POST para añadir un nuevo usuario al sistema
+```
+- `newUserrole()` — 🟢 Endpoint
+- `Usuari()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `UsuarisRol()` — ⚪ Interno
+- `getTemplates()` — 🟢 Endpoint
+```
+// GET que recoge todas las plantillas actuales del sistema
+```
+- `getTemplates2()` — 🟢 Endpoint
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `File()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `loadTemplateData()` — ⚪ Interno
+```
+// POST que redefine que indicadores están asociados a una evidencia dentro de un proceso
+```
+- `updateTemplateInds()` — 🟢 Endpoint
+- `EvidenciaIndicadorEnquesta()` — ⚪ Interno
+- `EvidenciaIndicadorEnquestaPK()` — ⚪ Interno
+```
+// GET para abrir el editor de plantillas
+```
+- `getTemplateEditor()` — 🟢 Endpoint
+- `testTemplateEditor()` — 🟢 Endpoint
+```
+// GET para la carga del calendario
+```
+- `calendar()` — 🟢 Endpoint
+- `acreditacionsByCurs()` — 🟢 Endpoint
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `AcreditacioTransfer()` — ⚪ Interno
+- `UpdateAcreditacio()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `AjaxController` <a name='ajaxcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\AjaxController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `getActiveCentres()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `getActiveTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que buscar titulaciones que se encuentren asociadas a uno o varios centros
+```
+- `getTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que se utiliza para conseguir los cursos a partir de la titulación
+```
+- `getYearsByCenterTitulation()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que se utiliza para conseguir los procedimiento que se han llevado a cabo por cursos y por titulación
+```
+- `getProceduresByCenterTitulationYear()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para buscar pas evidencias a partir del año, centro y titulación
+```
+- `getEvidencesByCenterTitulationYear()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST que recoge toda las titulaciones que contiene un centro para el manager
+```
+- `getCenterTitulations()` — 🟢 Endpoint
+- `getTitulationsByCenters()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `getTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `getAllTitulationsByCenter()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para encontrar el centro a partir de los procedimientos
+```
+- `getAllCentresByAmbit()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+// POST para encontrar un procedimiento concreto
+```
+- `findProcedure()` — 🟢 Endpoint
+- `Proces()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// POST para encontar las plantillas concretas para cierta titulación, centro o procedimiento
+```
+- `findTemplates()` — 🟢 Endpoint
+- `findTemplatesInds()` — 🟢 Endpoint
+```
+// GET para renderizar el formulario de cración de nueva tarea
+```
+- `newTaskForm()` — 🟢 Endpoint
+- `newUserRoleForm()` — 🟢 Endpoint
+- `findTemplate()` — 🟢 Endpoint
+```
+// GET para comprobar si una plantilla esta siendo usada
+```
+- `isTemplateUsed()` — 🟢 Endpoint
+```
+// POST para crear el form de creación de plantilla
+```
+- `formTemplate()` — 🟢 Endpoint
+- `Plantilla()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// DELETE para eliminar una plantilla concreta
+```
+- `formTemplateRemove()` — 🟢 Endpoint
+```
+// POST para guadar una de las plantillas
+```
+- `templateSave()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `Plantilla()` — ⚪ Interno
+- `saveTemplate()` — 🟢 Endpoint
+```
+// POST para añadir un evento al calendario
+```
+- `calendarAddEvent()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `Calendari()` — ⚪ Interno
+```
+// POST que actualiza el evento ddel calendario
+```
+- `calendarAddEvent()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+```
+// GET que recoge todos los eventos del calendario
+```
+- `calendarGetEvents()` — 🟢 Endpoint
+```
+// DELETE que elimina un evento del calendario
+```
+- `calendarDeleteEvent()` — 🟢 Endpoint
+```
+// POST para instanciar un proceso desde el calendario
+```
+- `instantiate()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `BigInteger()` — ⚪ Interno
+- `Email()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `groupedTitToText()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DashboardController` <a name='dashboardcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DashboardController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET para cargar el dashboard con toda su información
+```
+- `getOrganList()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+//GET para mostrar el dashboard a partir de un numero ruct
+```
+- `getDashboardOrgan()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `loadReports()` — ⚪ Interno
+- `AnyDimensioDTO()` — ⚪ Interno
+- `TreeDTOAny()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `TreeDTOOrgan()` — ⚪ Interno
+- `TreeDTOInstancia()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `TreeDTODimensio()` — ⚪ Interno
+- `InstanciaDTO()` — ⚪ Interno
+- `DimensioInstanciesDTO()` — ⚪ Interno
+```
+// GET para conseguir la documentación ya a aportada a partir del id de la tituación
+```
+- `loadDocuments()` — 🟢 Endpoint
+- `CategoriaDocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `DocumentDTO()` — ⚪ Interno
+- `loadGantt()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `getDocumentChildCats()` — 🟢 Endpoint
+- `getDocumentChildCatsU()` — 🟢 Endpoint
+```
+// POST para guardar un documento en el sistema
+```
+- `uploadDocument()` — 🟢 Endpoint
+- `Document()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+```
+// POST para añadir un documento a un centro cocncreto
+```
+- `archiveDocuments()` — 🟢 Endpoint
+```
+// GET para conseguir todos los graficos a partir de un RUCT
+```
+- `getGraphDataList()` — 🟢 Endpoint
+```
+//GET para conseguir todos los datos concretos de tasas para las tablas
+```
+- `getGraphDataTaxes()` — 🟢 Endpoint
+```
+//GET para conseguir todos los datos concretos de cada gráfico
+```
+- `getGraphData()` — 🟢 Endpoint
+- `Indicador()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `Indicador()` — ⚪ Interno
+- `CursoValor()` — ⚪ Interno
+- `getLinks()` — 🟢 Endpoint
+- `createLink()` — 🟢 Endpoint
+- `SimpleDateFormat()` — ⚪ Interno
+- `Link()` — ⚪ Interno
+- `Date()` — ⚪ Interno
+- `deleteLink()` — 🟢 Endpoint
+```
+// Función encargada de cargar a los managers a partir del centro y titulación
+```
+- `loadManagers()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+```
+// Función para comprobar si un usario esta permitido para hacer una acción
+```
+- `isSuitable()` — ⚪ Interno
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// Función para saber el tamaño de un documento concreto
+```
+- `getSize()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `bytesToHuman()` — ⚪ Interno
+- `StringCharacterIterator()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `DataController` <a name='datacontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DataController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+// GET que carga la interfaz relacionada con toda la importación de datos
+```
+- `renderImport()` — 🟢 Endpoint
+```
+// POST encargado de importar los datos que han sido adjuntados
+```
+- `uploadFile()` — 🟢 Endpoint
+- `InputStreamReader()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// POST encargado de eliminar unos datos concretos
+```
+- `delete()` — 🟢 Endpoint
+```
+// POST encargado de mostrar los datos por pantalla
+```
+- `show()` — 🟢 Endpoint
+```
+// GET para mostrar el formulario de busqueda de datos
+```
+- `current()` — 🟢 Endpoint
+```
+//GET para cargar el apartado de coonsolidate
+```
+- `consolidate()` — 🟢 Endpoint
+- `check()` — ⚪ Interno
+```
+// POST que soluciona problemas de integridad que puedan tener los datos
+```
+- `fixIntegrityIssues()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+```
+// POST que soluciona problemas de duplicados que puedan tener los datos
+```
+- `fixDuplicatesIssues()` — 🟢 Endpoint
+```
+// POST que consolida los datos pasadas por la encuesta
+```
+- `consolidate()` — 🟢 Endpoint
+```
+// POST que comprueba los datos a partir de la encuesta
+```
+- `countByEnquesta()` — 🟢 Endpoint
+```
+// POST para mostrar los datos en columnas
+```
+- `listTableColumns()` — 🟢 Endpoint
+```
+// GET que muestra los datos de un curso que se ha elegido
+```
+- `show()` — 🟢 Endpoint
+```
+// POST que muestra los datos del curso actual
+```
+- `currentShow()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+- `getDatasources()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `DownloadController` <a name='downloadcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\DownloadController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Download a file associated with a task instance
+ * @param model
+ * @param idInstanciaTasca The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the file to download
+ */
+```
+- `download()` — 🟢 Endpoint
+- `FileSystemResource()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `FileNotFoundException()` — ⚪ Interno
+```
+/*
+ * Download a document by its ID
+ * @param model
+ * @param idDocument The ID of the document to download
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the document to download
+ */
+```
+- `downloadDocument()` — 🟢 Endpoint
+- `FileSystemResource()` — ⚪ Interno
+- `FileNotFoundException()` — ⚪ Interno
+```
+/*
+ * Download the latest report for a given process and degree
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param nomProces The name of the process
+ * @param response HttpServletResponse
+ * @return A FileSystemResource representing the report to download
+ */
+```
+- `downloadReport()` — 🟢 Endpoint
+- `File()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+- `FileSystemResource()` — ⚪ Interno
+```
+/*
+ * Download a populated template for a given task instance
+ * @param model
+ * @param idTascai The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template to download
+ */
+```
+- `downloadTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+Integer idTitulacio = it.getInstancia().getTitulacio();
+String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+if(it.getInstancia().getOrgan().getTambit().equals("G") | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+else if(it.getInstancia().getOrgan().getTambit().equals("M") | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+
+File f = new File(templatePath);
+if(!f.exists()) {
+FileNotFoundException e = new FileNotFoundException("No se ha encontrado la plantilla "+tasca.getCodiEvidencia()+".docx");
+e.setStackTrace(new StackTraceElement[0]);
+throw e;
+}
+
+InputStream in = new FileInputStream(f);
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(it.getInstancia().getCentre())+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", it.getInstancia().getOrgan().getOrgan().getNomVal());
+context.put("titulacio", it.getInstancia().getOrgan().getNomCas());
+context.put("curs", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()));
+context.put("curs_anterior", Integer.toString(it.getInstancia().getProces().getCursAvaluat()-2)+" - "+Integer.toString(it.getInstancia().getProces().getCursAvaluat()-1));
+
+Proces proces = it.getInstancia().getProces();
+Integer idCentre = it.getInstancia().getCentre();
+
+if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+Integer ambit = idTitulacio/(int)1000;
+titulacions = os.getTitulacionsByTypeCentre(it.getInstancia().getOrgan().getOrgan().getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+t.put("titulacio", x.getNomCas());
+data.add(t);
+} 
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Populate the template data into the context
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param curs The academic year
+ * @param context The IContext to populate
+ */
+```
+- `getTemplateData()` — ⚪ Interno
+```
+/*  Indicadores del data warehouse */
+try {
+List<Indicador> indicadores;
+indicadores = this.is.getFromTitulacion(idTitulacio.toString(), curs);
+for(Indicador i : indicadores) { 
+context.put(i.getIndicador(), i.getValor());
+}
+} 
+catch(Exception e) { }
+
+/*  Indicadores de encuestas  */
+List<IndicadorEnquestaRepository.IndicadorEnquestaValor> enquestesT;
+enquestesT = this.ies.getAllInds(idTitulacio, idCentre, curs);
+
+for(IndicadorEnquestaRepository.IndicadorEnquestaValor 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()));
+}
+}
+
+/*
+ * Format a value for template insertion
+ * @param v The value to format
+ * @return The formatted value
+ */
+```
+- `formatValue()` — ⚪ Interno
+```
+/*
+ * Get template data as a HashMap
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param curs The academic year
+ * @return A HashMap containing the template data
+ */
+private HashMap<String, String> getTemplateDataArray(Integer idTitulacio, Integer idCentre, Integer curs) {
+
+HashMap<String, String> info = new HashMap<String, String>();
+
+/*  Indicadores del data warehouse */
+try {
+List<Indicador> indicadores;
+indicadores = this.is.getFromTitulacion(idTitulacio.toString(), curs);
+for(Indicador i : indicadores) { 
+info.put(i.getIndicador(), i.getValor());
+}
+} 
+catch(Exception e) { }
+
+/*  Indicadores de encuestas  */
+List<IndicadorEnquestaRepository.IndicadorEnquestaValor> enquestesT;
+enquestesT = this.ies.getAllInds(idTitulacio, idCentre, curs);
+
+for(IndicadorEnquestaRepository.IndicadorEnquestaValor 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;
+}
+
+/*
+ * Test endpoint to generate a populated template for a given task (id of task)
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param idTascap The ID of the task
+ * @param idProces The ID of the process
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template
+ */
+```
+- `testTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+String templatePath = this.templatePath+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+if(titulacio.getTambit().equals("G") | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+else if(titulacio.getTambit().equals("M") | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+tasca.getCodiEvidencia().replace(".", "_")+".docx";
+}
+}
+
+InputStream in = new FileInputStream(new File(templatePath));
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", centre.getNomVal());
+context.put("titulacio", titulacio.getNomVal());
+context.put("curs", Integer.toString(proces.getCursAvaluat()-1)+" - "+Integer.toString(proces.getCursAvaluat()));
+context.put("curs_anterior", Integer.toString(proces.getCursAvaluat()-2)+" - "+Integer.toString(proces.getCursAvaluat()-1));
+
+if(tasca.getTipus().getTipus() == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+titulacions = os.getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, proces.getCursAvaluat());
+t.put("titulacio", x.getNomCas());
+data.add(t);
+}
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+tasca.getCodiEvidencia()+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Test endpoint to generate a populated template for a given degree and evidence (Type of task)
+ * @param model
+ * @param idTitulacio The ID of the degree
+ * @param idCentre The ID of the center
+ * @param evidencia The name of the evidence
+ * @param curs The academic year
+ * @param tipusTasca The type of task
+ * @param response HttpServletResponse
+ * @return A byte array representing the populated template
+ */
+```
+- `testTemplate()` — 🟢 Endpoint
+```
+/* Check if specific template exists */
+String templatePath = this.templatePath+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+if(idTitulacio < 2000 | idTitulacio == 1) {
+File f = new File(this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T1/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+}
+ambit = 1;
+}
+else if((idTitulacio >= 2000 & idTitulacio < 3000) | idTitulacio == 2) {
+File f = new File(this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx");
+if(f.exists() && !f.isDirectory()) { 
+templatePath = this.templatePath+"/T2/"+evidencia.replace(".", "_").replace(" (G)", "").replace(" (M)", "")+".docx";
+}
+ambit = 2;
+}
+
+InputStream in = new FileInputStream(new File(templatePath));
+IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, reportId, TemplateEngineKind.Velocity);
+FieldsMetadata metadata = new FieldsMetadata();
+metadata.addFieldAsImage("logo");
+report.setFieldsMetadata(metadata);
+IContext context = report.createContext();
+IImageProvider img;
+if(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png").exists()) {
+img = new FileImageProvider(new File(this.logoPath+"C"+Integer.toString(idCentre)+".png"));
+}
+else {
+img = new FileImageProvider(new File(this.logoPath+"C0.png"));
+}
+context.put("logo", img);
+context.put("centre", centre.getNomVal());
+context.put("titulacio", titulacio.getNomVal());
+context.put("curs", Integer.toString(curs-1)+" - "+Integer.toString(curs));
+context.put("curs_anterior", Integer.toString(curs-2)+" - "+Integer.toString(curs-1));
+
+if(tipusTasca == 14) { // Iterable template task
+List<Organ> titulacions = new ArrayList<Organ>();
+titulacions = os.getTitulacionsByTypeCentre(centre.getId().getLugar(), ambit);
+List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
+for(Organ x : titulacions) {
+HashMap<String, String> t = getTemplateDataArray(x.getId().getLugar(), idCentre, curs);
+t.put("titulacio", x.getNomCas());
+data.add(t);
+}
+context.put("data", data);
+getTemplateData(idTitulacio, idCentre, curs, context);
+}
+else { // NO iterable template task
+getTemplateData(idTitulacio, idCentre, curs, context);
+}
+
+ByteArrayOutputStream out = new ByteArrayOutputStream();  
+report.process(context, out);
+    response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+evidencia+".docx\"");
+
+return out.toByteArray();
+
+}
+
+/*
+ * Generate a PDF from the content of a task instance (unused)
+ * @param model
+ * @param idTascai The ID of the task instance
+ * @param response HttpServletResponse
+ * @return A byte array representing the generated PDF
+ */
+```
+- `downloadTemplatePdf()` — 🟢 Endpoint
+```
+/*
+ * Generate a PDF preview from provided content
+ * @param model
+ * @param content The content to convert to PDF
+ * @param idtascai Optional ID of the task instance for context
+ * @param response HttpServletResponse
+ */
+```
+- `downloadTemplatePdf()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ExportController` <a name='exportcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ExportController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Export data for a given process and task as CSV
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param id_p Process ID
+ * @param id_t Task ID
+ */
+```
+- `exportData()` — 🟢 Endpoint
+```
+//@GetMapping("/export/{id_p}/{id_t}")  
+//public void exportData(Model model, Authentication auth, HttpServletResponse response, 
+//@PathVariable Integer id_p, @PathVariable Integer id_t) throws IOException {
+//if(!((Usuari)auth.getPrincipal()).isAdmin() & !((Usuari)auth.getPrincipal()).isDataTest()) {
+//return;
+//}
+//
+//response.setContentType("text/csv");
+//        response.setCharacterEncoding("UTF-8");
+//        response.setHeader("Content-Disposition", "attachment; filename=data_export.csv");
+//
+//PrintWriter pw = response.getWriter();
+//Proces p = this.ps.findByID(id_p);
+//List<Instancia> ins = p.getInstancies();
+//List<String[]> lines = new ArrayList<>();
+//if(p.getNomProces().equals("SAEM")) {
+//String[] header = {"centre", "titulacio", "cod_int", "nom_int", "per_int", "obs_int", "cod_fin", "nom_fin", "per_fin", "obs_fin", "data_fi_docencia"};
+//lines.add(header);
+//}
+//else {
+//String[] header = {"centre", "titulacio", "cod_assignatura_1er", "nom_assignatura_1er", "obs_assignatura_1er", "cod_assignatura_3er", "nom_assignatura_3er", "obs_assignatura_3er"};
+//lines.add(header);
+//}
+//
+//for(Instancia i : ins) {
+//InstanciaTasca it = i.getInstanciaTasca().stream()
+//     .filter(c -> id_t.equals(c.getTasca().getIdTascap()))
+//     .findAny()
+//     .orElse(null);
+//if(it == null) {
+//continue;
+//}
+//if(!it.getEstat().equals("E")){
+//continue;
+//}
+//
+//System.out.println(it.getText());
+//Document doc = Jsoup.parseBodyFragment(it.getText());
+//        int size = lines.get(0).length;
+//        String[] line = new String[size];
+//        line[0] = i.getCentre().toString();
+//line[1] = i.getTitulacio().toString();
+//String[] ids = {"", "",
+////"ind_enquestes_1er_modul_cod", "ind_enquestes_1er_modul_nom", "ind_enquestes_1er_modul_per", "ind_enquestes_1er_modul_obs", 
+//        //"ind_enquestes_3er_modul_cod", "ind_enquestes_3er_modul_nom", "ind_enquestes_3er_modul_per", "ind_enquestes_3er_modul_obs", 
+//    "ind_enquestes_1er_modul_cod", "ind_enquestes_1er_modul_nom", "ind_enquestes_1er_modul_obs", 
+//        "ind_enquestes_3er_modul_cod", "ind_enquestes_3er_modul_nom", "ind_enquestes_3er_modul_obs", 
+//        "mceEditable"};
+//
+//for(int x = 2; x<=8; x++) {
+//if(ids[x].startsWith("ind_")) {
+//try {
+//if(ids[x].equals("ind_enquestes_1er_modul_obs")) {
+//line[x] = doc.getElementById("ind_enquestes_1er_modul_nom").nextElementSibling().text();
+//}
+//else {
+//System.out.println(doc.getElementById(ids[x]));
+//line[x] = doc.getElementById(ids[x]).text();
+//}
+//
+//}
+//catch(Exception e) {
+//line[x] = "[error]";
+//System.out.println("instancia: "+i.getIdInstancia().toString()+", centre: "+i.getCentre().toString()+", titulacio: "+i.getTitulacio().toString());
+//}
+//}/*
+//else {
+//try {
+//line[x] = doc.getElementsByClass(ids[x]).last().text();
+//}
+//catch(Exception e) {
+//line[x] = "[error]";
+//System.out.println("instancia: "+i.getIdInstancia().toString()+", centre: "+i.getCentre().toString()+", titulacio: "+i.getTitulacio().toString());
+//}
+//}*/
+//}
+//
+//lines.add(line);    
+//}
+//
+//lines.stream()
+//         .map(this::convertToCSV)
+//         .forEach(pw::println);
+//pw.close();
+//pw.flush();
+//}
+
+/*
+ * Export data for a given process and task as CSV (not used)
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param id_p Process ID
+ * @param id_t Task ID
+ */
+```
+- `exportData2()` — 🟢 Endpoint
+```
+/*
+ * Convert an array of Strings to a single CSV line, escaping special characters
+ * @param data Array of Strings to convert
+ * @return A single CSV line as a String
+ */
+```
+- `convertToCSV()` — ⚪ Interno
+```
+/*
+ * Escape special characters in a String for CSV format
+ * @param data The String to escape
+ * @return The escaped String
+ */
+```
+- `escapeSpecialCharacters()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `IndexController` <a name='indexcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\IndexController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Redirect root to /procedures if authenticated, to /login otherwise
+ * @param model
+ * @param auth Authentication
+ * @return "procedures" if authenticated, "redirect: login" otherwise
+ */
+```
+- `getHome()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `KeepAliveController` <a name='keepalivecontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\KeepAliveController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Simple endpoint to check if the user session is still active.
+ * Returns "alive" if the user
+ * is authenticated, "0" otherwise.
+ * @param model
+ * @param auth Authentication
+ * @return "alive" if the user is
+ * authenticated, "0" otherwise.
+ */
+```
+- `getItems()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `LoginController` <a name='logincontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\LoginController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `get()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ManagersController` <a name='managerscontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ManagersController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Load the managers administration page data into the model
+ * - List of centres and titulacions the logged user can manage
+ * - List of all users
+ * - List of assignable roles
+ * - If there are search results in the session, load them too
+ * - If there is a roleExists attribute in the session, load it too
+ * - The view is managers.html
+ */
+```
+- `managersForm()` — 🟢 Endpoint
+```
+/*
+ * Process the search form submission and load the results into the model
+ * @Param centres List of centre ids to search managers in
+ * @Param titulacions List of titulacion ids to search managers in
+ * @Return The view component list_managers
+ */
+```
+- `managersSearch()` — 🟢 Endpoint
+```
+/*
+ * Load the search results into the model
+ * @Param model The model to load the data into
+ * @Param centres List of centre ids to search managers in
+ * @Param titulacions List of titulacion ids to search managers in
+ */
+```
+- `loadManagers()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+- `compare()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ParseController` <a name='parsecontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ParseController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Load the parsing options page data into the model
+ * @param model
+ * @param auth Authentication
+ * @param err Optional error message
+ * @param ok Optional success message
+ * @return The name of the view to render
+ */
+```
+- `getParse()` — 🟢 Endpoint
+- `if()` — ⚪ Interno
+```
+/*
+ * Parse a given table from a given database for a given year
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param database The database to parse from
+ * @param table The table to parse from
+ * @param year The year to parse from
+ */
+```
+- `doParse()` — 🟢 Endpoint
+```
+/*
+ * Parse table depending on the action requested: mediasCentroNP, bienalesProfesGrado, etc
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param action The action to perform
+ */
+```
+- `doAction()` — 🟢 Endpoint
+```
+/*
+ * Method to delete survey indicators from the database
+ * @param model
+ * @param auth Authentication
+ * @param response HttpServletResponse
+ * @param action The survey to delete indicators from
+ * @param year The year of the survey to delete indicators from (0 for all years)
+ */
+```
+- `doDelete()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `ProceduresController` <a name='procedurescontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\ProceduresController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/* Redirect root to /procedures */
+```
+- `getRoot()` — 🟢 Endpoint
+```
+/*
+ * Load the list of active procedure instances for the logged-in user
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param _new Optional parameter to indicate a new access
+ * @return The name of the view to render
+ */
+```
+- `getActiveInstances()` — 🟢 Endpoint
+- `InstanciaTransfer()` — ⚪ Interno
+```
+/*
+ * Loads a procedure instance and its tasks
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @return The name of the view to render
+ */
+```
+- `getInstance()` — 🟢 Endpoint
+```
+/*
+ * Updates a task instance with evidence files (for specific task types)
+ * 
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param params Form parameters
+ * @param evidencias List of evidence files (if any)
+ * @return The number of files uploaded (as a String)
+ * @throws IllegalStateException
+ * @throws IOException
+ * @throws InterruptedException
+ */
+```
+- `updateInstanciaTascaEvidencia()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+```
+/* Tipos de tarea permitidas */
+final Set<Integer> suitable = Set.of(1, 12, 14);
+
+boolean newTask = (suitable.contains(it.getTasca().getTipus().getTipus())) && it.getEstat().equals("E") && 
+   (((Usuari)auth.getPrincipal()).isAdmin() || ((Usuari)auth.getPrincipal()).isGranted());
+
+if(suitable.contains(it.getTasca().getTipus().getTipus())) {   // Evidencia iterable
+String fileName = "";
+
+if(evidencias.size() > 1) {
+fileName = (newTask ? it.getIdInstanciaTasca().add(new BigInteger("1")).toString() : it.getIdInstanciaTasca().toString()) + ".zip";
+try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(filePath+fileName))) {
+    for(MultipartFile f : evidencias) {
+    File tempFile = File.createTempFile("saic", "temp");
+    tempFile.deleteOnExit();
+    f.transferTo(tempFile);
+        zipOut.putNextEntry(new ZipEntry(f.getOriginalFilename()));
+        Files.copy(Paths.get(tempFile.getAbsolutePath()), zipOut);
+    }
+}
+}
+else if(evidencias.size() == 1){
+MultipartFile evidencia = evidencias.get(0);
+fileName = (newTask ? it.getIdInstanciaTasca().add(new BigInteger("1")).toString() : it.getIdInstanciaTasca().toString()) + "." +
+FilenameUtils.getExtension(evidencia.getOriginalFilename());
+evidencia.transferTo(new File(filePath+fileName));
+}
+else {
+return "0";
+}
+
+if(newTask){
+InstanciaTasca itNew = new InstanciaTasca();
+itNew.setUsuari((Usuari)auth.getPrincipal());
+itNew.setDataFet(new Date(System.currentTimeMillis()));
+itNew.setData(new Date(System.currentTimeMillis()));
+itNew.setEstat("E");
+itNew.setEvidencia(fileName);
+itNew.setInstancia(it.getInstancia());
+itNew.setTasca(it.getTasca());
+itNew.setVersion(it.getVersion()+1);
+itNew.setIdInstanciaTasca(it.getIdInstanciaTasca().add(new BigInteger("1")));
+its.save(itNew);
+}
+else {
+it.setEvidencia(fileName);
+it.setEstat("E");
+this.saveChanges(model, auth, session, it);
+}
+}
+
+return Integer.toString(evidencias.size()); 
+}
+
+/*
+ * Updates a task instance
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param params Form parameters
+ * @param evidencias List of evidence files (if any)
+ * @return The name of the view to render
+ */
+```
+- `updateInstanciaTasca()` — 🟢 Endpoint
+- `BigInteger()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+// SI/N
+```
+- `if()` — ⚪ Interno
+- `if()` — ⚪ Interno
+```
+/*
+ * Saves changes to a task instance
+ * 
+ * @param model 
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param it InstanciaTasca to save
+ */
+```
+- `saveChanges()` — ⚪ Interno
+```
+/*
+ * Saves a draft of a task instance (for specific task types)
+ * 
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id Instancia ID Instance to load
+ * @param text Text content of the draft
+ * @param manual Whether the save was manually triggered by the user
+ * @return The timestamp of the save operation formatted as a String
+ */
+```
+- `saveDraft()` — 🟢 Endpoint
+- `Date()` — ⚪ Interno
+- `InstanciaTascaVer()` — ⚪ Interno
+- `Timestamp()` — ⚪ Interno
+```
+/*
+ * Loads a procedure instance and its tasks into the model
+ * @param model
+ * @param auth Authentication
+ * @param id Instancia ID Instance to load
+ * @return The name of the view to render
+ */
+```
+- `loadProcedure()` — ⚪ Interno
+- `InstanciaTransfer()` — ⚪ Interno
+- `InstanciaTascaTransfer()` — ⚪ Interno
+```
+/* Comprobar estado evidencia, si vacío inyectar contenido de plantilla asociada */
+if(it.getText() == null && active) {
+itt.setText(pls.addTemplateData(it, p.getText()));
+}
+else if(active){
+itt.setText(it.getText());
+}
+}
+else {
+itt.setCodiEvidencia(it.getTasca().getCodiEvidencia());
+itt.setNomEvidenciaCas(it.getTasca().getNomEvidenciaCas());
+itt.setNomEvidenciaVal(it.getTasca().getNomEvidenciaVal());
+itt.setEvidencia(it.getEvidencia());
+}
+
+if(it.getUsuari() != null) {
+itt.setUsuariFet(it.getUsuari().getNom() + " " + it.getUsuari().getCognoms());
+}
+else {
+itt.setUsuariFet("");
+}
+itt.setAssignedToUser(its.isUserAuthorized(((Usuari)auth.getPrincipal()), itt.getIdInstanciaTasca()));
+itt.setOldEvidences(its.findOlderByProces(it.getInstancia().getCentre(), it.getInstancia().getTitulacio(), it.getInstancia().getProces().getNomProces(), i.getProces().getCursActivacio(), this.pls));
+itt.setVersions(its.findOlderVersions(it.getInstancia().getIdInstancia(), it.getTasca().getIdTasca(), it.getVersion(), this.pls));
+tasks.add(itt);
+}
+model.addAttribute("tasks", tasks);
+model.addAttribute("flow", this.getFlowDiagram(i.getProces()));
+}
+
+/*
+ * Get all drafts for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to load drafts for
+ * @return The name of the view to render
+ */
+```
+- `getDrafts()` — 🟢 Endpoint
+```
+/*
+ * Get a specific draft for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to load drafts for
+ * @param dataMod Timestamp of the draft to load
+ * @return The InstanciaTascaVer object representing the draft
+ */
+```
+- `getDraft()` — 🟢 Endpoint
+```
+/*
+ * Restore a specific draft for a given task instance
+ * @param model
+ * @param auth Authentication
+ * @param session HttpSession
+ * @param id InstanciaTasca ID to restore draft for
+ * @param dataMod Timestamp of the draft to restore
+ * @return "1" if successful, "0" otherwise
+ */
+```
+- `restoreDraft()` — 🟢 Endpoint
+```
+/*
+ * Generate a flow diagram for a given process
+ * @param proces The process to generate the flow diagram for
+ * @return A String containing the flow diagram
+ */
+```
+- `getFlowDiagram()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `ActiveSession` <a name='activesession'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `PendingEmail` <a name='pendingemail'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `StatsController` <a name='statscontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\StatsController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+- `setId()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setNpi()` — ⚪ Interno
+- `setExpired()` — ⚪ Interno
+- `setLastRequest()` — ⚪ Interno
+- `getId()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getNpi()` — ⚪ Interno
+- `getExpired()` — ⚪ Interno
+- `getLastRequest()` — ⚪ Interno
+- `setUsername()` — ⚪ Interno
+- `setFullName()` — ⚪ Interno
+- `setEmail()` — ⚪ Interno
+- `getUsername()` — ⚪ Interno
+- `getFullName()` — ⚪ Interno
+- `getEmail()` — ⚪ Interno
+```
+/*
+ * Renders the admin stats page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `getStats()` — 🟢 Endpoint
+- `ActiveSession()` — ⚪ Interno
+- `SimpleDateFormat()` — ⚪ Interno
+- `PendingEmail()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `SupervisionController` <a name='supervisioncontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\SupervisionController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Renders the supervision page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `supervisionForm()` — 🟢 Endpoint
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+- `DummyDataTransfer()` — ⚪ Interno
+```
+/*
+ * Handles the supervision search form submission
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param centres The selected centers
+ * @param cursos The selected years
+ * @param titulacions The selected titulacions
+ * @param procediments The selected procedures
+ * @param evidencies The selected evidences
+ * @param searchType The type of search (by procedures or evidences)
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `supervisionSearch()` — 🟢 Endpoint
+- `SupervisionSearchParams()` — ⚪ Interno
+```
+/*
+ * Restores the previous search results from the session
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param session The HTTP session
+ * @return The name of the view to render
+ */
+```
+- `restoreSearch()` — 🟢 Endpoint
+```
+/*
+ * Loads the search results based on the provided filters
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param centres The selected centers
+ * @param titulacions The selected titulacions
+ * @param cursos The selected years
+ * @param procediments The selected procedures
+ * @param evidencies The selected evidences
+ * @param searchType The type of search (by procedures or evidences)
+ */
+```
+- `loadResults()` — ⚪ Interno
+- `InstanciaTransfer()` — ⚪ Interno
+
+---
+
+
+### 🧩 Clase: `TestController` <a name='testcontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\TestController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Generates PDFs for all instances of a given process and task for admin user
+ * 
+ * @param auth The authentication object
+ * @return A string indicating the result of the operation
+ * @throws FileNotFoundException If a required file is not found
+ * @throws IOException If an I/O error occurs
+ * @throws InterruptedException If the thread is interrupted
+ */
+```
+- `generatePDF()` — 🟢 Endpoint
+
+---
+
+
+### 🧩 Clase: `WikiController` <a name='wikicontroller'></a>
+**Ubicación:** `src\main\java\es\uv\saic\web\WikiController.java`
+**Estado de revisión:** ⚠️ *Pendiente*
+
+#### 🔍 Métodos detectados:
+```
+/*
+ * Renders the wiki page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `renderWiki()` — 🟢 Endpoint
+```
+/*
+ * Renders the wiki editor page
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @return The name of the view to render
+ */
+```
+- `renderWikiEditor()` — 🟢 Endpoint
+```
+/*
+ * Returns the wiki text for a given category
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param categoria The category of the wiki
+ * @return The wiki text
+ */
+```
+- `renderWiki()` — 🟢 Endpoint
+```
+/*
+ * Updates the wiki text for a given category
+ * 
+ * @param model The model to pass data to the view
+ * @param auth The authentication object
+ * @param cat The category of the wiki
+ * @param text The new wiki text
+ * @return The updated wiki object
+ */
+```
+- `updateWiki()` — 🟢 Endpoint
+
+---
+
+
+# 📈 Estadísticas finales
+
+- Total de clases: 18
+- Total de métodos: 347
+- Total de comentarios: 112
+
+✅ **Fin del reporte de carpeta.**

+ 162 - 0
src/main/java/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,162 @@
+{"properties": [
+  {
+    "name": "saic.data.filePath",
+    "type": "java.lang.String",
+    "description": "Path to store uploaded evidences"
+  },
+  {
+    "name": "saic.data.templates.filePath",
+    "type": "java.lang.String",
+    "description": "Path in where templates are stored"
+  },
+  {
+    "name": "saic.data.templates.logoPath",
+    "type": "java.lang.String",
+    "description": "Path in where logos are stored"
+  },
+  {
+    "name": "saic.mailer.reminder.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the mailer reminders (when assigned task is expired)"
+  },
+  {
+    "name": "saic.mailer.queue.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the mailer queue"
+  },
+  {
+    "name": "saic.mailer.calendar.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the email reminders related to the calendar (instance planifier)"
+  },
+  {
+    "name": "saic.mailer.maxMailsPerRound",
+    "type": "java.lang.String",
+    "description": "Defines de max number of emails that will be sended in a single round"
+  },
+  {
+    "name": "saic.parser.surveys.path",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.parser.surveys.path'"
+  },
+  {
+    "name": "saic.uqserver.dbname.grau",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'grau'"
+  },
+  {
+    "name": "saic.uqserver.dbname.master",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'master'"
+  },
+  {
+    "name": "saic.uqserver.host",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.uqserver.host'"
+  },
+  {
+    "name": "saic.uqserver.user",
+    "type": "java.lang.String",
+    "description": "Defines the final survey DB username"
+  },
+  {
+    "name": "saic.uqserver.passwd",
+    "type": "java.lang.String",
+    "description": "Defines the final survey DB password"
+  },
+  {
+    "name": "saic.uqserver2.host",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB host"
+  },
+  {
+    "name": "saic.uqserver2.user",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB username"
+  },
+  {
+    "name": "saic.uqserver2.passwd",
+    "type": "java.lang.String",
+    "description": "Defines the intermediate survey DB password"
+  },
+  {
+    "name": "saic.uqserver2.dbname.prof",
+    "type": "java.lang.String",
+    "description": "Defines de DB name for 'prof'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.otros",
+    "type": "java.lang.String",
+    "description": "Defines de DB name for 'otros'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.doct",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'doctorado'"
+  },
+  {
+    "name": "saic.uqserver2.dbname.master",
+    "type": "java.lang.String",
+    "description": "Defines the DB name for 'master'"
+  },
+  {
+    "name": "saic.data.doctorado",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'doctorado' data files"
+  },
+  {
+    "name": "saic.data.evdocente",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'evdocente' data files"
+  },
+  {
+    "name": "saic.data.master",
+    "type": "java.lang.String",
+    "description": "Defines the path to 'master' data files"
+  },
+  {
+    "name": "saic.scheduler.expired.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the email reminders related to procedure tasks expiration"
+  },
+  {
+    "name": "saic.data.tmpPath",
+    "type": "java.lang.String",
+    "description": "Path to the temporal directory"
+  },
+  {
+    "name": "saic.data.templates.fileNotFound",
+    "type": "java.lang.String",
+    "description": "Path to the file that will be returned when the requested file does not exist"
+  },
+  {
+    "name": "saic.parser.surveys.enabled",
+    "type": "java.lang.String",
+    "description": "Enables or disables the surveys related scheduled tasks"
+  },
+  {
+    "name": "saic.actuator.validIp",
+    "type": "java.lang.String",
+    "description": "Actuator endpoints access will be restricted to the specified IP address"
+  },
+  {
+    "name": "saic.url.public",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.public'"
+  },
+  {
+    "name": "saic.url.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.domain'"
+  },
+  {
+    "name": "saic.url.data.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.data.domain'"
+  },
+  {
+    "name": "saic.url.docs.domain",
+    "type": "java.lang.String",
+    "description": "A description for 'saic.url.docs.domain'"
+  }
+]}

+ 17 - 0
src/main/java/es/uv/saic/SaicApplication.java

@@ -0,0 +1,17 @@
+package es.uv.saic;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+@EnableFeignClients
+public class SaicApplication {
+	
+	public static void main(String[] args) {
+		SpringApplication.run(SaicApplication.class, args);
+	}
+
+}

+ 55 - 0
src/main/java/es/uv/saic/config/ApplicationLocaleResolver.java

@@ -0,0 +1,55 @@
+package es.uv.saic.config;
+
+import java.util.Locale;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.servlet.i18n.SessionLocaleResolver;
+
+import es.uv.saic.domain.Usuari;
+import es.uv.saic.service.UsuariService;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+@Configuration
+public class ApplicationLocaleResolver extends SessionLocaleResolver {
+    @Autowired
+    UsuariService us;
+
+    @Override
+    public Locale resolveLocale(HttpServletRequest request) {
+        SecurityContext securityContext = SecurityContextHolder.getContext();
+        Locale userLocale = Locale.forLanguageTag("ca"); 
+        if(!(securityContext.getAuthentication() instanceof AnonymousAuthenticationToken)) {
+        	Usuari usuari = ((Usuari)securityContext.getAuthentication().getPrincipal());
+        	String locale = usuari.getLocale();
+        	userLocale = locale == null ? userLocale : Locale.forLanguageTag(locale);
+        }
+        
+        return userLocale;
+    }
+
+    @Override
+    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+        super.setLocale(request, response, locale);
+
+        SecurityContext securityContext = SecurityContextHolder.getContext();
+        if(!(securityContext.getAuthentication() instanceof AnonymousAuthenticationToken)) {
+        	Usuari usuari = ((Usuari)securityContext.getAuthentication().getPrincipal());
+	        usuari.setLocale(locale.toLanguageTag());
+	        us.save(usuari);
+        }        
+    }
+    
+    @Override
+    protected Locale determineDefaultLocale(HttpServletRequest request) {
+    	if (this.getDefaultLocale() == null) {
+    		Locale locale = this.resolveLocale(request);
+    		this.setDefaultLocale(locale);
+    	}
+    	return this.getDefaultLocale();
+    }
+}

+ 26 - 0
src/main/java/es/uv/saic/config/AuthSuccessHandler.java

@@ -0,0 +1,26 @@
+package es.uv.saic.config;
+
+import java.io.IOException;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.savedrequest.DefaultSavedRequest;
+
+public class AuthSuccessHandler implements AuthenticationSuccessHandler{
+	
+	@Override
+	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth)
+	        throws IOException,  ServletException {
+	    request.getSession(false).setMaxInactiveInterval(3600); //3600
+		if(request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST") != null){
+			DefaultSavedRequest defaultSavedRequest = (DefaultSavedRequest) request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST");
+	    	response.sendRedirect(defaultSavedRequest.getRedirectUrl());
+		}
+		else{
+			response.sendRedirect(request.getContextPath()+"/procedures?_new=1");
+		}
+	}
+}

+ 43 - 0
src/main/java/es/uv/saic/config/Globals.java

@@ -0,0 +1,43 @@
+package es.uv.saic.config;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+@ConfigurationProperties(prefix="globals")
+public class Globals {
+
+	private String filePath = "/tmp/uploads/";
+	//private String filePath = "/DATA/saic-data/files/";
+
+	public String getFilePath() {
+		return filePath;
+	}
+	
+	public String getFileName(String npi, int curs, int informe, String apartat, int item) {
+		return npi+"_"+Integer.toString(curs)+"_"+Integer.toString(informe)+"_"+apartat+Integer.toString(item);
+	}
+	
+	public int getCurrentYear() {
+
+		Date date = new Date();
+		LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+		int month = localDate.getMonthValue();
+		int year = localDate.getYear();
+		
+		if(month < 9) {
+			return year-1;
+		}
+		else {
+			return year;
+		}
+	}
+	
+
+	
+}

+ 22 - 0
src/main/java/es/uv/saic/config/SchedulerConfig.java

@@ -0,0 +1,22 @@
+package es.uv.saic.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+@Configuration
+public class SchedulerConfig implements SchedulingConfigurer {
+    private final int POOL_SIZE = 10;
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
+        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
+
+        threadPoolTaskScheduler.setPoolSize(this.POOL_SIZE);
+        threadPoolTaskScheduler.setThreadNamePrefix("saic-mailer-");
+        threadPoolTaskScheduler.initialize();
+
+        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
+    }
+}

+ 150 - 0
src/main/java/es/uv/saic/config/SecurityConfig.java

@@ -0,0 +1,150 @@
+package es.uv.saic.config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authorization.AuthorizationDecision;
+import org.springframework.security.authorization.AuthorizationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.session.SessionRegistry;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
+import org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
+import org.springframework.security.web.session.HttpSessionEventPublisher;
+import org.springframework.security.web.util.matcher.IpAddressMatcher;
+
+import es.uv.saic.service.AuthProvider;
+import jakarta.servlet.http.HttpServletRequest;
+
+
+@Configuration
+@EnableWebSecurity
+@EnableMethodSecurity
+public class SecurityConfig {
+
+	@Autowired
+	AuthProvider authProvider;
+	
+	@Value("${saic.actuator.validIp}")
+	private String validIp;
+	
+	@Bean
+	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+		http.authorizeHttpRequests((auth) -> auth
+	        	.requestMatchers("/", "/css/**", "/js/**", "/img/**", "/logos/*", "/logos/**").permitAll()
+	        	.requestMatchers("/login**").permitAll()
+	        	.requestMatchers("/keepalive").permitAll()
+	        	.requestMatchers("/actuator/**").access(hasIpAddress(this.validIp))
+	        )
+	        .authorizeHttpRequests((auth)-> auth
+	            //.anyRequest().fullyAuthenticated()
+				.anyRequest().permitAll()
+	        )
+	        .formLogin((form) -> form
+	            .loginPage("/login")
+	            .defaultSuccessUrl("/procedures?_new=1",true)
+	            .failureUrl("/login?error=noauth")
+	            .successHandler(new AuthSuccessHandler())
+	            .permitAll()
+	        )
+	        .logout((logout) -> logout
+	        	.logoutSuccessUrl("/login")
+	        	.invalidateHttpSession(true)
+	        	.clearAuthentication(true)
+	        	.deleteCookies("JSESSIONID")
+                .deleteCookies("SESSION")
+             )
+	        .csrf((csrf) -> csrf.disable());
+		
+		http.sessionManagement((session) -> session
+				.sessionAuthenticationErrorUrl("/login?error=expired")
+				.invalidSessionUrl("/login?error=expired")
+				.maximumSessions(1)
+				.expiredUrl("/login?error=expired")
+				.maxSessionsPreventsLogin(false)
+			    .sessionRegistry(sessionRegistry())
+		    )
+			.sessionManagement((session) -> session
+				.sessionAuthenticationStrategy(concurrentSession())
+			    .sessionFixation()
+			    .newSession()
+			    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
+			);
+	
+		http.headers((headers) -> headers
+				.frameOptions((options) -> options.sameOrigin())
+		    );
+	
+	    return http.build();
+	}
+	
+	private static AuthorizationManager<RequestAuthorizationContext> hasIpAddress(String ipAddress) {
+        IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(ipAddress);
+        return (authentication, context) -> {
+            HttpServletRequest request = context.getRequest();
+            return new AuthorizationDecision(ipAddressMatcher.matches(request));
+        };
+    }
+	    
+    @Bean
+    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
+        return http.getSharedObject(AuthenticationManagerBuilder.class)
+        		   .authenticationProvider(authProvider)
+        		   .build();
+    }
+    
+    @Bean
+    public SessionRegistry sessionRegistry() {
+        return new SessionRegistryImpl();
+    }
+    
+    @Bean
+    public DefaultSpringSecurityContextSource contextSource() {
+        return  new DefaultSpringSecurityContextSource(
+                Collections.singletonList("ldap://ldap.uv.es"), "dc=uv,dc=es");
+    }
+    
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
+    
+    @Bean
+    public HttpSessionEventPublisher httpSessionEventPublisher() {
+        return new HttpSessionEventPublisher();
+    }
+     
+    @Bean
+    public CompositeSessionAuthenticationStrategy concurrentSession() {
+
+         ConcurrentSessionControlAuthenticationStrategy concurrentAuthenticationStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
+         concurrentAuthenticationStrategy.setMaximumSessions(1);
+         concurrentAuthenticationStrategy.setExceptionIfMaximumExceeded(true);
+         List<SessionAuthenticationStrategy> delegateStrategies = new ArrayList<SessionAuthenticationStrategy>();
+         delegateStrategies.add(concurrentAuthenticationStrategy);
+         delegateStrategies.add(new SessionFixationProtectionStrategy());
+         delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry()));
+
+         CompositeSessionAuthenticationStrategy authenticationStrategy =  new CompositeSessionAuthenticationStrategy(delegateStrategies);
+         return authenticationStrategy;
+     }
+	
+}

+ 49 - 0
src/main/java/es/uv/saic/config/WebConfig.java

@@ -0,0 +1,49 @@
+package es.uv.saic.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.web.servlet.ConditionalOnMissingFilterBean;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.web.filter.ForwardedHeaderFilter;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
+
+import jakarta.servlet.DispatcherType;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer{
+	
+	@Bean(name = "localeResolver")
+	public LocaleResolver localeResolver() {
+	    return new ApplicationLocaleResolver();
+	}
+	
+	@Bean
+	public LocaleChangeInterceptor localeChangeInterceptor() {
+	    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
+	    lci.setParamName("lang");
+	    return lci;
+	}
+	
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+	    registry.addInterceptor(localeChangeInterceptor());
+	}
+	
+	@Bean
+	@ConditionalOnMissingFilterBean(ForwardedHeaderFilter.class)
+	@ConditionalOnProperty(value = "server.forward-headers-strategy", havingValue = "native")
+	public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() {
+	    ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
+	    FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
+	    registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR);
+	    registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
+	    return registration;
+	}
+	
+	
+}

+ 147 - 0
src/main/java/es/uv/saic/domain/Acreditacio.java

@@ -0,0 +1,147 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+
+@Entity
+@Table(name="acreditacions")
+@NamedQuery(name="Acreditacio.findAll", query="SELECT t FROM Acreditacio t")
+@IdClass(AcreditacioPK.class)
+public class Acreditacio  implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	
+	@Id
+	private String tlugar;
+	
+	@Id
+	private Integer lugar;
+	
+	@Column(name="curs_impla")
+	private Integer cursImpla;
+	
+	@Column(name="data_verif")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataVerif;
+	
+	@Column(name="data_renov")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataRenov;
+	
+	@Column(name="data_acred")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataAcred;
+	
+	@Column(name="data_segui")
+	@Temporal(TemporalType.TIMESTAMP)
+	private Date dataSegui;
+	
+	private String grup;
+	
+	@Column(name="grup_num")
+	private Integer grupNum;
+	
+	@Column(name="grup_curs")
+	private Integer grupCurs;
+	
+	private Boolean inter;
+
+	private Boolean recom;
+
+	private Boolean segui;
+		
+	public Acreditacio() {}
+	
+
+	public String getTlugar() {
+		return tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+	public Integer getCursImpla() {
+		return cursImpla;
+	}
+	public void setCursImpla(Integer cursImpla) {
+		this.cursImpla = cursImpla;
+	}
+	public Date getDataVerif() {
+		return dataVerif;
+	}
+	public void setDataVerif(Date dataVerif) {
+		this.dataVerif = dataVerif;
+	}
+	public Date getDataRenov() {
+		return dataRenov;
+	}
+	public void setDataRenov(Date dataRenov) {
+		this.dataRenov = dataRenov;
+	}
+	public Date getDataAcred() {
+		return dataAcred;
+	}
+	public void setDataAcred(Date dataAcred) {
+		this.dataAcred = dataAcred;
+	}
+	public Date getDataSegui() {
+		return dataSegui;
+	}
+	public void setDataSegui(Date dataSegui) {
+		this.dataSegui = dataSegui;
+	}
+	public String getGrup() {
+		return grup;
+	}
+	public void setGrup(String grup) {
+		this.grup = grup;
+	}
+	public Integer getGrupCurs() {
+		return grupCurs;
+	}
+	public void setGrupCurs(Integer grupCurs) {
+		this.grupCurs = grupCurs;
+	}
+	public Boolean getInter() {
+		return inter;
+	}
+	public void setInter(Boolean inter) {
+		this.inter = inter;
+	}
+	public Integer getGrupNum() {
+		return grupNum;
+	}
+	public void setGrupNum(Integer grupNum) {
+		this.grupNum = grupNum;
+	}
+	public Boolean getRecom() {
+		return recom;
+	}
+	public void setRecom(Boolean recom) {
+		this.recom = recom;
+	}
+	public Boolean getSegui() {
+		return segui;
+	}
+	public void setSegui(Boolean segui) {
+		this.segui = segui;
+	}
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+}

+ 52 - 0
src/main/java/es/uv/saic/domain/AcreditacioPK.java

@@ -0,0 +1,52 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class AcreditacioPK implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+	private Integer lugar;
+	
+	public AcreditacioPK() {}
+	
+	public AcreditacioPK(String tlugar, Integer lugar) {
+		this.tlugar = tlugar;
+		this.lugar = lugar;
+	}
+
+	public String getTlugar() {
+		return tlugar;
+	}
+
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+
+	public Integer getLugar() {
+		return lugar;
+	}
+
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(lugar, tlugar);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		AcreditacioPK other = (AcreditacioPK) obj;
+		return Objects.equals(lugar, other.lugar) && Objects.equals(tlugar, other.tlugar);
+	}
+
+}

+ 44 - 0
src/main/java/es/uv/saic/domain/AcreditacioRepository.java

@@ -0,0 +1,44 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AcreditacioRepository extends JpaRepository<Acreditacio, AcreditacioPK> {
+
+	@Query(value="SELECT ac.* FROM acreditacions ac "
+			+ "	LEFT JOIN organs og ON ac.tlugar = og.tlugar AND ac.lugar = og.lugar "
+			+ " WHERE og.actiu "
+			+ "	ORDER BY grup_curs DESC, grup_num ASC; ", nativeQuery=true)
+	List<Acreditacio> getAll(); 
+	
+	@Query(value="SELECT * FROM acreditacions "
+			+ "	  WHERE grup_curs = date_part('year', CURRENT_DATE) AND grup_num >= date_part('month', CURRENT_DATE) "
+			+ "   ORDER BY grup_num", nativeQuery=true)
+	List<Acreditacio> getNextsCurrentYear(); 
+	
+	@Query(value="SELECT * FROM acreditacions  WHERE grup_curs = ?1 AND grup_num = ?2  ORDER BY grup_num", nativeQuery=true)
+	List<Acreditacio> getByCursGrup(Integer curs, Integer grup); 
+	
+	@Query(value="SELECT ac.* FROM acreditacions ac "
+			+ "   LEFT JOIN organs og ON ac.lugar = og.lugar AND ac.tlugar = og.tlugar"
+			+ "	  WHERE ac.grup_curs = ?1 AND ac.grup_num = ?2 AND og.tambit = ?3 ORDER BY grup_num", nativeQuery=true)
+	List<Acreditacio> getByCursGrupTambit(Integer curs, Integer grup, String tambit); 
+	
+	@Query(value="SELECT * FROM acreditacions  WHERE grup_curs = ?1  ORDER BY grup_num", nativeQuery=true)
+	List<Acreditacio> getByCurs(Integer curs); 
+	
+	@Query(value="SELECT * FROM acreditacions "
+			+ "   WHERE tlugar = ?1 AND lugar = ?2 "
+			+ "	  ORDER BY data_acred DESC LIMIT 1;", nativeQuery=true)
+	Acreditacio getByOrgan(String tlugar, Integer lugar);
+	
+	@Query(value="SELECT * FROM acreditacions "
+			+ "   WHERE (tlugar, lugar) IN(SELECT tlugar, lugar FROM organs WHERE tlugar2 = ?1 AND lugar2 = ?2)"
+			+ "	  ORDER BY grup_curs, grup_num", nativeQuery=true)
+	List<Acreditacio> getByCentre(String tlugar, Integer lugar);
+	
+}

+ 190 - 0
src/main/java/es/uv/saic/domain/AcreditacioTransfer.java

@@ -0,0 +1,190 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+
+public class AcreditacioTransfer {
+
+	private Integer idAcreditacio;
+	private Integer ruct;
+	private Integer lugar;
+	private String tambit;
+	private String nomCas;
+	private String nomVal;
+	private Integer lugarCentre;
+	private String nomCentreCas;
+	private String nomCentreVal;
+	private String grup;
+	private Integer grupNum;
+	private Integer grupCurs;
+	private Boolean inter;
+	private Date dataVerif;
+	private String dataVerifStr;
+	private Date dataRenov;
+	private String dataRenovStr;
+	private Date dataSegui;
+	private String dataSeguiStr;
+	private Date dataAcred;
+	private String dataAcredStr;
+	private Integer cursImpla;
+	
+	public AcreditacioTransfer() {}
+	
+	public AcreditacioTransfer(Acreditacio a, Organ o) {
+		this.idAcreditacio = 0;
+		this.ruct = o.getRuct();
+		this.lugar = o.getId().getLugar();
+		this.tambit = o.getTambit();
+		this.nomCas = o.getNomCas();
+		this.nomVal = o.getNomVal();
+		this.lugarCentre = o.getOrgan().getId().getLugar();
+		this.nomCentreCas = o.getOrgan().getNomCas();
+		this.nomCentreVal = o.getOrgan().getNomVal();
+		this.grup = a.getGrup();
+		this.grupNum = a.getGrupNum();
+		this.grupCurs = a.getGrupCurs();
+		this.inter = a.getInter();
+		this.dataVerif = a.getDataVerif();
+		this.dataVerifStr = String.format("%1$td/%1$tm/%1$tY", dataVerif);
+		this.dataRenov = a.getDataRenov();
+		this.dataRenovStr = String.format("%1$td/%1$tm/%1$tY", dataRenov);
+		this.dataSegui = a.getDataSegui();
+		this.dataSeguiStr = String.format("%1$td/%1$tm/%1$tY", dataSegui);
+		this.dataAcred = a.getDataAcred();
+		this.dataAcredStr = String.format("%1$td/%1$tm/%1$tY", dataAcred);
+		this.cursImpla = a.getCursImpla();
+	}
+	
+	public Integer getIdAcreditacio() {
+		return idAcreditacio;
+	}
+	public void setIdAcreditacio(Integer idAcreditacio) {
+		this.idAcreditacio = idAcreditacio;
+	}
+	public Integer getRuct() {
+		return ruct;
+	}
+	public void setRuct(Integer ruct) {
+		this.ruct = ruct;
+	}
+	public String getTambit() {
+		return tambit;
+	}
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+	public String getNomCas() {
+		return nomCas;
+	}
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+	public String getNomVal() {
+		return nomVal;
+	}
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+	public String getGrup() {
+		return grup;
+	}
+	public void setGrup(String grup) {
+		this.grup = grup;
+	}
+	public Integer getGrupNum() {
+		return grupNum;
+	}
+	public void setGrupNum(Integer grupNum) {
+		this.grupNum = grupNum;
+	}
+	public Integer getGrupCurs() {
+		return grupCurs;
+	}
+	public void setGrupCurs(Integer grupCurs) {
+		this.grupCurs = grupCurs;
+	}
+	public Boolean getInter() {
+		return inter;
+	}
+	public void setInter(Boolean inter) {
+		this.inter = inter;
+	}
+	public Date getDataVerif() {
+		return dataVerif;
+	}
+	public void setDataVerif(Date dataVerif) {
+		this.dataVerif = dataVerif;
+	}
+	public Date getDataRenov() {
+		return dataRenov;
+	}
+	public void setDataRenov(Date dataRenov) {
+		this.dataRenov = dataRenov;
+	}
+	public Date getDataSegui() {
+		return dataSegui;
+	}
+	public void setDataSegui(Date dataSegui) {
+		this.dataSegui = dataSegui;
+	}
+	public Date getDataAcred() {
+		return dataAcred;
+	}
+	public void setDataAcred(Date dataAcred) {
+		this.dataAcred = dataAcred;
+	}
+	public Integer getCursImpla() {
+		return cursImpla;
+	}
+	public void setCursImpla(Integer cursImpla) {
+		this.cursImpla = cursImpla;
+	}
+	public String getDataVerifStr() {
+		return dataVerifStr;
+	}
+	public void setDataVerifStr(String dataVerfiStr) {
+		this.dataVerifStr = dataVerfiStr;
+	}
+	public String getDataRenovStr() {
+		return dataRenovStr;
+	}
+	public void setDataRenovStr(String dataRenovStr) {
+		this.dataRenovStr = dataRenovStr;
+	}
+	public String getDataSeguiStr() {
+		return dataSeguiStr;
+	}
+	public void setDataSeguiStr(String dataSeguiStr) {
+		this.dataSeguiStr = dataSeguiStr;
+	}
+	public String getDataAcredStr() {
+		return dataAcredStr;
+	}
+	public void setDataAcredStr(String dataAcredStr) {
+		this.dataAcredStr = dataAcredStr;
+	}
+	public Integer getLugar() {
+		return lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+	public Integer getLugarCentre() {
+		return lugarCentre;
+	}
+	public void setLugarCentre(Integer lugarCentre) {
+		this.lugarCentre = lugarCentre;
+	}
+	public String getNomCentreCas() {
+		return nomCentreCas;
+	}
+	public void setNomCentreCas(String nomCentreCas) {
+		this.nomCentreCas = nomCentreCas;
+	}
+	public String getNomCentreVal() {
+		return nomCentreVal;
+	}
+	public void setNomCentreVal(String nomCentreVal) {
+		this.nomCentreVal = nomCentreVal;
+	}
+
+}

+ 191 - 0
src/main/java/es/uv/saic/domain/Calendari.java

@@ -0,0 +1,191 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+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;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+import jakarta.persistence.Transient;
+
+@Entity
+@Table(name="calendari")
+@NamedQuery(name="Calendari.findAll", query="SELECT t FROM Calendari t")
+public class Calendari implements Serializable {
+	private static final long serialVersionUID = 1L;
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_calendari")
+	private Integer idCalendari;
+	
+	private Integer tipus;
+	
+	@Column(name="titol_cas")
+	private String titolCas;
+	
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	private String ambit;
+	
+	@Temporal(TemporalType.DATE)
+	private Date data;
+	
+	@Transient
+	private String dataStr;
+	
+	private Integer idProces;
+	
+	private String titulacions;
+	
+	private String centres;
+	
+	private String color;
+	
+	private String status;
+	
+	public Calendari() {}
+
+	public Calendari(Integer idCalendari, Integer tipus, String titolCas, String titolVal, String ambit, Date data,
+			Integer idProces, String titulacions, String centres, String color) {
+		
+		this.idCalendari = idCalendari;
+		this.tipus = tipus;
+		this.titolCas = titolCas;
+		this.titolVal = titolVal;
+		this.ambit = ambit;
+		this.data = data;
+		this.dataStr = new SimpleDateFormat("yyyy-MM-dd").format(data);
+		this.idProces = idProces;
+		this.titulacions = titulacions;
+		this.centres = centres;
+		this.color = color;
+	}
+	
+	public Calendari(Integer idCalendari, Integer tipus, String titolCas, String titolVal, String ambit, Date data,
+			Integer idProces, String titulacions, String centres, String color, String status) {
+		
+		this.idCalendari = idCalendari;
+		this.tipus = tipus;
+		this.titolCas = titolCas;
+		this.titolVal = titolVal;
+		this.ambit = ambit;
+		this.data = data;
+		this.dataStr = new SimpleDateFormat("yyyy-MM-dd").format(data);
+		this.idProces = idProces;
+		this.titulacions = titulacions;
+		this.centres = centres;
+		this.color = color;
+		this.status = status;
+	}
+
+	public Integer getIdCalendari() {
+		return idCalendari;
+	}
+
+	public void setIdCalendari(Integer idCalendari) {
+		this.idCalendari = idCalendari;
+	}
+
+	public Integer getTipus() {
+		return tipus;
+	}
+
+	public void setTipus(Integer tipus) {
+		this.tipus = tipus;
+	}
+
+	public String getTitolCas() {
+		return titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+
+	public String getAmbit() {
+		return ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public Date getData() {
+		return data;
+	}
+
+	public void setData(Date data) {
+		this.data = data;
+		this.dataStr = new SimpleDateFormat("yyyy-MM-dd").format(data);
+	}
+	
+	public String getDataStr() {
+		return dataStr;
+	}
+
+	public void setDataStr(String dataStr) {
+		this.dataStr = dataStr;
+	}
+
+	public Integer getIdProces() {
+		return idProces;
+	}
+
+	public void setIdProces(Integer idProces) {
+		this.idProces = idProces;
+	}
+
+	public String getTitulacions() {
+		return titulacions;
+	}
+
+	public void setTitulacions(String titulacions) {
+		this.titulacions = titulacions;
+	}
+
+	public String getCentres() {
+		return centres;
+	}
+
+	public void setCentres(String centres) {
+		this.centres = centres;
+	}
+
+	public String getColor() {
+		return color;
+	}
+
+	public void setColor(String color) {
+		this.color = color;
+	}
+	
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+}

+ 15 - 0
src/main/java/es/uv/saic/domain/CalendariRepository.java

@@ -0,0 +1,15 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CalendariRepository extends JpaRepository<Calendari, Integer> {
+
+	@Query(value="SELECT * FROM calendari WHERE data = current_date AND status = 'P';", nativeQuery=true)
+	List<Calendari> getNextEvents(); 
+	
+}

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

@@ -0,0 +1,78 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="categories")
+@NamedQuery(name="Categoria.findAll", query="SELECT i FROM Categoria i")
+public class Categoria {
+
+	@Id
+	@Column(name="id_categoria")
+	private Integer idCategoria;
+	private Integer pare;
+	private Integer ordre;
+	private String tipus;
+	private String nomVal;
+	private String nomCas;
+	private String tambit;
+	
+	public Categoria() {}
+	
+	public Categoria(Integer idCategoria, Integer pare, Integer ordre, String tipus, String nomVal, String nomCas, String tambit) {
+		this.idCategoria = idCategoria;
+		this.tipus = tipus;
+		this.nomVal = nomVal;
+		this.nomCas = nomCas;
+		this.pare = pare;
+		this.ordre = ordre;
+		this.tambit = tambit;
+	}
+	
+	public Integer getIdCategoria() {
+		return idCategoria;
+	}
+	public void setIdCategoria(Integer idCategoria) {
+		this.idCategoria = idCategoria;
+	}
+	public String getTipus() {
+		return tipus;
+	}
+	public void setTipus(String tipus) {
+		this.tipus = tipus;
+	}
+	public String getNomVal() {
+		return nomVal;
+	}
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+	public String getNomCas() {
+		return nomCas;
+	}
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+	public Integer getPare() {
+		return pare;
+	}
+	public void setPare(Integer pare) {
+		this.pare = pare;
+	}
+	public Integer getOrdre() {
+		return ordre;
+	}
+	public void setOrdre(Integer ordre) {
+		this.ordre = ordre;
+	}
+	public String getTambit() {
+		return tambit;
+	}
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+}

+ 30 - 0
src/main/java/es/uv/saic/domain/CategoriaRepository.java

@@ -0,0 +1,30 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CategoriaRepository  extends JpaRepository<Categoria, Integer> {
+	
+	@Query(value="SELECT * FROM categories WHERE pare = ?1 AND (tambit = ?2 OR tambit = 'U') ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findByPareTambitAndU(Integer pare, String tambit); 
+
+	@Query(value="SELECT * FROM categories WHERE pare = ?1 AND (tambit = ?2) ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findByPareTambit(Integer pare, String tambit); 
+
+	@Query(value="SELECT * FROM categories WHERE tipus = ?1 AND (tambit = ?2 OR tambit = 'U') ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findByTipusTambitAndU(String tipus, String tambit); 
+
+	@Query(value="SELECT * FROM categories WHERE tipus = ?1 AND (tambit = ?2) ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findByTipusTambit(String tipus, String tambit); 
+	
+	@Query(value="SELECT * FROM categories WHERE pare IS NULL AND (tambit = ?1) ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findFirstLevel(String ambit);
+
+	@Query(value="SELECT * FROM categories WHERE pare IS NULL AND (tambit = ?1 OR tambit = 'U') ORDER BY ordre ASC;", nativeQuery=true)
+	List<Categoria> findFirstLevelAndU(String ambit);
+
+}

+ 65 - 0
src/main/java/es/uv/saic/domain/Datasource.java

@@ -0,0 +1,65 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="datasources")
+@NamedQuery(name="Datasource.findAll", query="SELECT i FROM Datasource i")
+public class Datasource {
+
+    @Id
+	@Column(name="id_datasource")
+    Integer id;
+
+    String nom;
+
+    String driver;
+
+    String conn;
+
+    public Datasource(){}
+
+    public Datasource(Integer id, String nom, String driver, String conn) {
+        this.id = id;
+        this.nom = nom;
+        this.driver = driver;
+        this.conn = conn;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getNom() {
+        return nom;
+    }
+
+    public void setNom(String nom) {
+        this.nom = nom;
+    }
+
+    public String getDriver() {
+        return driver;
+    }
+
+    public void setDriver(String driver) {
+        this.driver = driver;
+    }
+
+    public String getConn() {
+        return conn;
+    }
+
+    public void setConn(String conn) {
+        this.conn = conn;
+    }
+
+}

+ 10 - 0
src/main/java/es/uv/saic/domain/DatasourceRepository.java

@@ -0,0 +1,10 @@
+package es.uv.saic.domain;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface DatasourceRepository  extends JpaRepository<Datasource, Integer> {
+
+    
+}

+ 140 - 0
src/main/java/es/uv/saic/domain/Dimension.java

@@ -0,0 +1,140 @@
+package es.uv.saic.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Dimension {
+
+	private String titulacion;
+	private String dimension;
+	private List<Indicador> indicadores;
+	
+	public Dimension(){}
+	public Dimension(String titulacion, String dimension) {
+		this.titulacion = titulacion;
+		this.dimension = dimension;
+		this.indicadores = new ArrayList<Indicador>();
+	}
+	
+	public String getTitulacion() {
+		return titulacion;
+	}
+	
+	public void setTitulacion(String titulacion) {
+		this.titulacion = titulacion;
+	}
+	
+	public String getDimension() {
+		return dimension;
+	}
+	
+	public void setDimension(String dimension) {
+		this.dimension = dimension;
+	}
+	public List<Indicador> getIndicadores() {
+		return indicadores;
+	}
+	
+	public void setIndicadores(List<Indicador> indicadores) {
+		this.indicadores = indicadores;
+	}
+	
+	public boolean add(Indicador arg0) {
+		return indicadores.add(arg0);
+	}
+	
+	public Indicador get(int arg0) {
+		return indicadores.get(arg0);
+	}
+	
+	public boolean isEmpty() {
+		return indicadores.isEmpty();
+	}
+	
+	public Indicador set(int arg0, Indicador arg1) {
+		return indicadores.set(arg0, arg1);
+	}
+	
+	public int size() {
+		return indicadores.size();
+	}
+
+	public Indicador newIndicador(String indicador) {
+		return new Indicador(indicador);
+	}
+
+	public class Indicador{
+		private String indicador;
+		private List<Indicador> subindicadores;
+		private List<CursoValor> valores;
+		
+		public Indicador(){}
+		public Indicador(String indicador){
+			this.indicador = indicador;
+			this.valores = new ArrayList<CursoValor>();
+			this.subindicadores = new ArrayList<Indicador>();
+		}
+
+		public String getIndicador() {
+			return this.indicador;
+		}
+		
+		public void setIndicador(String indicador) {
+			this.indicador = indicador;
+		}
+		
+		public List<CursoValor> getValores() {
+			return this.valores;
+		}
+	
+		public boolean add(CursoValor arg0) {
+			return this.valores.add(arg0);
+		}
+	
+		public boolean isEmpty() {
+			return this.valores.isEmpty();
+		}
+	
+		public int size() {
+			return this.valores.size();
+		}
+		
+		public boolean addCursoValor(String curso, String valor) {
+			return this.add(new CursoValor(curso, valor));
+		}
+
+		public boolean addSubindicador(Indicador arg0) {
+			return this.subindicadores.add(arg0);
+		}
+		
+		public List<Indicador> getSubindicadores(){
+			return this.subindicadores;
+		}
+
+		public class CursoValor{
+			private String curso;
+			private String valor;
+			
+			public CursoValor(){ }
+			
+			public CursoValor(String curso, String valor) {
+				this.curso = curso;
+				this.valor = valor;
+			}
+			
+			public String getCurso() {
+				return curso;
+			}
+			public void setCurso(String curso) {
+				this.curso = curso;
+			}
+			public String getValor() {
+				return valor;
+			}
+			public void setValor(String valor) {
+				this.valor = valor;
+			}
+		}
+	}
+	
+}

+ 93 - 0
src/main/java/es/uv/saic/domain/Document.java

@@ -0,0 +1,93 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinColumns;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@Entity
+@Table(name="documents")
+@NamedQuery(name="Document.findAll", query="SELECT i FROM Document i")
+public class Document {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_document")
+	private Integer idDocument;
+	
+	@ManyToOne 
+	@JoinColumn(name="id_categoria")
+	private Categoria categoria;
+	
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	@JsonIgnore
+	private Organ organ;
+	
+	private String nom;
+	
+	private String ruta;
+	
+	private Date data;
+	
+	private boolean visible;
+	
+
+	public Integer getIdDocument() {
+		return idDocument;
+	}
+	public void setIdDocument(Integer idDocument) {
+		this.idDocument = idDocument;
+	}
+	public Categoria getCategoria() {
+		return categoria;
+	}
+	public void setCategoria(Categoria categoria) {
+		this.categoria = categoria;
+	}
+	public Organ getOrgan() {
+		return organ;
+	}
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+	public String getNom() {
+		return nom;
+	}
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	public String getRuta() {
+		return ruta;
+	}
+	public void setRuta(String ruta) {
+		this.ruta = ruta;
+	}
+	public Date getData() {
+		return data;
+	}
+	public void setData(Date data) {
+		this.data = data;
+	}
+	public boolean isVisible() {
+		return visible;
+	}
+	public void setVisible(boolean visible) {
+		this.visible = visible;
+	}
+	
+	
+}

+ 31 - 0
src/main/java/es/uv/saic/domain/DocumentRepository.java

@@ -0,0 +1,31 @@
+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;
+
+@Repository
+public interface DocumentRepository  extends JpaRepository<Document, Integer> {
+	
+	@Query(value="SELECT * FROM documents WHERE id_categoria = ?1 AND ((lugar = ?2 AND tlugar = ?3) OR lugar = 0) AND visible LIMIT 1;", nativeQuery=true)
+	Document findByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar); 
+	
+	@Query(value="SELECT * FROM documents WHERE id_categoria = ?1 AND ((lugar = ?2 AND tlugar = ?3) OR lugar = 0) AND visible", nativeQuery=true)
+	List<Document> findAllByCategoriaOrgan(Integer categoria, Integer lugar, String tlugar);
+	
+	@Query(value="SELECT * FROM documents d LEFT JOIN categories c ON d.id_categoria = c.id_categoria WHERE c.nom_val = ?1 AND visible", nativeQuery=true)
+	List<Document> findByCategoriaNom(String nom); 
+	
+	@Query(value="SELECT * FROM documents d LEFT JOIN categories c ON d.id_categoria = c.id_categoria WHERE c.tipus = ?1 AND visible", nativeQuery=true)
+	List<Document> findByCategoriaTipus(String tipus); 
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="UPDATE documents SET visible = false WHERE lugar = ?1 AND tlugar = ?2", nativeQuery=true)
+	void archiveByOrgan(Integer lugar, String tlugar);
+
+}

+ 34 - 0
src/main/java/es/uv/saic/domain/DocumentTemplate.java

@@ -0,0 +1,34 @@
+package es.uv.saic.domain;
+
+import fr.opensagres.xdocreport.document.images.IImageProvider;
+import fr.opensagres.xdocreport.template.annotations.FieldMetadata;
+import fr.opensagres.xdocreport.template.annotations.ImageMetadata;
+
+public class DocumentTemplate {
+
+	@SuppressWarnings("unused")
+	private static final long serialVersionUID = 1L;
+	private final String centre;
+	private final String curs;
+	private final IImageProvider logo;
+
+	public DocumentTemplate(String centre, String curs, IImageProvider logo) {
+		this.centre = centre;
+		this.curs = curs;
+		this.logo = logo;
+	}
+
+	public String getCentre() {
+		return centre;
+	}
+
+	public String getCurs() {
+		return curs;
+	}
+
+	@FieldMetadata( images = { @ImageMetadata( name = "logo" ) }, description="Logo"  )
+    public IImageProvider getLogo(){
+        return this.logo;
+    }
+	  
+}

+ 71 - 0
src/main/java/es/uv/saic/domain/DummyDataTransfer.java

@@ -0,0 +1,71 @@
+package es.uv.saic.domain;
+
+public class DummyDataTransfer {
+
+	public String text;
+	public String text2;
+	public String text3;
+	public int value;
+	public int value2;
+	public int value3;
+	
+	
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public int getValue() {
+		return value;
+	}
+	public void setValue(int value) {
+		this.value = value;
+	}
+	public String getText2() {
+		return text2;
+	}
+	public void setText2(String text2) {
+		this.text2 = text2;
+	}
+	public int getValue2() {
+		return value2;
+	}
+	public void setValue2(int value2) {
+		this.value2 = value2;
+	}
+	public String getText3() {
+		return text3;
+	}
+	public void setText3(String text3) {
+		this.text3 = text3;
+	}
+	public int getValue3() {
+		return value3;
+	}
+	public void setValue3(int value3) {
+		this.value3 = value3;
+	}
+	public boolean equals (Object o) {
+		if(o == null) { return false; }
+		if (this.getClass() != o.getClass()) { return false; }
+		DummyDataTransfer x = (DummyDataTransfer) o;
+		if (x.text.equals(this.text)) return true;
+        return false;
+	}
+	
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.text.hashCode();
+		hash = hash * prime + this.text2.hashCode();
+		hash = hash * prime + this.text3.hashCode();
+		hash = hash * prime + Integer.toString(this.value).hashCode();
+		hash = hash * prime + Integer.toString(this.value2).hashCode();
+		hash = hash * prime + Integer.toString(this.value3).hashCode();
+		
+		return hash;
+	}
+	
+	
+}

+ 45 - 0
src/main/java/es/uv/saic/domain/Email.java

@@ -0,0 +1,45 @@
+package es.uv.saic.domain;
+
+
+public class Email {
+
+	private Usuari ususari;
+	private InstanciaTasca instanciaTasca;
+	private String to;
+	private String subject;
+	private String body;
+	
+	public Usuari getUsusari() {
+		return ususari;
+	}
+	public void setUsusari(Usuari ususari) {
+		this.ususari = ususari;
+	}
+	public InstanciaTasca getInstanciaTasca() {
+		return instanciaTasca;
+	}
+	public void setInstanciaTasca(InstanciaTasca instanciaTasca) {
+		this.instanciaTasca = instanciaTasca;
+	}
+	public String getTo() {
+		return to;
+	}
+	public void setTo(String to) {
+		this.to = to;
+	}
+	public String getSubject() {
+		return subject;
+	}
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	public String getBody() {
+		return body;
+	}
+	public void setBody(String body) {
+		this.body = body;
+	}
+	
+	
+	
+}

+ 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);
+
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/EvidenciaTransfer.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+public class EvidenciaTransfer {
+	private String evidencia;
+	private String codiEvidencia;
+	private String nomEvidenciaCas;
+	private String nomEvidenciaVal;
+	private Integer curs;
+	private Date data;
+	private String nomProces;
+	private BigInteger idTascai;
+	
+	public String getEvidencia() {
+		return evidencia;
+	}
+	public void setEvidencia(String evidencia) {
+		this.evidencia = evidencia;
+	}
+	public String getCodiEvidencia() {
+		return codiEvidencia;
+	}
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+	public Date getData() {
+		return data;
+	}
+	public void setData(Date data) {
+		this.data = data;
+	}
+	public String getNomProces() {
+		return nomProces;
+	}
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+	public BigInteger getIdTascai() {
+		return idTascai;
+	}
+	public void setIdTascai(BigInteger idTascai) {
+		this.idTascai = idTascai;
+	}
+	public String getNomEvidenciaCas() {
+		return nomEvidenciaCas;
+	}
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getNomEvidenciaVal() {
+		return nomEvidenciaVal;
+	}
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public Integer getCurs() {
+		return curs;
+	}
+	public void setCurs(Integer curs) {
+		this.curs = curs;
+	}
+}

+ 129 - 0
src/main/java/es/uv/saic/domain/Grafica.java

@@ -0,0 +1,129 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="grafiques")
+@NamedQuery(name="Grafica.findAll", query="SELECT g FROM Grafica g")
+public class Grafica {
+
+	@EmbeddedId
+	private GraficaPK idGrafica;
+	
+	private String dimensio;
+	
+	private String enquesta;
+	
+	private String indicador;
+	
+	private Integer g;
+	
+	@Column(name="nom_cas")
+	private String nomCas;
+	
+	@Column(name="nom_val")
+	private String nomVal;
+	
+	private String unitats;
+	
+	private boolean negar;
+	
+	private boolean likert;
+	
+	private Integer ordre;
+	
+	public Grafica() {}
+
+	public GraficaPK getIdGrafica() {
+		return idGrafica;
+	}
+
+	public void setIdGrafica(GraficaPK idGrafica) {
+		this.idGrafica = idGrafica;
+	}
+
+	public String getDimensio() {
+		return dimensio;
+	}
+
+	public void setDimensio(String dimensio) {
+		this.dimensio = dimensio;
+	}
+
+	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 Integer getG() {
+		return g;
+	}
+
+	public void setG(Integer g) {
+		this.g = g;
+	}
+
+	public String getNomCas() {
+		return nomCas;
+	}
+
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+
+	public String getNomVal() {
+		return nomVal;
+	}
+
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+
+	public String getUnitats() {
+		return unitats;
+	}
+
+	public void setUnitats(String unitats) {
+		this.unitats = unitats;
+	}
+
+	public boolean isNegar() {
+		return negar;
+	}
+
+	public void setNegar(boolean negar) {
+		this.negar = negar;
+	}
+
+	public boolean isLikert() {
+		return likert;
+	}
+
+	public void setLikert(boolean likert) {
+		this.likert = likert;
+	}
+
+	public Integer getOrdre() {
+		return ordre;
+	}
+
+	public void setOrdre(Integer ordre) {
+		this.ordre = ordre;
+	}
+	
+}

+ 60 - 0
src/main/java/es/uv/saic/domain/GraficaPK.java

@@ -0,0 +1,60 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+
+@Embeddable
+public class GraficaPK implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	
+	@Column(name="id_grafica")
+	private String idGrafica;
+	private String estudi;
+	private String ambit;
+	
+	public GraficaPK() { }
+	
+	public String getIdGrafica() {
+		return idGrafica;
+	}
+	public void setIdGrafica(String idGrafica) {
+		this.idGrafica = idGrafica;
+	}
+	public String getEstudi() {
+		return estudi;
+	}
+	public void setEstudi(String estudi) {
+		this.estudi = estudi;
+	}
+	public String getAmbit() {
+		return ambit;
+	}
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(ambit, estudi, idGrafica);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		GraficaPK other = (GraficaPK) obj;
+		return Objects.equals(ambit, other.ambit) && Objects.equals(estudi, other.estudi)
+				&& Objects.equals(idGrafica, other.idGrafica);
+	}
+	
+	
+	
+}

+ 18 - 0
src/main/java/es/uv/saic/domain/GraficaRepository.java

@@ -0,0 +1,18 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface GraficaRepository  extends JpaRepository<Grafica, GraficaPK> {
+
+	@Query(value="SELECT * FROM grafiques WHERE ambit LIKE ?1", nativeQuery=true)
+	List<Grafica> findLikeAmbit(String ambit);
+	
+	@Query(value="SELECT * FROM grafiques WHERE ambit LIKE ?1 AND UPPER(estudi) = UPPER(?2)", nativeQuery=true)
+	List<Grafica> findLikeAmbitAndEstudi(String ambit, String estudi);
+	
+}

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

@@ -0,0 +1,119 @@
+package es.uv.saic.domain;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+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(String dimension, String indicador, String valor) {
+		this.dimension = dimension;
+		this.indicador = indicador;
+		this.valor = valor;
+		this.valores = new ArrayList<CursoValor>();
+	}
+
+	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;
+		}
+	}
+
+
+	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;
+		}
+	}
+
+}

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

@@ -0,0 +1,240 @@
+package es.uv.saic.domain;
+
+import java.sql.Timestamp;
+
+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;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+
+@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;
+	@Temporal(TemporalType.TIMESTAMP)
+	private Timestamp 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 Timestamp getData() {
+		return data;
+	}
+
+	public void setData(Timestamp 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;
+	}
+
+		
+}

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

@@ -0,0 +1,158 @@
+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 "
+			+ "FROM indicador_enquesta ei "
+			+ "JOIN evidencia_indicador_enquesta eie ON LOWER(ei.enquesta) = LOWER(eie.enquesta) AND LOWER(ei.indicador) = LOWER(eie.indicador) "
+			+ "WHERE eie.evidencia = ?1 AND eie.proces = ?2 AND ei.curs = ?5 AND ei.ambit = 'T' "
+			+ "AND ei.centre = ?4 AND (ei.titulacio = ?3 OR ei.titulacio IN(SELECT lugar_eq FROM organs_equivalents WHERE tlugar_eq = 'T' AND tlugar = 'T' AND lugar = ?3)) "
+			+ "UNION "
+			+ "SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd  "
+			+ "FROM indicador_enquesta ei "
+			+ "JOIN evidencia_indicador_enquesta eie ON LOWER(ei.enquesta) = LOWER(eie.enquesta) AND LOWER(ei.indicador) = LOWER(eie.indicador) "
+			+ "WHERE eie.evidencia = ?1 AND eie.proces = ?2 AND ei.curs = ?5 AND ei.ambit = 'C' "
+			+ "AND ei.centre = ?4 "
+			+ "UNION "
+			+ "SELECT LOWER(ei.enquesta) AS enquesta, LOWER(ei.indicador) AS indicador, ei.valor, LOWER(ei.ambit) AS ambit, ei.tipus, ei.cursd  "
+			+ "FROM indicador_enquesta ei "
+			+ "JOIN evidencia_indicador_enquesta eie ON LOWER(ei.enquesta) = LOWER(eie.enquesta) AND LOWER(ei.indicador) = LOWER(eie.indicador) "
+			+ "WHERE eie.evidencia = ?1 AND eie.proces = ?2 AND ei.curs = ?5 AND ei.ambit = 'U'", nativeQuery=true)
+	List<IndicadorEnquestaValorDTO> getAssociatedInds(String evidencia, String proces, Integer titulacio, Integer centre, Integer curs);
+	
+	@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.titulacio = ?1 OR ei.titulacio 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 titulacio, 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.titulacio = ?1 OR ei.titulacio 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 titulacio, 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 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);
+	
+}
+

+ 248 - 0
src/main/java/es/uv/saic/domain/IndicadorEnquestaTmp.java

@@ -0,0 +1,248 @@
+package es.uv.saic.domain;
+
+import java.sql.Timestamp;
+
+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;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+
+@Entity
+@Table(name="indicador_enquesta_tmp")
+@NamedQuery(name="IndicadorEnquestaTmp.findAll", query="SELECT n FROM IndicadorEnquestaTmp n")
+public class IndicadorEnquestaTmp {
+ 
+	@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 usuari;
+	private String cursEnquesta;
+	private String centreOrigen;
+	private String titulacioOrigen;
+	private Integer nenq;
+	private Integer ruct;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	private Timestamp data; 
+	
+	public IndicadorEnquestaTmp(){}
+	
+	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 getUsuari() {
+		return usuari;
+	}
+
+	public void setUsuari(String usuari) {
+		this.usuari = usuari;
+	}
+
+	public Timestamp getData() {
+		return data;
+	}
+
+	public void setData(Timestamp data) {
+		this.data = data;
+	}
+	
+	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 boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof IndicadorEnquestaTmp)) {
+			return false;
+		}
+		IndicadorEnquestaTmp castOther = (IndicadorEnquestaTmp)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.usuari.equals(castOther.usuari) &&
+			this.data.toString().equals(castOther.data.toString()) &&
+			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);
+	}
+
+	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.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.usuari.hashCode();
+		hash = hash * prime + this.data.toString().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();
+		
+		return hash;
+	}	
+}

+ 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);
+
+}
+

+ 143 - 0
src/main/java/es/uv/saic/domain/Informe.java

@@ -0,0 +1,143 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.List;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="informes")
+@NamedQuery(name="Informe.findAll", query="SELECT i FROM Informe i")
+public class Informe implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_informe")
+	private Integer idInforme;
+	
+	private String nom;
+	
+	@Column(name="titol_cas")
+	private String titolCas;
+	
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+	
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+	
+	private boolean combinat;
+	
+	@Column(name="grup_web")
+	private String grupWeb;
+	
+	private Integer ordre;
+	
+	private String tambit;
+	
+	@OneToMany(fetch=FetchType.EAGER)
+    @JoinColumn(name = "id_informe", referencedColumnName = "id_informe")
+	private List<InformeProcessos> processos;
+
+	public Informe() {}
+	
+	public Integer getIdInforme() {
+		return idInforme;
+	}
+
+	public void setIdInforme(Integer idInforme) {
+		this.idInforme = idInforme;
+	}
+
+	public String getNom() {
+		return nom;
+	}
+
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+
+	public String getTitolCas() {
+		return titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+
+	public String getDescripcioCas() {
+		return descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public boolean isCombinat() {
+		return combinat;
+	}
+
+	public void setCombinat(boolean combinat) {
+		this.combinat = combinat;
+	}
+
+	public String getGrupWeb() {
+		return grupWeb;
+	}
+
+	public void setGrupWeb(String grupWeb) {
+		this.grupWeb = grupWeb;
+	}
+
+	public List<InformeProcessos> getProcessos() {
+		return processos;
+	}
+
+	public void setProcessos(List<InformeProcessos> processos) {
+		this.processos = processos;
+	}
+
+	public Integer getOrdre() {
+		return ordre;
+	}
+
+	public void setOrdre(Integer ordre) {
+		this.ordre = ordre;
+	}
+
+	public String getTambit() {
+		return tambit;
+	}
+
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+	
+	
+}

+ 60 - 0
src/main/java/es/uv/saic/domain/InformeProcesPK.java

@@ -0,0 +1,60 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+
+import jakarta.persistence.Column;
+
+public class InformeProcesPK implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Column(name="id_informe")
+	private Integer idInforme;
+	
+	@Column(name="nom_proces")
+	private String nomProces;
+	
+	public InformeProcesPK() {}
+	
+	public InformeProcesPK(Integer idInforme, String nomProces) {
+		this.idInforme = idInforme;
+		this.nomProces = nomProces;
+	}
+
+	public Integer getIdInforme() {
+		return idInforme;
+	}
+
+	public void setIdInforme(Integer idInforme) {
+		this.idInforme = idInforme;
+	}
+
+	public String getNomProces() {
+		return nomProces;
+	}
+
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof InformeProcesPK)) {
+			return false;
+		}
+		InformeProcesPK castOther = (InformeProcesPK)other;
+		return 
+			this.idInforme.equals(castOther.idInforme)
+			&& this.nomProces.equals(castOther.nomProces);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.idInforme.hashCode();
+		hash = hash * prime + this.nomProces.hashCode();
+		
+		return hash;
+	}
+}

+ 47 - 0
src/main/java/es/uv/saic/domain/InformeProcessos.java

@@ -0,0 +1,47 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="informes_processos")
+@IdClass(InformeProcesPK.class)
+@NamedQuery(name="InformeProcessos.findAll", query="SELECT i FROM InformeProcessos i")
+public class InformeProcessos implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_informe")
+	private Integer idInforme;
+	
+	@Id
+	@Column(name="nom_proces")
+	private String nomProces;
+	
+	public InformeProcessos() {}
+
+	public Integer getIdInforme() {
+		return idInforme;
+	}
+
+	public void setIdInforme(Integer idInforme) {
+		this.idInforme = idInforme;
+	}
+
+	public String getNomProces() {
+		return nomProces;
+	}
+
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+	
+	
+	
+}

+ 22 - 0
src/main/java/es/uv/saic/domain/InformeRepository.java

@@ -0,0 +1,22 @@
+package es.uv.saic.domain;
+
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface InformeRepository extends JpaRepository<Informe, Integer> {
+	
+	@Query(value=("SELECT * FROM informes WHERE grup_web = ?1 ORDER BY ordre ASC"), nativeQuery=true)
+	public List<Informe> findByGrupWeb(String grupWeb);
+	
+	@Query(value=("SELECT * FROM informes WHERE grup_web = ?1 AND tambit IN('A', ?2) ORDER BY ordre ASC"), nativeQuery=true)
+	public List<Informe> findByGrupWebTambit(String grupWeb, String tambit);
+	
+	@Query(value=("SELECT * FROM informes WHERE NOT combinat ORDER BY ordre ASC"), nativeQuery=true)
+	public List<Informe> getNonCombined();
+}
+

+ 133 - 0
src/main/java/es/uv/saic/domain/Instancia.java

@@ -0,0 +1,133 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import jakarta.persistence.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * The persistent class for the instancies database table.
+ * 
+ */
+@Entity
+@Table(name="instancies")
+@NamedQuery(name="Instancia.findAll", query="SELECT i FROM Instancia i")
+public class Instancia implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_instancia")
+	private BigInteger idInstancia;
+
+	private Integer centre;
+
+	private String estat;
+
+	private Integer titulacio;
+	
+	@Temporal(TemporalType.DATE)
+	@Column(name="data")
+	private Date data;
+
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Proces
+	@ManyToOne
+	@JoinColumn(name="id_proces")
+	private Proces proces;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="instancia")
+	private List<InstanciaTasca> instanciesTasques;
+
+	public Instancia() {
+	}
+
+	public BigInteger getIdInstancia() {
+		return this.idInstancia;
+	}
+
+	public void setIdInstancia(BigInteger idInstancia) {
+		this.idInstancia = idInstancia;
+	}
+
+	public Integer getCentre() {
+		return this.centre;
+	}
+
+	public void setCentre(Integer centre) {
+		this.centre = centre;
+	}
+
+	public String getEstat() {
+		return this.estat;
+	}
+
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+
+	public Integer getTitulacio() {
+		return this.titulacio;
+	}
+
+	public void setTitulacio(Integer titulacio) {
+		this.titulacio = titulacio;
+	}
+	
+	public Date getData() {
+		return data;
+	}
+
+	public void setData(Date data) {
+		this.data = data;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public Proces getProces() {
+		return this.proces;
+	}
+
+	public void setProces(Proces proces) {
+		this.proces = proces;
+	}
+
+	public List<InstanciaTasca> getInstanciaTasca() {
+		return this.instanciesTasques;
+	}
+
+	public void setInstanciaTasca(List<InstanciaTasca> instanciaTasca) {
+		this.instanciesTasques = instanciaTasca;
+	}
+
+	public InstanciaTasca addInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciaTasca().add(instanciaTasca);
+		instanciaTasca.setInstancia(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciaTasca().remove(instanciaTasca);
+		instanciaTasca.setInstancia(null);
+
+		return instanciaTasca;
+	}
+
+}

+ 161 - 0
src/main/java/es/uv/saic/domain/InstanciaRepository.java

@@ -0,0 +1,161 @@
+package es.uv.saic.domain;
+
+
+import java.math.BigInteger;
+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.InstanciaGanttDTO;
+
+@Repository
+public interface InstanciaRepository extends JpaRepository<Instancia, BigInteger> {
+	
+	@Query(value=("SELECT id_instancia FROM instancies"), nativeQuery=true)
+	List<BigInteger> findAllIds();
+	
+	@Query(value=("SELECT * FROM instancies WHERE tlugar = ?2 AND lugar = ?3 AND centre = ?4 AND titulacio = ?5 AND estat = 'F' "
+			+ "AND id_proces IN(SELECT id_proces FROM processos WHERE nom_proces = ?1 AND curs_avaluat = ?6)"), nativeQuery=true)
+	List<Instancia> findOlders(String proces, String tlugar, Integer lugar, Integer centre, Integer titulacio, Integer curs);
+	
+	@Query(value=("SELECT * FROM instancies WHERE id_instancia IN( "
+			+ "SELECT ti.id_instancia FROM tasquesi ti "
+			+ "LEFT JOIN tasques ta ON ti.id_tasca = ta.id_tasca "
+			+ "LEFT JOIN instancies ie ON ie.id_instancia = ti.id_instancia "
+			+ "LEFT JOIN processos pr ON pr.id_proces = ie.id_proces "
+			+ "WHERE ie.tlugar = ?2 AND ie.lugar = ?3 AND ie.centre = ?4 AND ie.titulacio = ?5 AND ie.estat = 'F' "
+			+ "      AND pr.nom_proces = ?1 AND pr.curs_avaluat = ?6 AND ta.id_tascap = ?7 AND ti.estat = ?8 "
+			+ ");"), nativeQuery=true)
+	List<Instancia> findOlders(String proces, String tlugar, Integer lugar, Integer centre, Integer titulacio, Integer curs, Integer idtascap, String estat);
+	
+	@Query(value=("SELECT * FROM instancies WHERE id_proces = ?1"), nativeQuery=true)
+	List<Instancia> findByIdProces(Integer idProces);
+	
+	@Query(value=("SELECT * FROM instancies WHERE tlugar = ?1 AND lugar = ?2 AND centre = ?3 AND titulacio = ?4 "
+			+ "AND id_proces IN(SELECT id_proces FROM processos WHERE nom_proces IN (?6) AND curs_avaluat = ?5)"), nativeQuery=true)
+	List<Instancia> findByOrganCursNom(String tlugar, Integer lugar, Integer centre, Integer titulacio, Integer curs, List<String> nom);
+
+	@Query(value=("""
+			SELECT ia.* FROM instancies ia
+			LEFT JOIN organs og ON ia.lugar = og.lugar AND ia.tlugar = og.tlugar
+			LEFT JOIN processos pr ON ia.id_proces = pr.id_proces 
+			WHERE og.lugar2 = ?1 AND og.tlugar2 = 'C' AND pr.curs_avaluat = ?2 AND pr.nom_proces IN(?3);
+		"""), nativeQuery=true)
+	List<Instancia> findByCentreCursNom(Integer lugar2, Integer curs, List<String> nom);
+	
+	@Query(value=("""
+		SELECT ins.id_instancia AS id, pr.titol_cas AS titCas, pr.titol_val AS titVal, 
+			MIN(LEAST(ins.data, ta.data_lim - 31)) AS start, MAX(GREATEST(ta.data_lim, tai.data_fet)) AS end, 100 AS progress, 
+			CASE WHEN pr.sub_titol IS NULL THEN pr.nom_proces 
+			  WHEN pr.sub_titol IS NOT NULL THEN CONCAT(pr.nom_proces, ' (', pr.sub_titol, ')') 
+			END AS name, 
+			CASE WHEN ins.estat = 'F' THEN 'gantt-task-done' 
+			  WHEN ins.estat NOT IN('F', 'C') AND MAX(ta.data_lim) < current_date THEN 'gantt-task-pending' 
+			  WHEN ins.estat NOT IN('F', 'C') AND MAX(ta.data_lim) >= current_date THEN 'gantt-task-delayed' 
+			  WHEN ins.estat = 'C' THEN 'gantt-task-closed' 
+			END AS custom_class 
+		FROM instancies ins 
+		LEFT JOIN processos pr ON pr.id_proces = ins.id_proces 
+		LEFT JOIN tasques ta ON ins.id_proces = ta.id_proces 
+		LEFT JOIN tasquesi tai ON ins.id_instancia = tai.id_instancia 
+		WHERE ins.tlugar = ?1 AND ins.lugar = ?2 AND ins.centre = ?3 AND ins.titulacio IN(?4) 
+			AND EXTRACT(YEAR FROM ins.data) >= ?5 AND EXTRACT(YEAR FROM ins.data) <= ?6 
+		GROUP BY ins.id_instancia, pr.nom_proces, pr.sub_titol, pr.titol_cas, pr.titol_val, ins.data, ins.estat 
+		ORDER BY 5;"""), nativeQuery=true)
+	List<InstanciaGanttDTO> findByOrganBetweenCurs(String tlugar, Integer lugar, Integer centre, List<Integer> titulacio, Integer cursIni, Integer cursFi);
+	
+	@Query(value=("SELECT res.id_instancia FROM (SELECT DISTINCT ia.id_instancia, pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces FROM instancies ia, processos pr " + 
+			"WHERE ia.id_proces = pr.id_proces " + 
+			"AND pr.nom_proces IN (?4) AND pr.curs_avaluat IN (?3) AND ia.titulacio IN (?2) AND ia.centre IN (?1) " + 
+			"ORDER BY pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces) AS res"), nativeQuery=true)
+	List<BigInteger> filterSupervisables(List<Integer> centres, List<Integer> titulacions, List<Integer> cursos, List<String> procediments);
+	
+	@Query(value=("SELECT res.id_instancia FROM (SELECT DISTINCT ia.id_instancia, pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces FROM instancies ia, processos pr " + 
+			"WHERE ia.id_proces = pr.id_proces " + 
+			"AND pr.nom_proces = ?4 AND pr.curs_avaluat = ?3 AND ia.titulacio = ?2 AND ia.centre = ?1 " + 
+			"ORDER BY pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces) AS res"), nativeQuery=true)
+	BigInteger filterSupervisable(Integer centre, Integer titulacio, Integer curs, String procediment);
+	
+	@Query(value=("SELECT res.id_instancia FROM (SELECT DISTINCT ia.id_instancia, pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces  " + 
+			"FROM tasques ta, tasquesi ti, instancies ia, processos pr  " + 
+			"WHERE ta.id_tasca = ti.id_tasca AND ti.id_instancia = ia.id_instancia AND ta.id_proces = pr.id_proces  " + 
+			"AND ia.centre IN (?1) AND ia.titulacio IN (?2) AND pr.curs_avaluat IN (?3) AND ta.codi_evidencia IN (?4)  " +
+			"ORDER BY pr.curs_avaluat, ia.centre, ia.titulacio, pr.id_proces) AS res"), nativeQuery=true)
+	List<BigInteger> filterSupervisablesByEvidencies(List<Integer> centres, List<Integer> titulacions, List<Integer> cursos, List<String> evidencies);
+	
+    @Transactional
+	@Query(value="WITH y AS( " + 
+			"  INSERT INTO instancies " + 
+			"  SELECT CAST((id_proces*1000 + lugar2) as bigint)*10000 + lugar, id_proces, tlugar, lugar, lugar2 centre, lugar titulacio, 'A' estat, NOW() AS data " + 
+			"  FROM processos p, organs o  " + 
+			"  WHERE id_proces=?1 AND ambit='T' AND lugar IN (?2) RETURNING id_instancia, id_proces " + 
+			"), x AS( " + 
+			"INSERT INTO tasquesi(id_tascai, id_instancia, id_tasca, version)  " + 
+			"  SELECT (y.id_instancia*10000 + id_tascap) *100, y.id_instancia, id_tasca, 0 " + 
+			"  FROM tasques t, y  " + 
+			"  WHERE t.id_proces = y.id_proces " + 
+			"  ORDER BY id_tascap " + 
+			") " + 
+			"SELECT id_instancia FROM y;", nativeQuery=true)
+    BigInteger instantiateT(Integer idProces, Integer titulacio);
+	
+    @Transactional
+	@Query(value="WITH y AS( " + 
+			"  INSERT INTO instancies " + 
+			"  SELECT CAST((id_proces*1000 + lugar) AS bigint)*10000 + 1, id_proces, tlugar, lugar, lugar  centre, ?3 titulacio, 'A' estat, NOW() AS data " + 
+			"  FROM processos p, organs o " + 
+			"  WHERE id_proces=?1 AND ambit='C' AND o.tlugar='C' AND lugar IN (?2) RETURNING id_instancia, id_proces " + 
+			"), x AS( " + 
+			"  INSERT INTO tasquesi(id_tascai, id_instancia, id_tasca, version) " + 
+			"  (SELECT (y.id_instancia*10000 + id_tascap) *100, y.id_instancia, id_tasca, 0 " + 
+			"  FROM tasques t, y " + 
+			"  WHERE y.id_proces=t.id_proces " + 
+			"  ORDER BY id_tascap) RETURNING id_tascai " + 
+			") " + 
+			"SELECT id_instancia FROM y;", nativeQuery=true)
+	BigInteger instantiateC(Integer idProces, Integer centre, Integer titulacio);
+    
+    @Transactional
+	@Query(value="WITH y AS( " + 
+			"  INSERT INTO instancies " + 
+			"  SELECT CAST((id_proces*1000) AS bigint)*10000 + 1, id_proces, 'C' AS tlugar, 0 lugar, 0 centre, ?2 titulacio, 'A' estat, NOW() AS data " + 
+			"  FROM processos p " + 
+			"  WHERE id_proces=?1 AND ambit='U' RETURNING id_instancia, id_proces " + 
+			"), x AS( " + 
+			"  INSERT INTO tasquesi(id_tascai, id_instancia, id_tasca, version) " + 
+			"  (SELECT (y.id_instancia*10000 + id_tascap) *100, y.id_instancia, id_tasca, 0 " + 
+			"  FROM tasques t, y " + 
+			"  WHERE y.id_proces=t.id_proces " + 
+			"  ORDER BY id_tascap) RETURNING id_tascai " + 
+			") " + 
+			"SELECT id_instancia FROM y;", nativeQuery=true)
+	BigInteger instantiateU(Integer idProces, Integer titulacio);
+	
+    @Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="WITH x AS(SELECT id_instancia FROM instancies WHERE id_instancia = ?1) " + 
+			"INSERT INTO tasquesi(id_tascai, id_instancia, id_tasca, version) " + 
+			"SELECT (x.id_instancia*10000 + id_tascap) *100, x.id_instancia, id_tasca, 0 " + 
+			"FROM tasques t, x WHERE t.id_proces = ?2 ORDER BY id_tascap;", nativeQuery=true)
+    void instantiateTasks(BigInteger idInstancia, Integer idProces);
+    
+    @Transactional
+	@Query(value="UPDATE tasquesi SET estat='A', data=NOW() WHERE id_tascai IN(SELECT MIN(id_tascai) FROM tasquesi WHERE id_instancia = ?1) RETURNING id_tascai;", nativeQuery=true)
+	BigInteger activateInstantiatedTask(BigInteger idInstancia);
+    
+    @Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="DELETE FROM instancies WHERE id_instancia = ?1", nativeQuery=true)
+    Integer deleteInstance(BigInteger idInstancia);
+    
+    @Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="DELETE FROM tasquesi WHERE id_instancia = ?1", nativeQuery=true)
+    Integer clearInstance(BigInteger idInstancia);
+	
+}
+

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

@@ -0,0 +1,149 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+import jakarta.persistence.*;
+import java.util.Date;
+
+/**
+ * The persistent class for the tasquesi database table.
+ * 
+ */
+@Entity
+@Table(name="tasquesi")
+@NamedQuery(name="InstanciaTasca.findAll", query="SELECT t FROM InstanciaTasca t")
+public class InstanciaTasca implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_tascai")
+	private BigInteger idInstanciaTasca;
+
+	@Temporal(TemporalType.DATE)
+	@Column(name="data_fet")
+	private Date dataFet;
+	
+	@Temporal(TemporalType.DATE)
+	@Column(name="data")
+	private Date data;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="data_mod")
+	private Date dataMod;
+	
+	private Integer version;
+
+	private String estat;
+
+	private String evidencia;
+	
+	private String text;
+
+	//bi-directional many-to-one association to Instancia
+	@ManyToOne
+	@JoinColumn(name="id_instancia")
+	private Instancia instancia;
+
+	//bi-directional many-to-one association to Tasca
+	@ManyToOne
+	@JoinColumn(name="id_tasca")
+	private Tasca tasca;
+
+	//bi-directional many-to-one association to Usuari
+	@ManyToOne
+	@JoinColumn(name="usuari_fet")
+	private Usuari usuari;
+
+	public InstanciaTasca() {
+	}
+
+	public BigInteger getIdInstanciaTasca() {
+		return this.idInstanciaTasca;
+	}
+
+	public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+		this.idInstanciaTasca = idInstanciaTasca;
+	}
+
+	public Date getDataFet() {
+		return this.dataFet;
+	}
+
+	public void setDataFet(Date dataFet) {
+		this.dataFet = dataFet;
+	}
+	
+	public Date getData() {
+		return this.data;
+	}
+
+	public void setData(Date data) {
+		this.data = data;
+	}
+	
+	public Date getDataMod() {
+		return dataMod;
+	}
+
+	public void setDataMod(Date dataMod) {
+		this.dataMod = dataMod;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+	
+	public String getEstat() {
+		return this.estat;
+	}
+
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+
+	public String getEvidencia() {
+		return this.evidencia;
+	}
+
+	public void setEvidencia(String evidencia) {
+		this.evidencia = evidencia;
+	}
+	
+	public String getText() {
+		return this.text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public Instancia getInstancia() {
+		return this.instancia;
+	}
+
+	public void setInstancia(Instancia instancia) {
+		this.instancia = instancia;
+	}
+
+	public Tasca getTasca() {
+		return this.tasca;
+	}
+
+	public void setTasca(Tasca tasca) {
+		this.tasca = tasca;
+	}
+
+	public Usuari getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(Usuari usuari) {
+		this.usuari = usuari;
+	}
+
+}

+ 160 - 0
src/main/java/es/uv/saic/domain/InstanciaTascaRepository.java

@@ -0,0 +1,160 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+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.TascaInformeTransferDTO;
+
+@Repository
+public interface InstanciaTascaRepository extends JpaRepository<InstanciaTasca, BigInteger> {
+	
+	@Query(nativeQuery=true, value=("""
+		WITH x AS(SELECT id_tasca, max(version) AS version FROM tasquesi WHERE id_instancia = ?1 GROUP BY id_tasca) 
+		SELECT ti.* FROM tasquesi ti, x WHERE ti.id_tasca = x.id_tasca AND ti.version = x.version AND id_instancia = ?1 ORDER BY id_tasca ASC; """))
+	public List<InstanciaTasca> findByInstancia(BigInteger idInstancia);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT ti.* FROM tasquesi ti 
+		LEFT JOIN tasques ta ON ti.id_tasca = ta.id_tasca 
+		WHERE id_instancia = ?1 AND id_tascap = ?2 
+		ORDER BY version DESC LIMIT 1; """))
+	public InstanciaTasca findByInstanciaTascap(BigInteger idInstancia, Integer tascap);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT * FROM tasquesi WHERE id_instancia = ?1 AND id_tasca = ?2 AND version < ?3 ORDER BY data_fet DESC; """))
+	public List<InstanciaTasca> findOlderVerions(BigInteger idInstancia, Integer idTasca, Integer version);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT * FROM tasquesi WHERE id_instancia = ?1 AND estat = 'A' 
+		AND version = (SELECT MAX(version) AS version FROM tasquesi WHERE id_instancia = ?1 AND estat = 'A'); """))
+	public InstanciaTasca findActiveByInstancia(BigInteger idInstancia);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT * FROM tasquesi WHERE estat  = 'A' AND id_tasca IN(SELECT id_tasca FROM tasques WHERE tipus = ?1)"""))
+	public List<InstanciaTasca> findActivesByType(Integer type);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi 
+		WHERE ins.estat = 'A' 
+		AND ins.tlugar = usr.tlugar AND ins.lugar = usr.lugar 
+		AND usr.vigent = TRUE AND usr.usuari = ?1 AND ins.id_instancia = tasi.id_instancia 
+		AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol 
+		AND tas.id_tasca = tasi.id_tasca AND tasi.id_tascai = ?2; """))
+	public BigInteger isUserAutorized(String usuari, BigInteger idTascai);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi, rols rl 
+		WHERE ins.estat = 'A' AND ins.centre = usr.lugar 
+		AND usr.vigent = TRUE AND usr.usuari = ?1 AND ins.id_instancia = tasi.id_instancia 
+		AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol 
+		AND rl.id_rol = usr.id_rol AND rl.ambit = 'C' 
+		AND tas.id_tasca = tasi.id_tasca AND tasi.id_tascai = ?2; """	))
+	public BigInteger isUserAutorizedByAmbitC(String usuari, BigInteger idTascai);
+	
+	@Query("SELECT i FROM InstanciaTasca i WHERE i.instancia.centre = ?1 AND i.instancia.titulacio = ?2 AND i.tasca.proces.nomProces = ?3 AND i.estat = 'E' AND i.tasca.proces.cursAvaluat < ?4")
+	public List<InstanciaTasca> findOlderByProces(Integer centre, Integer titulacio, String nomProces, Integer minCurs);
+
+	@Query(nativeQuery=true, value=("""
+		WITH x AS( 
+			SELECT id_tasca AS id_current FROM tasques WHERE id_proces = ?2 AND id_tascap = ?3 
+		) 
+		SELECT * FROM tasquesi t, x WHERE id_instancia = ?1 AND t.id_tasca = x.id_current 
+		AND version = (SELECT MAX(version) FROM tasquesi t, x WHERE t.id_tasca = x.id_current AND id_instancia = ?1); """))
+	public InstanciaTasca findNext(BigInteger idInstancia, Integer idProces, Integer idTascap);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins  
+		WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' 
+		AND ins.lugar = usr.lugar AND ins.tlugar = usr.tlugar AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 """))
+	public List<Usuari> getUsers(BigInteger idInstancia);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT ti.id_tascai, ti.id_instancia, ti.id_tasca, ti.version, ti.estat, ti.usuari_fet, ti.data_fet, ti.evidencia 
+		FROM tasquesi ti, tasques ta   
+		WHERE ti.id_tasca = ta.id_tasca AND ti.estat = 'A' AND ta.data_lim > NOW(); """))
+	public List<InstanciaTasca> getPastTasks();
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT ti.* FROM tasquesi ti 
+		JOIN tasques ta ON ta.id_tasca = ti.id_tasca 
+		WHERE ti.id_instancia = ?1 AND ta.informe AND estat = 'E' 
+		ORDER BY ta.id_tascap DESC, ti.version DESC  
+		LIMIT 1; """))
+	public InstanciaTasca getReportFromInstancia(BigInteger idInstancia);
+	
+	@Query(nativeQuery=true, value=("""
+		SELECT ti.* FROM tasquesi ti LEFT JOIN tasques ta 
+		ON ti.id_tasca = ta.id_tasca 
+		WHERE ti.id_instancia = ( 
+			SELECT id_instancia FROM instancies 
+			WHERE id_proces = ?1 AND tlugar = ?2 AND lugar = ?3 
+			AND centre = ?4 AND titulacio = ?5 AND estat = 'F' 
+		) 
+		AND ti.estat = 'E' AND ta.informe 
+		ORDER BY ti.id_tascai DESC, ti.version DESC LIMIT 1; """))
+	public InstanciaTasca getReportFromProcesOrgan(Integer idProces, String tlugar, Integer lugar,
+												   Integer centre, Integer titulacio);
+
+	@Query(nativeQuery=true, value=("""
+		SELECT ti.* FROM tasquesi ti LEFT JOIN tasques ta 
+		ON ti.id_tasca = ta.id_tasca 
+		WHERE ti.id_instancia = ( 
+				SELECT id_instancia FROM instancies ic 
+				LEFT JOIN processos pr ON ic.id_proces = pr.id_proces 
+				WHERE pr.nom_proces = ?1 AND ic.tlugar = ?2 AND ic.lugar = ?3 
+				AND ic.centre = ?4 AND ic.titulacio = ?5 AND ic.estat = 'F' 
+				ORDER BY pr.curs_avaluat DESC LIMIT 1 
+			) 
+		AND ti.estat = 'E' AND ta.informe 
+		ORDER BY ti.id_tascai DESC, ti.version DESC LIMIT 1; """))
+	public InstanciaTasca getReportFromNomProcesOrgan(String nomProces, String tlugar, Integer lugar,
+												      Integer centre, Integer titulacio);
+	
+	@Query(nativeQuery=true, value=("""
+			SELECT i.titulacio, pr.id_proces AS idProces, pr.nom_proces AS nomProces, pr.ambit, pr.curs_avaluat AS cursAvaluat, ti.id_tascai, 
+			           ti.id_instancia AS idInstancia, ti.id_tasca AS idTasca, ti.version, ti.estat, ti.usuari_fet AS usuariFet, ti.data_fet AS dataFet, 
+			           ti.evidencia FROM tasquesi ti 
+			LEFT JOIN tasques ta ON ta.id_tasca = ti.id_tasca 
+			LEFT JOIN instancies i ON i.id_instancia = ti.id_instancia 
+			LEFT JOIN processos pr ON pr.id_proces = i.id_proces 
+			WHERE (pr.nom_proces = ?1 OR pr.nom_proces IN(
+				SELECT nom_proces_eq FROM processos_equivalents WHERE nom_proces = ?1 AND (estudi = ?4 OR estudi = 'GM') AND ambit = 'T'
+				)) 
+			AND i.titulacio = ?2 AND pr.ambit = 'T' 
+			AND i.estat = 'F' AND ti.estat = 'E' AND ta.informe 
+			UNION 
+			SELECT i.titulacio, pr.id_proces AS idProces, pr.nom_proces AS nomProces, pr.ambit, pr.curs_avaluat AS cursAvaluat, ti.id_tascai, 
+			       ti.id_instancia AS idInstancia, ti.id_tasca AS idTasca, ti.version, ti.estat, ti.usuari_fet AS usuariFet, ti.data_fet AS dataFet, 
+			       ti.evidencia FROM tasquesi ti 
+			LEFT JOIN tasques ta ON ta.id_tasca = ti.id_tasca 
+			LEFT JOIN instancies i ON i.id_instancia = ti.id_instancia 
+			LEFT JOIN processos pr ON pr.id_proces = i.id_proces 
+			WHERE pr.nom_proces IN(SELECT nom_proces_eq FROM processos_equivalents WHERE nom_proces = ?1 AND (estudi = ?4 OR estudi = 'GM') AND ambit = 'C') 
+			AND i.centre = ?3 AND pr.ambit = 'C' 
+			AND i.estat = 'F' AND ti.estat = 'E' AND ta.informe 
+			ORDER BY cursAvaluat DESC FETCH FIRST 1 ROW ONLY; """))
+	public TascaInformeTransferDTO getLastByProcName(String proc, Integer tit, Integer centre, String estudi);	
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value=("UPDATE tasquesi SET estat = null WHERE estat = 'A' AND id_instancia = ?1"), nativeQuery=true)
+	public void deactivateAll(BigInteger idInstancia);
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value=("DELETE FROM tasquesi WHERE id_instancia = ?1 AND id_tasca = ?2"), nativeQuery=true)
+	public void removeAllVersions(BigInteger idInstancia, Integer idTasca);
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value=("DELETE FROM tasquesi WHERE id_tascai = ?1"), nativeQuery=true)
+	public void remove(BigInteger idInstanciaTasca);
+	
+}
+

+ 214 - 0
src/main/java/es/uv/saic/domain/InstanciaTascaTransfer.java

@@ -0,0 +1,214 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.List;
+
+public class InstanciaTascaTransfer {
+
+	private BigInteger idInstanciaTasca; 
+	private Integer idTasca;
+	private Integer idProces;
+	private String estat;
+	private Integer idTascap;
+	private String centre;
+	private String titulacio;
+	private Date dataLim;
+	private Integer tipus;
+	private String codiEvidencia;
+	private String nomEvidenciaCas;
+	private String nomEvidenciaVal;
+	private String titolCas;
+	private String titolVal;
+	private String descripcioCas;
+	private String descripcioVal;
+	private Date dataFet;
+	private Date dataMod;
+	private String usuariFet;
+	private String evidencia;
+	private String text;
+	private boolean isAssignedToUser;
+	private boolean isExpired;
+	private List<EvidenciaTransfer> oldEvidences;
+	private List<TascaVersioTransfer> versions;
+	private String descripcioRolCas;
+	private String descripcioRolVal;
+	private String estatInstancia;
+	private String opcions;
+	
+	public BigInteger getIdInstanciaTasca() {
+		return idInstanciaTasca;
+	}
+	public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+		this.idInstanciaTasca = idInstanciaTasca;
+	}
+	public String getEstat() {
+		return estat;
+	}
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+	public Integer getIdTascap() {
+		return idTascap;
+	}
+	public void setIdTascap(Integer idtascap) {
+		this.idTascap = idtascap;
+	}
+	public String getCentre() {
+		return centre;
+	}
+	public void setCentre(String centre) {
+		this.centre = centre;
+	}
+	public String getTitulacio() {
+		return titulacio;
+	}
+	public void setTitulacio(String titulacio) {
+		this.titulacio = titulacio;
+	}
+	public Date getDataLim() {
+		return dataLim;
+	}
+	public void setDataLim(Date dataLim) {
+		this.dataLim = dataLim;
+	}
+	public String getCodiEvidencia() {
+		return codiEvidencia;
+	}
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+	public String getNomEvidenciaCas() {
+		return nomEvidenciaCas;
+	}
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getNomEvidenciaVal() {
+		return nomEvidenciaVal;
+	}
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public String getTitolCas() {
+		return titolCas;
+	}
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+	public String getTitolVal() {
+		return titolVal;
+	}
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+	public String getDescripcioCas() {
+		return descripcioCas;
+	}
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+	public String getDescripcioVal() {
+		return descripcioVal;
+	}
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+	public Date getDataFet() {
+		return dataFet;
+	}
+	public void setDataFet(Date dataFet) {
+		this.dataFet = dataFet;
+	}
+	public String getUsuariFet() {
+		return usuariFet;
+	}
+	public void setUsuariFet(String usuariFet) {
+		this.usuariFet = usuariFet;
+	}
+	public boolean getIsAssignedToUser() {
+		return isAssignedToUser;
+	}
+	public void setAssignedToUser(boolean isAssignedToUser) {
+		this.isAssignedToUser = isAssignedToUser;
+	}
+	public boolean getIsExpired() {
+		return isExpired;
+	}
+	public void setIsExpired(boolean isExpired) {
+		this.isExpired = isExpired;
+	}
+	public Integer getIdTasca() {
+		return idTasca;
+	}
+	public void setIdTasca(Integer idTasca) {
+		this.idTasca = idTasca;
+	}
+	public Integer getIdProces() {
+		return idProces;
+	}
+	public void setIdProces(Integer idProces) {
+		this.idProces = idProces;
+	}
+	public Integer getTipus() {
+		return tipus;
+	}
+	public void setTipus(Integer tipus) {
+		this.tipus = tipus;
+	}
+	public String getEvidencia() {
+		return evidencia;
+	}
+	public void setEvidencia(String evidencia) {
+		this.evidencia = evidencia;
+	}
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public List<EvidenciaTransfer> getOldEvidences() {
+		return oldEvidences;
+	}
+	public void setOldEvidences(List<EvidenciaTransfer> oldEvidences) {
+		this.oldEvidences = oldEvidences;
+	}
+	public String getDescripcioRolCas() {
+		return descripcioRolCas;
+	}
+	public void setDescripcioRolCas(String descripcioRolCas) {
+		this.descripcioRolCas = descripcioRolCas;
+	}
+	public String getDescripcioRolVal() {
+		return descripcioRolVal;
+	}
+	public void setDescripcioRolVal(String descripcioRolVal) {
+		this.descripcioRolVal = descripcioRolVal;
+	}
+	public List<TascaVersioTransfer> getVersions() {
+		return versions; 
+	}
+	public void setVersions(List<TascaVersioTransfer> versions) {
+		this.versions = versions;
+	}
+	public String getEstatInstancia() {
+		return estatInstancia;
+	}
+	public void setEstatInstancia(String estatInstancia) {
+		this.estatInstancia = estatInstancia;
+	}
+	public String getOpcions() {
+		return opcions;
+	}
+	public void setOpcions(String opcions) {
+		this.opcions = opcions;
+	}
+	public Date getDataMod() {
+		return dataMod;
+	}
+	public void setDataMod(Date dataMod) {
+		this.dataMod = dataMod;
+	}
+	
+}

+ 77 - 0
src/main/java/es/uv/saic/domain/InstanciaTascaVer.java

@@ -0,0 +1,77 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.sql.Timestamp;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+import jakarta.persistence.Temporal;
+import jakarta.persistence.TemporalType;
+
+@Entity
+@Table(name="tasquesi_ver")
+@IdClass(InstanciaTascaVerPK.class)
+@NamedQuery(name="InstanciaTascaVer.findAll", query="SELECT n FROM InstanciaTascaVer n")
+public class InstanciaTascaVer {
+
+    @Id
+    @Column(name="id_tascai")
+	private BigInteger idInstanciaTasca;
+
+    @Id
+    @Temporal(TemporalType.TIMESTAMP)
+	@Column(name="data_mod")
+	private Timestamp dataMod;
+    
+    private String usuari;
+
+    private String text;
+
+    public InstanciaTascaVer(){}
+
+    public InstanciaTascaVer(BigInteger idInstanciaTasca, String usuari, String text, Timestamp dataMod) {
+        this.idInstanciaTasca = idInstanciaTasca;
+        this.usuari = usuari;
+        this.text = text;
+        this.dataMod = dataMod;
+    }
+
+    public BigInteger getIdInstanciaTasca() {
+        return idInstanciaTasca;
+    }
+
+    public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+        this.idInstanciaTasca = idInstanciaTasca;
+    }
+
+    public String getUsuari() {
+        return usuari;
+    }
+
+    public void setUsuari(String usuari) {
+        this.usuari = usuari;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public Timestamp getDataMod() {
+        return dataMod;
+    }
+
+    public void setDataMod(Timestamp dataMod) {
+        this.dataMod = dataMod;
+    }
+
+    
+
+}

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

@@ -0,0 +1,36 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.sql.Timestamp;
+
+public class InstanciaTascaVerPK implements Serializable  {
+    private static final long serialVersionUID = 1L;
+
+	private BigInteger idInstanciaTasca;
+    private Timestamp dataMod;
+
+    public InstanciaTascaVerPK(){}
+
+    public InstanciaTascaVerPK(BigInteger idInstanciaTasca, Timestamp dataMod) {
+        this.idInstanciaTasca = idInstanciaTasca;
+        this.dataMod = dataMod;
+    }
+
+    public BigInteger getIdInstanciaTasca() {
+        return idInstanciaTasca;
+    }
+
+    public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+        this.idInstanciaTasca = idInstanciaTasca;
+    }
+
+    public Timestamp getdataMod() {
+        return dataMod;
+    }
+
+    public void setDataMod(Timestamp dataMod) {
+        this.dataMod = dataMod;
+    }
+
+}

+ 28 - 0
src/main/java/es/uv/saic/domain/InstanciaTascaVerRepository.java

@@ -0,0 +1,28 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+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;
+
+@Repository
+public interface InstanciaTascaVerRepository extends JpaRepository<InstanciaTascaVer, InstanciaTascaVerPK> {
+
+
+	@Query(value=("SELECT * FROM tasquesi_ver WHERE id_tascai = ?1 AND data_mod = ?2"), nativeQuery=true)
+	public InstanciaTascaVer findById(BigInteger idInstanciaTasca, Date dataMod);
+
+	@Query(value=("SELECT * FROM tasquesi_ver WHERE id_tascai = ?1 ORDER BY data_mod DESC"), nativeQuery=true)
+	public List<InstanciaTascaVer> findByIdInstanciaTasca(BigInteger idInstanciaTasca);
+
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value=("DELETE FROM tasquesi_ver WHERE id_tascai IN(SELECT id_tascai FROM tasquesi WHERE id_instancia = ?1)"), nativeQuery=true)
+	public void deleteByIdInstancia(BigInteger idInstancia);
+
+}

+ 68 - 0
src/main/java/es/uv/saic/domain/InstanciaTascaVersioTransfer.java

@@ -0,0 +1,68 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+public class InstanciaTascaVersioTransfer {
+
+	private BigInteger idInstanciaTasca;
+	private String usuariFet;
+	private Date dataFet;
+	private Integer version;
+	private String nomEvidenciaVal;
+	private String nomEvidenciaCas;
+	private String codiEvidencia;
+	private String estat;
+	
+	
+	public BigInteger getIdInstanciaTasca() {
+		return idInstanciaTasca;
+	}
+	public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+		this.idInstanciaTasca = idInstanciaTasca;
+	}
+	public String getUsuariFet() {
+		return usuariFet;
+	}
+	public void setUsuariFet(String usuariFet) {
+		this.usuariFet = usuariFet;
+	}
+	public Date getDataFet() {
+		return dataFet;
+	}
+	public void setDataFet(Date dataFet) {
+		this.dataFet = dataFet;
+	}
+	public Integer getVersio() {
+		return version;
+	}
+	public void setVersio(Integer version) {
+		this.version = version;
+	}
+	public String getNomEvidenciaVal() {
+		return nomEvidenciaVal;
+	}
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public String getNomEvidenciaCas() {
+		return nomEvidenciaCas;
+	}
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getCodiEvidencia() {
+		return codiEvidencia;
+	}
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+	public String getEstat() {
+		return estat;
+	}
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+	
+	
+}

+ 178 - 0
src/main/java/es/uv/saic/domain/InstanciaTransfer.java

@@ -0,0 +1,178 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+public class InstanciaTransfer {
+
+	private BigInteger idInstancia;
+	private Integer idProces;
+	private String nomProces;
+	private String titolCas;
+	private String titolVal;
+	private String descripcioCas;
+	private String descripcioVal;
+	private String centreCas;
+	private String centreVal;
+	private String titulacioCas;
+	private String titulacioVal;
+	private Integer ruct;
+	private String estat;
+	private Integer cursAvaluat;
+	private Integer cursActivacio;
+	private String nomTascaActivaCas;
+	private String nomTascaActivaVal;
+	private String descTascaActivaCas;
+	private String descTascaActivaVal;
+	private Date dataLimTascaActiva;
+	private Date dataTascaActiva;
+	private Integer idTascapActiva;
+	private boolean tascaActivaExpired;
+	private boolean tascaActivaAssignedToUser;	
+
+	public BigInteger getIdInstancia() {
+		return idInstancia;
+	}
+	public void setIdInstancia(BigInteger idInstancia) {
+		this.idInstancia = idInstancia;
+	}
+	public Integer getIdProces() {
+		return idProces;
+	}
+	public void setIdProces(Integer idProces) {
+		this.idProces = idProces;
+	}
+	public String getNomProces() {
+		return nomProces;
+	}
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+	public String getTitolCas() {
+		return titolCas;
+	}
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+	public String getTitolVal() {
+		return titolVal;
+	}
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+	public String getDescripcioCas() {
+		return descripcioCas;
+	}
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+	public String getDescripcioVal() {
+		return descripcioVal;
+	}
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+	public String getCentreCas() {
+		return centreCas;
+	}
+	public void setCentreCas(String centreCas) {
+		this.centreCas = centreCas;
+	}
+	public String getCentreVal() {
+		return centreVal;
+	}
+	public void setCentreVal(String centreVal) {
+		this.centreVal = centreVal;
+	}
+	public String getTitulacioCas() {
+		return titulacioCas;
+	}
+	public void setTitulacioCas(String titulacioCas) {
+		this.titulacioCas = titulacioCas;
+	}
+	public String getTitulacioVal() {
+		return titulacioVal;
+	}
+	public void setTitulacioVal(String titulacioVal) {
+		this.titulacioVal = titulacioVal;
+	}
+	public Integer getRuct() {
+		return ruct;
+	}
+	public void setRuct(Integer ruct) {
+		this.ruct = ruct;
+	}
+	public String getEstat() {
+		return estat;
+	}
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+	public Integer getCursAvaluat() {
+		return cursAvaluat;
+	}
+	public void setCursAvaluat(Integer cursAvaluat) {
+		this.cursAvaluat = cursAvaluat;
+	}
+	public Integer getCursActivacio() {
+		return cursActivacio;
+	}
+	public void setCursActivacio(Integer cursActivacio) {
+		this.cursActivacio = cursActivacio;
+	}
+	public String getNomTascaActivaCas() {
+		return nomTascaActivaCas;
+	}
+	public void setNomTascaActivaCas(String nomTascaActiva) {
+		this.nomTascaActivaCas = nomTascaActiva;
+	}
+	public Date getDataTascaActiva() {
+		return dataTascaActiva;
+	}
+	public void setDataTascaActiva(Date dataTascaActiva) {
+		this.dataTascaActiva = dataTascaActiva;
+	}
+	public Date getDataLimTascaActiva() {
+		return dataLimTascaActiva;
+	}
+	public void setDataLimTascaActiva(Date dataLimTascaActiva) {
+		this.dataLimTascaActiva = dataLimTascaActiva;
+	}
+	public String getNomTascaActivaVal() {
+		return nomTascaActivaVal;
+	}
+	public void setNomTascaActivaVal(String nomTascaActivaVal) {
+		this.nomTascaActivaVal = nomTascaActivaVal;
+	}
+	public String getDescTascaActivaCas() {
+		return descTascaActivaCas;
+	}
+	public void setDescTascaActivaCas(String descTascaActivaCas) {
+		this.descTascaActivaCas = descTascaActivaCas;
+	}
+	public String getDescTascaActivaVal() {
+		return descTascaActivaVal;
+	}
+	public void setDescTascaActivaVal(String descTascaActivaVal) {
+		this.descTascaActivaVal = descTascaActivaVal;
+	}
+	public Integer getIdTascapActiva() {
+		return idTascapActiva;
+	}
+	public void setIdTascapActiva(Integer idTascapActiva) {
+		this.idTascapActiva = idTascapActiva;
+	}
+	public boolean getTascaActivaExpired() {
+		return tascaActivaExpired;
+	}
+	public void setTascaActivaExpired(boolean expired) {
+		this.tascaActivaExpired = expired;
+	}
+	public boolean getTascaActivaAssignedToUser() {
+		return tascaActivaAssignedToUser;
+	}
+	public void setTascaActivaAssignedToUser(boolean tascaActivaAssignedToUser) {
+		this.tascaActivaAssignedToUser = tascaActivaAssignedToUser;
+	}
+
+}

+ 99 - 0
src/main/java/es/uv/saic/domain/Link.java

@@ -0,0 +1,99 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+
+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="links")
+@NamedQuery(name="Link.findAll", query="SELECT i FROM Link i")
+public class Link {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id")
+	private Integer id;
+
+	@Column(name="ruct")
+	private Integer ruct;
+
+	@Column(name="token")
+	private String token;
+	
+    @Column(name="link")
+	private String link;
+
+    @Column(name="data")
+	private Date data;
+	
+    @Column(name="data_exp")
+	private Date dataExp;
+	
+    @Column(name="visites")
+	private Integer visites;
+
+    public Link(){}
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getRuct() {
+        return ruct;
+    }
+
+    public void setRuct(Integer ruct) {
+        this.ruct = ruct;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getLink() {
+        return link;
+    }
+
+    public void setLink(String link) {
+        this.link = link;
+    }
+
+    public Date getData() {
+        return data;
+    }
+
+    public void setData(Date data) {
+        this.data = data;
+    }
+
+    public Date getDataExp() {
+        return dataExp;
+    }
+
+    public void setDataExp(Date dataExp) {
+        this.dataExp = dataExp;
+    }
+
+    public Integer getVisites() {
+        return visites;
+    }
+
+    public void setVisites(Integer visites) {
+        this.visites = visites;
+    }
+	
+}

+ 18 - 0
src/main/java/es/uv/saic/domain/LinkRepository.java

@@ -0,0 +1,18 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface LinkRepository extends JpaRepository<Link, Integer>  {
+
+    @Query(value="SELECT * FROM links WHERE token = ?1 AND data_exp > CURRENT_DATE;", nativeQuery=true)
+	Link findByToken(String token); 
+
+    @Query(value="SELECT * FROM links WHERE ruct = ?1 AND data_exp > CURRENT_DATE;", nativeQuery=true)
+	List<Link> findByRuct(Integer ruct); 
+    
+}

+ 85 - 0
src/main/java/es/uv/saic/domain/Noticia.java

@@ -0,0 +1,85 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+
+/**
+ * The persistent class for the noticia database table.
+ * 
+ */
+@Entity
+@NamedQuery(name="Noticia.findAll", query="SELECT n FROM Noticia n")
+public class Noticia implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_noticia")
+	private Integer idNoticia;
+
+	@Column(name="texto_c")
+	private String textoC;
+
+	@Column(name="texto_v")
+	private String textoV;
+
+	@Column(name="titulo_c")
+	private String tituloC;
+
+	@Column(name="titulo_v")
+	private String tituloV;
+
+	private Boolean visible;
+
+	public Noticia() {
+	}
+
+	public Integer getIdNoticia() {
+		return this.idNoticia;
+	}
+
+	public void setIdNoticia(Integer idNoticia) {
+		this.idNoticia = idNoticia;
+	}
+
+	public String getTextoC() {
+		return this.textoC;
+	}
+
+	public void setTextoC(String textoC) {
+		this.textoC = textoC;
+	}
+
+	public String getTextoV() {
+		return this.textoV;
+	}
+
+	public void setTextoV(String textoV) {
+		this.textoV = textoV;
+	}
+
+	public String getTituloC() {
+		return this.tituloC;
+	}
+
+	public void setTituloC(String tituloC) {
+		this.tituloC = tituloC;
+	}
+
+	public String getTituloV() {
+		return this.tituloV;
+	}
+
+	public void setTituloV(String tituloV) {
+		this.tituloV = tituloV;
+	}
+
+	public Boolean getVisible() {
+		return this.visible;
+	}
+
+	public void setVisible(Boolean visible) {
+		this.visible = visible;
+	}
+
+}

+ 16 - 0
src/main/java/es/uv/saic/domain/NoticiaRepository.java

@@ -0,0 +1,16 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface NoticiaRepository extends JpaRepository<Noticia, Long> {
+	
+	@Query("SELECT i FROM Noticia i WHERE i.visible = true")
+	List<Noticia> findVisibles();
+	
+}
+

+ 212 - 0
src/main/java/es/uv/saic/domain/Organ.java

@@ -0,0 +1,212 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Entity
+@Table(name="organs")
+@NamedQuery(name="Organ.findAll", query="SELECT o FROM Organ o")
+public class Organ implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@EmbeddedId
+	private OrganPK id;
+
+	private Boolean actiu;
+
+	@Column(name="nom_cas")
+	private String nomCas;
+
+	@Column(name="nom_val")
+	private String nomVal;
+
+	private Integer ruct;
+	
+	private String tambit;
+
+	//bi-directional many-to-one association to Instancia
+	@OneToMany(mappedBy="organ")
+	private List<Instancia> instancias;
+	
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar2", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar2", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Organ
+	@OneToMany(mappedBy="organ")
+	private List<Organ> organsFill;
+	
+	@OneToMany()
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private List<OrganEquivalent> organsEquivalents;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="organ")
+	
+	private List<UsuarisRol> usuarisRols;
+	
+	@OneToOne()
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+	})
+	private Acreditacio acreditacio;
+	
+	@Transient
+	private String codis;
+
+	public Organ() {}
+
+	public OrganPK getId() {
+		return this.id;
+	}
+
+	public void setId(OrganPK id) {
+		this.id = id;
+	}
+
+	public Boolean getActiu() {
+		return this.actiu;
+	}
+
+	public void setActiu(Boolean actiu) {
+		this.actiu = actiu;
+	}
+
+	public String getNomCas() {
+		return this.nomCas;
+	}
+
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+
+	public String getNomVal() {
+		return this.nomVal;
+	}
+
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+
+	public Integer getRuct() {
+		return this.ruct;
+	}
+
+	public void setRuct(Integer ruct) {
+		this.ruct = ruct;
+	}
+	
+	public String getTambit() {
+		return this.tambit;
+	}
+
+	public void setTambit(String tambit) {
+		this.tambit = tambit;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public List<Organ> getOrgansFill() {
+		return organsFill;
+	}
+	
+	public Organ addOrganFill(Organ o) {
+		this.getOrgansFill().add(o);
+		return o;
+	}
+	
+	public Organ removeOrganFill(Organ o) {
+		this.getOrgansFill().remove(o);
+		return o;
+	}
+
+	public void setOrgansFill(List<Organ> organsFill) {
+		this.organsFill = organsFill;
+	}
+
+	public List<Instancia> getInstancies() {
+		return this.instancias;
+	}
+
+	public void setInstancies(List<Instancia> instancias) {
+		this.instancias = instancias;
+	}
+
+	public Instancia addInstancia(Instancia instancia) {
+		this.getInstancies().add(instancia);
+		instancia.setOrgan(this);
+
+		return instancia;
+	}
+
+	public Instancia removeInstancia(Instancia instancia) {
+		this.getInstancies().remove(instancia);
+		instancia.setOrgan(null);
+
+		return instancia;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.usuarisRols;
+	}
+
+	public void setUsuarisRols(List<UsuarisRol> usuarisRols) {
+		this.usuarisRols = usuarisRols;
+	}
+
+	public UsuarisRol addUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setOrgan(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setOrgan(null);
+
+		return usuarisRol;
+	}
+	
+	public Acreditacio getAcreditacio() {
+		return acreditacio;
+	}
+
+	public void setAcreditacio(Acreditacio acreditacio) {
+		this.acreditacio = acreditacio;
+	}
+
+	@Transient
+	public String getCodis() {
+		return codis;
+	}
+	
+	@Transient
+	public void setCodis() {
+		this.codis = organsEquivalents.stream()
+									  .map(i->i.getLugarEq().toString())
+									  .collect(Collectors.joining(", "));
+		if(this.codis.isEmpty()) {
+			this.codis = this.getId().getLugar().toString();
+		}
+		else {
+			this.codis = this.getId().getLugar().toString() +", "+ this.codis;
+		}
+	}
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/OrganEquivalent.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.IdClass;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name="organs_equivalents")
+@NamedQuery(name="OrganEquivalent.findAll", query="SELECT o FROM OrganEquivalent o")
+@IdClass(OrganEquivalentPK.class)
+public class OrganEquivalent {
+
+	@Id
+	private String tlugar;
+	
+	@Id
+	private Integer lugar;
+	
+	@Id
+	@Column(name="tlugar_eq")
+	private String tlugarEq;
+	
+	@Id
+	@Column(name="lugar_eq")
+	private Integer lugarEq;
+	
+	public OrganEquivalent() {}
+
+	public String getTlugar() {
+		return tlugar;
+	}
+
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+
+	public Integer getLugar() {
+		return lugar;
+	}
+
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	public String getTlugarEq() {
+		return tlugarEq;
+	}
+
+	public void setTlugarEq(String tlugarEq) {
+		this.tlugarEq = tlugarEq;
+	}
+
+	public Integer getLugarEq() {
+		return lugarEq;
+	}
+
+	public void setLugarEq(Integer lugarEq) {
+		this.lugarEq = lugarEq;
+	}
+	
+}

+ 61 - 0
src/main/java/es/uv/saic/domain/OrganEquivalentPK.java

@@ -0,0 +1,61 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class OrganEquivalentPK implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+	private Integer lugar;
+	private String tlugarEq;
+	private Integer lugarEq;
+	
+	public OrganEquivalentPK() {}
+	
+	public String getTlugar() {
+		return tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+	public String getTlugarEq() {
+		return tlugarEq;
+	}
+	public void setTlugarEq(String tlugarEq) {
+		this.tlugarEq = tlugarEq;
+	}
+	public Integer getLugarEq() {
+		return lugarEq;
+	}
+	public void setLugarEq(Integer lugarEq) {
+		this.lugarEq = lugarEq;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(lugar, lugarEq, tlugar, tlugarEq);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		OrganEquivalentPK other = (OrganEquivalentPK) obj;
+		return Objects.equals(lugar, other.lugar) && Objects.equals(lugarEq, other.lugarEq)
+				&& Objects.equals(tlugar, other.tlugar) && Objects.equals(tlugarEq, other.tlugarEq);
+	}
+	
+	
+
+}

+ 51 - 0
src/main/java/es/uv/saic/domain/OrganPK.java

@@ -0,0 +1,51 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+@Embeddable
+public class OrganPK implements Serializable {
+	//default serial version id, required for serializable classes.
+	private static final long serialVersionUID = 1L;
+
+	private String tlugar;
+
+	private Integer lugar;
+
+	public OrganPK() {
+	}
+	public String getTlugar() {
+		return this.tlugar;
+	}
+	public void setTlugar(String tlugar) {
+		this.tlugar = tlugar;
+	}
+	public Integer getLugar() {
+		return this.lugar;
+	}
+	public void setLugar(Integer lugar) {
+		this.lugar = lugar;
+	}
+
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof OrganPK)) {
+			return false;
+		}
+		OrganPK castOther = (OrganPK)other;
+		return 
+			this.tlugar.equals(castOther.tlugar)
+			&& this.lugar.equals(castOther.lugar);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.tlugar.hashCode();
+		hash = hash * prime + this.lugar.hashCode();
+		
+		return hash;
+	}
+}

+ 97 - 0
src/main/java/es/uv/saic/domain/OrganRepository.java

@@ -0,0 +1,97 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import es.uv.saic.dto.OrganDTO;
+import es.uv.saic.dto.OrganRepositoryDTO;
+
+@Repository
+public interface OrganRepository extends JpaRepository<Organ, OrganPK> {
+
+	@Query("SELECT i FROM Organ i WHERE i.id.tlugar = ?1 AND i.id.lugar = ?2")
+	public Organ findByTlugarLugar(String tlugar, Integer lugar);
+	
+	@Query(value=("SELECT * FROM organs WHERE ruct = ?1 AND actiu"), nativeQuery=true)
+	public Organ findByRuct(Integer ruct);
+
+	@Query(value=("SELECT o1.lugar AS lugar, o1.tlugar AS tlugar," + 
+				"o1.lugar2 AS lugar2, o1.tlugar2 AS tlugar2, " + 
+				"o1.nom_cas AS nomCas, o1.nom_val AS nomVal," + 
+				"o1.ruct AS ruct, o1.tambit AS tambit," + 
+				"o2.nom_cas AS nomCas2, o2.nom_val AS nomVal2, " +
+				"o2.ruct AS ruct2 " + 
+				"FROM organs AS o1 JOIN organs AS o2 on o1.tlugar2 = o2.tlugar AND o1.lugar2 = o2.lugar WHERE o1.ruct = ?1 AND o1.actiu = true;"), nativeQuery=true)
+	public OrganDTO findByRuctDTO(Integer ruct);
+
+	@Query(value=("""
+		SELECT lugar FROM organs WHERE tlugar = ?1 AND lugar = ?2
+		UNION 
+		SELECT lugar FROM organs_equivalents WHERE tlugar_eq = ?1 AND lugar_eq = ?2; """), nativeQuery=true)
+	public List<Integer> exists(String tlugar, Integer lugar);
+	
+	@Query(value=("SELECT * FROM organs "
+			+ "WHERE tlugar = 'C' "
+			+ "AND lugar IN(SELECT DISTINCT centre FROM instancies)"), nativeQuery=true)
+	public List<Organ> findCurrentCentres();
+	
+	@Query(value=("SELECT DISTINCT titulacio FROM instancies WHERE centre IN(?1)"), nativeQuery=true)
+	public List<Integer> findTitulacionsByCentre(List<Integer> centre);
+
+	@Query(value=("SELECT * FROM organs WHERE actiu = true AND tlugar = 'T' AND tlugar2 = 'C' AND lugar = ?1 ORDER BY nom_val"), nativeQuery=true)
+	public Organ findByTitulacio(Integer titulacio);
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND tlugar2 = 'C' AND lugar = ?1 ORDER BY nom_val"), nativeQuery=true)
+	public Organ findSupervisableByTitulacio(Integer titulacio);
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findAllTitulacions();
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'C' ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findAllCentres();
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'C' AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findAllActiveCentres();
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findActiveTitulacions();
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'C' AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findActiveCentres();
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND tlugar2 = 'C' AND lugar2 = ?1 AND actiu ORDER BY tambit, nom_val"), nativeQuery=true)
+	public List<Organ> findActiveTitulacionsByCentre(Integer centre);	
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND tlugar2 = 'C' AND lugar2 = ?1 AND CAST(lugar/1000 AS integer) = ?2 AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findActiveTitulacionsByTypeCentre(Integer centre, Integer type);	
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND tlugar2 = 'C' AND lugar2 = ?1 AND tambit = ?2 AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findActiveTitulacionsByCentreTambit(Integer centre, String tambit);
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar NOT IN (0, 1, 2) AND tlugar2 = 'C' AND lugar2 IN(?1) AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findAllTitulacionsByCentres(List<Integer> centres);
+	
+	@Query(value=("SELECT * FROM organs WHERE tlugar = 'T' AND lugar IN(SELECT lugar FROM usuaris_rols WHERE usuari = ?1 AND tlugar = 'T') AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findTitulacionsByUsuari(String usuari);
+	
+	@Query(value=("SELECT DISTINCT * FROM organs WHERE lugar IN(SELECT lugar FROM usuaris_rols WHERE usuari = ?1 AND tlugar = 'C') " + 
+			"OR lugar IN(SELECT org.lugar2 FROM organs org, usuaris_rols usr WHERE usr.usuari = ?1 AND usr.tlugar = 'T' AND org.lugar = usr.lugar) " + 
+			"AND actiu ORDER BY nom_val"), nativeQuery=true)
+	public List<Organ> findCentresByUsuari(String usuari);
+	
+	@Query(value=("SELECT lugar_eq FROM organs_equivalents WHERE lugar = ?1 AND tlugar = ?2 AND tlugar_eq = ?2 ORDER BY lugar_eq DESC"), nativeQuery=true)
+	public List<Integer> getEquivalents(Integer lugar, String tlugar);
+
+	@Query(value=("SELECT o1.lugar AS lugar, o1.tlugar AS tlugar," + 
+				"o1.lugar2 AS lugar2, o1.tlugar2 AS tlugar2, " + 
+				"o1.nom_cas AS nomCas, o1.nom_val AS nomVal," + 
+				"o1.ruct AS ruct, o1.tambit AS tambit," + 
+				"o2.nom_cas AS nomCas2, o2.nom_val AS nomVal2, " +
+				"o2.ruct AS ruct2 " + 
+				"FROM organs AS o1 JOIN organs AS o2 on o1.tlugar2 = o2.tlugar AND o1.lugar2 = o2.lugar WHERE o1.actiu = true;"), nativeQuery=true)
+	public List<OrganRepositoryDTO> findAllTitulacionsWithCentre();
+	
+}

+ 126 - 0
src/main/java/es/uv/saic/domain/Plantilla.java

@@ -0,0 +1,126 @@
+package es.uv.saic.domain;
+
+import java.sql.Timestamp;
+
+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="plantilles")
+@NamedQuery(name="Plantilla.findAll", query="SELECT t FROM Plantilla t")
+public class Plantilla {
+
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_plantilla")
+	private Integer idPlantilla;
+	
+	@Column(name="versio")
+	private Integer versio;
+	
+	@Column(name="codi")
+	private String codi;
+	
+	@Column(name="nom_cas")
+	private String nomCas;
+	
+	@Column(name="nom_val")
+	private String nomVal;
+	
+	@Column(name="data_creacio")
+	private Timestamp data_creacio;
+	
+	@Column(name="data_mod")
+	private Timestamp data_mod;
+	
+	@Column(name="text")
+	private String text;
+	
+	@Column(name="ambit")
+	private String ambit;
+
+	public Integer getIdPlantilla() {
+		return idPlantilla;
+	}
+
+	public void setIdPlantilla(Integer idPlantilla) {
+		this.idPlantilla = idPlantilla;
+	}
+
+	public Integer getVersio() {
+		return versio;
+	}
+
+	public void setVersio(Integer versio) {
+		this.versio = versio;
+	}
+
+	public String getCodi() {
+		return codi;
+	}
+
+	public void setCodi(String codi) {
+		this.codi = codi;
+	}
+
+	public String getNomCas() {
+		return nomCas;
+	}
+
+	public void setNomCas(String nomCas) {
+		this.nomCas = nomCas;
+	}
+
+	public String getNomVal() {
+		return nomVal;
+	}
+
+	public void setNomVal(String nomVal) {
+		this.nomVal = nomVal;
+	}
+
+	public Timestamp getData_creacio() {
+		return data_creacio;
+	}
+
+	public void setData_creacio(Timestamp data_creacio) {
+		this.data_creacio = data_creacio;
+	}
+
+	public Timestamp getData_mod() {
+		return data_mod;
+	}
+
+	public void setData_mod(Timestamp data_mod) {
+		this.data_mod = data_mod;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public String getAmbit() {
+		return ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+	
+	
+}

+ 62 - 0
src/main/java/es/uv/saic/domain/PlantillaComentario.java

@@ -0,0 +1,62 @@
+package es.uv.saic.domain;
+
+public class PlantillaComentario {
+	
+	private String uid;
+	private String author;
+	private String authorName;
+	private String content;
+	private String createdAt;
+	private String modifiedAt;
+	
+	public PlantillaComentario() {}
+	
+	public PlantillaComentario(String uid, String author, String authorName, String content, String createdAt,
+			String modifiedAt) {
+		this.uid = uid;
+		this.author = author;
+		this.authorName = authorName;
+		this.content = content;
+		this.createdAt = createdAt;
+		this.modifiedAt = modifiedAt;
+	}
+	public String getUid() {
+		return uid;
+	}
+	public void setUid(String uid) {
+		this.uid = uid;
+	}
+	public String getAuthor() {
+		return author;
+	}
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+	public String getAuthorName() {
+		return authorName;
+	}
+	public void setAuthorName(String authorName) {
+		this.authorName = authorName;
+	}
+	public String getContent() {
+		return content;
+	}
+	public void setContent(String content) {
+		this.content = content;
+	}
+	public String getCreatedAt() {
+		return createdAt;
+	}
+	public void setCreatedAt(String createdAt) {
+		this.createdAt = createdAt;
+	}
+	public String getModifiedAt() {
+		return modifiedAt;
+	}
+	public void setModifiedAt(String modifiedAt) {
+		this.modifiedAt = modifiedAt;
+	}
+	
+	
+
+}

+ 66 - 0
src/main/java/es/uv/saic/domain/PlantillaConversation.java

@@ -0,0 +1,66 @@
+package es.uv.saic.domain;
+
+import java.util.Collection;
+import java.util.List;
+
+public class PlantillaConversation {
+
+	private String uid;
+	private List<PlantillaComentario> comments;
+	
+	public PlantillaConversation() {}
+	
+	public PlantillaConversation(String uid, List<PlantillaComentario> comments) {
+		this.uid = uid;
+		this.comments = comments;
+	}
+
+	public String getUid() {
+		return uid;
+	}
+
+	public void setUid(String uid) {
+		this.uid = uid;
+	}
+
+	public List<PlantillaComentario> getComments() {
+		return comments;
+	}
+
+	public void setComments(List<PlantillaComentario> comments) {
+		this.comments = comments;
+	}
+	
+	public boolean add(PlantillaComentario arg0) {
+		return comments.add(arg0);
+	}
+
+	public boolean addAll(Collection<? extends PlantillaComentario> arg0) {
+		return comments.addAll(arg0);
+	}
+
+	public boolean addAll(int arg0, Collection<? extends PlantillaComentario> arg1) {
+		return comments.addAll(arg0, arg1);
+	}
+
+	public void clear() {
+		comments.clear();
+	}
+
+	public boolean contains(Object arg0) {
+		return comments.contains(arg0);
+	}
+
+	public PlantillaComentario get(int arg0) {
+		return comments.get(arg0);
+	}
+
+	public PlantillaComentario remove(int arg0) {
+		return comments.remove(arg0);
+	}
+
+	public int size() {
+		return comments.size();
+	}
+	
+}

+ 24 - 0
src/main/java/es/uv/saic/domain/PlantillaRepository.java

@@ -0,0 +1,24 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface PlantillaRepository extends JpaRepository<Plantilla, Integer> {
+
+	Plantilla findByIdPlantilla(Integer idPlantilla);
+	
+	@Query(value=("SELECT * FROM plantilles WHERE "
+			+ "id_plantilla IN(SELECT CAST(codi_evidencia AS INTEGER) FROM tasques WHERE tipus = 11 AND codi_evidencia IS NOT NULL) "
+			+ "AND id_plantilla = ?1"), nativeQuery=true)
+	List<Plantilla> findUsedByIdPlantilla(Integer idPlantilla);
+	
+	@Query(value=("SELECT * FROM plantilles WHERE "
+			+ "versio = ?1 AND codi = ?2 AND ambit = ?3"), nativeQuery=true)
+	Plantilla findByVersioCodiAmbit(Integer versio, String codi, String ambit);
+	
+}

+ 198 - 0
src/main/java/es/uv/saic/domain/Proces.java

@@ -0,0 +1,198 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+
+
+@Entity
+@Table(name="processos")
+@NamedQuery(name="Proces.findAll", query="SELECT p FROM Proces p")
+public class Proces implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_proces")
+	private Integer idProces;
+
+	private String ambit;
+
+	@Column(name="curs_activacio")
+	private Integer cursActivacio;
+
+	@Column(name="curs_avaluat")
+	private Integer cursAvaluat;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="nom_proces")
+	private String nomProces;
+
+	@Column(name="titol_cas")
+	private String titolCas;
+
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	private String comentaris;
+
+	private String versio;
+
+	@Column(name="sub_titol")
+	private String subTitol;
+
+	//bi-directional many-to-one association to Instancia
+	@OneToMany(mappedBy="proces")
+	private List<Instancia> instancies;
+
+	//bi-directional many-to-one association to Tasca
+	@OneToMany(mappedBy="proces")
+	private List<Tasca> tasques;	
+
+	public Proces() {}
+
+	public Integer getIdProces() {
+		return this.idProces;
+	}
+
+	public void setIdProces(Integer idProces) {
+		this.idProces = idProces;
+	}
+
+	public String getAmbit() {
+		return this.ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+
+	public Integer getCursActivacio() {
+		return this.cursActivacio;
+	}
+
+	public void setCursActivacio(Integer cursActivacio) {
+		this.cursActivacio = cursActivacio;
+	}
+
+	public Integer getCursAvaluat() {
+		return this.cursAvaluat;
+	}
+
+	public void setCursAvaluat(Integer cursAvaluat) {
+		this.cursAvaluat = cursAvaluat;
+	}
+
+	public String getDescripcioCas() {
+		return this.descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return this.descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public String getNomProces() {
+		return this.nomProces;
+	}
+
+	public void setNomProces(String nomProces) {
+		this.nomProces = nomProces;
+	}
+
+	public String getTitolCas() {
+		return this.titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return this.titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+	
+	public String getComentaris() {
+		return this.comentaris;
+	}
+
+	public void setComentaris(String comentaris) {
+		this.comentaris = comentaris;
+	}
+
+	public String getVersio() {
+		return this.versio;
+	}
+
+	public void setVersio(String versio) {
+		this.versio = versio;
+	}
+
+	public String getSubTitol() {
+		return this.subTitol;
+	}
+
+	public void setSubTitol(String subTitol) {
+		this.subTitol = subTitol;
+	}
+
+	public List<Instancia> getInstancies() {
+		return this.instancies;
+	}
+
+	public void setInstancies(List<Instancia> instancies) {
+		this.instancies = instancies;
+	}
+
+	public Instancia addInstancia(Instancia instancia) {
+		getInstancies().add(instancia);
+		instancia.setProces(this);
+
+		return instancia;
+	}
+
+	public Instancia removeInstancia(Instancia instancia) {
+		getInstancies().remove(instancia);
+		instancia.setProces(null);
+
+		return instancia;
+	}
+
+	public List<Tasca> getTasques() {
+		return this.tasques;
+	}
+
+	public void setTasques(List<Tasca> tasques) {
+		this.tasques = tasques;
+	}
+
+	public Tasca addTasca(Tasca tasca) {
+		getTasques().add(tasca);
+		tasca.setProces(this);
+
+		return tasca;
+	}
+
+	public Tasca removeTasca(Tasca tasca) {
+		getTasques().remove(tasca);
+		tasca.setProces(null);
+ 
+		return tasca;
+	}
+
+}

+ 75 - 0
src/main/java/es/uv/saic/domain/ProcesRepository.java

@@ -0,0 +1,75 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ProcesRepository extends JpaRepository<Proces, Integer> {
+
+	@Query("SELECT i FROM Proces i WHERE i.nomProces = ?1")
+	List<Proces> findByName(String nom);
+	
+	@Query("SELECT i FROM Proces i WHERE i.nomProces = ?1 AND i.cursAvaluat = ?2")
+	List<Proces> findByNameCurs(String nom, Integer curs);
+	
+	@Query(value="SELECT DISTINCT id_proces FROM processos WHERE curs_avaluat IN (?1) AND id_proces IN("
+			+ "SELECT id_proces FROM instancies WHERE centre IN(?2) AND titulacio IN(?3) AND nom_proces = ?4)", nativeQuery=true)
+	List<Integer> findProcsByCentreTitulacioCursNom(List<Integer> cursos, List<Integer> centres, List<Integer> titulacions, String nom);
+
+	@Query(value="SELECT DISTINCT id_proces FROM processos WHERE curs_avaluat IN (?1) AND id_proces IN("
+			+ "SELECT id_proces FROM instancies WHERE centre IN(?2) AND titulacio IN(?3)) ", nativeQuery=true)
+	List<Integer> findProcsByCentreTitulacioCurs(List<Integer> cursos, List<Integer> centres, List<Integer> titulacions);
+	
+	@Query(value="SELECT DISTINCT curs_avaluat FROM processos WHERE id_proces IN("
+			+ "SELECT id_proces FROM instancies WHERE centre IN(?1) AND titulacio IN(?2))", nativeQuery=true)
+	List<Integer> findCursosByCentreTitulacio(List<Integer> centres, List<Integer> titulacions);
+
+	@Query(nativeQuery=true, value=("""
+			SELECT T1.txt FROM(
+				SELECT CASE
+						WHEN 
+							ta.tipus IN(2, 20) 
+						THEN 
+							CONCAT(ta.id_tascap, '@{shape: hex, label: \"', 
+							CASE WHEN LENGTH(ta.titol_cas) > 497 THEN CONCAT(LEFT(ta.titol_cas, 497), '...') ELSE ta.titol_cas END,
+							' <br> <strong>Asignado a:</strong> ', ro.descripcio_cas, '<br> <strong>Fecha límite:</strong> ', ta.data_lim, '\"}')
+						WHEN
+							ta.tipus IN(21, 22) 
+						THEN 
+							CONCAT(ta.id_tascap, '@{shape: procs, label: \"', 
+							CASE WHEN LENGTH(ta.titol_cas) > 497 THEN CONCAT(LEFT(ta.titol_cas, 497), '...') ELSE ta.titol_cas END,
+							' <br> <strong>Asignado a:</strong> ', ro.descripcio_cas, '<br> <strong>Fecha límite:</strong> ', ta.data_lim, '\"}')
+						WHEN
+							ta.tipus IN(1, 11, 12, 14, 15) 
+						THEN 
+							CONCAT(ta.id_tascap, '@{shape: lean-r, label: \"', 
+							CASE WHEN LENGTH(ta.titol_cas) > 497 THEN CONCAT(LEFT(ta.titol_cas, 497), '...') ELSE ta.titol_cas END,
+							' <br> <strong>Asignado a:</strong> ', ro.descripcio_cas, '<br> <strong>Fecha límite:</strong> ', ta.data_lim, '\"}')
+						ELSE 
+							CONCAT(ta.id_tascap, '[\"', 
+							CASE WHEN LENGTH(ta.titol_cas) > 497 THEN CONCAT(LEFT(ta.titol_cas, 497), '...') ELSE ta.titol_cas END,
+							' <br> <strong>Asignado a:</strong> ', ro.descripcio_cas, '<br> <strong>Fecha límite:</strong> ', ta.data_lim, '\"]')
+					END AS txt, ta.id_tascap, 1 AS ordr 
+				FROM tasques ta LEFT JOIN rols ro ON ro.id_rol = ta.id_rol 
+				WHERE ta.id_proces IN(SELECT id_proces FROM processos WHERE nom_proces = ?1 ORDER BY id_proces DESC LIMIT 1)
+				UNION
+				SELECT CASE
+							WHEN tipus = 2 OR tipus = 20 THEN CONCAT(id_tascap, '-->|SÍ|', id_tasca_seg)
+					ELSE 
+							CONCAT(id_tascap, '-->', id_tasca_seg) 
+					END AS txt, id_tascap, 2 AS ordr 
+				FROM tasques 
+				WHERE id_proces IN(SELECT id_proces FROM processos WHERE nom_proces = ?1 ORDER BY id_proces DESC LIMIT 1) AND id_tasca_seg != 9999
+				UNION
+				SELECT CONCAT(id_tascap, '-->|NO|', id_tasca_seg2) AS txt, id_tascap, 2 AS ordr 
+				FROM tasques 
+				WHERE (tipus = 2 OR tipus = 20) AND id_proces IN(SELECT id_proces FROM processos WHERE nom_proces = ?1 ORDER BY id_proces DESC LIMIT 1) AND id_tasca_seg2 != 9999
+				ORDER BY ordr ASC, id_tascap ASC
+			) AS T1; """))
+	public List<String> getFlowDiagram(String proc);
+	
+}
+

+ 124 - 0
src/main/java/es/uv/saic/domain/Rol.java

@@ -0,0 +1,124 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.List;
+
+
+@Entity
+@Table(name="rols")
+@NamedQuery(name="Rol.findAll", query="SELECT r FROM Rol r")
+public class Rol implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_rol")
+	private Integer idRol;
+
+	private String ambit;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+	
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="nom_rol")
+	private String nomRol;
+
+	//bi-directional many-to-one association to Tasca
+	@OneToMany(mappedBy="rol")
+	private List<Tasca> tasques;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="rol")
+	private List<UsuarisRol> usuarisRols;
+
+	public Rol() {
+	}
+
+	public Integer getIdRol() {
+		return this.idRol;
+	}
+
+	public void setIdRol(Integer idRol) {
+		this.idRol = idRol;
+	}
+
+	public String getAmbit() {
+		return this.ambit;
+	}
+
+	public void setAmbit(String ambit) {
+		this.ambit = ambit;
+	}
+	
+	public String getDescripcioCas() {
+		return descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public String getNomRol() {
+		return this.nomRol;
+	}
+
+	public void setNomRol(String nomRol) {
+		this.nomRol = nomRol;
+	}
+
+	public List<Tasca> getTasques() {
+		return this.tasques;
+	}
+
+	public void setTasques(List<Tasca> tasques) {
+		this.tasques = tasques;
+	}
+
+	public Tasca addTasque(Tasca tasca) {
+		getTasques().add(tasca);
+		tasca.setRol(this);
+
+		return tasca;
+	}
+
+	public Tasca removeTasque(Tasca tasca) {
+		getTasques().remove(tasca);
+		tasca.setRol(null);
+
+		return tasca;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.usuarisRols;
+	}
+
+	public void setUsuarisRols(List<UsuarisRol> usuarisRols) {
+		this.usuarisRols = usuarisRols;
+	}
+
+	public UsuarisRol addUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setRol(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeUsuarisRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setRol(null);
+
+		return usuarisRol;
+	}
+
+}

+ 17 - 0
src/main/java/es/uv/saic/domain/RolRepository.java

@@ -0,0 +1,17 @@
+package es.uv.saic.domain;
+
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface RolRepository extends JpaRepository<Rol, Integer> {
+
+	@Query(value=("SELECT * FROM rols WHERE id_rol NOT IN (1) ORDER BY descripcio_cas"), nativeQuery=true)
+	List<Rol> findAssignables();
+
+}

+ 101 - 0
src/main/java/es/uv/saic/domain/ScheduledTasks.java

@@ -0,0 +1,101 @@
+package es.uv.saic.domain;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.List;
+
+import jakarta.mail.MessagingException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import es.uv.saic.service.CalendariService;
+import es.uv.saic.service.EmailService;
+import es.uv.saic.service.InstanciaService;
+import es.uv.saic.service.InstanciaTascaService;
+import es.uv.saic.service.ParserService;
+import es.uv.saic.service.SysStatusService;
+import es.uv.saic.service.UsuariService;
+
+@Component
+@SuppressWarnings("unused")
+public class ScheduledTasks {
+	
+	@Autowired
+	private EmailService es;
+	@Autowired
+	private InstanciaService it;
+	@Autowired
+	private InstanciaTascaService its;
+	@Autowired
+	private UsuariService us;
+	@Autowired
+	private ParserService ps;
+	@Autowired
+	private CalendariService cs;
+	@Autowired
+	private SysStatusService sss;
+	@Value("${saic.mailer.queue.enabled}")
+	private String queueEnabled;
+	@Value("${saic.mailer.reminder.enabled}")
+	private String reminderEnabled;
+	@Value("${saic.mailer.calendar.enabled}")
+	private String calendarEnabled;
+	@Value("${saic.mailer.maxMailsPerRound}")
+	private Integer maxMailsPerRound;
+	@Value("${saic.parser.surveys.enabled}")
+	private String parserEnabled;
+	@Value("${saic.scheduler.expired.enabled}")
+	private String expiredEnabled;
+
+	@Scheduled(fixedDelay = 300000)
+	public void sendInstanceMails() {
+		if(Boolean.parseBoolean(this.queueEnabled)) {
+			Integer counter = 0;
+			while(!es.pendingQueueIsEmpty() && counter < maxMailsPerRound) {
+				es.sendActiveTaskNext();
+				counter+=1;
+			}
+		}
+	}
+	
+	@Scheduled(cron="0 0 1 * * *")
+	public void sendReminderMails() {
+		if(Boolean.parseBoolean(this.reminderEnabled)) {
+			sss.log("Start sending mail reminders");
+			for(InstanciaTasca instanciaTasca : its.getPastTasks()) {
+				for(Usuari u : us.getInstanceAsignedUsers(instanciaTasca.getInstancia().getIdInstancia())) {
+					Email email = new Email();
+					email.setUsusari(u);
+					email.setInstanciaTasca(instanciaTasca);
+					es.addEmail(email);
+				}
+			}
+		}
+	}
+	
+	@Scheduled(cron="0 0 1 * * *")
+	public void sendCalendarMails() throws MessagingException {
+		if(Boolean.parseBoolean(this.calendarEnabled)) {
+			Integer counter = 0;
+			Usuari u = this.us.findByUsername("system");
+			List<Calendari> events = this.cs.getNextEvents();
+			for(Calendari e : events) {
+				this.es.sendCalendarMail(u, e);
+				counter+=1;
+			}
+		}
+	}
+	
+	@Scheduled(cron="0 0 1 * * *")
+	public void closeExpiredTasks() {
+		if(Boolean.parseBoolean(this.expiredEnabled)) {
+			// to do in future
+		}
+	}
+
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/SupervisionSearchParams.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class SupervisionSearchParams implements Serializable{
+	
+	private static final long serialVersionUID = 1L;
+	private List<Integer> centres;
+	private List<Integer> cursos;
+	private List<Integer> titulacions;
+	private List<String> procediments;
+	private List<String> evidencies;
+	private String searchType;
+	
+	
+	public SupervisionSearchParams(List<Integer> centres, List<Integer> titulacions, List<Integer> cursos, 
+								   List<String> procediments, List<String> evidencies, String searchType) {
+		super();
+		this.centres = centres;
+		this.cursos = cursos;
+		this.titulacions = titulacions;
+		this.procediments = procediments;
+		this.evidencies = evidencies;
+		this.searchType = searchType;
+	}
+	public List<Integer> getCentres() {
+		return centres;
+	}
+	public void setCentres(List<Integer> centres) {
+		this.centres = centres;
+	}
+	public List<Integer> getCursos() {
+		return cursos;
+	}
+	public void setCursos(List<Integer> cursos) {
+		this.cursos = cursos;
+	}
+	public List<Integer> getTitulacions() {
+		return titulacions;
+	}
+	public void setTitulacions(List<Integer> titulacions) {
+		this.titulacions = titulacions;
+	}
+	public List<String> getProcediments() {
+		return procediments;
+	}
+	public void setProcediments(List<String> procediments) {
+		this.procediments = procediments;
+	}
+	public List<String> getEvidencies() {
+		return evidencies;
+	}
+	public void setEvidencies(List<String> evidencies) {
+		this.evidencies = evidencies;
+	}
+	public String getSearchType() {
+		return searchType;
+	}
+	public void setSearchType(String searchType) {
+		this.searchType = searchType;
+	}
+	
+}

+ 81 - 0
src/main/java/es/uv/saic/domain/SysStatus.java

@@ -0,0 +1,81 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.Date;
+
+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="sys_status")
+@NamedQuery(name="SysStatus.findAll", query="SELECT t FROM SysStatus t")
+public class SysStatus implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_status")
+	private Integer idStatus;
+	
+	@Column(name="timestamp")
+	private Timestamp timestamp;
+	
+	@Column(name="type")
+	private String type;
+	
+	@Column(name="msg")
+	private String msg;
+	
+	@Column(name="err")
+	private String err;
+
+	public Integer getIdStatus() {
+		return idStatus;
+	}
+
+	public void setIdStatus(Integer idStatus) {
+		this.idStatus = idStatus;
+	}
+
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(Timestamp timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	
+	public String getErr() {
+		return err;
+	}
+
+	public void setErr(String err) {
+		this.err = err;
+	}
+	
+	
+	
+	
+}

+ 15 - 0
src/main/java/es/uv/saic/domain/SysStatusRepository.java

@@ -0,0 +1,15 @@
+package es.uv.saic.domain;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SysStatusRepository extends JpaRepository<SysStatus, Integer> {
+
+	@Query("SELECT i FROM SysStatus i WHERE i.type = ?1")
+	List<SysStatus> findByType(String type);
+	
+}

+ 256 - 0
src/main/java/es/uv/saic/domain/Tasca.java

@@ -0,0 +1,256 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+
+import jakarta.persistence.*;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * The persistent class for the tasques database table.
+ * 
+ */
+@Entity
+@Table(name="tasques")
+@NamedQuery(name="Tasca.findAll", query="SELECT t FROM Tasca t")
+public class Tasca implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_tasca")
+	private Integer idTasca;
+
+	@Column(name="codi_evidencia")
+	private String codiEvidencia;
+
+	@Temporal(TemporalType.DATE)
+	@Column(name="data_lim")
+	private Date dataLim;
+
+	@Column(name="descripcio_cas")
+	private String descripcioCas;
+
+	@Column(name="descripcio_val")
+	private String descripcioVal;
+
+	@Column(name="id_tasca_seg")
+	private Integer idTascaSeg;
+
+	@Column(name="id_tasca_seg2")
+	private Integer idTascaSeg2;
+
+	@Column(name="id_tascap")
+	private Integer idTascap;
+
+	@Column(name="nom_evidencia_cas")
+	private String nomEvidenciaCas;
+	
+	@Column(name="nom_evidencia_val")
+	private String nomEvidenciaVal;
+
+	@Column(name="titol_cas")
+	private String titolCas;
+
+	@Column(name="titol_val")
+	private String titolVal;
+	
+	@Column(name="opcions")
+	private String opcions;
+	
+	@Column(name="informe")
+	private Boolean informe;
+
+	//bi-directional many-to-one association to Proces
+	@ManyToOne
+	@JoinColumn(name="id_proces")
+	private Proces proces;
+
+	//bi-directional many-to-one association to Rol
+	@ManyToOne
+	@JoinColumn(name="id_rol")
+	private Rol rol;
+
+	//bi-directional many-to-one association to Tipus
+	@ManyToOne
+	@JoinColumn(name="tipus")
+	private Tipus tipus;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="tasca")
+	private List<InstanciaTasca> instancies;
+
+	public Tasca() {
+	}
+
+	public Integer getIdTasca() {
+		return this.idTasca;
+	}
+
+	public void setIdTasca(Integer idTasca) {
+		this.idTasca = idTasca;
+	}
+
+	public String getCodiEvidencia() {
+		return this.codiEvidencia;
+	}
+
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+
+	public Date getDataLim() {
+		return this.dataLim;
+	}
+
+	public void setDataLim(Date dataLim) {
+		this.dataLim = dataLim;
+	}
+
+	public String getDescripcioCas() {
+		return this.descripcioCas;
+	}
+
+	public void setDescripcioCas(String descripcioCas) {
+		this.descripcioCas = descripcioCas;
+	}
+
+	public String getDescripcioVal() {
+		return this.descripcioVal;
+	}
+
+	public void setDescripcioVal(String descripcioVal) {
+		this.descripcioVal = descripcioVal;
+	}
+
+	public Integer getIdTascaSeg() {
+		return this.idTascaSeg;
+	}
+
+	public void setIdTascaSeg(Integer idTascaSeg) {
+		this.idTascaSeg = idTascaSeg;
+	}
+
+	public Integer getIdTascaSeg2() {
+		return this.idTascaSeg2;
+	}
+
+	public void setIdTascaSeg2(Integer idTascaSeg2) {
+		this.idTascaSeg2 = idTascaSeg2;
+	}
+
+	public Integer getIdTascap() {
+		return this.idTascap;
+	}
+
+	public void setIdTascap(Integer idTascap) {
+		this.idTascap = idTascap;
+	}
+
+	public String getNomEvidenciaCas() {
+		return this.nomEvidenciaCas;
+	}
+
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getNomEvidenciaVal() {
+		return this.nomEvidenciaVal;
+	}
+
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public String getTitolCas() {
+		return this.titolCas;
+	}
+
+	public void setTitolCas(String titolCas) {
+		this.titolCas = titolCas;
+	}
+
+	public String getTitolVal() {
+		return this.titolVal;
+	}
+
+	public void setTitolVal(String titolVal) {
+		this.titolVal = titolVal;
+	}
+
+	public Proces getProces() {
+		return this.proces;
+	}
+
+	public void setProces(Proces proces) {
+		this.proces = proces;
+	}
+
+	public Rol getRol() {
+		return this.rol;
+	}
+
+	public void setRol(Rol rol) {
+		this.rol = rol;
+	}
+
+	public Tipus getTipus() {
+		return this.tipus;
+	}
+
+	public void setTipus(Tipus tipus) {
+		this.tipus = tipus;
+	}
+
+	public List<InstanciaTasca> getInstancies() {
+		return this.instancies;
+	}
+
+	public void setInstancies(List<InstanciaTasca> instanciaTascas) {
+		this.instancies = instanciaTascas;
+	}
+
+	public InstanciaTasca addInstancia(InstanciaTasca instanciaTasca) {
+		this.getInstancies().add(instanciaTasca);
+		instanciaTasca.setTasca(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstancia(InstanciaTasca instanciaTasca) {
+		this.getInstancies().remove(instanciaTasca);
+		instanciaTasca.setTasca(null);
+
+		return instanciaTasca;
+	}
+	
+	public boolean isExpired() {
+		if(this.getDataLim() != null) {
+			if((new Date(this.getDataLim().getTime()+(1000 * 60 * 60 * 24))).before(new Date())) {
+				return true;
+			}
+			else {
+				return false;
+			}
+		}
+		else {
+			return false;
+		}
+	}
+	
+	public void setOpcions(String opcions) {
+		this.opcions = opcions;
+	}
+
+	public String getOpcions() {
+		return this.opcions;
+	}
+	
+	public void setInforme(Boolean informe) {
+		this.informe = informe;
+	}
+
+	public Boolean getInforme() {
+		return this.informe;
+	}
+
+}

+ 48 - 0
src/main/java/es/uv/saic/domain/TascaRepository.java

@@ -0,0 +1,48 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+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.EvidenciaBuscadorDTO;
+
+@Repository
+public interface TascaRepository extends JpaRepository<Tasca, Integer> {
+
+	@Query(value=("SELECT * FROM tasques WHERE id_proces = ?1 ORDER BY id_tascap ASC"), nativeQuery=true)
+	List<Tasca> findByProces(Integer idProces);
+	
+	@Query(value=("SELECT * FROM tasques WHERE id_proces = ?1 AND id_tascap = ?2"), nativeQuery=true)
+	Tasca findByProcesTascap(Integer idProces, Integer idTascap);
+	
+	@Query(value=("SELECT DISTINCT codi_evidencia AS codiEvidencia, nom_evidencia_cas AS nomEvidenciaCas, nom_evidencia_val AS nomEvidenciaVal FROM tasques"), nativeQuery=true)
+	List<EvidenciaBuscadorDTO> findAllEvidencies();
+	
+	@Query(value=("SELECT DISTINCT ta.codi_evidencia AS codiEvidencia, ta.nom_evidencia_cas AS nomEvidenciaCas, ta.nom_evidencia_val AS nomEvidenciaVal " + 
+			"FROM tasques ta, tasquesi ti, instancies ia, processos pr " + 
+			"WHERE ta.id_tasca = ti.id_tasca AND ti.id_instancia = ia.id_instancia AND ta.id_proces = pr.id_proces " + 
+			"AND ia.centre IN (?1) AND ia.titulacio IN (?2) AND pr.curs_avaluat IN (?3)"), nativeQuery=true)
+	List<EvidenciaBuscadorDTO> findEvidenciesByCentreTitulacioCurs(List<Integer> centres, List<Integer> titulacions, List<Integer> cursos);
+	
+	@Query(value=("SELECT DISTINCT codi_evidencia AS codiEvidencia, nom_evidencia_cas AS nomEvidenciaCas, "
+			+ "id_tascap AS idTascap, nom_evidencia_val AS nomEvidenciaVal FROM tasques "
+			+ "WHERE id_proces = ?1 AND codi_evidencia IS NOT NULL AND codi_evidencia <> ''"), nativeQuery=true)
+	List<EvidenciaBuscadorDTO> getEvidencesByProcedure(Integer idProcedure);
+	
+	@Query(value=("SELECT DISTINCT codi_evidencia AS codiEvidencia "
+			+ "FROM tasques "
+			+ "WHERE codi_evidencia IS NOT NULL AND codi_evidencia <> ''"), nativeQuery=true)
+	List<String> getAllAvailableEvidences();
+	
+	@Transactional
+    @Modifying(flushAutomatically = true, clearAutomatically = true)
+	@Query(value="INSERT INTO tasques VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)", nativeQuery=true)
+    Integer create(Integer idTasca, Integer idProces, Integer idTascap, String titolCas, String descripcioCas, String titolVal, 
+    		String descripcioVal, Date dataLim, Integer tipus, Integer idTascaSeg, Integer idTascaSeg2, Integer idRol, String codiEvidencia);
+	
+}

+ 76 - 0
src/main/java/es/uv/saic/domain/TascaVersioTransfer.java

@@ -0,0 +1,76 @@
+package es.uv.saic.domain;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+public class TascaVersioTransfer {
+
+	private BigInteger idInstanciaTasca;
+	private String usuariFet;
+	private Date dataFet;
+	private Integer version;
+	private String nomEvidenciaVal;
+	private String nomEvidenciaCas;
+	private String codiEvidencia; 
+	private String estat;
+	private Integer tipus;  
+	
+	public TascaVersioTransfer() {}
+
+	public BigInteger getIdInstanciaTasca() {
+		return idInstanciaTasca;
+	}
+	public void setIdInstanciaTasca(BigInteger idInstanciaTasca) {
+		this.idInstanciaTasca = idInstanciaTasca;
+	}
+	public String getUsuariFet() {
+		return usuariFet;
+	}
+	public void setUsuariFet(String usuariFet) {
+		this.usuariFet = usuariFet;
+	}
+	public Date getDataFet() {
+		return dataFet;
+	}
+	public void setDataFet(Date dataFet) {
+		this.dataFet = dataFet;
+	}
+	public Integer getVersion() {
+		return version;
+	}
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+	public String getNomEvidenciaVal() {
+		return nomEvidenciaVal;
+	}
+	public void setNomEvidenciaVal(String nomEvidenciaVal) {
+		this.nomEvidenciaVal = nomEvidenciaVal;
+	}
+	public String getNomEvidenciaCas() {
+		return nomEvidenciaCas;
+	}
+	public void setNomEvidenciaCas(String nomEvidenciaCas) {
+		this.nomEvidenciaCas = nomEvidenciaCas;
+	}
+	public String getCodiEvidencia() {
+		return codiEvidencia;
+	}
+	public void setCodiEvidencia(String codiEvidencia) {
+		this.codiEvidencia = codiEvidencia;
+	}
+	public String getEstat() {
+		return estat;
+	}
+	public void setEstat(String estat) {
+		this.estat = estat;
+	}
+	public Integer getTipus() {
+		return tipus;
+	}
+	public void setTipus(Integer tipus) {
+		this.tipus = tipus;
+	}
+	
+	
+}

+ 42 - 0
src/main/java/es/uv/saic/domain/Tipus.java

@@ -0,0 +1,42 @@
+package es.uv.saic.domain;
+
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+
+/**
+ * The persistent class for the tipus database table.
+ * 
+ */
+@Entity
+@NamedQuery(name="Tipus.findAll", query="SELECT t FROM Tipus t")
+public class Tipus implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	private Integer tipus;
+
+	private String descripcio;
+
+
+	public Tipus() {
+	}
+
+	public Integer getTipus() {
+		return this.tipus;
+	}
+
+	public void setTipus(Integer tipus) {
+		this.tipus = tipus;
+	}
+
+	public String getDescripcio() {
+		return this.descripcio;
+	}
+
+	public void setDescripcio(String descripcio) {
+		this.descripcio = descripcio;
+	}
+
+}

+ 11 - 0
src/main/java/es/uv/saic/domain/TipusRepository.java

@@ -0,0 +1,11 @@
+package es.uv.saic.domain;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+//import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface TipusRepository extends JpaRepository<Tipus, Integer> {
+
+}

+ 210 - 0
src/main/java/es/uv/saic/domain/Usuari.java

@@ -0,0 +1,210 @@
+package es.uv.saic.domain;
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * The persistent class for the usuaris database table.
+ * 
+ */
+@Entity
+@Table(name="usuaris")
+@NamedQuery(name="Usuari.findAll", query="SELECT u FROM Usuari u")
+public class Usuari implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	private String usuari;
+
+	private String clau;
+
+	private String cognoms;
+
+	private String email;
+
+	private Boolean ldap;
+
+	private String nom;
+	
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="data_ultim")
+	private Date dataUltim;
+	
+	private String locale;
+
+	//bi-directional many-to-one association to InstanciaTasca
+	@OneToMany(mappedBy="usuari")
+	private List<InstanciaTasca> instanciesTasques;
+
+	//bi-directional many-to-one association to UsuarisRol
+	@OneToMany(mappedBy="usuari")
+	private List<UsuarisRol> rols;
+	
+	@Transient
+	private boolean isGranted;
+	
+	@Transient
+	private boolean isAdmin;
+	
+	@Transient
+	private boolean isDataTest;
+
+	public Usuari() {
+	}
+
+	public String getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(String usuari) {
+		this.usuari = usuari;
+	}
+
+	public String getClau() {
+		return this.clau;
+	}
+
+	public void setClau(String clau) {
+		this.clau = clau;
+	}
+
+	public String getCognoms() {
+		return this.cognoms;
+	}
+
+	public void setCognoms(String cognoms) {
+		this.cognoms = cognoms;
+	}
+
+	public String getEmail() {
+		return this.email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public Boolean getLdap() {
+		return this.ldap;
+	}
+
+	public void setLdap(Boolean ldap) {
+		this.ldap = ldap;
+	}
+
+	public String getNom() {
+		return this.nom;
+	}
+
+	public void setNom(String nom) {
+		this.nom = nom;
+	}
+	
+	public Date getDataUltim() {
+		return this.dataUltim;
+	}
+
+	public void setDataUltim(Date dataUltim) {
+		this.dataUltim = dataUltim;
+	}
+	
+	public String getLocale() {
+		return this.locale;
+	}
+	
+	public void setLocale(String locale) {
+		this.locale = locale;
+	}
+
+	public List<InstanciaTasca> getInstanciesTasques() {
+		return this.instanciesTasques;
+	}
+
+	public void setInstanciesTasques(List<InstanciaTasca> instanciaTascas) {
+		this.instanciesTasques = instanciaTascas;
+	}
+
+	public InstanciaTasca addInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciesTasques().add(instanciaTasca);
+		instanciaTasca.setUsuari(this);
+
+		return instanciaTasca;
+	}
+
+	public InstanciaTasca removeInstanciaTasca(InstanciaTasca instanciaTasca) {
+		getInstanciesTasques().remove(instanciaTasca);
+		instanciaTasca.setUsuari(null);
+
+		return instanciaTasca;
+	}
+
+	public List<UsuarisRol> getUsuarisRols() {
+		return this.rols;
+	}
+
+	public void setUsuariRols(List<UsuarisRol> usuarisRols) {
+		this.rols = usuarisRols;
+	}
+
+	public UsuarisRol addRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().add(usuarisRol);
+		usuarisRol.setUsuari(this);
+
+		return usuarisRol;
+	}
+
+	public UsuarisRol removeRol(UsuarisRol usuarisRol) {
+		getUsuarisRols().remove(usuarisRol);
+		usuarisRol.setUsuari(null);
+
+		return usuarisRol;
+	}
+	
+	public boolean isGranted() {
+		return this.isGranted;
+	}
+
+	public void setGranted(boolean isGranted) {
+		this.isGranted = isGranted;
+	}
+	public boolean isAdmin() {
+		return this.isAdmin;
+	}
+
+	public void setAdmin(boolean isAdmin) {
+		this.isAdmin = isAdmin;
+	}
+
+	public boolean isDataTest() {
+		return isDataTest;
+	}
+
+	public void setDataTest(boolean isDataTest) {
+		this.isDataTest = isDataTest;
+	}
+	
+	public boolean equals(Object other) {
+		if (this == other) {
+			return true;
+		}
+		if (!(other instanceof Usuari)) {
+			return false;
+		}
+		Usuari castOther = (Usuari)other;
+		return 
+			this.usuari.equals(castOther.usuari);
+	}
+
+	public int hashCode() {
+		final int prime = 31;
+		int hash = 17;
+		hash = hash * prime + this.usuari.hashCode();
+		
+		return hash;
+	}
+	
+}

+ 90 - 0
src/main/java/es/uv/saic/domain/UsuariRepository.java

@@ -0,0 +1,90 @@
+package es.uv.saic.domain;
+
+
+
+import java.math.BigInteger;
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import es.uv.saic.dto.TascaAsignadaDTO;
+
+
+@Repository
+public interface UsuariRepository extends JpaRepository<Usuari, String> {
+	
+	@Query("SELECT i FROM Usuari i WHERE i.usuari = ?1")
+	Usuari findByUsername(String usuari);
+	
+	@Query(value=("(SELECT ur.tlugar AS tLugar, ur.lugar AS lugar, id_proces AS idProces , id_instancia AS instancia, id_tascai AS instanciaTasca, id_tascap AS tascaP, ur.id_rol AS rol \n"+ 
+			"FROM usuaris_rols ur \n"+
+			"INNER JOIN tasquesi ti ON ur.tlugar=ti.tlugar AND ur.lugar=ti.lugar \n"+
+			"WHERE ur.tlugar=ti.tlugar AND ur.id_rol=ti.id_rol AND vigent \n"+ 
+			"AND estat='A' AND usuari=?1) \n"+
+			"UNION \n"+
+			"(SELECT ur.tlugar AS tLugar, ur.lugar AS lugar, id_proces AS idProces , id_instancia AS instancia, id_tascai AS instanciaTasca, id_tascap AS tascaP, ur.id_rol AS rol \n"+
+			"FROM usuaris_rols ur, organs o, tasquesi ti \n"+
+			"WHERE ti.tlugar='T' AND ti.tlugar=o.tlugar AND ti.lugar=o.lugar AND o.tlugar2=ur.tlugar AND o.lugar2=ur.lugar \n"+
+			"AND ur.id_rol=ti.id_rol \n"+
+			"AND vigent \n"+
+			"AND estat='A' AND usuari=?1)"), nativeQuery=true)
+	List<TascaAsignadaDTO> findActiveInstanciaTasques(String usuari);
+	
+	@Query(value=("SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi WHERE ins.estat = 'A' " + 
+			"AND ((ins.tlugar = usr.tlugar AND ins.lugar = usr.lugar) OR (ins.centre = usr.lugar AND usr.tlugar = 'C')) " +
+			"AND tasi.id_instancia = ins.id_instancia " + 
+			"AND usr.vigent AND usr.usuari = ?1 AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' " + 
+			"AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol ORDER BY ins.id_instancia ASC"), nativeQuery=true)
+	List<BigInteger> findActiveInstancies(String usuari);
+	
+	@Query(value=("SELECT DISTINCT(ins.id_instancia) FROM instancies ins, usuaris_rols usr, tasques tas, tasquesi tasi WHERE ins.estat = 'A'\n" + 
+			"AND usr.usuari = ?1 AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' AND tasi.id_instancia = ins.id_instancia\n" + 
+			"AND tas.id_proces = ins.id_proces AND tas.id_rol = usr.id_rol AND usr.vigent ORDER BY ins.id_instancia ASC"), nativeQuery=true)
+	List<BigInteger> findActiveInstanciesGranted(String usuari);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE lugar = ?1 AND tlugar = ?2"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessos(Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE centre = ?1"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessosResp(Integer centre);
+	
+	@Query(value=("SELECT id_instancia FROM instancies WHERE id_proces IN(SELECT id_proces FROM processos WHERE nom_proces IN(?1))"), nativeQuery=true)
+	List<BigInteger> findSupervisableProcessosSupervisor(List<String> procs);
+	
+	@Query(value=("SELECT DISTINCT(centre) FROM (SELECT o.lugar AS centre FROM usuaris_rols u " + 
+			 "LEFT JOIN organs o ON u.tlugar = o.tlugar AND u.lugar = o.lugar " + 
+			 "WHERE o.tlugar = 'C' AND u.usuari = ?1 AND u.vigent " + 
+			 "UNION " + 
+			 "SELECT lugar2 AS centre FROM usuaris_rols u " + 
+			 "LEFT JOIN organs o ON u.tlugar = o.tlugar AND u.lugar = o.lugar " + 
+			 "WHERE o.tlugar = 'T' AND u.usuari = ?1 AND u.vigent) a"), nativeQuery=true)
+	List<Integer> findSupervisableCentres(String usuari);
+	
+	@Query(value=("SELECT DISTINCT ins.centre FROM instancies ins "
+			+ "LEFT JOIN processos pr ON pr.id_proces = ins.id_proces "
+			+ "WHERE pr.nom_proces IN(?1)"), nativeQuery=true)
+	List<Integer> findSupervisableCentresSupervisor(List<String> procs);
+	
+	@Query(value="SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND ins.lugar = usr.lugar AND ins.tlugar = usr.tlugar AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol "
+			+ "UNION "
+			+ "SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND ins.centre = usr.lugar AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol "
+			+ "UNION "
+			+ "SELECT us.* FROM usuaris us, usuaris_rols usr, tasques tas, tasquesi tasi, instancies ins "
+			+ "WHERE us.usuari = usr.usuari AND tasi.id_tasca = tas.id_tasca AND tasi.estat = 'A' "
+			+ "AND usr.lugar = 0 AND usr.tlugar = 'U' AND ins.id_instancia = tasi.id_instancia AND ins.id_instancia = ?1 "
+			+ "AND usr.vigent AND tas.id_rol = usr.id_rol ", nativeQuery=true)
+	public List<Usuari> getInstanceAsignedUsers(BigInteger idInstancia);
+	
+	@Query(value=("SELECT * FROM usuaris WHERE usuari IN(SELECT DISTINCT usuari FROM usuaris_rols WHERE id_rol = ?1 "
+			+ "AND (lugar IN(?2) OR lugar IN (SELECT lugar FROM organs WHERE tlugar = 'T' AND lugar2 IN(?2))) AND vigent)"), nativeQuery=true)
+	List<Usuari> findByRolCentre(Integer idRol, List<Integer> centres);
+
+}

+ 127 - 0
src/main/java/es/uv/saic/domain/UsuarisRol.java

@@ -0,0 +1,127 @@
+package es.uv.saic.domain;
+
+
+import java.io.Serializable;
+import jakarta.persistence.*;
+import java.util.Date;
+
+/**
+ * The persistent class for the usuaris_rols database table.
+ * 
+ */
+@Entity
+@Table(name="usuaris_rols")
+@NamedQuery(name="UsuarisRol.findAll", query="SELECT u FROM UsuarisRol u")
+public class UsuarisRol implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@Column(name="id_usuari_rol")
+	private Integer idUsuariRol;
+
+	@Temporal(TemporalType.DATE)
+	private Date fin;
+
+	@Temporal(TemporalType.DATE)
+	private Date inici;
+
+	private Integer num;
+
+	private Integer supervisor;
+
+	private Boolean vigent;
+
+	//bi-directional many-to-one association to Organ
+	@ManyToOne
+	@JoinColumns({
+		@JoinColumn(name="lugar", referencedColumnName="lugar"),
+		@JoinColumn(name="tlugar", referencedColumnName="tlugar")
+		})
+	private Organ organ;
+
+	//bi-directional many-to-one association to Rol
+	@ManyToOne
+	@JoinColumn(name="id_rol")
+	private Rol rol;
+
+	//bi-directional many-to-one association to Usuari
+	@ManyToOne
+	@JoinColumn(name="usuari")
+	private Usuari usuari;
+
+	public UsuarisRol() {
+	}
+
+	public Integer getIdUsuariRol() {
+		return this.idUsuariRol;
+	}
+
+	public void setIdUsuariRol(Integer idUsuariRol) {
+		this.idUsuariRol = idUsuariRol;
+	}
+
+	public Date getFin() {
+		return this.fin;
+	}
+
+	public void setFin(Date fin) {
+		this.fin = fin;
+	}
+
+	public Date getInici() {
+		return this.inici;
+	}
+
+	public void setInici(Date inici) {
+		this.inici = inici;
+	}
+
+	public Integer getNum() {
+		return this.num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getSupervisor() {
+		return this.supervisor;
+	}
+
+	public void setSupervisor(Integer supervisor) {
+		this.supervisor = supervisor;
+	}
+
+	public Boolean getVigent() {
+		return this.vigent;
+	}
+
+	public void setVigent(Boolean vigent) {
+		this.vigent = vigent;
+	}
+
+	public Organ getOrgan() {
+		return this.organ;
+	}
+
+	public void setOrgan(Organ organ) {
+		this.organ = organ;
+	}
+
+	public Rol getRol() {
+		return this.rol;
+	}
+
+	public void setRol(Rol rol) {
+		this.rol = rol;
+	}
+
+	public Usuari getUsuari() {
+		return this.usuari;
+	}
+
+	public void setUsuari(Usuari usuariBean) {
+		this.usuari = usuariBean;
+	}
+
+}

+ 64 - 0
src/main/java/es/uv/saic/domain/UsuarisRolRepository.java

@@ -0,0 +1,64 @@
+package es.uv.saic.domain;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface UsuarisRolRepository extends JpaRepository<UsuarisRol, Long> {
+
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1")
+	List<UsuarisRol> findByUsername(String usuari);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE")
+	List<UsuarisRol> findByUsernameActive(Usuari usuari);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol = ?2")
+	UsuarisRol findByUsernameActiveRol(Usuari usuari, String Rol);
+	
+	@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.nomRol IN(?2)")
+	UsuarisRol findByUsernameActiveRoles(Usuari usuari, ArrayList<String> Rol);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE usuari = ?1 AND tlugar = ?2 AND lugar = ?3 AND vigent LIMIT 1"), nativeQuery=true)
+	UsuarisRol findActiveByUsuariTlugarLugar(String usuari, String tlugar, Integer lugar);
+	
+	//@Query("SELECT i FROM UsuarisRol i WHERE i.usuari = ?1 AND i.vigent = TRUE AND i.rol.ambit = ?2 LIMIT 1")
+	@Query(value=("SELECT ur.* "
+			+ "FROM usuaris_rols ur LEFT JOIN rols r ON ur.id_rol = r.id_rol "
+			+ "WHERE ur.usuari = ?1 AND r.ambit = ?2 AND ur.vigent LIMIT 1"), nativeQuery=true)
+	UsuarisRol findByUsernameActiveAmbit(String usuari, String ambit);
+	
+	@Query(value=("SELECT nom_proces FROM processos_rols WHERE id_rol IN(SELECT id_rol FROM rols WHERE nom_rol = ?1)"), nativeQuery=true)
+	List<String> findAssociatedProcs(String rol);
+
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar = ?1 AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
+	List<UsuarisRol> findManagerByCentre(Integer centre);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar = ?1 AND vigent ORDER BY lugar"), nativeQuery=true)
+	List<UsuarisRol> findManagerByTitulacio(Integer titulacio);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'C' AND lugar IN(?1) AND vigent ORDER BY id_rol ASC"), nativeQuery=true)
+	List<UsuarisRol> findManagerByCentres(List<Integer> centre);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE tlugar = 'T' AND lugar IN(?1) AND vigent ORDER BY lugar"), nativeQuery=true)
+	List<UsuarisRol> findManagerByTitulacions(List<Integer> titulacio);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4"), nativeQuery=true)
+	UsuarisRol find(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 AND vigent"), nativeQuery=true)
+	UsuarisRol findActive(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT * FROM usuaris_rols WHERE id_rol = ?1 AND usuari = ?2 AND lugar = ?3 AND tlugar = ?4 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
+	UsuarisRol findLast(Integer idRol, String usuari, Integer lugar, String tlugar);
+	
+	@Query(value=("SELECT num FROM usuaris_rols WHERE id_rol = ?1 AND lugar = ?2 AND tlugar = ?3 ORDER BY num DESC LIMIT 1"), nativeQuery=true)
+	Integer findLastNum(Integer idRol, Integer lugar, String tlugar);
+	
+	
+}

+ 63 - 0
src/main/java/es/uv/saic/domain/Wiki.java

@@ -0,0 +1,63 @@
+package es.uv.saic.domain;
+
+import java.util.Date;
+
+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="wiki")
+@NamedQuery(name="Wiki.findAll", query="SELECT i FROM Wiki i")
+public class Wiki {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name="id_wiki")
+	private Integer idWiki;
+	private Date data;
+	@Column(name="data_mod")
+	private Date dataMod;
+	private String text;
+	private String categoria;
+	
+	public Wiki() {}
+	
+	public Integer getIdWiki() {
+		return idWiki;
+	}
+	public void setIdWiki(Integer idWiki) {
+		this.idWiki = idWiki;
+	}
+	public Date getData() {
+		return data;
+	}
+	public void setData(Date data) {
+		this.data = data;
+	}
+	public Date getDataMod() {
+		return dataMod;
+	}
+	public void setDataMod(Date dataMod) {
+		this.dataMod = dataMod;
+	}
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public String getCategoria() {
+		return categoria;
+	}
+	public void setCategoria(String categoria) {
+		this.categoria = categoria;
+	}
+	
+	
+	
+}

+ 11 - 0
src/main/java/es/uv/saic/domain/WikiRepository.java

@@ -0,0 +1,11 @@
+package es.uv.saic.domain;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface WikiRepository  extends JpaRepository<Wiki, Integer> {
+	@Query(value="SELECT * FROM wiki WHERE categoria = ?1 LIMIT 1;", nativeQuery=true)
+	Wiki findByCategoria(String categoria); 
+}

+ 31 - 0
src/main/java/es/uv/saic/dto/AnyDimensioDTO.java

@@ -0,0 +1,31 @@
+package es.uv.saic.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class AnyDimensioDTO implements Serializable  {
+	private static final long serialVersionUID = 1L;
+	
+	private String text;
+	private List<DimensioInstanciesDTO> children;
+	
+	public AnyDimensioDTO() {}
+	
+	public AnyDimensioDTO(String text, List<DimensioInstanciesDTO> children) {
+		this.text = text;
+		this.children = children;
+	}
+	
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public List<DimensioInstanciesDTO> getChildren() {
+		return children;
+	}
+	public void setChildren(List<DimensioInstanciesDTO> children) {
+		this.children = children;
+	}
+}

+ 25 - 0
src/main/java/es/uv/saic/dto/ArchiveOrganDTO.java

@@ -0,0 +1,25 @@
+package es.uv.saic.dto;
+
+public class ArchiveOrganDTO {
+    private Integer lugar;
+    private String tlugar;
+
+    
+    public ArchiveOrganDTO(Integer lugar, String tlugar) {
+        this.lugar = lugar;
+        this.tlugar = tlugar;
+    }
+    
+    public Integer getLugar() {
+        return lugar;
+    }
+    public void setLugar(Integer lugar) {
+        this.lugar = lugar;
+    }
+    public String getTlugar() {
+        return tlugar;
+    }
+    public void setTlugar(String tlugar) {
+        this.tlugar = tlugar;
+    }
+}

+ 27 - 0
src/main/java/es/uv/saic/dto/CategoriaDTO.java

@@ -0,0 +1,27 @@
+package es.uv.saic.dto;
+
+public class CategoriaDTO {
+    Integer categoria;
+    Integer lugar;
+    String tlugar;
+ 
+    CategoriaDTO() {}
+
+    public CategoriaDTO(Integer categoria, Integer lugar, String tlugar) {
+        this.categoria = categoria;
+        this.lugar = lugar;
+        this.tlugar = tlugar;
+    }
+    
+    public Integer getCategoria() {
+        return this.categoria;
+    }
+
+    public Integer getLugar() {
+        return this.lugar;
+    }
+
+    public String getTlugar() {
+        return this.tlugar;
+    }
+}

+ 34 - 0
src/main/java/es/uv/saic/dto/CategoriaDocumentDTO.java

@@ -0,0 +1,34 @@
+package es.uv.saic.dto;
+
+import java.util.List;
+
+public class CategoriaDocumentDTO {
+
+	private String text;
+	private List<DocumentDTO> children;
+	
+	public CategoriaDocumentDTO() {}
+
+	public CategoriaDocumentDTO(String text, List<DocumentDTO> children) {
+		this.text = text;
+		this.children = children;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public List<DocumentDTO> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<DocumentDTO> children) {
+		this.children = children;
+	}
+	
+	
+}

+ 34 - 0
src/main/java/es/uv/saic/dto/CategoriaPareDTO.java

@@ -0,0 +1,34 @@
+package es.uv.saic.dto;
+
+import java.util.List;
+
+public class CategoriaPareDTO {
+
+	private String text;
+	private List<CategoriaDocumentDTO> children;
+	
+	public CategoriaPareDTO() {}
+
+	public CategoriaPareDTO(String text, List<CategoriaDocumentDTO> children) {
+		this.text = text;
+		this.children = children;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public List<CategoriaDocumentDTO> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<CategoriaDocumentDTO> children) {
+		this.children = children;
+	}
+	
+	
+}

+ 33 - 0
src/main/java/es/uv/saic/dto/DimensioInstanciesDTO.java

@@ -0,0 +1,33 @@
+package es.uv.saic.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class DimensioInstanciesDTO implements Serializable  {
+	private static final long serialVersionUID = 1L;
+	
+	private String text;
+	private List<InstanciaDTO> children;
+	
+	public DimensioInstanciesDTO() {}
+	
+	public DimensioInstanciesDTO(String text, List<InstanciaDTO> children) {
+		this.text = text;
+		this.children = children;
+	}
+	
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public List<InstanciaDTO> getChildren() {
+		return children;
+	}
+	public void setChildren(List<InstanciaDTO> children) {
+		this.children = children;
+	}
+
+	
+}

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor