diff --git a/curriculumsearch/mvnw b/curriculumsearch/mvnw old mode 100644 new mode 100755 diff --git a/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java b/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java index 40d1a40..bc82739 100644 --- a/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java +++ b/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java @@ -49,28 +49,28 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { http // .csrf().disable() .authorizeRequests() - .antMatchers("/").authenticated() - .antMatchers("/home").authenticated() - .antMatchers("/cargo*").authenticated() - .antMatchers("/convocatoria*").authenticated() - .antMatchers("/tecnologia*").authenticated() - .antMatchers("/postulantes").authenticated() - .antMatchers("/edit-user-data").authenticated() + .mvcMatchers("/").authenticated() + .mvcMatchers("/home").authenticated() + .mvcMatchers("/cargo*").authenticated() + .mvcMatchers("/convocatoria*").authenticated() + .mvcMatchers("/tecnologia*").authenticated() + .mvcMatchers("/postulantes","/postulantes/**").authenticated() + .mvcMatchers("/edit-user-data").authenticated() .anyRequest().permitAll() .and() - .formLogin() - .loginPage("/login") - .usernameParameter("email") - .defaultSuccessUrl("/home") - .permitAll() + .formLogin() + .loginPage("/login") + .usernameParameter("email") + .defaultSuccessUrl("/home") + .permitAll() .and() - .logout() - .logoutUrl("/logout") - .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")) - .clearAuthentication(true) - .invalidateHttpSession(true) - .deleteCookies("JSESSIONID", "remember-me") - .logoutSuccessUrl("/login"); + .logout() + .logoutUrl("/logout") + .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")) + .clearAuthentication(true) + .invalidateHttpSession(true) + .deleteCookies("JSESSIONID", "remember-me") + .logoutSuccessUrl("/login"); } } \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java index 4556637..5e4cc89 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java @@ -3,10 +3,13 @@ package com.roshka.controller; import java.text.SimpleDateFormat; import java.util.Date; +import com.roshka.modelo.Cargo; import com.roshka.modelo.ConvocatoriaCargo; import com.roshka.repositorio.CargoRepository; import com.roshka.repositorio.ConvocatoriaRepository; +import org.apache.jasper.tagplugins.jstl.core.ForEach; +import org.dom4j.Branch; import org.hibernate.jpa.TypedParameterValue; import org.hibernate.type.IntegerType; import org.hibernate.type.LongType; @@ -49,24 +52,48 @@ public class ConvocatoriaController { @RequestMapping(path = {"/convocatoria","/convocatoria/{id}"}) public String formConvocatoria(Model model,@PathVariable(required = false) Long id) { model.addAttribute("cargos", cargoRepo.findAll()); - if(id == null) model.addAttribute("convocatoria", new ConvocatoriaCargo()); + if(id == null){ + model.addAttribute("convocatoria", new ConvocatoriaCargo()); + model.addAttribute("listaConvocatoria", convoRepo.findAll()); + + } else { ConvocatoriaCargo cc = convoRepo.getById(id); cc.setFechaFinS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaFin()))); cc.setFechaInicioS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaInicio()))); model.addAttribute("convocatoria", cc); + model.addAttribute("listaConvocatoria", convoRepo.findAll()); } return "convocatoria-form"; } @PostMapping(path = {"/convocatoria","/convocatoria/{id}"}) - public String guardarConvocatoria(@ModelAttribute ConvocatoriaCargo convocatoria, BindingResult result, @PathVariable(required = false) Long id) { + public String guardarConvocatoria(@ModelAttribute ConvocatoriaCargo convocatoria, BindingResult result, @PathVariable(required = false) Long id,Model model) { if(result.hasErrors()); if(id != null) convocatoria.setId(id); - convoRepo.save(convocatoria); - System.out.println(convocatoria.getFechaInicio()); + //System.out.println(convoRepo.filtrarConvocatoriasPorCargo(convocatoria.getCargoId())); + for(ConvocatoriaCargo c: convoRepo.filtrarConvocatoriasPorCargo(convocatoria.getCargoId())){ + + + if(result.hasErrors() || c.getCargoId()==convocatoria.getCargoId() && c.getFechaFin().after(convocatoria.getFechaInicio()) ) + { + + model.addAttribute("existeFecha", true); + System.out.println("no debe"); + return "convocatoria-form"; + + } + else{ + convoRepo.save(convocatoria); + System.out.println("si anda"); + break; + + } + } + + return "redirect:/convocatorias"; } } diff --git a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java index 318c157..f1e32f8 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java @@ -1,20 +1,16 @@ package com.roshka.controller; -import java.util.ArrayList; +import java.io.IOException; import java.util.Date; -import java.util.List; -import java.util.Locale; import javax.validation.ConstraintViolationException; -import com.roshka.DTO.PostulanteListaDTO; import com.roshka.modelo.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.roshka.modelo.Disponibilidad; -import com.roshka.modelo.EstadoPostulante; import com.roshka.modelo.EstadoCivil; import com.roshka.modelo.Nacionalidad; import com.roshka.modelo.Postulante; @@ -27,26 +23,22 @@ import com.roshka.repositorio.ExperienciaRepository; import com.roshka.repositorio.InstitucionRepository; import com.roshka.repositorio.PostulanteRepository; import com.roshka.repositorio.TecnologiaRepository; -import com.roshka.utils.Helper; import org.hibernate.jpa.TypedParameterValue; -import org.hibernate.type.StringType; import org.hibernate.type.IntegerType; import org.hibernate.type.LongType; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; +import org.springframework.util.StringUtils; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.*; - +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.view.RedirectView; @Controller @@ -59,7 +51,7 @@ public class PostulanteController { CiudadRepository ciuRepo; EstudioRepository estudioRepository; PostulanteTecnologiaRepository postulanteTecnologiaRepository; - ConvocatoriaRepository cargoRepo; + ConvocatoriaRepository convoRepo; CargoRepository carRepo; @Autowired @@ -68,7 +60,7 @@ public class PostulanteController { InstitucionRepository institucionRepository, DepartamentoRepository depRepo, CiudadRepository ciuRepo, EstudioRepository estudioRepository, PostulanteTecnologiaRepository postulanteTecnologiaRepository, - ConvocatoriaRepository cargoRepo, CargoRepository carRepo) { + ConvocatoriaRepository convoRepo, CargoRepository carRepo) { this.post = post; this.tecRepo = tecRepo; this.expRepo = expRepo; @@ -77,52 +69,12 @@ public class PostulanteController { this.ciuRepo = ciuRepo; this.estudioRepository = estudioRepository; this.postulanteTecnologiaRepository = postulanteTecnologiaRepository; - this.cargoRepo =cargoRepo; + this.convoRepo =convoRepo; this.carRepo=carRepo; } - @RequestMapping("/postulantes") - public String postulantes(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 - ) { - final Integer CANTIDAD_POR_PAGINA = 5; - Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id")); - model.addAttribute("tecnologias", tecRepo.findAll()); - model.addAttribute("disponibilidades", Disponibilidad.values()); - model.addAttribute("institucionesEducativas", institucionRepository.findAll()); - model.addAttribute("estadoP", EstadoPostulante.values()); - model.addAttribute("convocatoriaC", cargoRepo.findAll()); - 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())); - } - - model.addAttribute("pages", postulantesPag.getTotalPages()); - model.addAttribute("postulantes", postulantesDTO); - return "postulantes"; - } - @RequestMapping("/postulante") + @RequestMapping(value = "/work-with-us",method = RequestMethod.GET) public String getFormPostulante(Model model){ model.addAttribute("tecnologias", tecRepo.findAll()); model.addAttribute("disponibilidades", Disponibilidad.values()); @@ -131,7 +83,7 @@ public class PostulanteController { model.addAttribute("estadosCiviles", EstadoCivil.values()); model.addAttribute("nacionalidades", Nacionalidad.values()); model.addAttribute("tiposExperencia", TipoExperiencia.values()); - model.addAttribute("CargosDisponibles", cargoRepo.f1ndByCargoAndEstado(new TypedParameterValue(LongType.INSTANCE, null), new Date(), new TypedParameterValue(IntegerType.INSTANCE, 1))); + model.addAttribute("CargosDisponibles", convoRepo.f1ndByCargoAndEstado(new TypedParameterValue(LongType.INSTANCE, null), new Date(), new TypedParameterValue(IntegerType.INSTANCE, 1))); try { model.addAttribute("ciudades", new ObjectMapper().writeValueAsString(ciuRepo.findAll())); } catch (JsonProcessingException er) { @@ -142,42 +94,86 @@ public class PostulanteController { return "postulante-form"; } - - @PostMapping(value = "/postulante",consumes = "application/json") - public String guardarPostulante(@RequestBody Postulante postulante){ + + /* @PostMapping("/uploadCVPostulante") + public String uploadFile(@RequestParam("file") MultipartFile file) { + dbFileRepository.save(storeFile(file)); + DBFile dbFile = dbFileRepository.save(storeFile(file)); + return "{\"id\": "+dbFile.getId()+"}"; + } */ + + private DBFile createFile(MultipartFile file) { + // Normalize file name + String fileName = StringUtils.cleanPath(file.getOriginalFilename()); + + try { + // Check if the file's name contains invalid characters + if(fileName.contains("..")) { + throw new Exception("Sorry! Filename contains invalid path sequence " + fileName); + } + if(file.getSize()==0) throw new Exception("Sorry! File cant be void");; + + DBFile dbFile = new DBFile(fileName, file.getContentType(), file.getBytes()); + + return dbFile; + } catch (IOException ex) { + ex.printStackTrace(); + return null; + } + catch(Exception ex){ + ex.printStackTrace(); + return null; + } + } + + @PostMapping(value = "/work-with-us",consumes = "multipart/form-data") + public RedirectView guardarPostulante(@RequestPart(name = "file",required = false) MultipartFile file,@RequestPart("postulante") Postulante postulante, RedirectAttributes redirectAttributes){ //Codigo encargado de modificar postulacion si se envia mismo CI - Postulante postulantex = post.findByNroDocument(postulante.getnroDocument()); + //Codigo encargado de modificar postulacion si se envia mismo CI + RedirectView redirectView = new RedirectView("/work-with-us/postulacion-correcta",true); + Postulante postulantex = post.findByNroDocument(postulante.getNroDocument()); if(postulantex != null){ + postulante.setEstadoPostulante(postulantex.getEstadoPostulante()); + postulante.setComentarioRRHH(postulantex.getComentarioRRHH()); estudioRepository.findByPostulante(postulantex).forEach(x -> estudioRepository.delete(x)); expRepo.findByPostulante(postulantex).forEach(x -> expRepo.delete(x)); postulanteTecnologiaRepository.findByPostulante(postulantex).forEach(x -> postulanteTecnologiaRepository.delete(x)); postulante.setId(postulantex.getId()); + } else{ + postulante.setEstadoPostulante(EstadoPostulante.NUEVO); + postulante.setComentarioRRHH(null); + } - postulante.getTecnologias().stream().filter( - tec -> tec.getTecnologia().getId() != 0 - ).forEach( - tec -> tec.setTecnologia(tecRepo.getById(tec.getTecnologia().getId())) - ); - /* for (int i = 0; i < postulante.getPostulaciones().size(); i++) { - postulante.getPostulaciones().set(i, cargoRepo.getById(postulante.getPostulaciones().get(i).getId())); - } - */ + if(file!=null){ + DBFile cv = createFile(file); + if(cv!=null) cv.setPostulante(postulante); + 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()){ - String nombreIns = ""; - nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); - Institucion institucion = institucionRepository.findByNombre(nombreIns); - if(institucion==null){ - institucionRepository.save(estudio.getInstitucion()); - }else{ - estudio.setInstitucion(institucion); - } - } - post.save(postulante); - return "redirect:/postulacion-correcta"; + for(Estudio estudio: postulante.getEstudios()){ + String nombreIns = ""; + nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); + Institucion institucion = institucionRepository.findByNombre(nombreIns); + if(institucion==null){ + institucionRepository.save(estudio.getInstitucion()); + }else{ + estudio.setInstitucion(institucion); } + } + if(postulante.getPostulaciones().isEmpty() || postulante.getTecnologias().isEmpty()){ + redirectView.setUrl("/postulante"); + redirectAttributes.addFlashAttribute("error", "Datos invalidos"); + return redirectView; + } + post.save(postulante); + return redirectView; + } - @GetMapping("/postulacion-correcta") + + + @GetMapping("/work-with-us/postulacion-correcta") public String successPostulation(Model model){ model.addAttribute("mensaje1", "Tu informacion se ha recibido correctamente!"); model.addAttribute("mensaje2", " espera por que nos pongamos en contacto!"); @@ -202,23 +198,6 @@ public class PostulanteController { - @GetMapping({"/postulante/{postulanteId}"}) - public String getPostulanteDetalle(Model model, @PathVariable("postulanteId") Long postulanteId) { - Postulante p = post.findById(postulanteId).orElse(null); - model.addAttribute("postulante",p); - model.addAttribute("estadoP", EstadoPostulante.values()); - return "detallepostulante"; - - } - @PostMapping({"/postulante/{postulanteId}"}) - public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) { - //post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId()); - Postulante postulanteVd = post.getById(postulanteId); - postulanteVd.setEstadoPostulante(postulante.getEstadoPostulante()); - postulanteVd.setComentarioRRHH(postulante.getComentarioRRHH()); - post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(), postulante.getComentarioRRHH(), postulanteId); - //post.save(postulanteVd); - return "redirect:/postulante/"+postulanteId; - } + } \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java new file mode 100644 index 0000000..3d4cf94 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java @@ -0,0 +1,162 @@ +package com.roshka.controller; + + +import java.util.ArrayList; + +import java.util.List; + + + + +import com.roshka.DTO.PostulanteListaDTO; +import com.roshka.modelo.*; +import com.roshka.modelo.Disponibilidad; +import com.roshka.modelo.EstadoPostulante; +import com.roshka.modelo.Postulante; +import com.roshka.repositorio.*; +import com.roshka.repositorio.CiudadRepository; +import com.roshka.repositorio.ConvocatoriaRepository; +import com.roshka.repositorio.DepartamentoRepository; +import com.roshka.repositorio.ExperienciaRepository; +import com.roshka.repositorio.InstitucionRepository; +import com.roshka.repositorio.PostulanteRepository; +import com.roshka.repositorio.TecnologiaRepository; +import com.roshka.utils.Helper; + + +import org.hibernate.jpa.TypedParameterValue; +import org.hibernate.type.StringType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; + + + +@Controller +public class PostulanteRRHHController { + PostulanteRepository post; + TecnologiaRepository tecRepo; + ExperienciaRepository expRepo; + InstitucionRepository institucionRepository; + DepartamentoRepository depRepo; + CiudadRepository ciuRepo; + EstudioRepository estudioRepository; + PostulanteTecnologiaRepository postulanteTecnologiaRepository; + ConvocatoriaRepository cargoRepo; + CargoRepository carRepo; + DBFileRepository fileRepo; + + @Autowired + public PostulanteRRHHController( + PostulanteRepository post, TecnologiaRepository tecRepo, ExperienciaRepository expRepo, + InstitucionRepository institucionRepository, DepartamentoRepository depRepo, + CiudadRepository ciuRepo, EstudioRepository estudioRepository, + PostulanteTecnologiaRepository postulanteTecnologiaRepository, + ConvocatoriaRepository cargoRepo, CargoRepository carRepo, DBFileRepository fileRepo) { + this.post = post; + this.tecRepo = tecRepo; + this.expRepo = expRepo; + this.institucionRepository = institucionRepository; + this.depRepo = depRepo; + this.ciuRepo = ciuRepo; + this.estudioRepository = estudioRepository; + this.postulanteTecnologiaRepository = postulanteTecnologiaRepository; + this.cargoRepo =cargoRepo; + this.carRepo=carRepo; + this.fileRepo = fileRepo; + } + + @RequestMapping("/postulantes") + public String postulantes(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 + ) { + final Integer CANTIDAD_POR_PAGINA = 5; + Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id")); + model.addAttribute("tecnologias", tecRepo.findAll()); + model.addAttribute("disponibilidades", Disponibilidad.values()); + model.addAttribute("institucionesEducativas", institucionRepository.findAll()); + model.addAttribute("estadoP", EstadoPostulante.values()); + model.addAttribute("convocatoriaC", cargoRepo.findAll()); + 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())); + } + + model.addAttribute("pages", postulantesPag.getTotalPages()); + model.addAttribute("postulantes", postulantesDTO); + return "postulantes"; + } + + + + @GetMapping({"/postulantes/{postulanteId}"}) + public String getPostulanteDetalle(Model model, @PathVariable("postulanteId") Long postulanteId) { + Postulante p = post.findById(postulanteId).orElse(null); + model.addAttribute("postulante",p); + model.addAttribute("cvId", fileRepo.getIdByPostulante(p)); + model.addAttribute("estadoP", EstadoPostulante.values()); + return "detallepostulante"; + + } + @PostMapping({"/postulantes/{postulanteId}"}) + public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) { + //post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId()); + Postulante postulanteVd = post.getById(postulanteId); + postulanteVd.setEstadoPostulante(postulante.getEstadoPostulante()); + postulanteVd.setComentarioRRHH(postulante.getComentarioRRHH()); + post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(), postulante.getComentarioRRHH(), postulanteId); + //post.save(postulanteVd); + return "redirect:/postulante/"+postulanteId; + } + + @GetMapping("/postulantes/cvFile/{fileId}") + public ResponseEntity downloadFile(@PathVariable String fileId) { + // Load file from database + DBFile dbFile; + try { + dbFile = fileRepo.findById(fileId) + .orElseThrow(() -> new Exception("File not found with id " + fileId)); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(dbFile.getFileType())) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + dbFile.getFileName() + "\"") + .body(new ByteArrayResource(dbFile.getData())); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return ResponseEntity.notFound().build(); + } + + } +} + \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java b/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java index 0ad17b3..585d47f 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java @@ -67,17 +67,21 @@ public class RRHHUserController { } @PostMapping("/process_register") - public String processRegister(HttpServletRequest request, RRHHUser user) { + public RedirectView processRegister(HttpServletRequest request, RRHHUser user, RedirectAttributes redirectAttributes) { + RedirectView redirectView = new RedirectView("/register",true); + redirectAttributes.addFlashAttribute("success", "Datos actualizados"); if(Long.parseLong(request.getParameter("registrationCode")) != REGISTER_CODE){ - return "redirect:/register"; + redirectAttributes.addFlashAttribute("error", "Codigo Incorrecto"); + return redirectView; } BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String encodedPassword = passwordEncoder.encode(user.getPassword()); user.setPassword(encodedPassword); rrhhUserRepository.save(user); - - return "register_success"; + redirectView.setUrl("/login"); + redirectAttributes.addFlashAttribute("success", "Registro Correcto"); + return redirectView; } @GetMapping("/edit-user-data") diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/DBFile.java b/curriculumsearch/src/main/java/com/roshka/modelo/DBFile.java new file mode 100644 index 0000000..2eb7919 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/DBFile.java @@ -0,0 +1,70 @@ +package com.roshka.modelo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +@Table(name = "files") +public class DBFile { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String id; + + private String fileName; + + private String fileType; + + @Lob + private byte[] data; + + @OneToOne(mappedBy = "cvFile") + private Postulante postulante; + + public DBFile() { + + } + + public DBFile(String fileName, String fileType, byte[] data) { + this.fileName = fileName; + this.fileType = fileType; + this.data = data; + } + + public byte[] getData() { + return data; + } + public String getFileName() { + return fileName; + } + public String getFileType() { + return fileType; + } + public void setData(byte[] data) { + this.data = data; + } + public void setFileName(String fileName) { + this.fileName = fileName; + } + public void setFileType(String fileType) { + this.fileType = fileType; + } + public void setId(String id) { + this.id = id; + } + public String getId() { + return id; + } + public Postulante getPostulante() { + return postulante; + } + public void setPostulante(Postulante postulante) { + this.postulante = postulante; + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java b/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java index c1627ed..8c75079 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java @@ -72,8 +72,6 @@ public class Postulante { @Max(value = 5) private Long nivelIngles; - @Column(name = "curriculum") - private String curriculum; @Column(name="estado_civil") @NotNull @@ -121,110 +119,19 @@ public class Postulante { ) private List postulaciones; + @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY) + @JoinColumn(name = "cvfile_id",referencedColumnName = "id") + @JsonIgnore + private DBFile cvFile; - - public String getnroDocument() { - return nroDocument; - } - - public void setnroDocument(String nroDocument) { - this.nroDocument = nroDocument; - } - - public Date getFechaNacimiento() { - return fechaNacimiento; - } - public void setFechaNacimiento(Date fechaNacimiento) { - this.fechaNacimiento = fechaNacimiento; - } + + + public void setFechaNacimiento(String fechaNacimiento) { this.fechaNacimiento = Helper.convertirFecha(fechaNacimiento); } - public Disponibilidad getDisponibilidad() { - return disponibilidad; - } - public void setDisponibilidad(Disponibilidad disponibilidad) { - this.disponibilidad = disponibilidad; - } - public Ciudad getCiudad() { - return this.ciudad; - } - - public void setCiudad(Ciudad ciudad) { - this.ciudad = ciudad; - } - - public Long getCiudadId() { - return this.ciudadId; - } - public void setCiudadId(Long ciudadId) { - this.ciudadId = ciudadId; - } - public void setTipoDocumento(TipoDocumento tipoDocumento) { - this.tipoDocumento = tipoDocumento; - } - public TipoDocumento getTipoDocumento() { - return tipoDocumento; - } - public void setEstadoCivil(EstadoCivil estadoCivil) { - this.estadoCivil = estadoCivil; - } - public EstadoCivil getEstadoCivil() { - return estadoCivil; - } - public Nacionalidad getNacionalidad() { - return nacionalidad; - } - public void setNacionalidad(Nacionalidad nacionalidad) { - this.nacionalidad = nacionalidad; - } - public List getTecnologias() { - return tecnologias; - } - public void setTecnologias(List tecnologias) { - this.tecnologias = tecnologias; - } - - public List getEstudios() { - return estudios; - } - public void setEstudios(List estudios) { - this.estudios = estudios; - } - public List getExperiencias() { - return experiencias; - } - public void setExperiencias(List experiencias) { - this.experiencias = experiencias; - } - public List getPostulaciones() { - return postulaciones; - } - public void setPostulaciones(List postulaciones) { - this.postulaciones = postulaciones; - } - - public void setReferencias(List referencias) { - this.referencias = referencias; - } - - public List getReferencias() { - return referencias; - } - public EstadoPostulante getEstadoPostulante() { - return this.estadoPostulante; - } - - public void setEstadoPostulante(EstadoPostulante estadoPostulante) { - this.estadoPostulante = estadoPostulante; - } - public String getComentarioRRHH(){ - return comentarioRRHH; - } - public void setComentarioRRHH(String comentarioRRHH){ - this.comentarioRRHH=comentarioRRHH; - } + } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java index 25926c9..685ccbd 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java @@ -15,4 +15,7 @@ public interface ConvocatoriaRepository extends JpaRepository findConvocatoriaCargoByCargo(Date fechaFinal); @Query("select c from ConvocatoriaCargo c where ( ?1 is null and ?3 is null) or ( ( ( (c.fechaFin > ?2 and ?3 = 1) or (c.fechaFin < ?2 and ?3 = 0)) or ?3 is null ) and (c.cargoId = ?1 or ?1 is null) )") public List f1ndByCargoAndEstado(TypedParameterValue cargoId, Date fecha, TypedParameterValue isOpen); + @Query("SELECT c FROM ConvocatoriaCargo c WHERE (cargoId=?1)") + public List filtrarConvocatoriasPorCargo(Long cargoId); + } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/DBFileRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/DBFileRepository.java new file mode 100644 index 0000000..8ba8b40 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/DBFileRepository.java @@ -0,0 +1,15 @@ +package com.roshka.repositorio; + +import com.roshka.modelo.DBFile; +import com.roshka.modelo.Postulante; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface DBFileRepository extends JpaRepository { + + @Query("select db.id from DBFile db where db.postulante = ?1") + public String getIdByPostulante(Postulante postulante); +} \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java index d7fb166..72d9b4d 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java @@ -80,4 +80,8 @@ public interface PostulanteRepository extends JpaRepository { @Query("UPDATE Postulante p SET p.comentarioRRHH = ?1 WHERE p.id = ?2") void setPostulanteEstadoComentario( String comentario, Long Id);*/ + @Query("SELECT p FROM Postulante p JOIN Estudio e ON p.id=e.postulante.id "+ + "where e.temaDeEstudio=?1") + public List obtenerPostulantesPorCarrera(String carrera); + } diff --git a/curriculumsearch/src/main/resources/application.properties b/curriculumsearch/src/main/resources/application.properties index e1e0dad..e718a77 100644 --- a/curriculumsearch/src/main/resources/application.properties +++ b/curriculumsearch/src/main/resources/application.properties @@ -26,3 +26,13 @@ spring.mail.properties.mail.smtp.starttls.enable=true jsp-inheritance-prefix=/jsp/layouts/ jsp-inheritance-suffix=.jsp + +## MULTIPART (MultipartProperties) +# Enable multipart uploads +spring.servlet.multipart.enabled=true +# Threshold after which files are written to disk. +spring.servlet.multipart.file-size-threshold=2KB +# Max file size. +spring.servlet.multipart.max-file-size=10MB +# Max Request Size +spring.servlet.multipart.max-request-size=10MB \ No newline at end of file diff --git a/curriculumsearch/src/main/resources/static/main.js b/curriculumsearch/src/main/resources/static/main.js index 758a3ec..6652c4a 100644 --- a/curriculumsearch/src/main/resources/static/main.js +++ b/curriculumsearch/src/main/resources/static/main.js @@ -49,7 +49,25 @@ function agregarFieldExpierncia(event){ //recoger del form const pairs = {}; const formexp = document.querySelector("[name=experiencia-form]"); + formexp.classList.add('was-validated') const formData = new FormData(formexp); + let error=validarfecha(formData.get("fechaDesde"), formData.get("fechaHasta")) + let appendTo = "Hasta"; + if (error) { + + if(error.includes("desde")) appendTo = "Desde"; + formexp.querySelector(".errorfecha"+appendTo) + + formexp['fecha'+appendTo].setCustomValidity(error) + document.querySelector(".errorfecha"+appendTo).innerHTML = error; + console.log(error); + + } + else{ + formexp.fechaDesde.setCustomValidity('') + formexp.fechaHasta.setCustomValidity('') + } + const reconocimientos = [{},{},{}]; let pos_rec; let returnFlag = false; @@ -87,27 +105,53 @@ function agregarFieldExpierncia(event){ pairs["reconocimientos"] = reconocimientos.filter(rec => rec.nombre); experiencias[cont_experiencia] = pairs; formexp.reset(); + formexp.classList.remove('was-validated') //imprimir lista actualizada const div = document.querySelector("#experiencias") const div1 = document.createElement('div'); - let content='
    ' + + let content=''; for (let index = 0; index < experiencias.length; index++) { const exp = experiencias[index]; if(exp==null) continue; content += ` -
  • - ${exp.institucion} - -
  • +
    +

    Experiencia

    +
    +
    +
    +
    +
    +
    +
    + + +
    ` } - content += "
" - div1.innerHTML = content - div.innerHTML = ''; - div.appendChild(div1); + //content += "" + div.innerHTML = content + //div.innerHTML = ''; + //div.appendChild(div1); cont_experiencia++; } +function validarfecha(fechaDesde, fechaHasta){ + let fechadehoy= new Date().toISOString().slice(0,10); + + if(fechaDesde>fechadehoy ){ + return "la fecha desde no puede ser mayor a la fecha actual" ; + } + if(fechaHasta =! null && fechaHasta>fechadehoy){ + return "la fecha hasta no puede ser mayor a la fecha actual" ; + } + if(fechaHasta =! null && fechaDesde>fechaHasta){ + return "la fecha desde no puede ser mayor a la fecha hasta"; + + } + return false + +} /*--------------------------------------------------------------------*/ function agregarFieldTecnologia(){ //recoger del form @@ -152,24 +196,26 @@ function agregarFieldTecnologia(){ const div1 = document.createElement('div'); console.log(tecnologias[0]) - let content1='
    ' + let content1='' for (let index = 0; index < tecnologias.length; index++) { const tecn = tecnologias[index]; if(tecn==null) continue; content1 += ` -
  • - ${tecn.tecnologia.nombre} - +
    +
    +
    +
    -
  • + ` } - content1 += "
" - div1.innerHTML = content1 - div.innerHTML = ''; - div.appendChild(div1); + //content1 += "" + div.innerHTML = content1 + //div.innerHTML = ''; + //div.appendChild(div1); cont_tecnologia++; + document.querySelector("#no-valid-tecno").style.display = "none"; } @@ -192,6 +238,15 @@ function serializeJSON (form) { // Create a new FormData object const formData = new FormData(form); + if(formData.get('fechaNacimiento')>=new Date().toISOString().slice(0,10)){ + form['fechaNacimiento'].setCustomValidity('Fecha de nacimiento debe ser menor que actual') + noValidateFlag = true; + return; + } + else{ + form['fechaNacimiento'].setCustomValidity('') + } + // Create an object to hold the name/value pairs const pairs = {}; @@ -205,12 +260,34 @@ function serializeJSON (form) { pairs["tecnologias"] = tecnologias.filter(tec => tec)//eliminacion de nulos pairs["postulaciones"] = postulaciones.filter(car => car)//eliminacion de nulos pairs["referencias"] = referencias.filter(tec => tec) - + if(pairs["postulaciones"].length<1){ + document.querySelector("#no-valid-cargo").style.display = "block"; + noValidateFlag = true; + }else{ + document.querySelector("#no-valid-cargo").style.display = "none"; + } + console.log(pairs["tecnologias"]) + if(pairs["tecnologias"].length<1){ + document.querySelector("#no-valid-tecno").style.display = "block"; + noValidateFlag = true; + }else{ + document.querySelector("#no-valid-tecno").style.display = "none"; + } + if(noValidateFlag){ + return; + } + noValidateFlag = false // Return the JSON string return JSON.stringify(pairs, null, 2); } +function obtenerCV(){ + let input = document.querySelector('#cvFile') + return input.files[0]; + +} + async function postData(url = '', data = {}) { var token = document.querySelector("meta[name='_csrf']").content; var headerxs = document.querySelector("meta[name='_csrf_header']").content; @@ -221,7 +298,7 @@ async function postData(url = '', data = {}) { cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached credentials: 'same-origin', // include, *same-origin, omit headers: { - 'Content-Type': 'application/json', + //'Content-Type': undefined//'application/json', // 'Content-Type': 'application/x-www-form-urlencoded', }, redirect: 'follow', // manual, *follow, error @@ -229,9 +306,22 @@ async function postData(url = '', data = {}) { body: data // body data type must match "Content-Type" header } senddata["headers"][headerxs] = token; - const response = await fetch(url, senddata); + let response = null + if(!noValidateFlag){ + response = await fetch(url, senddata); + } return response; // parses JSON response into native JavaScript objects } + +function formatearJsonWithFile(json, file){ + formData = new FormData(); + + formData.append("file", file); + formData.append('postulante', new Blob([json], { + type: "application/json" + })); + return formData +} formValidator() form = document.querySelector("form"); form.addEventListener("submit",(evt)=>{ @@ -240,8 +330,11 @@ form.addEventListener("submit",(evt)=>{ // evt.stopPropagation() // } // form.classList.add('was-validated') + evt.preventDefault(); + let formSerialized = serializeJSON(form); + let fileCV = obtenerCV(); if(!noValidateFlag){ - postData('postulante', serializeJSON(form)) + postData('work-with-us', formatearJsonWithFile(formSerialized,fileCV)) .then(response => { if(response.status==200 || response.status==302){ location.replace(response.url); @@ -249,12 +342,10 @@ form.addEventListener("submit",(evt)=>{ console.log(response.text().then(value => console.log(value))) } }); - evt.preventDefault(); - } + } noValidateFlag = false } ); -document.querySelector("#btn-new-tech").addEventListener('click',()=>{document.querySelector("#tecnologia-nombre").classList.remove('d-none')}) //Metodos para Estudios @@ -315,23 +406,29 @@ function agregarFieldEstudio(){ //imprimir lista actualizada const div = document.querySelector("#estudios") const div1 = document.createElement('div'); - let content='
    ' + let content=''; for (let index = 0; index < estudios.length; index++) { const est = estudios[index]; if(est==null) continue; content += ` -
  • - ${est.institucion.nombre} - -
  • +
    +

    Estudio

    +
    +
    +
    +
    +
    +
    + +
    ` } - content += "
" - div1.innerHTML = content - div.innerHTML = ''; - div.appendChild(div1); + + div.innerHTML = content + //div.innerHTML = ''; + //div.appendChild(div1); cont_estudios++; } @@ -384,7 +481,7 @@ function agregarFieldCargo(){ if(postulaciones[i]!==null){ if(postulaciones[i]["id"]===pairs["cargo-id"]){ alert("Ya has agregado ese cargo!") - cont_cargo--; + //cont_cargo--; return; } } @@ -398,23 +495,24 @@ function agregarFieldCargo(){ const div = document.querySelector("#cargos") const div1 = document.createElement('div'); - let content1='
    ' + let content1='' for (let index = 0; index < postulaciones.length; index++) { const car = postulaciones[index]; if(car==null) continue; content1 += ` -
  • - ${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} - -
  • - +
    +
    +
    +
    + ` } - content1 += "
" - div1.innerHTML = content1 - div.innerHTML = ''; - div.appendChild(div1); + //content1 += "" + div.innerHTML = content1 + //div.innerHTML = ''; + //div.appendChild(div1); cont_cargo++; + document.querySelector("#no-valid-cargo").style.display = "none"; } /*---------------------------------------------------------------------------------------------------*/ @@ -499,22 +597,25 @@ function agregarFieldReferencia(event){ //imprimir lista actualizada const div = document.querySelector("#referencia") const div1 = document.createElement('div'); - let content='
    ' + let content='' for (let index = 0; index < referencias.length; index++) { const exp = referencias[index]; if(exp==null) continue; content += ` -
  • - ${exp.nombre} - -
  • +
    +

    Referencia Personal

    +
    +
    +
    + +
    ` } - content += "
" - div1.innerHTML = content - div.innerHTML = ''; - div.appendChild(div1); + //content += "" + div.innerHTML = content + //div.innerHTML = ''; + //div.appendChild(div1); cont_referencias++; } @@ -530,60 +631,57 @@ function eliminarReferencia(event) { /*--------------------------------------------------------------------------------------------------------- */ -$(function(){ - $("#wizard").steps({ - headerTag: "h4", - bodyTag: "section", - transitionEffect: "fade", - enableAllSteps: true, - transitionEffectSpeed: 500, - onStepChanging: function (event, currentIndex, newIndex) { - if ( newIndex === 1 ) { - $('.steps ul').addClass('step-2'); - } else { - $('.steps ul').removeClass('step-2'); - } - if ( newIndex === 2 ) { - $('.steps ul').addClass('step-3'); - } else { - $('.steps ul').removeClass('step-3'); - } - - if ( newIndex === 3 ) { - $('.steps ul').addClass('step-4'); - $('.actions ul').addClass('step-last'); - } else { - $('.steps ul').removeClass('step-4'); - $('.actions ul').removeClass('step-last'); - } - return true; - }, - labels: { - finish: "Order again", - next: "Next", - previous: "Previous" - } - }); - // Custom Steps Jquery Steps - $('.wizard > .steps li a').click(function(){ - $(this).parent().addClass('checked'); - $(this).parent().prevAll().addClass('checked'); - $(this).parent().nextAll().removeClass('checked'); - }); - // Custom Button Jquery Steps - $('.forward').click(function(){ - $("#wizard").steps('next'); - }) - $('.backward').click(function(){ - $("#wizard").steps('previous'); - }) - // Checkbox - $('.checkbox-circle label').click(function(){ - $('.checkbox-circle label').removeClass('active'); - $(this).addClass('active'); - }) - }) - - - +// $(function(){ +// $("#wizard").steps({ +// headerTag: "h4", +// bodyTag: "section", +// transitionEffect: "fade", +// enableAllSteps: true, +// transitionEffectSpeed: 500, +// onStepChanging: function (event, currentIndex, newIndex) { +// if ( newIndex === 1 ) { +// $('.steps ul').addClass('step-2'); +// } else { +// $('.steps ul').removeClass('step-2'); +// } +// if ( newIndex === 2 ) { +// $('.steps ul').addClass('step-3'); +// } else { +// $('.steps ul').removeClass('step-3'); +// } +// +// if ( newIndex === 3 ) { +// $('.steps ul').addClass('step-4'); +// $('.actions ul').addClass('step-last'); +// } else { +// $('.steps ul').removeClass('step-4'); +// $('.actions ul').removeClass('step-last'); +// } +// return true; +// }, +// labels: { +// finish: "Order again", +// next: "Next", +// previous: "Previous" +// } +// }); +// // Custom Steps Jquery Steps +// $('.wizard > .steps li a').click(function(){ +// $(this).parent().addClass('checked'); +// $(this).parent().prevAll().addClass('checked'); +// $(this).parent().nextAll().removeClass('checked'); +// }); +// // Custom Button Jquery Steps +// $('.forward').click(function(){ +// $("#wizard").steps('next'); +// }) +// $('.backward').click(function(){ +// $("#wizard").steps('previous'); +// }) +// // Checkbox +// $('.checkbox-circle label').click(function(){ +// $('.checkbox-circle label').removeClass('active'); +// $(this).addClass('active'); +// }) +// }) /*--------------------------------------------------------------------------------------------------------- */ \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/css/formPostulanteStyle.css b/curriculumsearch/src/main/webapp/css/formPostulanteStyle.css index 25dad7d..f227aa3 100644 --- a/curriculumsearch/src/main/webapp/css/formPostulanteStyle.css +++ b/curriculumsearch/src/main/webapp/css/formPostulanteStyle.css @@ -1,6 +1,6 @@ body { - /* background-color: #506BEE; */ - background-image:url(/img/fondo.png); + background-color: #baebd8; + /* background-image:url(/img/fondo2.png); */ /*background-size:cover;*/ background-repeat:repeat; height:100vh;width:100vw; diff --git a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp index ae3de78..fa866ef 100644 --- a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp @@ -9,13 +9,19 @@
- Fecha inicial - + Fecha inicial + +
+ Esta fecha ya existe +
Fecha Fin - + +
+ Esta fecha ya existe +
Cupos: @@ -23,7 +29,7 @@
Cargo - + ${cargo.nombre} diff --git a/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp b/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp index 9bf8541..8f031a5 100644 --- a/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp +++ b/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp @@ -131,11 +131,18 @@
- -
-
- Descargar CV +
+ + + + + + + +
@@ -239,7 +246,7 @@
-
diff --git a/curriculumsearch/src/main/webapp/jsp/edit-user-data.jsp b/curriculumsearch/src/main/webapp/jsp/edit-user-data.jsp index abdb26d..38b2f2b 100644 --- a/curriculumsearch/src/main/webapp/jsp/edit-user-data.jsp +++ b/curriculumsearch/src/main/webapp/jsp/edit-user-data.jsp @@ -53,6 +53,7 @@
+ Volver
diff --git a/curriculumsearch/src/main/webapp/jsp/header.jsp b/curriculumsearch/src/main/webapp/jsp/header.jsp index 5a842fb..d47e825 100644 --- a/curriculumsearch/src/main/webapp/jsp/header.jsp +++ b/curriculumsearch/src/main/webapp/jsp/header.jsp @@ -1,6 +1,9 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + +
@@ -49,11 +52,31 @@ Editar mis datos -
\ No newline at end of file + + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/index.jsp b/curriculumsearch/src/main/webapp/jsp/index.jsp index 1ec98fe..a44f6bc 100644 --- a/curriculumsearch/src/main/webapp/jsp/index.jsp +++ b/curriculumsearch/src/main/webapp/jsp/index.jsp @@ -1,24 +1,10 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> - - - - - - - - RRHH - +<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%> + + + + - - - - -
- -
- - - - \ No newline at end of file +
\ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/layouts/base.jsp b/curriculumsearch/src/main/webapp/jsp/layouts/base.jsp index deaba95..d90023f 100644 --- a/curriculumsearch/src/main/webapp/jsp/layouts/base.jsp +++ b/curriculumsearch/src/main/webapp/jsp/layouts/base.jsp @@ -9,7 +9,9 @@ - + + + RRHH @@ -54,7 +56,7 @@ Postulantes diff --git a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp index 1bf5127..a411b61 100644 --- a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp @@ -98,8 +98,8 @@ - + +
@@ -142,46 +142,40 @@ - - -
-
-
 Cargo al que postulas

-
- -
+
- -
-
 Agregar Experiencia

-
- -
+
+ +
+ +
+ +
+ + +
+
- -
-
 Agregar Estudio

-
- -
-
+ +
+
- -
-
 Agregar Tecnologia

-
- - -
-
+ +
+ + +
+
-
-
 Referencias Personales

-
-
-
+ +
+
@@ -245,12 +239,16 @@
+
+ +
-
+
+
@@ -316,7 +314,6 @@ -
@@ -466,9 +463,13 @@ let fechaDesdeExperiencia = document.querySelector("#fechaDesdeExperiencia"); let fechaHastaEstudio = document.querySelector("#fechaHastaEstudio"); let fechaHastaExperiencia = document.querySelector("#fechaHastaExperiencia"); + let fechaNacimiento = document.querySelector("#fechaNacimiento"); + let fechas = [fechaDesdeEstudio,fechaDesdeExperiencia,fechaHastaEstudio,fechaHastaExperiencia,fechaNacimiento] + fechas.forEach(fch => fch.addEventListener('keydown',()=>false))//no dejar cargar manualmente fechas fechaDesdeEstudio.setAttribute("max", today); fechaDesdeExperiencia.setAttribute("max", today); + fechaNacimiento.setAttribute("max", today); fechaDesdeExperiencia.addEventListener("change", ()=>{ fechaHastaExperiencia.setAttribute("min", fechaDesdeExperiencia.value) diff --git a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp index 4806afa..fb03703 100644 --- a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp +++ b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp @@ -8,112 +8,218 @@

Lista de Postulantes

- - - -
- - - - - - - - -
-
- - - - - - - - +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + +
+
+ +
+
+ + +
+ +
+ +
+
+ + +
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+ + + +
+ +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ +
+
+ +
+
+
+
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
#NombreDisponibilidadNivel de InglesExperienciaTecnologiasEstado
${staPost.index + 1}${postulante.nombre} ${postulante.apellido}${postulante.disponibilidad.getDescripcion()}${postulante.nivelIngles}${postulante.experienciaMeses} - - ${detalle_tecnologia.getTecnologia().getNombre()}${not staTec.last ? "," : ""} - - ${postulante.estado.getEstado()}Ver
-
- +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#NombreDisponibilidadNivel de InglesExperienciaTecnologiasEstado
${staPost.index + 1}${postulante.nombre} ${postulante.apellido}${postulante.disponibilidad.getDescripcion()}${postulante.nivelIngles}${postulante.experienciaMeses} + + ${detalle_tecnologia.getTecnologia().getNombre()}${not staTec.last ? "," : ""} + + ${postulante.estado.getEstado()}Ver
+
+ +
+
+ +