Browse Source

Merge branch 'refactoringBaseCode' of https://inmaculados.uv.es/pagobo/UV_SAIC_CORE into refactoringBaseCode

Mario Martínez Hernández 4 weeks ago
parent
commit
2d4cf94ec9

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

@@ -26,6 +26,7 @@ public class InstanciaDTO implements Serializable {
 	private String nomval;
 	private String nomcas;
 	private Integer cursAvaluat;
+	private String nomValTitulacio;
 
 	public InstanciaDTO() {}
 	
@@ -45,6 +46,7 @@ public class InstanciaDTO implements Serializable {
 		this.nomval = i.getOrgan().getOrgan().getNomVal();
 		this.nomcas = i.getOrgan().getNomCas();
 		this.cursAvaluat = i.getProces().getCursAvaluat();
+		this.nomValTitulacio = i.getOrgan().getNomVal();
 		
 		String icon = "<span class=\"btn gantt-legend-done\" style=\"border-width:5px;border-radius:50%;width:20px;height:20px;margin-top:-2px\"></span>";
 		if(this.estat.equals("A")) {
@@ -185,4 +187,11 @@ public class InstanciaDTO implements Serializable {
 		this.cursAvaluat = cursAvaluat;
 	}
 
+	public String getNomValTitulacio() {
+		return nomValTitulacio;
+	}
+
+	public void setNomValTitulacio(String nomValTitulacio) {
+		this.nomValTitulacio = nomValTitulacio;
+	}
 }

+ 15 - 1
src/main/java/es/uv/saic/dto/PdfDTO.java

@@ -6,6 +6,7 @@ import java.util.Optional;
 public class PdfDTO {
     private String content;
     private Optional<BigInteger> idtascai;
+    private BigInteger idtasca;
     
     public PdfDTO() {}
 
@@ -14,6 +15,11 @@ public class PdfDTO {
         this.idtascai = idtascai;
     }
 
+    public PdfDTO(String content, BigInteger idtasca) {
+        this.content = content;
+        this.idtasca = idtasca;
+    }
+
     public String getContent() {
         return content;
     }
@@ -29,4 +35,12 @@ public class PdfDTO {
     public void setIdtascai(Optional<BigInteger> idtascai) {
         this.idtascai = idtascai;
     }
-}
+
+    public BigInteger getIdtasca() {
+        return idtasca;
+    }
+
+    public void setIdtasca(BigInteger idtasca) {
+        this.idtasca = idtasca;
+    }
+}

+ 23 - 7
src/main/java/es/uv/saic/dto/TascaDTO.java

@@ -4,43 +4,51 @@ import es.uv.saic.domain.Tasca;
 import es.uv.saic.domain.Tipus;
 
 public class TascaDTO {
-	private Integer idTasca;
-	private String codiEvidencia;
+    private Integer idTasca;
+    private String codiEvidencia;
     private Integer tipus;
     private String nomEvidenciaCas;
-
+    private String opcions;
+    
     public TascaDTO() {
     }
-    
-    public TascaDTO(Integer idTasca, String codiEvidencia, Tipus tipus, String nomEvidenciaCas) {
+
+    public TascaDTO(Integer idTasca, String codiEvidencia, Tipus tipus, String nomEvidenciaCas, String opcions) {
         this.idTasca = idTasca;
         this.codiEvidencia = codiEvidencia;
         this.tipus = tipus.getTipus();
         this.nomEvidenciaCas = nomEvidenciaCas;
+        this.opcions = opcions;
     }
 
-    public TascaDTO(Tasca tasca){
+    public TascaDTO(Tasca tasca) {
         this.idTasca = tasca.getIdTasca();
         this.codiEvidencia = tasca.getCodiEvidencia();
         this.tipus = tasca.getTipus().getTipus();
         this.nomEvidenciaCas = tasca.getNomEvidenciaCas();
+        this.opcions = tasca.getOpcions();
     }
+
     public Integer getIdTasca() {
         return idTasca;
     }
+
     public void setIdTasca(Integer idTasca) {
         this.idTasca = idTasca;
     }
+
     public String getCodiEvidencia() {
         return codiEvidencia;
     }
+
     public void setCodiEvidencia(String codiEvidencia) {
         this.codiEvidencia = codiEvidencia;
     }
+
     public Integer getTipus() {
         return tipus;
     }
-
+    
     public void setTipus(Integer tipus) {
         this.tipus = tipus;
     }
@@ -52,4 +60,12 @@ public class TascaDTO {
     public void setNomEvidenciaCas(String nomEvidenciaCas) {
         this.nomEvidenciaCas = nomEvidenciaCas;
     }
+
+    public String getOpcions() {
+        return opcions;
+    }
+
+    public void setOpcions(String opcions) {
+        this.opcions = opcions;
+    }
 }

+ 62 - 0
src/main/java/es/uv/saic/dto/TemplateDataDTO.java

@@ -0,0 +1,62 @@
+package es.uv.saic.dto;
+
+public class TemplateDataDTO {
+    private InstanciaTascaDTO instanciaTasca;
+    private Integer idTitulacio;
+    private Integer idCentre;
+    private Integer curs;
+    private String template;
+    
+    public TemplateDataDTO(InstanciaTascaDTO instanciaTasca, String template) {
+        this.instanciaTasca = instanciaTasca;
+        this.template = template;
+    }
+
+    public TemplateDataDTO(Integer idTitulacio, Integer idCentre, Integer curs, String template) {
+        this.idTitulacio = idTitulacio;
+        this.idCentre = idCentre;
+        this.curs = curs;
+        this.template = template;
+    }
+
+    public InstanciaTascaDTO getInstanciaTasca() {
+        return instanciaTasca;
+    }
+
+    public void setInstanciaTasca(InstanciaTascaDTO instanciaTasca) {
+        this.instanciaTasca = instanciaTasca;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(String template) {
+        this.template = template;
+    }
+
+    public Integer getIdTitulacio() {
+        return idTitulacio;
+    }
+
+    public void setIdTitulacio(Integer idTitulacio) {
+        this.idTitulacio = idTitulacio;
+    }
+
+    public Integer getIdCentre() {
+        return idCentre;
+    }
+
+    public void setIdCentre(Integer idCentre) {
+        this.idCentre = idCentre;
+    }
+
+    public Integer getCurs() {
+        return curs;
+    }
+
+    public void setCurs(Integer curs) {
+        this.curs = curs;
+    }
+
+}

+ 23 - 0
src/main/java/es/uv/saic/feign/PlantillaClient.java

@@ -3,10 +3,15 @@ package es.uv.saic.feign;
 import java.util.List;
 
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import es.uv.saic.domain.Plantilla;
+import es.uv.saic.dto.PdfDTO;
+import es.uv.saic.dto.TemplateDataDTO;
 
 @FeignClient(value = "plantilla-controller", url = "${saic.url.docs.domain}")
 public interface PlantillaClient {
@@ -19,4 +24,22 @@ public interface PlantillaClient {
 
     @GetMapping("/plantilla/{versio}/{codi}/{ambit}")
     Plantilla findByVersioCodiAmbit(@PathVariable("versio") Integer versio, @PathVariable("codi") String codi, @PathVariable("ambit") String ambit);
+
+    @PostMapping("/plantilla/save")
+    String save(@RequestBody Plantilla plantilla);
+
+    @DeleteMapping("/plantilla/delete")
+    String delete(@RequestBody Plantilla plantilla);
+
+    @GetMapping("/plantilla/used/{id}")
+    Boolean isUsed(@PathVariable("id") Integer id);
+
+    @PostMapping("/addTemplateData")
+    String addTemplateData(@RequestBody TemplateDataDTO td);
+
+    @PostMapping("/addTemplateData2")
+    String addTemplateData2(@RequestBody TemplateDataDTO td);
+
+    @PostMapping("/savePDF")
+    String savePDF(@RequestBody PdfDTO pdf);
 }

+ 0 - 662
src/main/java/es/uv/saic/service/PlantillaService.java

@@ -1,662 +0,0 @@
-package es.uv.saic.service;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.UncheckedIOException;
-import java.math.BigInteger;
-import java.nio.file.Files;
-import java.text.DecimalFormat;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.DefaultResourceLoader;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.ResourceLoader;
-import org.springframework.stereotype.Service;
-import org.springframework.util.FileCopyUtils;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import es.uv.saic.domain.Indicador;
-import es.uv.saic.domain.InstanciaTasca;
-import es.uv.saic.domain.Organ;
-import es.uv.saic.domain.Plantilla;
-import es.uv.saic.domain.PlantillaComentario;
-import es.uv.saic.domain.PlantillaConversation;
-import es.uv.saic.domain.PlantillaRepository;
-import es.uv.saic.domain.Proces;
-import es.uv.saic.dto.IndicadorEnquestaValorDTO;
-
-@Service
-public class PlantillaService {
-
-	@Autowired
-	private PlantillaRepository r;
-	@Value("${saic.data.filePath}")
-	private String filePath;
-	@Value("${saic.data.tmpPath}")
-	private String tmpPath;
-	@Value("${saic.data.templates.fileNotFound}")
-	private String fileNotFound;
-	@Value("${saic.data.templates.filePath}")
-	private String templatePath;
-	@Value("${saic.data.templates.logoPath}")
-	private String logoPath;
-	@Autowired
-	private IndicadorEnquestaService ies;
-	@Autowired 
-	private IndicadorService is;
-	@Autowired 
-	private InstanciaTascaService its;
-	@Autowired 
-	private OrganService os;
-	
-	private static final DecimalFormat df = new DecimalFormat("0.00");
-	
-	public List<Plantilla> findAll(){
-		return this.r.findAll();
-	}
-	
-	public Plantilla findByID(Integer id) {
-		return this.r.findByIdPlantilla(id);
-	}
-	
-	public Plantilla findByVersioCodiAmbit(Integer versio, String codi, String ambit) {
-		return this.r.findByVersioCodiAmbit(versio, codi, ambit);
-	}
-	
-	public void save(Plantilla p) {
-		this.r.save(p);
-		this.r.flush();
-	}
-	
-	public void delete(Plantilla p) {
-		this.r.delete(p);
-	}
-	
-	public boolean isUsed(Integer idPlantilla) {
-		List<Plantilla> l = this.r.findUsedByIdPlantilla(idPlantilla);
-		if(l.size() > 0) {
-			return true;
-		}
-		return false;
-	}
-	
-	public String addTemplateData(InstanciaTasca it, String template){
-		HashMap<String, String> context = new HashMap<String, String>();
-		HashMap<String, String> header = new HashMap<String, String>();
-		HashMap<String, String> img = new HashMap<String, String>();
-		 
-		Integer idTitulacio = it.getInstancia().getTitulacio();
-		Proces proces = it.getInstancia().getProces();
-		Integer idCentre = it.getInstancia().getCentre();
-		String ambit = "G";
-		String opcionsStr = it.getTasca().getOpcions().replaceAll("^\\.$", "");
-		String [] opcions = new String[0];
-		if(!opcionsStr.isEmpty()) {
-			opcions = opcionsStr.split(";");
-		}
-		if(it.getInstancia().getOrgan().getId().getTlugar().equals("C")) {
-			if(it.getInstancia().getTitulacio() == 2) {
-				ambit = "M";
-			}
-		}
-		
-		/** Add header information **/
-		addHeaderData(it.getInstancia().getOrgan().getOrgan(), it.getInstancia().getOrgan(), it.getInstancia().getProces().getCursAvaluat(), header, img);
-		
-		/** Iterate elements inside {[loop]} ... {[endloop]} **/
-		template = this.iterateLoopTag(template, idCentre, ambit, proces.getCursAvaluat(), context);
-		
-		/** Iterate elements with data-loop attribute **/
-		Document doc = Jsoup.parse(template);
-		doc = iterateLoopAttr(idCentre, proces.getCursAvaluat(), doc, context);
-		
-		/** Add template data (non iterated data)**/
-		getTemplateData(idTitulacio, idCentre, proces.getCursAvaluat(), context);	
-		this.replaceValues(doc, context, header, img);
-		
-		/** Replace sections if specified in options **/
-		this.replaceSection(opcions, it, doc);
-		
-		return doc.html();	
-	}
-	
-	public String addTemplateData(Integer idTitulacio, Integer idCentre, Integer curs, String template){
-		
-		HashMap<String, String> context = new HashMap<String, String>();
-		HashMap<String, String> header = new HashMap<String, String>();
-		HashMap<String, String> img = new HashMap<String, String>();
-		 
-		Organ centre = os.findByID("C", idCentre);
-		Organ titulacio = os.findByID("T", idTitulacio);
-		
-		/** Add header information **/
-		addHeaderData(centre, titulacio, curs, header, img);
-							
-		/** Iterate elements inside {[loop]} ... {[endloop]} **/
-		template = this.iterateLoopTag(template, idCentre, titulacio.getTambit(), curs, context);
-		
-		/** Iterate elements with data-loop attribute **/
-		Document doc = Jsoup.parse(template);
-		doc = iterateLoopAttr(idCentre, curs, doc, context);
-		
-		/** Add template data (non iterated data)**/
-		getTemplateData(idTitulacio, idCentre, curs, context);	
-		this.replaceValues(doc, context, header, img);
-		
-		return doc.html();	
-	}
-	
-	private void addHeaderData(Organ centre, Organ titulacio, Integer curs, HashMap<String, String> header, HashMap<String, String> img) {
-		header.put("centre", centre.getNomVal());
-		header.put("titulacio", titulacio.getNomVal());
-		header.put("curs", "CURSO "+Integer.toString(curs-1)+" - "+Integer.toString(curs));
-		header.put("curs_anterior", Integer.toString(curs-2)+" - "+Integer.toString(curs-1));
-		header.put("conv-ant1", "CONVOCATORIA "+Integer.toString(curs-1)+" - "+Integer.toString(curs));
-		header.put("conv-ant2", "CONVOCATORIA "+Integer.toString(curs-2)+" - "+Integer.toString(curs-1));
-		header.put("periode-ant1", Integer.toString(curs-6)+" - "+Integer.toString(curs-1));
-		header.put("periode-ant2", Integer.toString(curs-7)+" - "+Integer.toString(curs-2));
-		ClassPathResource fuv = new ClassPathResource("/static/logos/UV.png");
-		ClassPathResource fc = new ClassPathResource("/static/logos/C"+Integer.toString(centre.getId().getLugar())+".png");
-		String logouv_b64;
-		String logoc_b64;
-		try {
-			logouv_b64 = "data:image/png;base64, "+Base64.getEncoder().encodeToString(fuv.getInputStream().readAllBytes());
-		} catch (IOException e) {
-			logouv_b64 = "https://saic.uv.es/public/logos/UV.png";
-		}
-		try {
-			logoc_b64 = "data:image/png;base64, "+Base64.getEncoder().encodeToString(fc.getInputStream().readAllBytes());
-		} catch (IOException e) {
-			logoc_b64 = "https://saic.uv.es/public/logos/C"+Integer.toString(centre.getId().getLugar())+".png";
-		}
-		img.put("logo_centre", logoc_b64);
-		img.put("logo_uv", logouv_b64);
-	}
-	
-	private Document iterateLoopAttr(Integer idCentre, Integer curs, Document doc, HashMap<String, String> context) {
-		Elements loop_elements = doc.select("*[data-loop]");
-		for(Element e : loop_elements) {
-			String Tambit = e.attr("data-loop");
-			List<Organ> tits = this.os.findActiveTitulacionsByCentreTambit(idCentre, Tambit);
-			for(Organ org : tits) {
-				context.clear();
-				Element e_copy = e.clone();
-				getTemplateData(org.getId().getLugar(), org.getOrgan().getId().getLugar(), curs, context);
-				context.put("titulacio_loop", org.getNomVal());
-				Elements ielements = e_copy.select("*:matchesWholeOwnText(\\{\\{([^\\}]*)\\}\\})");
-				for(Element ielem : ielements) {
-					String t = ielem.html().replace("{", "").replace("}", "");
-					String i = this.formatValue(context.get(t));
-					if(i != null) {
-						if(ielem.tagName().equals("td")) {
-							ielem.attr("class", "mceEditable");
-							ielem.attr("id", "ind_"+t);
-							ielem.html(i);
-						}
-						else {
-							ielem.html(i);
-						}
-					}
-					else {
-						if(ielem.tagName().equals("td")) {
-							ielem.attr("class", "mceEditable");
-							ielem.attr("id", "ind_"+t);
-							ielem.html("");
-						}
-						else {
-							ielem.html("");
-						}
-					}
-				}		
-				e.after(e_copy);
-			}
-			e.remove();
-		}
-		context.clear();
-		return doc;
-	}
-	
-	private String iterateLoopTag(String template, Integer idCentre, String Tambit, Integer curs, HashMap<String, String> context) {
-		Pattern pattern = Pattern.compile(".*<p>\\{\\[loop\\]\\}</p>([\\S\\s]*)<p>\\{\\[endloop\\]\\}</p>.*");
-		Matcher matcher = pattern.matcher(template);
-		String replaced = "";
-		
-		while(matcher.find()) {
-			String group = matcher.group(1);
-			Document tab = Jsoup.parse(group);
-			List<Organ> tits = this.os.findActiveTitulacionsByCentreTambit(idCentre, Tambit);
-			for(Organ t : tits) {
-				Document tabcopy = Jsoup.parse(tab.html());
-				context.clear();
-				getTemplateData(t.getId().getLugar(), t.getOrgan().getId().getLugar(), curs, context);
-				context.put("titulacio_loop", t.getNomVal());
-				tabcopy = this.replaceValuesLoop(tabcopy, context);
-				replaced += tabcopy.html()+"<p></p>";
-			}
-			template = template.replace("<p>{[loop]}</p>"+group+"<p>{[endloop]}</p>", replaced);
-		}
-		context.clear();
-		return template;
-	}
-	
-	private Document replaceValues(Document doc, HashMap<String, String> context, HashMap<String, String> header, HashMap<String, String> img) {
-		Elements elems = doc.select("*:matchesWholeOwnText(\\{\\{([^\\}]*)\\}\\})");
-		for(Element e : elems) {
-			String t = e.html().replace("{", "").replace("}", "");
-			if(header.containsKey(t)) {
-				e.html(header.get(t));
-			}
-			else if(img.containsKey(t)) {
-				Element x = new Element("img");
-				x.attr("src", img.get(t));
-				x.attr("style", "display:block; margin-left:auto; margin-right:auto; width:100px; max-width:100px;");
-				x.attr("class", "logo");
-				e.html("");
-				e.appendChild(x);	
-			}
-			else {
-				String i = this.formatValue(context.get(t));
-				if(i != null) {
-					if(e.parent().tagName().equals("td")) {
-						e.parent().attr("class", "mceEditable");
-						e.parent().attr("id", "ind_"+t);
-						e.parent().attr("style", e.attr("style"));
-						e.parent().html(i);
-					}
-					else {
-						e.attr("class", "mceEditable");
-						e.attr("ind", "ind_"+t);
-						e.html(i);
-					}
-				}
-				else {
-					if(e.parent().tagName().equals("td")) {
-						e.parent().attr("class", "mceEditable");
-						e.parent().attr("id", "ind_"+t);
-						e.parent().attr("style", e.attr("style"));
-						e.parent().html("");
-					}
-					else {
-						e.attr("class", "mceEditable");
-						e.attr("ind", "ind_"+t);
-						e.html("");
-					}
-				}
-			}
-		}
-		return doc;
-	}
-	
-	private void getTemplateData(Integer idTitulacio, Integer idCentre, Integer curs, HashMap<String, String> context) {
-		
-		/*  Indicadores del data warehouse */
-		try {
-			List<Indicador> indicadores;
-			indicadores = this.is.getFromTitulacion(idTitulacio, curs);
-			for(Indicador i : indicadores) { 
-				context.put(i.getIndicador(), i.getValor());
-			}
-		} 
-		catch(Exception e) { }
-		
-		/*  Indicadores de encuestas y otros almacenados en BD  */
-		List<IndicadorEnquestaValorDTO> enquestesT;
-		enquestesT = this.ies.getAllInds(idTitulacio, idCentre, curs);
-				
-		for(IndicadorEnquestaValorDTO i : enquestesT) {
-			String indicador = i.getAmbit().toLowerCase().equals("t") ? (i.getEnquesta().toLowerCase()+"_"+i.getIndicador().toLowerCase()) : (i.getEnquesta().toLowerCase()+"_"+i.getIndicador().toLowerCase()+"_"+i.getAmbit().toLowerCase());
-			if(i.getNum() == null) {
-				indicador = i.getTipus().toLowerCase().equals("avg") ? indicador : (indicador += "_"+i.getTipus().toLowerCase());		
-				indicador = i.getCursd() == null ? indicador : (indicador += "_"+i.getCursd().toLowerCase());
-				context.put(indicador, formatValue(i.getValor()));
-			}
-			else {
-				context.put(indicador, i.getNum());
-			}
-			
-		}
-	}
-	
-	private Document replaceValuesLoop(Document doc, HashMap<String, String> context) {
-		Elements elems = doc.select("*:matchesWholeOwnText(\\{\\{([^\\}]*)\\}\\})");
-		for(Element e : elems) {
-			String t = e.html().replace("{", "").replace("}", "");
-			String i = this.formatValue(context.get(t));
-			if(i != null) {
-				if(e.parent().tagName().equals("td")) {
-					e.parent().attr("class", "mceEditable");
-					e.parent().attr("id", "ind_"+t);
-					e.parent().attr("style", e.attr("style"));
-					e.parent().html(i);
-				}
-				else {
-					e.attr("class", "mceEditable");
-					e.attr("ind", "ind_"+t);
-					e.html(i);
-				}
-			}
-			else {
-				if(e.parent().tagName().equals("td")) {
-					e.parent().attr("class", "mceEditable");
-					e.parent().attr("id", "ind_"+t);
-					e.parent().attr("style", e.attr("style"));
-					e.parent().html("");
-				}
-				else {
-					e.attr("class", "mceEditable");
-					e.attr("ind", "ind_"+t);
-					e.html("");
-				}
-			}
-		}
-		return doc;
-	}
-	
-	private String formatValue(String v) {	
-		if(v == null) return ""; 
-		if(v.isEmpty() | v.isBlank()) return "";
-		if(v.equals("NP")) return "NP";
-				
-		try {
-		    double d = Double.parseDouble(v);
-		    return (Integer.toString((int)d).equals(v) ? v : df.format(d).replace(",", "."));
-		} 
-		catch (NumberFormatException e) { }
-		
-		if(v.endsWith("%") && v.startsWith(".")) {
-			return "0"+v;
-		}
-		
-		return v;
-		
-	}
-	
-	public String savePDF(String content, BigInteger idtascai) throws IOException, InterruptedException {
-		content = content.replace("<p><!-- pagebreak --></p>", "<p class=\"pagebreak\"><!-- pagebreak --></p>");
-		Document d = Jsoup.parse(content, "UTF8");
-		d.head().append("<style>"
-				+ "@page{size: 297mm 210mm;} "
-				+ "html{ max-width:297mm; max-height:210mm; margin:0; padding:0; transform:scale(0.925); transform-origin:left top; } "
-				+ "table { padding:2px !important; }"
-				+ "th, td { padding:2px !important; }"
-				+ ".pagebreak { page-break-before:always; }"
-				+ "</style>");
-		List<Element> trs = d.getElementsByTag("tr");
-		for(Element t : trs) {
-			if(t.hasAttr("height")) {
-				t.removeAttr("height");
-			}
-			if(t.hasAttr("style")) {
-				String style = t.attr("style");
-				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
-				t.attr("style", style);
-			}
-		}
-		List<Element> tds = d.getElementsByTag("td");
-		for(Element t : tds) {
-			if(t.hasAttr("height")) {
-				t.removeAttr("height");
-			}
-			if(t.hasAttr("style")) {
-				String style = t.attr("style");
-				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
-				t.attr("style", style);
-			}
-		}
-		List<Element> ignore = d.getElementsByClass("pdfignore");
-		for(Element e: ignore) {
-			e.remove();
-		}
-		
-		InstanciaTasca ita = this.its.findById(idtascai);
-		if(ita.getTasca().getRol().getNomRol().equals("u_uq")) {
-			d.body().append(this.parseComments(d.html()));
-		}
-		
-		String basecommand = "google-chrome --headless --disable-gpu --no-pdf-header-footer --run-all-compositor-stages-before-draw --no-sandbox";
-		String dst = idtascai.toString()+".pdf";		
-		File src = File.createTempFile("saic-pdfexport-", ".tmp.html", new File(tmpPath));
-		src.deleteOnExit();
-		PrintWriter out = new PrintWriter(src.getAbsolutePath());
-		out.println(d.html());
-		out.flush();
-		out.close();
-		System.out.println(basecommand+" --print-to-pdf='"+filePath+dst+"' "+src.getAbsolutePath());
-		
-		ProcessBuilder pb = new ProcessBuilder("bash", "-c", basecommand+" --print-to-pdf='"+filePath+dst+"' "+src.getAbsolutePath());
-		Process pr = pb.start();
-		pr.waitFor();
-		src.delete();
-		
-		return dst;
-	}
-	
-	public byte[] toPDF(String content, Optional<BigInteger> idtascai) throws IOException, InterruptedException {
-		content = content.replace("<p><!-- pagebreak --></p>", "<p class=\"pagebreak\"><!-- pagebreak --></p>");
-		Document d = Jsoup.parse(content, "UTF8");
-		d.head().append("<style>"
-				+ "@page{size: 297mm 210mm;} "
-				+ "html{ max-width:297mm; max-height:210mm; margin:0; padding:0; transform:scale(0.925); transform-origin:left top; } "
-				+ "table { padding:2px !important; }"
-				+ "th, td { padding:2px !important; }"
-				+ ".pagebreak { page-break-before:always; }"
-				+ "</style>");
-		List<Element> trs = d.getElementsByTag("tr");
-		for(Element t : trs) {
-			if(t.hasAttr("height")) {
-				t.removeAttr("height");
-			}
-			if(t.hasAttr("style")) {
-				String style = t.attr("style");
-				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
-				t.attr("style", style);
-			}
-		}
-		List<Element> tds = d.getElementsByTag("td");
-		for(Element t : tds) {
-			if(t.hasAttr("height")) {
-				t.removeAttr("height");
-			}
-			if(t.hasAttr("style")) {
-				String style = t.attr("style");
-				style = style.replaceAll("height:[ \\d.pxcmin]{1,};", "");
-				t.attr("style", style);
-			}
-		}
-		List<Element> ignore = d.getElementsByClass("pdfignore");
-		for(Element e: ignore) {
-			e.remove();
-		}
-		
-		if(idtascai.isPresent()) {
-			InstanciaTasca ita = this.its.findById(idtascai.get());
-			if(ita.getTasca().getRol().getNomRol().equals("u_uq")) {
-				d.body().append(this.parseComments(d.html()));
-			}
-		}
-		
-		d.body().append(this.parseComments(d.html()));
-				
-		String basecommand = "google-chrome --headless --disable-gpu --no-pdf-header-footer --run-all-compositor-stages-before-draw --no-sandbox";	
-		File dst = File.createTempFile("saic-pdfpreview-", ".tmp.pdf", new File(tmpPath));
-		File src = File.createTempFile("saic-pdfpreview-", ".tmp.html", new File(tmpPath));
-		src.deleteOnExit();
-		dst.deleteOnExit();
-		
-		PrintWriter out = new PrintWriter(src.getAbsolutePath());
-		out.println(d.html());
-		out.flush();
-		out.close();
-		ProcessBuilder pb = new ProcessBuilder("bash", "-c", basecommand+" --print-to-pdf='"+dst+"' "+src.getAbsolutePath());
-		Process pr = pb.start();
-		pr.waitFor();
-				
-		byte[] bytes = Files.readAllBytes(dst.toPath());
-		src.delete();
-		dst.delete();
-		
-		return bytes;
-	}
-	
-	private String parseComments(String content) throws JsonParseException, JsonMappingException, IOException {
-		// <!--tinycomments\|2\.1\|data:application\/json;base64,([A-Za-z0-9]*)=-->
-		Pattern pattern = Pattern.compile("\\<\\!\\-\\-tinycomments\\|2\\.1\\|data\\:application\\/json\\;base64\\,([A-Za-z0-9\\/\\+\\\\]*)\\=*\\-\\-\\>");
-		Matcher matcher = pattern.matcher(content);
-		String rawComments = "";
-		if(matcher.find()) {
-			byte[] decoded = Base64.getDecoder().decode(matcher.group(1));
-			rawComments = new String(decoded, "UTF-8");
-			
-			if(rawComments.length() < 10) {
-				return "";
-			}
-			
-			rawComments = rawComments.replaceAll("^.", "[");
-			rawComments = rawComments.replaceAll(".$", "]");
-			rawComments = rawComments.replaceAll("\"mce-conversation\\_\\d*\":", "");
-			
-			ObjectMapper mapper = new ObjectMapper();
-			List<PlantillaConversation> comments = mapper.readValue(rawComments, new TypeReference<List<PlantillaConversation>>(){});
-			
-			String tabComments =  "<p class=\"pagebreak\"><!-- pagebreak --></p>"
-								+ "<h3>COMENTARIOS GENERADOS DURANTE LA REVISIÓN DEL DOCUMENTO</h3>"
-								+ "<h3><small>Nota: Esta página no será visible en la versión final publicada del documento.</small></h3>"
-								+ "<table style=\"border-collapse: collapse; width: 297mm; border-width: 1px; border-spacing: 0px; border-color: rgb(149, 165, 166); margin-left: 0px; margin-right: auto;\" border=\"1\" width=\"297mm\" cellspacing=\"0\" cellpadding=\"8\">"
-								+ "<thead>"
-								+ "    <tr style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\" bgcolor=\"#153d63\">"
-								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Usuario</th>"
-								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Nombre</th>"
-								+ "      <th style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166); color:white;\" scope=\"col\">Comentario</th>"
-								+ "    </tr>"
-								+ "  </thead>"
-								+ "<tbody>";
-			for(PlantillaConversation conv: comments) {
-				for(PlantillaComentario c: conv.getComments()) {
-					tabComments += ("<tr style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\"> "
-								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getAuthor()+"</td>"
-								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getAuthorName()+"</td>"
-								  + "  <td style=\"padding: 0px; border-width: 1px; border-color: rgb(149, 165, 166);\">"+c.getContent()+"</td>"
-								  + "</tr> ");
-				}
-			}
-			tabComments += "</tbody></table>";
-			return tabComments;
-		}
-		
-		return "";
-	}
-	
-	public Document replaceSection(String[] opcions, InstanciaTasca it, Document doc) {
-		if(opcions.length > 0) {
-			InstanciaTasca itOld = this.its.getReportFromNomProcesOrgan(opcions[0], 
-																		it.getInstancia().getOrgan().getId().getTlugar(), 
-																		it.getInstancia().getOrgan().getId().getLugar(), 
-																		it.getInstancia().getCentre(), 
-																		it.getInstancia().getTitulacio());
-			try {
-				Document doc2 = Jsoup.parse(itOld.getText());
-				Elements target = null;
-				Elements source = null;
-				if(opcions.length == 2) {
-					target = this.extractTemplateAnchor(doc2, true, opcions[1]);
-					source = this.extractTemplateAnchor(doc, false, opcions[1]);
-				}
-				else {
-					target = this.extractTemplateAnchor(doc2, true, opcions[1], opcions[2]);
-					source = this.extractTemplateAnchor(doc, false, opcions[1], opcions[2]);
-				}
-				
-				if(target == null || source == null) {
-					return doc;
-				}
-				Element e = source.get(0);
-				e.before(this.clear(target.outerHtml()));
-				source.remove();
-			}
-			catch(NullPointerException e){
-				System.out.println("No previous version found for "+it.getIdInstanciaTasca().toString());
-			}
-			
-		}
-		return doc;
-	}
-	
-	public Elements extractTemplateAnchor(Document doc, Boolean target, String... args) {
-		// <a id="pam"></a>		
-		
-		/* Hardcoded to fix anchor positions in existing templates */
-		try{
-			String anchor_ini = args[0];
-			Element eFirst = doc.select("p:has(a#"+anchor_ini+")").first();
-			Elements elems = eFirst.nextElementSiblings();
-			Elements table = elems.select("table:not(.pdfignore)");
-			return table;
-		}
-		catch(Exception e){
-			return null;
-		}
-		
-		/* Use this code in future */
-		/* 
-		if(args.length == 2){
-			String anchor_end = args[1];
-			Element eLast = doc.select("p:has(a#"+anchor_end+")").first();
-			boolean remove = false;
-			for(Iterator<Element> iter = elems.iterator(); iter.hasNext();){
-				Element x = iter.next();
-				if(remove){
-					iter.remove();
-				}
-				if(x.id().equals(anchor_end) || x.html().contains(anchor_end)){
-					remove = true;
-				}
-			}
-		}
-		*/
-		
-	}
-
-	public String clear(String html){
-		return html.replaceAll("data-mce-style=\"[ ,;:.\\d\\w\\(\\)\\#\\%-]{1,}\"", "")
-				   .replaceAll("font-family:[ \\d\\w-,]{1,};", "")
-				   .replaceAll("font-size:[ \\d\\w,\\.]{1,};", "")
-				   .replaceAll("\\<\\!\\-\\-tinycomments\\|2\\.1\\|data\\:application\\/json\\;base64\\,[A-Za-z0-9\\/\\+\\\\]*\\=*\\-\\-\\>", "")
-				   .replaceAll("data\\-mce\\-annotation\\-uid\\=\"mce\\-conversation\\_[a-zA-Z0-9]+\"", "")
-				   .replaceAll("data\\-mce\\-annotation\\=\"tinycomments\"", "")
-				   .replaceAll("class=\"mce-annotation\"", "");
-	}
-		
-	public static String asString(Resource resource) {
-        try (Reader reader = new InputStreamReader(resource.getInputStream(), "UTF-8")) {
-            return FileCopyUtils.copyToString(reader);
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
-        }
-    }
-	
-	public static String readFileToString(String path) {
-	    ResourceLoader resourceLoader = new DefaultResourceLoader();
-	    Resource resource = resourceLoader.getResource(path);
-	    return asString(resource);
-	}
-		
-}

+ 3 - 4
src/main/java/es/uv/saic/web/AdminController.java

@@ -45,6 +45,7 @@ import es.uv.saic.domain.Rol;
 import es.uv.saic.domain.Tasca;
 import es.uv.saic.domain.Usuari;
 import es.uv.saic.domain.UsuarisRol;
+import es.uv.saic.dto.TemplateDataDTO;
 import es.uv.saic.feign.PlantillaClient;
 import es.uv.saic.service.AcreditacioService;
 import es.uv.saic.service.EmailService;
@@ -54,7 +55,6 @@ import es.uv.saic.service.InstanciaService;
 import es.uv.saic.service.InstanciaTascaService;
 import es.uv.saic.service.InstanciaTascaVerService;
 import es.uv.saic.service.OrganService;
-import es.uv.saic.service.PlantillaService;
 import es.uv.saic.service.ProcesService;
 import es.uv.saic.service.RolService;
 import es.uv.saic.service.TascaService;
@@ -70,8 +70,6 @@ public class AdminController {
 	@Autowired
 	private ProcesService ps;
 	@Autowired
-	private PlantillaService pls;
-	@Autowired
 	private InstanciaService is;
 	@Autowired
 	private InstanciaTascaService its;
@@ -987,7 +985,8 @@ public class AdminController {
 			@RequestParam Integer idPlantilla, @RequestParam Integer idTitulacio, @RequestParam Integer idCentre, @RequestParam Integer curs) {
 		
 		Plantilla p = plc.findByID(idPlantilla);
-		String text = pls.addTemplateData(idTitulacio, idCentre, curs, p.getText());
+		TemplateDataDTO td = new TemplateDataDTO(idTitulacio, idCentre, curs, p.getText());
+		String text = plc.addTemplateData2(td);
 		model.addAttribute("text", text);
 		
 		return "adminTemplateTest";

+ 6 - 9
src/main/java/es/uv/saic/web/AjaxController.java

@@ -47,7 +47,6 @@ import es.uv.saic.service.EvidenciaIndicadorEnquestaService;
 import es.uv.saic.service.InstanciaService;
 import es.uv.saic.service.InstanciaTascaService;
 import es.uv.saic.service.OrganService;
-import es.uv.saic.service.PlantillaService;
 import es.uv.saic.service.ProcesService;
 import es.uv.saic.service.RolService;
 import es.uv.saic.service.TascaService;
@@ -72,8 +71,6 @@ public class AjaxController {
 	@Autowired
 	private RolService rs;
 	@Autowired
-	private PlantillaService pls;
-	@Autowired
 	private EvidenciaIndicadorEnquestaService eies;
 	@Autowired
 	private CalendariService cs;
@@ -518,7 +515,7 @@ public class AjaxController {
 	@ResponseBody
 	@GetMapping("/ajax/template/used/{idPlantilla}")
 	public int isTemplateUsed(Model model, Authentication auth, @PathVariable("idPlantilla") Integer idPlantilla) throws IOException {	
-		Boolean u = pls.isUsed(idPlantilla);
+		Boolean u = plc.isUsed(idPlantilla);
 		return u ? 1 : 0;
 	}
 	
@@ -553,12 +550,12 @@ public class AjaxController {
 	@DeleteMapping("/ajax/template/form")
 	@ResponseBody
 	public String formTemplateRemove(Model model, Authentication auth, @RequestParam("id") Integer idPlantilla) throws IOException {	
-		if(pls.isUsed(idPlantilla)){
+		if(plc.isUsed(idPlantilla)){
 			return "0";
 		}
 		else {
 			Plantilla p = plc.findByID(idPlantilla);
-			pls.delete(p);
+			plc.delete(p);
 			return "1";
 		}
 	
@@ -577,7 +574,7 @@ public class AjaxController {
 			p.setNomVal(nomVal);
 			p.setText(text);
 			p.setAmbit(ambit);
-			pls.save(p);
+			plc.save(p);
 			return "1";
 		}
 		else if(action.equals("duplicate") || action.equals("new")) {
@@ -592,7 +589,7 @@ public class AjaxController {
 			p.setNomVal(nomVal);
 			p.setText(text);
 			p.setAmbit(ambit);
-			pls.save(p);
+			plc.save(p);
 			return "1";
 		}
 		return "0";
@@ -604,7 +601,7 @@ public class AjaxController {
 			@RequestParam("text") String text) throws IOException {	
 		Plantilla p = plc.findByID(idPlantilla);
 		p.setText(text);
-		pls.save(p);
+		plc.save(p);
 		return "1";
 	}
 	

+ 8 - 4
src/main/java/es/uv/saic/web/ProceduresController.java

@@ -40,6 +40,9 @@ import es.uv.saic.domain.Organ;
 import es.uv.saic.domain.Plantilla;
 import es.uv.saic.domain.Proces;
 import es.uv.saic.domain.Usuari;
+import es.uv.saic.dto.InstanciaTascaDTO;
+import es.uv.saic.dto.PdfDTO;
+import es.uv.saic.dto.TemplateDataDTO;
 import es.uv.saic.feign.PlantillaClient;
 import es.uv.saic.service.*;
 
@@ -58,8 +61,6 @@ public class ProceduresController {
 	@Autowired
 	private InstanciaTascaVerService itsver;
 	@Autowired
-	private PlantillaService pls;
-	@Autowired
 	private OrganService ors;
 	@Autowired
 	private PlantillaClient plc;
@@ -273,7 +274,8 @@ public class ProceduresController {
 		}
 		else if(it.getTasca().getTipus().getTipus() == 11 || it.getTasca().getTipus().getTipus() == 15) { // Evidencias online
 			it.setText(params.get("evidencia_text"));
-			it.setEvidencia(this.pls.savePDF(params.get("evidencia_text"), it.getIdInstanciaTasca()));
+			PdfDTO pdf = new PdfDTO(params.get("evidencia_text"), it.getIdInstanciaTasca());
+			it.setEvidencia(this.plc.savePDF(pdf));
 			it.setEstat("E");
 		}
 
@@ -421,7 +423,9 @@ public class ProceduresController {
 				itt.setNomEvidenciaVal(p.getNomVal());
 				/* Comprobar estado evidencia, si vacío inyectar contenido de plantilla asociada */
 				if(it.getText() == null && active) {
-					itt.setText(pls.addTemplateData(it, p.getText()));
+					InstanciaTascaDTO itDTO = new InstanciaTascaDTO(it);
+					TemplateDataDTO td = new TemplateDataDTO(itDTO, p.getText());
+					itt.setText(plc.addTemplateData(td));
 				}
 				else if(active){
 					itt.setText(it.getText());

+ 8 - 5
src/main/java/es/uv/saic/web/TestController.java

@@ -15,20 +15,21 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import es.uv.saic.domain.Instancia;
 import es.uv.saic.domain.InstanciaTasca;
+import es.uv.saic.dto.PdfDTO;
+import es.uv.saic.feign.PlantillaClient;
 import es.uv.saic.service.InstanciaService;
 import es.uv.saic.service.InstanciaTascaService;
-import es.uv.saic.service.PlantillaService;
 
 //	Generates PDFs for all instances of a given process and task for admin user 
 @Controller
 public class TestController {
 		
-	@Autowired
-	private PlantillaService ps;
 	@Autowired 
 	private InstanciaService ins;
 	@Autowired 
 	private InstanciaTascaService its;
+	@Autowired
+	private PlantillaClient plc;
 	
 	@Value("${saic.data.filePath}")
 	private String filePath;
@@ -59,7 +60,8 @@ public class TestController {
 			InstanciaTasca it = this.its.findByInstanciaTascap(i.getIdInstancia(), 300);
 			if(it.getEstat() != null) {
 				if(it.getEstat().equals("E")) {
-					String dst = ps.savePDF(it.getText(), it.getIdInstanciaTasca());
+					PdfDTO pdf = new PdfDTO(it.getText(), it.getIdInstanciaTasca());
+					String dst = plc.savePDF(pdf);
 					it.setEvidencia(dst);
 					its.save(it);
 				}
@@ -72,7 +74,8 @@ public class TestController {
 			InstanciaTasca it = this.its.findByInstanciaTascap(i.getIdInstancia(), 300);
 			if(it.getEstat() != null) {
 				if(it.getEstat().equals("E")) {
-					String dst = ps.savePDF(it.getText(), it.getIdInstanciaTasca());
+					PdfDTO pdf = new PdfDTO(it.getText(), it.getIdInstanciaTasca());
+					String dst = plc.savePDF(pdf);
 					it.setEvidencia(dst);
 					its.save(it);
 				}