DataService.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. package es.uv.saic.service;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.ResultSetMetaData;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.time.LocalDateTime;
  11. import java.util.ArrayList;
  12. import java.util.Arrays;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16. import javax.sql.rowset.CachedRowSet;
  17. import javax.sql.rowset.RowSetFactory;
  18. import javax.sql.rowset.RowSetProvider;
  19. import org.apache.commons.csv.CSVFormat;
  20. import org.apache.commons.csv.CSVParser;
  21. import org.apache.commons.csv.CSVRecord;
  22. import org.apache.commons.lang.StringUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.util.LinkedCaseInsensitiveMap;
  26. import es.uv.saic.shared.domain.Datasource;
  27. import es.uv.saic.shared.domain.IndicadorEnquestaTmp;
  28. import es.uv.saic.shared.domain.Usuari;
  29. import es.uv.saic.shared.dto.EmailDTO;
  30. import es.uv.saic.shared.dto.IndicadorEnquestaTmpDup;
  31. import es.uv.saic.shared.dto.OrganDTO;
  32. import es.uv.saic.shared.feign.EmailClient;
  33. import es.uv.saic.shared.feign.OrganClient;
  34. import jakarta.mail.MessagingException;
  35. @Service
  36. public class DataService {
  37. @Autowired
  38. private DatasourceService dss;
  39. @Autowired
  40. private UsuariService us;
  41. @Autowired
  42. private IndicadorEnquestaService ies;
  43. @Autowired
  44. private IndicadorEnquestaTmpService iets;
  45. @Autowired
  46. private OrganClient oc;
  47. @Autowired
  48. private EmailClient ec;
  49. private HashMap<String, String> titsMap;
  50. private HashMap<String, String> centresMap;
  51. public DataService() {
  52. titsMap = new HashMap<String, String>();
  53. titsMap.put("TRAD", "1099");
  54. centresMap = new HashMap<String, String>();
  55. centresMap.put("INDV", "121");
  56. centresMap.put("POST", "121");
  57. centresMap.put("EDOC", "62");
  58. }
  59. public String doImport(InputStreamReader in, String usuari, String enquesta, String ambit, String estudi,
  60. String locale, String delim, String clau, List<String> ignoredColumns) throws IOException, MessagingException {
  61. CSVFormat format = CSVFormat.DEFAULT.builder()
  62. .setHeader()
  63. .setIgnoreHeaderCase(true)
  64. .setSkipHeaderRecord(true)
  65. .setIgnoreEmptyLines(true)
  66. .setIgnoreSurroundingSpaces(true)
  67. .setDelimiter(delim)
  68. .setRecordSeparator('\n')
  69. .build();
  70. CSVParser parser = format.parse(in);
  71. List<CSVRecord> records = parser.getRecords();
  72. List<String> header = parser.getHeaderNames();
  73. List<String> headerInds = new ArrayList<>(header);
  74. StringBuilder errors = new StringBuilder();
  75. /* 1) Comprobar columnas obligatorias */
  76. List<String> mandatoryColumns = new ArrayList<String>();
  77. List<String> knownColumns = new ArrayList<String>();
  78. if(clau.equals("ruct")) {
  79. this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
  80. }
  81. else {
  82. this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
  83. }
  84. if(!this.checkColumns(header, mandatoryColumns, errors, locale)) {
  85. 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();
  86. }
  87. /* 2) Eliminar las columnas obligatorias, conocidas e ignoradas. El resto se consideran indicadores a importar */
  88. knownColumns.addAll(mandatoryColumns);
  89. knownColumns.addAll(ignoredColumns);
  90. for(String c : knownColumns) {
  91. headerInds.removeIf(v->v.equalsIgnoreCase(c));
  92. }
  93. /* 3) Comprobar valores y tipos */
  94. if(!this.checkValues(records, ambit, clau, errors, locale)) {
  95. 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();
  96. }
  97. /* 4) Importar datos */
  98. Integer numRecords = 0;
  99. Integer numTuples = 0;
  100. for (CSVRecord record : records) {
  101. Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
  102. recordMap.putAll(record.toMap());
  103. String c = ambit.equals("T") || ambit.equals("C") ? translateCentre(recordMap.get("centre")) : null;
  104. String t = ambit.equals("T") ? translateTitulacio(recordMap.get("titulacio")) : null;
  105. String type = recordMap.get("tipus");
  106. Integer curs = Integer.parseInt(recordMap.get("curs").replaceAll("\\D+",""));
  107. String cursEnquesta = recordMap.containsKey("curs_enquesta") ? recordMap.get("curs_enquesta") : null;
  108. String titulacioOrigen = recordMap.containsKey("titulacio_origen") ? recordMap.get("titulacio_origen") : null;
  109. String centreOrigen = recordMap.containsKey("centre_origen") ? recordMap.get("centre_origen") : null;
  110. Integer nenq = recordMap.containsKey("nenq") ? Integer.parseInt(recordMap.get("nenq").replaceAll("\\D+","")) : null;
  111. String ructStr = recordMap.containsKey("ruct") ? recordMap.get("ruct").replaceAll("\\D+","") : null;
  112. String cursd = recordMap.containsKey("cursd") ? recordMap.get("cursd") : null;
  113. Integer ruct = null;
  114. if(ructStr != null) {
  115. if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
  116. ruct = Integer.parseInt(ructStr);
  117. }
  118. }
  119. Integer centre;
  120. Integer titulacio;
  121. if(clau.equals("ruct") && ambit.equals("T") && ruct != null) {
  122. OrganDTO o = findOrgByRuct(ruct);
  123. if(o == null) {
  124. 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();
  125. continue;
  126. }
  127. titulacio = o.getLugar();
  128. centre = o.getLugar2();
  129. }
  130. else{
  131. centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
  132. titulacio = ambit.equals("T") ? Integer.parseInt(t) : null;
  133. if(!existsOrg("T", titulacio)){
  134. 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();
  135. }
  136. }
  137. if(header.contains("cursd")) {
  138. cursd = recordMap.get("cursd").replaceAll("\\D+","");
  139. }
  140. for(String r : headerInds) {
  141. IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
  142. ie.setEnquesta(enquesta);
  143. ie.setTitulacio(titulacio);
  144. ie.setCentre(centre);
  145. ie.setCurs(curs);
  146. ie.setAmbit(ambit);
  147. ie.setEstudi(estudi);
  148. ie.setIndicador(r.replace("_min", "").replace("_max", "").toLowerCase());
  149. ie.setNum(null);
  150. ie.setCursd(cursd);
  151. ie.setTipus(type);
  152. ie.setUsuari(usuari);
  153. ie.setData(LocalDateTime.now());
  154. ie.setCursEnquesta(cursEnquesta);
  155. ie.setTitulacioOrigen(titulacioOrigen);
  156. ie.setCentreOrigen(centreOrigen);
  157. ie.setNenq(nenq);
  158. ie.setRuct(ruct);
  159. try {
  160. ie.setValor(record.get(r).replace(",", "."));
  161. }
  162. catch(Exception ex) {
  163. ie.setValor(null);
  164. }
  165. save(ie);
  166. numRecords++;
  167. }
  168. numTuples++;
  169. }
  170. /* 5) Notificar administradores y usuario implicado */
  171. this.sendNotificacion(usuari, enquesta, ambit, estudi);
  172. Usuari usuario = us.findByUsername(usuari);
  173. if(!usuario.isAdmin()){
  174. this.sendConfirmation(usuari, enquesta, ambit, estudi);
  175. }
  176. 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")));
  177. return errors.toString();
  178. }
  179. public String doDbImport(Integer dbOrigen, String vista, Integer srcCurs, Integer dstCurs, String usuari, String enquesta, String ambit,
  180. String estudi, String locale, String clau, List<String> ignoredColumns) throws SQLException, ClassNotFoundException {
  181. StringBuilder errors = new StringBuilder();
  182. Datasource source = this.dss.findById(dbOrigen);
  183. if(source == null){
  184. 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();
  185. }
  186. String query = "SELECT * FROM "+vista+ " WHERE curs = "+srcCurs;
  187. Class.forName(source.getDriver());
  188. Integer numRecords = 0;
  189. Integer numTuples = 0;
  190. try (Connection connection = DriverManager.getConnection(source.getConn())) {
  191. /* 1) Ejecutar consulta */
  192. Statement statement = connection.createStatement();
  193. ResultSet resultset = statement.executeQuery(query);
  194. ResultSetMetaData resultMetadata = resultset.getMetaData();
  195. int columns = resultMetadata.getColumnCount();
  196. /* 2) Obtener resultados para procesar online y cerrar conexión */
  197. RowSetFactory factory = RowSetProvider.newFactory();
  198. CachedRowSet result = factory.createCachedRowSet();
  199. result.populate(resultset);
  200. connection.close();
  201. /* 3) Comprobar columnas obligatorias */
  202. List<String> mandatoryColumns = new ArrayList<String>();
  203. List<String> knownColumns = new ArrayList<String>();
  204. if(clau.equals("ruct")) {
  205. this.setColumnsRuct(ambit, knownColumns, mandatoryColumns);
  206. }
  207. else {
  208. this.setColumnsCod(ambit, knownColumns, mandatoryColumns);
  209. }
  210. List<String> allColNames = new ArrayList<String>();
  211. for(int i = 1; i <= columns; i++){
  212. allColNames.add(resultMetadata.getColumnLabel(i).toLowerCase());
  213. }
  214. List<String> colnames = new ArrayList<String>(allColNames);
  215. if(!this.checkColumns(colnames, mandatoryColumns, errors, locale)) {
  216. 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();
  217. }
  218. knownColumns.addAll(mandatoryColumns);
  219. knownColumns.addAll(ignoredColumns);
  220. for(String c : knownColumns) {
  221. colnames.removeIf(v->v.equalsIgnoreCase(c));
  222. }
  223. if(ambit.equals("T") && !clau.equals("ruct")){
  224. 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();
  225. }
  226. /* 4) Importar datos */
  227. while(result.next()) {
  228. Integer ruct = null;
  229. Integer titulacio = null;
  230. Integer centre = null;
  231. String c = ambit.equals("C") ? translateCentre(result.getString("centre")) : null;
  232. boolean isValid = true;
  233. if(ambit.equals("T")) {
  234. String ructStr = result.getString("ruct");
  235. if(ructStr != null) {
  236. if(!(ructStr.isBlank() || ructStr.isEmpty() || ructStr.equals("NULL") || ructStr.equals("null"))) {
  237. ruct = Integer.parseInt(ructStr);
  238. }
  239. else{
  240. isValid = false;
  241. }
  242. }
  243. else{
  244. isValid = false;
  245. }
  246. OrganDTO o = findOrgByRuct(ruct);
  247. if(o == null) {
  248. 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();
  249. continue;
  250. }
  251. titulacio = o.getLugar();
  252. centre = o.getLugar2();
  253. }
  254. else if(ambit.equals("C")) {
  255. centre = ambit.equals("T") || ambit.equals("C") ? Integer.parseInt(c.replaceAll("\\D+","")) : null;
  256. if(centre == null){
  257. isValid = false;
  258. }
  259. }
  260. if(isValid) {
  261. Integer curs = dstCurs == null ? result.getInt("curs") : dstCurs;
  262. String tipus = allColNames.contains("tipus") ? result.getString("tipus") : "avg";
  263. String cursEnquesta = allColNames.contains("curs_enquesta") ? result.getString("curs_enquesta") : null;
  264. String titulacioOrigen = allColNames.contains("titulacio_origen") ? result.getString("titulacio_origen") : null;
  265. String centreOrigen = allColNames.contains("centre_origen") ? result.getString("centre_origen") : null;
  266. Integer nenq = allColNames.contains("nenq") ? result.getInt("nenq") : null;
  267. String cursd = allColNames.contains("cursd") ? result.getString("cursd") : null;
  268. for(String colName : colnames) {
  269. IndicadorEnquestaTmp ie = new IndicadorEnquestaTmp();
  270. ie.setEnquesta(enquesta);
  271. ie.setTitulacio(titulacio);
  272. ie.setCentre(centre);
  273. ie.setCurs(curs);
  274. ie.setAmbit(ambit);
  275. ie.setEstudi(estudi);
  276. ie.setIndicador(colName.replace("_min", "").replace("_max", "").toLowerCase());
  277. ie.setNum(null);
  278. ie.setCursd(cursd);
  279. ie.setTipus(tipus);
  280. ie.setUsuari(usuari);
  281. ie.setData(LocalDateTime.now());
  282. ie.setCursEnquesta(cursEnquesta);
  283. ie.setTitulacioOrigen(titulacioOrigen);
  284. ie.setCentreOrigen(centreOrigen);
  285. ie.setNenq(nenq);
  286. ie.setRuct(ruct);
  287. try {
  288. ie.setValor(result.getString(colName).replace(",", "."));
  289. }
  290. catch(Exception ex) {
  291. ie.setValor(null);
  292. }
  293. save(ie);
  294. numRecords++;
  295. }
  296. numTuples++;
  297. }
  298. }
  299. }
  300. /* 5) Notificar administradores y usuario implicado */
  301. this.sendNotificacion(usuari, enquesta, ambit, estudi);
  302. Usuari usuario = us.findByUsername(usuari);
  303. if(!usuario.isAdmin()){
  304. this.sendConfirmation(usuari, enquesta, ambit, estudi);
  305. }
  306. 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")));
  307. return errors.toString();
  308. }
  309. public List<String> listTableColumns(Integer dbOrigen, String vista, String locale) throws SQLException, ClassNotFoundException {
  310. Datasource source = this.dss.findById(dbOrigen);
  311. String query = "SELECT * FROM "+vista+" LIMIT 1;";
  312. Class.forName(source.getDriver());
  313. List<String> colNames = new ArrayList<String>();
  314. try (Connection connection = DriverManager.getConnection(source.getConn())) {
  315. Statement statement = connection.createStatement();
  316. ResultSet resultset = statement.executeQuery(query);
  317. ResultSetMetaData resultMetadata = resultset.getMetaData();
  318. int columns = resultMetadata.getColumnCount();
  319. for(int i = 1; i <= columns; i++){
  320. colNames.add(resultMetadata.getColumnLabel(i));
  321. }
  322. }
  323. return colNames;
  324. }
  325. public List<IndicadorEnquestaTmpDup> checkDuplicates(String enquesta) {
  326. return checkDuplicatesAux(enquesta);
  327. }
  328. public Integer consolidateByEnquesta(String enquesta) {
  329. if(checkDuplicates(enquesta).size() > 0) {
  330. return -1;
  331. }
  332. else {
  333. Integer i = ies.consolidateByEnquesta(enquesta);
  334. deleteByEnquesta(enquesta);
  335. return i;
  336. }
  337. }
  338. public Integer countByEnquesta(String enquesta) {
  339. return countByEnquestaAux(enquesta);
  340. }
  341. public List<IndicadorEnquestaTmpDup> checkIntegrity(String enquesta){
  342. return iets.checkIntegrity(enquesta);
  343. }
  344. public Integer deleteFromCurrent(String enquesta){
  345. return iets.deleteFromCurrent(enquesta);
  346. }
  347. public Integer deleteFromPending(String enquesta){
  348. return iets.deleteFromPending(enquesta);
  349. }
  350. private void setColumnsCod(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
  351. knownColumns.addAll(Arrays.asList("ruct", "curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
  352. if(ambit.equals("U")) {
  353. mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
  354. }
  355. else if(ambit.equals("C")) {
  356. mandatoryColumns.addAll(Arrays.asList("curs", "centre", "tipus"));
  357. }
  358. else {
  359. mandatoryColumns.addAll(Arrays.asList("curs", "titulacio", "centre", "tipus"));
  360. }
  361. }
  362. private void setColumnsRuct(String ambit, List<String> knownColumns, List<String> mandatoryColumns) {
  363. knownColumns.addAll(Arrays.asList("curs_enquesta", "centre_origen", "titulacio_origen", "nenq", "cursd"));
  364. if(ambit.equals("U")) {
  365. mandatoryColumns.addAll(Arrays.asList("curs", "tipus"));
  366. }
  367. else if(ambit.equals("C")) {
  368. mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
  369. knownColumns.add("centre");
  370. }
  371. else {
  372. mandatoryColumns.addAll(Arrays.asList("curs", "tipus", "ruct"));
  373. knownColumns.addAll(Arrays.asList("centre", "titulacio"));
  374. }
  375. }
  376. private boolean checkColumns(List<String> header, List<String> mandatoryColumns, StringBuilder errors, String locale) {
  377. boolean isvalid = true;
  378. for(String c : mandatoryColumns) {
  379. if(!header.stream().anyMatch(c::equalsIgnoreCase)) {
  380. isvalid = false;
  381. errors.append((locale.equals("es") ? "[ERROR] No se ha encontrado la columna " : "[ERROR] No s'ha trobat la columna ") +c).append("<br>");
  382. }
  383. }
  384. return isvalid;
  385. }
  386. private boolean checkValues(List<CSVRecord> records, String ambit, String clau, StringBuilder errors, String locale) {
  387. boolean isvalid = true;
  388. Integer numRecords = 0;
  389. for (CSVRecord record : records) {
  390. Map<String, String> recordMap = new LinkedCaseInsensitiveMap<>();
  391. recordMap.putAll(record.toMap());
  392. String type = recordMap.get("tipus");
  393. numRecords++;
  394. if((ambit.equals("T") || ambit.equals("C")) && !clau.equals("ruct")) {
  395. String c = recordMap.get("centre");
  396. c = translateCentre(c);
  397. if(!StringUtils.isNumeric(c.replace("C", ""))) {
  398. isvalid = false;
  399. 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>");
  400. }
  401. }
  402. if(ambit.equals("T")) {
  403. String t = recordMap.get("titulacio");
  404. if(!clau.equals("ruct")) {
  405. t = translateTitulacio(t);
  406. if(!StringUtils.isNumeric(t)) {
  407. isvalid = false;
  408. 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>");
  409. }
  410. }
  411. else {
  412. String ructStr = recordMap.get("ruct");
  413. if(!ructStr.isBlank() && ructStr.isEmpty() && ructStr.equals("NULL") && ructStr.equals("null") && !StringUtils.isNumeric(t)) {
  414. isvalid = false;
  415. 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>");
  416. }
  417. }
  418. }
  419. if(!type.equals("avg") && !type.equals("min") && !type.equals("max")) {
  420. isvalid = false;
  421. 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>");
  422. }
  423. }
  424. return isvalid;
  425. }
  426. private void sendNotificacion(String usuari, String enquesta, String ambit, String estudi) {
  427. sendMail("saic@uv.es", "[SYS] Datos pendientes de consolidar", "Estimado/a administrador: \n"
  428. + "\n"
  429. + "El usuario "+usuari+" ha importado nuevos datos referentes a: \n"
  430. + "Origen: "+enquesta+"\n"
  431. + "Ámbito: "+ambit+"\n"
  432. + "Tipo titulación: "+estudi+"\n"
  433. + "\n"
  434. + "Acceda a https://saic.uv.es y realice las acciones pertinentes para consolidar los datos. ");
  435. }
  436. private void sendConfirmation(String to, String enquesta, String ambit, String estudi) {
  437. sendMail(to, "[SYS] Nuevos datos importados", "Estimado/a usuario: \n"
  438. + "\n"
  439. + "Se han importado correctamente nuevos datos referentes a: \n"
  440. + "Origen: "+enquesta+"\n"
  441. + "Ámbito: "+ambit+"\n"
  442. + "Tipo titulación: "+estudi+"\n"
  443. + "\n"
  444. + "Los datos se quedarán en estado pendiente de consolidar hasta que un administrador inicie el proceso de consolidación.");
  445. }
  446. /* Exepciones en el código de titulación que hay que traducir a código SAIC */
  447. private String translateTitulacio(String t) {
  448. if(!StringUtils.isNumeric(t)) {
  449. if(this.titsMap.containsKey(t)) {
  450. return this.titsMap.get(t);
  451. }
  452. }
  453. return t;
  454. }
  455. /* Exepciones en el código de centro que hay que traducir a código SAIC */
  456. private String translateCentre(String c) {
  457. if(!StringUtils.isNumeric(c)) {
  458. if(this.centresMap.containsKey(c)) {
  459. return this.centresMap.get(c);
  460. }
  461. }
  462. return c;
  463. }
  464. private OrganDTO findOrgByRuct(Integer ruct) {
  465. return oc.getOrgByRuct(ruct);
  466. }
  467. private boolean existsOrg(String tlugar, Integer titulacio) {
  468. return oc.existsOrg(tlugar, titulacio);
  469. }
  470. private void deleteByEnquesta(String enquesta) {
  471. iets.deleteByEnquesta(enquesta);
  472. }
  473. private void save(IndicadorEnquestaTmp ie) {
  474. iets.save(ie);
  475. }
  476. private List<IndicadorEnquestaTmpDup> checkDuplicatesAux(String enquesta) {
  477. return iets.checkDuplicates(enquesta);
  478. }
  479. private Integer countByEnquestaAux(String enquesta) {
  480. return iets.countByEnquesta(enquesta);
  481. }
  482. private void sendMail(String string, String string2, String string3) {
  483. EmailDTO email = new EmailDTO(string, string2, string3);
  484. ec.sendEmail(email);
  485. }
  486. }