diff --git a/curriculumsearch/pom.xml b/curriculumsearch/pom.xml index 40c2bd1..0068dd8 100644 --- a/curriculumsearch/pom.xml +++ b/curriculumsearch/pom.xml @@ -63,6 +63,17 @@ jstl 1.2 + + + org.springframework.boot + spring-boot-starter-security + + + + + + + diff --git a/curriculumsearch/src/main/java/com/roshka/CurriculumsearchApplication.java b/curriculumsearch/src/main/java/com/roshka/CurriculumsearchApplication.java index 8f876e3..d9c5103 100644 --- a/curriculumsearch/src/main/java/com/roshka/CurriculumsearchApplication.java +++ b/curriculumsearch/src/main/java/com/roshka/CurriculumsearchApplication.java @@ -2,26 +2,23 @@ package com.roshka; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.roshka.modelo.Ciudad; -import com.roshka.modelo.Departamento; -import com.roshka.modelo.Postulante; -import com.roshka.modelo.PostulanteTecnologia; -import com.roshka.modelo.Tecnologia; -import com.roshka.repositorio.CiudadRepository; -import com.roshka.repositorio.DepartamentoRepository; -import com.roshka.repositorio.PostulanteRepository; -import com.roshka.repositorio.TecnologiaRepository; +import com.roshka.modelo.*; +import com.roshka.repositorio.*; +import org.hibernate.PersistentObjectException; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @SpringBootApplication @EnableJpaRepositories("com.roshka.repositorio") @@ -33,7 +30,8 @@ public class CurriculumsearchApplication { } @Bean - CommandLineRunner runner(PostulanteRepository postRepo,TecnologiaRepository tecRepo,DepartamentoRepository depR, CiudadRepository ciudR) { + CommandLineRunner runner(PostulanteRepository postRepo, TecnologiaRepository tecRepo, DepartamentoRepository depR, + CiudadRepository ciudR, RRHHUserRepository rrhhUserRepository, CargoRepository cargoR, ConvocatoriaRepository convR) { return args -> { try { // read json and write to db @@ -48,14 +46,58 @@ public class CurriculumsearchApplication { List ciudades= mapper.readValue(inputStream,typeReference2); ciudR.saveAll(ciudades); System.out.println("Cuidad Saved!"); + TypeReference> typeReference3 = new TypeReference>(){}; + inputStream = TypeReference.class.getResourceAsStream("/json/cargo.json"); + List cargos= mapper.readValue(inputStream,typeReference3); + cargoR.saveAll(cargos); + cargoR.flush(); + System.out.println("Cargos Saved!"); + /* TypeReference> typeReference5 = new TypeReference>(){}; + inputStream = TypeReference.class.getResourceAsStream("/json/tecnologia.json"); + List tecnologias= mapper.readValue(inputStream,typeReference5); + tecRepo.saveAll(tecnologias); + tecRepo.flush(); + System.out.println("Cargos Saved!"); */ + TypeReference> typeReference4 = new TypeReference>(){}; + inputStream = TypeReference.class.getResourceAsStream("/json/convocatoria.json"); + List convocatorias= mapper.readValue(inputStream,typeReference4); + convocatorias = convR.saveAll(convocatorias); + convR.flush(); + System.out.println("convocatorias Saved!"); TypeReference> typeReference = new TypeReference>(){}; inputStream = TypeReference.class.getResourceAsStream("/json/postulante.json"); List postulantes = mapper.readValue(inputStream,typeReference); + /* for (Postulante postulante : postulantes) { + for (int i = 0; i < postulante.getPostulaciones().size(); i++) { + + postulante.getPostulaciones().set(i, convR.getById(postulante.getPostulaciones().get(i).getId())); + + + } + } */ postRepo.saveAll(postulantes); System.out.println("postulantes Saved!"); + String password = new BCryptPasswordEncoder().encode("test"); + RRHHUser testuser = new RRHHUser(); + testuser.setEmail("test@test.com"); + testuser.setFirstName("test"); + testuser.setLastName("test"); + testuser.setPassword(password); + rrhhUserRepository.save(testuser); + System.out.println("Usuario Test: \nEmail: test@test.com\nPassword: test"); } catch (IOException e){ - System.out.println("Unable to save tecnologias: " + e.getMessage()); + System.out.println("Unable to save: " + e.getMessage()); + } + catch(PersistentObjectException ex){ + System.out.println("Unable to save: " + ex.getMessage()); + + ex.printStackTrace(); + } + catch(Exception ex){ + System.out.println("Unable to save: " + ex.getMessage()); + + ex.printStackTrace(); } @@ -64,5 +106,21 @@ public class CurriculumsearchApplication { }; } + public static > void guardarJson(T repo,String srcJson ) { + ObjectMapper mapper = new ObjectMapper(); + TypeReference> typeReference1 = new TypeReference>(){}; + InputStream inputStream = TypeReference.class.getResourceAsStream(srcJson); + List listaAguardar; + try { + listaAguardar = mapper.readValue(inputStream,typeReference1); + repo.saveAll(listaAguardar); + repo.flush(); + System.out.println(srcJson+" Saved!"); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } diff --git a/curriculumsearch/src/main/java/com/roshka/DTO/PostulanteListaDTO.java b/curriculumsearch/src/main/java/com/roshka/DTO/PostulanteListaDTO.java new file mode 100644 index 0000000..50f80c0 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/DTO/PostulanteListaDTO.java @@ -0,0 +1,71 @@ +package com.roshka.DTO; + +import java.util.List; + +import com.roshka.modelo.Disponibilidad; +import com.roshka.modelo.PostulanteTecnologia; + +public class PostulanteListaDTO { + private Long id; + private String nombre; + private String apellido; + private Disponibilidad disponibilidad; + private Long nivelIngles; + private Long experienciaMeses; + private List tecnologias; + public PostulanteListaDTO(Long id, String nombre, String apellido, Disponibilidad disponibilidad, + Long nivelIngles, Long experienciaMeses, List tecnologias) { + this.id = id; + this.nombre = nombre; + this.apellido = apellido; + this.disponibilidad = disponibilidad; + this.nivelIngles = nivelIngles; + this.experienciaMeses = experienciaMeses; + this.tecnologias = tecnologias; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getNombre() { + return nombre; + } + public void setNombre(String nombre) { + this.nombre = nombre; + } + public String getApellido() { + return apellido; + } + public void setApellido(String apellido) { + this.apellido = apellido; + } + public Disponibilidad getDisponibilidad() { + return disponibilidad; + } + public void setDisponibilidad(Disponibilidad disponibilidad) { + this.disponibilidad = disponibilidad; + } + public Long getNivelIngles() { + return nivelIngles; + } + public void setNivelIngles(Long nivelIngles) { + this.nivelIngles = nivelIngles; + } + public Long getExperienciaMeses() { + return experienciaMeses; + } + public void setExperienciaMeses(Long experienciaMeses) { + this.experienciaMeses = experienciaMeses; + } + public List getTecnologias() { + return tecnologias; + } + public void setTecnologias(List tecnologias) { + this.tecnologias = tecnologias; + } + + + +} diff --git a/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetails.java b/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetails.java new file mode 100644 index 0000000..d8ad7b4 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetails.java @@ -0,0 +1,56 @@ +package com.roshka.configuration; + +import java.util.Collection; + +import com.roshka.modelo.RRHHUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +public class CustomUserDetails implements UserDetails { + + private RRHHUser user; + + public CustomUserDetails(RRHHUser user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + return null; + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + public String getFullName() { + return user.getFirstName() + " " + user.getLastName(); + } + +} \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetailsService.java b/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetailsService.java new file mode 100644 index 0000000..cd1f7cb --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/configuration/CustomUserDetailsService.java @@ -0,0 +1,24 @@ +package com.roshka.configuration; + +import com.roshka.modelo.RRHHUser; +import com.roshka.repositorio.RRHHUserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public class CustomUserDetailsService implements UserDetailsService { + + @Autowired + private RRHHUserRepository userRepo; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + RRHHUser user = userRepo.findByEmail(username); + if (user == null) { + throw new UsernameNotFoundException("User not found"); + } + return new CustomUserDetails(user); + } + +} diff --git a/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java b/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java new file mode 100644 index 0000000..d1279b2 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java @@ -0,0 +1,75 @@ +package com.roshka.configuration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import javax.sql.DataSource; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + private DataSource dataSource; + + @Bean + public UserDetailsService userDetailsService() { + return new CustomUserDetailsService(); + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(userDetailsService()); + authProvider.setPasswordEncoder(passwordEncoder()); + + return authProvider; + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authenticationProvider()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http +// .csrf().disable() + .authorizeRequests() + .antMatchers("/").authenticated() + .antMatchers("/home").authenticated() + .antMatchers("/cargo*").authenticated() + .antMatchers("/convocatoria*").authenticated() + .antMatchers("/tecnologia*").authenticated() + .antMatchers("/postulantes").authenticated() + .anyRequest().permitAll() + .and() + .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"); + } + +} \ No newline at end of file diff --git a/curriculumsearch/src/main/java/com/roshka/controller/CargoController.java b/curriculumsearch/src/main/java/com/roshka/controller/CargoController.java index 9fb72d6..342dfaf 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/CargoController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/CargoController.java @@ -1,74 +1,53 @@ package com.roshka.controller; -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.hibernate.jpa.TypedParameterValue; -import org.hibernate.type.IntegerType; -import org.hibernate.type.LongType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @Controller public class CargoController { CargoRepository cargoRepo; - ConvocatoriaRepository convoRepo; @Autowired - public CargoController(CargoRepository cargoRepo, ConvocatoriaRepository convoRepo) { + public CargoController(CargoRepository cargoRepo) { this.cargoRepo = cargoRepo; - this.convoRepo = convoRepo; } - @RequestMapping("/convocatorias") + @RequestMapping("/cargos") public String menuCargos(Model model, - @RequestParam(required = false) Long cargoId, - @RequestParam(required = false) Integer isOpen//1: true, 0: false + @RequestParam(required = false) String nombre ) { - - model.addAttribute("cargos", cargoRepo.findAll()); - - model.addAttribute("convocatorias", convoRepo.f1ndByCargoAndEstado(new TypedParameterValue(LongType.INSTANCE, cargoId), new Date(), new TypedParameterValue(IntegerType.INSTANCE, isOpen))); - //model.addAttribute("convocatorias",cargoId==null? convoRepo.findAll() : convoRepo.findByCargoId(cargoId)); - return "convocatorias"; + if(nombre == null || nombre.trim().isEmpty()) model.addAttribute("cargos", cargoRepo.findAll()); + else model.addAttribute("cargos", cargoRepo.findByNombreContainingIgnoreCase(nombre)); + return "cargos"; } - @RequestMapping("/cargo") - public String formCargo(Model model) { - model.addAttribute("cargo", new Cargo()); + @RequestMapping(path = {"/cargo","/cargo/{id}"}, method = RequestMethod.GET) + public String formCargo(Model model,@PathVariable(required = false) Long id) { + + if(id == null) model.addAttribute("cargo", new Cargo()); + else model.addAttribute("cargo", cargoRepo.getById(id)); return "cargo-form"; } - @PostMapping("/cargo") - public String guardarCargo(@ModelAttribute Cargo cargo, BindingResult result) { + @PostMapping(path = {"/cargo","/cargo/{id}"}) + public String guardarCargo(@ModelAttribute Cargo cargo, BindingResult result, @PathVariable(required = false) Long id) { if(result.hasErrors()); + if(id != null ) cargo.setId(id); cargoRepo.save(cargo); System.out.println(cargo.getNombre()); return "redirect:/cargos"; } - @RequestMapping("/convocatoria") - public String formConvocatoria(Model model) { - model.addAttribute("cargos", cargoRepo.findAll()); - model.addAttribute("convocatoria", new ConvocatoriaCargo()); - return "convocatoria-form"; - } - @PostMapping("/convocatoria") - public String guardarConvocatoria(@ModelAttribute ConvocatoriaCargo convocatoria, BindingResult result) { - if(result.hasErrors()); - convoRepo.save(convocatoria); - System.out.println(convocatoria.getFechaInicio()); - return "redirect:/cargos"; - } } diff --git a/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java new file mode 100644 index 0000000..4556637 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java @@ -0,0 +1,72 @@ +package com.roshka.controller; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.roshka.modelo.ConvocatoriaCargo; +import com.roshka.repositorio.CargoRepository; +import com.roshka.repositorio.ConvocatoriaRepository; + +import org.hibernate.jpa.TypedParameterValue; +import org.hibernate.type.IntegerType; +import org.hibernate.type.LongType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class ConvocatoriaController { + + CargoRepository cargoRepo; + ConvocatoriaRepository convoRepo; + + @Autowired + public ConvocatoriaController(CargoRepository cargoRepo, ConvocatoriaRepository convoRepo) { + this.cargoRepo = cargoRepo; + this.convoRepo = convoRepo; + } + + @RequestMapping("/convocatorias") + public String menuConvocatorias(Model model, + @RequestParam(required = false) Long cargoId, + @RequestParam(required = false) Integer isOpen//1: true, 0: false + ) { + + model.addAttribute("cargos", cargoRepo.findAll()); + + model.addAttribute("convocatorias", convoRepo.f1ndByCargoAndEstado(new TypedParameterValue(LongType.INSTANCE, cargoId), new Date(), new TypedParameterValue(IntegerType.INSTANCE, isOpen))); + //model.addAttribute("convocatorias",cargoId==null? convoRepo.findAll() : convoRepo.findByCargoId(cargoId)); + return "convocatorias"; + } + + + @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()); + 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); + } + + return "convocatoria-form"; + } + + @PostMapping(path = {"/convocatoria","/convocatoria/{id}"}) + public String guardarConvocatoria(@ModelAttribute ConvocatoriaCargo convocatoria, BindingResult result, @PathVariable(required = false) Long id) { + if(result.hasErrors()); + if(id != null) convocatoria.setId(id); + convoRepo.save(convocatoria); + System.out.println(convocatoria.getFechaInicio()); + 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 1d0e158..0398649 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java @@ -1,10 +1,15 @@ package com.roshka.controller; +import java.util.ArrayList; +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; @@ -13,14 +18,26 @@ import com.roshka.modelo.EstadoCivil; import com.roshka.modelo.Nacionalidad; import com.roshka.modelo.Postulante; import com.roshka.modelo.TipoExperiencia; +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.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; @@ -38,19 +55,31 @@ public class PostulanteController { InstitucionRepository institucionRepository; DepartamentoRepository depRepo; CiudadRepository ciuRepo; + EstudioRepository estudioRepository; + PostulanteTecnologiaRepository postulanteTecnologiaRepository; + ConvocatoriaRepository cargoRepo; + CargoRepository carRepo; @Autowired - public PostulanteController(PostulanteRepository post, TecnologiaRepository tecRepo, ExperienciaRepository expRepo, InstitucionRepository institucionRepository, DepartamentoRepository depRepo, CiudadRepository ciuRepo) { + public PostulanteController( + PostulanteRepository post, TecnologiaRepository tecRepo, ExperienciaRepository expRepo, + InstitucionRepository institucionRepository, DepartamentoRepository depRepo, + CiudadRepository ciuRepo, EstudioRepository estudioRepository, + PostulanteTecnologiaRepository postulanteTecnologiaRepository, + ConvocatoriaRepository cargoRepo, CargoRepository carRepo) { 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; } - - @RequestMapping("/") + @RequestMapping("home") public String index() { @@ -59,10 +88,38 @@ public class PostulanteController { @RequestMapping("/postulantes") public String postulantes(Model model, - @RequestParam(required = false,name = "tec")Long tecnologidaId) { + @RequestParam(required = false)Long tecId, + @RequestParam(required = false)String nombre, + @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(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()); - if(tecnologidaId==null) model.addAttribute("postulantes", post.findAll()); - else model.addAttribute("postulantes", post.buscarPostulantesPorTecnologia(tecnologidaId)); + model.addAttribute("disponibilidades", Disponibilidad.values()); + model.addAttribute("institucionesEducativas", institucionRepository.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); + 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())); + } + + model.addAttribute("pages", postulantesPag.getTotalPages()); + model.addAttribute("postulantes", postulantesDTO); return "postulantes"; } @@ -75,11 +132,12 @@ 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))); try { model.addAttribute("ciudades", new ObjectMapper().writeValueAsString(ciuRepo.findAll())); - } catch (JsonProcessingException e) { + } catch (JsonProcessingException er) { // TODO Auto-generated catch block - e.printStackTrace(); + er.printStackTrace(); } model.addAttribute("departamentos", depRepo.findAll()); @@ -88,23 +146,43 @@ public class PostulanteController { @PostMapping(value = "/postulante",consumes = "application/json") public String guardarPostulante(@RequestBody Postulante postulante){ - System.out.println("hola"); + //Codigo encargado de modificar postulacion si se envia mismo CI + Postulante postulantex = post.findByNroDocument(postulante.getnroDocument()); + if(postulantex != null){ + 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()); + } 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())); + } + */ + for(Estudio estudio: postulante.getEstudios()){ - Institucion institucion = institucionRepository.findByNombre(estudio.getInstitucion().getNombre()); + String nombreIns = ""; + nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); + Institucion institucion = institucionRepository.findByNombre(nombreIns); if(institucion==null){ institucionRepository.save(estudio.getInstitucion()); }else{ estudio.setInstitucion(institucion); } } - System.out.println("hola"); post.save(postulante); - return "redirect:/"; + return "redirect:/postulacion-correcta"; + } + + @GetMapping("/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!"); + return "exitoRegistro"; } @ResponseStatus(HttpStatus.BAD_REQUEST) @@ -125,5 +203,11 @@ 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); + return "detallepostulante"; + + } + } diff --git a/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java b/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java new file mode 100644 index 0000000..262fbfd --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/controller/RRHHUserController.java @@ -0,0 +1,57 @@ +package com.roshka.controller; + +import com.roshka.modelo.RRHHUser; +import com.roshka.repositorio.RRHHUserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import javax.servlet.http.HttpServletRequest; + +@Controller +public class RRHHUserController { + private static final long REGISTER_CODE = 1234; + RRHHUserRepository rrhhUserRepository; + + @Autowired + public RRHHUserController(RRHHUserRepository rrhhUserRepository){ + this.rrhhUserRepository = rrhhUserRepository; + } + + @GetMapping("/") + public String redirectOnHome(){ + return "redirect:/home"; + } + + @GetMapping("/register") + public String showRegistrationForm(Model model) { + model.addAttribute("user", new RRHHUser()); + + return "registration"; + } + + @GetMapping("/login") + public String getLogin(Model model, HttpServletRequest request) { + if(request.getParameter("error")!=null){ + model.addAttribute("error", "Credenciales Incorrectas"); + } + return "login"; + } + + @PostMapping("/process_register") + public String processRegister(HttpServletRequest request, RRHHUser user) { + if(Long.parseLong(request.getParameter("registrationCode")) != REGISTER_CODE){ + return "redirect:/register"; + } + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + String encodedPassword = passwordEncoder.encode(user.getPassword()); + user.setPassword(encodedPassword); + + rrhhUserRepository.save(user); + + return "register_success"; + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/controller/TecnologiaController.java b/curriculumsearch/src/main/java/com/roshka/controller/TecnologiaController.java new file mode 100644 index 0000000..e7a5333 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/controller/TecnologiaController.java @@ -0,0 +1,59 @@ +package com.roshka.controller; + +import com.roshka.modelo.Tecnologia; +import com.roshka.repositorio.TecnologiaRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class TecnologiaController { + + TecnologiaRepository tecRepo; + + +@Autowired +public TecnologiaController(TecnologiaRepository tecRepo){ + this.tecRepo = tecRepo; + +} + +@GetMapping(path = {"/tecnologia","/tecnologia/{id}"}) +public String addtecnologiaView(Model model,@PathVariable(required = false) Long id) { + + + if(id == null) model.addAttribute("tecnologia", new Tecnologia()); + else model.addAttribute("tecnologia", tecRepo.getById(id)); + return "tecnologia-form"; +} + +@RequestMapping("/tecnologias") + public String menuTecnologias(Model model, + @RequestParam(required = false) String nombre + ) { + if(nombre == null || nombre.trim().isEmpty()) model.addAttribute("tecnologias", tecRepo.findAll()); + else model.addAttribute("tecnologias", tecRepo.findByNombreContainingIgnoreCase(nombre)); + return "tecnologias"; + } + +@PostMapping(path = {"/tecnologia","/tecnologia/{id}"}) + public String addtecnologia(@ModelAttribute Tecnologia tecnologia, BindingResult result, @PathVariable(required = false) Long id) { + if(result.hasErrors()); + if(id != null ) tecnologia.setId(id); + tecRepo.save(tecnologia); + System.out.println(tecnologia.getNombre()); + return "redirect:/tecnologias"; + } + + + + +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java b/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java index f3dddf6..7a74fd6 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java @@ -17,8 +17,8 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; @Table(name = "cargo") public class Cargo { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; @NotBlank @Column(name = "nombre") @@ -28,13 +28,13 @@ public class Cargo { @JsonManagedReference private List convocatorias; - public long getId() { + public Long getId() { return id; } public String getNombre() { return nombre; } - public void setId(long id) { + public void setId(Long id) { this.id = id; } public void setNombre(String nombre) { @@ -47,4 +47,7 @@ public class Cargo { public void setConvocatorias(List convocatorias) { this.convocatorias = convocatorias; } + public static Object values() { + return null; + } } diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Ciudad.java b/curriculumsearch/src/main/java/com/roshka/modelo/Ciudad.java index 9ddced7..6bca1c5 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Ciudad.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Ciudad.java @@ -14,6 +14,7 @@ import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonBackReference; + @Entity @Table(name="ciudad") public class Ciudad{ @@ -66,6 +67,6 @@ public class Ciudad{ - + } diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java b/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java index c722df4..8b00983 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java @@ -15,14 +15,17 @@ import javax.persistence.Table; import javax.persistence.Transient; import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; import com.roshka.utils.Helper; @Entity @Table(name = "convocatoria_cargo") +@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property="@UUID") public class ConvocatoriaCargo { @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; @ManyToOne() @JoinColumn(name = "cargo_id",insertable = false, updatable = false) @@ -52,7 +55,7 @@ public class ConvocatoriaCargo { @ManyToMany(mappedBy = "postulaciones") private List postulantes; - public long getId() { + public Long getId() { return id; } public Cargo getCargo() { @@ -67,7 +70,7 @@ public class ConvocatoriaCargo { public Date getFechaInicio() { return fechaInicio; } - public void setId(long id) { + public void setId(Long id) { this.id = id; } public void setCargo(Cargo cargo) { diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Departamento.java b/curriculumsearch/src/main/java/com/roshka/modelo/Departamento.java index 6297df1..b0b1ffb 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Departamento.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Departamento.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; public class Departamento { @Id private Long id; + @Column(name="nombre") private String nombre; diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/DisponibilidadConverter.java b/curriculumsearch/src/main/java/com/roshka/modelo/DisponibilidadConverter.java index 400c133..93b5f5f 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/DisponibilidadConverter.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/DisponibilidadConverter.java @@ -6,7 +6,7 @@ import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter(autoApply = true) -public class DisponibilidadConverter implements AttributeConverter { +public class DisponibilidadConverter implements AttributeConverter, org.springframework.core.convert.converter.Converter { @Override public String convertToDatabaseColumn(Disponibilidad modalidad) { @@ -27,4 +27,9 @@ public class DisponibilidadConverter implements AttributeConverter referencias; - @ManyToMany(cascade = CascadeType.ALL) + @ManyToMany() @JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {"postulante_id","convocatoria_cargo_id"}), joinColumns = @JoinColumn(name="postulante_id", referencedColumnName="id"), inverseJoinColumns= @JoinColumn(name="convocatoria_cargo_id", referencedColumnName="id") ) - @JsonIgnore private List postulaciones; @@ -131,12 +133,12 @@ public class Postulante { this.apellido = apellido; } - public String getCi() { - return ci; + public String getnroDocument() { + return nroDocument; } - public void setCi(String ci) { - this.ci = ci; + public void setnroDocument(String nroDocument) { + this.nroDocument = nroDocument; } public String getCorreo() { @@ -175,11 +177,11 @@ public class Postulante { this.resumen = resumen; } - public long getNivelIngles() { + public Long getNivelIngles() { return nivelIngles; } - public void setNivelIngles(long nivelIngles) { + public void setNivelIngles(Long nivelIngles) { this.nivelIngles = nivelIngles; } @@ -215,13 +217,13 @@ public class Postulante { public void setEstadoCivil(EstadoCivil estadoCivil) { this.estadoCivil = estadoCivil; } - public void setTipoDocumento(String tipoDocumento) { + public void setTipoDocumento(TipoDocumento tipoDocumento) { this.tipoDocumento = tipoDocumento; } public EstadoCivil getEstadoCivil() { return estadoCivil; } - public String getTipoDocumento() { + public TipoDocumento getTipoDocumento() { return tipoDocumento; } public Nacionalidad getNacionalidad() { diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/PostulanteTecnologia.java b/curriculumsearch/src/main/java/com/roshka/modelo/PostulanteTecnologia.java index dca587e..4a041c2 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/PostulanteTecnologia.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/PostulanteTecnologia.java @@ -21,7 +21,7 @@ uniqueConstraints=@UniqueConstraint(columnNames={"postulante_id", "tecnologia_id public class PostulanteTecnologia { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private long id ; @@ -29,12 +29,13 @@ public class PostulanteTecnologia { @Min(value = 1) @Max(value = 5) private Long nivel; - @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE},optional = false) + @ManyToOne(cascade = {CascadeType.PERSIST},optional = false) @JoinColumn private Tecnologia tecnologia; + @ManyToOne() - @JoinColumn + @JoinColumn @JsonBackReference(value = "postulantetecnologia-postulante") private Postulante postulante; diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/RRHHUser.java b/curriculumsearch/src/main/java/com/roshka/modelo/RRHHUser.java new file mode 100644 index 0000000..32bf594 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/RRHHUser.java @@ -0,0 +1,63 @@ +package com.roshka.modelo; + +import javax.persistence.*; + +@Entity +@Table(name = "recursos_humanos_user") +public class RRHHUser { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true, length = 45) + private String email; + + @Column(nullable = false, length = 64) + private String password; + + @Column(name = "first_name", nullable = false, length = 20) + private String firstName; + + @Column(name = "last_name", nullable = false, length = 20) + private String lastName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/ReferenciaPersonal.java b/curriculumsearch/src/main/java/com/roshka/modelo/ReferenciaPersonal.java index 75aca3b..00ed654 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/ReferenciaPersonal.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/ReferenciaPersonal.java @@ -1,13 +1,6 @@ package com.roshka.modelo; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; +import javax.persistence.*; import javax.validation.constraints.NotBlank; import com.fasterxml.jackson.annotation.JsonBackReference; @@ -16,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonBackReference; @Table(name = "referencia_personal") public class ReferenciaPersonal { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotBlank @@ -31,7 +24,7 @@ public class ReferenciaPersonal { @Column(name = "relacion") private String relacion; - @ManyToOne(optional = false) + @ManyToOne(cascade = CascadeType.ALL, optional = false) @JoinColumn @JsonBackReference private Postulante postulante; diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Tecnologia.java b/curriculumsearch/src/main/java/com/roshka/modelo/Tecnologia.java index 67b85ff..5b5ece5 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Tecnologia.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Tecnologia.java @@ -12,7 +12,7 @@ import javax.validation.constraints.NotBlank; @Entity @Table(name="tecnologia") public class Tecnologia { - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Id @Column(name="id") private long id; @@ -29,7 +29,7 @@ public class Tecnologia { this.id = id; } public String getNombre() { - return nombre.toLowerCase(); + return nombre; } public void setNombre(String nombre) { this.nombre = nombre; diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumento.java b/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumento.java new file mode 100644 index 0000000..c41f122 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumento.java @@ -0,0 +1,27 @@ +package com.roshka.modelo; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum TipoDocumento { + CI("CI","Cedula de identidad"), + DNI("PAS","Pasaporte"), + Otro("Otro","Otro"); + private String code; + private String descripcion; + + private TipoDocumento(String code, String descripcion) { + this.code = code; + this.descripcion = descripcion; + } + public void setDescripcion(String descripcion){ + this.descripcion = descripcion; + } + @JsonValue + public String getCode() { + return code; + } + + public String getDescripcion() { + return descripcion; + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumentoConverter.java b/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumentoConverter.java new file mode 100644 index 0000000..483c9cc --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/TipoDocumentoConverter.java @@ -0,0 +1,31 @@ +package com.roshka.modelo; + +import java.util.Arrays; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply = true) +public class TipoDocumentoConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(TipoDocumento modalidad) { + if (modalidad == null) { + return null; + } + return modalidad.getCode(); + } + + @Override + public TipoDocumento convertToEntityAttribute(String code) { + if (code == null) { + return null; + } + + return Arrays.stream(TipoDocumento.values()) + .filter(c -> c.getCode().equals(code)) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } +} + diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/CargoRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/CargoRepository.java index 3e8c119..556bc1c 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/CargoRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/CargoRepository.java @@ -1,9 +1,11 @@ package com.roshka.repositorio; +import java.util.List; + import com.roshka.modelo.Cargo; import org.springframework.data.jpa.repository.JpaRepository; public interface CargoRepository extends JpaRepository{ - + public List findByNombreContainingIgnoreCase(String nombre); } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java index e30b295..25926c9 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java @@ -11,7 +11,8 @@ import org.springframework.data.jpa.repository.Query; public interface ConvocatoriaRepository extends JpaRepository { public List findByCargoId(Long cargoId); - + //@Query(value="selec x from ConvocatoriaCargo x where (x.fechaFinal > ?1)",nativeQuery = true) + //public List 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); } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/EstudioRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/EstudioRepository.java index 50d9336..ad25f79 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/EstudioRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/EstudioRepository.java @@ -1,10 +1,14 @@ package com.roshka.repositorio; +import com.roshka.modelo.Postulante; import org.springframework.data.jpa.repository.JpaRepository; import com.roshka.modelo.Estudio; +import java.util.List; + public interface EstudioRepository extends JpaRepository{ + public List findByPostulante(Postulante postulante); } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/ExperienciaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/ExperienciaRepository.java index cebad2a..5eadaaf 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/ExperienciaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/ExperienciaRepository.java @@ -1,5 +1,6 @@ package com.roshka.repositorio; +import com.roshka.modelo.Postulante; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,4 +10,6 @@ import com.roshka.modelo.Experiencia; public interface ExperienciaRepository extends JpaRepository { public List findByCargoLike(String cargo); + + public List findByPostulante(Postulante postulante); } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java index d0e958b..4da2ffe 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteRepository.java @@ -2,15 +2,21 @@ package com.roshka.repositorio; import java.util.List; +import org.hibernate.jpa.TypedParameterValue; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import com.roshka.modelo.Disponibilidad; import com.roshka.modelo.Postulante; public interface PostulanteRepository extends JpaRepository { - @Query("select p from Postulante p join p.estudios e on e.institucion LIKE %?1%") + public Postulante findByNroDocument(String ci); + + @Query("select p from Postulante p join p.estudios e on e.institucion.nombre LIKE %?1%") public List findByInstitucionEstudio(String institucion); @Query("select p from Postulante p " + @@ -31,8 +37,29 @@ public interface PostulanteRepository extends JpaRepository { "having sum(fecha_hasta-fecha_desde)>?1 * INTERVAL '1' month", nativeQuery = true ) public List personasConExperienciaMayor(long meses); + @Query("select pos from Postulante pos join PostulanteTecnologia pt on pt.postulante.id=pos.id "+ "join Tecnologia tec on pt.tecnologia.id=tec.id "+ "where tec.nombre=?1 and pt.nivel=?2") public List findByPostulanteTecnologiaM(String tecno,long idt); + + + @Query(value = "select DISTINCT p " + + "from Postulante p left join p.experiencias x " + + "left join p.estudios e " + + "left join p.tecnologias pt " + + "left join p.postulaciones conv " + + "where (?1 is null or lower(p.nombre) LIKE lower(?1) or lower(p.apellido) LIKE lower(?1) ) " + + "and (p.disponibilidad = ?2 or ?2 is null) " + + "and (p.nivelIngles >= ?3 or ?3 is null) "+ + "and (pt.nivel >= ?4 or ?4 is null) "+ + "and (pt.tecnologia.id = ?5 or ?5 is null) "+ + " and (e.institucion.id = ?6 or ?6 is null ) "+ + " and (conv.cargoId = ?7 or ?7 is null ) ") + public Page postulantesMultiFiltro(TypedParameterValue nombre, Disponibilidad disponibilidad, Long nivelInges, Long nivel, Long tecnoId, Long instId,Long cargoId, Pageable pageable); + + @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/java/com/roshka/repositorio/PostulanteTecnologiaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteTecnologiaRepository.java index 8a295b0..012f485 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteTecnologiaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/PostulanteTecnologiaRepository.java @@ -1,12 +1,15 @@ package com.roshka.repositorio; +import com.roshka.modelo.Postulante; import org.springframework.data.jpa.repository.JpaRepository; import com.roshka.modelo.PostulanteTecnologia; -public interface PostulanteTecnologiaRepository extends JpaRepository{ +import java.util.List; +public interface PostulanteTecnologiaRepository extends JpaRepository{ + public List findByPostulante(Postulante postulante); } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/RRHHUserRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/RRHHUserRepository.java new file mode 100644 index 0000000..d13c336 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/RRHHUserRepository.java @@ -0,0 +1,8 @@ +package com.roshka.repositorio; + +import com.roshka.modelo.RRHHUser; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RRHHUserRepository extends JpaRepository { + RRHHUser findByEmail(String username); +} diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/TecnologiaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/TecnologiaRepository.java index 3bfc4ca..fed1587 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/TecnologiaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/TecnologiaRepository.java @@ -2,9 +2,11 @@ package com.roshka.repositorio; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + import com.roshka.modelo.Tecnologia; public interface TecnologiaRepository extends JpaRepository { - + public List findByNombreContainingIgnoreCase(String nombre); } diff --git a/curriculumsearch/src/main/java/com/roshka/utils/Helper.java b/curriculumsearch/src/main/java/com/roshka/utils/Helper.java index 40f586f..78f3197 100644 --- a/curriculumsearch/src/main/java/com/roshka/utils/Helper.java +++ b/curriculumsearch/src/main/java/com/roshka/utils/Helper.java @@ -2,6 +2,9 @@ package com.roshka.utils; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; import java.util.Date; public class Helper { @@ -12,7 +15,7 @@ public class Helper { */ public static Date convertirFecha(String fecha) { try { - + if(fecha == null || fecha.trim().equals("")) return null; return new SimpleDateFormat("yyyy-MM-dd").parse(fecha); } catch (ParseException e) { // TODO Auto-generated catch block @@ -21,4 +24,11 @@ public class Helper { return null; } } + + public static final long getMonthsDifference(Date date1, Date date2) { + YearMonth m1 = YearMonth.from(date1.toInstant().atZone(ZoneOffset.UTC)); + YearMonth m2 = YearMonth.from(date2.toInstant().atZone(ZoneOffset.UTC)); + + return m1.until(m2, ChronoUnit.MONTHS) + 1; + } } diff --git a/curriculumsearch/src/main/resources/application.properties b/curriculumsearch/src/main/resources/application.properties index 192b323..031335f 100644 --- a/curriculumsearch/src/main/resources/application.properties +++ b/curriculumsearch/src/main/resources/application.properties @@ -1,10 +1,10 @@ spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.show-sql=true +#spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE spring.sql.init.mode=always spring.sql.init.platform=postgres diff --git a/curriculumsearch/src/main/resources/json/cargo.json b/curriculumsearch/src/main/resources/json/cargo.json new file mode 100644 index 0000000..24605e2 --- /dev/null +++ b/curriculumsearch/src/main/resources/json/cargo.json @@ -0,0 +1,10 @@ +[ + { + "id": 1, + "nombre": "dev java" + }, + { + "id": 2, + "nombre": "dev php" + } + ] \ No newline at end of file diff --git a/curriculumsearch/src/main/resources/json/convocatoria.json b/curriculumsearch/src/main/resources/json/convocatoria.json new file mode 100644 index 0000000..b931ede --- /dev/null +++ b/curriculumsearch/src/main/resources/json/convocatoria.json @@ -0,0 +1,16 @@ +[ + { + "id": 1, + "cargoId": 1, + "fechaInicio": "2021-11-01", + "fechaFin": "2021-11-30", + "cupos": 20 + }, + { + "id": 2, + "cargoId": 2, + "fechaInicio": "2021-11-01", + "fechaFin": "2021-11-30", + "cupos": 20 + } + ] \ No newline at end of file diff --git a/curriculumsearch/src/main/resources/json/postulante.json b/curriculumsearch/src/main/resources/json/postulante.json index 3ffaf21..ace6a6e 100644 --- a/curriculumsearch/src/main/resources/json/postulante.json +++ b/curriculumsearch/src/main/resources/json/postulante.json @@ -1,25 +1,26 @@ [ { - "resumen": "In irure aliquip qui cillum veniam sint amet amet sint ex proident anim mollit.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "resumen": "In irure aliquip qui cillum veniam sint amet amet sint ex proident anim mollit.", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Taylor", "apellido": "Obrien", "correo": "gladysalexander@dadabase.com", - "ci": 5821432, + "nroDocument": 5821432, "ciudadId": 238, "telefono": "(950) 417-3681", "fechaNacimiento": "2021-08-16", "nivelIngles": 1, "disponibilidad": "C", - + "experiencias": [ { "institucion": "Fanfare", "fechaDesde": "2014-09-10", "fechaHasta": "2016-01-01", - "tipoExperiencia":"Trabajo Normal", + "tipoExperiencia": "Trabajo Normal", "cargo": "dba", "descripcion": "Enim qui Lorem ut magna.", "nombreReferencia": "Marissa", @@ -29,8 +30,8 @@ "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-08-28", "fechaHasta": "2016-01-01", "temaDeEstudio": "analista" @@ -59,13 +60,14 @@ }, { "resumen": "Do nostrud aliqua adipisicing in sunt aute id do elit ut dolor ad aliquip.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Hopkins", "apellido": "Parks", "correo": "grahamgriffith@zilidium.com", - "ci": 4213361, + "nroDocument": 4213361, "ciudadId": 96, "telefono": "(866) 560-2541", "fechaNacimiento": "2021-09-04", @@ -80,15 +82,15 @@ "cargo": "developer frontend", "descripcion": "Consequat fugiat qui sint deserunt ullamco.", "nombreReferencia": "Iva", - "tipoExperiencia":"Trabajo Normal", + "tipoExperiencia": "Trabajo Normal", "telefonoReferencia": "(947) 580-2363" } ], "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-07-08", "fechaHasta": "2016-01-01", "temaDeEstudio": "lic inf" @@ -105,13 +107,14 @@ }, { "resumen": "Occaecat non cupidatat amet reprehenderit consectetur ullamco et.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Alejandra", "apellido": "Riggs", "correo": "ruthrobertson@homelux.com", - "ci": 4605787, + "nroDocument": 4605787, "ciudadId": 30, "telefono": "(876) 580-2411", "fechaNacimiento": "2021-01-28", @@ -124,7 +127,7 @@ "fechaDesde": "2014-08-26", "fechaHasta": "2016-01-01", "cargo": "dba", - "tipoExperiencia":"Trabajo Normal", + "tipoExperiencia": "Trabajo Normal", "descripcion": "Aute culpa ea mollit adipisicing dolore dolore amet adipisicing occaecat commodo enim cillum.", "nombreReferencia": "Rose", "telefonoReferencia": "(853) 471-2006" @@ -133,8 +136,8 @@ "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-02-13", "fechaHasta": "2016-01-01", "temaDeEstudio": "lic inf" @@ -151,13 +154,14 @@ }, { "resumen": "Qui ullamco excepteur velit ad ullamco id id nisi irure dolore cupidatat mollit ullamco veniam.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Angelina", "apellido": "Wallace", "correo": "christiwalls@capscreen.com", - "ci": 4591352, + "nroDocument": 4591352, "ciudadId": 65, "telefono": "(931) 499-3122", "fechaNacimiento": "2021-06-05", @@ -173,14 +177,14 @@ "descripcion": "Aliquip occaecat minim dolor enim commodo.", "nombreReferencia": "Elba", "telefonoReferencia": "(881) 568-2597", - "tipoExperiencia":"Trabajo Normal" + "tipoExperiencia": "Trabajo Normal" } ], "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-12-22", "fechaHasta": "2016-01-01", "temaDeEstudio": "ing inf" @@ -197,13 +201,14 @@ }, { "resumen": "Deserunt tempor ut et eiusmod et labore Lorem.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Rivas", "apellido": "Owens", "correo": "shirleyguzman@equitox.com", - "ci": 3969318, + "nroDocument": 3969318, "ciudadId": 143, "telefono": "(972) 524-2610", "fechaNacimiento": "2021-09-09", @@ -219,14 +224,14 @@ "descripcion": "Dolore nulla deserunt fugiat est reprehenderit tempor qui excepteur.", "nombreReferencia": "Crawford", "telefonoReferencia": "(903) 568-2045", - "tipoExperiencia":"Trabajo Normal" + "tipoExperiencia": "Trabajo Normal" } ], "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-08-03", "fechaHasta": "2016-01-01", "temaDeEstudio": "lic inf" @@ -243,13 +248,14 @@ }, { "resumen": "Aliqua est adipisicing do exercitation sit laborum aliquip aliqua adipisicing enim aute.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Estelle", "apellido": "Gamble", "correo": "mclaughlinpate@enomen.com", - "ci": 2329745, + "nroDocument": 2329745, "ciudadId": 248, "telefono": "(933) 501-3525", "fechaNacimiento": "2021-03-24", @@ -265,14 +271,14 @@ "descripcion": "Do do est ad ea pariatur aliquip sit ipsum in duis laborum velit magna.", "nombreReferencia": "Schultz", "telefonoReferencia": "(903) 420-3902", - "tipoExperiencia":"Trabajo Normal" + "tipoExperiencia": "Trabajo Normal" } ], "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-07-13", "fechaHasta": "2016-01-01", "temaDeEstudio": "ing inf" @@ -289,13 +295,14 @@ }, { "resumen": "Officia eiusmod ut reprehenderit tempor consequat elit amet ex voluptate aute anim do.", - "nacionalidad":"Paraguayo", - "estadoCivil":"Soltero", - "tipoDocumento":"ci", + "nacionalidad": "Paraguayo", + "postulaciones": [{ "id": 1 }], + "estadoCivil": "Soltero", + "tipoDocumento": "CI", "nombre": "Mariana", "apellido": "Ratliff", "correo": "loramiddleton@musanpoly.com", - "ci": 4519594, + "nroDocument": 4519594, "ciudadId": 104, "telefono": "(817) 492-2493", "fechaNacimiento": "2021-07-30", @@ -311,15 +318,14 @@ "descripcion": "Anim labore anim veniam deserunt ex aute.", "nombreReferencia": "Francesca", "telefonoReferencia": "(961) 420-2150", - "tipoExperiencia":"Trabajo Normal" - + "tipoExperiencia": "Trabajo Normal" } ], "estudios": [ { "tipoDeEstudio": "TERCIARIO", -"estado": "SUSPENDIDO", - "institucion": {"nombre":"UNA"}, + "estado": "SUSPENDIDO", + "institucion": { "nombre": "UNA" }, "fechaDesde": "2014-10-03", "fechaHasta": "2016-01-01", "temaDeEstudio": "ing inf" @@ -334,4 +340,4 @@ } ] } -] \ 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 52a71e2..808eef0 100644 --- a/curriculumsearch/src/main/resources/static/main.js +++ b/curriculumsearch/src/main/resources/static/main.js @@ -1,13 +1,20 @@ var cont_experiencia = 0; let cont_estudios = 0; let cont_tecnologia = 0; -var cont_referencias=0 ; + +let cont_cargo = 0; const experiencias = []; const estudios = []; const tecnologias = []; +let noValidateFlag = false; + +const postulaciones = []; + +var cont_referencias=0 ; const referencias= []; + const formValidator = function () { 'use strict' @@ -23,13 +30,21 @@ const formValidator = function () { if (!form.checkValidity()) { event.preventDefault() event.stopPropagation() + noValidateFlag = true; } form.classList.add('was-validated') }, false) }) } - +function carg(elemento) { + var element = document.getElementById('descripcion'); + if(elemento == "otro"){ + element.style.display='block'; + }else{ + element.style.display='none'; + } +} function agregarFieldExpierncia(event){ //recoger del form const pairs = {}; @@ -82,7 +97,7 @@ function agregarFieldExpierncia(event){ content += `
  • ${exp.institucion} - +
  • ` @@ -176,6 +191,7 @@ function serializeJSON (form) { // Create a new FormData object const formData = new FormData(form); + // Create an object to hold the name/value pairs const pairs = {}; @@ -186,27 +202,33 @@ function serializeJSON (form) { pairs["experiencias"] = experiencias.filter(exp => exp)//eliminacion de nulos pairs["estudios"] = estudios.filter(est => est)//eliminacion de nulos pairs["tecnologias"] = tecnologias.filter(tec => tec)//eliminacion de nulos + pairs["postulaciones"] = postulaciones.filter(car => car)//eliminacion de nulos pairs["referencias"] = referencias.filter(tec => tec) + // Return the JSON string return JSON.stringify(pairs, null, 2); } async function postData(url = '', data = {}) { + var token = document.querySelector("meta[name='_csrf']").content; + var headerxs = document.querySelector("meta[name='_csrf_header']").content; // Default options are marked with * - const response = await fetch(url, { + let senddata = { method: 'POST', // *GET, POST, PUT, DELETE, etc. mode: 'cors', // no-cors, *cors, same-origin 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': 'application/x-www-form-urlencoded', + 'Content-Type': 'application/json', + // 'Content-Type': 'application/x-www-form-urlencoded', }, redirect: 'follow', // manual, *follow, error referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url body: data // body data type must match "Content-Type" header - }); + } + senddata["headers"][headerxs] = token; + const response = await fetch(url, senddata); return response; // parses JSON response into native JavaScript objects } formValidator() @@ -217,15 +239,18 @@ form.addEventListener("submit",(evt)=>{ // evt.stopPropagation() // } // form.classList.add('was-validated') - postData('postulante', serializeJSON(form)) - .then(response => { - if(response.status==200 || response.status==302){ - location.replace(response.url); - }else{ - console.log(response.text().then(value => console.log(value))) - } - }); - evt.preventDefault(); + if(!noValidateFlag){ + postData('postulante', serializeJSON(form)) + .then(response => { + if(response.status==200 || response.status==302){ + location.replace(response.url); + }else{ + 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')}) @@ -320,7 +345,85 @@ function eliminarEstudio(event) { //eliminar en html event.target.parentElement.remove() } +/*--------------------------------------------------------------------*/ +function agregarFieldCargo(){ + //recoger del form + const pairs = {}; + const formcar = document.querySelector("[name=cargo-form]"); + const formData = new FormData(formcar); + + //Validacion + let returnFlag = false; + + let requiredValues = ["nombre"] + + formData.forEach((value, key)=>{ + if(requiredValues.includes(key) + && value==="" && returnFlag == false){ + console.log(key, value) + returnFlag = true; + } + }); + + if(returnFlag===true){ + let message = "Rellene " + for(let i=0;i option[value="'+pairs["cargo-id"]+'"]').innerHTML} + console.log(postulaciones) + formcar.reset(); + //imprimir lista actualizada + const div = document.querySelector("#cargos") + const div1 = document.createElement('div'); + + 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); + cont_cargo++; +} +/*---------------------------------------------------------------------------------------------------*/ +function eliminarCargoPostulante(event) { + //eliminar del array + postulaciones[event.target.parentElement.id.split("-")[1]]=null + //eliminar en html + event.target.parentElement.remove() +} +/*--------------------------------------------------------------------*/ //evento para cambio de ciudad segun departamento diff --git a/curriculumsearch/src/main/webapp/jsp/alerts.jsp b/curriculumsearch/src/main/webapp/jsp/alerts.jsp new file mode 100644 index 0000000..173ec86 --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/alerts.jsp @@ -0,0 +1,18 @@ +<%@ 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" %> + +
    + + + + + + +
    \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/cargo-form.jsp b/curriculumsearch/src/main/webapp/jsp/cargo-form.jsp index f5b81bd..f838bc9 100644 --- a/curriculumsearch/src/main/webapp/jsp/cargo-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/cargo-form.jsp @@ -13,7 +13,7 @@
    - +
    Nombre del cargo diff --git a/curriculumsearch/src/main/webapp/jsp/cargos.jsp b/curriculumsearch/src/main/webapp/jsp/cargos.jsp new file mode 100644 index 0000000..5c6f2e9 --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/cargos.jsp @@ -0,0 +1,49 @@ +<%@ 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" %> + + + + + + + Cargo + + + + +
    +
    + + + +
    + Agregar Nuevo Cargo +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    #Cargo
    ${sta.index+1}${cargo.getNombre()}Ver ConvocatoriasEditar cargo
    +
    + + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp index 551208c..c5062a8 100644 --- a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp @@ -13,7 +13,7 @@
    - +
    Fecha inicial @@ -37,9 +37,6 @@
    - - -
    \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp b/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp index e5d7667..47703ed 100644 --- a/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp +++ b/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp @@ -30,7 +30,6 @@
    - Agregar Nuevo Cargo
    Agregar Nueva Convocatoria @@ -54,6 +53,7 @@ ${convocatoria.getFechaFin().toString().split(" ")[0]} ${convocatoria.getCupos()} Ver Postulantes + Editar @@ -61,6 +61,7 @@ +
    diff --git a/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp b/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp new file mode 100644 index 0000000..c6bead7 --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp @@ -0,0 +1,81 @@ +<%@ 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" %> + + + + + + + +

    DETALLE POSTULANTE

    +
    + +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/exitoRegistro.jsp b/curriculumsearch/src/main/webapp/jsp/exitoRegistro.jsp new file mode 100644 index 0000000..f462dbf --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/exitoRegistro.jsp @@ -0,0 +1,51 @@ +<%@ 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" %> + + + + + + +
    +
    + +
    +

    Genial!

    +

    ${mensaje1}
    ${mensaje2}

    +
    + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/header.jsp b/curriculumsearch/src/main/webapp/jsp/header.jsp new file mode 100644 index 0000000..b31d9d3 --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/header.jsp @@ -0,0 +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" %> +
    +
    + +
    +
    \ 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 b0ee919..49f9816 100644 --- a/curriculumsearch/src/main/webapp/jsp/index.jsp +++ b/curriculumsearch/src/main/webapp/jsp/index.jsp @@ -1,15 +1,27 @@ +<%@ 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" %> + + Document - Form postulante - Lista de postulantes - Tecnologias - Lista de convocatorias + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/listapostulantes.jsp b/curriculumsearch/src/main/webapp/jsp/listapostulantes.jsp new file mode 100644 index 0000000..22fe8ab --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/listapostulantes.jsp @@ -0,0 +1,44 @@ +<%@ 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" %> + + + + + + + +
    + ${postulante.id}
    + ${postulante.nombre}
    + ${postulante.apellido}
    + ${postulante.ci}
    + ${postulante.correo}
    + ${postulante.ciudadId}
    + ${postulante.telefono}
    + ${postulante.fechaNacimiento}
    + ${postulante.resumen}
    + ${postulante.nivelIngles}
    + ${postulante.curriculum}
    + ${postulante.estadoCivil}
    + ${postulante.nacionalidad}
    + ${postulante.tipoDocumento}
    + ${postulante.disponibilidad}


    + + ${postulante.getCiudad().getNombre()}
    + + + + + + + ${detalle_tecnologia.getTecnologia().getNombre()} + + +
    + + + + + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/login.jsp b/curriculumsearch/src/main/webapp/jsp/login.jsp new file mode 100644 index 0000000..11e5c13 --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/login.jsp @@ -0,0 +1,51 @@ +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + + + + + Login + + + + + + +
    +
    +
    +
    +
    +
    + + + + +

    Ingresar

    +
    + + +
    + +
    + + +
    + + + +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + diff --git a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp index 35731c8..82081b3 100644 --- a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp @@ -15,7 +15,7 @@ + +
    +
    +
    +
    +
    + Sample photo +
    +

    Informacion de Registro

    + + +
    + Email + +
    +
    +
    +
    + Nombre + +
    +
    +
    +
    + Apellido + +
    +
    +
    + +
    + Contrasena + +
    +
    +
    + +
    + + +
    + +
    +
    + + +
    + +
    +
    +
    +
    +
    +
    + + diff --git a/curriculumsearch/src/main/webapp/jsp/tecnologia-form.jsp b/curriculumsearch/src/main/webapp/jsp/tecnologia-form.jsp new file mode 100644 index 0000000..caceeea --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/tecnologia-form.jsp @@ -0,0 +1,39 @@ +<%@ 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" %> + + + + + + + + + + + Hello, world! + + + + + + + + + + name: + + + + + + + + + + + + \ No newline at end of file diff --git a/curriculumsearch/src/main/webapp/jsp/tecnologias.jsp b/curriculumsearch/src/main/webapp/jsp/tecnologias.jsp new file mode 100644 index 0000000..975ce1b --- /dev/null +++ b/curriculumsearch/src/main/webapp/jsp/tecnologias.jsp @@ -0,0 +1,49 @@ +<%@ 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" %> + + + + + + + Tecnologia + + + + +
    +
    + + + +
    + Agregar Nueva Tecnologia +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    #Tecnologia
    ${sta.index+1}${tecnologia.getNombre()}Editar tecnologia
    +
    + + + \ No newline at end of file