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 @@ +