diff --git a/curriculumsearch/pom.xml b/curriculumsearch/pom.xml
index 65a2dfd..7d27c1a 100644
--- a/curriculumsearch/pom.xml
+++ b/curriculumsearch/pom.xml
@@ -111,6 +111,12 @@
+
+ org.apache.poi
+ poi-ooxml
+ 4.1.0
+
+
diff --git a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java
index 8e6050a..b573fa1 100644
--- a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java
+++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java
@@ -1,8 +1,13 @@
package com.roshka.controller;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
import java.util.List;
@@ -24,6 +29,7 @@ import com.roshka.repositorio.TecnologiaRepository;
import com.roshka.utils.Helper;
+import com.roshka.utils.PostulantesExcelExporter;
import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.type.StringType;
import org.springframework.beans.factory.annotation.Autowired;
@@ -80,7 +86,7 @@ public class PostulanteRRHHController {
}
@RequestMapping("/postulantes")
- public String postulantes(Model model,
+ public String postulantes(HttpServletRequest request, Model model,
@RequestParam(required = false)Long tecId,
@RequestParam(required = false)String nombre,
@RequestParam(required = false)EstadoPostulante estado,
@@ -92,7 +98,7 @@ public class PostulanteRRHHController {
@RequestParam(required = false)Long cargoId,
@RequestParam(required = false)Long convId,
@RequestParam(defaultValue = "0")Integer nroPagina
- ) {
+ ) throws IOException {
final Integer CANTIDAD_POR_PAGINA = 5;
Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id"));
model.addAttribute("tecnologias", tecRepo.findAll());
@@ -119,12 +125,73 @@ public class PostulanteRRHHController {
if(expInMonths != null && expInMonths > expTotal) continue;
postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
}
-
+
model.addAttribute("pages", postulantesPag.getTotalPages());
model.addAttribute("postulantes", postulantesDTO);
+
+ String query = request.getQueryString();
+ model.addAttribute("query", query);
+
return "postulantes";
}
-
+
+
+ @RequestMapping("/postulantesExcel")
+ public void exportPostulantesExcel(HttpServletResponse response, Model model,
+ @RequestParam(required = false)Long tecId,
+ @RequestParam(required = false)String nombre,
+ @RequestParam(required = false)EstadoPostulante estado,
+ @RequestParam(required = false)Disponibilidad dispo,
+ @RequestParam(required = false)Long lvlEng,
+ @RequestParam(required = false)Long lvlTec,
+ @RequestParam(required = false)Long instId,
+ @RequestParam(required = false)Long expInMonths,
+ @RequestParam(required = false)Long cargoId,
+ @RequestParam(required = false)Long convId,
+ @RequestParam(defaultValue = "0")Integer nroPagina
+ ) throws IOException {
+ Pageable page = PageRequest.of(0,Integer.MAX_VALUE,Sort.by("id"));
+ Page postulantesPag = post.postulantesMultiFiltro(
+ nombre == null || nombre.trim().isEmpty() ?
+ new TypedParameterValue(StringType.INSTANCE,null) :
+ new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),
+ dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId);
+ List postulantes = postulantesPag.getContent();
+ List postulantesDTO = new ArrayList<>();
+
+ for (Postulante postulante : postulantes) {
+ long expTotal = 0;
+ //Sumamos el tiempo de experiencia total en meses de cada postulante
+ //expTotal = postulante.getExperiencias().stream().mapToLong(e -> Helper.getMonthsDifference(e.getFechaDesde(), e.getFechaHasta())).sum();
+ for (Experiencia experiencia : postulante.getExperiencias()) {
+ expTotal += Helper.getMonthsDifference(experiencia.getFechaDesde(), experiencia.getFechaHasta());
+ }
+ if(expInMonths != null && expInMonths > expTotal) continue;
+ postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
+ }
+
+ response.setContentType("application/octet-stream");
+ DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
+ String currentDateTime = dateFormatter.format(new Date());
+
+ String headerKey = "Content-Disposition";
+ String headerValue = "attachment; filename=postulantes_" + currentDateTime + ".xlsx";
+ response.setHeader(headerKey, headerValue);
+
+ HashMap filtros = new HashMap();
+ filtros.put("nombre", nombre.equals("") ? "-":nombre);
+ filtros.put("nivelIngles", lvlEng == null ? "-" : lvlEng.toString());
+ filtros.put("tecnologia", tecId == null ? "-" : tecRepo.findById(tecId).get().getNombre());
+ filtros.put("nivelTecnologia", lvlTec == null ? "-" : lvlTec.toString());
+ filtros.put("institucion", instId == null ? "-" : institucionRepository.findById(instId).get().getNombre());
+ filtros.put("estado", estado == null ? "-" : estado.getEstado());
+ filtros.put("experienciaEnMeses", expInMonths == null ? "-" : expInMonths.toString());
+ filtros.put("convocatoria", convId == null ? "-" : cargoRepo.findById(convId).get().getCargo().getNombre());
+
+ PostulantesExcelExporter excelExporter = new PostulantesExcelExporter(postulantesDTO, filtros);
+
+ excelExporter.export(response);
+ }
@GetMapping({"/postulantes/{postulanteId}"})
diff --git a/curriculumsearch/src/main/java/com/roshka/utils/PostulantesExcelExporter.java b/curriculumsearch/src/main/java/com/roshka/utils/PostulantesExcelExporter.java
new file mode 100644
index 0000000..4fe21e4
--- /dev/null
+++ b/curriculumsearch/src/main/java/com/roshka/utils/PostulantesExcelExporter.java
@@ -0,0 +1,142 @@
+package com.roshka.utils;
+
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+
+import com.roshka.DTO.PostulanteListaDTO;
+import com.roshka.modelo.PostulanteTecnologia;
+import com.roshka.modelo.Tecnologia;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+public class PostulantesExcelExporter {
+ private XSSFWorkbook workbook;
+ private XSSFSheet sheet;
+ private List listUsers;
+ private HashMap filtros;
+
+ public PostulantesExcelExporter(List listUsers, HashMap filtros) {
+ this.listUsers = listUsers;
+ workbook = new XSSFWorkbook();
+ this.filtros = filtros;
+ }
+
+
+ private void writeHeaderLine() {
+ sheet = workbook.createSheet("Postulantes");
+ DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
+ String currentDateTime = dateFormatter.format(new Date());
+
+ Row row = sheet.createRow(0);
+ CellStyle style = workbook.createCellStyle();
+ XSSFFont font = workbook.createFont();
+ font.setBold(true);
+ font.setFontHeight(14);
+ style.setFont(font);
+ createCell(row, 0, "Postulantes "+currentDateTime, style);
+
+ row = sheet.createRow(2);
+ createCell(row, 0, "Filtros", style);
+
+ row = sheet.createRow(3);
+ createCell(row, 0, "Nombre", style);
+ createCell(row, 1, "Nivel de Ingles", style);
+ createCell(row, 2, "Experiencia (Meses)", style);
+ createCell(row, 3, "Tecnologias", style);
+ createCell(row, 4, "Nivel Tecnologia", style);
+ createCell(row, 5, "Institucion", style);
+ createCell(row, 6, "Estado", style);
+ createCell(row, 7, "Convocatoria", style);
+
+
+ row = sheet.createRow(6);
+ style = workbook.createCellStyle();
+ font = workbook.createFont();
+ font.setBold(true);
+ font.setFontHeight(14);
+ style.setFont(font);
+
+ createCell(row, 0, "Nombre", style);
+ createCell(row, 1, "Nivel de Ingles", style);
+ createCell(row, 2, "Experiencia", style);
+ createCell(row, 3, "Tecnologias", style);
+ createCell(row, 4, "Estado", style);
+
+ row = sheet.createRow(4);
+ font.setBold(false);
+ font.setFontHeight(12);
+ style.setFont(font);
+ createCell(row, 0, filtros.get("nombre"), style);
+ createCell(row, 1, filtros.get("nivelIngles"), style);
+ createCell(row, 2, filtros.get("experienciaEnMeses"), style);
+ createCell(row, 3, filtros.get("tecnologia"), style);
+ createCell(row, 4, filtros.get("nivelTecnologia"), style);
+ createCell(row, 5, filtros.get("institucion"), style);
+ createCell(row, 6, filtros.get("estado"), style);
+ createCell(row, 7, filtros.get("convocatoria"), style);
+
+ }
+
+ private void createCell(Row row, int columnCount, Object value, CellStyle style) {
+ sheet.autoSizeColumn(columnCount);
+ Cell cell = row.createCell(columnCount);
+ if (value instanceof Integer) {
+ cell.setCellValue((Integer) value);
+ } else if (value instanceof Boolean) {
+ cell.setCellValue((Boolean) value);
+ }else {
+ cell.setCellValue((String) value);
+ }
+ cell.setCellStyle(style);
+ }
+
+ private void writeDataLines() {
+ int rowCount = 7;
+
+ CellStyle style = workbook.createCellStyle();
+ XSSFFont font = workbook.createFont();
+ font.setFontHeight(12);
+ style.setFont(font);
+
+ for (PostulanteListaDTO user : listUsers) {
+ Row row = sheet.createRow(rowCount++);
+ int columnCount = 0;
+
+ StringBuilder tecno = new StringBuilder();
+ for(PostulanteTecnologia tecnologia: user.getTecnologias()){
+ tecno.append(tecnologia.getTecnologia().getNombre()).append(" ");
+ }
+
+ createCell(row, columnCount++, user.getNombre() + " " + user.getApellido(), style);
+ createCell(row, columnCount++, user.getNivelIngles().intValue(), style);
+ createCell(row, columnCount++, user.getExperienciaMeses().intValue(), style);
+ createCell(row, columnCount++, tecno.toString(), style);
+ createCell(row, columnCount++, user.getEstado().getEstado(), style);
+ tecno.delete(0, tecno.length()-1);
+ }
+ }
+
+ public void export(HttpServletResponse response) throws IOException {
+ writeHeaderLine();
+ writeDataLines();
+
+ ServletOutputStream outputStream = response.getOutputStream();
+ workbook.write(outputStream);
+ workbook.close();
+
+ outputStream.close();
+
+ }
+}
\ No newline at end of file
diff --git a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp
index a373447..7ab7671 100644
--- a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp
+++ b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp
@@ -165,6 +165,16 @@
+