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