Commit 27bb7a94 by Joaquin Elias Baranda Ayala

Actualizacion de duplicados Get and Set

parents c2acb8da 78c12fed
File mode changed from 100644 to 100755
...@@ -49,28 +49,28 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -49,28 +49,28 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
http http
// .csrf().disable() // .csrf().disable()
.authorizeRequests() .authorizeRequests()
.antMatchers("/").authenticated() .mvcMatchers("/").authenticated()
.antMatchers("/home").authenticated() .mvcMatchers("/home").authenticated()
.antMatchers("/cargo*").authenticated() .mvcMatchers("/cargo*").authenticated()
.antMatchers("/convocatoria*").authenticated() .mvcMatchers("/convocatoria*").authenticated()
.antMatchers("/tecnologia*").authenticated() .mvcMatchers("/tecnologia*").authenticated()
.antMatchers("/postulantes").authenticated() .mvcMatchers("/postulantes","/postulantes/**").authenticated()
.antMatchers("/edit-user-data").authenticated() .mvcMatchers("/edit-user-data").authenticated()
.anyRequest().permitAll() .anyRequest().permitAll()
.and() .and()
.formLogin() .formLogin()
.loginPage("/login") .loginPage("/login")
.usernameParameter("email") .usernameParameter("email")
.defaultSuccessUrl("/home") .defaultSuccessUrl("/home")
.permitAll() .permitAll()
.and() .and()
.logout() .logout()
.logoutUrl("/logout") .logoutUrl("/logout")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")) .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET"))
.clearAuthentication(true) .clearAuthentication(true)
.invalidateHttpSession(true) .invalidateHttpSession(true)
.deleteCookies("JSESSIONID", "remember-me") .deleteCookies("JSESSIONID", "remember-me")
.logoutSuccessUrl("/login"); .logoutSuccessUrl("/login");
} }
} }
\ No newline at end of file
...@@ -3,10 +3,13 @@ package com.roshka.controller; ...@@ -3,10 +3,13 @@ package com.roshka.controller;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import com.roshka.modelo.Cargo;
import com.roshka.modelo.ConvocatoriaCargo; import com.roshka.modelo.ConvocatoriaCargo;
import com.roshka.repositorio.CargoRepository; import com.roshka.repositorio.CargoRepository;
import com.roshka.repositorio.ConvocatoriaRepository; 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.jpa.TypedParameterValue;
import org.hibernate.type.IntegerType; import org.hibernate.type.IntegerType;
import org.hibernate.type.LongType; import org.hibernate.type.LongType;
...@@ -49,24 +52,48 @@ public class ConvocatoriaController { ...@@ -49,24 +52,48 @@ public class ConvocatoriaController {
@RequestMapping(path = {"/convocatoria","/convocatoria/{id}"}) @RequestMapping(path = {"/convocatoria","/convocatoria/{id}"})
public String formConvocatoria(Model model,@PathVariable(required = false) Long id) { public String formConvocatoria(Model model,@PathVariable(required = false) Long id) {
model.addAttribute("cargos", cargoRepo.findAll()); 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 { else {
ConvocatoriaCargo cc = convoRepo.getById(id); ConvocatoriaCargo cc = convoRepo.getById(id);
cc.setFechaFinS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaFin()))); cc.setFechaFinS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaFin())));
cc.setFechaInicioS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaInicio()))); cc.setFechaInicioS(new SimpleDateFormat("yyyy-MM-dd").format((cc.getFechaInicio())));
model.addAttribute("convocatoria", cc); model.addAttribute("convocatoria", cc);
model.addAttribute("listaConvocatoria", convoRepo.findAll());
} }
return "convocatoria-form"; return "convocatoria-form";
} }
@PostMapping(path = {"/convocatoria","/convocatoria/{id}"}) @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(result.hasErrors());
if(id != null) convocatoria.setId(id); if(id != null) convocatoria.setId(id);
convoRepo.save(convocatoria); //System.out.println(convoRepo.filtrarConvocatoriasPorCargo(convocatoria.getCargoId()));
System.out.println(convocatoria.getFechaInicio()); 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"; return "redirect:/convocatorias";
} }
} }
package com.roshka.controller; package com.roshka.controller;
import java.util.ArrayList; import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import com.roshka.DTO.PostulanteListaDTO;
import com.roshka.modelo.*; import com.roshka.modelo.*;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.roshka.modelo.Disponibilidad; import com.roshka.modelo.Disponibilidad;
import com.roshka.modelo.EstadoPostulante;
import com.roshka.modelo.EstadoCivil; import com.roshka.modelo.EstadoCivil;
import com.roshka.modelo.Nacionalidad; import com.roshka.modelo.Nacionalidad;
import com.roshka.modelo.Postulante; import com.roshka.modelo.Postulante;
...@@ -27,26 +23,22 @@ import com.roshka.repositorio.ExperienciaRepository; ...@@ -27,26 +23,22 @@ import com.roshka.repositorio.ExperienciaRepository;
import com.roshka.repositorio.InstitucionRepository; import com.roshka.repositorio.InstitucionRepository;
import com.roshka.repositorio.PostulanteRepository; import com.roshka.repositorio.PostulanteRepository;
import com.roshka.repositorio.TecnologiaRepository; import com.roshka.repositorio.TecnologiaRepository;
import com.roshka.utils.Helper;
import org.hibernate.jpa.TypedParameterValue; import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.type.StringType;
import org.hibernate.type.IntegerType; import org.hibernate.type.IntegerType;
import org.hibernate.type.LongType; import org.hibernate.type.LongType;
import org.springframework.beans.factory.annotation.Autowired; 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.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; 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.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*; 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 @Controller
...@@ -59,7 +51,7 @@ public class PostulanteController { ...@@ -59,7 +51,7 @@ public class PostulanteController {
CiudadRepository ciuRepo; CiudadRepository ciuRepo;
EstudioRepository estudioRepository; EstudioRepository estudioRepository;
PostulanteTecnologiaRepository postulanteTecnologiaRepository; PostulanteTecnologiaRepository postulanteTecnologiaRepository;
ConvocatoriaRepository cargoRepo; ConvocatoriaRepository convoRepo;
CargoRepository carRepo; CargoRepository carRepo;
@Autowired @Autowired
...@@ -68,7 +60,7 @@ public class PostulanteController { ...@@ -68,7 +60,7 @@ public class PostulanteController {
InstitucionRepository institucionRepository, DepartamentoRepository depRepo, InstitucionRepository institucionRepository, DepartamentoRepository depRepo,
CiudadRepository ciuRepo, EstudioRepository estudioRepository, CiudadRepository ciuRepo, EstudioRepository estudioRepository,
PostulanteTecnologiaRepository postulanteTecnologiaRepository, PostulanteTecnologiaRepository postulanteTecnologiaRepository,
ConvocatoriaRepository cargoRepo, CargoRepository carRepo) { ConvocatoriaRepository convoRepo, CargoRepository carRepo) {
this.post = post; this.post = post;
this.tecRepo = tecRepo; this.tecRepo = tecRepo;
this.expRepo = expRepo; this.expRepo = expRepo;
...@@ -77,52 +69,12 @@ public class PostulanteController { ...@@ -77,52 +69,12 @@ public class PostulanteController {
this.ciuRepo = ciuRepo; this.ciuRepo = ciuRepo;
this.estudioRepository = estudioRepository; this.estudioRepository = estudioRepository;
this.postulanteTecnologiaRepository = postulanteTecnologiaRepository; this.postulanteTecnologiaRepository = postulanteTecnologiaRepository;
this.cargoRepo =cargoRepo; this.convoRepo =convoRepo;
this.carRepo=carRepo; 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<Postulante> postulantesPag = post.postulantesMultiFiltro(nombre == null || nombre.trim().isEmpty() ? new TypedParameterValue(StringType.INSTANCE,null) : new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId);
List<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> postulantesDTO = new ArrayList<>();
for (Postulante postulante : postulantes) {
long expTotal = 0;
//Sumamos el tiempo de experiencia total en meses de cada postulante
//expTotal = postulante.getExperiencias().stream().mapToLong(e -> Helper.getMonthsDifference(e.getFechaDesde(), e.getFechaHasta())).sum();
for (Experiencia experiencia : postulante.getExperiencias()) {
expTotal += Helper.getMonthsDifference(experiencia.getFechaDesde(), experiencia.getFechaHasta());
}
if(expInMonths != null && expInMonths > expTotal) continue;
postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
}
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){ public String getFormPostulante(Model model){
model.addAttribute("tecnologias", tecRepo.findAll()); model.addAttribute("tecnologias", tecRepo.findAll());
model.addAttribute("disponibilidades", Disponibilidad.values()); model.addAttribute("disponibilidades", Disponibilidad.values());
...@@ -131,7 +83,7 @@ public class PostulanteController { ...@@ -131,7 +83,7 @@ public class PostulanteController {
model.addAttribute("estadosCiviles", EstadoCivil.values()); model.addAttribute("estadosCiviles", EstadoCivil.values());
model.addAttribute("nacionalidades", Nacionalidad.values()); model.addAttribute("nacionalidades", Nacionalidad.values());
model.addAttribute("tiposExperencia", TipoExperiencia.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 { try {
model.addAttribute("ciudades", new ObjectMapper().writeValueAsString(ciuRepo.findAll())); model.addAttribute("ciudades", new ObjectMapper().writeValueAsString(ciuRepo.findAll()));
} catch (JsonProcessingException er) { } catch (JsonProcessingException er) {
...@@ -142,42 +94,86 @@ public class PostulanteController { ...@@ -142,42 +94,86 @@ public class PostulanteController {
return "postulante-form"; return "postulante-form";
} }
@PostMapping(value = "/postulante",consumes = "application/json") /* @PostMapping("/uploadCVPostulante")
public String guardarPostulante(@RequestBody Postulante postulante){ 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 //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){ if(postulantex != null){
postulante.setEstadoPostulante(postulantex.getEstadoPostulante());
postulante.setComentarioRRHH(postulantex.getComentarioRRHH());
estudioRepository.findByPostulante(postulantex).forEach(x -> estudioRepository.delete(x)); estudioRepository.findByPostulante(postulantex).forEach(x -> estudioRepository.delete(x));
expRepo.findByPostulante(postulantex).forEach(x -> expRepo.delete(x)); expRepo.findByPostulante(postulantex).forEach(x -> expRepo.delete(x));
postulanteTecnologiaRepository.findByPostulante(postulantex).forEach(x -> postulanteTecnologiaRepository.delete(x)); postulanteTecnologiaRepository.findByPostulante(postulantex).forEach(x -> postulanteTecnologiaRepository.delete(x));
postulante.setId(postulantex.getId()); postulante.setId(postulantex.getId());
} else{
postulante.setEstadoPostulante(EstadoPostulante.NUEVO);
postulante.setComentarioRRHH(null);
} }
postulante.getTecnologias().stream().filter( if(file!=null){
tec -> tec.getTecnologia().getId() != 0 DBFile cv = createFile(file);
).forEach( if(cv!=null) cv.setPostulante(postulante);
tec -> tec.setTecnologia(tecRepo.getById(tec.getTecnologia().getId())) postulante.setCvFile(cv);
); }
/* for (int i = 0; i < postulante.getPostulaciones().size(); i++) { postulante.getTecnologias().stream().filter(tec -> tec.getTecnologia().getId() != 0)
postulante.getPostulaciones().set(i, cargoRepo.getById(postulante.getPostulaciones().get(i).getId())); .forEach(tec -> tec.setTecnologia(tecRepo.getById(tec.getTecnologia().getId())));
}
*/
for(Estudio estudio: postulante.getEstudios()){ for(Estudio estudio: postulante.getEstudios()){
String nombreIns = ""; String nombreIns = "";
nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); nombreIns = estudio.getInstitucion().getNombre().toLowerCase();
Institucion institucion = institucionRepository.findByNombre(nombreIns); Institucion institucion = institucionRepository.findByNombre(nombreIns);
if(institucion==null){ if(institucion==null){
institucionRepository.save(estudio.getInstitucion()); institucionRepository.save(estudio.getInstitucion());
}else{ }else{
estudio.setInstitucion(institucion); estudio.setInstitucion(institucion);
}
}
post.save(postulante);
return "redirect:/postulacion-correcta";
} }
}
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){ public String successPostulation(Model model){
model.addAttribute("mensaje1", "Tu informacion se ha recibido correctamente!"); model.addAttribute("mensaje1", "Tu informacion se ha recibido correctamente!");
model.addAttribute("mensaje2", " espera por que nos pongamos en contacto!"); model.addAttribute("mensaje2", " espera por que nos pongamos en contacto!");
...@@ -202,23 +198,6 @@ public class PostulanteController { ...@@ -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
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<Postulante> postulantesPag = post.postulantesMultiFiltro(nombre == null || nombre.trim().isEmpty() ? new TypedParameterValue(StringType.INSTANCE,null) : new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId);
List<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> postulantesDTO = new ArrayList<>();
for (Postulante postulante : postulantes) {
long expTotal = 0;
//Sumamos el tiempo de experiencia total en meses de cada postulante
//expTotal = postulante.getExperiencias().stream().mapToLong(e -> Helper.getMonthsDifference(e.getFechaDesde(), e.getFechaHasta())).sum();
for (Experiencia experiencia : postulante.getExperiencias()) {
expTotal += Helper.getMonthsDifference(experiencia.getFechaDesde(), experiencia.getFechaHasta());
}
if(expInMonths != null && expInMonths > expTotal) continue;
postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
}
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<Resource> 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
...@@ -67,17 +67,21 @@ public class RRHHUserController { ...@@ -67,17 +67,21 @@ public class RRHHUserController {
} }
@PostMapping("/process_register") @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){ if(Long.parseLong(request.getParameter("registrationCode")) != REGISTER_CODE){
return "redirect:/register"; redirectAttributes.addFlashAttribute("error", "Codigo Incorrecto");
return redirectView;
} }
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(user.getPassword()); String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword); user.setPassword(encodedPassword);
rrhhUserRepository.save(user); rrhhUserRepository.save(user);
redirectView.setUrl("/login");
return "register_success"; redirectAttributes.addFlashAttribute("success", "Registro Correcto");
return redirectView;
} }
@GetMapping("/edit-user-data") @GetMapping("/edit-user-data")
......
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;
}
}
...@@ -72,8 +72,6 @@ public class Postulante { ...@@ -72,8 +72,6 @@ public class Postulante {
@Max(value = 5) @Max(value = 5)
private Long nivelIngles; private Long nivelIngles;
@Column(name = "curriculum")
private String curriculum;
@Column(name="estado_civil") @Column(name="estado_civil")
@NotNull @NotNull
...@@ -121,110 +119,19 @@ public class Postulante { ...@@ -121,110 +119,19 @@ public class Postulante {
) )
private List<ConvocatoriaCargo> postulaciones; private List<ConvocatoriaCargo> 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) { public void setFechaNacimiento(String fechaNacimiento) {
this.fechaNacimiento = Helper.convertirFecha(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<PostulanteTecnologia> getTecnologias() {
return tecnologias;
}
public void setTecnologias(List<PostulanteTecnologia> tecnologias) {
this.tecnologias = tecnologias;
}
public List<Estudio> getEstudios() {
return estudios;
}
public void setEstudios(List<Estudio> estudios) {
this.estudios = estudios;
}
public List<Experiencia> getExperiencias() {
return experiencias;
}
public void setExperiencias(List<Experiencia> experiencias) {
this.experiencias = experiencias;
}
public List<ConvocatoriaCargo> getPostulaciones() {
return postulaciones;
}
public void setPostulaciones(List<ConvocatoriaCargo> postulaciones) {
this.postulaciones = postulaciones;
}
public void setReferencias(List<ReferenciaPersonal> referencias) {
this.referencias = referencias;
}
public List<ReferenciaPersonal> 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;
}
} }
...@@ -15,4 +15,7 @@ public interface ConvocatoriaRepository extends JpaRepository<ConvocatoriaCargo, ...@@ -15,4 +15,7 @@ public interface ConvocatoriaRepository extends JpaRepository<ConvocatoriaCargo,
//public List<ConvocatoriaCargo> findConvocatoriaCargoByCargo(Date fechaFinal); //public List<ConvocatoriaCargo> 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) )") @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<ConvocatoriaCargo> f1ndByCargoAndEstado(TypedParameterValue cargoId, Date fecha, TypedParameterValue isOpen); public List<ConvocatoriaCargo> f1ndByCargoAndEstado(TypedParameterValue cargoId, Date fecha, TypedParameterValue isOpen);
@Query("SELECT c FROM ConvocatoriaCargo c WHERE (cargoId=?1)")
public List<ConvocatoriaCargo> filtrarConvocatoriasPorCargo(Long cargoId);
} }
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<DBFile, String> {
@Query("select db.id from DBFile db where db.postulante = ?1")
public String getIdByPostulante(Postulante postulante);
}
\ No newline at end of file
...@@ -80,4 +80,8 @@ public interface PostulanteRepository extends JpaRepository<Postulante,Long> { ...@@ -80,4 +80,8 @@ public interface PostulanteRepository extends JpaRepository<Postulante,Long> {
@Query("UPDATE Postulante p SET p.comentarioRRHH = ?1 WHERE p.id = ?2") @Query("UPDATE Postulante p SET p.comentarioRRHH = ?1 WHERE p.id = ?2")
void setPostulanteEstadoComentario( String comentario, Long Id);*/ 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<Postulante> obtenerPostulantesPorCarrera(String carrera);
} }
...@@ -26,3 +26,13 @@ spring.mail.properties.mail.smtp.starttls.enable=true ...@@ -26,3 +26,13 @@ spring.mail.properties.mail.smtp.starttls.enable=true
jsp-inheritance-prefix=/jsp/layouts/ jsp-inheritance-prefix=/jsp/layouts/
jsp-inheritance-suffix=.jsp 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
...@@ -49,7 +49,25 @@ function agregarFieldExpierncia(event){ ...@@ -49,7 +49,25 @@ function agregarFieldExpierncia(event){
//recoger del form //recoger del form
const pairs = {}; const pairs = {};
const formexp = document.querySelector("[name=experiencia-form]"); const formexp = document.querySelector("[name=experiencia-form]");
formexp.classList.add('was-validated')
const formData = new FormData(formexp); 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 = [{},{},{}]; const reconocimientos = [{},{},{}];
let pos_rec; let pos_rec;
let returnFlag = false; let returnFlag = false;
...@@ -87,27 +105,53 @@ function agregarFieldExpierncia(event){ ...@@ -87,27 +105,53 @@ function agregarFieldExpierncia(event){
pairs["reconocimientos"] = reconocimientos.filter(rec => rec.nombre); pairs["reconocimientos"] = reconocimientos.filter(rec => rec.nombre);
experiencias[cont_experiencia] = pairs; experiencias[cont_experiencia] = pairs;
formexp.reset(); formexp.reset();
formexp.classList.remove('was-validated')
//imprimir lista actualizada //imprimir lista actualizada
const div = document.querySelector("#experiencias") const div = document.querySelector("#experiencias")
const div1 = document.createElement('div'); const div1 = document.createElement('div');
let content='<ul>'
let content='';
for (let index = 0; index < experiencias.length; index++) { for (let index = 0; index < experiencias.length; index++) {
const exp = experiencias[index]; const exp = experiencias[index];
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<li id="exp-${index}"> <div class="col border border-3" id="exp-${index}">
${exp.institucion} <h4><center>Experiencia</center></h4>
<button type="button" onclick="eliminarExperiencia(event)"> <span class="glyphicon glyphicon-trash"></span> Eliminar</button> <label><b>Institucion:</b> ${exp.institucion}</label><br>
</li> <label><b>Fecha Inicio:</b> ${exp.fechaDesde}</label><br>
<label><b>Fecha Fin:</b> ${exp.fechaHasta}</label><br>
<label><b>Referencia:</b> ${exp.nombreReferencia}</label><br>
<label><b>Telefono de la referencia:</b> ${exp.telefonoReferencia}</label><br>
<label><b>Cargo:</b> ${exp.cargo}</label><br>
<label><b>Motivo de salida:</b> ${exp.motivoSalida}</label><br>
<button type="button" class="btn btn-primary" onclick="eliminarExperiencia(event)"> <span class="glyphicon glyphicon-trash"></span>Eliminar</button>
</div>
` `
} }
content += "</ul>" //content += "</ul>"
div1.innerHTML = content div.innerHTML = content
div.innerHTML = ''; //div.innerHTML = '';
div.appendChild(div1); //div.appendChild(div1);
cont_experiencia++; 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(){ function agregarFieldTecnologia(){
//recoger del form //recoger del form
...@@ -152,24 +196,26 @@ function agregarFieldTecnologia(){ ...@@ -152,24 +196,26 @@ function agregarFieldTecnologia(){
const div1 = document.createElement('div'); const div1 = document.createElement('div');
console.log(tecnologias[0]) console.log(tecnologias[0])
let content1='<ul>' let content1=''
for (let index = 0; index < tecnologias.length; index++) { for (let index = 0; index < tecnologias.length; index++) {
const tecn = tecnologias[index]; const tecn = tecnologias[index];
if(tecn==null) continue; if(tecn==null) continue;
content1 += ` content1 += `
<li id="tecn-${index}"> <div class="col border border-3" id="tecn-${index}">
${tecn.tecnologia.nombre} <label>${tecn.tecnologia.nombre}</label><br>
<button type="button" onclick="eliminarTecnologia(event)">Eliminar</button> <label><progress value="${tecn.nivel}" max="5"></progress></label> <br>
<button type="button" class="btn btn-primary" onclick="eliminarTecnologia(event)">Eliminar</button>
<br> <br>
</li> </div>
` `
} }
content1 += "</ul>" //content1 += "</ul>"
div1.innerHTML = content1 div.innerHTML = content1
div.innerHTML = ''; //div.innerHTML = '';
div.appendChild(div1); //div.appendChild(div1);
cont_tecnologia++; cont_tecnologia++;
document.querySelector("#no-valid-tecno").style.display = "none";
} }
...@@ -192,6 +238,15 @@ function serializeJSON (form) { ...@@ -192,6 +238,15 @@ function serializeJSON (form) {
// Create a new FormData object // Create a new FormData object
const formData = new FormData(form); 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 // Create an object to hold the name/value pairs
const pairs = {}; const pairs = {};
...@@ -205,12 +260,34 @@ function serializeJSON (form) { ...@@ -205,12 +260,34 @@ function serializeJSON (form) {
pairs["tecnologias"] = tecnologias.filter(tec => tec)//eliminacion de nulos pairs["tecnologias"] = tecnologias.filter(tec => tec)//eliminacion de nulos
pairs["postulaciones"] = postulaciones.filter(car => car)//eliminacion de nulos pairs["postulaciones"] = postulaciones.filter(car => car)//eliminacion de nulos
pairs["referencias"] = referencias.filter(tec => tec) 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 the JSON string
return JSON.stringify(pairs, null, 2); return JSON.stringify(pairs, null, 2);
} }
function obtenerCV(){
let input = document.querySelector('#cvFile')
return input.files[0];
}
async function postData(url = '', data = {}) { async function postData(url = '', data = {}) {
var token = document.querySelector("meta[name='_csrf']").content; var token = document.querySelector("meta[name='_csrf']").content;
var headerxs = document.querySelector("meta[name='_csrf_header']").content; var headerxs = document.querySelector("meta[name='_csrf_header']").content;
...@@ -221,7 +298,7 @@ async function postData(url = '', data = {}) { ...@@ -221,7 +298,7 @@ async function postData(url = '', data = {}) {
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, *same-origin, omit credentials: 'same-origin', // include, *same-origin, omit
headers: { headers: {
'Content-Type': 'application/json', //'Content-Type': undefined//'application/json',
// 'Content-Type': 'application/x-www-form-urlencoded', // 'Content-Type': 'application/x-www-form-urlencoded',
}, },
redirect: 'follow', // manual, *follow, error redirect: 'follow', // manual, *follow, error
...@@ -229,9 +306,22 @@ async function postData(url = '', data = {}) { ...@@ -229,9 +306,22 @@ async function postData(url = '', data = {}) {
body: data // body data type must match "Content-Type" header body: data // body data type must match "Content-Type" header
} }
senddata["headers"][headerxs] = token; 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 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() formValidator()
form = document.querySelector("form"); form = document.querySelector("form");
form.addEventListener("submit",(evt)=>{ form.addEventListener("submit",(evt)=>{
...@@ -240,8 +330,11 @@ form.addEventListener("submit",(evt)=>{ ...@@ -240,8 +330,11 @@ form.addEventListener("submit",(evt)=>{
// evt.stopPropagation() // evt.stopPropagation()
// } // }
// form.classList.add('was-validated') // form.classList.add('was-validated')
evt.preventDefault();
let formSerialized = serializeJSON(form);
let fileCV = obtenerCV();
if(!noValidateFlag){ if(!noValidateFlag){
postData('postulante', serializeJSON(form)) postData('work-with-us', formatearJsonWithFile(formSerialized,fileCV))
.then(response => { .then(response => {
if(response.status==200 || response.status==302){ if(response.status==200 || response.status==302){
location.replace(response.url); location.replace(response.url);
...@@ -249,12 +342,10 @@ form.addEventListener("submit",(evt)=>{ ...@@ -249,12 +342,10 @@ form.addEventListener("submit",(evt)=>{
console.log(response.text().then(value => console.log(value))) console.log(response.text().then(value => console.log(value)))
} }
}); });
evt.preventDefault(); }
}
noValidateFlag = false noValidateFlag = false
} ); } );
document.querySelector("#btn-new-tech").addEventListener('click',()=>{document.querySelector("#tecnologia-nombre").classList.remove('d-none')})
//Metodos para Estudios //Metodos para Estudios
...@@ -315,23 +406,29 @@ function agregarFieldEstudio(){ ...@@ -315,23 +406,29 @@ function agregarFieldEstudio(){
//imprimir lista actualizada //imprimir lista actualizada
const div = document.querySelector("#estudios") const div = document.querySelector("#estudios")
const div1 = document.createElement('div'); const div1 = document.createElement('div');
let content='<ul>' let content='';
for (let index = 0; index < estudios.length; index++) { for (let index = 0; index < estudios.length; index++) {
const est = estudios[index]; const est = estudios[index];
if(est==null) continue; if(est==null) continue;
content += ` content += `
<li id="est-${index}"> <div class="col border border-3" id="est-${index}">
${est.institucion.nombre} <h4><center>Estudio</center></h4>
<button type="button" onclick="eliminarEstudio(event)">Eliminar</button> <label><b>Institucion:</b> ${est.institucion.nombre}</label><br>
</li> <label><b>Tipo de estudio:</b> ${est.tipoDeEstudio}</label><br>
<label><b>Carrera:</b> ${est.temaDeEstudio}</label><br>
<label><b>Fecha Inicio:</b> ${est.fechaDesde}</label><br>
<label><b>Fecha Fin:</b> ${est.fechaHasta}</label><br>
<label><b>Estado:</b> ${est.estado}</label><br>
<button type="button" class="btn btn-primary" onclick="eliminarEstudio(event)">Eliminar</button>
</div>
` `
} }
content += "</ul>"
div1.innerHTML = content div.innerHTML = content
div.innerHTML = ''; //div.innerHTML = '';
div.appendChild(div1); //div.appendChild(div1);
cont_estudios++; cont_estudios++;
} }
...@@ -384,7 +481,7 @@ function agregarFieldCargo(){ ...@@ -384,7 +481,7 @@ function agregarFieldCargo(){
if(postulaciones[i]!==null){ if(postulaciones[i]!==null){
if(postulaciones[i]["id"]===pairs["cargo-id"]){ if(postulaciones[i]["id"]===pairs["cargo-id"]){
alert("Ya has agregado ese cargo!") alert("Ya has agregado ese cargo!")
cont_cargo--; //cont_cargo--;
return; return;
} }
} }
...@@ -398,23 +495,24 @@ function agregarFieldCargo(){ ...@@ -398,23 +495,24 @@ function agregarFieldCargo(){
const div = document.querySelector("#cargos") const div = document.querySelector("#cargos")
const div1 = document.createElement('div'); const div1 = document.createElement('div');
let content1='<ul>' let content1=''
for (let index = 0; index < postulaciones.length; index++) { for (let index = 0; index < postulaciones.length; index++) {
const car = postulaciones[index]; const car = postulaciones[index];
if(car==null) continue; if(car==null) continue;
content1 += ` content1 += `
<li id="car-${index}"> <div class="col border border-3" id="car-${index}" style="text-transform: uppercase;">
${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} <label>${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML}</label><br>
<button type="button" onclick="eliminarCargoPostulante(event)">Eliminar</button> <button type="button" class="btn btn-primary" onclick="eliminarCargoPostulante(event)">Eliminar</button><br>
</li> </div>
` `
} }
content1 += "</ul>" //content1 += "</ul>"
div1.innerHTML = content1 div.innerHTML = content1
div.innerHTML = ''; //div.innerHTML = '';
div.appendChild(div1); //div.appendChild(div1);
cont_cargo++; cont_cargo++;
document.querySelector("#no-valid-cargo").style.display = "none";
} }
/*---------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------*/
...@@ -499,22 +597,25 @@ function agregarFieldReferencia(event){ ...@@ -499,22 +597,25 @@ function agregarFieldReferencia(event){
//imprimir lista actualizada //imprimir lista actualizada
const div = document.querySelector("#referencia") const div = document.querySelector("#referencia")
const div1 = document.createElement('div'); const div1 = document.createElement('div');
let content='<ul>' let content=''
for (let index = 0; index < referencias.length; index++) { for (let index = 0; index < referencias.length; index++) {
const exp = referencias[index]; const exp = referencias[index];
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<li id="exp-${index}"> <div class="col border border-3" id="exp-${index}">
${exp.nombre} <h4><center>Referencia Personal</center></h4>
<button type="button" onclick="eliminarReferencia(event)"> <span class="glyphicon glyphicon-trash"></span> Tras</button> <label><b>Nombre:</b> ${exp.nombre}</label><br>
</li> <label><b>Telefono:</b> ${exp.telefono}</label><br>
<label><b>Relacion:</b> ${exp.relacion}</label><br>
<button type="button" class="btn btn-primary" onclick="eliminarReferencia(event)"> <span class="glyphicon glyphicon-trash"></span>Eliminar</button>
</div>
` `
} }
content += "</ul>" //content += "</ul>"
div1.innerHTML = content div.innerHTML = content
div.innerHTML = ''; //div.innerHTML = '';
div.appendChild(div1); //div.appendChild(div1);
cont_referencias++; cont_referencias++;
} }
...@@ -530,60 +631,57 @@ function eliminarReferencia(event) { ...@@ -530,60 +631,57 @@ function eliminarReferencia(event) {
/*--------------------------------------------------------------------------------------------------------- */ /*--------------------------------------------------------------------------------------------------------- */
$(function(){ // $(function(){
$("#wizard").steps({ // $("#wizard").steps({
headerTag: "h4", // headerTag: "h4",
bodyTag: "section", // bodyTag: "section",
transitionEffect: "fade", // transitionEffect: "fade",
enableAllSteps: true, // enableAllSteps: true,
transitionEffectSpeed: 500, // transitionEffectSpeed: 500,
onStepChanging: function (event, currentIndex, newIndex) { // onStepChanging: function (event, currentIndex, newIndex) {
if ( newIndex === 1 ) { // if ( newIndex === 1 ) {
$('.steps ul').addClass('step-2'); // $('.steps ul').addClass('step-2');
} else { // } else {
$('.steps ul').removeClass('step-2'); // $('.steps ul').removeClass('step-2');
} // }
if ( newIndex === 2 ) { // if ( newIndex === 2 ) {
$('.steps ul').addClass('step-3'); // $('.steps ul').addClass('step-3');
} else { // } else {
$('.steps ul').removeClass('step-3'); // $('.steps ul').removeClass('step-3');
} // }
//
if ( newIndex === 3 ) { // if ( newIndex === 3 ) {
$('.steps ul').addClass('step-4'); // $('.steps ul').addClass('step-4');
$('.actions ul').addClass('step-last'); // $('.actions ul').addClass('step-last');
} else { // } else {
$('.steps ul').removeClass('step-4'); // $('.steps ul').removeClass('step-4');
$('.actions ul').removeClass('step-last'); // $('.actions ul').removeClass('step-last');
} // }
return true; // return true;
}, // },
labels: { // labels: {
finish: "Order again", // finish: "Order again",
next: "Next", // next: "Next",
previous: "Previous" // previous: "Previous"
} // }
}); // });
// Custom Steps Jquery Steps // // Custom Steps Jquery Steps
$('.wizard > .steps li a').click(function(){ // $('.wizard > .steps li a').click(function(){
$(this).parent().addClass('checked'); // $(this).parent().addClass('checked');
$(this).parent().prevAll().addClass('checked'); // $(this).parent().prevAll().addClass('checked');
$(this).parent().nextAll().removeClass('checked'); // $(this).parent().nextAll().removeClass('checked');
}); // });
// Custom Button Jquery Steps // // Custom Button Jquery Steps
$('.forward').click(function(){ // $('.forward').click(function(){
$("#wizard").steps('next'); // $("#wizard").steps('next');
}) // })
$('.backward').click(function(){ // $('.backward').click(function(){
$("#wizard").steps('previous'); // $("#wizard").steps('previous');
}) // })
// Checkbox // // Checkbox
$('.checkbox-circle label').click(function(){ // $('.checkbox-circle label').click(function(){
$('.checkbox-circle label').removeClass('active'); // $('.checkbox-circle label').removeClass('active');
$(this).addClass('active'); // $(this).addClass('active');
}) // })
}) // })
/*--------------------------------------------------------------------------------------------------------- */ /*--------------------------------------------------------------------------------------------------------- */
\ No newline at end of file
body { body {
/* background-color: #506BEE; */ background-color: #baebd8;
background-image:url(/img/fondo.png); /* background-image:url(/img/fondo2.png); */
/*background-size:cover;*/ /*background-size:cover;*/
background-repeat:repeat; background-repeat:repeat;
height:100vh;width:100vw; height:100vh;width:100vw;
......
...@@ -9,13 +9,19 @@ ...@@ -9,13 +9,19 @@
<div class="p-3 mb-2 bg-light text-dark border border-light "> <div class="p-3 mb-2 bg-light text-dark border border-light ">
<form:form action="/convocatoria/${convocatoria.id == null ? '' : convocatoria.id}" method="post" modelAttribute="convocatoria"> <form:form action="/convocatoria/${convocatoria.id == null ? '' : convocatoria.id}" method="post" modelAttribute="convocatoria">
<div class="mb-3 col-3"> <div class="mb-3 col-3">
<form:label path="fechaInicioS" class="form-label">Fecha inicial</form:label> <form:label path="fechaInicioS" class="form-label ">Fecha inicial</form:label>
<form:input type="date" class="form-control" path="fechaInicioS" required="true"/> <form:input type="date" path="fechaInicioS" required="true" class="form-control ${ existeFecha ? 'is-invalid' : ''}" placeholder="Fecha requerida" requiered="true" />
<div id="validationServerUsernameFeedback1" class="invalid-feedback">
Esta fecha ya existe
</div>
</div> </div>
<div class="mb-3 col-3"> <div class="mb-3 col-3">
<form:label path="fechaFinS" class="form-label">Fecha Fin</form:label> <form:label path="fechaFinS" class="form-label">Fecha Fin</form:label>
<form:input type="date" class="form-control" path="fechaFinS" required="true"/> <form:input type="date" path="fechaFinS" required="true" class="form-control ${existeFecha ? 'is-invalid': '' }" placeholder="Fecha requerida" requiered="true" />
<div id="validationServerUsernameFeedback2" class="invalid-feedback">
Esta fecha ya existe
</div>
</div> </div>
<div class="mb-3 col-3"> <div class="mb-3 col-3">
<form:label path="cupos" class="form-label">Cupos:</form:label> <form:label path="cupos" class="form-label">Cupos:</form:label>
...@@ -23,7 +29,7 @@ ...@@ -23,7 +29,7 @@
</div> </div>
<div class="mb-3 col-3"> <div class="mb-3 col-3">
<form:label path="cargoId" class="form-label">Cargo</form:label> <form:label path="cargoId" class="form-label">Cargo</form:label>
<form:select class="form-select" path="cargoId" required="true"> <form:select class="form-select" path="cargoId">
<c:forEach items="${cargos}" var="cargo"> <c:forEach items="${cargos}" var="cargo">
<form:option value="${cargo.id}">${cargo.nombre} </form:option> <form:option value="${cargo.id}">${cargo.nombre} </form:option>
</c:forEach> </c:forEach>
......
...@@ -131,11 +131,18 @@ ...@@ -131,11 +131,18 @@
<hr> <hr>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#estadoModalLong">actualizar</button> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#estadoModalLong">Actualizar</button>
</div>
<div class="col">
<a class="btn btn-link " href="#">Descargar CV</a>
</div> </div>
<c:choose>
<c:when test = "${cvId != null}">
<div class="col">
<a class="btn btn-link" target="__blank" href="/postulantes/cvFile/${cvId}">Descargar CV</a>
</div>
</c:when>
</c:choose>
</div> </div>
</div> </div>
</div> </div>
...@@ -239,7 +246,7 @@ ...@@ -239,7 +246,7 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div id="carouselExampleIndicators" class="carousel carousel-dark slide" data-bs-ride="carousel"> <div id="carouselExampleIndicators1" class="carousel carousel-dark slide" data-bs-ride="carousel">
<div class="carousel-inner"> <div class="carousel-inner">
...@@ -291,11 +298,11 @@ ...@@ -291,11 +298,11 @@
</div> </div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="prev"> <button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators1" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span> <span class="visually-hidden">Previous</span>
</button> </button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="next"> <button class="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators1" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span> <span class="visually-hidden">Next</span>
</button> </button>
...@@ -358,7 +365,7 @@ ...@@ -358,7 +365,7 @@
</form:form> </form:form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
</div> </div>
<button type="submit" class="btn btn-success btn-lg mb-1">Submit</button> <button type="submit" class="btn btn-success btn-lg mb-1">Submit</button>
<a href="/home" class="btn btn-danger btn-lg mr-3 ml-3 mb-1">Volver</a>
</form:form> </form:form>
</div> </div>
......
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<header> <header>
...@@ -49,11 +52,31 @@ ...@@ -49,11 +52,31 @@
<a class="nav-link" href="/edit-user-data">Editar mis datos</a> <a class="nav-link" href="/edit-user-data">Editar mis datos</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="/logout">Salir</a> <%-- <a class="nav-link" href="/logout">Salir</a>--%>
<button type="button" class="btn btn-light" data-toggle="modal" data-target="#exampleModal">
Salir
</button>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
</header> </header>
\ No newline at end of file <!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h6 class="modal-title" id="exampleModalLabel">Esta seguro que desea salir?</h6>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<a href="/logout" class="btn btn-danger">Salir</a>
</div>
</div>
</div>
</div>
\ No newline at end of file
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<html lang="en"> <layout:extends name="layouts/base.jsp">
<head> <layout:put block="cssDeclaracion" type="REPLACE">
<meta charset="UTF-8"> <link href="../css/indexStyle.css" rel="stylesheet" type="text/css"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"> </layout:put>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>RRHH</title>
<link href="../css/indexStyle.css" rel="stylesheet" type="text/css"/>
</head> </layout:extends>
<body> \ No newline at end of file
<jsp:include page="header.jsp"/>
<jsp:include page="alerts.jsp"/>
<div class="container-xxl my-md-4 bd-layout">
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<layout:block name="cssDeclaracion"><link href="../css/cargoStyle.css" rel="stylesheet" type="text/css"/></layout:block> <layout:block name="cssDeclaracion">
<link href="../css/cargoStyle.css" rel="stylesheet" type="text/css"/>
</layout:block>
<title>RRHH</title> <title>RRHH</title>
</head> </head>
...@@ -54,7 +56,7 @@ ...@@ -54,7 +56,7 @@
Postulantes Postulantes
</a> </a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="/postulante">Agregar</a></li> <li><a class="dropdown-item" href="/work-with-us">Agregar</a></li>
<li><a class="dropdown-item" href="/postulantes">Listar</a></li> <li><a class="dropdown-item" href="/postulantes">Listar</a></li>
</ul> </ul>
</li> </li>
......
...@@ -98,8 +98,8 @@ ...@@ -98,8 +98,8 @@
<select name="ciudadId" id="ciudad" class="bg-light"> <select name="ciudadId" id="ciudad" class="bg-light">
</select> </select>
</div> </div>
<div class="inputs mb-3 col-md-6"> <div class="inputs mb-3 col-md-6">
<label for="telefono" class="form-label">Telefono</label> <label for="telefono" class="form-label">Telefono</label>
<input type="number" name="telefono" class="form-control " id="telefono" required> <input type="number" name="telefono" class="form-control " id="telefono" required>
...@@ -142,46 +142,40 @@ ...@@ -142,46 +142,40 @@
<c:forEach items="${estadosCiviles}" var="estadoCivil"> <c:forEach items="${estadosCiviles}" var="estadoCivil">
<option value="${estadoCivil.getDescripcion()}">${estadoCivil.getDescripcion()}</option> <option value="${estadoCivil.getDescripcion()}">${estadoCivil.getDescripcion()}</option>
</c:forEach> </c:forEach>
</select>
</select> </div>
<div >
<div style="color:blue" class=" inputs d-flex justify-content-between align-items-center experience"><span class="border px-3 p-1 add-experience" data-toggle="modal" data-target="#cargoForm"><i class="fa fa-plus"></i>&nbsp;Cargo al que postulas</span></div><br>
</div>
<div class="mt-3 gap-2 d-flex justify-content-between" id="cargos">
</div> </div>
<div class="inputs mb-3 col-md-4">
<div > <label for="formFile" class="form-label">Cargar cv</label>
<div style="color:blue" class=" inputs d-flex justify-content-between align-items-center experience"><span class="border px-3 p-1 add-experience" data-toggle="modal" data-target="#experienciaForm"><i class="fa fa-plus"></i>&nbsp;Agregar Experiencia</span></div><br> <input class="form-control" type="file" id="cvFile">
</div>
<div class="mt-3 gap-2 d-flex justify-content-between" id="experiencias">
</div> </div>
<!-- Button Agregar Cargo al que postulas -->
<button type="button" class="btn btn-primary"><span class="add-experience" class="btn btn-primary" data-toggle="modal" data-target="#cargoForm"><i class="fa fa-plus"></i>&nbsp;Agregar Cargo al que postulas</span></button><br>
<p id="no-valid-cargo" style="display: none; color: darkred; border: solid 1px darkred; border-radius: 25px; width: 75%" class="m-3">
*Agrega por lo menos un cargo
</p>
<div class="mt-3 gap-2 row row-cols-4" style="display: flex;" id="cargos"></div>
<!-- Button Agregar Experiencia -->
<button type="button" class="btn btn-primary"><span class="add-experience" data-toggle="modal" data-target="#experienciaForm"><i class="fa fa-plus"></i>&nbsp;Agregar Experiencia</span></button><br>
<div class="mt-3 gap-2 row row-cols-4" id="experiencias"></div>
<!-- Button Agregar Estudio -->
<div > <button type="button" class="btn btn-primary"><span class="add-experience" data-toggle="modal" data-target="#estudioForm"><i class="fa fa-plus"></i>&nbsp;Agregar Estudio</span></button><br>
<div style="color:blue" class=" inputs d-flex justify-content-between align-items-center experience"><span class="border px-3 p-1 add-experience" data-toggle="modal" data-target="#estudioForm"><i class="fa fa-plus"></i>&nbsp;Agregar Estudio</span></div><br> <div class="mt-3 gap-2 row row-cols-4" id="estudios"></div>
</div>
<div class="mt-3 gap-2 d-flex justify-content-between" id="estudios">
</div>
<!-- Button Agregar Tecnologia -->
<div > <button type="button" class="btn btn-primary"><span class="add-experience" data-toggle="modal" data-target="#tecnologiaForm"><i class="fa fa-plus"></i>&nbsp;Agregar Tecnologia</span></button><br>
<div style="color:blue" class=" inputs d-flex justify-content-between align-items-center experience"><span class="border px-3 p-1 add-experience" data-toggle="modal" data-target="#tecnologiaForm"><i class="fa fa-plus"></i>&nbsp;Agregar Tecnologia</span></div><br>
</div> <p id="no-valid-tecno" style="display: none; color: darkred; border: solid 1px darkred; border-radius: 25px; width: 75%" class="m-3">
*Agrega por lo menos una tecnologia
</p>
<div class="mt-3 gap-2 d-flex justify-content-between" id="tecnologias"> <div class="mt-3 gap-2 row row-cols-5" style="display: flex;" id="tecnologias">
</div> </div>
<div > <!-- Button Agregar Refencia personal -->
<div style="color:blue" class=" inputs d-flex justify-content-between align-items-center experience"><span class="border px-3 p-1 add-experience" data-toggle="modal" data-target="#referenciaForm"><i class="fa fa-plus"></i>&nbsp;Referencias Personales</span></div><br> <button type="button" class="btn btn-primary"><span class="add-experience" data-toggle="modal" data-target="#referenciaForm"><i class="fa fa-plus"></i>&nbsp;Agregar Referencia Personal</span></button><br>
</div> <div class="mt-3 gap-2 row row-cols-4" id="referencia"></div>
<div class="mt-3 gap-2 d-flex justify-content-between" id="referencia">
</div>
...@@ -245,12 +239,16 @@ ...@@ -245,12 +239,16 @@
<div class="inputs"> <div class="inputs">
<label for="fechaDesdeExperiencia" class="form-label">Fecha Desde</label> <label for="fechaDesdeExperiencia" class="form-label">Fecha Desde</label>
<input type="date" class="form-control" name="fechaDesde" id="fechaDesdeExperiencia" required> <input type="date" class="form-control" name="fechaDesde" id="fechaDesdeExperiencia" required>
<div class="invalid-feedback errorFechaDesde">
</div>
</div> </div>
<div class="inputs"> <div class="inputs">
<label for="fechaHastaExperiencia" class="form-label">Fecha Hasta</label> <label for="fechaHastaExperiencia" class="form-label">Fecha Hasta</label>
<input type="date" class="form-control" name="fechaHasta" id="fechaHastaExperiencia" > <input type="date" class="form-control" name="fechaHasta" id="fechaHastaExperiencia" >
</div> <div class="invalid-feedback errorfechaHasta"></div>
</div>
<div class="inputs"> <div class="inputs">
<label for="cargo" class="form-label">Cargo</label> <label for="cargo" class="form-label">Cargo</label>
...@@ -316,7 +314,6 @@ ...@@ -316,7 +314,6 @@
<option value="${tecnologia.id}">${tecnologia.nombre}</option> <option value="${tecnologia.id}">${tecnologia.nombre}</option>
</c:forEach> </c:forEach>
</select> </select>
<button class="btn btn-outline-secondary" type="button" id="btn-new-tech">Agregar nuevo</button>
</div> </div>
...@@ -466,9 +463,13 @@ ...@@ -466,9 +463,13 @@
let fechaDesdeExperiencia = document.querySelector("#fechaDesdeExperiencia"); let fechaDesdeExperiencia = document.querySelector("#fechaDesdeExperiencia");
let fechaHastaEstudio = document.querySelector("#fechaHastaEstudio"); let fechaHastaEstudio = document.querySelector("#fechaHastaEstudio");
let fechaHastaExperiencia = document.querySelector("#fechaHastaExperiencia"); 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); fechaDesdeEstudio.setAttribute("max", today);
fechaDesdeExperiencia.setAttribute("max", today); fechaDesdeExperiencia.setAttribute("max", today);
fechaNacimiento.setAttribute("max", today);
fechaDesdeExperiencia.addEventListener("change", ()=>{ fechaDesdeExperiencia.addEventListener("change", ()=>{
fechaHastaExperiencia.setAttribute("min", fechaDesdeExperiencia.value) fechaHastaExperiencia.setAttribute("min", fechaDesdeExperiencia.value)
......
...@@ -8,112 +8,218 @@ ...@@ -8,112 +8,218 @@
<h2>Lista de Postulantes</h2> <h2>Lista de Postulantes</h2>
<div id="buscador"> <div id="buscador">
<form name="buscador"> <form name="buscador">
<label for="nombre">Nombre</label> <div class="row justify-content-start gy-2">
<input type="text" name="nombre" id="nombre" value="${param.nombre}">
<button>Buscar</button> <div class="col-auto">
<br> <input type="text" placeholder="Nombre" name="nombre" id="nombre" class="form-control" value="${param.nombre}">
<label for="estado">Estado</label> </div>
<select name="estado" id="estado"> <div class="col-auto">
<option value="">Seleccione una opcion</option> <button class="btn btn-primary">Buscar</button>
<c:forEach items="${estadoP}" var="estados"> </div>
<option value="${estados}" ${param.estado == estados ? "selected" : ""}>${estados.getEstado()}</option> </div>
</c:forEach>
</select> <div class="row row-cols-1 row-cols-md-2 row-cols-lg-4 gy-1 mt-2">
<label for="dispo">Disponbilidad</label>
<select name="dispo" id="dispo"> <div class="col">
<option value="">Seleccione una opcion</option>
<c:forEach items="${disponibilidades}" var="disponibilidad"> <div class="row">
<option value="${disponibilidad}" ${param.dispo == disponibilidad ? "selected" : ""}>${disponibilidad.getDescripcion()}</option> <div class="col-auto col-md-4">
</c:forEach> <label class="form-label" for="estado">Estado</label>
</select>
<label for="tecId">Tecnologias</label> </div>
<select name="tecId" id="tecId"> <div class="col-auto col-md-8">
<option value="">Seleccione una opcion</option> <select class="form-select form-select-sm " name="estado" id="estado">
<c:forEach items="${tecnologias}" var="tecnologia"> <option value="">Seleccione una opcion</option>
<option value="${tecnologia.id}" ${param.tecId == tecnologia.id ? "selected" : ""}>${tecnologia.nombre}</option> <c:forEach items="${estadoP}" var="estados">
</c:forEach> <option value="${estados}" ${param.estado == estados ? "selected" : ""}>${estados.getEstado()}</option>
</select> </c:forEach>
<label for="instId">Institucion Educativa</label> </select>
<select name="instId" id="instId"> </div>
<option value="">Seleccione una opcion</option> </div>
<c:forEach items="${institucionesEducativas}" var="inst">
<option value="${inst.id}" ${param.instId == inst.id ? "selected" : ""}>${inst.nombre}</option>
</c:forEach> </div>
</select>
<br> <div class="col">
<br>
<label for="lvlEng">Nivel de Ingles</label> <div class="row">
<select name="lvlEng" id="lvlEng"> <div class="col-auto col-md-4">
<option value="">Seleccione una opcion</option> <label class="form-label" for="dispo">Disponbilidad</label>
<c:forEach var = "lvl" begin = "1" end = "5">
<option value="${lvl}" ${param.lvlEng == lvl ? "selected" : ""}>${lvl}</option> </div>
</c:forEach> <div class="col-auto col-md-8">
</select> <select class="form-select form-select-sm " name="dispo" id="dispo">
<label for="lvlTec">Nivel de Tecnologia</label> <option value="">Seleccione una opcion</option>
<select name="lvlTec" id="lvlTec"> <c:forEach items="${disponibilidades}" var="disponibilidad">
<option value="">Seleccione una opcion</option> <option value="${disponibilidad}" ${param.dispo == disponibilidad ? "selected" : ""}>${disponibilidad.getDescripcion()}</option>
<c:forEach var = "lvl" begin = "1" end = "5"> </c:forEach>
<option value="${lvl}" ${param.lvlTec == lvl ? "selected" : ""}>${lvl}</option> </select>
</c:forEach> </div>
</select> </div>
<label for="expInMonths">Experiencia en general</label> </div>
<select name="expInMonths" id="expInMonths"> <div class="col">
<option value="">Seleccione una opcion</option> <div class="row">
<option value="6">Mayor a 6 meses</option> <div class="col-auto col-md-4">
<option value="12">Mayor a 1 año</option> <label class="form-label" for="lvlEng">Nivel de Ingles</label>
<option value="36">Mayor a 3 años</option> </div>
<option value="60">Mayor a 5 años</option> <div class="col-auto col-md-8">
</select> <select class="form-select form-select-sm " name="lvlEng" id="lvlEng">
<label for="convId">convocatoria</label> <option value="">Seleccione una opcion</option>
<select name="convId" id="convId"> <c:forEach var = "lvl" begin = "1" end = "5">
<option value="">Seleccione una opcion</option> <option value="${lvl}" ${param.lvlEng == lvl ? "selected" : ""}>${lvl}</option>
<c:forEach items="${convocatoriaC}" var="convo"> </c:forEach>
<option value="${convo.id}" ${param.convId == convo.id ? "selected" : ""}>${convo.getCargo().getNombre()}</option> </select>
</c:forEach> </div>
</select> </div>
</div>
<div class="col">
<div class="row">
<div class="col-auto col-md-4">
<label class="form-label" for="instId">Institucion Educativa</label>
</div>
<div class="col-auto col-md-8">
<select class="form-select form-select-sm " name="instId" id="instId">
<option value="">Seleccione una opcion</option>
<c:forEach items="${institucionesEducativas}" var="inst">
<option value="${inst.id}" ${param.instId == inst.id ? "selected" : ""}>${inst.nombre}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col-auto col-md-4">
<label class="form-label" for="tecId">Tecnologias</label>
</div>
<div class="col-auto col-md-8">
<select class="form-select form-select-sm " name="tecId" id="tecId">
<option value="">Seleccione una opcion</option>
<c:forEach items="${tecnologias}" var="tecnologia">
<option value="${tecnologia.id}" ${param.tecId == tecnologia.id ? "selected" : ""}>${tecnologia.nombre}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col-auto col-md-4">
<label class="form-label" for="lvlTec">Nivel de Tecnologia</label>
</div>
<div class="col-auto col-md-8">
<select class="form-select form-select-sm" name="lvlTec" id="lvlTec">
<option value="">Seleccione una opcion</option>
<c:forEach var = "lvl" begin = "1" end = "5">
<option value="${lvl}" ${param.lvlTec == lvl ? "selected" : ""}>${lvl}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col-auto col-md-4">
<label class="form-label" for="expInMonths">Experiencia en general</label>
</div>
<div class="col-auto col-md-8">
<select class="form-select form-select-sm " name="expInMonths" id="expInMonths">
<option value="">Seleccione una opcion</option>
<option value="6">Mayor a 6 meses</option>
<option value="12">Mayor a 1 año</option>
<option value="36">Mayor a 3 años</option>
<option value="60">Mayor a 5 años</option>
</select>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col-auto col-md-4">
<label class="form-label" for="convId">Convocatoria</label>
</div>
<div class="col-auto col-md-8">
<select class="form-select form-select-sm " name="convId" id="convId">
<option value="">Seleccione una opcion</option>
<c:forEach items="${convocatoriaC}" var="convo">
<option value="${convo.id}" ${param.convId == convo.id ? "selected" : ""}>${convo.getCargo().getNombre()}</option>
</c:forEach>
</select>
</div>
</div>
</div>
</div>
</form> </form>
</div> </div>
<table class="table"> <div class="card text-dark bg-light mt-3">
<thead>
<tr> <div class="card-body">
<th scope="col">#</th> <div class="table-responsive">
<th scope="col">Nombre</th>
<th scope="col">Disponibilidad</th> <table class="table">
<th scope="col">Nivel de Ingles</th> <thead>
<th scope="col">Experiencia</th> <tr>
<th scope="col">Tecnologias</th> <th scope="col">#</th>
<th scope="col">Estado</th> <th scope="col">Nombre</th>
</tr> <th scope="col">Disponibilidad</th>
</thead> <th scope="col">Nivel de Ingles</th>
<tbody> <th scope="col">Experiencia</th>
<c:forEach items="${postulantes}" var="postulante" varStatus="staPost"> <th scope="col">Tecnologias</th>
<tr> <th scope="col">Estado</th>
<th scope="row">${staPost.index + 1}</th> </tr>
<td>${postulante.nombre} ${postulante.apellido}</td> </thead>
<td>${postulante.disponibilidad.getDescripcion()}</td> <tbody>
<td>${postulante.nivelIngles}</td> <c:forEach items="${postulantes}" var="postulante" varStatus="staPost">
<td>${postulante.experienciaMeses}<op></td> <tr>
<td> <th scope="row">${staPost.index + 1}</th>
<c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia" varStatus="staTec"> <td>${postulante.nombre} ${postulante.apellido}</td>
${detalle_tecnologia.getTecnologia().getNombre()}${not staTec.last ? "," : ""} <td>${postulante.disponibilidad.getDescripcion()}</td>
</c:forEach> <td>${postulante.nivelIngles}</td>
</td> <td>${postulante.experienciaMeses}<op></td>
<td>${postulante.estado.getEstado()}</td> <td>
<td><a href="/postulante/${postulante.id}">Ver</a></td> <c:forEach items="${postulante.tecnologias}" var="detalle_tecnologia" varStatus="staTec">
</tr> ${detalle_tecnologia.getTecnologia().getNombre()}${not staTec.last ? "," : ""}
</c:forEach> </c:forEach>
</tbody> </td>
<td>${postulante.estado.getEstado()}</td>
</table> <td><a href="/postulantes/${postulante.id}">Ver</a></td>
<div> </tr>
<nav aria-label="Page navigation example"> </c:forEach>
<ul class="pagination"> </tbody>
<c:forEach begin="1" end="${pages}" var="nro">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li> </table>
</c:forEach> </div>
</ul>
</nav> </div>
<div class="card-footer">
<div>
<nav aria-label="Page navigation example">
<ul class="pagination">
<c:forEach begin="1" end="${pages}" var="nro">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
</c:forEach>
</ul>
</nav>
</div>
</div>
</div> </div>
</layout:put> </layout:put>
<layout:put block="scripts" type="APPEND"> <layout:put block="scripts" type="APPEND">
<script> <script>
......
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Registration Success</title>
<link rel="stylesheet" type="text/css" href="/webjars/bootstrap/css/bootstrap.min.css" />
</head>
<body>
<div class="container text-center">
<h3>You have signed up successfully!</h3>
<h4><a href="${pageContext.request.contextPath}/login">Click here to Login</a></h4>
</div>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment