# 📁 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.**