Commit bf2489ad by willgonzz

mege con giuli

parents 28e676fb 5fe7f612
...@@ -92,6 +92,21 @@ ...@@ -92,6 +92,21 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -42,6 +42,7 @@ public class CurriculumsearchApplication { ...@@ -42,6 +42,7 @@ public class CurriculumsearchApplication {
guardarJson(convR,"/json/convocatoria.json",ConvocatoriaCargo.class); guardarJson(convR,"/json/convocatoria.json",ConvocatoriaCargo.class);
guardarJson(depR,"/json/Departamento.json",Departamento.class); guardarJson(depR,"/json/Departamento.json",Departamento.class);
guardarJson(ciudR,"/json/Ciudad.json",Ciudad.class); guardarJson(ciudR,"/json/Ciudad.json",Ciudad.class);
guardarJson(tecRepo,"/json/tecnologia.json",Tecnologia.class);
guardarJson(postRepo,"/json/postulante.json",Postulante.class); guardarJson(postRepo,"/json/postulante.json",Postulante.class);
String password = new BCryptPasswordEncoder().encode("test"); String password = new BCryptPasswordEncoder().encode("test");
......
...@@ -115,9 +115,6 @@ public class PostulanteController { ...@@ -115,9 +115,6 @@ public class PostulanteController {
if(cv!=null) cv.setPostulante(postulante); if(cv!=null) cv.setPostulante(postulante);
postulante.setCvFile(cv); postulante.setCvFile(cv);
} }
postulante.getTecnologias().stream().filter(tec -> tec.getTecnologia().getId() != 0)
.forEach(tec -> tec.setTecnologia(tecRepo.getById(tec.getTecnologia().getId())));
for(Estudio estudio: postulante.getEstudios()){ for(Estudio estudio: postulante.getEstudios()){
String nombreIns = ""; String nombreIns = "";
nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); nombreIns = estudio.getInstitucion().getNombre().toLowerCase();
......
package com.roshka.controller; package com.roshka.controller;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
...@@ -20,9 +26,11 @@ import com.roshka.repositorio.ExperienciaRepository; ...@@ -20,9 +26,11 @@ import com.roshka.repositorio.ExperienciaRepository;
import com.roshka.repositorio.InstitucionRepository; import com.roshka.repositorio.InstitucionRepository;
import com.roshka.repositorio.PostulanteRepository; import com.roshka.repositorio.PostulanteRepository;
import com.roshka.repositorio.TecnologiaRepository; import com.roshka.repositorio.TecnologiaRepository;
import com.roshka.service.PdfGenerator;
import com.roshka.utils.Helper; import com.roshka.utils.Helper;
import com.roshka.utils.PostulantesExcelExporter;
import org.hibernate.jpa.TypedParameterValue; import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.type.StringType; import org.hibernate.type.StringType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -40,6 +48,8 @@ import org.springframework.http.HttpHeaders; ...@@ -40,6 +48,8 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller @Controller
...@@ -77,7 +87,7 @@ public class PostulanteRRHHController { ...@@ -77,7 +87,7 @@ public class PostulanteRRHHController {
} }
@RequestMapping("/postulantes") @RequestMapping("/postulantes")
public String postulantes(Model model, public String postulantes(HttpServletRequest request, Model model,
@RequestParam(required = false)Long tecId, @RequestParam(required = false)Long tecId,
@RequestParam(required = false)String nombre, @RequestParam(required = false)String nombre,
@RequestParam(required = false)EstadoPostulante estado, @RequestParam(required = false)EstadoPostulante estado,
...@@ -89,13 +99,14 @@ public class PostulanteRRHHController { ...@@ -89,13 +99,14 @@ public class PostulanteRRHHController {
@RequestParam(required = false)Long cargoId, @RequestParam(required = false)Long cargoId,
@RequestParam(required = false)Long convId, @RequestParam(required = false)Long convId,
@RequestParam(defaultValue = "0")Integer nroPagina @RequestParam(defaultValue = "0")Integer nroPagina
) { ) throws IOException {
final Integer CANTIDAD_POR_PAGINA = 10; final Integer CANTIDAD_POR_PAGINA = 5;
Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id")); Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id"));
model.addAttribute("tecnologias", tecRepo.findAll()); model.addAttribute("tecnologias", tecRepo.findAll());
model.addAttribute("disponibilidades", Disponibilidad.values()); model.addAttribute("disponibilidades", Disponibilidad.values());
model.addAttribute("institucionesEducativas", institucionRepository.findAll()); model.addAttribute("institucionesEducativas", institucionRepository.findAll());
model.addAttribute("estadoP", EstadoPostulante.values()); model.addAttribute("estadoP", EstadoPostulante.values());
model.addAttribute("cargos", carRepo.findAll()); model.addAttribute("cargos", carRepo.findAll());
model.addAttribute("cargoRepo", cargoRepo); model.addAttribute("cargoRepo", cargoRepo);
//model.addAttribute("convocatoriaC", cargoRepo.findAll()); //model.addAttribute("convocatoriaC", cargoRepo.findAll());
...@@ -105,7 +116,12 @@ public class PostulanteRRHHController { ...@@ -105,7 +116,12 @@ public class PostulanteRRHHController {
// TODO Auto-generated catch block // TODO Auto-generated catch block
er.printStackTrace(); er.printStackTrace();
} }
Page<Postulante> 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); Page<Postulante> 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);
model.addAttribute("numeroOcurrencias", postulantesPag.getTotalElements());
List<Postulante> postulantes = postulantesPag.getContent(); List<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> postulantesDTO = new ArrayList<>(); List<PostulanteListaDTO> postulantesDTO = new ArrayList<>();
...@@ -122,10 +138,71 @@ public class PostulanteRRHHController { ...@@ -122,10 +138,71 @@ public class PostulanteRRHHController {
model.addAttribute("pages", postulantesPag.getTotalPages()); model.addAttribute("pages", postulantesPag.getTotalPages());
model.addAttribute("postulantes", postulantesDTO); model.addAttribute("postulantes", postulantesDTO);
String query = request.getQueryString();
model.addAttribute("query", query);
return "postulantes"; 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<Postulante> 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<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> 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<String, String> filtros = new HashMap<String, String>();
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}"}) @GetMapping({"/postulantes/{postulanteId}"})
public String getPostulanteDetalle(Model model, @PathVariable("postulanteId") Long postulanteId) { public String getPostulanteDetalle(Model model, @PathVariable("postulanteId") Long postulanteId) {
...@@ -136,6 +213,8 @@ public class PostulanteRRHHController { ...@@ -136,6 +213,8 @@ public class PostulanteRRHHController {
return "detallepostulante"; return "detallepostulante";
} }
@PostMapping({"/postulantes/{postulanteId}"}) @PostMapping({"/postulantes/{postulanteId}"})
public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) { public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) {
//post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId()); //post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId());
...@@ -169,5 +248,26 @@ public class PostulanteRRHHController { ...@@ -169,5 +248,26 @@ public class PostulanteRRHHController {
} }
} }
@GetMapping("/postulantes/{id}/pdf")
public ResponseEntity<Resource> downloadPDF(@PathVariable Long id) {
// Load file from database
PdfGenerator pdf = new PdfGenerator();
try {
Postulante postulante = post.findById(id)
.orElseThrow(() -> new Exception("Postulante no encontrado"));
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/pdf"))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + postulante.getNroDocument() + ".pdf" + "\"")
.body(new ByteArrayResource(pdf.generatePdfReport(postulante)));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return ResponseEntity.notFound().build();
}
}
} }
\ No newline at end of file
...@@ -96,6 +96,9 @@ public class Postulante { ...@@ -96,6 +96,9 @@ public class Postulante {
@Column(name = "disponibilidad", length = 2) @Column(name = "disponibilidad", length = 2)
private Disponibilidad disponibilidad; private Disponibilidad disponibilidad;
@Column(name = "tecnologia_otros")
private String tecnologiaOtros;
@JsonManagedReference(value = "postulantetecnologia-postulante") @JsonManagedReference(value = "postulantetecnologia-postulante")
@OneToMany(mappedBy = "postulante",cascade = CascadeType.ALL) @OneToMany(mappedBy = "postulante",cascade = CascadeType.ALL)
private List<PostulanteTecnologia> tecnologias; private List<PostulanteTecnologia> tecnologias;
......
...@@ -31,7 +31,7 @@ public class PostulanteTecnologia { ...@@ -31,7 +31,7 @@ public class PostulanteTecnologia {
@Min(value = 1) @Min(value = 1)
@Max(value = 5) @Max(value = 5)
private Long nivel; private Long nivel;
@ManyToOne(cascade = {CascadeType.PERSIST},optional = false) @ManyToOne()
@JoinColumn @JoinColumn
private Tecnologia tecnologia; private Tecnologia tecnologia;
......
package com.roshka.service;
import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.stream.Collectors;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import org.springframework.stereotype.Component;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.roshka.modelo.Estudio;
import com.roshka.modelo.Experiencia;
import com.roshka.modelo.Postulante;
import com.roshka.utils.Helper;
@Component("pdfGenerator")
public class PdfGenerator {
private static Font COURIER = new Font(Font.FontFamily.COURIER, 20, Font.BOLD);
private static Font COURIER_MEDIUM = new Font(Font.FontFamily.COURIER, 16, Font.BOLD);
private static Font COURIER_SMALL = new Font(Font.FontFamily.COURIER, 14, Font.UNDERLINE);
public byte[] generatePdfReport(Postulante postulante) {
Document document = new Document();
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfWriter.getInstance(document, byteArrayOutputStream);
document.open();
addDocTitle(document, postulante);
createTable(document,postulante);
document.close();
System.out.println("------------------Your PDF Report is ready!-------------------------");
return byteArrayOutputStream.toByteArray();
} catch ( DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
private void addDocTitle(Document document, Postulante postulante) throws DocumentException {
Paragraph p1 = new Paragraph();
leaveEmptyLine(p1, 1);
p1.add(new Paragraph("Detalles del postulante", COURIER));
p1.setAlignment(Element.ALIGN_CENTER);
document.add(p1);
}
private void agregarEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_MEDIUM));
document.add(p1);
}
private void agregarSubEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_SMALL));
document.add(p1);
}
private void agregarLabelTexto(Document document, String label, Object texto) throws DocumentException{
if(texto == null) return;
if(texto instanceof Date) texto = Helper.formatDate((Date)texto, "dd-MM-yyyy");
Paragraph paragraph = new Paragraph();
paragraph.add(label + ": ");
paragraph.add(texto.toString());
document.add(paragraph);
}
private void createTable(Document document, Postulante postulante) throws DocumentException {
Paragraph paragraph = new Paragraph();
leaveEmptyLine(paragraph, 3);
//paragraph.add();
agregarEncabezado(document, "Datos personales");
agregarLabelTexto(document, "Nombre", postulante.getNombre() + " " + postulante.getApellido());
agregarLabelTexto(document, "Nro de Documento", postulante.getNroDocument());
agregarLabelTexto(document, "Correo", postulante.getCorreo());
agregarLabelTexto(document, "Direccion", postulante.getDireccion());
agregarLabelTexto(document, "Ciudad", postulante.getCiudad().getNombre());
agregarLabelTexto(document, "Telefono", postulante.getTelefono());
agregarLabelTexto(document, "Edad", Helper.calculateAge(postulante.getFechaNacimiento()) );
agregarLabelTexto(document, "Nivel de Ingles", postulante.getNivelIngles());
agregarLabelTexto(document, "Nacionalidad", postulante.getNacionalidad().getDescripcion());
agregarEncabezado(document, "Experiencias");
for(Experiencia ex : postulante.getExperiencias()){
agregarSubEncabezado(document, ex.getInstitucion());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Cargo", ex.getCargo());
agregarLabelTexto(document, "Tipo Experiencia", ex.getTipoExperiencia());
agregarLabelTexto(document, "Descripcion", ex.getDescripcion());
agregarLabelTexto(document, "Nombre Referencia", ex.getNombreReferencia());
agregarLabelTexto(document, "Telefono Referencia", ex.getTelefonoReferencia());
agregarLabelTexto(document, "Motivo Salida", ex.getMotivoSalida());
}
agregarEncabezado(document, "Estudios");
for(Estudio ex : postulante.getEstudios()){
agregarSubEncabezado(document, ex.getInstitucion().getNombre());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Tema de Estudio", ex.getTemaDeEstudio());
agregarLabelTexto(document, "Tipo de Estudio", ex.getTipoDeEstudio());
agregarLabelTexto(document, "Descripcion", ex.getEstado().toString());
}
agregarEncabezado(document, "Cargo al cual postula");
agregarList(postulante.getPostulaciones().stream()
.map(cc -> cc.getCargo().getNombre())
.collect(Collectors.toList()), document);
agregarEncabezado(document, "Tecnologias");
agregarList(postulante.getTecnologias().stream()
.map(cc -> cc.getTecnologia().getNombre())
.collect(Collectors.toList()),
document);
agregarEncabezado(document, "Referencias Personales");
agregarList(postulante.getReferencias().stream()
.map(cc -> "Nombre: " + cc.getNombre() + ". Relacion: " + cc.getRelacion() + ". Telefono: " + cc.getTelefono() )
.collect(Collectors.toList()),
document);
}
private void agregarList(java.util.List<String> items, Document document) throws DocumentException{
List list = new List(false);
for(String item : items){
list.add(new ListItem(item));
}
document.add(list);
}
private static void leaveEmptyLine(Paragraph paragraph, int number) {
for (int i = 0; i < number; i++) {
paragraph.add(new Paragraph(" "));
}
}
}
...@@ -3,9 +3,9 @@ package com.roshka.utils; ...@@ -3,9 +3,9 @@ package com.roshka.utils;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.YearMonth; import java.time.LocalDate;
import java.time.ZoneOffset; import java.time.Period;
import java.time.temporal.ChronoUnit; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -46,6 +46,31 @@ public class Helper { ...@@ -46,6 +46,31 @@ public class Helper {
return Math.round(diff/30.d) ; return Math.round(diff/30.d) ;
} }
public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
public static int calculateAge(LocalDate birthDate, LocalDate currentDate) {
if ((birthDate != null) && (currentDate != null)) {
return Period.between(birthDate, currentDate).getYears();
} else {
return 0;
}
}
public static int calculateAge(Date birthDate) {
LocalDate currentDate = LocalDate.now();
return calculateAge(convertToLocalDateViaSqlDate(birthDate),currentDate);
}
public static String formatDate(LocalDate fecha, String format){
if(fecha == null || format == null) return null;
return fecha.format(DateTimeFormatter.ofPattern(format));
}
public static String formatDate(Date fecha, String format){
return formatDate(convertToLocalDateViaSqlDate(fecha), format);
}
public static DBFile createFile(MultipartFile file) { public static DBFile createFile(MultipartFile file) {
// Normalize file name // Normalize file name
String fileName = StringUtils.cleanPath(file.getOriginalFilename()); String fileName = StringUtils.cleanPath(file.getOriginalFilename());
......
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<PostulanteListaDTO> listUsers;
private HashMap<String, String> filtros;
public PostulantesExcelExporter(List<PostulanteListaDTO> listUsers, HashMap<String, String> 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
...@@ -40,19 +40,19 @@ ...@@ -40,19 +40,19 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "JAVA" "id": 1
}, },
"nivel": 5 "nivel": 5
}, },
{ {
"tecnologia": { "tecnologia": {
"nombre": "Python" "id": 2
}, },
"nivel": 4 "nivel": 4
}, },
{ {
"tecnologia": { "tecnologia": {
"nombre": "C" "id": 3
}, },
"nivel": 5 "nivel": 5
} }
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Spring" "id": 4
}, },
"nivel": 2 "nivel": 2
} }
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Django" "id": 5
}, },
"nivel": 3 "nivel": 3
} }
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Flutter" "id": 6
}, },
"nivel": 2 "nivel": 2
} }
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Switf" "id": 3
}, },
"nivel": 5 "nivel": 5
} }
...@@ -287,7 +287,7 @@ ...@@ -287,7 +287,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "SL" "id": 2
}, },
"nivel": 4 "nivel": 4
} }
...@@ -334,7 +334,7 @@ ...@@ -334,7 +334,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Scala" "id": 5
}, },
"nivel": 5 "nivel": 5
} }
......
...@@ -18,5 +18,17 @@ ...@@ -18,5 +18,17 @@
{ {
"id": 5, "id": 5,
"nombre": "spring" "nombre": "spring"
},
{
"id": 6,
"nombre": "php"
},
{
"id": 7,
"nombre": "laravel"
},
{
"id": 8,
"nombre": "sqlserver"
} }
] ]
\ No newline at end of file
...@@ -175,7 +175,7 @@ function agregarFieldTecnologia(){ ...@@ -175,7 +175,7 @@ function agregarFieldTecnologia(){
if(tecn==null) continue; if(tecn==null) continue;
content1 += ` content1 += `
<div class="col-auto" id="tecn-${index}"> <div class="col-auto" id="tecn-${index}">
${tecn.tecnologia.nombre} ( ${tecn.nivel} <i class="bi bi-star-fill"></i> ) &nbsp; <i class="bi bi-trash-fill" onclick="eliminarTecnologia(event)"></i> ${tecn.tecnologia.nombre} ( ${tecn.nivel} <i class="bi bi-star-fill"></i> ) &nbsp; <i class="bi bi-trash-fill pointer" onclick="eliminarTecnologia(event)"></i>
</div> </div>
` `
...@@ -267,7 +267,7 @@ function agregarFieldExpierncia(event){ ...@@ -267,7 +267,7 @@ function agregarFieldExpierncia(event){
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="exp-${index}"> <div class="col border border-3 rounded" id="exp-${index}">
<center><h5>Experiencia <i class="bi bi-trash-fill" onclick="eliminarExperiencia(${index})"></i></h5></center> <center><h5>Experiencia <i class="bi bi-trash-fill pointer" onclick="eliminarExperiencia(${index})"></i></h5></center>
<dl class="row row-cols-md-2 gx-0 gy-2"> <dl class="row row-cols-md-2 gx-0 gy-2">
<dt class="col-sm-auto text-start">Institucion</dt> <dt class="col-sm-auto text-start">Institucion</dt>
<dd class="col-sm-6 text-start">${exp.institucion}</dd> <dd class="col-sm-6 text-start">${exp.institucion}</dd>
...@@ -380,7 +380,7 @@ function agregarFieldEstudio(){ ...@@ -380,7 +380,7 @@ function agregarFieldEstudio(){
if(est==null) continue; if(est==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="est-${index}"> <div class="col border border-3 rounded" id="est-${index}">
<center><h5>Estudio <i class="bi bi-trash-fill" onclick="eliminarEstudio(${index})"></i></h5></center> <center><h5>Estudio <i class="bi bi-trash-fill pointer" onclick="eliminarEstudio(${index})"></i></h5></center>
<dl class="row row-cols-md-2 gx-0 gy-2"> <dl class="row row-cols-md-2 gx-0 gy-2">
<dt class="col-sm-auto text-start">Institucion</dt> <dt class="col-sm-auto text-start">Institucion</dt>
<dd class="col-sm-6 text-start">${est.institucion.nombre}</dd> <dd class="col-sm-6 text-start">${est.institucion.nombre}</dd>
...@@ -473,7 +473,7 @@ function agregarFieldCargo(){ ...@@ -473,7 +473,7 @@ function agregarFieldCargo(){
if(car==null) continue; if(car==null) continue;
content1 += ` content1 += `
<div class="col-auto" id="car-${index}" style="text-transform: uppercase;"> <div class="col-auto" id="car-${index}" style="text-transform: uppercase;">
${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} &nbsp;<i class="bi bi-trash-fill" onclick="eliminarCargoPostulante(event)"></i> ${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} &nbsp;<i class="bi bi-trash-fill pointer" onclick="eliminarCargoPostulante(event)"></i>
</div> </div>
...@@ -547,7 +547,7 @@ function agregarFieldReferencia(event){ ...@@ -547,7 +547,7 @@ function agregarFieldReferencia(event){
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="ref-${index}"> <div class="col border border-3 rounded" id="ref-${index}">
<center><h5>Referencia Personal <i class="bi bi-trash-fill" onclick="eliminarReferencia(${index})"></i></h5></center> <center><h5>Referencia Personal <i class="bi bi-trash-fill pointer" onclick="eliminarReferencia(${index})"></i></h5></center>
<dl class="row row-cols-sm-2"> <dl class="row row-cols-sm-2">
<dt class="col-sm-auto text-start">Nombre</dt> <dt class="col-sm-auto text-start">Nombre</dt>
<dd class="col-sm text-start">${exp.nombre}</dd> <dd class="col-sm text-start">${exp.nombre}</dd>
......
...@@ -214,3 +214,120 @@ h4{ ...@@ -214,3 +214,120 @@ h4{
form[name="postulante"]{ form[name="postulante"]{
color: #ffffff; color: #ffffff;
} }
.form-check-input:checked {
background-color: #198754;
border-color: #0d6efd;
}
label:hover {
color: #bfbfbf;
}
/*ICONOS Y PLACEHOLDER*/
.FA{
font-family: 'Shippori Antique B1',FontAwesome;
}
#nroDocument::-webkit-outer-spin-button,
#nroDocument::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#nroDocument[type=number] {
-moz-appearance: textfield;
}
#telefono::-webkit-outer-spin-button,
#telefono::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#telefono[type=number] {
-moz-appearance: textfield;
}
#refTel::-webkit-outer-spin-button,
#refTel::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#refTel[type=number] {
-moz-appearance: textfield;
}
.pointer {cursor: pointer;}
/*
.size-placeholder::placeholder{
background-size: 18px 18px;
background-repeat: no-repeat;
background-position: right center;
}
/*Nombre
.nombre-ph::placeholder{
background-image: url(../img/placeholder/name_ph.png);
}
Apellido
#apellido::placeholder{
background-image: url(../img/placeholder/lastname_ph.png);
}
Email
#correo::placeholder{
background-image: url(../img/placeholder/email_ph.png);
}
Numero de documento*/
/*
.nroDocument-ph::placeholder{
background-image: url(../img/placeholder/nroDocumento_ph.png);
margin-left: 5px;
}
Direccion
#direccion::placeholder{
background-image: url(../img/placeholder/adress_ph.png);
background-size: 14px 14px;
}*/
/*Telefono*/
/*
.telefono-ph::placeholder{
background-image: url(../img/placeholder/telephone_ph.png);
}
/*Modal Estudio
#institucionEstudio::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#temaDeEstudio::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#institucionExperiencia::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#cargo::placeholder{
background-image: url(../img/placeholder/cargo_ph.png);
}
#descripcion::placeholder{
background-image: url(../img/placeholder/description_ph.png);
}
#refNombre::placeholder{
background-image: url(../img/placeholder/name_ph.png);
}*/
/*
.telefono-ph::placeholder{
background-image: url(../img/placeholder/telephone_ph.png);
}
#motivoSalida::placeholder{
background-image: url(../img/placeholder/motivoSalida_ph.png);
}
#relacion::placeholder{
background-image: url(../img/placeholder/relacion_ph.png);
}
*/
/*Prueba Font Awesome*/
...@@ -20,7 +20,10 @@ contentType="text/html;charset=UTF-8" language="java" %> ...@@ -20,7 +20,10 @@ contentType="text/html;charset=UTF-8" language="java" %>
</form> </form>
<a href="/cargo">Agregar Nuevo Cargo</a> <a href="/cargo">Agregar Nuevo Cargo</a>
</div> </div>
<div> <div class="card text-dark bg-light mt-3">
<div class="card-body">
<div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
...@@ -45,6 +48,7 @@ contentType="text/html;charset=UTF-8" language="java" %> ...@@ -45,6 +48,7 @@ contentType="text/html;charset=UTF-8" language="java" %>
</table> </table>
</div> </div>
</div> </div>
</div>
<div class="card-footer"> <div class="card-footer">
<div> <div>
<nav aria-label="Page navigation example"> <nav aria-label="Page navigation example">
...@@ -57,6 +61,7 @@ contentType="text/html;charset=UTF-8" language="java" %> ...@@ -57,6 +61,7 @@ contentType="text/html;charset=UTF-8" language="java" %>
</div> </div>
</div> </div>
</div> </div>
</div>
</layout:put> </layout:put>
<layout:put block="scripts" type="APPEND"> <layout:put block="scripts" type="APPEND">
<script> <script>
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp"> <layout:extends name="layouts/base.jsp">
<layout:put block="cssDeclaracion" type="APPEND"></layout:put> <layout:put block="cssDeclaracion" type="APPEND"></layout:put>
<layout:put block="contents" type="REPLACE"> <layout:put block="contents" type="REPLACE">
...@@ -25,11 +27,15 @@ ...@@ -25,11 +27,15 @@
<input type="submit" value="Buscar"> <input type="submit" value="Buscar">
</form> </form>
</div> </div>
<div>
<a href="/convocatoria">Agregar Nueva Convocatoria</a> <a href="/convocatoria">Agregar Nueva Convocatoria</a>
<c:if test="${SUCCESS_MESSAGE != null}"> <c:if test="${SUCCESS_MESSAGE != null}">
<div id="status_message" style="color: brown;" >${SUCCESS_MESSAGE}</div> <div id="status_message" style="color: brown;">${SUCCESS_MESSAGE}</div>
</c:if> </c:if>
<div class="card text-dark bg-light mt-3">
<div class="card-body">
<div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
...@@ -47,9 +53,9 @@ ...@@ -47,9 +53,9 @@
<th scope="row">${sta.index+1}</th> <th scope="row">${sta.index+1}</th>
<td>${convocatoria.getCargo().getNombre()}</td> <td>${convocatoria.getCargo().getNombre()}</td>
<td>${convocatoria.getEstado().getDescripcion()}</td> <td>${convocatoria.getEstado().getDescripcion()}</td>
<td>${convocatoria.getFechaInicio().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaInicio()}" pattern="dd-MM-yyyy" /></td>
<td>${convocatoria.getFechaFin().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaFin()}" pattern="dd-MM-yyyy" /></td>
<td>Ver Postulantes</td> <td><a href="/postulantes?convId=${convocatoria.id}">Ver postulantes</a></td>
<td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td> <td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td>
</tr> </tr>
</c:forEach> </c:forEach>
...@@ -58,7 +64,8 @@ ...@@ -58,7 +64,8 @@
</tbody> </tbody>
</table> </table>
</div>
</div>
</div> </div>
</layout:put> </layout:put>
......
...@@ -7,10 +7,11 @@ ...@@ -7,10 +7,11 @@
<layout:extends name="layouts/base.jsp"> <layout:extends name="layouts/base.jsp">
<layout:put block="contents" type="REPLACE"> <layout:put block="contents" type="REPLACE">
<h2 style="text-align: center;"> <div id="element-to-print">
DETALLE POSTULANTE <h2 class="mb-3" style="text-align: center;">
Detalle Postulante ${postulante.nombre} ${postulante.apellido}
</h2> </h2>
<div class="row gy-3"> <div class="row gy-3 container">
<div class="col-md-6"> <div class="col-md-6">
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
...@@ -130,9 +131,10 @@ ...@@ -130,9 +131,10 @@
</div> </div>
</div> </div>
<hr> <hr>
<div class="row"> <div class="row" id="buttonRow" style="display: block">
<div class="col"> <div class="col">
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#estadoModalLong">Agregar observacion</button> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#estadoModalLong">Agregar observacion</button>
<button id="pdf" type="button" class="btn btn-primary">PDF</button>
</div> </div>
<c:choose> <c:choose>
...@@ -143,6 +145,9 @@ ...@@ -143,6 +145,9 @@
</c:when> </c:when>
</c:choose> </c:choose>
<div class="col">
<a class="btn btn-link" target="__blank" href="/postulantes/${postulante.id}/pdf">Obtener pdf</a>
</div>
</div> </div>
</div> </div>
...@@ -152,32 +157,6 @@ ...@@ -152,32 +157,6 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="row gy-3"> <div class="row gy-3">
<div class="col-md-6"> <div class="col-md-6">
<div class="card h-100">
<div class="card-body">
<h6 class="text-start fw-bold">Tecnologias</h6>
<c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia">
<small>${detalle_tecnologia.getTecnologia().getNombre()}</small>
<div class="progress mb-3" style="height: 5px">
<div class="progress-bar bg-primary" role="progressbar" style="width: ${(detalle_tecnologia.getNivel() / 5) * 100}%" aria-valuenow="${detalle_tecnologia.getNivel()}" aria-valuemin="1" aria-valuemax="5"></div>
</div>
</c:forEach>
<hr>
<h6 class="text-start fw-bold">Cargos al que postula</h6>
<ul class="list-group list-group-flush">
<c:forEach items="${postulante.postulaciones}" var="convocatoria">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">${convocatoria.getCargo().getNombre()}</h6>
<span class="text-secondary"></span>
</li>
</c:forEach>
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div id="carouselExampleIndicators" class="carousel carousel-dark slide" data-bs-ride="carousel"> <div id="carouselExampleIndicators" class="carousel carousel-dark slide" data-bs-ride="carousel">
...@@ -201,7 +180,7 @@ ...@@ -201,7 +180,7 @@
</h6> </h6>
<c:forEach items="${postulante.experiencias}" var="detalle_experiencia" varStatus="status"> <c:forEach items="${postulante.experiencias}" var="detalle_experiencia" varStatus="status">
<div class="carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false"> <div class="pdf-carousel carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false">
<ul class="list-group list-group-flush "> <ul class="list-group list-group-flush ">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap"> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
...@@ -238,7 +217,7 @@ ...@@ -238,7 +217,7 @@
<span class="text-secondary">${detalle_experiencia.getMotivoSalida()}</span> <span class="text-secondary">${detalle_experiencia.getMotivoSalida()}</span>
</li> </li>
<hr class="lineas-pdf" style="display: none"/>
</ul> </ul>
</div> </div>
</c:forEach> </c:forEach>
...@@ -262,9 +241,9 @@ ...@@ -262,9 +241,9 @@
<h6 class="d-flex justify-content-between fw-bold px-1"> <h6 class="d-flex justify-content-between fw-bold px-1">
<c:choose> <c:choose>
<c:when test="${postulante.experiencias.size() > 1}"> <c:when test="${postulante.estudios.size() > 1}">
<i class="bi bi-arrow-left-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="prev"></i> <i class="bi bi-arrow-left-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="prev"></i>
Estudios Estudio
<i class="bi bi-arrow-right-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="next"></i> <i class="bi bi-arrow-right-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="next"></i>
</c:when> </c:when>
<c:otherwise> <c:otherwise>
...@@ -274,7 +253,7 @@ ...@@ -274,7 +253,7 @@
</c:choose> </c:choose>
</h6> </h6>
<c:forEach items="${postulante.estudios}" var="detalle_estudios" varStatus="status"> <c:forEach items="${postulante.estudios}" var="detalle_estudios" varStatus="status">
<div class="carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false"> <div class="pdf-carousel carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false">
<ul class="list-group list-group-flush "> <ul class="list-group list-group-flush ">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap"> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
...@@ -308,7 +287,7 @@ ...@@ -308,7 +287,7 @@
</li> </li>
<hr class="lineas-pdf" style="display: none"/>
</ul> </ul>
</div> </div>
</c:forEach> </c:forEach>
...@@ -322,6 +301,32 @@ ...@@ -322,6 +301,32 @@
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="card h-100">
<div class="card-body">
<h6 class="text-start fw-bold">Tecnologias</h6>
<c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia">
<small>${detalle_tecnologia.getTecnologia().getNombre()}</small>
<div class="progress mb-3" style="height: 5px">
<div class="progress-bar bg-primary" role="progressbar" style="width: ${(detalle_tecnologia.getNivel() / 5) * 100}%" aria-valuenow="${detalle_tecnologia.getNivel()}" aria-valuemin="1" aria-valuemax="5"></div>
</div>
</c:forEach>
<hr>
<h6 class="text-start fw-bold">Cargos al que postula</h6>
<ul class="list-group list-group-flush">
<c:forEach items="${postulante.postulaciones}" var="convocatoria">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">${convocatoria.getCargo().getNombre()}</h6>
<span class="text-secondary"></span>
</li>
</c:forEach>
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<h6 class="text-start fw-bold">Referencias Personales</h6> <h6 class="text-start fw-bold">Referencias Personales</h6>
...@@ -382,9 +387,45 @@ ...@@ -382,9 +387,45 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<layout:put block="scripts" type="APPEND"> <layout:put block="scripts" type="APPEND">
<script src="../valEdad.js"></script> <script src="../valEdad.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" integrity="sha512-GsLlZN/3F2ErC5ifS5QtgpiJtWd43JWSuIgh7mbzZ8zBps+dvLusV+eNQATqgA/HdeKFVgA5v3S/cIrLF7QnIg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
document.querySelector('#pdf').addEventListener("click", async ()=>{
var buttonsRow = document.querySelector('#buttonRow');
var element = document.getElementById('element-to-print');
var carousels = document.querySelectorAll(".pdf-carousel");
var hrs = document.querySelectorAll(".lineas-pdf");
var opt = {
margin: 1,
filename: 'myfile.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'a2', orientation: 'portrait' }
};
buttonsRow.style.display = "none";
carousels.forEach((element)=>{
element.classList.remove('carousel-item')
});
hrs.forEach((element)=>{
element.style.display = "block"
});
await html2pdf().set(opt).from(element).toPdf().save();
console.log('xd');
buttonsRow.style.display = "block";
carousels.forEach((element)=>{
element.classList.add('carousel-item')
});
hrs.forEach((element)=>{
element.style.display = "none"
});
})
<%--location.replace("/postulantes/${postulante.id}/")--%>
</script>
</layout:put> </layout:put>
......
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<html lang="en"> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <layout:extends name="layouts/base.jsp">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <layout:put block="contents" type="REPLACE">
<title>Curriculum vitae</title> <div id="element-to-print">
<link href="../css/detallePostulantestyle.css" rel="stylesheet" type="text/css"/> <h2 style="text-align: center;">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> DETALLE POSTULANTE
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> </h2>
</head> <div class="row gy-3">
<body class="container"> <div class="col-md-6">
<header> <div class="card mb-3">
<div> <div class="card-body">
<br> <div class="row">
<h2>&nbsp;&nbsp;&nbsp;&nbsp; ${postulante.nombre} ${postulante.apellido}</h2> <div class="col-sm-3">
<h3>&nbsp;&nbsp;&nbsp;&nbsp; ${postulante.tipoDocumento}: ${postulante.nroDocument}</h3> <h6 class="mb-0">Nombre</h6>
<h3>&nbsp;&nbsp;&nbsp;&nbsp; Correo: ${postulante.correo}</h3> </div>
<br> <div class="col-sm-9 text-secondary">
</div> ${postulante.nombre} ${postulante.apellido}
</header> </div>
<section> </div>
<article> <hr>
<br> <div class="row">
<h2>&nbsp;&nbsp;Informacion Personal</h2> <div class="col-sm-3">
<ul> <h6 class="mb-0">Email</h6>
<li> </div>
Direccion: ${postulante.getCiudad().getDepartamento().getNombre()},${postulante.getCiudad().getNombre()} <div class="col-sm-9 text-secondary">
${postulante.correo}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Vive en</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.getCiudad().getNombre()}, ${postulante.getCiudad().getDepartamento().getNombre()}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Nro de Documento</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.tipoDocumento}: ${postulante.nroDocument}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Telefono</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.telefono}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Edad</h6>
</div>
<div id="edad" class="col-sm-9 text-secondary"></div>
<input style="display: none;" id="dob" value="${postulante.fechaNacimiento}">
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Direccion</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.direccion}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Nivel de Ingles</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.nivelIngles}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Estado Civil</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.estadoCivil.getDescripcion()}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Nacionalidad</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.nacionalidad.getDescripcion()}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Disponbilidad</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.disponibilidad.getDescripcion()}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">Estado</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.estadoPostulante.getEstado()}
</div>
</div>
<hr>
<div class="row">
<div class="col-sm-3">
<h6 class="mb-0">ComentarioRRHH</h6>
</div>
<div class="col-sm-9 text-secondary">
${postulante.getComentarioRRHH()}
</div>
</div>
<hr>
</div>
</div>
</div>
<div class="col-md-6">
<div class="row gy-3">
<div class="col-md-6">
<div class="card h-100">
<div class="card-body">
<h6 class="text-start fw-bold">Tecnologias</h6>
<c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia">
<small>${detalle_tecnologia.getTecnologia().getNombre()}</small>
<div class="progress mb-3" style="height: 5px">
<div class="progress-bar bg-primary" role="progressbar" style="width: ${(detalle_tecnologia.getNivel() / 5) * 100}%" aria-valuenow="${detalle_tecnologia.getNivel()}" aria-valuemin="1" aria-valuemax="5"></div>
</div>
</c:forEach>
<hr>
<h6 class="text-start fw-bold">Cargos al que postula</h6>
<ul class="list-group list-group-flush">
<c:forEach items="${postulante.postulaciones}" var="convocatoria">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">${convocatoria.getCargo().getNombre()}</h6>
<span class="text-secondary"></span>
</li> </li>
<li> </c:forEach>
Telefono: ${postulante.telefono}
</ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<div id="carouselExampleIndicators" class="carousel carousel-dark slide" data-bs-ride="carousel">
<div class="carousel-inner">
<h6 class="d-flex justify-content-between fw-bold px-1">
<c:choose>
<c:when test="${postulante.experiencias.size() > 1}">
<i class="bi bi-arrow-left-circle-fill" data-bs-target="#carouselExampleIndicators" data-bs-slide="prev"></i>
Experiencias
<i class="bi bi-arrow-right-circle-fill" data-bs-target="#carouselExampleIndicators" data-bs-slide="next"></i>
</c:when>
<c:otherwise>
Experiencias
</c:otherwise>
</c:choose>
</h6>
<c:forEach items="${postulante.experiencias}" var="detalle_experiencia" varStatus="status">
<div class="carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false">
<ul class="list-group list-group-flush ">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Institucion</h6>
<span class="text-secondary">${detalle_experiencia.getInstitucion()}</span>
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Fecha de nacimiento: ${postulante.fechaNacimiento} <h6 class="mb-0">Fecha Inicio</h6>
<span class="text-secondary"><fmt:formatDate value="${detalle_experiencia.getFechaDesde()}" pattern="dd-MM-yyyy" /></span>
<!-- <input style="display:none;" id="fechaInicioExp" value="${detalle_experiencia.getFechaDesde()}">
<span style="display: none;" class="text-secondary" id="fechaInicioExp2">${detalle_experiencia.getFechaDesde()}</span>-->
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Nivel de ingles:&nbsp;&nbsp;<progress value="${postulante.nivelIngles}" max="5"> <h6 class="mb-0">Fecha Fin</h6>
<span class="text-secondary"><fmt:formatDate value="${detalle_experiencia.getFechaHasta()}" pattern="dd-MM-yyyy" /></span>
<!-- <input style="display:none;" id="fechaFinExp" value="${detalle_experiencia.getFechaHasta()}">
<span style="display: none;" class="text-secondary" id="fechaFinExp2">${detalle_experiencia.getFechaHasta()}</span>-->
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Estado civil: ${postulante.estadoCivil} <h6 class="mb-0">Referencia</h6>
<span class="text-secondary">${detalle_experiencia.getNombreReferencia()}</span>
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Nacionalidad: ${postulante.nacionalidad} <h6 class="mb-0">Telefono de la referencia</h6>
<span class="text-secondary">${detalle_experiencia.getTelefonoReferencia()}</span>
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Disponibilidad: ${postulante.disponibilidad} <h6 class="mb-0">Cargo</h6>
<span class="text-secondary">${detalle_experiencia.getCargo()}</span>
</li> </li>
<li> <li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
Direccion: ${postulante.direccion} <h6 class="mb-0">Motivo de salida</h6>
<span class="text-secondary">${detalle_experiencia.getMotivoSalida()}</span>
</li> </li>
</ul>
<br>
<h2>&nbsp;&nbsp;TECNOLOGIAS</h2>
<ul>
<c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia">
<label>Tecnologias: ${detalle_tecnologia.getTecnologia().getNombre()} &nbsp;&nbsp;<progress value="${detalle_tecnologia.getNivel()}" max="5"></progress></label><br>
</c:forEach>
</ul>
<br>
<h2>&nbsp;&nbsp;Cargo al que Postula</h2>
<ul>
<c:forEach items="${postulante.postulaciones}" var="convocatoria">
<li>Nombre: ${convocatoria.getCargo().getNombre()}</li><br>
</c:forEach>
</ul>
<br>
<h2>&nbsp;&nbsp;Estado RRHH</h2>
<ul>
<li>Estado del Postulante: ${postulante.estadoPostulante.getEstado()}</li>
<li>Comentario RRHH: ${postulante.getComentarioRRHH()}</li>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalLong">Cambiar</button>
</ul> </ul>
</article> </div>
<aside>
<br>
<h2>Informacion Academica</h2>
<ul>
<c:forEach items="${postulante.estudios}" var="detalle_estudios">
<label>Institucion: ${detalle_estudios.getInstitucion().getNombre()}</label><br>
<label>Tipo de estudio: ${detalle_estudios.getTipoDeEstudio()}</label><br>
<label>Tema de estudio: ${detalle_estudios.getTemaDeEstudio()}</label><br>
<label>Fecha Inicio: ${detalle_estudios.getFechaDesde()}</label><br>
<label>Fecha Fin: ${detalle_estudios.getFechaHasta()}</label><br>
<label>Estado: ${detalle_estudios.getEstado()}</label><br>
<br><br>
</c:forEach> </c:forEach>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<div id="carouselExampleIndicators1" class="carousel carousel-dark slide" data-bs-ride="carousel">
<div class="carousel-inner">
<h6 class="d-flex justify-content-between fw-bold px-1">
<c:choose>
<c:when test="${postulante.experiencias.size() > 1}">
<i class="bi bi-arrow-left-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="prev"></i>
Estudios
<i class="bi bi-arrow-right-circle-fill" data-bs-target="#carouselExampleIndicators1" data-bs-slide="next"></i>
</c:when>
<c:otherwise>
Estudios
</c:otherwise>
</c:choose>
</h6>
<c:forEach items="${postulante.estudios}" var="detalle_estudios" varStatus="status">
<div class="carousel-item ${status.first ? 'active' : ''}" data-bs-interval="false">
<ul class="list-group list-group-flush ">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Institucion</h6>
<span class="text-secondary">${detalle_estudios.getInstitucion().getNombre()}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Fecha Inicio</h6>
<span class="text-secondary"><fmt:formatDate value="${detalle_estudios.getFechaDesde()}" pattern="dd-MM-yyyy" /></span>
<!-- <input style="display:none;" id="fechaInicioEst" value="${detalle_estudios.getFechaDesde()}">-->
</li>
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Fecha Fin</h6>
<span class="text-secondary"><fmt:formatDate value="${detalle_estudios.getFechaHasta()}" pattern="dd-MM-yyyy" /></span>
<!-- <input style="display:none;" id="fechaFinEst" value="${detalle_estudios.getFechaHasta()}">-->
</li>
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Tipo de Estudio</h6>
<span class="text-secondary">${detalle_estudios.getTipoDeEstudio()}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Tema de estudio</h6>
<span class="text-secondary">${detalle_estudios.getTemaDeEstudio()}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">Estado</h6>
<span class="text-secondary">${detalle_estudios.getEstado()}</span>
</li>
</ul> </ul>
<br> </div>
<h2>EXPERIENCIAS</h2>
<ul>
<c:forEach items="${postulante.experiencias}" var="detalle_experiencia">
<label>Institucion: ${detalle_experiencia.getInstitucion()}</label><br>
<label>Fecha Inicio: ${detalle_experiencia.getFechaDesde()}</label><br>
<label>Fecha Fin: ${detalle_experiencia.getFechaHasta()}</label><br>
<label>Referencia: ${detalle_experiencia.getNombreReferencia()}</label><br>
<label>Telefono de la referencia: ${detalle_experiencia.getTelefonoReferencia()}</label><br>
<label>Cargo: ${detalle_experiencia.getCargo()}</label><br>
<label>Motivo de salida: ${detalle_experiencia.getMotivoSalida()}</label><br>
</c:forEach> </c:forEach>
</ul>
<br>
<h2>Referencias</h2>
<ul> </div>
<c:forEach items="${postulante.referencias}" var="detalle_referencias">
<label>Nombre: ${detalle_referencias.getNombre()}</label><br> </div>
<label>Relacion: ${detalle_referencias.getRelacion()}</label><br> </div>
<label>Telefono: ${detalle_referencias.getTelefono()}</label><br> </div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h6 class="text-start fw-bold">Referencias Personales</h6>
<ul class="list-group list-group-flush">
<c:forEach items="${postulante.referencias}" var="referencia">
<li class="list-group-item d-flex justify-content-between align-items-center flex-wrap">
<h6 class="mb-0">${referencia.nombre}, ${referencia.relacion}, ${referencia.telefono}</h6>
<span class="text-secondary"></span>
</li>
</c:forEach> </c:forEach>
</ul> </div>
</aside> </div>
</div>
</div>
</div>
</section> </div>
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="exampleModalLong" tabindex="-1" role="dialog" aria-labelledby="exampleModalLongTitle" aria-hidden="true"> <div class="modal fade" id="estadoModalLong" tabindex="-1" role="dialog" aria-labelledby="estadorrhhModal" aria-hidden="true">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<form:form class="needs-validation" method="post" modelAttribute="postulante">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Modal title</h5> <h5 class="modal-title" id="estadorrhhModal">Estado</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form:form class="needs-validation" method="post" modelAttribute="postulante">
<form:label path="estadoPostulante" class="form-label">Estado</form:label> <form:label path="estadoPostulante" class="form-label">Estado</form:label>
<div class="inputs"> <div class="inputs">
<form:select class="form-select" path="estadoPostulante" aria-label="Default select example"> <form:select class="form-select" path="estadoPostulante" aria-label="Default select example">
...@@ -144,21 +357,41 @@ ...@@ -144,21 +357,41 @@
<div class="inputs"> <div class="inputs">
<form:label path="comentarioRRHH" class="form-label">ComentarioRRHH</form:label> <form:label path="comentarioRRHH" class="form-label">ComentarioRRHH</form:label>
<form:textarea class="form-control" path="comentarioRRHH" id="comentarioRRHH"></form:textarea> <form:textarea class="form-control" path="comentarioRRHH" id="comentarioRRHH"></form:textarea>
</div> </div><br>
<input type="submit" value="Guardar"/>
</form:form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
<button type="submit" class="btn btn-primary" data-bs-dismiss="modal">Agregar</button>
</div> </div>
</form:form>
</div> </div>
</div> </div>
</div> </div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <layout:put block="scripts" type="APPEND">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="../valEdad.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" integrity="sha512-GsLlZN/3F2ErC5ifS5QtgpiJtWd43JWSuIgh7mbzZ8zBps+dvLusV+eNQATqgA/HdeKFVgA5v3S/cIrLF7QnIg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
var element = document.getElementById('element-to-print');
var opt = {
margin: 1,
filename: 'myfile.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2 },
jsPDF: { unit: 'in', format: 'a1', orientation: 'portrait' }
};
html2pdf().set(opt).from(element).toPdf().save();
<%--location.replace("/postulantes/${postulante.id}/")--%>
</script>
</layout:put>
</body>
</html> </layout:put>
\ No newline at end of file </layout:extends>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp">
<layout:put block="contents" type="REPLACE">
<h2 style="text-align: center;">
DETALLE POSTULANTE
</h2>
${postulante.nombre} ${postulante.apellido}
</layout:put>
</layout:extends>
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
<link rel="icon" href="../img/LogoRoshka.ico"> <link rel="icon" href="../img/LogoRoshka.ico">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Shippori+Antique+B1"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Shippori+Antique+B1">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
</head> </head>
<body class="container"> <body class="container">
...@@ -30,25 +32,26 @@ ...@@ -30,25 +32,26 @@
</div> </div>
<h4 class="text-start">Datos Personales</h4> <h4 class="text-start">Datos Personales</h4>
<h6 class="text-start">Todos los campos con (*) deben estar rellenados</h6>
<div class="row"> <div class="row">
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="nombre" class="form-label">Nombre</label> <label for="nombre" class="form-label">Nombre *</label>
<input type="text" name="nombre" class="form-control " id="nombre" required> <input placeholder="&#xf007; Ingrese su nombre" type="text" name="nombre" class="form-control FA" id="nombre" required>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="apellido" class="form-label">Apellido</label> <label for="apellido" class="form-label ">Apellido *</label>
<input type="text" name="apellido" class="form-control " id="apellido" required> <input placeholder="&#xf007; Ingrese su apellido" type="text" name="apellido" class="form-control FA" id="apellido" required>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="correo" class="form-label">Email</label> <label for="correo" class="form-label">Email *</label>
<input type="email" name="correo" class="form-control " id="correo" required> <input type="email" placeholder="&#xf0e0; Ingrese su Email" name="correo" class="form-control FA" id="correo" required>
</div> </div>
...@@ -65,14 +68,14 @@ ...@@ -65,14 +68,14 @@
<label for="tipoDocumento" class="form-label"> Tipo de documento</label> <label for="tipoDocumento" class="form-label"> Tipo de documento</label>
<select name="tipoDocumento" id="tipoDocumento" class="bg-light" required> <select name="tipoDocumento" id="tipoDocumento" class="bg-light" required>
<option value='CI' selected>C.I</option> <option value='CI' selected>C.I</option>
<option value='PAS'>Pasport</option> <option value='PAS'>Passport</option>
<option value='Otro'>Otro</option> <option value='Otro'>Otro</option>
</select> </select>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="nroDocument" class="form-label">Numero de Documento</label> <label for="nroDocument" class="form-label">Numero de Documento</label>
<input type="number" name="nroDocument" class="form-control " id="nroDocument" required> <input placeholder="&#xf2c2; Ingrese su numero de documento" type="number" name="nroDocument" class="form-control nroDocument-ph FA" id="nroDocument" required>
</div> </div>
...@@ -95,19 +98,19 @@ ...@@ -95,19 +98,19 @@
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="direccion" class="form-label">direccion</label> <label for="direccion" class="form-label">Direccion *</label>
<input type="text" name="direccion" class="form-control " id="direccion" required> </textarea> <input placeholder="&#xf041; Ingrese su direccion" type="text" name="direccion" class="form-control FA " id="direccion" required> </textarea>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="telefono" class="form-label">Telefono</label> <label for="telefono" class="form-label">Telefono *</label>
<input type="number" name="telefono" class="form-control " id="telefono" required> <input placeholder="&#xf095; Ingrese su numero de telefono" type="number" name="telefono" class="form-control telefono-ph FA" id="telefono" required>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="fechaNacimiento" class="form-label">Fecha de nacimiento</label> <label for="fechaNacimiento" class="form-label">Fecha de nacimiento *</label>
<input type="date" name="fechaNacimiento" class="form-control " id="fechaNacimiento" required> <input type="date" name="fechaNacimiento" class="form-control " id="fechaNacimiento" required>
</div> </div>
...@@ -121,11 +124,11 @@ ...@@ -121,11 +124,11 @@
<div class="inputs mb-3 col-md-4"> <label for="nivelIngles" class="form-label"> Nivel de ingles</label> <div class="inputs mb-3 col-md-4"> <label for="nivelIngles" class="form-label"> Nivel de ingles</label>
<select name="nivelIngles" id="nivelIngles" class="content-select"> <select name="nivelIngles" id="nivelIngles" class="content-select">
<option value="1" selected>Ingles muy basico</option> <option value="1" selected>Conocimiento de ingles muy basico</option>
<option value="2" >Comprendo algunas cosas y puedo leer con la ayuda del traductor</option> <option value="2" >Comprendo algunas cosas y puedo leer con la ayuda del traductor</option>
<option value="3" >Puedo leer tranquilamente</option> <option value="3" >Puedo entender todo lo que leo</option>
<option value="4" >Puedo escribir documentacion</option> <option value="4" >Puedo escribir documentacion en ingles</option>
<option value="5" >Puedo escribir y hablar tranquilamente</option> <option value="5" >Puedo escribir y hablar fluidamente</option>
</select> </select>
</div> </div>
...@@ -152,7 +155,7 @@ ...@@ -152,7 +155,7 @@
<div class="row w-100 gy-2 mx-auto"> <div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0"> <div class="col-12 px-0">
<h4 class="text-start">Cargos</h4> <h4 class="text-start">Cargos <i class="bi bi-plus-square pointer" data-bs-toggle="modal" data-bs-target="#cargoForm"></i></h4>
</div> </div>
<div class="col-12"> <div class="col-12">
<div class="mt-3 gap-2 row" id="cargos"> <div class="mt-3 gap-2 row" id="cargos">
...@@ -182,7 +185,7 @@ ...@@ -182,7 +185,7 @@
<div class="row w-100 gy-2 mx-auto"> <div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0"> <div class="col-12 px-0">
<h4 class="text-start">Estudios <i class="bi bi-plus-square" data-bs-toggle="modal" data-bs-target="#estudioForm"></i></h4> <h4 class="text-start">Estudios <i class="bi bi-plus-square pointer" data-bs-toggle="modal" data-bs-target="#estudioForm"></i></h4>
</div> </div>
<div class="col-12"> <div class="col-12">
<div class="mt-3 gap-2 row row-cols-4" id="estudios"> <div class="mt-3 gap-2 row row-cols-4" id="estudios">
...@@ -200,7 +203,7 @@ ...@@ -200,7 +203,7 @@
<div class="row w-100 gy-2 mx-auto"> <div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0"> <div class="col-12 px-0">
<h4 class="text-start">Tecnologias <i class="bi bi-plus-square" data-bs-toggle="modal" data-bs-target="#tecnologiaForm"></i></h4> <h4 class="text-start">Tecnologias <i class="bi bi-plus-square pointer" data-bs-toggle="modal" data-bs-target="#tecnologiaForm"></i></h4>
</div> </div>
<div class="col-12"> <div class="col-12">
...@@ -217,6 +220,27 @@ ...@@ -217,6 +220,27 @@
</div> </div>
</div> </div>
<!-- Button Otras tecnologias -->
<hr>
<div class="inputs mb-3 col-md-12">
<div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0">
<h4 class="text-start">Otras Tecnologias </h4>
</div>
<div class="col-6">
<div class="mb-3">
<textarea class="form-control" id="exampleFormControlTextarea1" name="tecnologiaOtros" placeholder="Si tienes alguna tecnologia que no figura en la seccion anterior. Escribelos aqui."></textarea>
</div>
</div>
</div>
</div>
<!-- Button Agregar Experiencia --> <!-- Button Agregar Experiencia -->
<hr> <hr>
...@@ -224,7 +248,7 @@ ...@@ -224,7 +248,7 @@
<div class="row w-100 gy-2 mx-auto"> <div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0"> <div class="col-12 px-0">
<h4 class="text-start">Experiencias <i class="bi bi-plus-square" data-bs-toggle="modal" data-bs-target="#experienciaForm"></i></h4> <h4 class="text-start">Experiencias <i class="bi bi-plus-square pointer" data-bs-toggle="modal" data-bs-target="#experienciaForm"></i></h4>
</div> </div>
<div class="col-12"> <div class="col-12">
<div class="mt-3 gap-2 row row-cols-4" id="experiencias"> <div class="mt-3 gap-2 row row-cols-4" id="experiencias">
...@@ -238,7 +262,7 @@ ...@@ -238,7 +262,7 @@
<div class="inputs mb-3 col-md-12"> <div class="inputs mb-3 col-md-12">
<div class="row w-100 gy-2 mx-auto"> <div class="row w-100 gy-2 mx-auto">
<div class="col-12 px-0"> <div class="col-12 px-0">
<h4 class="text-start">Referencia Personal <i class="bi bi-plus-square" data-bs-toggle="modal" data-bs-target="#referenciaForm"></i></h4> <h4 class="text-start">Referencia Personal <i class="bi bi-plus-square pointer" data-bs-toggle="modal" data-bs-target="#referenciaForm"></i></h4>
</div> </div>
<div class="col-12"> <div class="col-12">
<div class="mt-3 gap-2 row row-cols-4" id="referencia"> <div class="mt-3 gap-2 row row-cols-4" id="referencia">
...@@ -264,7 +288,7 @@ ...@@ -264,7 +288,7 @@
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel" >CargosDisponibles</h5> <h5 class="modal-title" id="exampleModalLabel" >Cargos Disponibles</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close" style="color:#21130d;"> <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close" style="color:#21130d;">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
...@@ -305,11 +329,11 @@ ...@@ -305,11 +329,11 @@
<form name="experiencia-form" class="needs-validation" novalidate> <form name="experiencia-form" class="needs-validation" novalidate>
<div class="inputs"> <div class="inputs">
<label for="institucionExperiencia" class="inputs form-label">Institucion</label> <label for="institucionExperiencia" class="inputs form-label">Institucion *</label>
<input type="text" class="inputs form-control " name="institucion" id="institucionExperiencia" required> <input placeholder="&#xf1ad; Ingrese su institucion" type="text" class="inputs form-control FA" name="institucion" id="institucionExperiencia" required>
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="fechaDesdeExperiencia" class="form-label">Fecha Desde</label> <label for="fechaDesdeExperiencia" class="form-label">Fecha Desde *</label>
<input type="date" class="form-control" name="fechaDesde" id="fechaDesdeExperiencia" required> <input type="date" class="form-control" name="fechaDesde" id="fechaDesdeExperiencia" required>
<div class="invalid-feedback errorFechaDesde"> <div class="invalid-feedback errorFechaDesde">
...@@ -323,27 +347,27 @@ ...@@ -323,27 +347,27 @@
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="cargo" class="form-label">Cargo</label> <label for="cargo" class="form-label">Cargo *</label>
<input type="text" class="form-control " name="cargo" id="cargo" required> <input placeholder="&#xf0b1; Ingrese su cargo" type="text" class="form-control FA " name="cargo" id="cargo" required>
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="descripcion" class="form-label">Descripcion</label> <label for="descripcion" class="form-label">Descripcion *</label>
<textarea class="form-control" name="descripcion" id="descripcion" required></textarea> <textarea placeholder="&#xf022; Ingrese una descripcion de su trabajo" class="form-control FA" name="descripcion" id="descripcion" required></textarea>
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="refNombre" class="form-label">Nombre de la Referencia</label> <label for="refNombre" class="form-label">Nombre de la Referencia</label>
<input type="text" class="form-control " name="nombreReferencia" id="refNombre" > <input placeholder="&#xf007; Ingrese el nombre de su referencia" type="text" class="form-control FA " name="nombreReferencia" id="refNombre" >
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="refTel" class="form-label">Telefono de la Referencia</label> <label for="refTel" class="form-label">Telefono de la Referencia</label>
<input type="text" class="form-control " name="telefonoReferencia" id="refTel" > <input placeholder="&#xf095; Ingrese el telefono de su referencia" type="number" class="form-control FA" name="telefonoReferencia" id="refTel" >
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="motivoSalida" class="form-label">Motivo de Salida</label> <label for="motivoSalida" class="form-label">Motivo de Salida</label>
<textarea class="form-control " name="motivoSalida" id="motivoSalida" ></textarea> <textarea placeholder="&#xf022; Ingrese el motivo de su salida" class="form-control FA " name="motivoSalida" id="motivoSalida" ></textarea>
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="tipoExperiencia" class="form-label"> Tipo de Experiencia</label> <label for="tipoExperiencia" class="form-label"> Tipo de Experiencia</label>
...@@ -371,7 +395,7 @@ ...@@ -371,7 +395,7 @@
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel" >tecnologia</h5> <h5 class="modal-title" id="exampleModalLabel" >Tecnologia</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close" style="color:#21130d;"> <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close" style="color:#21130d;">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
...@@ -430,12 +454,12 @@ ...@@ -430,12 +454,12 @@
<%-- <label for="tipoDeEstudio" class="form-label">Tipo De Estudio</label>--%> <%-- <label for="tipoDeEstudio" class="form-label">Tipo De Estudio</label>--%>
<%-- <input type="text" class="form-control " name="tipoDeEstudio" id="tipoDeEstudio">--%> <%-- <input type="text" class="form-control " name="tipoDeEstudio" id="tipoDeEstudio">--%>
<div class="form-group"> <div class="form-group">
<label for="institucionEstudio" class="form-label">Institucion</label> <label for="institucionEstudio" class="form-label">Institucion *</label>
<input type="text" class="form-control" name="institucion" id="institucionEstudio" required> <input placeholder="&#xf19c; Ingrese su institucion" type="text" class="form-control FA" name="institucion" id="institucionEstudio" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="temaDeEstudio" class="form-label">Carrera/Bachiller/Tema de Curso</label> <label for="temaDeEstudio" class="form-label">Carrera/Bachiller/Tema de Curso *</label>
<input type="text" class="form-control" name="temaDeEstudio" id="temaDeEstudio" required> <input placeholder="&#xf02d; Ingrese su carrera/bachiller/tema de curso " type="text" class="form-control FA" name="temaDeEstudio" id="temaDeEstudio" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="estado">Estado</label> <label for="estado">Estado</label>
...@@ -447,7 +471,7 @@ ...@@ -447,7 +471,7 @@
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="fechaDesdeEstudio" class="form-label">Fecha Desde</label> <label for="fechaDesdeEstudio" class="form-label">Fecha Desde *</label>
<input type="date" class="form-control " name="fechaDesde" id="fechaDesdeEstudio" required> <input type="date" class="form-control " name="fechaDesde" id="fechaDesdeEstudio" required>
<div class="invalid-feedback errorFechaDesde"> <div class="invalid-feedback errorFechaDesde">
...@@ -486,17 +510,17 @@ ...@@ -486,17 +510,17 @@
<div class="modal-body"> <div class="modal-body">
<form name="referencia-form" class="needs-validation" novalidate> <form name="referencia-form" class="needs-validation" novalidate>
<div class="form-group"> <div class="form-group">
<label for="nombre" class="form-label">Nombre</label> <label for="nombre" class="form-label">Nombre *</label>
<input type="text" class="form-control" name="nombre" id="nombre" required> <input placeholder="&#xf007; Ingrese el nombre de su referencia" type="text" class="form-control FA " name="nombre" id="nombre" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="relacion" class="form-label">Relacion</label> <label for="relacion" class="form-label">Relacion *</label>
<input type="text" class="form-control" name="relacion" id="relacion" required> <input placeholder="&#xf0c1; Ingrese la relacion con su referencia" type="text" class="form-control FA" name="relacion" id="relacion" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="telefono" class="form-label">Telefono</label> <label for="telefono" class="form-label">Telefono *</label>
<input type="number" class="form-control" name="telefono" id="telefono" required> <input placeholder="&#xf095; Ingrese el numero de su referencia" type="number" class="form-control FA" name="telefono" id="telefono" required>
</div> </div>
......
...@@ -252,7 +252,6 @@ ...@@ -252,7 +252,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="row"> <div class="row">
<div class="col-auto col-md-4"> <div class="col-auto col-md-4">
...@@ -267,6 +266,16 @@ ...@@ -267,6 +266,16 @@
</div> </div>
</div> --> </div> -->
</form> </form>
<div class="row">
<div class="col-md-12">
<a href="/postulantesExcel?${query}" type="button" class="btn btn-light float-end">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-excel-fill" viewBox="0 0 16 16">
<path d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0zM9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1zM5.884 6.68 8 9.219l2.116-2.54a.5.5 0 1 1 .768.641L8.651 10l2.233 2.68a.5.5 0 0 1-.768.64L8 10.781l-2.116 2.54a.5.5 0 0 1-.768-.641L7.349 10 5.116 7.32a.5.5 0 1 1 .768-.64z"></path>
</svg>
Excel
</a>
</div>
</div>
</div> </div>
<div class="card text-dark bg-light mt-3"> <div class="card text-dark bg-light mt-3">
...@@ -324,11 +333,18 @@ ...@@ -324,11 +333,18 @@
<div class="card-footer"> <div class="card-footer">
<div> <div>
<nav aria-label="Page navigation example"> <nav aria-label="Page navigation example">
<div class="row">
<div class="col-md-10">
<ul class="pagination"> <ul class="pagination">
<c:forEach begin="1" end="${pages}" var="nro"> <c:forEach begin="1" end="${pages}" var="nro">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li> <li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
</c:forEach> </c:forEach>
</ul> </ul>
</div>
<div class="col-md-2">
<span class="badge bg-light text-dark">Numero de Ocurrencias: ${numeroOcurrencias}</span>
</div>
</div>
</nav> </nav>
</div> </div>
</div> </div>
...@@ -355,12 +371,13 @@ ...@@ -355,12 +371,13 @@
function buscarPagina(nro){ function buscarPagina(nro){
nro-- nro--
const aBuscar = 'nroPagina='+nro const aBuscar = 'nroPagina='+nro
if(!location.search) location.search = "?"+aBuscar if(!location.search) location.search = aBuscar
const inicial = location.search.search(aBuscar); const inicial = location.search.search(aBuscar);
if(inicial==-1){//si no se encuentra y hay otros queries if(inicial==-1){//si no se encuentra y hay otros queries
location.search = "&"+aBuscar location.search = "&"+aBuscar;
} }
location.search.replace('nroPagina=',aBuscar) location.search.replace('nroPagina=',aBuscar)
console.log(location.search)
} }
const tecId = document.querySelector("#tecId"); const tecId = document.querySelector("#tecId");
const lvlTec = document.querySelector("#lvlTec"); const lvlTec = document.querySelector("#lvlTec");
......
...@@ -15,12 +15,16 @@ ...@@ -15,12 +15,16 @@
</form> </form>
<a href="/tecnologia">Agregar Nueva Tecnologia</a> <a href="/tecnologia">Agregar Nueva Tecnologia</a>
</div> </div>
<div> <div class="card text-dark bg-light mt-3">
<div class="card-body">
<div class="table-responsive">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th scope="col">#</th> <th scope="col">#</th>
<th scope="col">Tecnologia</th> <th scope="col">Tecnologia</th>
<th scope="col"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
...@@ -30,7 +34,7 @@ ...@@ -30,7 +34,7 @@
<th scope="row">${sta.index+1}</th> <th scope="row">${sta.index+1}</th>
<td>${tecnologia.getNombre()}</td> <td>${tecnologia.getNombre()}</td>
<td><a href="/tecnologia/${tecnologia.id}">Editar tecnologia</a></td> <td><a href="/tecnologia/${tecnologia.id}"><i class="bi bi-pencil-fill"></i></a></td>
</tr> </tr>
</c:forEach> </c:forEach>
...@@ -39,6 +43,7 @@ ...@@ -39,6 +43,7 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div>
<div class="card-footer"> <div class="card-footer">
<div> <div>
<nav aria-label="Page navigation example"> <nav aria-label="Page navigation example">
...@@ -51,6 +56,7 @@ ...@@ -51,6 +56,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</layout:put> </layout:put>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment