diff --git a/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java index 5e4cc89..5b41f69 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/ConvocatoriaController.java @@ -2,9 +2,12 @@ package com.roshka.controller; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import com.roshka.modelo.Cargo; import com.roshka.modelo.ConvocatoriaCargo; +import com.roshka.modelo.EstadoConvocatoria; +import com.roshka.modelo.EstadoConvocatoriaConverter; import com.roshka.repositorio.CargoRepository; import com.roshka.repositorio.ConvocatoriaRepository; @@ -14,6 +17,7 @@ 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.context.MessageSource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; @@ -22,6 +26,7 @@ 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; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller public class ConvocatoriaController { @@ -36,7 +41,7 @@ public class ConvocatoriaController { } @RequestMapping("/convocatorias") - public String menuConvocatorias(Model model, + public String menuConvocatorias(Model model,RedirectAttributes redirectAttrs, @RequestParam(required = false) Long cargoId, @RequestParam(required = false) Integer isOpen//1: true, 0: false ) { @@ -47,15 +52,36 @@ public class ConvocatoriaController { //model.addAttribute("convocatorias",cargoId==null? convoRepo.findAll() : convoRepo.findByCargoId(cargoId)); return "convocatorias"; } + @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,RedirectAttributes redirectAttributes) { + for (ConvocatoriaCargo conv:convoRepo.findByCargoId(convocatoria.getCargoId())) { + if(conv.getEstado()==EstadoConvocatoria.abierto){ + redirectAttributes.addFlashAttribute("SUCCESS_MESSAGE", "Ya existe una convocatoria Abierta con ese cargo"); + return "redirect:/convocatorias"; + } + } + if(result.hasErrors()); + convocatoria.setFechaInicio(new Date()); + convocatoria.setEstado(EstadoConvocatoria.abierto); + convoRepo.save(convocatoria); + System.out.println(convocatoria.getFechaInicio()); + return "redirect:/convocatorias"; + } - @RequestMapping(path = {"/convocatoria","/convocatoria/{id}"}) + /* @RequestMapping("/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()); model.addAttribute("listaConvocatoria", convoRepo.findAll()); - } else { ConvocatoriaCargo cc = convoRepo.getById(id); @@ -67,12 +93,16 @@ public class ConvocatoriaController { } return "convocatoria-form"; - } + }*/ - @PostMapping(path = {"/convocatoria","/convocatoria/{id}"}) + @RequestMapping("/convocatoria/{id}") public String guardarConvocatoria(@ModelAttribute ConvocatoriaCargo convocatoria, BindingResult result, @PathVariable(required = false) Long id,Model model) { - if(result.hasErrors()); if(id != null) convocatoria.setId(id); + convocatoria=convoRepo.findByIdConvocatoriaCargo(id); + convocatoria.setEstado(EstadoConvocatoria.cerrado); + convocatoria.setFechaFin(new Date()); + convoRepo.save(convocatoria); + /*if(id != null) convocatoria.setId(id); //System.out.println(convoRepo.filtrarConvocatoriasPorCargo(convocatoria.getCargoId())); for(ConvocatoriaCargo c: convoRepo.filtrarConvocatoriasPorCargo(convocatoria.getCargoId())){ @@ -91,7 +121,7 @@ public class ConvocatoriaController { break; } - } + }*/ return "redirect:/convocatorias"; diff --git a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java index bbb6c96..2e15e7e 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java @@ -109,10 +109,6 @@ public class PostulanteController { expRepo.findByPostulante(postulantex).forEach(x -> expRepo.delete(x)); postulanteTecnologiaRepository.findByPostulante(postulantex).forEach(x -> postulanteTecnologiaRepository.delete(x)); postulante.setId(postulantex.getId()); - } else{ - postulante.setEstadoPostulante(EstadoPostulante.NUEVO); - postulante.setComentarioRRHH(null); - } if(file!=null){ DBFile cv = Helper.createFile(file); diff --git a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java index b573fa1..34693cb 100644 --- a/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java +++ b/curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java @@ -8,11 +8,11 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; -import java.util.List; - - +import java.util.List; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.roshka.DTO.PostulanteListaDTO; import com.roshka.modelo.*; import com.roshka.modelo.Disponibilidad; @@ -105,12 +105,21 @@ public class PostulanteRRHHController { model.addAttribute("disponibilidades", Disponibilidad.values()); model.addAttribute("institucionesEducativas", institucionRepository.findAll()); model.addAttribute("estadoP", EstadoPostulante.values()); - model.addAttribute("convocatoriaC", cargoRepo.findAll()); + + model.addAttribute("cargos", carRepo.findAll()); + model.addAttribute("cargoRepo", cargoRepo); + //model.addAttribute("convocatoriaC", cargoRepo.findAll()); + try { + model.addAttribute("convocatoriaC", new ObjectMapper().writeValueAsString(cargoRepo.findAll())); + } catch (JsonProcessingException er) { + // TODO Auto-generated catch block + er.printStackTrace(); + } Page postulantesPag = post.postulantesMultiFiltro( nombre == null || nombre.trim().isEmpty() ? - new TypedParameterValue(StringType.INSTANCE,null) : - new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"), - dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId); + new TypedParameterValue(StringType.INSTANCE,null) : + new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"), + dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId); model.addAttribute("numeroOcurrencias", postulantesPag.getTotalElements()); List postulantes = postulantesPag.getContent(); List postulantesDTO = new ArrayList<>(); @@ -210,6 +219,10 @@ public class PostulanteRRHHController { //post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId()); Postulante postulanteVd = post.getById(postulanteId); postulanteVd.setEstadoPostulante(postulante.getEstadoPostulante()); + //si se le contrata, actualizar la fecha actual + if(postulanteVd.getEstadoPostulante() == EstadoPostulante.CONTRATADO){ + postulanteVd.setFechaContratado(new Date()); + } postulanteVd.setComentarioRRHH(postulante.getComentarioRRHH()); post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(), postulante.getComentarioRRHH(), postulanteId); //post.save(postulanteVd); diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java b/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java index ff93814..932a344 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Cargo.java @@ -26,6 +26,22 @@ public class Cargo { @Column(name = "nombre") private String nombre; + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNombre() { + return this.nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + @OneToMany(mappedBy = "cargo") @JsonManagedReference private List convocatorias; diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java b/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java index bbcbe43..2b1cb22 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/ConvocatoriaCargo.java @@ -36,6 +36,9 @@ public class ConvocatoriaCargo { @Column(name = "cargo_id") private Long cargoId; + + @Column(name = "estado") + private EstadoConvocatoria estado; @Column(name = "fecha_inicio") private Date fechaInicio; @@ -43,8 +46,6 @@ public class ConvocatoriaCargo { @Column(name = "fecha_fin") private Date fechaFin; - @Column(name = "cupos") - private int cupos; //para deserializar desde el form como string @Transient @@ -104,4 +105,28 @@ public class ConvocatoriaCargo { setFechaInicio(fechaInicioS); } + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public Cargo getCargo() { + return this.cargo; + } + + public void setCargo(Cargo cargo) { + this.cargo = cargo; + } + + public EstadoConvocatoria getEstado() { + return this.estado; + } + + public void setEstado(EstadoConvocatoria estado) { + this.estado = estado; + } + } diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoria.java b/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoria.java new file mode 100644 index 0000000..f6d930a --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoria.java @@ -0,0 +1,12 @@ +package com.roshka.modelo; + +public enum EstadoConvocatoria { + abierto("abierto"), cerrado("cerrado"); + private String descripcion; + private EstadoConvocatoria(String descripcion){ + this.descripcion = descripcion; + } + public String getDescripcion() { + return descripcion; + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoriaConverter.java b/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoriaConverter.java new file mode 100644 index 0000000..ea921a5 --- /dev/null +++ b/curriculumsearch/src/main/java/com/roshka/modelo/EstadoConvocatoriaConverter.java @@ -0,0 +1,33 @@ +package com.roshka.modelo; +import java.util.Arrays; +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter(autoApply = true) +public class EstadoConvocatoriaConverter implements AttributeConverter, org.springframework.core.convert.converter.Converter { + @Override + public String convertToDatabaseColumn(EstadoConvocatoria modalidad) { + if (modalidad == null) { + return null; + } + return modalidad.getDescripcion(); + } + + + @Override + public EstadoConvocatoria convert(String arg0) { + return convertToEntityAttribute(arg0); + } + + @Override + public EstadoConvocatoria convertToEntityAttribute(String estado) { + if (estado == null) { + return null; + } + + return Arrays.stream(EstadoConvocatoria.values()) + .filter(c -> c.getDescripcion().equals(estado)) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } +} diff --git a/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java b/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java index b44243e..7c27b6a 100644 --- a/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java +++ b/curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java @@ -79,7 +79,7 @@ public class Postulante { @Column(name="estado_postulante") @NotNull - private EstadoPostulante estadoPostulante=EstadoPostulante.NUEVO; + private EstadoPostulante estadoPostulante; @Column(name="comentario_rrhh") private String comentarioRRHH; @@ -123,15 +123,31 @@ public class Postulante { @JoinColumn(name = "cvfile_id",referencedColumnName = "id") @JsonIgnore private DBFile cvFile; + + @Column(name = "fecha_creacion") + private Date fechaCreacion; + @Column(name = "fecha_actualizacion") + private Date fechaActualizacion; - - - - + @Column(name = "fecha_contratado") + private Date fechaContratado; + public void setFechaNacimiento(String fechaNacimiento) { this.fechaNacimiento = Helper.convertirFecha(fechaNacimiento); } + + @PrePersist + public void precargarFechas(){ + this.fechaCreacion = new Date(); + this.fechaActualizacion = this.fechaCreacion; + this.estadoPostulante = EstadoPostulante.NUEVO; + this.comentarioRRHH = null; + } + @PreUpdate + public void actualizarFecha(){ + this.fechaActualizacion= new Date(); + } } diff --git a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java index 685ccbd..726a7ae 100644 --- a/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java +++ b/curriculumsearch/src/main/java/com/roshka/repositorio/ConvocatoriaRepository.java @@ -10,10 +10,12 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; public interface ConvocatoriaRepository extends JpaRepository { + @Query(value = "SELECT c FROM ConvocatoriaCargo c WHERE c.id=?1") + public ConvocatoriaCargo findByIdConvocatoriaCargo(Long id); 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) )") + @Query("select c from ConvocatoriaCargo c where ( ?1 is null and ?3 is null) or ( ( ( ((c.fechaFin > ?2 or c.fechaFin=null) and ?3 = 1) or ((c.fechaFin < ?2 ) and ?3 = 0)) or ?3 is null ) and (c.cargoId = ?1 or ?1 is null) )") public List f1ndByCargoAndEstado(TypedParameterValue cargoId, Date fecha, TypedParameterValue isOpen); @Query("SELECT c FROM ConvocatoriaCargo c WHERE (cargoId=?1)") public List filtrarConvocatoriasPorCargo(Long cargoId); diff --git a/curriculumsearch/src/main/java/com/roshka/utils/Helper.java b/curriculumsearch/src/main/java/com/roshka/utils/Helper.java index 18adb78..189aa82 100644 --- a/curriculumsearch/src/main/java/com/roshka/utils/Helper.java +++ b/curriculumsearch/src/main/java/com/roshka/utils/Helper.java @@ -7,6 +7,7 @@ import java.time.YearMonth; import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; import java.util.Date; +import java.util.concurrent.TimeUnit; import com.roshka.modelo.DBFile; @@ -31,12 +32,18 @@ public class Helper { } } + /** + * Diferencia en meses entre 2 fechas. + * @param date1 La fecha inicial. No puede ser nulo + * @param date2 La fecha final. Si es nulo, se asume a la fecha de hoy + * @return + */ public static final long getMonthsDifference(Date date1, Date date2) { if(date2==null) date2 = new Date(); - YearMonth m1 = YearMonth.from(date1.toInstant().atZone(ZoneOffset.UTC)); - YearMonth m2 = YearMonth.from(date2.toInstant().atZone(ZoneOffset.UTC)); + long diffInMillies = Math.abs(date2.getTime() - date1.getTime()); + long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); - return m1.until(m2, ChronoUnit.MONTHS) + 1; + return Math.round(diff/30.d) ; } public static DBFile createFile(MultipartFile file) { diff --git a/curriculumsearch/src/main/resources/json/convocatoria.json b/curriculumsearch/src/main/resources/json/convocatoria.json index b931ede..1cc1418 100644 --- a/curriculumsearch/src/main/resources/json/convocatoria.json +++ b/curriculumsearch/src/main/resources/json/convocatoria.json @@ -2,15 +2,15 @@ { "id": 1, "cargoId": 1, + "estado":0, "fechaInicio": "2021-11-01", - "fechaFin": "2021-11-30", - "cupos": 20 + "fechaFin": "2021-11-30" }, { "id": 2, "cargoId": 2, + "estado":0, "fechaInicio": "2021-11-01", - "fechaFin": "2021-11-30", - "cupos": 20 + "fechaFin": "2021-11-30" } ] \ No newline at end of file diff --git a/curriculumsearch/src/main/resources/static/Convo.js b/curriculumsearch/src/main/resources/static/Convo.js new file mode 100644 index 0000000..5125990 --- /dev/null +++ b/curriculumsearch/src/main/resources/static/Convo.js @@ -0,0 +1,26 @@ +const cargoSelect = document.querySelector("#cargoId"); + +function listarConvocatorias(id){ + const ConvocatoriaAmostrar = convocatorias.filter(c=>c.cargoId==id); + const convocatoria = document.querySelector("select[name=convId]"); + const frag = document.createDocumentFragment(); + let optionDefault = document.createElement("option"); + optionDefault.value = ""; + optionDefault.innerHTML = "Seleccione una opcion"; + frag.appendChild(optionDefault); + for (const conv of ConvocatoriaAmostrar) { + const opt = document.createElement("option"); + opt.value = conv.id; + if(conv.fechaFin!=null){ + opt.innerHTML ="Desde :"+new Date(conv.fechaInicio)+"-"+" Hasta :"+new Date(conv.fechaFin); + }else{ + opt.innerHTML ="Desde :"+new Date(conv.fechaInicio) + } + opt.setAttribute("data-CargoId",conv.cargoId); + frag.appendChild(opt) + } + convocatoria.replaceChildren(frag); + +} +listarConvocatorias(cargoSelect.value); +cargoSelect.addEventListener("change",evt => listarConvocatorias(evt.target.value)) diff --git a/curriculumsearch/src/main/resources/static/main.js b/curriculumsearch/src/main/resources/static/main.js index a371dc7..daad42f 100644 --- a/curriculumsearch/src/main/resources/static/main.js +++ b/curriculumsearch/src/main/resources/static/main.js @@ -575,7 +575,7 @@ function eliminarReferencia(index) { document.getElementById("ref-"+index).remove() } /*--------------Form submit----------------------------- */ -function serializeJSON (form) { +function serializeJSON (form,excluded_input=['cargo-id']) { // Create a new FormData object const formData = new FormData(form); @@ -594,8 +594,19 @@ function serializeJSON (form) { // Add each name/value pair to the object for (const [name, value] of formData) { + if(excluded_input.includes(name)) continue; pairs[name] = value } + let cargos = document.getElementsByName("cargo-id"); + cont_cargo = 0; + const postulaciones=[]; + for (let i = 0; i < cargos.length; i++) { + if(cargos[i].checked){ + postulaciones[cont_cargo] = {} + postulaciones[cont_cargo]["id"] = cargos[i].value; + cont_cargo++; + } + } 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 diff --git a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp index d162b69..bea8210 100644 --- a/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/convocatoria-form.jsp @@ -9,25 +9,6 @@
- Fecha inicial - -
- Esta fecha ya existe -
- -
-
- Fecha Fin - -
- Esta fecha ya existe -
-
-
- Cupos: - -
-
Cargo @@ -35,7 +16,7 @@
- +
diff --git a/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp b/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp index 1dc3a0f..120f336 100644 --- a/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp +++ b/curriculumsearch/src/main/webapp/jsp/convocatorias.jsp @@ -27,14 +27,17 @@
Agregar Nueva Convocatoria + +
${SUCCESS_MESSAGE}
+
- - - + + + @@ -43,11 +46,11 @@ + - - + @@ -57,8 +60,14 @@
# CargoFecha DesdeFecha HastaVacantesEstadoFecha AbiertaFecha Cerrada
${sta.index+1} ${convocatoria.getCargo().getNombre()}${convocatoria.getEstado().getDescripcion()} ${convocatoria.getFechaInicio().toString().split(" ")[0]} ${convocatoria.getFechaFin().toString().split(" ")[0]}${convocatoria.getCupos()} Ver PostulantesEditar
+ - + diff --git a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp index 5785b03..38c588e 100644 --- a/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp +++ b/curriculumsearch/src/main/webapp/jsp/postulante-form.jsp @@ -148,18 +148,28 @@
-
+
-

Cargos

+

Cargos

-
+
+ + +
+
+ + + +
+
+
-
@@ -199,7 +209,7 @@
-
diff --git a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp index 7ab7671..f0db0b2 100644 --- a/curriculumsearch/src/main/webapp/jsp/postulantes.jsp +++ b/curriculumsearch/src/main/webapp/jsp/postulantes.jsp @@ -1,4 +1,5 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%> @@ -151,20 +152,32 @@
- +
- - - + +
-
- +
+
+
+ +
+
+ +
+
+
+
+ + + +