diff --git a/src/main/java/com/example/proyectofinal/controllers/modelControllers/EmpressaController.java b/src/main/java/com/example/proyectofinal/controllers/modelControllers/EmpressaController.java index 88f90c2..1116675 100644 --- a/src/main/java/com/example/proyectofinal/controllers/modelControllers/EmpressaController.java +++ b/src/main/java/com/example/proyectofinal/controllers/modelControllers/EmpressaController.java @@ -1,30 +1,81 @@ package com.example.proyectofinal.controllers.modelControllers; import com.example.proyectofinal.models.empresas.Contacto; +import com.example.proyectofinal.models.empresas.Empresa; +import com.example.proyectofinal.models.empresas.Sector; import com.example.proyectofinal.repositories.empresas.ContactoRepository; import com.example.proyectofinal.repositories.empresas.EmpressaRepository; +import com.example.proyectofinal.servicios.EmpresaService; +import com.example.proyectofinal.servicios.SectorService; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; - +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import javax.servlet.http.HttpServletRequest; import java.util.HashSet; +import java.util.List; +import java.util.Optional; import java.util.Set; @Controller -@RequestMapping("/empresas") public class EmpressaController { @Autowired private ContactoRepository contactoRepository; + + + @Autowired + EmpresaService empresaService; + @Autowired - private EmpressaRepository empressaRepository; + SectorService sectorService; - @GetMapping("/{id}") - public String getEmpressaBySector(@PathVariable Long id, Model model) { + @GetMapping("/empresas/{id}") + public String getEmpressaContacts(@PathVariable Long id, Model model) { Set contactoSet = new HashSet<>(contactoRepository.findBySector(id)); model.addAttribute("contactos", contactoSet); return "contactos"; } + + @GetMapping("/admin/empresa/create") + public String showCreateForm(Model model) { + Empresa empresa = new Empresa(); + Sector sector = new Sector(); + List sectores = sectorService.findAll(); + model.addAttribute("empresa", empresa); + model.addAttribute("sector", sector); + model.addAttribute("sectores", sectores); + return "admin/empresa/create"; + } + + + @PostMapping("/empresa/save") + public String guardarCurso(Empresa empresa, @RequestParam("sector.id") Long sectorId, RedirectAttributes redirectAttributes){ + try{ + Sector existingSector = sectorService.findById(sectorId); + if(existingSector != null) { + empresa.setSector(existingSector); + } else { + redirectAttributes.addFlashAttribute("message", "Sector no encontrado"); + return "redirect:/admin/empresa/create"; + } + if(empresaService.exists(empresa) != null){ + redirectAttributes.addFlashAttribute("message", "Este empresa ya existe en la base de datos"); + return "redirect:/admin/empresa/create"; + }else { + empresaService.save(empresa); + redirectAttributes.addFlashAttribute("message", "La empresa fue guardado con exito"); + return "redirect:/admin/empresa/create"; + } + }catch (Exception e) { + redirectAttributes.addFlashAttribute("message", e.getMessage()); + return "redirect:/admin/empresa/create"; + } + } } diff --git a/src/main/java/com/example/proyectofinal/controllers/modelControllers/FamiliaController.java b/src/main/java/com/example/proyectofinal/controllers/modelControllers/FamiliaController.java index 4927540..1f580e2 100644 --- a/src/main/java/com/example/proyectofinal/controllers/modelControllers/FamiliaController.java +++ b/src/main/java/com/example/proyectofinal/controllers/modelControllers/FamiliaController.java @@ -2,7 +2,7 @@ package com.example.proyectofinal.controllers.modelControllers; import com.example.proyectofinal.models.empresas.Ciclo; import com.example.proyectofinal.repositories.empresas.CicloRepository; -import com.example.proyectofinal.servicios.FamiliaService; +import com.example.proyectofinal.servicios.implemetations.FamiliaServImp; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -18,7 +18,7 @@ public class FamiliaController { private CicloRepository cicloRepository; @Autowired - private FamiliaService familiaService; + private FamiliaServImp familiaService; @PostMapping("/crearFamilia") @ResponseBody diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Alumno.java b/src/main/java/com/example/proyectofinal/models/empresas/Alumno.java index 5ad337c..a86aa13 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Alumno.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Alumno.java @@ -64,7 +64,7 @@ public class Alumno { private String keywords; - @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REFRESH},fetch = FetchType.EAGER) + @ManyToMany(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinTable( name = "Alumno_Skill", joinColumns = @JoinColumn(name = "fk_alumno",referencedColumnName = "id"), @@ -72,7 +72,7 @@ public class Alumno { ) private Set skills; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH,CascadeType.REMOVE},fetch = FetchType.EAGER) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinColumn(name = "Ciclo_id",referencedColumnName = "id") private Ciclo ciclo; diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Ciclo.java b/src/main/java/com/example/proyectofinal/models/empresas/Ciclo.java index 9c9efee..f46cc1e 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Ciclo.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Ciclo.java @@ -26,7 +26,7 @@ public class Ciclo { @Column(length = 70) private String codigo; - @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE,CascadeType.REFRESH},fetch = FetchType.EAGER) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinColumn(name = "Familia_id",referencedColumnName = "id") private Familia familia; diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Contacto.java b/src/main/java/com/example/proyectofinal/models/empresas/Contacto.java index 6f8af9f..c59e8dc 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Contacto.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Contacto.java @@ -35,7 +35,7 @@ public class Contacto { @Column(length = 70) private String telefono; - @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE}) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.LAZY) @JoinColumn(name = "Empresa_id",referencedColumnName = "id") private Empresa empresa; diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Empresa.java b/src/main/java/com/example/proyectofinal/models/empresas/Empresa.java index 10fc223..aefe4ac 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Empresa.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Empresa.java @@ -37,7 +37,7 @@ public class Empresa { @Column(length = 2500) private String keywords; - @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE,CascadeType.REFRESH},fetch = FetchType.EAGER) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinColumn(name = "Sector_id",referencedColumnName = "id") private Sector sector; diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Oferta.java b/src/main/java/com/example/proyectofinal/models/empresas/Oferta.java index 686f454..6bcaece 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Oferta.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Oferta.java @@ -32,11 +32,11 @@ public class Oferta { - @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE,CascadeType.REFRESH}) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinColumn(name = "Sucursal_id") private Sucursal sucursal; - @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.REMOVE,CascadeType.REFRESH},fetch = FetchType.EAGER) + @ManyToMany(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinTable( name = "Oferta_Skill", joinColumns = @JoinColumn(name = "fk_oferta",referencedColumnName = "id"), diff --git a/src/main/java/com/example/proyectofinal/models/empresas/Sucursal.java b/src/main/java/com/example/proyectofinal/models/empresas/Sucursal.java index 70ef283..964c8d6 100644 --- a/src/main/java/com/example/proyectofinal/models/empresas/Sucursal.java +++ b/src/main/java/com/example/proyectofinal/models/empresas/Sucursal.java @@ -33,7 +33,7 @@ public class Sucursal { @Name("sede_central") private boolean sedeCentral; - @ManyToOne(cascade = {/*CascadeType.PERSIST,*/CascadeType.MERGE, CascadeType.REMOVE,CascadeType.REFRESH}) + @ManyToOne(cascade = {CascadeType.ALL},fetch = FetchType.LAZY) @JoinColumn(name = "Empresa_id") private Empresa empresa; diff --git a/src/main/java/com/example/proyectofinal/repositories/empresas/EmpressaRepository.java b/src/main/java/com/example/proyectofinal/repositories/empresas/EmpressaRepository.java index cc42128..f32daaf 100644 --- a/src/main/java/com/example/proyectofinal/repositories/empresas/EmpressaRepository.java +++ b/src/main/java/com/example/proyectofinal/repositories/empresas/EmpressaRepository.java @@ -27,6 +27,8 @@ public interface EmpressaRepository extends JpaRepository, JpaSpe @Query("SELECT e FROM Empresa e WHERE e.nombre LIKE %:query% OR e.cif LIKE %:query% OR e.correo LIKE %:query% OR e.telefono LIKE %:query% OR e.keywords LIKE %:query% OR e.sector.nombre LIKE %:query%") List search(@Param("query") String query); + @Query("SELECT e FROM Empresa e WHERE e.nombre = :nombre") + Empresa existsName(@Param("nombre") String empresaName); diff --git a/src/main/java/com/example/proyectofinal/repositories/empresas/SectorRepository.java b/src/main/java/com/example/proyectofinal/repositories/empresas/SectorRepository.java index e7ced66..214241c 100644 --- a/src/main/java/com/example/proyectofinal/repositories/empresas/SectorRepository.java +++ b/src/main/java/com/example/proyectofinal/repositories/empresas/SectorRepository.java @@ -11,4 +11,5 @@ public interface SectorRepository extends JpaRepository { @Query(value = "SELECT * FROM sectores u WHERE MATCH(u.nombre) AGAINST(?1 IN BOOLEAN MODE)", nativeQuery = true) public Sector getSectorFullTextSeach(String word); + } diff --git a/src/main/java/com/example/proyectofinal/servicios/EmpresaService.java b/src/main/java/com/example/proyectofinal/servicios/EmpresaService.java index 758c070..6c76b56 100644 --- a/src/main/java/com/example/proyectofinal/servicios/EmpresaService.java +++ b/src/main/java/com/example/proyectofinal/servicios/EmpresaService.java @@ -18,4 +18,7 @@ public interface EmpresaService { void deleteById(Long id); List search(String query); + + Empresa exists(Empresa empresa); + } diff --git a/src/main/java/com/example/proyectofinal/servicios/SectorService.java b/src/main/java/com/example/proyectofinal/servicios/SectorService.java new file mode 100644 index 0000000..c9b0948 --- /dev/null +++ b/src/main/java/com/example/proyectofinal/servicios/SectorService.java @@ -0,0 +1,23 @@ +package com.example.proyectofinal.servicios; + +import com.example.proyectofinal.models.empresas.Empresa; +import com.example.proyectofinal.models.empresas.Sector; +import org.springframework.data.domain.Page; + +import java.util.List; + +public interface SectorService { + List findAll(); + + Page finadAllpaginated(int pageNum, int pageSize, String sortField, String sortDir); + + Sector findById(Long id); + + Sector findByName(String name); + + Sector save(Sector sector); + + void deleteById(Long id); + + List search(String query); +} diff --git a/src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServiceImplementation.java b/src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServImp.java similarity index 87% rename from src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServiceImplementation.java rename to src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServImp.java index 0c3ba96..021f316 100644 --- a/src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServiceImplementation.java +++ b/src/main/java/com/example/proyectofinal/servicios/implemetations/EmpresaServImp.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; import java.util.List; @Service -public class EmpresaServiceImplementation implements EmpresaService { +public class EmpresaServImp implements EmpresaService { @Autowired private EmpressaRepository empressaRepository; @@ -52,7 +52,11 @@ public class EmpresaServiceImplementation implements EmpresaService { return empressaRepository.search(query); } - + @Override + public Empresa exists(Empresa empresa) { + String nombre = empresa.getNombre(); + return empressaRepository.existsName(nombre); + } } diff --git a/src/main/java/com/example/proyectofinal/servicios/FamiliaService.java b/src/main/java/com/example/proyectofinal/servicios/implemetations/FamiliaServImp.java similarity index 92% rename from src/main/java/com/example/proyectofinal/servicios/FamiliaService.java rename to src/main/java/com/example/proyectofinal/servicios/implemetations/FamiliaServImp.java index e2ebf4c..33d0947 100644 --- a/src/main/java/com/example/proyectofinal/servicios/FamiliaService.java +++ b/src/main/java/com/example/proyectofinal/servicios/implemetations/FamiliaServImp.java @@ -1,4 +1,4 @@ -package com.example.proyectofinal.servicios; +package com.example.proyectofinal.servicios.implemetations; import com.example.proyectofinal.models.empresas.Familia; import com.example.proyectofinal.repositories.empresas.FamiliaRepository; @@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class FamiliaService { +public class FamiliaServImp { @Autowired private FamiliaRepository familiaRepository; diff --git a/src/main/java/com/example/proyectofinal/servicios/implemetations/SectorSerImp.java b/src/main/java/com/example/proyectofinal/servicios/implemetations/SectorSerImp.java new file mode 100644 index 0000000..1ca9a5f --- /dev/null +++ b/src/main/java/com/example/proyectofinal/servicios/implemetations/SectorSerImp.java @@ -0,0 +1,52 @@ +package com.example.proyectofinal.servicios.implemetations; + +import com.example.proyectofinal.models.empresas.Empresa; +import com.example.proyectofinal.models.empresas.Sector; +import com.example.proyectofinal.repositories.empresas.SectorRepository; +import com.example.proyectofinal.servicios.SectorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.util.List; +@Service +public class SectorSerImp implements SectorService { + + @Autowired + private SectorRepository sectorRepository; + + @Override + public List findAll() { + return sectorRepository.findAll(); + } + + @Override + public Page finadAllpaginated(int pageNum, int pageSize, String sortField, String sortDir) { + return null; + } + + @Override + public Sector findById(Long id) { + return sectorRepository.findById(id).orElse(null); + } + + @Override + public Sector findByName(String name) { + return sectorRepository.findByNombre(name); + } + + @Override + public Sector save(Sector sector) { + return sectorRepository.save(sector); + } + + @Override + public void deleteById(Long id) { + sectorRepository.deleteById(id); + } + + @Override + public List search(String query) { + return List.of(); + } +} diff --git a/src/main/resources/random b/src/main/resources/random index e5886ad..b2c1954 100644 --- a/src/main/resources/random +++ b/src/main/resources/random @@ -1,23 +1,34 @@ -function dynamicSearch() { - var input, filter, table, tbody, tr, td, i, j, txtValue; - input = document.getElementById("myInput"); - filter = input.value.toUpperCase(); - table = document.getElementById("table"); - tbody = table.getElementsByTagName("tbody")[0]; - tr = tbody.getElementsByTagName("tr"); +$(document).ready(function() { + $("#modal-container").load("/empresas/createEmpresaModal"); + }); - for (i = 0; i < tr.length; i++) { - for (j = 0; j < tr[i].cells.length; j++) { - td = tr[i].cells[j]; - if (td) { - txtValue = td.textContent || td.innerText; - if (txtValue.toUpperCase().indexOf(filter) > -1) { - tr[i].style.display = ""; - break; - } else { - tr[i].style.display = "none"; + $(document).ready(function() { + // Load the modal HTML into #modal-container + $("#modal-container").load("/empresas/createEmpresaModal", function() { + // Get the modal + var modal = document.getElementById("empresaCreateModal"); + + // Get the button that opens the modal + var btn = document.getElementById("create-icon"); + + // Get the element that closes the modal + var span = document.getElementsByClassName("close")[0]; + + // When the user clicks the button, open the modal + btn.onclick = function() { + modal.style.display = "block"; + } + + // When the user clicks on (x), close the modal + span.onclick = function() { + modal.style.display = "none"; + } + + // When the user clicks anywhere outside of the modal, close it + window.onclick = function(event) { + if (event.target == modal) { + modal.style.display = "none"; } } - } - } -} + }); + }); \ No newline at end of file diff --git a/src/main/resources/static/style.css b/src/main/resources/static/style.css index 90e92d7..80c2e2b 100644 --- a/src/main/resources/static/style.css +++ b/src/main/resources/static/style.css @@ -16,12 +16,11 @@ width: 40px; height: 40px; } - th { - background-color: #f2f2f2; /* Change this to your preferred color */ - color: black; /* Change this to your preferred color */ + background-color: #f2f2f2; + color: black; padding: 10px; - border: 1px solid #ddd; /* Adds border to the table headers */ + border: 1px solid #ddd; } h1 { @@ -40,31 +39,50 @@ h1 { width: 100%; position: relative; } - .table { - padding-top: 5px; + table-layout: fixed; width: 100%; - height: 90vh; - overflow-y: auto; } -.cell{ - height: 10px; +.table td, .table th { + width: 150px; + height: 50px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.table thead th { + position: sticky; + top: 0; + background: #fff; + z-index: 10; +} +.table td { + width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.table tr td:first-child { + width: 50px; + overflow: hidden; + text-overflow: ellipsis; +} +.table tr th:first-child { + width: 50px; + overflow: hidden; + text-overflow: ellipsis; } - @media screen and (max-width: 600px) { .table { } } - .table tr { height: 10%; } - body { margin: 0; padding: 0px; } - .header { display: flex; align-items: center; @@ -73,19 +91,15 @@ body { padding: 0; box-sizing: border-box; } - .header h1 { margin: 0; } - .header button { margin-right: auto; } - .logout-button { position: relative; } - .logout-button { position: relative; } @@ -93,5 +107,36 @@ html, body { margin: 0; padding: 0; } - - +.page{ + display: flex; + justify-content: center; + align-items: center; + margin-top: 20px; +} +.page a{ + padding:10px; +} +#edit-icon { + color: #ffa600; + margin-right: 10px; + margin-left: 10px; + font-size: 24px; +} +#delete-icon { + color: red; + margin-left: 5px; + font-size: 24px; +} +#create-icon { + color: green; + font-size: 24px; + margin-left: 10px; +} +.inactive { + pointer-events: none; + color: grey; +} +.no-link-style { + color: inherit; + text-decoration: none; +} \ No newline at end of file diff --git a/src/main/resources/templates/admin/empresa/create.html b/src/main/resources/templates/admin/empresa/create.html new file mode 100644 index 0000000..6570caa --- /dev/null +++ b/src/main/resources/templates/admin/empresa/create.html @@ -0,0 +1,154 @@ + + + + + Creacion: Familia + + + + + + + + +

AƱadir Empresa

+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ + + + diff --git a/src/main/resources/templates/admin/familia/familia_borar.html b/src/main/resources/templates/admin/empresa/delete.html similarity index 100% rename from src/main/resources/templates/admin/familia/familia_borar.html rename to src/main/resources/templates/admin/empresa/delete.html diff --git a/src/main/resources/templates/admin/familia/familia_edit.html b/src/main/resources/templates/admin/empresa/edit.html similarity index 100% rename from src/main/resources/templates/admin/familia/familia_edit.html rename to src/main/resources/templates/admin/empresa/edit.html diff --git a/src/main/resources/templates/admin/familia/familia_crear.html b/src/main/resources/templates/admin/familia/create.html similarity index 96% rename from src/main/resources/templates/admin/familia/familia_crear.html rename to src/main/resources/templates/admin/familia/create.html index c921de7..956a09b 100644 --- a/src/main/resources/templates/admin/familia/familia_crear.html +++ b/src/main/resources/templates/admin/familia/create.html @@ -46,7 +46,7 @@

CREAR FAMILIA

-
+

diff --git a/src/main/resources/templates/admin/familia/delete.html b/src/main/resources/templates/admin/familia/delete.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/src/main/resources/templates/admin/familia/delete.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/familia/edit.html b/src/main/resources/templates/admin/familia/edit.html new file mode 100644 index 0000000..566549b --- /dev/null +++ b/src/main/resources/templates/admin/familia/edit.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/list/empresas.html b/src/main/resources/templates/list/empresas.html index 02fc7c1..95889ff 100644 --- a/src/main/resources/templates/list/empresas.html +++ b/src/main/resources/templates/list/empresas.html @@ -2,128 +2,13 @@ - + Title @@ -134,7 +19,7 @@ - +
@@ -180,7 +65,11 @@ - + @@ -252,19 +141,29 @@ data.forEach(empresa => { var row = document.createElement('tr'); row.innerHTML = ` - - - - - - - - `; + + + + + + + + `; tableBody.appendChild(row); }); }); } }); + + document.getElementById('create-icon').addEventListener('click', function() { + window.location = "/admin/empresa/create"; + }); + + \ No newline at end of file diff --git a/src/main/resources/templates/list/familias.html b/src/main/resources/templates/list/familias.html index d503dc0..db2e44b 100644 --- a/src/main/resources/templates/list/familias.html +++ b/src/main/resources/templates/list/familias.html @@ -25,7 +25,7 @@ - +
[[${empresa.id}]][[${empresa.nombre}]] + [[${empresa.nombre}]] + + + [[${empresa.cif}]] [[${empresa.correo}]] [[${empresa.telefono}]]${empresa.id}${empresa.nombre}${empresa.cif}${empresa.correo}${empresa.telefono}${empresa.keywords}${empresa.sector.nombre}${empresa.id} + ${empresa.nombre} + + + ${empresa.cif}${empresa.correo}${empresa.telefono}${empresa.keywords}${empresa.sector.nombre}
[[${familia.id}]][[${familia.nombre}]][[${familia.nombre}]]