Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
th-app-java
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Oscar Enrique Gonzalez Escurra
th-app-java
Commits
dc1fcd80
Commit
dc1fcd80
authored
3 years ago
by
Joel Florentin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
adjuntar archivo cv en form postulante
parent
a5523490
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
405 additions
and
162 deletions
+405
-162
curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java
+20
-19
curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java
+65
-98
curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java
+163
-0
curriculumsearch/src/main/java/com/roshka/modelo/DBFile.java
+70
-0
curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java
+14
-15
curriculumsearch/src/main/java/com/roshka/repositorio/DBFileRepository.java
+16
-0
curriculumsearch/src/main/resources/application.properties
+11
-0
curriculumsearch/src/main/resources/static/main.js
+18
-2
curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp
+11
-4
curriculumsearch/src/main/webapp/jsp/index.jsp
+7
-21
curriculumsearch/src/main/webapp/jsp/layouts/base.jsp
+4
-2
curriculumsearch/src/main/webapp/jsp/postulante-form.jsp
+5
-0
curriculumsearch/src/main/webapp/jsp/postulantes.jsp
+1
-1
No files found.
curriculumsearch/src/main/java/com/roshka/configuration/WebSecurityConfig.java
View file @
dc1fcd80
...
...
@@ -49,28 +49,28 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
http
// .csrf().disable()
.
authorizeRequests
()
.
ant
Matchers
(
"/"
).
authenticated
()
.
ant
Matchers
(
"/home"
).
authenticated
()
.
ant
Matchers
(
"/cargo*"
).
authenticated
()
.
ant
Matchers
(
"/convocatoria*"
).
authenticated
()
.
ant
Matchers
(
"/tecnologia*"
).
authenticated
()
.
antMatchers
(
"/postulantes
"
).
authenticated
()
.
ant
Matchers
(
"/edit-user-data"
).
authenticated
()
.
mvc
Matchers
(
"/"
).
authenticated
()
.
mvc
Matchers
(
"/home"
).
authenticated
()
.
mvc
Matchers
(
"/cargo*"
).
authenticated
()
.
mvc
Matchers
(
"/convocatoria*"
).
authenticated
()
.
mvc
Matchers
(
"/tecnologia*"
).
authenticated
()
.
mvcMatchers
(
"/postulantes"
,
"/postulantes/**
"
).
authenticated
()
.
mvc
Matchers
(
"/edit-user-data"
).
authenticated
()
.
anyRequest
().
permitAll
()
.
and
()
.
formLogin
()
.
loginPage
(
"/login"
)
.
usernameParameter
(
"email"
)
.
defaultSuccessUrl
(
"/home"
)
.
permitAll
()
.
formLogin
()
.
loginPage
(
"/login"
)
.
usernameParameter
(
"email"
)
.
defaultSuccessUrl
(
"/home"
)
.
permitAll
()
.
and
()
.
logout
()
.
logoutUrl
(
"/logout"
)
.
logoutRequestMatcher
(
new
AntPathRequestMatcher
(
"/logout"
,
"GET"
))
.
clearAuthentication
(
true
)
.
invalidateHttpSession
(
true
)
.
deleteCookies
(
"JSESSIONID"
,
"remember-me"
)
.
logoutSuccessUrl
(
"/login"
);
.
logout
()
.
logoutUrl
(
"/logout"
)
.
logoutRequestMatcher
(
new
AntPathRequestMatcher
(
"/logout"
,
"GET"
))
.
clearAuthentication
(
true
)
.
invalidateHttpSession
(
true
)
.
deleteCookies
(
"JSESSIONID"
,
"remember-me"
)
.
logoutSuccessUrl
(
"/login"
);
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/java/com/roshka/controller/PostulanteController.java
View file @
dc1fcd80
package
com
.
roshka
.
controller
;
import
java.
util.ArrayList
;
import
java.
io.IOException
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Locale
;
import
javax.validation.ConstraintViolationException
;
import
com.roshka.DTO.PostulanteListaDTO
;
import
com.roshka.modelo.*
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.roshka.modelo.Disponibilidad
;
import
com.roshka.modelo.EstadoPostulante
;
import
com.roshka.modelo.EstadoCivil
;
import
com.roshka.modelo.Nacionalidad
;
import
com.roshka.modelo.Postulante
;
...
...
@@ -27,27 +23,20 @@ import com.roshka.repositorio.ExperienciaRepository;
import
com.roshka.repositorio.InstitucionRepository
;
import
com.roshka.repositorio.PostulanteRepository
;
import
com.roshka.repositorio.TecnologiaRepository
;
import
com.roshka.utils.Helper
;
import
org.hibernate.jpa.TypedParameterValue
;
import
org.hibernate.type.StringType
;
import
org.hibernate.type.IntegerType
;
import
org.hibernate.type.LongType
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Sort
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.Model
;
import
org.springframework.
validation.BindingResult
;
import
org.springframework.
util.StringUtils
;
import
org.springframework.web.bind.MethodArgumentNotValidException
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.multipart.MultipartFile
;
@Controller
public
class
PostulanteController
{
...
...
@@ -59,7 +48,7 @@ public class PostulanteController {
CiudadRepository
ciuRepo
;
EstudioRepository
estudioRepository
;
PostulanteTecnologiaRepository
postulanteTecnologiaRepository
;
ConvocatoriaRepository
c
arg
oRepo
;
ConvocatoriaRepository
c
onv
oRepo
;
CargoRepository
carRepo
;
@Autowired
...
...
@@ -68,7 +57,7 @@ public class PostulanteController {
InstitucionRepository
institucionRepository
,
DepartamentoRepository
depRepo
,
CiudadRepository
ciuRepo
,
EstudioRepository
estudioRepository
,
PostulanteTecnologiaRepository
postulanteTecnologiaRepository
,
ConvocatoriaRepository
c
arg
oRepo
,
CargoRepository
carRepo
)
{
ConvocatoriaRepository
c
onv
oRepo
,
CargoRepository
carRepo
)
{
this
.
post
=
post
;
this
.
tecRepo
=
tecRepo
;
this
.
expRepo
=
expRepo
;
...
...
@@ -77,52 +66,12 @@ public class PostulanteController {
this
.
ciuRepo
=
ciuRepo
;
this
.
estudioRepository
=
estudioRepository
;
this
.
postulanteTecnologiaRepository
=
postulanteTecnologiaRepository
;
this
.
c
argoRepo
=
carg
oRepo
;
this
.
c
onvoRepo
=
conv
oRepo
;
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
){
model
.
addAttribute
(
"tecnologias"
,
tecRepo
.
findAll
());
model
.
addAttribute
(
"disponibilidades"
,
Disponibilidad
.
values
());
...
...
@@ -131,7 +80,7 @@ public class PostulanteController {
model
.
addAttribute
(
"estadosCiviles"
,
EstadoCivil
.
values
());
model
.
addAttribute
(
"nacionalidades"
,
Nacionalidad
.
values
());
model
.
addAttribute
(
"tiposExperencia"
,
TipoExperiencia
.
values
());
model
.
addAttribute
(
"CargosDisponibles"
,
c
arg
oRepo
.
f1ndByCargoAndEstado
(
new
TypedParameterValue
(
LongType
.
INSTANCE
,
null
),
new
Date
(),
new
TypedParameterValue
(
IntegerType
.
INSTANCE
,
1
)));
model
.
addAttribute
(
"CargosDisponibles"
,
c
onv
oRepo
.
f1ndByCargoAndEstado
(
new
TypedParameterValue
(
LongType
.
INSTANCE
,
null
),
new
Date
(),
new
TypedParameterValue
(
IntegerType
.
INSTANCE
,
1
)));
try
{
model
.
addAttribute
(
"ciudades"
,
new
ObjectMapper
().
writeValueAsString
(
ciuRepo
.
findAll
()));
}
catch
(
JsonProcessingException
er
)
{
...
...
@@ -142,42 +91,76 @@ public class PostulanteController {
return
"postulante-form"
;
}
@PostMapping
(
value
=
"/postulante"
,
consumes
=
"application/json"
)
public
String
guardarPostulante
(
@RequestBody
Postulante
postulante
){
/* @PostMapping("/uploadCVPostulante")
public String uploadFile(@RequestParam("file") MultipartFile file) {
dbFileRepository.save(storeFile(file));
DBFile dbFile = dbFileRepository.save(storeFile(file));
return "{\"id\": "+dbFile.getId()+"}";
} */
private
DBFile
createFile
(
MultipartFile
file
)
{
// Normalize file name
String
fileName
=
StringUtils
.
cleanPath
(
file
.
getOriginalFilename
());
try
{
// Check if the file's name contains invalid characters
if
(
fileName
.
contains
(
".."
))
{
throw
new
Exception
(
"Sorry! Filename contains invalid path sequence "
+
fileName
);
}
if
(
file
.
getSize
()==
0
)
throw
new
Exception
(
"Sorry! File cant be void"
);;
DBFile
dbFile
=
new
DBFile
(
fileName
,
file
.
getContentType
(),
file
.
getBytes
());
return
dbFile
;
}
catch
(
IOException
ex
)
{
ex
.
printStackTrace
();
return
null
;
}
catch
(
Exception
ex
){
ex
.
printStackTrace
();
return
null
;
}
}
@PostMapping
(
value
=
"/work-with-us"
,
consumes
=
"multipart/form-data"
)
public
String
guardarPostulante
(
@RequestPart
(
name
=
"file"
,
required
=
false
)
MultipartFile
file
,
@RequestPart
(
"postulante"
)
Postulante
postulante
){
//Codigo encargado de modificar postulacion si se envia mismo CI
Postulante
postulantex
=
post
.
findByNroDocument
(
postulante
.
get
n
roDocument
());
Postulante
postulantex
=
post
.
findByNroDocument
(
postulante
.
get
N
roDocument
());
if
(
postulantex
!=
null
){
estudioRepository
.
findByPostulante
(
postulantex
).
forEach
(
x
->
estudioRepository
.
delete
(
x
));
expRepo
.
findByPostulante
(
postulantex
).
forEach
(
x
->
expRepo
.
delete
(
x
));
postulanteTecnologiaRepository
.
findByPostulante
(
postulantex
).
forEach
(
x
->
postulanteTecnologiaRepository
.
delete
(
x
));
postulante
.
setId
(
postulantex
.
getId
());
}
if
(
file
!=
null
){
DBFile
cv
=
createFile
(
file
);
if
(
cv
!=
null
)
cv
.
setPostulante
(
postulante
);
postulante
.
setCvFile
(
cv
);
}
postulante
.
getTecnologias
().
stream
().
filter
(
tec
->
tec
.
getTecnologia
().
getId
()
!=
0
).
forEach
(
tec
->
tec
.
setTecnologia
(
tecRepo
.
getById
(
tec
.
getTecnologia
().
getId
()))
);
/* for (int i = 0; i < postulante.getPostulaciones().size(); i++) {
postulante.getPostulaciones().set(i, cargoRepo.getById(postulante.getPostulaciones().get(i).getId()));
}
*/
for
(
Estudio
estudio:
postulante
.
getEstudios
()){
String
nombreIns
=
""
;
nombreIns
=
estudio
.
getInstitucion
().
getNombre
().
toLowerCase
();
Institucion
institucion
=
institucionRepository
.
findByNombre
(
nombreIns
);
if
(
institucion
==
null
){
institucionRepository
.
save
(
estudio
.
getInstitucion
());
}
else
{
estudio
.
setInstitucion
(
institucion
);
}
}
post
.
save
(
postulante
);
return
"redirect:/postulacion-correcta"
;
for
(
Estudio
estudio:
postulante
.
getEstudios
()){
String
nombreIns
=
""
;
nombreIns
=
estudio
.
getInstitucion
().
getNombre
().
toLowerCase
();
Institucion
institucion
=
institucionRepository
.
findByNombre
(
nombreIns
);
if
(
institucion
==
null
){
institucionRepository
.
save
(
estudio
.
getInstitucion
());
}
else
{
estudio
.
setInstitucion
(
institucion
);
}
}
post
.
save
(
postulante
);
return
"redirect:/work-with-us/postulacion-correcta"
;
}
@GetMapping
(
"/postulacion-correcta"
)
@GetMapping
(
"/work-with-us/postulacion-correcta"
)
public
String
successPostulation
(
Model
model
){
model
.
addAttribute
(
"mensaje1"
,
"Tu informacion se ha recibido correctamente!"
);
model
.
addAttribute
(
"mensaje2"
,
" espera por que nos pongamos en contacto!"
);
...
...
@@ -202,23 +185,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
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/java/com/roshka/controller/PostulanteRRHHController.java
0 → 100644
View file @
dc1fcd80
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
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/java/com/roshka/modelo/DBFile.java
0 → 100644
View file @
dc1fcd80
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
;
}
}
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/java/com/roshka/modelo/Postulante.java
View file @
dc1fcd80
...
...
@@ -66,8 +66,6 @@ public class Postulante {
@Max
(
value
=
5
)
private
Long
nivelIngles
;
@Column
(
name
=
"curriculum"
)
private
String
curriculum
;
@Column
(
name
=
"estado_civil"
)
@NotNull
...
...
@@ -115,6 +113,11 @@ public class Postulante {
)
private
List
<
ConvocatoriaCargo
>
postulaciones
;
@OneToOne
(
cascade
=
CascadeType
.
ALL
,
fetch
=
FetchType
.
LAZY
)
@JoinColumn
(
name
=
"cvfile_id"
,
referencedColumnName
=
"id"
)
@JsonIgnore
private
DBFile
cvFile
;
public
long
getId
()
{
return
id
;
...
...
@@ -140,9 +143,6 @@ public class Postulante {
this
.
apellido
=
apellido
;
}
public
String
getnroDocument
()
{
return
nroDocument
;
}
public
void
setnroDocument
(
String
nroDocument
)
{
this
.
nroDocument
=
nroDocument
;
...
...
@@ -192,16 +192,6 @@ public class Postulante {
this
.
nivelIngles
=
nivelIngles
;
}
public
String
getCurriculum
()
{
return
curriculum
;
}
public
void
setCurriculum
(
String
curriculum
)
{
this
.
curriculum
=
curriculum
;
}
public
Disponibilidad
getDisponibilidad
()
{
return
disponibilidad
;
}
...
...
@@ -291,4 +281,13 @@ public class Postulante {
public
void
setComentarioRRHH
(
String
comentarioRRHH
){
this
.
comentarioRRHH
=
comentarioRRHH
;
}
public
DBFile
getCvFile
()
{
return
cvFile
;
}
public
String
getNroDocument
()
{
return
nroDocument
;
}
public
void
setCvFile
(
DBFile
cvFile
)
{
this
.
cvFile
=
cvFile
;
}
}
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/java/com/roshka/repositorio/DBFileRepository.java
0 → 100644
View file @
dc1fcd80
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
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/resources/application.properties
View file @
dc1fcd80
...
...
@@ -26,3 +26,13 @@ spring.mail.properties.mail.smtp.starttls.enable=true
jsp-inheritance-prefix
=
/jsp/layouts/
jsp-inheritance-suffix
=
.jsp
## MULTIPART (MultipartProperties)
# Enable multipart uploads
spring.servlet.multipart.enabled
=
true
# Threshold after which files are written to disk.
spring.servlet.multipart.file-size-threshold
=
2KB
# Max file size.
spring.servlet.multipart.max-file-size
=
10MB
# Max Request Size
spring.servlet.multipart.max-request-size
=
10MB
\ No newline at end of file
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/resources/static/main.js
View file @
dc1fcd80
...
...
@@ -211,6 +211,12 @@ function serializeJSON (form) {
return
JSON
.
stringify
(
pairs
,
null
,
2
);
}
function
obtenerCV
(){
let
input
=
document
.
querySelector
(
'#cvFile'
)
return
input
.
files
[
0
];
}
async
function
postData
(
url
=
''
,
data
=
{})
{
var
token
=
document
.
querySelector
(
"meta[name='_csrf']"
).
content
;
var
headerxs
=
document
.
querySelector
(
"meta[name='_csrf_header']"
).
content
;
...
...
@@ -221,7 +227,7 @@ async function postData(url = '', data = {}) {
cache
:
'no-cache'
,
// *default, no-cache, reload, force-cache, only-if-cached
credentials
:
'same-origin'
,
// include, *same-origin, omit
headers
:
{
'Content-Type'
:
'application/json'
,
//'Content-Type': undefined//
'application/json',
// 'Content-Type': 'application/x-www-form-urlencoded',
},
redirect
:
'follow'
,
// manual, *follow, error
...
...
@@ -232,6 +238,16 @@ async function postData(url = '', data = {}) {
const
response
=
await
fetch
(
url
,
senddata
);
return
response
;
// parses JSON response into native JavaScript objects
}
function
formatearJsonWithFile
(
json
,
file
){
formData
=
new
FormData
();
formData
.
append
(
"file"
,
file
);
formData
.
append
(
'postulante'
,
new
Blob
([
json
],
{
type
:
"application/json"
}));
return
formData
}
formValidator
()
form
=
document
.
querySelector
(
"form"
);
form
.
addEventListener
(
"submit"
,(
evt
)
=>
{
...
...
@@ -241,7 +257,7 @@ form.addEventListener("submit",(evt)=>{
// }
// form.classList.add('was-validated')
if
(
!
noValidateFlag
){
postData
(
'
postulante'
,
serializeJSON
(
form
))
postData
(
'
work-with-us'
,
formatearJsonWithFile
(
serializeJSON
(
form
),
obtenerCV
()
))
.
then
(
response
=>
{
if
(
response
.
status
==
200
||
response
.
status
==
302
){
location
.
replace
(
response
.
url
);
...
...
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/webapp/jsp/detallepostulante.jsp
View file @
dc1fcd80
...
...
@@ -130,11 +130,18 @@
<hr>
<div class="row">
<div class="col">
<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>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#estadoModalLong">Actualizar</button>
</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>
...
...
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/webapp/jsp/index.jsp
View file @
dc1fcd80
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
>
<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"
/>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<layout:extends name="layouts/base.jsp">
<layout:put block="cssDeclaracion" type="REPLACE">
<link href="../css/indexStyle.css" rel="stylesheet" type="text/css"/>
</layout:put>
</head>
<body>
<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
</layout:extends>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/webapp/jsp/layouts/base.jsp
View file @
dc1fcd80
...
...
@@ -9,7 +9,9 @@
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
>
<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"
>
<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>
</head>
...
...
@@ -54,7 +56,7 @@
Postulantes
</a>
<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>
</ul>
</li>
...
...
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/webapp/jsp/postulante-form.jsp
View file @
dc1fcd80
...
...
@@ -145,6 +145,11 @@
</select>
</div>
<div
class=
"inputs mb-3 col-md-4"
>
<label
for=
"formFile"
class=
"form-label"
>
Cargar cv
</label>
<input
class=
"form-control"
type=
"file"
id=
"cvFile"
>
</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>
Cargo al que postulas
</span></div><br>
</div>
...
...
This diff is collapsed.
Click to expand it.
curriculumsearch/src/main/webapp/jsp/postulantes.jsp
View file @
dc1fcd80
...
...
@@ -99,7 +99,7 @@
</c:forEach>
</td>
<td>${postulante.estado.getEstado()}</td>
<td><a href="/postulante/${postulante.id}">Ver</a></td>
<td><a href="/postulante
s
/${postulante.id}">Ver</a></td>
</tr>
</c:forEach>
</tbody>
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment